Advice to Incoming Freshmen in Computer Science
csel.cs.colorado.edu
csel.cs.colorado.edu
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'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.
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.
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.
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!
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.
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.
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.
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.
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.
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.
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.
Maybe because most people really shouldn't bother to learn it???
So if none of these things matter to you, then yes, it's very easy to rationalize not learning C.
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.
"Don't."
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.
Loved it.
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. 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. =)
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.
Not being able to do anything but math/code? That honestly sounds horrible to me.
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.)
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!.
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 ...:)