Getting the Most Out of a CS Curriculum?
Henry asks: "In September I start on a CS-type degree course. I am probably a fairly typical newbie programmer, in that most of my knowledge centers around scripting and high to very high level programming. There's much to choose from: languages, concepts, mathematics, and so on. From previous stories, I know that many readers have strong opinions on the failings and weaknesses of university courses and students. Apart from all of the coding that I will do, what can I do in the coming months to maximize what I get out of this? "
Get as much math as you can. The analytical skills you pick up will stand you in good stead throughout your career. If math isn't your thing, try to get as many courses that are important to businesses, like systems analysis, the practice of software engineering, control systems -- it'll help you work effectively in the wider world beyond programmers. And if you actually like CS, do look at (my biases) distributed virtual worlds, robotics and pattern recognition ... lots and lots to do in those areas. However (as I mentioned) a basic grounding in math, logic and the usual basic engineering subjects will stand you in good stead in all these areas.
Go somewhere random
In that most of my knowledge centers around scripting and high to very high level programming.
That's not the mark of a newbie programmer, there are many expert Java programmers out there; just because some of them haven't touched the assembly, doesn't mean they are newbie. Having most knowledge center around high-level language is smart, and it is the mark of a programmer that's realistic, as in actual practice high-level language is used the most (and most sophisticated and desirable to know).
Probably if you have any prior knowledge at all of the language that will be used for the curriculum, you will be an "expert". Figure out which language will be used and read up on it in advance, look at examples, and bookmark useful URLs.
You can be a master of x86 assembly and still be considered somewhat of a newbie in a Java programming curriculum. But in case you already know Java, you will start ahead, and have a better chance at mastering the much more important higher-level, language-neutral concepts such as proper design, understanding of algorithms, data structures, etc.
I suspect many CS programs nowadays may cover low-level language details barely if at all, that may be up to you to study independently.
Many students start with knowing no language at all. Knowing a little of just one language is what I consider the mark of a newbie. Advanced programmers know multiple languages, usually of different types -- not necessarily a lot of the low-level details, unless they choose to be low-level programmers, or they need some assembly code to solve a performance or to be able to understand their debugger's assembly dump.
A non-newbie should be able to find good reference material and read from the platform manual and learn parts of the language on the fly, as needed for the problem at hand, and that's about enough. :)
1. Remember you are not at school. Really. If we could get this into the heads of our student son day one it would be so much easier. Many still act like they're in school when they're in their 3rd year. You are doing the degree for you and what you will gain will be proportional to the amount of effort you put in.
... when I ..." ..."
2. Ask questions of your TAs and lecturers (when appropriate of course). Getting students to ask questions is difficult; especially when they don't understand. If you don't get what's going on, chances are that lots of other people don't, and they will be greatful when you ask the question they were to timid to ask. If you don't understand the answer say so and get the person to walk you through it. See point 1, it's your degree and it's for you, asking questions might make you look silly (in fact, having been on both sides of this, it doesn't; students just think it makes them look silly - see not being at school, in general asking questions makes you look smart) but which is more important you learning or what people who think they are still at school think of you? See the ESR guide on how to ask smart questions. You may not agree with the writing style but the points are valid.
3. Program. Lots. Anything and everything. In a variety of languages on a variety of topics. The *only* way to become a really good programmer is be experience and hard graft. Not only will this make your coursework easier and faster to do and help you pass your programming courses, it will improve your CV, but most important of all - it will help you understand what you are doing. Learn to use a variety of languages and tools like version control, symbolic debugging, static analysis, etc. Think of each language as a tool; the more tools you have the more likely you are to have the one you need. This applies to special purpose tools as well - SAT solvers, linear programming systems, machine learning, GAs, etc. A tap wrench can easily dismissed as 'useless' because you can't hammer things in or pry thing like you can with a claw hammer; but if the problem you are facing is removing a tap - they are invaluable.
4. The right attitude is vitally important. Classic wrong attitudes:
Spoilt - "It doesn't compile"
(Tempting flippant response - "That must really suck", Actual response - "Have you read what the error messages say?")
Defeatist - "I can't do this"
(Tempting flippant response - "and I can't be bothered to help you", Actual response - "What seems to be the problem")
Bigot - "Why do we have to do this with technology X, technology Y is so much better"
(Tempting flippant response - *sigh*, Actual response - "We're trying to teach ideas, not technologies")
World-owes-me-a-degree - "It's too hard"
(Tempting flippant response - "Well as the course is supposed to be obvious I guess we should drop this part", Actual response - "What seems to be the problem")
Too-busy-socialising - "I don't have time"
(Tempting flippant response - "That's too bad then isn't it", Actual response - "How long have you spent on it so far")
Right attitudes:
"Can you help me find why I'm getting a segmentation fault on line
"I'm not getting on well with this course; where is a good place to start?"
"I've done all of the exercises but I still don't feel confident with technology X. Can you recommend any good books."
"I've re-read my notes and gone through the examples; could you help explain why Z is needed when
"I've spent 10 hours practising this since last week's tutorial; could you check I'm going in the right direction?"
5. Work. Actually do the recommended reading (it's their for a reason) and the exercises. To get most of of your degree you should be doing at least 40 hours a week (including lectures, labs, etc.), less than 20 is poor and you will find the later years harder beacuse of it. Time invested in getting the foundations solid is never wasted.