

I’m graduating with a CS degree but I don’t feel like I know how to program. - SandB0x
http://stackoverflow.com/questions/2823571/im-graduating-with-a-computer-science-degree-but-i-dont-feel-like-i-know-how-to

======
abeppu
No one's brought up _special sauce_. The trick to getting hired to do
interesting software engineering work when you're not a brilliant programmer
is to bring more than just programming skills to the table. I didn't start
programming seriously until I was in college (TI-89s, LOGO and ActionScript
don't really count). And I didn't even major in CS. But I took CS classes, and
I learned some Bayesian statistics and some natural language processing and a
little machine learning stuff, and I got hired right out of school as a
software engineer doing analytics for a company with an information retrieval
focus. And I realized that for most of the really interesting problems, just
being a good programmer isn't enough. I have coworkers who are more talented
programmers than I am. Some of them can code faster, or with fewer bugs or
less thought. And I'm grateful to learn from them, and to become a better
programmer fostered by an environment with some really good programmers. But
the very best projects and problems need some additional creative spark, or
mathy trick, or UI magic, or _something_ beyond just the code itself, and
sometimes, I get to contribute that something.

So if I was in the OP's shoes (and I almost was, although I wasn't a bad
programmer when I left school, just green), yes, learn to program and work on
projects on your own. But also learn some stuff that your coworkers aren't
likely to know. For me, it was just enough Bayesian stats and applications
thereof to have insights that others wouldn't. For someone else, it might be
distributed systems, or computer vision, or physical simulations, or
information design, or algorithmic game theory, or fancy math, or any corner
of the CS or math or statistics literature that has a pratical application but
which most programmers don't know. I found that even good programmers won't
generally know how to take the KL divergence between two distributions, or
write the EM algorithm or put take the MAP estimate of a binomial rate
parameter given a beta prior, but there are a lot of software applications for
that kind of knowledge. And the world is _full_ of cool problems waiting to be
solved by someone who knows how to program, but also knows something else.

------
jat850
(To the author) You probably don't, and that's okay. The most valuable things
I took away from my education experiences:

1) You've learned (or should have learned) how to learn new things. Don't stop
once the dean hands you your degree.

2) There are probably a lot of people out there who are a lot smarter than
you, and that's also okay. Use that knowledge to grow from your working
relationships with others and learn more from them too.

Focus less on the individual technologies and more on the other skills learned
via extended education.

Caveat: Lots of people don't need to pursue higher education to learn these
things, it was just a necessary personal experience for me.

(edit) There's a post on SO by user RussellDias which puts this far more
eloquently and fully than I could have.

~~~
Ixiaus
Good comment here.

I came from the opposite end of the spectrum: started building "websites" with
PHP and have grown to be a full fledged programmer in PHP, Python, Erlang,
Scheme, and Objective-C. I quickly learned that my creations were sub-par and
poorly engineered because of gaps in my knowledge of abstract concepts.

Learning about the Theory of Computation sky rocketed my skills, shoring up my
mathematics education has also greatly augmented my understanding of _why_
certain things work and why certain things are a bad idea to do (even though
you have the rope to do it!).

Knowledge truly is power, the rest of it you will gain through experience. The
OP will quickly learn that he will be above those that did not get through a
CS degree because he _does_ understand the minutia of the system and he will
be able to understand the _engineering process_ with precision. Rather than
"stabbing in the dark" as I see a lot of my peers doing - who did not even
bother to at least _teach_ themselves the basics of computational theory,
mathematics, &c...

You're on the right track my friend, as many have already said - just start
getting some experience. The best route there, IMHO, is by contributing to
Open Source Software; nothing taught me more about software engineering than
slowly becoming a core developer for an OSS project!

~~~
tsoporan
I'm in a similar situation as when you started. I'm coming from a background
in web programming and have been wanting to extend my understanding of
computers in general and broaden my programming skill-set.

Are there any resources you can recommend in terms of "Theory of Computation"?

Greatly appreciated.

------
evo_9
It seems to me that people that really are meant to be programmers already
started before college. At least that's been the case with guys I've worked
with that actually knew what the hell they were doing.

No offense to this guy but the reality is, if you are not into this stuff
before you started college (aka writing your own programs because a) it's
cool, and b) you got tired of not having a program that did what you need,
etc), then it's a pretty brutal career path.

Think about it this way, most good/great programmers are just coders because
it's how they've always been. If you are just getting into this industry
because it's a good career path then you have to realize you are going against
guys like me who started programming the Atari 800 when I was a kid because,
well it was fun and just seemed right.

I wish him luck, but this isn't 1998 any more and companies aren't going to
just hire you off the street just because you have a CS degree. The
competition level for jobs right now is higher than it's been for a long time.
With that said, he can certainly make this work, he just needs to start coding
on his own to learn and grow.

~~~
starkfist
Some of the best programmers i've worked with were weird dudes who learned how
to program in college.

Starting early doesn't mean you're any good. 4 years of a serious, programming
intensive CS degree is better training than 20 years of farting around with
PHP.

We don't apply this criteria to other endeavors. I've been playing piano since
I was 5 and I'm still not good at it. You're either good or your're not.
Sometimes experience helps, sometimes it is a hindrance. Bad habits form
early, too.

It's also curious that programmers claim that programming since they were a
kid makes them a better programmer, but they also complain whenever a job
advertisement requires years of experience.

~~~
evo_9
"4 years of a serious, programming intensive CS degree is better training than
20 years of farting around with PHP."

That's really funny and true.

Yeah, agreed, I know plenty of CS degree holders that are top notch coders as
well. But I have to say, I don't think a single one of them hadn't learned a
language or two prior to college and I doubt they ever thought for a second
'I'm not sure how to program'.

~~~
frisco
I thought C was totally terrifying and confusing for the longest time. I
started in Visual Basic because it had WSYWIG forms, and I just couldn't
imagine how someone would programmatically construct an interface. Feeling
like you have no idea where to start is completely legitimate. I eventually
faced it, though, and got through it. Of course, I was 11 or 12 at the time,
but still.

~~~
megablast
You were unlucky, I went the other way. I did start on basic on my Z80
machine, but since you could only really write adventure games with basic, I
moved onto Z80 assembly language. Then, I moved onto x86 assembly language.

Every from that point has been easier, in most ways.

I was lucky, everyone of my friends had a C64, and they were swapping games.
We couldn't afford a C64 at AU$399 at the time, so they got me the VZ300 for
$99. I had to write my own games. This is how I got into development.

I was one of the few that could program, before I went to Uni. It was around
the time that CS was becoming very popular, but hadn't start to differentiate
between different sorts of IT, so they offered everything. The classes I found
best were hardware, OS, and the half year class were we had to write the same
program in 4 different languages.

~~~
demallien
Hah, that makes two of us! Except iI didn't have the luxury of a Z80, I
started on an 8080 that didn't even run CP/M... Ahhh the Compulcolor II, what
a fine machine you were. At least you made me learn how a computer works.

I still remember how good it felt when my brother started loading up the games
that I wrote rather than the few 'commercial' games that we had for the
system.

PS: VZ300??? I thought I knew _everything_ about the Australian 8-bit computer
scene, but I managed to miss that one.

~~~
megablast
The VZ300 was made by Dick Smith, a successor to the VZ200. It had a huge
hacker user community, their were program listings and hardware mods in APC
magazine. After the VZ line, Dick smith bought out there CAT computer line,
which were much more powerful, and more expensive.

Great little machine for $100. Funny thing, the VZ200 had a chiklet keyboard,
which are becomming popular again. One of the big selling points of the VZ300
was that it had a proper keyboard.

[http://www.old-computers.com/museum/computer.asp?st=1&c=...](http://www.old-
computers.com/museum/computer.asp?st=1&c=980)

To do Assembly language programming I had to get the 16KB upgrade kit, which
was this huge piece of hardware that stuck in the back.

------
elbenshira
Well, what did you except out of a CS (== computer _science_ ) degree?

If you want to be a great software developer, then you should (1) major in CS
and (2) learn how to program. These are usually two separate but mutually
beneficial things.

~~~
jgg
It's funny, because the situation we're in right now (at least in the US) does
neither really well.

On the one hand, hardcore theoretical courses at the average CS school don't
exist as weed-out at all. If you're lucky, you've got a good faculty member
teaching a compilers or operating systems course that'll make it challenging,
but only sometimes. Teaching things like Haskell, The Lambda Calculus, Prolog,
Complexity Theory and C are "impractical" for someone doing a CS degree,
because, you know, everyone uses "OO" (whatever that means) nowadays so that's
the theory we should teach. Plus, if we teach a hard course about the theory
of computation, lots of kids will flunk, and we can't have that, now can we?

On the other hand, any attempt to make the curriculum practical (since most
schools border on vocational training anyway) is met with the response of
"Well, a CS degree shouldn't prepare you to be an industry programmer!"

So really, most universities are left in a luke-warm middle-ground, where
theory is being neglected but no one is willing to be the administrator who
"flips the switch" and turns CS students into non-stop code monkeys.

Really, grounding yourself in a lot of CS theory, while occasionally forcing
yourself to break out and hack up a project, is probably the best route to
becoming a well-rounded programmer. Whether most people are capable of
realizing how bad current CS education is and doing so, however, is another
matter.

~~~
Locke1689
_On the one hand, hardcore theoretical courses at the average CS school don't
exist as weed-out at all. If you're lucky, you've got a good faculty member
teaching a compilers or operating systems course that'll make it challenging,
but only sometimes. Teaching things like Haskell, The Lambda Calculus, Prolog,
Complexity Theory and C are "impractical" for someone doing a CS degree,
because, you know, everyone uses "OO" (whatever that means) nowadays so that's
the theory we should teach. Plus, if we teach a hard course about the theory
of computation, lots of kids will flunk, and we can't have that, now can we?_

Agreed for most schools but I will say that there are good schools that still
teach at that level. The Intro to Programming Languages class at Northwestern
has you implement an interpreter for a variety of different languages,
including a variant of Scheme called Typed PLAI. Haskell was used as an
example sometimes and we implemented a number of similar features (basic type
checking, currying, etc.). I know that the operating system and compilers
courses here are very difficult and have heard similar things about the
corresponding classes at CMU.

~~~
ecuzzillo
Agree. I'm about to graduate from CMU, and their OS class was an _extremely_
rewarding experience. I've heard similar things about their compilers class.

The required intro classes are also pretty rigorous, although I didn't take
them personally. I'd bet that any CMU CS (note that engineering is a very
separate program at CMU) grad would at least somewhat know how to program, and
will have programmed in assembly and ML, along with the usual Java and C.
Obviously you have to check whether they got C's in the big rigorous classes
or not, but it's basically a good bar. It would be impossible to graduate and
then fail FizzBuzz, for example, which to my understanding is not true of most
CS programs.

The one main complaint I had with it was that the required freshman theory
course (251), which is supposed to be this great legendary weed-out thing, was
just a hodgepodge of badly specified discrete math, and still is, to my
knowledge. It was hard, but in my opinion not in a good way. Maybe it works as
a weed-out but not as an educational tool. The later required algorithms
course, 451, was much better.

------
charlesju
Here is a major trick to life that most engineers don't realize.

MOST college degrees are essentially useless. There are hundreds of jobs out
there that don't require programming or a specific college degree. There is no
reason to let your degree pigeon-hole you into a career path.

If you're asking for my advice, I honestly don't feel like you're going to cut
it as a programmer. Sorry kid. A true hacker is going to run circles around
you and you'll most likely not be able to compete if you aren't competitive
after college.

With that being said, LIFE IS NOT OVER. Find a job that you like. Most people
respect those that are able to complete a computer science degree and will
hire you into a huge array of jobs (financial analysts, consulting, i-banking,
technical sales, etc.)

------
acid_bath
CS isn't a degree that teaches you how to program. For me it was much more
like a discrete mathematics degree. I learned probably hundreds of algorithms
(compression, cryptography, 3D rendering, AI), how to analyze and create new
algorithms, but not how to program (except in the typical CS101 courses).

It was always assumed that any student could learn the language of their
choice from an off-the-shelf book. I myself knew about half a dozen languages
and mastered a couple before I graduated, but that was all extra-curricular
work. In many ways I'd probably be a better developer if I obtained a Software
Engineering degree instead, but CS gave me the foundation to tackle the
interesting computational problems.

The professors knew they would be much more valuable explaining how RSA worked
than how to debug a syntax error or learn the language of the month.

~~~
amichail
Programming requires a lot more than learning the syntax and semantics of a
programming language.

Most CS profs don't teach programming because they don't have anything
interesting to say and would rather teach something else. They are not
programmers.

~~~
Locke1689
_Most CS profs don't teach programming because they don't have anything
interesting to say and would rather teach something else. They are not
programmers._

I feel this is slightly hyperbolic. CS often isn't a productless field, even
in academia. While many fields in CS can get away with simply publishing
algorithms and other codeless papers there are many subsections where
implementation is a vital part of the project. For example, the Xen project
was originally an open source academic project.

I think the biggest problem in academia is the tight schedule. Unfortunately,
many of the problems you encounter in industry take too long to be properly
implemented in the structure of a semester course. For example, long-term
maintenance and technical documentation are at the core of any significant
software project but by the time most of that stuff would come up the semester
is already over.

------
edw519
The first step in becoming an excellent programmer is realizing that you
aren't one already.

Your question shows that you're probably one step ahead of your classmates.

You will always be learning and always be working hard (hopefully). It doesn't
really get that much easier, but it does become a lot more fun and rewarding.

You'll be fine. Thanks for the post.

~~~
Tamerlin
That's excellent advice.

Being weak in algorithms means that the author wouldn't be able to get in the
door at amazon (which loves its juniors), but IMO that's a good thing, because
I'd never want to work with someone who learned how to develop "production"
software at amazon. (It was some of the worst code I'd ever seen -- and I went
to amazon after over six years of government contractor work.)

~~~
madmanslitany
I'm sure I can one up you with the kind of code that goes into a trading
system.

I think production code in any realtime environment, whether it be at Amazon
or a trading desk at a bank, tends to converge towards crap just because of
the time pressure on the developers.

~~~
Tamerlin
You're probably right. So far in my experience, that's pretty prevalent -- and
the industry really does go out of its way to reward failure by rewarding
heroics.

I read a bank security audit report once... it made me very concerned about
banking in general. It was astonishing how many glaring security blunders
these banks were making -- and this was pervasive, neither isolated nor
limited to small banks...

------
locopati
You don't. No worries there, you're just starting. Find something that
inspires you and write code around that (do it in your favorite language or
use it as an excuse to learn a language). Do a small project, do many small
projects, do projects with friends. Read code - grok some of those libraries
you're gluing together. Read about coding (O'Reilly's 'Beautiful...' series is
great). If you enjoy programming, it'll come together. Keep the beginners'
mind forever.

~~~
snikolov
I think getting your hands dirty with _something you are interested in_ is the
key here. Too many classes in "software engineering" deal with contrived
examples built around concepts you are "supposed to be learning." More
freeform projects allow you to become invested in what you are doing and
accelerate your learning.

------
motters
That's the difference between education and training. Computer science is
supposed to teach you the science of computing - it's not supposed to be a
training course teaching you job skills. Once you graduate that's only the
beginning, not the end, of learning about programming languages.

------
gte910h
Honestly, it seems the dude could figure out how to write 75% of a hacker news
type site. Honestly I'd say the markup and scaling aren't really needed for
basic anything. He might not understand cookies, etc, yet, but still he'd get
most of it out there.

------
chriseppstein
Just about everything I've learned since graduating college is summed up in
this web page (which I did not write -- but found recently). Enjoy!

<http://samizdat.mines.edu/howto/HowToBeAProgrammer.html>

~~~
daten
I also like this page for evaluating where you might stack up against other
candidates.

[http://www.indiangeek.net/wp-
content/uploads/Programmer%20co...](http://www.indiangeek.net/wp-
content/uploads/Programmer%20competency%20matrix.htm)

~~~
meric
I rated myself "2" on each category on average... Will I be able to find a
job?

------
freshfey
I do have a problem which goes into this direction. Although I can code some
simple programs, I have no clue how and where to start something bigger, like
a social media platform. I don't know what part would be backend and frontend
and where I should start first.

~~~
oct
This is a good description of my position as well. Unfortunately it seems like
this is something that does not get taught at schools much, and I will admit
to having been trying to learn everything from school when I should be doing
more independent work. Does anyone know any useful resources on how to proceed
from this point? Or does it require just working on a larger-scale project and
figuring things out along the way?

~~~
meric
To understand it all.. Just try starting a project yourself, and learn to
google. :) Start with something simple like writing a blog where people can
log in and post comments.

------
mogston
You need to get your hands _dirty_ asap. Start with something small and grow
big as fast as you can.

------
hackermom
You have no idea how common the reality of CS graduates who just don't know
how to program is...

~~~
noarchy
I see people coming in with 2 year degrees from community colleges, who can
outgun 4-year CS graduates. The ones who can pull this off tend to be genuine
hackers, who have a passion for what they are doing.

~~~
snikolov
A little perspective from a junior in EECS at MIT who is also concerned about
leaving college as a competent software engineer.

In most software jobs, practical experience outweighs theoretical knowledge. I
would guess that the people from 2 year degrees spend a lot of their time
actually programming, whereas those with the 4 year CS spend a lot of their
time learning about computer science.

At MIT and there is really only one software design class you need to take for
a CS degree. It is expected that to learn to program you need to do it by
hacking around on your own or working at software companies during the summer.

I've found that there is a significant group of CS majors at MIT (myself
included) that are more interested in the cool things that can come out of
theory (and eventually programming those things) than in programming itself.

I would be bored out of my mind gluing libraries together to write a chat
program, for example. While I find the process of designing/building/tinkering
with _anything_ exciting and fun, I am simply not that interested in chat
programs. I'm not even that interested in computers! To me, the freedom to
explore my interests related to computing and computer science, without being
pigeonholed into a "standard" computer science curriculum is fantastic.

Hence, I've spent more of my time learning about interesting topics in
computer science and math than I've actually spent coding. And I've spent even
less time designing software (as opposed to just coding on various
simulations/algorithms/mini-projects).

To echo what someone else said, yes, genuine hackers my age will probably code
circles around me when it comes to programming. But we're probably not even
interested in the same kinds of jobs.

I am not saying software engineering is not important -- it's simply taking me
longer to become competent at it (or at least "employable") because I'm trying
to combine it with other interests.

