Four things I really wish I had learned in school, but did not because it was not on the curriculum and I did not hit it in the course of my projects
1) Source control
2) A web framework. Any one would have done, just to have some experience with MVC before I was 25 would have been really nice.
3) SQL
4) We actually studied project management, and even had a semester with an actual project doing it, but my present self wishes my past self had done it more. (Exposure to a non-waterfall methodology would have been a bonus.)
If these aren't in your curriculum, get exposure by yourselves. Your future self will thank you for it.
(P.S. You'll learn a lot of things over the next four years which you'll never use again. Pay attention in Data Structures, Discrete Math, and absolutely any time you hear the word "caching". Operating systems, compiler design, hardware design for non-hardware developers, and whatnot are more like brain candy for engineers.)
Edited to add:
Things I most benefited from my university education.
1) My ArtSci degree. It involves a human language (Japanese). I highly recommend picking up one of these for every engineer. It will make you think better (really), it will make you code better (I have been in charge of internationalization on every job I have ever had, starting with internships, because I "get" it), and it cannot possibly hurt your employment prospects.
2) AI class. Less because I learned AI, more because it introduced me to scripting languages (awk in my case), which are just indispensable.
3) Java. Hey, if you go to a Java school, you might as well graduate being pretty good in it.
4) I paid attention every time I heard the word "caching". And yay though I walk through the valley of the shadow of traffic spikes, I shall fear no performance degradation, for caching is at my side.
I take issue with the advice that you shouldnt study OS, compiler design, hardware design etc. If you take that out, you will never be one of the guys who did stuff like design the GFS, GWT, AWS and so on. You might become a good user of them but if you have any interest whatsoever in one day building cool infrastructure and solving really hard problems (as opposed to building throwing sheep apps), you may do very well studying these courses.
Which problems you will ultimately solve as an engineer you cannot know. Better to have a knowledge of at least 3-4 tools. What you may think of "web development" may really turn out to be a compiler problem.
Also see one of Steveys rants where he advocates learning compilers .. I dont necessarily agree with all his points but its still pretty decent.
edit : Also its much easier to learn RoR or Django whatever on your own than in the univ. Its non-trivial though not impossible to learn compilers on your own.
Whaa? Compilers was the single best CS course I ever took. It was the superset of everything else: to write a compiler, you need to know data structures, machine architecture, discrete math, etc.
It was also the only class where we wrote a really serious program. Every other class had some toy-seeming final project, but here we wrote a complete compiler, from scratch. (Final day: they give you some source code, you compile it with your compiler, link it with some native libs, and run it.)
You mention source control. Good luck writing a compiler without that! Writing a compiler forces you to learn all the glue pieces they don't explicitly teach.
I learned more taking compilers than the whole other 3.5 years of CS classes I took. It was by far the most fun/hard/useful college class I took. Amazingly, it was optional. So if I had one piece of advice for CS freshmen, it would be: take the compilers course!
The only problem with including (2) and (3) into an undergraduate CS curriculum is that you inevitably have to push other subject matter out in order to make room for those guys. If you teach them explicitly, that is. Besides, those subjects are more within the domain of software engineering, which certainly merits distinction from CS, a point this article does well in alluding to.
I'd much prefer that additional programming paradigms were taught to undergrads; something different than the vanilla procedural/OO duo that is the unfortunate captor of so many a CS department. I'd argue that parallelism and functional programming are topics far more vital to an aspiring computer scientist than things like web frameworks and SQL.
To add to the shopping list, I think a nice proofs class would be worthwhile for CS undergrads. I also think a yearly seminar, project class would be helpful; a class where students can actually MAKE something of their own design.
> I'd argue that parallelism and functional programming are topics far more vital to an aspiring computer scientist than things like web frameworks and SQL.
Hell, they're even important for the aspiring web developer: being intimately aware of the flow of state will make any centralized, stateful bottlenecks in your application painfully obvious.
SQL is not procedural/OO and IMO is a great introduction into the functional model. I think replacing most 200 level data structures courses with a detailed understanding of SQL would be far more useful and a great foundation for understanding the point of data structures. EX: Indexes and Explain are a great example of cost benefit analysis that has little to do with procedural coding.
1) Source control
2) A web framework. Any one would have done, just to have some experience with MVC before I was 25 would have been really nice.
3) SQL
4) We actually studied project management, and even had a semester with an actual project doing it, but my present self wishes my past self had done it more. (Exposure to a non-waterfall methodology would have been a bonus.)
If these aren't in your curriculum, get exposure by yourselves. Your future self will thank you for it.
(P.S. You'll learn a lot of things over the next four years which you'll never use again. Pay attention in Data Structures, Discrete Math, and absolutely any time you hear the word "caching". Operating systems, compiler design, hardware design for non-hardware developers, and whatnot are more like brain candy for engineers.)
Edited to add:
Things I most benefited from my university education.
1) My ArtSci degree. It involves a human language (Japanese). I highly recommend picking up one of these for every engineer. It will make you think better (really), it will make you code better (I have been in charge of internationalization on every job I have ever had, starting with internships, because I "get" it), and it cannot possibly hurt your employment prospects.
2) AI class. Less because I learned AI, more because it introduced me to scripting languages (awk in my case), which are just indispensable.
3) Java. Hey, if you go to a Java school, you might as well graduate being pretty good in it.
4) I paid attention every time I heard the word "caching". And yay though I walk through the valley of the shadow of traffic spikes, I shall fear no performance degradation, for caching is at my side.