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.
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 can fully understand that; you're just missing the point. You're not looking for hard answers in the humanities, while accepting the fact that there's worth in things other than hard answers.
History courses can do a lot to improve your ability to recognize patterns in past events or behavior. It also imparts a great deal of knowledge that requires intellectual growth and expansion.
Philosophy courses can help you argue a point better, because it's so easy for someone to question your assumptions since everything is so wishy-washy and up in the air and you can't really assume anything. It's really quite frustrating, I can understand how this field feels circuitous and useless.
Religious studies help you understand religious people a little better, and see some worth in some forms of religion. Most of all, it will hopefully help you understand your own life better. Most atheists seem to think religious people are categorically stupid, and while there are plenty of stupid religious people around, there are a good deal of pretty wise religious people.
Foreign language courses, coupled with some sort of interaction with natives, help you to see the world in other peoples' eyes in a much more direct way than monolingual study.
Also, all of these studies can be just plain fun, and tons more fascinating than a CS lecture about problems people have solved ages ago. Not everything has to be strictly utilitarian.
I can see how it's really hard to see how humanities advance anything, if you are so short-sighted that material and technological progress is the only measure of human worth. Sometimes it's important for people to be educated in the human condition, both for their worth and for others.
Philosophy courses can help you argue a point better- that is, the logic side of philosophy. And if your going to take a class like this, you might as well take a full blown logic class, which is in essence a math class.
Religious studies could help you understand religious people better. Psychology however, would be a far more direct way to understand religious people, as well as many other phenomenons of the human mind.
As for the courses being more fun than CS, I would certainly disagree. Of course, this is entirely subjective- and I can see why someone who disagrees with that would choose CS. I cannot however, understand why someone who finds CS boring would major in it.
I cannot however, understand why someone who finds CS boring would major in it.
Just pointing out that CS can get boring sometimes, too. There are plenty of fields and subjects in CS which just aren't going to be interesting to everyone majoring in it.
"In humanities, while the questions are interesting, they have no answers."
Certainly not true for all humanities, and only somewhat true for a few.
"Furthermore, the study of humanities does not advance, the fashions and trends simply change."
That's ridiculous, and more importantly, unsubstantiated.
"I have never been exposed to an idea in a humanities class that I could not have understood as a 15 year old."
It's unfortunate that you've never been taught a proper humanities class. Seems like you are letting poor teachers get in the way of valuable subjects.
"Studying CS requires constant intellectual growth and expansion as you enable your brain to understand more and more complex topics."
So do the humanities. Indeed, it appears that a lack of intellectual growth on your part is preventing you from gaining value out of the humanities. Just because it is a different type of growth than what is required for Computer Science doesn't mean it's not intellectual.
For reference, I'm a Computer Science major with an English minor.
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.
Learning assembly for some machine, and writing a non-trivial program, or writing a compiler (in any language) will get you this knowledge also. I've never learned C to any depth, although I've written some, and I've written device drivers and other kernel-level stuff (mostly various assemblers, years ago), as well as debugged other people's HLL code by looking at the emitted machine code.
I don't think it is necessary to know C to have an idea how an operating system works. C is just a programming language, it is not so special - it is just by accident that many OS are written in C. I am not even sure if the majority of desktop software is written in C anymore. And I indeed have no interest in understanding the "closed source" software on my desktop. Why should I, I can't change it anyway.
In any case it would be sufficient to learn C when the problem arises, but to say one should learn C no matter what seems wrong to me. I haven't used C since university days, and I don't think that makes me a worse programmer than people who know C.
Actually, I would say knowing LISP (or Scheme) would be much more useful for of becoming a good programmer than C. While I learned some Scheme at university, I only read SICP last year, and I feel that it opened my eyes to a lot of things.
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. =)
You can generally pick which gen ed class you want - it just needs to cover a certain topic ("Science with a Lab" for example). Which actually means anything from Physics or Chem to Astronomy or Intro to Computational Sciences.
Gen Ed doesn't mean there's one set class that people have to take. It's just a general area requirement that's needed.
Yes, I know. But I still cherish that I can do math and math only. (OK, we have to do something like a minor, but I chose math-heavy theoretical computer science to complement.)
I would hate to be stuck knowing/doing only one thing for the rest of my life. As much as i love computers and the internet and the like, I couldn't imagine not being able to pick up a notebook and write a short story or draw something. Not to be able to compose (or hell, even just identify and listen to) good music, discussing politics in depth with lots of details with people and so on.
Not being able to do anything but math/code? That honestly sounds horrible to me.
You are mixing being forced to do something with doing something.
I do a lot of stuff just for fun with other people or without at our own tempo (usually faster). Occasionally I also visit lectures in philosophy. And they would not teach you unicycling, juggling, and walking on a slack rope anyway.
(And it's not math/code in university for me, it's math and math only that I have to do to get my degree.)
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."
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.