

Advice to Incoming Freshmen in Computer Science - brooksbp
http://csel.cs.colorado.edu/~brooksbp/fresh-advice.html

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

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

~~~
jjs
> _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.

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

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

------
nihilocrat
Okay, I'm officially annoyed.

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

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

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

~~~
nihilocrat
_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.

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

------
bitdiddle
correction: Knuth did not make the comment about "premature optimization", I
believe Hoare did.

------
Tichy
"Actually, it's pretty tough to rationalize why someone should learn C."

Maybe because most people really shouldn't bother to learn it???

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

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

------
asciilifeform
I can do better:

"Don't."

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

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

------
brooksbp
feedback?

~~~
jmtame
I think you need to tell every single CS/ECE student at my school this (you
can see which school I'm from on my profile).

Loved it.

~~~
brooksbp
Profile doesn't show what school you're from...

~~~
jmtame
Woops. It's Illinois.edu

