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 like the humble part., surprisingly the best coders I have met are very humble. You should also mention to contribute to open source projects when they have some free time and to learn from their coding mistakes. Emphasize more the "Don't blow off your non-CS/ECE/EE classes!", this is an important point, not only because it can lower your grade, but I believe, because it makes a well rounded person. If you are well rounded, you will learn why it's not so good to be hacking away in front of a monitor for 30 hours straight (even though it's fun), and that your health, above all, is the most important thing. Also building up mental discipline is key, every project has some fun things and boring things; discipline will help them to get through the boring things so they can enjoy doing the fun things later on and finish the project, there is no point in starting something if you are not going to finish it. Just my 2 cents.
I can't agree with you more regarding self-discipline. My senior year in high school was the biggest joke: no one had to attend class, complete work, follow school rules, etc... but everyone got at least a C because teachers who cared about their students got their feelings twisted and wanted to make sure everyone graduated and the administration wanted more funding for higher graduation rates. Result: I completely slacked off and drank with my friends too much and lost all self discipline for my first year in college. I took all random classes, not even working to tick off GURs, and now I have to pick up my own pieces now that I have pulled my head together and figured out what I actually want to do with my life.
Joe Spolsky made a blog post similar to this and also stated "Don't blow off your non-CS classes". He, and to a lesser extent this article, basically summed it up as "it will help you learn to do boring stuff well".
Are we CS majors really such mindless brutes that topics such as history, philosophy, religion, literature, etc., are automatically snore-fests that we complete just to make good grades? I'm just really confused how these people can have a seemingly complete lack of interest in the humanities.
As someone who is utterly convinced of the worthlessness of religious studies, literature studies, philosophy, ect, let me attempt to answer your question.
CS is a topic where every question has an answer. We may not know it, but it either exists or is provably non existent. Furthermore, CS is a field which advances- and when CS advances, life often improves for millions of people. Lastly, taking CS and math classes means learning new things. I know things I did not know at the beginning of the semester about the nature of information.
In humanities, while the questions are interesting, they have no answers. Furthermore, the study of humanities does not advance, the fashions and trends simply change. It is also entirely possible to go to a humanities lecture and learn absolutely nothing new.
It is not the CS majors who are brutes. We are the scholars, the ones responsible for advancing human civilization. Studying CS requires constant intellectual growth and expansion as you enable your brain to understand more and more complex topics.
Taking humanities courses is a major distraction from this pursuit. I have never been exposed to an idea in a humanities class that I could not have understood as a 15 year old. I have never seen irrefutable proof of something I was previously convinced was false in a humanities class.
This is why I have a complete lack of interest in humanities.
I agree with #3 the most: know the difference betweeen CS and software engineering.
Specifically, if you want to do Software Engineering, be prepared to spend a lot of time learning it yourself. CS teaches you the fundamentals of programming, but applying these fundamentals is almost a completely different field.
CS to software engineering is like Materials Science to Architecture - sure you'll know what the molecular structure of wood is and maybe even the exact tensile strength of a 2by4, but you won't know even the first step to designing and constructing a house.
You can safely skip learning C if you don't want to know how an operating system works or what a device driver does. Also no C is needed if you just don't care about the internals of the runtime of your favorite programming language (and probably the compiler too). Also you can omit C if you're never going to have any interest at all in 90% of the software you use on your desktop and the servers you communicate with across the internet. Embedded devices are almost exclusively programmed in C, but again, not everybody cares.
So if none of these things matter to you, then yes, it's very easy to rationalize not learning C.
Switch to business major! The idiots that will be signing your paychecks? Guess what they majored in. That's right, and they were drunk most of time too.
Only most good programmers know that they're never going to be paid what they're worth while working for a business major (or any non-programmer). And more and more of them are starting their own businesses and doing coding for themselves.
In fact, many non-programmers realize that they would rather have someone who does the same thing they do, be their boss. Hey, want to have a job that's quickly becoming obsolete? Switch to business major! Then you can get drunk most of the time too.
1. Contribute to an open source project. It gives you a great experience in real-world coding, as opposed to the seemingly-meaningless assignments one often gets in a class. Plus, it's great to put on your resume and in some cases can serve as a way to get connected to potential future jobs.
2. Get a summer internship where you actually do coding. It should pay half-decently and is useful for many of the same reasons as 1).
This depends... I would not skip a Gen-Ed class if:
- My grades depended (directly or indirectly) on my attendance. Surprisingly this wasn't too often, most profs had all notes posted via CMS. Usually I'd attend 100% up until the results of the first exam.
- The professor was highly distinguished in his field
- I determined that I learned more by activity/doing/hearing in the class than simply reading up on the subject (often strongly linked to the item above)
There's no point in wasting your time with a class that you can skip and discover the subject matter on your own later (which is much more fulfilling). I usually caught up on sleep or worked on my own projects. =)
Implying that people who gross $20K with their iPhone application are probably not happy sounds quite bitter. You could give it a more positive spin by changing the 'probably's to 'if's or 'might's.
hey brian this is erik... I went to LHS we used to play tennis and stuff. anyway yeah I'm in cs at cu now also and I definitely agree with everything you're saying!
I like it because I actually read it, unlike the LONG "How to be a programmer". You need to change you're to your in #5.
The reason to do well in non-CS classes is that when you start letting yourself slide in one area it's quite easy to keep doing so. It's simpler to just say "I always do well in classes."
[+] [-] patio11|17 years ago|reply
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.
[+] [-] vizard|17 years ago|reply
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.
[+] [-] ken|17 years ago|reply
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!
[+] [-] jobeirne|17 years ago|reply
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.
[+] [-] Dilpil|17 years ago|reply
[+] [-] grosales|17 years ago|reply
[+] [-] mnemonik|17 years ago|reply
[+] [-] nihilocrat|17 years ago|reply
Joe Spolsky made a blog post similar to this and also stated "Don't blow off your non-CS classes". He, and to a lesser extent this article, basically summed it up as "it will help you learn to do boring stuff well".
Are we CS majors really such mindless brutes that topics such as history, philosophy, religion, literature, etc., are automatically snore-fests that we complete just to make good grades? I'm just really confused how these people can have a seemingly complete lack of interest in the humanities.
[+] [-] Dilpil|17 years ago|reply
CS is a topic where every question has an answer. We may not know it, but it either exists or is provably non existent. Furthermore, CS is a field which advances- and when CS advances, life often improves for millions of people. Lastly, taking CS and math classes means learning new things. I know things I did not know at the beginning of the semester about the nature of information.
In humanities, while the questions are interesting, they have no answers. Furthermore, the study of humanities does not advance, the fashions and trends simply change. It is also entirely possible to go to a humanities lecture and learn absolutely nothing new.
It is not the CS majors who are brutes. We are the scholars, the ones responsible for advancing human civilization. Studying CS requires constant intellectual growth and expansion as you enable your brain to understand more and more complex topics.
Taking humanities courses is a major distraction from this pursuit. I have never been exposed to an idea in a humanities class that I could not have understood as a 15 year old. I have never seen irrefutable proof of something I was previously convinced was false in a humanities class.
This is why I have a complete lack of interest in humanities.
[+] [-] Spyckie|17 years ago|reply
Specifically, if you want to do Software Engineering, be prepared to spend a lot of time learning it yourself. CS teaches you the fundamentals of programming, but applying these fundamentals is almost a completely different field.
CS to software engineering is like Materials Science to Architecture - sure you'll know what the molecular structure of wood is and maybe even the exact tensile strength of a 2by4, but you won't know even the first step to designing and constructing a house.
[+] [-] bitdiddle|17 years ago|reply
[+] [-] Tichy|17 years ago|reply
Maybe because most people really shouldn't bother to learn it???
[+] [-] brl|17 years ago|reply
So if none of these things matter to you, then yes, it's very easy to rationalize not learning C.
[+] [-] unknown|17 years ago|reply
[deleted]
[+] [-] asciilifeform|17 years ago|reply
"Don't."
[+] [-] snorkel|17 years ago|reply
[+] [-] creativeembassy|17 years ago|reply
In fact, many non-programmers realize that they would rather have someone who does the same thing they do, be their boss. Hey, want to have a job that's quickly becoming obsolete? Switch to business major! Then you can get drunk most of the time too.
[+] [-] brooksbp|17 years ago|reply
[+] [-] DarkShikari|17 years ago|reply
1. Contribute to an open source project. It gives you a great experience in real-world coding, as opposed to the seemingly-meaningless assignments one often gets in a class. Plus, it's great to put on your resume and in some cases can serve as a way to get connected to potential future jobs.
2. Get a summer internship where you actually do coding. It should pay half-decently and is useful for many of the same reasons as 1).
[+] [-] jobeirne|17 years ago|reply
Also, I think encouraging blooming coders to just go out and hack something up is worth pushing.
edit: also, hate to be "this guy", but there's a grammatical error here: 5. Don't blow off you're non-CS/ECE/EE classes!.
[+] [-] kirse|17 years ago|reply
This depends... I would not skip a Gen-Ed class if:
- My grades depended (directly or indirectly) on my attendance. Surprisingly this wasn't too often, most profs had all notes posted via CMS. Usually I'd attend 100% up until the results of the first exam.
- The professor was highly distinguished in his field
- I determined that I learned more by activity/doing/hearing in the class than simply reading up on the subject (often strongly linked to the item above)
There's no point in wasting your time with a class that you can skip and discover the subject matter on your own later (which is much more fulfilling). I usually caught up on sleep or worked on my own projects. =)
[+] [-] sundeep|17 years ago|reply
I was bred ,born and raised in India .. and received a pretty well rounded education.I like to think we can do a little more than write code ...:)
[+] [-] eelco|17 years ago|reply
[+] [-] Donald|17 years ago|reply
[+] [-] jmtame|17 years ago|reply
Loved it.
[+] [-] dill_day|17 years ago|reply
[+] [-] dmm|17 years ago|reply
[+] [-] jrp|17 years ago|reply
The reason to do well in non-CS classes is that when you start letting yourself slide in one area it's quite easy to keep doing so. It's simpler to just say "I always do well in classes."
[+] [-] davidw|17 years ago|reply
[+] [-] hualibaobao|17 years ago|reply
[deleted]