Lesson #0: Have regularly kept coding, even after your programming class ended; experiment, test theories, write small programs; keep your skills current through the summer.
Lesson #1: Read available project information. When I get questions mere days before the project is due asking how one actually obtains the files, hearing rumors that one doesn't have to start from scratch, it does not instill confidence in me (it FREAKS ME THE HECK OUT). Especially when said information was not only mentioned when I was unveiling the project in class, but has its own section with pertinent heading on the project page. Not to mention the number of questions I've received where my answer was copying and pasting a
URL to the relevant project page section.
Lesson #2: There's this super advanced feature built into many modern information viewing applications, it is called search or find. Sometimes even accessible via these Konami code of mapped keys such as CTRL-f. You type it even a single word or substring of what you are looking for, and it zooms you to the matches. I don't have the project pages memorized. If someone asks a question about the verification tests, I'll search for “verif” (that way I'll hit both “verify” AND “verification”) and bam! Either with the first match, or in very short order, I'll find the droids (er, information) that I am looking for. Stop being passive in your interaction with data. Turn it into an interactive transaction with information. If your mind zones out when staring at seemingly endless walls of text and your mind freezes up like a hunted animal in pursuit, you really may want to re-think the path you are on- as it is OUR job being the ones who will be writing programs for other people (and other people's data, more specifically), and have to make effective sense of it. Think of my project pages as yet another learning milestone- learning how to deal with a lot of relevant data, and how to strategically transact with it, where each interaction is yielding you the particularly valuable subset of information you seek at that given moment.
Lesson #3: Listening comprehension. I'm actually not just standing up in front of the room babbling because I like to hear the sound of my own voice (does ANYONE actually like the sound of their own voice?), but that I am relaying important concepts and information that I feel are pertinent based on various patterns (past class performance, current class observations, helpful hints, and generally relevant data points worth paying attention to, among other things). Yet, more and more I am getting questions, and very simple ones at that (not of the “I don't understand the concept” variety, which I cherish and love, but instead of the “I totally wasn't listening to a word you were saying, and this question basically is an admission of that”) which make me wonder why I am standing up there running my mouth to begin with. Don't worry, I'm not going to stop, nor am I going to cater to your technology-induced attention and focus deficiencies (I am NOT going to, in very twitter-like fashion, tweet you your answers, 140 characters at a time).
Lesson #4: Think! This is actually central to computing, no matter which sub-field of it you are in. We are the people who must think in order to solve other people's problems. From the “it stopped going, please, make it go again” debugging to “write me a program to produce a visual representation of stochastic trends related to the societal impact on mudkips”. Other people don't have the answers, no direct solution exists. We're the solution-makers. We create possibilities. But if all we ever look to do is re-arrange the few blocks we regularly use in familiar fashion, that's little better than re-arranging the deck chairs on the Titanic.
Lesson #4a: There are many neat things that come from combining all these lessons/skills as well. Like reading + listening + thinking, one can develop a sense of context, and then move further away from that black and white world of specific exact actions. Like my search example above with searching for the substring “verif” instead of specifically “verify” or “verification”. That requires thinking and understanding that the information you seek comes in many forms, and we have to contemplate the best ways of instructing the computer to do our bidding. If you were told there's information related to how to verify your output on the project page, and you search for “verify” you may find some information, but maybe not everything, even the more useful stuff. But if you think and understand there are different forms of representing “verify” in our natural language, and you can then better use the search functionality (the computer sees “verify” and “verification” as two entirely separate things, it derives no meaning from them; we understand the meaning of words, and the similarity of their forms, and from that, we can craft more effective patterns we can communicate to the literal computer). A common mistake and misperception some make in computing is that success means they have to learn to be just like a computer. NO. We're not looking to become computers. We are looking to become effective operators of computers. Directors of computers.
Lesson #5: EFFECTIVE TIME MANAGEMENT. Some have discovered the distinct advantages of grazing on the project. Starting early, and spending only 20-45 minutes on it at a time (or planning to- if you're on a roll, why stop after a set amount of time?). Most people who lack proper time management discipline to this the exact opposite way: they start (too) late (starting late is already too late), and suffer through obstacles because they have no choice, a looming deadline keeps advancing. The people with good time management will encounter a problem, recognize the obstacle, maybe try a few approaches to eliminating it. But if it continues to resist, they recognize this, get up and walk away. The subconscious mind is a wonderful and powerful “computer” in its own right, and has just been “programmed” and is working on the problem as you're off doing something else. Many then find that, upon resuming work later, a solution just pops into their head. That is the effective result of delegating work to your subconscious.
Lesson #6: Now onto the lesson some have hopefully come to realize in recent days, and maybe even a subset of those have taken it to heart: START EARLY! Sure, you may have been busy, or just outright ignored my early release e-mail in the summer… that is perfectly fine. But when the semester actually starts, and you've got upwards of 1.5 weeks to work on a project, yet my graphs clearly show a huge surge of people just getting started (ie obtaining the project) only 1-3 days before the project is due, that is what we call a lost opportunity. Rushing and fretting and trying to brute force your way through uncooperative code (it actually isn't the code that is uncooperative, it is your exhausted minds poor use of logic that you're then fighting with) doesn't yield effective progress. Nor is it the nature of what we do in computing. Success isn't defined by how many hours you spent beating your head against the wall, but instead how functional, how efficient, how flexible your solution to the particular problem is (and how well it conforms to any stated specifications).
Lesson #7: This is the lesson that I wanted to share with you today (as I look at the still-minimal pnc0 submissions on Saturday morning around 7:30am), that is equally valid for those who are regularly following the above-stated lessons, and successfully, just as it is valid for those who hitting every roadblock, every snag, beating their head on every wall along the way, wondering when we'll just go back to memorizing and regurgitating everything (hint: we're not). This lesson pertains to long-term progress and success. And this is “knowing when to cut your losses”. What I mean by this:
pnc0 was due before it was no longer Wednesday.
It is now Saturday, meaning if you submit pnc0 today, it is 75% LATE. And while it is important to note that getting 25% credit (max) is better than only being able to get 0%, you're focusing only on the short term.
While you've been slaving away suffering the consequences of your initial procrastination, you're neglecting the gradually approaching elephant/train/whatever: there's ANOTHER project due this coming Wednesday, and it is called dcf0. At some point you'll want to start on that (and ideally, NOT the same 1-3 days before it is due, otherwise you'll find yourself in the EXACT SAME scenario next week as you are in NOW). Getting everything in, or having everything perfect, at the cost of constantly getting hit with late penalties is like death by a thousand pin pricks. If you focus only on the current project, you neglect to see the next, and the next, and the next, all being the foundation of your success in the course.
Case in point: If you're still working on pnc0 today, and it is in anyway workable (passes SOME tests), you may just want to submit what you have and MOVE ON. Get started on dcf0. It is your next project, and it is due in mere days (and at this point, you can STILL get full credit on it… more than that! Bonus points if you submit it early!).
But what about pnc1? Isn't that due the week after? And don't I need everything working in pnc0 in order for pnc1 to work? Why yes, yes it is/you do. But pnc1 is far enough off in the future where, if you were to adopt things like good time management practices, you could continue to plug away at pnc0, just in smaller chunks, whittling away at the problems, and you may find you'll start to make far greater progress when it isn't the “OH MY GOODNESS IT IS LATE I HAVE TO FINISH IT NOW zOMG!!!1!” priority it is right now.
Lesson #8: There's a perception that this course might be more challenging than others (some even seem to be banking on Data Structures being “easier”, bailing on this course but staying in data. I pity their poor souls. Just because something seems “less complex” now, in no ways means it is going to stay that way. Far from it… I've not even started turning up the volume yet in data, but mark my words: that is only weeks away.). Personally, I find discrete the easier, less intensive course, because we're just combining two things: third grade math and programming. That's it. Granted, effective utilization of both requires comprehension, and thinking, and it is THOSE things that people are finding challenging. But discrete as a course is not what is difficult. The lesson here is that you can be your worst enemy. When one tries to brute force their way to a solution, they often end up with far more complex solutions than is necessary. I've already had a number of people report to me how they initially struggled with how complex something looked, then when I told them there was an easier way (or that their way was far more complicated than necessary), and if they sat down and thought it out, tried some things, experimented, they'd write back a day or so later AMAZED at how they could overlook something SO SIMPLE.
So many things in discrete will be based on very simple premises.
If we are not careful, we will ignore the simplicity and leave complexity instead (wasting time trying to wrangle it into operation).
Do not be your own worst enemy. Don't be closed minded. There are MULTIPLE paths to solution, and a big part of discrete is opening your mind to experiencing multiple solutions (pnc0 is a perfect example– look at all the optimizations, and those are just a few I have chosen).
Lesson #9: It may seem harsh, but I prefer to call it “brutal honesty”. If you cannot start to critically think, read, comprehend, and do the things in these other “lessons”, you should seriously consider changing to another program. You may like the idea of programming (or heck, maybe you don't– maybe you just like computers and you're waiting until we get past all this “programming nonsense” and get to the IMPORTANT advanced topics in computing, like internet chatting and playing games and memorizing hardware specs), but these courses (data and discrete) mark the transition from learning the basics (keywords, simple 20-line programs) to effectively deploying these skills and concepts. I fully acknowledge it is quite a gap, and in some respects we can thank your prior educational journeys for leaving you in this currently less-prepared/under-prepared state, but that doesn't mean we cannot start taking control of our own educational journeys. This isn't the first time I've taught this class, nor encountered less-prepared students.
And some in the class are already demonstrating they are not just the sum of their parts. They are realizing just how capable they are, and utilize the concepts encountered in these courses to propel them to even higher heights. And I'm definitely taking notice.
but I'm also taking notice of how many continue to struggle, and although it is still early, a lot of the struggling is based on self-imposed limitations.
So PLEASE, stop looking ONLY at what is immediately in front of you. You have just experienced 1 week in this class. We're looking to do the same this week, then the next, then the next. If every single inch is a struggle, and you cling on for dear life, perhaps some will make it with that approach, but they certainly won't enjoy it (and it isn't just that my classes may be more intense, think of it this way: I am preparing you for the intensity of later courses. The more prepared you are coming out of my classes, the better you can appreciate the more advanced topics and concepts and projects to come). If you're only taking a short-term view, you can get stuck thinking this is your only path, when in reality many others exist.