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. :)
I disagree with the notion that a CS degree should have no programming aspects to it.
Yes, I agree the fundamentals (algorithms, data structures, numerical analysis, compiler theory, graph theory, calculus, etc) are more important than say a class on C... But at the end of the day, if you can't develop software you're not a very useful computer scientist (aside from working at the uni).
I do agree, however, that many CS degrees tend to focus too much on programming languages/tools (things that competent developers really ought to learn on their own anyways).
Tom
Someday, I'll have a real sig.
Most programming problems that have been worth while to attack for me have been extremely vague. These vague problems require you to look at numerous different solutions that you won't be covered by in class material. Most CS students fear these kind of assignments and hesitate to attack them. I would urge you to instead train yourself to enjoy learning new things. Once you get good at that you will be a more fearless programmer who doesn't fear: learning a new programming language, getting handed someone's spaghetti code that is 10,000 lines long and has functions that are 1000 lines long. ---- The first priority of your coding should be that it is readable by humans (emphasis on maintainability). ---- Most likely you will start with java or something else high level. But don't let that first language you use box you into only using it. Other languages have their uses. C is still the golden standard for embedded systems / DSP. Matlab is still the golden standard for prototyping / winning lots of million dollar DoD contracts.
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.
English grammar doesn't necessarily have anything to do with sorting or searching or the like. However, when you're working on a specification for a program you're writing, or when you're trying to explain how your program works or will work to someone else (in QA, documentation, technical support, upper management, etc.) being able to write well comes in handy.
I used to respond to these questions with a whole course list, but you know what, just enjoy college. Play Dungeons and Dragons, go to LAN parties, eat pizza at 2 am. You have the rest of your adult life to become an amazing programmer. You don't have to walk off with your degree saying, "I'm the next Bill Gates. My programming skillza are similar to those of a ninja." You should be good at what you do. Doing a few side projects won't hurt. Finding a summer internship won't hurt. But most importantly, enjoy these four years because they go by fast.
As much as /.'ers like to advocate spending your CS undergrad time learning math and not computing, I think its equally, if not more important, to spend your time understanding how computers work. In addition to the standard math track (calculus, discrete math, numerical analysis, probability), a well rounded CS curriculm should expose the computer science student to the inner workings of computers and software.
Do an architecture track that covers logic design and computer architecture. This will give you a solid understand of what is possible on modern hardwarend and teach you how to apply what you learned in discrete math.
Next, take an operating systems course. This will show you how software interfaces with the hardware.
Along the way, make sure to take at least two programming language courses, ideally one imperative/procedural and one functional. This will teach you there are multiple ways to solve the same problem. Once you're comfortable with languages, take a real algorithms course with a focus on analysis (not just design). If you have time, a compiler course will fill in the final gap between hardware-os-language-program.
Fill out your electives with things that interest you - graphics, HCI, databases, AI, languages, etc. Be sure to have fun in these courses and apply what you're learning in the other courses.
In the end, a good understanding of the whole stack - hardware, software, and theory - will give you the foundations to build a solid career in computer science, in industry or academia. If you want to specialize more, consider a Masters or Ph.D.
I've learned from experience in both industry and academia that a solid foundation gives you an advantge over people who specalized too early in their careers. A strong theory focus as an undergrad makes it difficult to understand what's practical, too much focus on the hardware side makes it difficult to understand what's possible, and only learning the latest trends makes it impossible to design an debug real systems. Strive for balance and breadth early, specialize later.
-Chris
And have fun being out of a job when your language of choice falls out of favor. Part of learning a lot of math in a CS degree is also learning a lot of CS theory. Understanding linked lists, stacks, queues, binary trees, and the like will help you to switch between programming languages. Sometimes you will realize that you need to represent data in a way that your language does not have a standard library for. Usually that means you're not looking hard enough for someone else's solution to your problem. But sometimes it means that you have to implement a binary tree yourself. That is becoming less and less the case these days, but just being able to phrase a SQL question in terms of tuples calculus can help you abstract the question in your mind and solve it better.
--- Justin Dearing http://www.justaprogrammer.net/ We're just programmers.
But it's worse than that. While knowing about databases and transactions is a good thing (and has some really nice CS depth to it) just knowing how to hack up SQL isn't the same thing at all. It's a road to anonymous skill-less poverty, and a total waste of a higher education.
My advice is to always push yourself. Do the assignments and labs set, but don't just do that. Try to find the most elegant or the most "oh wow!" ways of solving things. Look at how other people solve problems and try to think for yourself why their solutions are good ones or bad. Got a problem? Try to solve it yourself first. Then ask for help, and try to solve it again for yourself after having had the help. Take as many different courses within CS as you can; you never know when you'll need what you learned in them. (Oh, and don't be tempted to plagiarize; if your tutors wanted someone random's solution off the 'net, they'd google it themselves, OK?) Last of all, pay at least some attention to what other disciplines are doing too; for example, I find the various physical sciences, standard engineering, business, contract law and psychology all to be relevant to the area of CS where I now work. The bigger and more diverse your skill-set, the easier it is to find a useful technique for a particular problem, and it's easier to learn principles and fundamental theories across a broad spectrum than it is to do the "SQL and Ruby" approach of just learning specifics across that spectrum...
"Little does he know, but there is no 'I' in 'Idiot'!"
Out without a degree, but making "real money". Did it set me back a few years? Yes. Would I recommend it to anyone? I'm not sure, give me another 10 years of hindsite. I know I'm making 2k less than a a friend I started college with that graduated, 3k more than another that graduated and is now a manager, and 17k less than another friend without a degree that was doing ASP programming while he was in college.
What makes me sound like I'm in college? Do I stress theory to much? I like to program in C as a hobby and write my own linked lists. Tutorials I read to learn postgres threw around the phrase tuples calculus a lot so I do the same. I don't go writing binary trees in something like C# or Java when there are classes that can sort a list of numbers and find duplicates for me. However, its nice to know how everything works under the hood.
--- Justin Dearing http://www.justaprogrammer.net/ We're just programmers.
Get your fundamentals down. Any theory. Database normalization, database design, algorithms, language design, and data structures. Because you're only going to need to struggle for the rest of your career to keep yourself sharp and it's all the harder when you're starting with nothing.
You are not going to learn how to be a good programmer in college. You might think you're a great programmer and you'd be wrong. Dead wrong. The sooner you are prepared to deal with that realization the sooner you can get started becoming a good programmer in the real world.