Beta
×

Welcome to the Slashdot Beta site -- learn more here. Use the link in the footer or click here to return to the Classic version of Slashdot.

Thank you!

Before you choose to head back to the Classic look of the site, we'd appreciate it if you share your thoughts on the Beta; your feedback is what drives our ongoing development.

Beta is different and we value you taking the time to try it out. Please take a look at the changes we've made in Beta and  learn more about it. Thanks for reading, and for making the site better!

Getting the Most Out of a CS Curriculum?

Cliff posted more than 7 years ago | from the it's-not-just-about-code dept.

Programming 124

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? "

cancel ×

124 comments

Sorry! There are no comments related to the filter you selected.

To the editors: it is cUrriculum, not cIrriculum (0, Offtopic)

Anonymous Coward | more than 7 years ago | (#18554795)

Well spelling is obviously not one of them.

Programming skills have a small half-life (5, Insightful)

bheer (633842) | more than 7 years ago | (#18554803)

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.

Re:Programming skills have a small half-life (2, Insightful)

Bloke down the pub (861787) | more than 7 years ago | (#18555119)

Nah, transfer to law ASAP.

Re:Programming skills get you jobs (0)

Anonymous Coward | more than 7 years ago | (#18557433)

Yeah, because people are always asking me math questions in my job interviews.

Better option: Become an expert at SQL and the language of your choice. I would choose something popular.

Seriously if you leave a CS program knowing more about math than programming you are fucked. Have fun learning on the job while making 2/3 what you would otherwise be worth.

Re:Programming skills get you jobs (2, Insightful)

j-pimp (177072) | more than 7 years ago | (#18560501)

Seriously if you leave a CS program knowing more about math than programming you are fucked. Have fun learning on the job while making 2/3 what you would otherwise be worth.

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.

Re:Programming skills get you jobs (-1, Flamebait)

Anonymous Coward | more than 7 years ago | (#18560653)

Are you even out of college yet?

Re:Programming skills get you jobs (2, Insightful)

j-pimp (177072) | more than 7 years ago | (#18561471)

Are you even out of college yet?

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.

Re:Programming skills get you jobs (2, Funny)

bheer (633842) | more than 7 years ago | (#18560929)

> And have fun being out of a job when your language of choice falls out of favor.

Oh he doesn't even have to wait until it falls out of favor. If the language becomes really popular (e.g. Java), there'll be hundreds of drones in Bangalore or Saigon who'll do the job for a tenth of his asking rate. He'll then spend all his time unemployed and bitching about f*king Indians on Slashdot.

Re:Programming skills get you jobs (0)

Anonymous Coward | more than 7 years ago | (#18561525)

Maby he'll be like me and master Asp.NET which lots of Indians know but few are really good at. There are serious consequences to your product if you choose to outsource. Ive heard dozens of firsthand stories of failure but not one success story of outsourcing to India. Programming is not like manufacturing. Anyone can manufacture a battery, only someone good, skilled, and likely gifted will write good software. I know, I've read alot of other people's code.

Maby thats why I make $70k+ less than 2 years after graduating from college.

Re:Programming skills get you jobs (1)

bitserf (756357) | more than 7 years ago | (#18564399)

I second this - I've been a commercial software developer for over 8 years now, but doing my CS degree only now.

I'm taking all the math and non-CS related courses I can. If you do programming in your spare time, take part in an OSS project or two, that and your assignments will give you a fair bit of programming familiarity.

Software development lifecycle stuff, and all the peripheral knowledge you need when developing, you will pick up on the job. A little more than a year ago, I had no experience developing for the .NET platform, as an example, I was doing Perl/Mason work. I thought I'd like to get more familiar with it, and a year later, I'd rate myself at expert level, with a good understanding of all layers of the stack, and a new language, C#.

Get your money's worth out of uni, do as much as you can of things you won't be able to pick up in a job.
Don't take the "easy" CS courses, take ones that you know will push you.

Re:Programming skills get you jobs (2, Insightful)

dkf (304284) | more than 7 years ago | (#18561335)

Better option: Become an expert at SQL and the language of your choice. I would choose something popular.
What, like the thousands of other identikit drones doing exactly the same thing?

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...

Pastry School. (0)

Anonymous Coward | more than 7 years ago | (#18554821)

"Getting the Most Out of a CS Cirriculum?"

I'm still waiting for "Getting the most out of a 'Cooking School' Curriculum"

CS-type degree course? (4, Informative)

vivaoporto (1064484) | more than 7 years ago | (#18554829)

What's that? There is no such thing as "Computer Science alike". Either it is Computer Science, a degree that originally has nothing to do with using (or even programming) computers, but with the theoretical science involved in computation processes (disciplines like automata theory, Computability theory, Analysis of algorithms, Artificial intelligence, Formal language, etc., or in the math realm, linear algebra, Graph theory, etc.), or it is not. If studying the inner theories of computation processes is not for you, but you want to become a ready to market programmer, I advise you to choose a Technology Information degree or something more related. It is all up to what you are really aiming to.

Back in the day I was getting my CS degree in Brazil, where you are required to choose your major *before* you are admitted to the university, the dropout rate in the first 2 semesters was something like 20% (8 out of 40), because students choose CS thinking they would learn programming and advanced hackeries, and game programming when the truth was that they would have to go deep in calculus, algebra, data structures and everything "boring" first, in order to have the scientific basis to progress in the course. People just didn't understand that CS goal is not to produce developers to the market but researchers that have the necessary skill to learn everything they will eventually need to use. IT is a fast moving field, but the foundations of it are mostly static. Learn the foundations once, and keep in pace with the zeitgeist and you will be successful.

Re:CS-type degree course? (1)

linvir (970218) | more than 7 years ago | (#18554837)

Re:CS-type degree course? (1)

EveryNickIsTaken (1054794) | more than 7 years ago | (#18554843)

Sounds like the poster is going to Devry or some other non-University "Tech school."

Re:CS-type degree course? (2, Insightful)

tomstdenis (446163) | more than 7 years ago | (#18554919)

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

Re:CS-type degree course? (1)

pyite (140350) | more than 7 years ago | (#18555143)

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).

Why? Computer Science does not need to have anything to do with software development. That's what Software Engineering is. I'll leave you with a quote.

Computer science is no more about computers than astronomy is about telescopes. --Edsger Dijkstra

Re:CS-type degree course? (1)

tomstdenis (446163) | more than 7 years ago | (#18555195)

I leave you with a quote:

Snobby academics are not in high demand. If you want to get a job out of college you need both academics and practical experience. -- Me, right now.

That is, unless you want to work for the uni. I get that on a whole that CS isn't about programming, but I disagree that you shouldn't have it there. I mean you take English writing and other courses during a CS degree. What does English grammar have to do with sorting or searching or ? If you think you can get a job related to the creation of software without knowing how to program, you live in a fantasy world.

I should point out you get your hands dirty in a lot of other degrees. In medicine you tear into cadavers, in geology you perform surveys, in chemistry you perform experiments in a lab, etc. Academia isn't just about what you can learn from a book.

And for the record, my college program was called "Computer Science and Engineering." I suspect many other colleges have similarly long winded titles. So you're not likely to be in a pure CS degree anyways.

Tom

Re:CS-type degree course? (1)

pyite (140350) | more than 7 years ago | (#18555411)

Snobby academics are not in high demand. If you want to get a job out of college you need both academics and practical experience.

I'm not one. I'm an engineer (and not even a software engineer). But I hate that people in the field don't know the difference between Computer Science and Software Engineering.

Even if your degree sounds multi-purpose, it's likely you focused in one area.

Re:CS-type degree course? (1)

tomstdenis (446163) | more than 7 years ago | (#18555437)

I think the solution then is to not offer what you types call a "pure" comp.sci degree. Because no other science is purely book work.

Computer science is a tool that allows you to sensibly design software. Just like architecture allows you to make sensible home renovation decisions. Or how a medical degree allows you to know how to physically treat a patient. If you just want a book education, save yourself the trouble. Get a membership at a library and read the books. Save yourself the expense.

At anyrate, even if you do a few practical courses amongst all of the theory, you're still hard to pick out from the 1000s of others in the same boat. Which is why practical experience like your own successful OSS project is a handy thing to have on a C.V.

Tom

Re:CS-type degree course? (2, Interesting)

honkycat (249849) | more than 7 years ago | (#18555967)

I think the solution then is to not offer what you types call a "pure" comp.sci degree. Because no other science is purely book work.
Almost any science program focuses on the science itself, not the huge variety of practical engineering-type yak-shaving techniques that you may end up spending most of your time actually doing. There's so much actual science to be learned that you just can't fit in specific classes to cover all the practical details you may need experience in. I don't see that computer science needs to be treated differently in this regard.

For example, even a physics undergrad degree program doesn't typically include the engineering training that you'd need to design a cryostat or a particle detector. It includes the background science on these, but when it comes time in your career to actually do this, there's still a lot of specifics left to learn. There are so many different specifics that you may need, depending on what area of physics you go into, it's just not reasonable to include them in the degree.

What you get instead are lab classes and undergraduate thesis projects. The former expose you to a random smattering of specific techniques, but typically no actual instrument design. These usually try to cover a broad range of techniques, but there's still only time to do a few. Your undergrad thesis project probably concerns an area you're likely to go into, so it's a good opportunity to learn some specific techniques in more depth, but even that is usually a very limited project.

I don't see why "computer science" should be treated much differently from other sciences. It has the same issue with squeezing both the theoretical background and practical issues into a reasonable program. There is such a huge number of technologies / languages / code management tools / etc out there, that no matter what subset they choose, it's going to be the wrong set for a large number of graduates.

I agree with whoever it was who suggested having separate degrees for CS and software engineering. What's the problem with a computer science degree aimed at those who really want the background and a software engineering degree that offers a mix of computer science courses and specific practical issues? The world needs both programmers and computer scientists, and they have pretty different educational needs.

Re:CS-type degree course? (1)

tomstdenis (446163) | more than 7 years ago | (#18556037)

Hahaha cute.

My brothers wife is doing a masters in biology and she spends considerable time in the lab doing non book related work. My friends wife did a masters in geology (underground water studies) and spent considerable time in the field doing survey work.

etc.

Many sciences have a practical observation/doing side to them. Even physics. It's just plain foolishness to think you're above getting your hands dirty because you're in university. While, yes I agree that CS degrees tend to stray towards the practical side too much, that hardly means there should be no practical side at all. Probably the only one I can't see having a practical side is mathematics. But even then the gold is in the application of the math not the math in and of itself.

Imagine a world where your ideas held true. Doctors would drop into the hospital having never touched a human body. Engineers would have never built a model or performed observations, etc, etc.

Anyways, to get back on topic, if you think going through uni with zero practical experience is the best way to achieve your goals, all the power to you. You're either a trust fund baby, or just have no idea how the real world works. If the OP wants to get the best mileage of their CS degree they best develop their portfolio. It's that damn simple.

Tom

Re:CS-type degree course? (1)

honkycat (249849) | more than 7 years ago | (#18557781)

Cute? Come on, Tom, don't be a dick.

First of all, as someone with both EECS and physics undergrad degrees, who's worked professionally as a hardware/software engineer, and is currently in a physics PhD program, I think I have some idea of how the world works as it pertains to my post.

Second, I never argued that a science (computer, physical, medical, whatever) should not have a practical component at all -- I don't have any idea where you got that. My point was that at the undergrad level, the amount of time available for it is limited. The best use of that time is to focus on the particular skills that can be used to demonstrate the fundamentals of the curriculum rather than futilely trying to create experts of the practical side at the expense of the theoretical background. This is, for example, why many CS programs use/used "impractical" languages (scheme, lisp, etc) rather than spending a long time on the "more practical" languages.

Third, notice that all your counterexamples are NOT undergraduate level. Masters degrees are typically 2-3 years focussed research and medical, well, you're lucky if you are out of school and done with your residency much before you're 30. I'll grant that some sciences have a more standard set of experimental techniques, but still, it's pretty rare to get a job that's much more than basically a lab tech or the equivalent apprenticeship with a bachelor's degree in these fields.

Anyway, I completely agree that someone who wants to come out ahead should do a lot of work above and beyond the curriculum. However, I disagree that this means there's anything wrong with the curriculum itself.

Re:CS-type degree course? (2, Insightful)

Hotawa Hawk-eye (976755) | more than 7 years ago | (#18555771)

I mean you take English writing and other courses during a CS degree. What does English grammar have to do with sorting or searching or ?

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.

Re:CS-type degree course? (1)

tomstdenis (446163) | more than 7 years ago | (#18556057)

And having practical knowledge to know whether your design pays off or not is probably a good idea too n'est pas?

Sure you may know how to implement, say an efficient matrix reduction algorithm. But the devil is in the details. Try implementing that on say an 8051 or FPU less machine, etc...

Having practical experience allows you to make *rational* design decisions that are likely to be lower risk than someone who has no experience writing software.

Tom

Re:CS-type degree course? (2, Interesting)

TheRaven64 (641858) | more than 7 years ago | (#18555255)

Computer science is no more about computers than astronomy is about telescopes. --Edsger Dijkstra
I think you are reading this quote the wrong way. How many of the famous astronomers from history didn't build their own telescopes? Very few. Even these days, astronomers have to know a lot about telescopes; how they work, how they are built, how to effectively use them. I learned most of the optics I know via astronomy.

Computers are not the be-all and end-all of computer science, but they are the basic, fundamental tool. If you can't write software, then you are as much use as a computer scientist as an astronomer who couldn't build their own telescope. Even if you don't actually end up writing software (or building telescopes), the ability to is still important.

Re:CS-type degree course? (1)

timelorde (7880) | more than 7 years ago | (#18555323)

... If you can't write software, then you are as much use as a computer scientist as an astronomer who couldn't build their own telescope. Even if you don't actually end up writing software (or building telescopes), the ability to is still important.

I thought that's what grad students are for...

Re:CS-type degree course? (1)

dkf (304284) | more than 7 years ago | (#18561021)

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).
Psst! Here's a big hint! You're not very much use at a uni either if you've got a CS degree and can't program. Without programming, all you can do is draw pretty flowcharts on a whiteboard, constructing castles in the air out of little more than hot air and dry-wipe markers. For all that to mean anything (including enough to be worth publishing!) it had better be programmed into something that approximates computing machinery.

Pure CS is just mathematical logic. The fact that we do things with this makes it an applied subject, and practitioners of applied subjects always get their hands dirty (well, metaphorically). If nothing else, trying to do things for real is a great source of interesting problems to work on.

A note about the editing (4, Funny)

linvir (970218) | more than 7 years ago | (#18554849)

Before the usual spelling bitchslap about the editing, I want to get this in: Cliff actually did a decent bit of editing on my submission here. He's moved around some of what I typed and tweaked the wording slightly to improve the style. He also changed "CS degree" to "CS Cirriculum", which is unfortunately a bit of an own goal.

What you should do... (4, Funny)

EveryNickIsTaken (1054794) | more than 7 years ago | (#18554863)

Learn Chinese and Hindi. That way, you'll be able to understand the professors.

Re:What you should do... (0, Redundant)

pasamio (737659) | more than 7 years ago | (#18555007)

Better yet, spent three months in each country so you can then understand their accent.

Re:What you should do... (1)

scruffy (29773) | more than 7 years ago | (#18557109)

Learn Chinese and Hindi. That way, you'll be able to understand the professors.
Even more importantly, you'll be able to understand the TAs.

Re:What you should do... (1)

lawpoop (604919) | more than 7 years ago | (#18557365)

Yeah, and then you can get a job in India or China after the dollar collapses, also :)

Maybe not such a newbie... (5, Insightful)

mysidia (191772) | more than 7 years ago | (#18554875)

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. :)

Re:Maybe not such a newbie... (1)

TheRaven64 (641858) | more than 7 years ago | (#18555289)

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).
Most is fine. All is not. A good programmer has to be able to think at multiple levels of abstraction simultaneously. At the end of the day, a high level language is a tool for quickly generating large amounts of assembly (well, machine code, but you get the point). If you don't understand assembly, and you don't understand compiler design, then you won't know what assembly your compiler is likely to generate.

A good programmer will usually not write assembly, because writing it by hand is not the most efficient way of generating it. Similarly, a good programmer will meta-program in their higher-level language when they can, because that's a more efficient way of generating the higher-level language, which in turn is the most efficient way of generating the assembly.

In summary, my advice to novice programmers is never forget that the code you write has to run on real machines in the end. (I agree with most of your post, but I felt that bit needed a little clarification.)

Re:Maybe not such a newbie... (1)

Glonoinha (587375) | more than 7 years ago | (#18555525)

... there are many expert Java programmers out there; just because some of them haven't touched the assembly, doesn't mean they are newbie.

I'm going to have to respectfully disagree with you. The majority of 'expert' Java programmers I have met that don't also have a strong background that runs all the way to the bare metal (ie, assembly programming) are not expert programmers, they are generally self taught Java programmers that are either very familiar with a large variety of libraries in Java, or have figured out how to put together .jsp pages and .java pages using Struts to implement the MVC model on an application server.

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.

Whoops. I should have kept reading. It looks like we agree afterall.

Re:Maybe not such a newbie... (1)

xero314 (722674) | more than 7 years ago | (#18556825)

...[they] are not expert programmers, they are generally self taught Java programmers...
I have to take issue with the connotation that self taught programmers are not expert programmers. You do realize the only reason there are Educated programmers is because some where along the way self taught programmers decided to teach. I also don't like that you assume self taught java programmers have no knowledge of lower level development such as C, Assembly and Machine Code. It may be the fact that I learned how to programmer before there were CS degrees available, but I can tell you from experience that I would normally chose a self taught programmer or someone who has a CS degree from some prestigious school. I have actually met good programmers from both backgrounds, but to really make it and be self taught takes a lot more skill since you don't have a piece of paper to fall back on when someone points out you haven't a clue what you are doing.

...that are either very familiar with a large variety of libraries in Java, or have figured out how to put together .jsp pages and .java pages using Struts to implement the MVC model on an application server.
As opposed to the numerous CS grads that can spout of the inner workings of the latest white hat security algorithm yet couldn't put together a real world business application under stringent client requirements if their life depended on it. And yes I realize that CS was not intended to teach programming, I just wish the CS grads and IT/IS managers would realize it and stop wasting real programmers time with having to deal with them.

In the end it appears that a mix of formal and self education is really the best way to go. And I'll tell you if I'm right when I get done with my CE (or CSE according to the state school I go to) degree.

Re:Maybe not such a newbie... (1)

SnappyTurtle (1080079) | more than 7 years ago | (#18561785)

I think you'll find that most attentive students these days are pretty aware of assembly & JAVA. Most CS courses at degree level will run modules on architecture along with modules on OOP. Mine certainly does. Besides, I don't really understand how someone could be considered an 'expert' JAVA programmer without knowledge of whats happening at the lower levels, even if teh JVM does take that responsibility away from the programmer. The process is a hollistic one if its to be considered an 'expert' one. Also, you make JAVA sound like some easy language to learn which to my mind does'nt make sense. JAVA is after all a fully Object-Oriented language and as such comes with the added complexities of Object-Oriented design; something I expect only a very dedicated programmer will take the time to study properly.

Re:Maybe not such a newbie... (1)

scum-e-bag (211846) | more than 7 years ago | (#18562395)

OOD, OOP and Java... currently it's the way things are going. (Someone will correct me if I am wrong)

Let me place some emphasis on the OOD... learn the theory... learn the design patterns...

When you first encounter OOD try to forget about programming all together. You must begin to visualise objects and their interaction with the world around them.

If you can get a good understanding of OOD then OOP flows along with ease. ...and for the original question...

Don't forget to run linux as a platform for all your coding... ...after all, Java is write once, run anywhere!!!

Re:Maybe not such a newbie... (1)

xero314 (722674) | more than 7 years ago | (#18564423)

Also, you make JAVA sound like some easy language to learn which to my mind does'nt make sense. JAVA is after all a fully Object-Oriented language...
No wonder the idea of Java (It's not an acronym) as an easy language is incomprehensible too you since you can't even comprehend that Java is not a fully Object-Oriented language. Try using a fully Object Oriented language, such as small talk, and then try and say that Java is fully Object Oriented. I know you going to try and say that event though the language is not fully OO it can be code in a way to be fully OO, but by that definition so can C.

I don't really understand how someone could be considered an 'expert' JAVA programmer without knowledge of whats happening at the lower levels.
So to be an expert in modern english (the language not the band) you also have to have knowledge of latin? I'm not saying you are right or wrong, just asking the question.

Re:Maybe not such a newbie... (1)

Geoffreyerffoeg (729040) | more than 7 years ago | (#18555819)

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.

Thanks to its JVM, you have enough layers of abstraction that what you're saying is probably right for Java. But if you're working in any language that compiles to native code, it's worth having a general understanding of how machine languages work, so you know why certain coding constructs are much more efficient than others, so you understand how and why pointer/array arithmetic works, so you understand exactly the difference between local, global, static, etc. variables, and so forth.

Just as much as one should always respect the abstraction barrier, one should try to know what's actually going on under it. Not only will it make you a better coder in your own software, but it'll help you understand exactly why the abstraction exposes a certain interface and exhibits certain characteristics.

Start an OSS project (2, Interesting)

tomstdenis (446163) | more than 7 years ago | (#18554899)

Find a problem that isn't adequately solved and do it. Nothing says serious developer more than someone who can develop, maintain, document, and support a useful OSS project. Bonus points: Your future employer may be a user (worked out for me :-)).

People who coast through uni without really taking the initiative are a dime a dozen. If you want to stand out you have to get yourself organized and build a portfolio of public projects that demonstrate you're a competent fellow.

Tom

Re:Start an OSS project (2, Informative)

kestasjk (933987) | more than 7 years ago | (#18554963)

Or, if you're good enough, do some freelance coding. Places like rentacoder are good because people hire you based on your skills and price, and not your qualifications.

The obvious added bonus is that if you're prolific enough you can actually earn your uni fees as you go; it's working well for me so far. It's also a fairly good place to apply all the stuff you learn in your software engineering units.

Re:Start an OSS project (1)

tomstdenis (446163) | more than 7 years ago | (#18554979)

perhaps. The benefit of an OSS project is it's a very public thing and easy to control all the aspects of it (e.g. design something that really shows off your smarts).

In my case I stuck my name in my project name ... LibTomCrypt. So it's very handy as both advertising and as a catchy name :-)

Tom

Re:Start an OSS project (0)

Anonymous Coward | more than 7 years ago | (#18555089)

In my case I stuck my name in my project name ... LibTomCrypt.

Just watch out for the human resources guy reaching for a wooden stake or the interview might produce the medical definition.

Re:Start an OSS project (1)

kestasjk (933987) | more than 7 years ago | (#18555235)

I also run an OSS project phpDiplomacy [phpdiplomacy.net] , so I appreciate that coding your own stuff is more fun and interesting, but working for real people that require you meet a deadline may be more attractive on your CV.

Re:Start an OSS project (1)

tomstdenis (446163) | more than 7 years ago | (#18555269)

Who says you can't treat your project properly? For the most part in my projects, I'd fix bugs in a timely fashion [usually under 24 hours] and would announce in advance release dates [and hit them].

My users appreciated that they not only have a say on how the projects advance [through suggestions, fixes, and submissions], but also that they can depend on things progress smoothly. It also helps if you do the whole 9 yards. In my case, I have a 300 page user manual, tons of examples, very commented code, organized nicely, etc. It's not just a scrap of code with no other support.

Keep in mind my comment is for those in school. The chances of getting a useful development job while in school is fairly slim. And even if you do, it's rarely worth the effort. You're treated as sub-junior, paid next to nothing, get no say in how the project develops, etc. I should I worked for a half dozen firms during my college career.

I should point out I got my current job only a couple months out of college. They were long term users of my crypto library and decided they wanted that talent on staff. I didn't have to jobhunt, or apply or anything. In fact, I was in France on other business when they contacted me. So I was kept fairly busy because of my OSS projects.

Tom

Get out while you still can... (0)

Anonymous Coward | more than 7 years ago | (#18554947)

and transfer into an Engineering program or a business program.

Better yet, go into Medicine or Law.

A CS degree means nothing: you're not qualified for the intense algorithm development roles - that's what Math majors and Engineering majors are for. Example: CAD/CAM. The mathematicians write the algorithms and code for the computations and all of the intense calculations and simulations. The CS guys wrote the UI - that's it.

The only thing a CS degree is good for is to get into an interview with the CS degree snobs who think you need one to program.

Work on projects outside of class (0)

Anonymous Coward | more than 7 years ago | (#18555003)

Almost all the time the difference I see between OK programmers and exceptional ones is the work they do on their own projects outside of class. I am not sure which is cause and which is effect though, but I won't hire anyone who's resume doesn't show that they do it for fun too.

Also, if you already do it for fun, college is the best time to work on your own things -- even great programming jobs leave you sick of it at the end of some days.

Dudes (4, Funny)

matt me (850665) | more than 7 years ago | (#18555013)

I hate to tell you guys, there is no such thing as a Counter-Strike curriculum. Some of you take that game *way* too seriously.

Math and PROJECT MANAGEMENT (1)

NekoXP (67564) | more than 7 years ago | (#18555029)

Make sure you have the development lifecycle and procedures down, and learn as much science as you can other than computer science. You may get paid to develop software but that software has to do things - and usually that has a lot to do with maths, science, research, data processing, and all of that needs testing.

If you train yourself to be a project manager, study the development PROCESS rather than the menial low-level grunt work, the project will come out better for it. You needn't be a great coder - as when you are a great project manager, you get to tell other people to write great code for you :)

Re:Math and PROJECT MANAGEMENT (1)

gbjbaanb (229885) | more than 7 years ago | (#18555201)

lol. he says how do I becoem a better coder, and you tell him not to bother. Project management requires a lot more business analysis than you think, so its lousy advice to give someone starting out in CS.

I suggest he learns the very basics, what does it mean when the language says 'start a thread', or 'allocate memory'. Unless you know this kind of stuff you'll end up being a very inefficient coder and end up as just another ok coder who knows 1 trick. Learn the basics (even if you think they have nothing to do with your high-level languages you think you'll be coding in later), it'll make you much better than people who have learnt from a book.

Re:Math and PROJECT MANAGEMENT (1)

OSXCPA (805476) | more than 7 years ago | (#18555529)

Just a note on project management - I have found that PM classes were only useful to me at the grad level after I had some work experience. YMMV, but I liken it to all the undergrad business majors I went to school with (I'm BS in Finance) who went straight into an MBA program after getting their undergrad - they got little out of it except the letters after their name. I found it critical to my learning 'Management' to have some context. Depending on your school, you may be taught by professors who have never run a major project - they just have PhDs' in PM. Theory can't help you unless you have a context in which to apply it - and work experience gives you context for the classes. PM isn't like CS - like most 'soft' skills.

Management is an art and a skill - a craft even, for those who really pursue it. Few do. My suggestion - take a class or two if your schedule permits, but don't go whole hog. You want to know enough so when you see project problems arise, and you will, you'll have some perspective on how to troubleshoot - or at least save some of your sanity.

Just my $.02 - good luck to grandparent!

Re:Math and PROJECT MANAGEMENT (1)

mdfst13 (664665) | more than 7 years ago | (#18556821)

Just a note on project management - I have found that PM classes were only useful to me at the grad level after I had some work experience.
Most MBA programs only allow people have been in the workforce for the same reason. You need the work experience to provide context for the class. Without that context, you'll never be able to connect the theory to practice.

In terms of becoming a better programmer, the most important classes are the ones dealing with software engineering. Writing unit tests; coding defensively; writing maintainable code; gathering requirements. Those are the fundamentals of good programming.

The algorithm and programming classes are the fun classes, but you won't get much chance to use them. Optimizing qsort? Something you do in class but never in real life (unless you are writing a new language or maintaining something like Ruby). If that's what really interests you, then fine, shoot for the moon. However, you should start with the interest and drive in that case. Software engineering is a better choice if you want to program but don't really know exactly what.

Also, as others have noted, if programming is your passion, prove it by either making (or joining) an open source project or doing internships to pick up extra experience (or both). Again, this will offer you the practical context in which to understand the theory in your classes.

Re:Math and PROJECT MANAGEMENT (1)

hazem (472289) | more than 7 years ago | (#18557703)

Most MBA programs only allow people have been in the workforce for the same reason. You need the work experience to provide context for the class. Without that context, you'll never be able to connect the theory to practice.

I would disagree with that. Most of the MBA programs I looked at did not have any kind of work requirement. They wanted people with high GMAT scores and GPAs because that raises the average GMAT and GPA of their enrollees.

The goal of most schools is to increase enrollment and increase the "quality" of the applicants. More students = more money.

Re:Math and PROJECT MANAGEMENT (1)

OSXCPA (805476) | more than 7 years ago | (#18558705)

Regarding MBA admission 'requirements' - I have yet to see a program that required experience. I worked for a program (Univ. of Illinois Champaign-Urbana) and they had no such requirement, and there were several peers of mine who went straight into programs at Northwestern (Kellogg), Stanford and University of Chicago. Maybe Harvard, Yale and other top tier schools have such requirements, or maybe lower down the scale, but while they may *prefer* such students, I've never seen evidence of a 'requirement'.

Then again, I have firsthand knowledge of only 4-5 schools - a statistically insignificant sample of MBA programs, I will admit.

*sigh* (2, Funny)

Rocketship Underpant (804162) | more than 7 years ago | (#18555083)

Well, at least the article isn't about getting the most out of an English "cirriculum".

From the start work on good programming habits!! (2, Insightful)

syn1kk (1082305) | more than 7 years ago | (#18555129)

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.

Re:From the start work on good programming habits! (1)

TheRaven64 (641858) | more than 7 years ago | (#18555303)

Mod parent up. A couple of the best programmers I know make a point of starting each personal project they write in a new language. Even if they never touch the language again once they've finished, they are then able to apply the concepts from that language to their existing tools.

Take machine learning courses (0)

Anonymous Coward | more than 7 years ago | (#18555145)

If you want to get a job at Google, take all
the machine learning courses you can.

Otherwise, just make sure you program on your own
as much as possible; take project courses that
let you work on your own stuff, and become
a regular contributor to an open source project.
(Wine is a great one because they're in good
shape technically, they're lots to do there, and
they have a strong test suite so
you can't screw up too badly.)

As someone who teaches undergraduates in CS... (5, Insightful)

Anonymous Coward | more than 7 years ago | (#18555245)

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.

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 ... when I ..."
"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.

6. If your course is any good it should be teaching principles not technologies (although obviously you will have to learn some technologies to practise your ideas). Try to learn around these areas so you can see how these are applied in other techonologies and how these techniques piece together. Ask your lecturers and TAs about what they work on and what current research areas are. When you get told about an idea or technique, think "What problem does this solve?"

7. Acquire a copy of "The Structure and Interpretation of Computer Languages" ( http://mitpress.mit.edu/sicp/ [mit.edu] for the online version), read it and do all of the exercises. It will make you a better programmer.

Above everything else, have fun and remember that it's up to you.

Re:As someone who teaches undergraduates in CS... (1)

superwiz (655733) | more than 7 years ago | (#18555325)

Wow! This is the most useful slashdot post I ever read. Period. I am going to print it out and distribute to my CS 101 class. Absolutely brilliant. Thank you.

Re:As someone who teaches undergraduates in CS... (1)

Brian Stretch (5304) | more than 7 years ago | (#18555583)

Very good points. Someone mod the parent post up.

The student matters more than the teacher. If the student doesn't do the work, the teacher can't help. If the teacher is incomprehensible, the student can still RTFM. Alas, I didn't get that point through my head as an undergrad.

The one thing I'd like to add: learn how to do testing. Learn how to write testable code. Perhaps start at the JUnit [junit.org] website? Add unit tests, for starters, to your homework projects when it makes sense to you to do that. See if it impresses your professors.

Re:As someone who teaches undergraduates in CS... (1)

LibertineR (591918) | more than 7 years ago | (#18555981)

Well done, dude. One of the best posts I've ever seen on Slashdot. S/B required reading.

When is your book coming out?

Re:As someone who teaches undergraduates in CS... (1)

crispybit (749599) | more than 7 years ago | (#18556351)

Here Here, this is a great post and very useful, I too am embarking on my sophmore year at a JC getting ready for University in a CS program, this is going down on paper for sure!

Re:As someone who teaches undergraduates in CS... (1)

cryptoluddite (658517) | more than 7 years ago | (#18556659)

8. once you have finished a project, rewrite it in a better way.

9. repeat 8 until you can't figure out a better design

10. remove *all* cruft in you final solution

goto 8

Seriously the best thing you can do is to try to make your code better. It doesn't help much to just keep programming more and more stuff. Once you get more experience you'll also understand that 'smallest' or 'fastest' isn't always best, for instance when you need to add changes or when somebody else needs to take over or when a solution in LISP is 3 lines whereas your C version is 5k loc and only runs 2% faster.

DO NOT UNDER ANY CIRCUMSTANCES LEARN C++.

Programming in C++, like programming for Windows, can instantly turn otherwise decent programmers into the worst of the worst. It's like garlic... once you take it in it's only a matter of time before you end up stinking from every pore in your body.

Re:As someone who teaches undergraduates in CS... (2, Funny)

Anonymous Coward | more than 7 years ago | (#18556789)

I suggest you try replacing the goto statement with something more maintainable in next revision of your comment.

A prettified version... (1)

Tragek (772040) | more than 7 years ago | (#18557043)

I agree with everyone else above. That was the best post on slashdot I've read in quite a long time. It was so good, I took a couple of minutes and made a prettified version, and uploaded it here. If you feel that's inappropriate, please, message me and I'll take it down. But thank you very much.

The prettified version lives Here. [ualberta.ca]

Re:A prettified version... (1)

hazem (472289) | more than 7 years ago | (#18557773)

Thanks! As someone who aspires to get a PhD and someday become a professor, this set of guidelines is great.

I can't help but think they can't be generalized to apply to more courses of curricula. I'll have to work on that...

Thanks for the pretty version!

Re:A prettified version... (1)

Tragek (772040) | more than 7 years ago | (#18563891)

Welcome. Took no time, but makes reading easier.

Re:As someone who teaches undergraduates in CS... (1)

scruffy (29773) | more than 7 years ago | (#18557149)

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.
Yes, if you actually do the reading, you'll already be ahead of 90% of the other students.

Re:As someone who teaches undergraduates in CS... (1)

kalidasa (577403) | more than 7 years ago | (#18557297)

There's a reason so few students do the reading. In general, CS books are very poorly written. It's much easier to read a book in clear, concise prose with some stylistic interest and which proffers easily understood explanations than it is to read a book written in turgid prose with unnecessarily dense explanations. Some of the concepts that CS text books explain in a chapter of verbal cruft could be better explained in three paragraphs of transparent analogy.

Re:As someone who teaches undergraduates in CS... (1)

dkf (304284) | more than 7 years ago | (#18560559)

Some of the concepts that CS text books explain in a chapter of verbal cruft could be better explained in three paragraphs of transparent analogy.
Alas, it's more often the case that you can use three paragraphs of transparent analogy to explain a concept and manage to completely miss the point and so totally mislead someone reading the text. Let's face it, some things are hard and must be experienced to be really understood. (See the Twelve Networking Truths [ietf.org] for a good example.)

Re:As someone who teaches undergraduates in CS... (5, Insightful)

Geno Z Heinlein (659438) | more than 7 years ago | (#18557183)

5. Work. Actually do the recommended reading... and the exercises.

I went from being a C student to getting 98 out of 100 on calculus exams from this approach to things. It sounds like someone's old man saying stuff like "In my day..." but the fact is, you just have to cowboy up and then it's easy.

And once you've done this for a hard course like calculus, everything else is downhill. I discovered that the first half of lots of teachers' lectures was a paraphrase of the chapter you were assigned to read. When I went into class having read it already, I found that (1) I understood it much better because of multiple sensory methods (a trite but true method), (2) I was able to ask intelligent and useful questions about things that were vague on first reading, and (3) teachers noticed this.

The benefits of (3) are both gross and subtle. One semester, I had 60 migraine headaches in about two months (I didn't know about aspartame then), and scored 55 out of 100 on a calculus exam. The teacher had known me for 2-and-a-half semesters though, and threw that exam out, because he knew it was not due to me screwing around. He knew I wanted to do well.

The real benefit, though, was better instruction. The teachers would talk to me. They'd say things it would never occur to them to say to more passive students. I converesed with them, instead of being just lectured to. There was a richness to my education that I got because I was involved. In short -- cliche alert -- you get out of life what you put into it.

CS Type or CS? (1)

mrroot (543673) | more than 7 years ago | (#18555335)

In September I start on a CS-type degree course.

CS-type or CS? There is a difference (see below).

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?

If it is a CS course, you probably will do some "coding" but not alot. Computer Science is about much more than writing code. In the majority of my classes we wrote no code at all, because its about learning the ideas and concepts and not the specific implementations (it is assumed you can figure out how to write code). So my advice to you is to dig deeper than just simply learning how to write code.

Experience (1)

JoeCommodore (567479) | more than 7 years ago | (#18555385)

Not sure of the environment you are going to be taught in but make the most of what tools are at your disposal, also try to get experience in things that interest you.

Since it is a school situation team up with people and build relationshios and swap skills.

Keep in mind once you are out of school, working becomes the #1 priority for most of your day time and learning new stuff is crammed in somewhere below that. Learn what you can now without the pressure of bosses, deadlines and family keeping you from it later on.

I recommend discrete math and other math courses (1)

jZnat (793348) | more than 7 years ago | (#18555441)

Discrete mathematics is very similar to computer science in many ways as it deals with logic, sets, Boolean algebras in general, algorithms, graphs (also featured in a data structures course), and many other interesting topics that can usually be applied to computer science. If you want to get a good grasp on the theory of computer science such that you can pick up on any programming language in any paradigm, it would be very useful to work on math courses on the side such as discrete mathematics or Boolean algebra.

Of course, you should always remember that programming languages are just implementations of computer science, so learning a specific language is really something you do after you know the concepts well. You can probably learn a lot of the base concepts using either C++ or Java, but when you get to your second or third year of CSC, you will definitely begin to explore many different languages (including assembly), especially ones you'll probably end up hating (e.g. Pascal, Fortran).

Also note that I am working on a computer science major, but I have not graduated yet, so this is just based on my experience so far.

What you get from it is what you make of it (1)

BASICman (799037) | more than 7 years ago | (#18555457)

Its hard to say not knowing your program, but I can speak from mine. I'm at the other end of the table from you; a senior in an undergraduate liberal arts program who has just finished his BA in Computer Science.

I found that my program was way too theory-oriented. Way too early on there was an emphasis on intense algorithm efficiency that lasted for the first two years, and then disappeared from the coursework entirely. Similarly, for the first two years all classes were taught using Java, and then afterwards you could use whatever language you wanted to (most used Java). There was no push for learning other languages, which I understand. And there was more than a deemphasis on practicality; our department chair actually thinks that practical knowledge is something bad. The long and the short of it is that simply following the CS curriculum, without putting in any effort on your own time will get you nowhere.

Answering the poster's original question, in the short-term make sure that you know Java and at least one scripting language (it was Python for me). If your CS department is like mine, your first two or three courses (Freeshman-Sophmore year) will be Java intensive. At the very least, a strong knowledge of Java will put your "Intro to Object Oriented Programming" course in the bag for you.

After that, its what I said in the reply post subject; its what you make of it. Your program may not hand you anything you really need on a silver plate; I discovered this about my program very early on. As a freshman (after playing with UNIX somewhat) I realized that I wanted to someday design operating systems. So I taught myself C. Then I wanted to get in some research experience. When nobody in the CS department would take me, I went over to Biology and got into a Biomathematics research group where I coded a theoretical biological model in C. My software design skills there put me above the others in my lab, who were all Bio or Math majors and had no coding experience at all; soon I ended up teaching them a workshop on C programming. I wanted an internship, I had to find it on my own. I wanted a job, I had to find it on my own.

Contrast this with most of the other students in my class. Because it wasn't a big name program, most other students always came off to me as the type in the field for easy money. At the least, few of the students that I ever worked with actually applied themselves or even cared. These people mostly go to work at a local payroll services company after graduation. I start at a Fortune 500 company this summer... doing OS design.

Enjoy It (4, Insightful)

ggKimmieGal (982958) | more than 7 years ago | (#18555889)

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.

Learn the whole stack (2, Insightful)

rockmuelle (575982) | more than 7 years ago | (#18555901)

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

Tips from me (1)

gregbaker (22648) | more than 7 years ago | (#18556005)

In most courses, there are several ways for you to learn the material (assignments, readings, lectures, study groups). Figure out which one works best for you (sooner rather than later). A study skills [ldpride.net] evaluation might be worthwhile to start. A lot of people don't figure these things out quickly enough and end up banging their heads against ineffective study habits.

Your school likely has some course like "comparative programming languages" where you're exposed to functional and logic programming. Take it. If you know only OO/imperative programming, you're missing out. Even if you don't end up a LISP programmer, it will help you think differently about programming problems.

You'll likely be required to take an "algorithms and data structures" course. Pay attention. That's the kind of thing that separates a computer scientist from a programmer. A lot of more practical students hate that course, but it's like making a kids eat their vegetables: it really is good for you.

If it's not required, make sure to go out of your way to learn about concurrency and threads. This can be subtle stuff, so it's best to be taught the basics. Somebody's going to have to use the power of these multi-core processors. It might as well be you.

Some general advice (2, Interesting)

Anonymous Brave Guy (457657) | more than 7 years ago | (#18556025)

I wrote a post in a recent Slashdot discussion on computer science [slashdot.org] that might be of interest. Short version: read around your subject, try to gain a breadth of experience using the resources available at your university, and never stop learning. The linked post is the long version with specific examples. HTH...

Plan on an extra semester or two (1)

davidwr (791652) | more than 7 years ago | (#18556217)

A normal CS curriculum is 8 or 9 full-time semesters.

If you can swing it financially, take 1 or 2 extra full-time semesters.

Take 5-10 courses in:
  • Liberal arts, to make you a more well-rounded person
  • Some non-tech elective you like, to keep you from going insane. If you swim and like crafts, go for Underwater Basketweaving.
  • A business or business-law class or two. You want to learn how managers think and you want to be able to start your own business without making fatal business-side mistakes. Intellectual property law is good too.


Also:
  • Learn a non-English human language or continue what you learned in high school. In today's world you'll need it. Any language will do but for Americans, I'd put Spanish, Arabic or Chinese on my short list. Japanese, Hindi, and German, are also financially promising.
  • Do internships or a co-op during the summers or between semesters. Technical co-op jobs pay real money. After your junior year you should be able to rake in $15-$25/hour or even more if you have good grades and good references.
  • Consider taking a minimal full-time load or a less and working part-time. If you can get A+ certification or can design web sites you can pull in $10+ an hour easy, maybe double or more if you hustle. Sure you won't graduate until you are 25 but it's worth considering.
  • take a course in technical writing even if it's not required.
  • After your freshman year, see what courses employers are demanding. Your school's placement office will know. Take those courses. Check back every year to fine-tune your graduation plan.


If you are considering grad school, check with grad schools to see what they are looking for in undergrads. Same goes if you are looking for a particular employer or a particular type of job straight out of school.

One more thing that can help a career is the military. After you graduate, join as an officer in a technical career track. Serve your 8 years then go into the private sector. With your security clearance in hand, you'll have the inside track on defense work. Employers love to see someone with the self-discipline necessary to serve in the armed forces. Just be careful and don't get shot. Of course if we are still at war when your 8 years are up they might not let you out.

Books (1)

Rinisari (521266) | more than 7 years ago | (#18556331)

I'd say read, and read a lot. Read about some problems in computer science, read about the various sub-disciplines of computer science and consider attaching yourself to one or two (for instance, I prefer network programming to AI). Don't be afraid to ask your future profs what languages you're going to study during your college career, and then pick up a book or two on them. Barnes and Noble has an excellent series that gives a brief overview of various languages. It's the "In Easy Steps" series. Each book runs about $10, but it's less if you're a member of B&N's book club thingy. When I asked my prof what languages I'd be learning, he said Java, C, Scheme, and Smalltalk for sure. He said that the Java classes would be very introductory, as math majors are also required to take them. So, he suggested that I brush up on C before I took the class where we learned C (operating systems). I bought the "In Easy Steps" book (ISBN: 0760755043) and I'm fairly sure that the book helped give me a boosted understanding that helped me ace the class. Oh, and I'm of the ilk that believes that books are better than on-line tutorials, because you can get your attention completely away from the computer to read the book. The examples in the "In Easy Steps" C book are short enough that you can practically compile them in your head and know what's going on, provided you read the section.

Re:Books (1)

BASICman (799037) | more than 7 years ago | (#18556685)

In that case, I've got some book recommendations.

I always, always, always recommend "Practical C Programming" by Steve Oualline (O'Reilly, $34.95). In addition to being an awesome introduction to C, it has all sorts of goodness for practical code desin in the first few chapters. What do I mean by "practical"? Well, readable, reusable and well documented. After reading that, I applied it to all of my projects. Sometimes it got me extra credit; once it actually helped land me an internship.

Other books...

"Learning Python" by Mark Lutz & David Ascher (O'Reilly, $39.99); a very nice introduction to Python

"Harley Hahn's Student Guide to UNIX" (McGraw-Hill, $79.99); slightly dated (its from 1996), but he is quite funny and informative. This was my introduction to UNIX and the Linux shell. According to Amazon it's still in print and costs $79.99 new. I purchased my copy off of Half.com for substantially less (~$20)

Also, any book by Andrew Tannenbaum. These are straight-up textbooks, but are wonderfully easy to read and hold my ADD-strained interest. He has books out on Operating Systems, Networking, Computer Organization and Distributed Systems. If you're taking a class on one of these subjects and are really interested by it, I'd say to purchase Tannenbaum's book and use it in conjunction with your class textbook. Of special interest are "Modern Operating Systems, 2nd ed." and "Computer Networks, 3rd ed.", both of which I can vouch for. I had the latter as the text for my networking class and I used the former with my assigned OS textbook.

Break Stuff (0)

harryman100 (631145) | more than 7 years ago | (#18556441)

No, seriously - have a program somewhere on your computer, which finds a random system file and deletes it! Then try and find out what went missing, how to replace it, etc...

OK, maybe that's a little excessive, but learn to play with your computer, break it, fix it, install linux on it, install a different linux on it, download random shit from the internet and run it - work out what it does, how to use it, how it works. Compile stuff, add a feature to it, break it, write shell scripts that do stuff you don't actually need to do. Setup some server applications.

A few rules for a proper CS student's computer - NEVER store important stuff on it - if it's the sort of stuff that would cause a problem if it was deleted, backup, daily. NEVER let it stay constant

DO NOT spend your degree doing the sort of stuff that you will end up doing in a proper job. Spend your degree doing all the stuff you won't really be able to in the real world. If it's a good CS course, it will give you enough grounding to approach more or less any RW problem. There is an exception - make sure you do at least one groupwork project.

Take a wide range of courses. Believe me when I say, you're tastes will change, and you should make sure you don't cut off your options too soon.

Re:Break Stuff (1)

TerranFury (726743) | more than 7 years ago | (#18556675)

>OK, maybe that's a little excessive, but learn to play with your computer, break it, fix it, install linux on it, install a different linux on it, download random shit from the internet and run it - work out what it does, how to use it, how it works. Compile stuff, add a feature to it, break it, write shell scripts that do stuff you don't actually need to do. Setup some server applications.

That's a good skill to have, to be sure -- my experience tinkering with 'nix has been consistently useful to me, both as a student, and when working (sometimes seemingly-unrelated) jobs (like VLSI design) -- but I really wouldn't call it C.S.; it's more like what I'd call "I.T." It's like what "learning to weld" is to "mechanical engineering:" It's awesome to know, and immensely practical, but by itself it prepares you neither for academic work nor for a particularly impressive job in the corporate world.

So, he should take your advice, but not at the expense of his maths!

I study electrical engineering, and, though it's fun to play with op-amps, I know that that's not really the point. It's the math -- the systems identification, the signal processing, the control theory -- that really matter. If I want to, I can walk out of school, having learned this math, and get a lucrative job on Wall Street doing economic modeling (mind you, I think that'd be a tragedy when there are so many nobler pursuits, but it illustrates the flexibility I'm talking about). I can't do that if all I know is circuits.

Re:Break Stuff (1)

harryman100 (631145) | more than 7 years ago | (#18557285)

but I really wouldn't call it C.S.; it's more like what I'd call "I.T." It's like what "learning to weld" is to "mechanical engineering:" It's awesome to know, and immensely practical, but by itself it prepares you neither for academic work nor for a particularly impressive job in the corporate world.
I wasn't saying that's what he should STUDY, I'm saying that's what he should practice doing. I think you're welding example is quite apt here - if you're studying Mech Eng, you should probably know how to weld, how to put shit together. At the same time, if you're studying a CS degree - you should probably know how your computer is put together (and all the rest of the stuff I mentioned).

Interestingly enough, an arguement occasionally comes up where I go to uni, about whether CS is a Science or an Engineering subject. Currently the CS dept is part of the Engineering faculty, where I (and many others) believe it should be. Nevermind the name of the subject, CS (done properly) is far too practical to be classed as anything other than an Engineering subject (I have friends studying EE and their course is much more theoretical than ours).

There appear to be 3 types of CS course:
  - Theoretical Computer Science
  - Practical Computer Science
  - Programming

I've seen Computer Science courses which are nothing more than a 3 year Java course, you learn how to program, but not much about what goes on underneath. I've seen CS courses which are basically just Maths with a little bit of programming, you learn how the algorithms are working, exactly how each one works, proving that they do work, and you code a few. And I've seen CS courses (IMO the best ones) where you spend your time learning the theory, then learning the practical stuff, then learning how to make the theory work practically, how to make the theory fit into practical requirements. How things are implemented, why they are implemented that way, how the hardware works, how to interact with it, how to make things fast/small/efficient/accurate(enough)/maintainably /quickly. Unfortunately every university has a different approach, and they're all called "Computer Science".

What you need to do is work out which of these you want to do - and the work out where you can do it... (personally I'm a great fan of the practical computer science)

Re:Break Stuff (1)

SnappyTurtle (1080079) | more than 7 years ago | (#18561881)

I think you mean do all this on a >spare computer am I right? I don't know about you but I don't like having to spend a day re-installing OSs & tools that I need to complete a graded assignment for teh next day. HIs computer will be teh most important asset he will have to get him through his course of study- he does'nt need to go messing it up, especially not intentionally. You can pick up little cheap machines anywhere - I got 1 for a tenner at the skip.

Re:Break Stuff (1)

harryman100 (631145) | more than 7 years ago | (#18564561)

Yes, if you have more than one machine, then you just keep one "safe" the entire time. If you only have the one machine, then you should be a little more careful - or go and work in the labs.

There's nothing to prevent you, if you rely on the computer to hand in work, playing with your computer during holidays...

Learn C++ (1)

Fejimush (982116) | more than 7 years ago | (#18556555)

If you know C++ you can pretty much figure out any language that you might encounter. It's much easier to go from C++ to Java and etc. than it is to go the other way. The two most useful classes that I had were an operating systems course and algorithms. Good luck in your studies. Graham

Re:Learn C++ (0)

Anonymous Coward | more than 7 years ago | (#18561563)

My god, that's some absurd advice. Have you ever seen a C++ programmer looking at code written in Haskell or one of the Lisps?

The key to success (1)

john_is_war (310751) | more than 7 years ago | (#18556667)

There's not much you can typically do in the first 2 years, since those are mostly for fulling general requirements anyway. Just try to get all of them out of the way ASAP so you're last years can be spent not only on CS course requirements but also on you can load up on any CS electives that spike your interest, or are pre-reqs for CS courses that spike your interest. And like what some of the other posters said, a double major in math, or even just a minor will help because those courses will teach you analytical skills which will help you design more efficient algorithms for the programming world.

Know these... (0)

Anonymous Coward | more than 7 years ago | (#18558069)

Algorithms, data structures, concurrency, networking and assembly.

Notice I didn't mention any particular language. If you have the aforementioned skills and one language, you can pick up any other. If you're in a CS class that doesn't heavily involve at least one of these skills, drop the class and pick up something that does. Try and take at least one class in the EE program. I took digital design.

In my eight year career I have worked on an OS kernel's networking code and supercomputer control systems.
   

No point in CS these days (-1, Flamebait)

Anonymous Coward | more than 7 years ago | (#18558117)

Why bother with CS? After you get your degree you will be treated like a peon, given little if any respect for any accomplishments you do. Of course, your wages will be barely above minimum wage because even with the degree, you will be competing for your bread and butter against people in other countries who will be happy to work for pennies on the dollar.

Take some exam test preps, go take and score high on the LSAT, and get into law school. If you can do CS, you can pass the bar.

Now that you have a bar membership, unless you commit a felony, its impossible for you to be unemployed, as opposed to being in CS where your job can vanish in minutes should some offshoring company get a better deal with your boss.

Plus, its finances. A company would have to pay $35,000 on up yearly for a CS major. They can get the same amount of productivity and coding done by paying $5000 to an offshoring company and not have to worry about HR problems or disgruntled employees. On the other hand, a company cannot offshore legal issues, so the $100k a year that a basic law school grad earns fresh after passing the bar is a bargain for any company.

So, it boils down to two choices:

CS, where even after you graduate, you have to learn some language or other item completely different every 3-5 years, so you don't end up like a COBOL programmer. Even keeping up (and paying for the training), your job will always be in danger from I9 workers and people who can do a far cheaper and better job in other countries. In any case, count yourself lucky to be working 60-80 hours a week.

Law, where you do a quick search of a court case, write up some documents, and read over what the company you are working does for policies. You spent 2 hours in the morning looking at a couple sales documents, go for a three martini lunch, come back, look over and sign off on a security policy that the monkeys in IT will have to implement, then go home. Total real working hours a week -- 20-30. Because you have the "attorney at law" title, companies need you to protect them from major corporation crushing lawsuits, and all you really have to do on the job is review papers to make sure due diligence is done.

CS is a waste of time as a major. Any work you make on your own will end up getting sued away from you by random patent claims, and if you work for someone else, you will always have to be begging, sniveling, and sucking up so the boss can give you a pay cut rather than just boot you and pay Offshoring, Inc. 1/5 of what it costs for your salary to get the job done faster and with far fewer bugs.

I am probably a fairly typical newbie? (1)

oldCoder (172195) | more than 7 years ago | (#18559863)

Everybody is different. Some of us are really different. To generate useful advice we need to know more about your background, goals, talents, fears, and weaknesses. Tell us more about you. Otherwise everybody gets the same advice -- and you know that can't be right...

Ye Olde Coder

advice from 2nd year (1)

SnappyTurtle (1080079) | more than 7 years ago | (#18561513)

I'm a 2nd year undergraduate, also in CS. Its really important that you discipline yourself. Honestly, the amount of people I've seen dropping out because they did'nt understand this is frightening. Basically, what happens is you get a load of people who think they know computers coming into the degree and they take it easy. Before they know it theres 5-6 hefty assignments sitting on them + exams. You'll have a pretty easy life for teh first few monthes but trust me things can get hairy pretty quick. I had a higher diploma in computing and a few years experience behind me before embarking on teh Bsc - I thought i knew a bit about computers then but now I know different. My financee bearly remembers what I look like when I go downstairs & my idea of a break is spending an hour reading Slashdot ( sad i know). Seriously though, having good time management skills will see you through a lot. Its a great course and it'll get better in 2nd/3rd year...enjoy it :)

well (1)

dominious (1077089) | more than 7 years ago | (#18561927)

let the course lead you to your destiny. I started my course (now 3rd year undergrad) and my career goal was to be in IT security, but now I see more than that. I'm more interested in AI or Distributed Systems. You will have to make decisions during your course so just take the road and see where it takes you. If you really like what you are doing you will make the right choices.

I'm just about to graduate... (1)

anglozaxxon (824206) | more than 7 years ago | (#18562425)

Here's my suggestion, something I did: Co-op. Trust me. What else are you going to put on your resume? "I worked at The Gap and did a pile of unrelated schoolwork". Also, my school teaches pretty much everything with a Linux bias. You should try to learn the opposite of whatever the school teaches at your co-op job or on your free time. I never did this, but I have some friends that did, and I think I would recommend it: Google Summer of Code. Get some interest outside of CS that's useful to an employer. Very few companies do CS-only work, and it would be an asset if you knew something about what they did (engineering, chemistry). Try if you can to do a minor in this thing. Get involved with some level of student government; it looks great on a resume. Even computer science club is fine. Finally, friends are your friends. The more people you know, the more people that can help you if you get stuck on some assignment or exam.

Fundamentals (1, Insightful)

Anonymous Coward | more than 7 years ago | (#18563933)

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.
Load More Comments
Slashdot Login

Need an Account?

Forgot your password?

Submission Text Formatting Tips

We support a small subset of HTML, namely these tags:

  • b
  • i
  • p
  • br
  • a
  • ol
  • ul
  • li
  • dl
  • dt
  • dd
  • em
  • strong
  • tt
  • blockquote
  • div
  • quote
  • ecode

"ecode" can be used for code snippets, for example:

<ecode>    while(1) { do_something(); } </ecode>