
I'm graduating with a CS degree but I don't feel like I know how to program - dangrossman
http://stackoverflow.com/q/2823571/280598
======
edw519
I believe that there are two ways to get good at anything, "push" and "pull".

Push: You learn from books, classes, mentors, and studying examples, then
apply what you have learned.

Pull: You have a problem that you must solve, then you learn what you need,
any way you can, to build the solution.

I suppose there are pros and cons of each method, and I imagine that many
people here have used some of both.

For the record, I am 100% Pull. I have absolutely no formal training. It took
me 2 years to find my first job and then I was thrown into the deep end. It
was simultaneously frustrating and exhilarating. There were so many times I
didn't know what to do or didn't have enough "tools" in my box. So I had to
figure it out and find sources of learning. But I always did. Any when I got
that first thing working and then saw my customer's eyes light up, I was
hooked.

Your CS degree may make you think that you're a "push" learner, but may I
suggest that you adopt a "pull" approach. Forget what you think you know and
find a job or a project or someone who has a real need. Then build what you
need. You a several advantages over me: (a) It shouldn't take you long to find
that job/demand/customer. Just keep looking. (b) You already have tools in
your tool box, maybe not the right ones for the job, but you have _something_.
And (c) It's easier than ever to adopt a "pull" approach. Help is everywhere.

You may feel frustrated, but I don't think you have a problem at all. You're
in a great (and very normal) situation. Just adjust you attitude, find
something to build, and do it.

~~~
sophacles
The problem with pure pull is that you end up spending an inordinate amount of
time reinventing the wheel, working towards one solution that you can see,
while a much better and simpler solution is just around the corner because you
don't have the breadth of knowledge to see past the sort of myopic view it
provides.

On the other hand a pure push approach results in lack of practical knowledge,
and frequently a "purity over pragmatism" mindset. As a guy who works
regularly with grad students, this is frustrating -- the 100th argument
consisting of me saying "yes I know the theory your professor taught, but here
is how you do it for real given the bugs in the library implementation (or the
runtime constraints or whatever)" gets pretty old too.

I guess I'm saying a pure approach for either has a tendency to miss a pile of
benefits, and introduces it's own drawbacks.

~~~
abrenzel
Maybe the best thing to do is to try and sequence your "pushing" and
"pulling." I actually graduated with a Political Science degree in 2009. I
came to my first job not knowing a lick of programming, and the job didn't
require it anyway. I got into programming because we were trying to do a
website redesign and I wanted to help out. After we finished up that project,
I kept going at because I liked it.

The first 9-12 months were tough. I read some beginner's books, wrote lots of
really ugly code, and got things to work eventually, if only barely.

Then the code started to get prettier and more robust, and I picked up some
more theoretical books like Leiserson's Intro to Algorithms to learn the
theory. Having "pulled" around code for 9-12 months on my own, learning more
formal computer science really allowed me to begin gluing those pieces
together.

Everyone learns differently. Maybe a better approach for some CS programs
would be to throw students into the water for their first year, let them
struggle reinventing the wheel and solving practical problems as best they
can, and then teach the theory and formalisms later?

~~~
narrator
I've taught computer science and I've seen that one's brain either understands
computing concepts, or it doesn't. I've seen people with no programming
experience pick it up pretty quickly. I've also seen people who were otherwise
smart not get anywhere at all. If people can get past assignment, indirection,
and boolean logic, they'll probably do fine. Understanding concurrency is also
a sort of fundamental brain ability, but is something that fewer people have
the ability for and is not necessary for every programming task.

~~~
itsnotvalid
There are different fields within CompSci that different kinds of people, from
Math-backed to social types would be required.

------
cletus
This touches on several issues.

1\. Should college teach you to program?

This is a philosophical question about whether a CS degree should be
_educational_ or _vocational_. The general consensus seems to be that it
should be the former not the latter. It should give you the theoretical
foundation that you can apply to almost anything.

Therefore, college won't necessarily teach you any programming beyond what you
need to read examples and do assignments, which may not be particularly deep.

2\. Do you like to program?

Frankly, every good programmer I know started programming long before they
went to college or at least programmed outside of college for their enjoyment.

If you haven't done that and don't do that then I really have to question if
you're in the right profession.

3\. Programming vs Being a Programmer.

Being a programmer as a job for which you are paid is different to
programming. It involves many other skills such as design, reviews, dealing
with people, writing documentation, supporting applications and so on. This is
not something taught in school (nor could it be really).

I view the first 2-3 years of your work life as an apprenticeship of sorts.
You've got the basic theory, now you have to go out into the real world and
make yourself useful to somebody.

Many companies have graduate programs and the like. I think it's fairly
important to start off somewhere that's good, meaning they'll teach you
something (rather than simply crushing you, which, sadly, is more the norm).

If you can put in 2-3 years at, say, Google, Facebook or Apple after doing a
good CS course, you'll have gotten yourself off to a very good start.

~~~
Nitramp
_1\. Should college teach you to program? This is a philosophical question
about whether a CS degree should be educational or vocational. The general
consensus seems to be that it should be the former not the latter. It should
give you the theoretical foundation that you can apply to almost anything.
Therefore, college won't necessarily teach you any programming beyond what you
need to read examples and do assignments, which may not be particularly deep._

I personally think that's a problem. There is nothing wrong with being
educational in your sense of the term, but I do think people with a degree in
CS should be expected to know how to program.

Not expecting a CS alumnus to be a programmer is like having an architect not
know how to draw buildings, or a surgeon not know how to wield a scalpel.

Sure, the degree should absolutely teach you _more_ than just programming, but
there is no value in being a CS grad without knowing how to program. It's sort
of the low level toolkit that you absolutely must be proficient in to being
with.

A strange thing about CS education is that we have all these people studying
Computer Science or even Software Engineering without ever looking at a
significant piece of software. You learns lots of small examples and lots of
theoretical bits, but as far as I can see most programs never take a look at,
say, the Apache webserver and explain how all these small things come together
to produce a successful piece of software. That's really a pity.

~~~
kenjackson
_Not expecting a CS alumnus to be a programmer is like having an architect not
know how to draw buildings, or a surgeon not know how to wield a scalpel._

You do realize that with both professions you noted there is usually an
apprenticeship time (internship/residency) -- and also in both professions you
must licensed (in architecture typically after your internship and in medicine
before the residency).

I do disagree though that there is no value in not being able to program. The
main contribution of CS is not programming. It is in the theory of
computation. I really do view programming as purely incidental.

You wouldn't expect a mechanical engineer to know how to repair a 2011 Ford
Focus. They'll konw the basic ideas under the hood, but all of the technoogy
specific aspects of it shouldn't be taught.

------
Nitramp
I think there is huge value in trying to become what has been called a "full
stack programmer". In the maning of: try to understand how computer systems
work by understanding how each part of the stack works. Don't try to
completely understand every subtle detail of every part - try to understand it
like you understand how a combustion engine works.

My list would be:

    
    
      - basic electronic concepts, ie. transistors, XOR / NAND, bit shifters, adders
      - assembly language
      - hardware layout: CPU, registers, main memory, MMU, interrupts
      - operating systems: hardware interface, multi processing, file systems
      - networking: packet networks, ethernet, TCP/IP (sliding window, congestion control)
      - low level programming: C with fopen & co, sockets, structs, system calls
      - compiler construction (this is important!), parsers, translators, programming language implementation and virtual machines
      - algorithms: complexity theory, automata, CFGs, common data structures (heaps, maps, trees)
      - discrete mathematics, statistics
    

I think if you can explain all of these in at least a sort-of, hand wavy way,
then you're on a good path to become an excellent programmer. I also think
that is what a good CS degree should teach you. Try to explain to yourself in
a children's story way what actually happens when you click your mouse button.
If you don't know something, look it up.

~~~
JoeAltmaier
Who has the time? And you can be employable knowing only 1 of those.

I've done that stuff; by necessity, I'm old enough to have grown up with
computers and didn't have it all on a platter. My sons are learning "top down"
and doing fine.

~~~
beej71
Who has time? You have your whole life to study it--it's not exactly time
pressure.

------
akkartik
How refreshing. When I graduated I thought I knew it all.

 _"I see websites like Stack Overflow and search engines like Google and don't
know where I'd even begin to write something like that."_

In response I'll quote part of the best paragraph PG's ever written:

 _"I've always been fascinated by comb-overs, especially the extreme sort that
make a man look as if he's wearing a beret made of his own hair. How does the
comber-over not see how odd he looks? The answer is that he got to look that
way incrementally. What began as combing his hair a little carefully over a
thin patch has gradually, over 20 years, grown into a monstrosity. Gradualness
is very powerful. And that power can be used for constructive purposes too:
just as you can trick yourself into looking like a freak, you can trick
yourself into creating something so grand that you would never have dared to
plan such a thing. Indeed, this is just how most good software gets created.
You start by writing a stripped-down kernel (how hard can it be?) and
gradually it grows into a complete operating system."_ \--
<http://paulgraham.com/essay.html> (His best essay IMO.)

------
pge
The reality is that no one knows how to do any professional job when they
graduate from college. What we learn in college is mostly how to learn and how
to problem solve. The problems we solve in college, whether stumbling through
our first sorting algorithms or writing a paper about the role of Prussian
nationalism in the 1800s, are not tied at all to the problems we have to solve
professionally. And that's okay. When it comes to being a practitioner,
whether producing commercial software products or writing analyst reports on
public companies, the job itself is the best training. What you have to bring
to the table is the curiousity and ability to learn and problem solve that get
you up the learning curve quickly, and the professionalism that makes you a
reliable and welcome colleague.

------
zaidf
Similarly, I did _not_ graduate with a CS degree, have been programming since
5th grade and yet feel I cannot program 'professionally' for a big firm that
is loaded with CS geeks while I'm just an amateur programming for 13 years.

In this case, a lot of it is what you tell your brain.

~~~
stcredzero
Just study the following:

    
    
        - Understand time & space complexity
        - Security & Encryption
        - Concurrency & why ACID transactions are hard
    

That will save you from most of the most embarrassing and costly mistakes of
programmers without a formal education.

I've actually worked at a company that wasted _millions_ on a fruitless
project because management didn't understand basic automata theory:

    
    
        - Finite State Machines / Regular Expressions
        - Stack Machines / Context Free Grammars
        - Turing Machines / Anything Computable
    

I've been thinking of doing a presentation: Everything I still actually use
from my CS education in less than an hour. (It will take you a bit longer to
study and really absorb, but it will probably take a lot less than 4 years of
college and cost much less.)

EDIT: Another good thing to study, though I'm not sure if there's a good
single source: Why distributed systems are Hard and why distributed
transactions are Really Hard. I really didn't care for the teaching style of
the professor who staked out that whole area as "turf" so none of my materials
were particularly memorable or good, but the information was valuable.

~~~
bad_user

         management didn't understand basic automata theory
    

Do tell more about it; as I feel that's not why they wasted millions.

IMHO management isn't required to understand much about CS, as long as the
relationship with the developers is as between a customer and an engineer
(i.e. customer asks for stuff, engineer explains what he can and cannot do).

Most problems with management comes from a disconnect with reality. Even when
they know CS theory and/or could understand the complexity involved (ex
developers); having bikeshed-style opinions and making demands with an iron
fist in spite of developers advising otherwise (or the reverse, having
developers on the team without an engineering mindset that can't think for
themselves) ... that's the real poison.

~~~
stcredzero

        management didn't understand basic automata theory
    

_Do tell more about it; as I feel that's not why they wasted millions._

That company tried to translate code from one programming language to another
using only regular expressions. (This was a long time ago when you couldn't
almost count on most "regular expression" implementations being Turing
Complete.)

Perhaps the problem was really that engineers who understood the futility of
the approach didn't speak up or weren't listened to. Still, I'd expect people
managing an engineering firm that builds bridges to have some basic grasp of
physics. So I don't think it's going too far to have those running a software
company to have some basic grasp of the basic laws governing their field.

~~~
cynicalkane
I'm going to play devil's advocate here, and point out that you can actually
construct the proper automaton where the transition conditions are decided by
regular expressions.

It might work like this: some programmer working on the project realizes
something can't be parsed in a finite state machine, and 'cleverly' separates
out one batch of regular expressions into a loop/recursive call. Repeat until
the programmers are satisfied with the number of conditions they can handle.
I've seen software that was actually written like this. Fortunately, the
language it was designed to parse was pretty simple.

~~~
johanbev
Wouldn't that still be a finite state automata?

You can create a submachine representing the regular expression transition
conditions, and just attach that at the state you wanted, resulting in a
finite state machine.

Of course this doesn't hold when you are talking about non-standard regular
expressions, and it's probably a nice feature to have when creating the
automata, but IMHO it still sounds like a silly idea when CFG-tools like ANTLR
and YACC are available.

~~~
bad_user

          Wouldn't that still be a finite state automata?
    

He mentioned recursion, so no :-)

I also hate working with ANTLR/YACC ... heavy, hard to start with, steep
learning curve. These tools are designed for industrial-strength compilers,
where performance / flexibility matters.

And PEGs are better than CFGs (that's teeshirt material right there :))

~~~
johanbev
Aaahhh, ofc, now I see why that wouldnt work. Guess I learn something every
day :)

------
mvanveen
Being an undergraduate in a large public university gives you all sorts of
great opportunities, like rooming with a painter (art studio/anthro double
major). Among the many jewels I've borrowed from our conversations, one I
particularly treasure is the notion of praxis.

Praxis (as I understand it) is simply the harmonious blending of practice and
theory into action. As I'm beginning the exit trajectory from undergrad and
into the "real world" (whatever that is), I've been reflecting on my education
in the art of programming. I've realized that praxis has been the only
substantial educational tool I've had.

Knuth says it best. “If you find that you're spending almost all your time on
theory, start turning some attention to practical things; it will improve your
theories. If you find that you're spending almost all your time on practice,
start turning some attention to theoretical things; it will improve your
practice.”

------
angrycoder
This is based on the experience of getting my CS degree 10+ years ago. I'm not
going to prefix every sentance with IMHO.

Of course you don't know how to program, because most computer science
programs suck. They teach how to code, the basic stuff like variables, if
statements, loops, etc. You probably had a course in data structures and
algorithms where you learned how to code your own lists and then how to sort
them. You probably learned about object oriented programming with tons of
examples about how a dog is a type of animal or maybe a foo is a type of bar.
You probably wrote a ton of little one off programs to count the words in a
file, calculate fibonaci sequences, fling disks around the towers of hanoi, or
calculate interest rates.

Probably by the time you were deep into your data structures class you started
zoning out, because heck, you can get by just fine with arrays. Same for
algorithms, why are they making all this stuff so complicated, I can do most
of this with just if and while. You never had to write a program more than a
few hundred lines long, so object oriented programming just seems like
confusing overkill. So do functions for that matter since you never had to do
the same thing more than once in your program.

The problem is, you were taught all that shit in a vacuum and nobody ever told
you how to put it all together. Since the programs you were working on were so
simple, you never ran into the problems that those techniques were meant to
solve. You were taught tons of theory, but nobody ever sold you on it. You
have no idea how to apply all that stuff you learned. When and why to use each
little bit of theory.

Maybe you tried to bootstrap yourself, start writing your own real programs.
Maybe you had some success, most likely you got bored or frustrated and
collapsed a few days later under the cruft of your own code base because you
had no idea how to structure a real program.

Of course your professors will tell you that what you really need to learn
wasn't the job of the university. They are there to educate, not help you get
a job. I can understand their point of view to an extent, but what would you
say about an english major who just got their BA and doesn't know how to write
more than a 2 page paper. Theory & knowledge are just giant pile of bullshit
to a person without a proper impetus to apply it in a non trivial application.

I realize there are some awesome colleges out there that are probably nothing
like this. Given what I still see out of the junior developers I work with, I
would say they are still the exception rather than rule.

~~~
redthrowaway
"They teach how to code, the basic stuff like variables, if statements, loops,
etc. You probably had a course in data structures and algorithms where you
learned how to code your own lists and then how to sort them. You probably
learned about object oriented programming with tons of examples about how a
dog is a type of animal or maybe a foo is a type of bar. You probably wrote a
ton of little one off programs to count the words in a file, calculate
fibonaci sequences, fling disks around the towers of hanoi, or calculate
interest rates."

That was all first year in my program. Second year was algorithm design,
architecture, source control, *nix devlopment, etc (in addition to math,
technical writing, etc).

I don't think my school is particularly spectacular, but even in second year
we've gone beyond what you describe, and the people who take the attitudes you
talk about have failed out. I don't think most CS programs are as bad as you
say.

------
ja27
I'm graduating with a EE degree but I don't feel like I know how to solder.

I'm graduating with a ME degree but I don't feel like I know how to weld.

~~~
Androsynth
Except professional EE's don't solder and professional ME's dont weld. CS
majors overwhelmingly become programmers.

~~~
beambot
Myself (and many colleagues) are professional EE's. We all own soldering irons
and know how to solder in the most basic sense (I'm one of the few with a hot-
air rework station and a stereo microscope).

About half of the professional ME's I know either own a TIG/MIG welding system
and/or know how to weld.

------
bitwize
Do you bicycle?

Do you remember learning how to ride?

Knowing rigid-body mechanics, the theory of angular momentum, gyroscopic
effect, etc. isn't going to keep your ass in that seat. Contrariwise, by
trying and falling many times you learned how to balance yourself atop an
unstable structure of wheels and frame when you were five years old.

Programming is the same. To feel confident in your ability to program, you
simply have to _do it_. A lot. And you will write a lot of crappy, crappy
code. Just keep doing it.

------
Ernestas
Previous post/discussion: <http://news.ycombinator.com/item?id=1345281>

------
ry0ohki
I remember feeling the same thing in college... I expected CS to be a
vocational program that would teach me how to write the applications I used on
Windows every day. By Senior year, when not a single "real world" application
was written, I finally realized it was all about teaching good theory and
practice, and the practical stuff I'd need to pick up on my own.

~~~
jamesgeck0
Several students in my campus ACM chapter realized this and worked to make our
meetings fill in some of the gaps. We had weekly meetings and covered things
that attendees could get started using immediately. Code-alongs were
encouraged. Popular topics had followup meetings. I don't even know how much
time we spent playing with POV-Ray.

The lightning talks meeting was also really popular; one guy showed how to use
Blender in five minutes, someone else talked about a darknet he had written,
and another student used it to distribute Google Wave invites she had from her
summer internship.

------
uscfan1781
This topic hit home for me because I am graduating this year with a CS degree.
As many of you have pointed out, a CS degree doesn't teach you how to program.
I think it does give you a base of knowledge that you can then build upon to
become a great coder.

I would say that 30% of my programming skill and knowledge comes from what I
learned in class, while 70% comes from reading, watching lectures online,
having friends critique my code, looking at open source projects, etc. But
without that initial, introductory training from my CS department I would
never have been in a position to understand those other topics.

Personally I would love to see a community effort to put together a free, open
source "bridge the gap" curriculum for new college grads. It would focus
mostly on coding best practices, code reviews, the importance of tests,
engineering work flows, version control, staging servers, etc. In particular I
think it should focus on real-world codebases as opposed to the one-off
programs you constantly write in academia. Sure you can learn most of this
stuff at your first job, but I think there are a ton of people out there who
would love to learn this stuff, but they don't really know what they need to
learn or where to start.

~~~
lesliehawthorn
While it's in very early development stage, Oregon State University is
creating an Open Source certificate program that will address some of these
issues. The certification as planned will grant Masters degree level course
credits and will be offered online. Course content will include LAMP stack
development knowledge, basics of the development tool chain (issue tracking,
mailing lists, etc.), release practices, and will require a three month hands
on 'internship' working with a FOSS project to gain certification. Oregon
State University would work to match make between students and FOSS projects
looking to on board new contributors as part of this internship requirement.

------
cypherpunks01
I learned _extremely_ few industry-applicable skills in a prestigious CS
undergrad program. Instead, I picked up 99% of my useful knowledge from a few
other places:

\- One semester-long software development class, where the teacher did
literally nothing while we formed small teams and worked on a project for a
real client in or near our university

\- Software engineering internship in the industry

\- Extremely hard-ass Advanced Placement C.S. teacher in high-school

I learned a lot of cool theoretical stuff in college that is definitely good
to know: functional programming, operating systems, machine learning
techniques, compilers, graph algorithms, etc., but was never taught any core
programming techniques or required to write very extensive code at any level
of quality. It's all about _real-world experience_ , if that's what you're
shooting for.

------
johngalt
I'm graduating with an English degree but I don't feel like I know how to
write a novel.

~~~
T-hawk
Well, bang out 100,000 words and you have a novel. (Also known as the James
Joyce approach.) You can't fail at novel writing. A weld or solder joint can
leak or disconnect, but a novel can't suddenly stop being a novel.

Whether you can write a novel that is compelling or sellable or worthwhile is
another story (pun) altogether, of course.

~~~
johngalt
The more detailed point I'm trying to make is that there's a reason that
development is a profession. Even the masters have to spend some serious time
to build things.

In CS programs I've seen many students that expect to leave with the ability
to just sit down and code up a Facebook clone off the top of their heads. It's
similar in IT roles. There is no class that is "what to do when network is
slow 101".

------
InclinedPlane
If you're lucky they actually taught you CS when they were giving you that CS
degree. If you have a passion for creating software then don't worry, you're
in a good place, but you've got tons of work ahead of you. Now you'll need to
learn an entirely new set of skills. In terms of books I'd recommend Code
Complete, Rapid Development (somewhat misnamed but quite good), and
Refactoring. Having CS knowledge will give you a leg up because you will be
able to apply certain skills and knowledge to hard problems that most
programmers have a hard time coming by (compilers, low-level data structures,
etc.)

If you're unlucky then you got a pseudo-trade-school education in Bachelor of
Science clothing. Sorry to say that you probably got ripped off. But don't
worry, if you have a passion for creating software then you can still use
self-study to build up the knowledge and skills necessary to become a true
software craftsman, and at least you're not starting at square one. Plus, a CS
degree still looks good on paper and will help with job searches.

P.S. Learn source control inside and out, it'll pay massive dividends.

------
goldins
Chances are he did find a job in the last 8 months, but here's my input (maybe
someone else in a similar situation can use it): I graduated with a BS in ECE
a few months ago, and also felt like I wasted 4 years for a piece of paper,
but in those 4 years, I gained a lot of web development experience. While
interviewing for the next few months after graduation, I saw that I knew a lot
more about web development than EE, and that I was more interested in web
development and CS. I landed a programming job where I'm learning more than
I've learned during four years of electrical engineering courses. So my advice
is to find what you're more interested in, and maybe you have college work or
extra-curricular experience that can help. Engineering and CS share a similar
thought process, and employers look for this in their technical interviews -
especially if they know you don't come from a formal CS education. As others
have pointed out, you can (and should) work on personal projects and
freelance. Besides helping you learn and gain experience, you might even make
some money!

------
moomba
I think at many schools, how much you know about programming depends on the
electives you choose to take. I could have taken many easy classes and had a
much easier time going through school (probably had a higher GPA too). But,
you need to think why you are in school in the first place. Are you there to
get a slip of paper stating that you spent 4 years or so visiting classrooms
occasionally throughout the afternoon/morning? Or, do you want to actually
learn something of substance that you can use in your personal/professional
development.

I like the first answer on the SO post, developing a website or writing a game
will definitely make you a much better coder. When you build something from
the ground up by yourself, you learn a lot more than just coding. You learn
how to break out of deep troughs of despair. You learn how to work more than 8
hours at a time. You learn why its important to add efficiencies to your work
habits. These are a few of the things you learn. But, these are the things
that separate coders (the subset) from people with degrees (the superset).

------
chopsueyar
Maybe the guy has gotten a job in the past 6 months since this was posted?

~~~
spacemanaki
Just for the record, I believe the OP over at StackOverflow is actually a
woman. At least, I think their nick was "Wendy" when they first posted it.

~~~
chopsueyar
I upvoted you. My apologies for the gender assumption.

~~~
spacemanaki
It's ok! I know how easy it is to do, but in this case I happened to remember
other posters on SO recommending that the OP not use their full name as their
nick, since the question might pop up in a pre-job-interview Google search.

------
redthrowaway
This is why I feel co-op should be mandatory for all CS degrees. I look at
some of the people in my program who struggle with even basic programs and
algorithms, and I can't help but think they're deluding themselves. A summer
spent doing QA, then another as a junior developer, then two more doing real
programming work would either disavow them of the notion that they should be a
programmer, or give them the skills to at least get a job when they graduate.

I think it's shameful that colleges are perfectly happy to take 4 years of
tuition and tell you that your shiny BS in CS will get you a great job when
you graduate. A few profs will drill it into your head that co-op is
mandatory, but that's only if you get the good ones.

------
rabc
You can't expect college to teach you how to program. It's more experience and
try-and-fail than anything else.

The college will teach you the basic, it will give you a ground to know how to
start building. They won't tell you how to put the bricks together.

~~~
stonemetal
That is how it is right now, but run into a brick wall until you conquer it
isn't the best approach. Guided practice would be much better. For that to
happen though we need to get better at being able to describe what we learned
by running into that brick wall.

~~~
rabc
"Guided practice would be much better". Totally agree.

That's why I help my co-workes with something they don't know and encourage
them to do the same with others.

------
EliRivers
Sounds like a case of mishandled expectation to me. Computer science is a
mathematical and logical discipline; programming is a good means to practice
that mathematics and logic, but it's not what computer science is.

------
AngeloAnolin
Pretty much I think this is one reason why the big names in software industry
did not totally adopt the notion of graduating with a degree. What they did
was to venture out on the real world and try solving some problems that they
have by using computers and understanding how to program it. Pretty much I
think it is safe today that 90% (or more) of what's being taught in
universities offering CS degrees doesn't match up with what's happening in the
real world. You want to program, sit on a computer, find something to solve
and do it.

------
mike-cardwell
I was a better programmer at the age of 12 than most of the people who did my
Computer Science degree were at the end of the course.

A worthless piece of paper. Had a fun three years getting it though.

~~~
JoeAltmaier
I find I'm a better programmer every year. I look at last year's code and
think "What idiot wrote that?"

Or maybe I just never get any better, hm.

------
leogau
I think this post complements the "How Effective are Technical Interviews"
post that was on HN recently. A CS curriculum definitely prepares you for the
theoretical questions asked in a technical interview, however, neither a CS
degree nor a technical interview give you a real sense of how strong that
person is at development.

I don't think this problem indicates the usefulness of a CS degree. Instead, I
think it says that the only real way to learn how to program is to program.

------
aces
My suggestion is to find a side project or something to get involved with.
That will give you something to guage where you are and ways to improve.

------
mattmiller
I think a lot of students coast through a CS program and expect to be good at
programming when they are done. A student should always have a personal
project that he is working on outside of school (even if it is really small).
Something that he cannot ask the teacher for help with. That way he has
experienced unguided learning and has something to show off at job interviews.

------
idm
There is a difference between programming and engineering. I didn't take a
software engineering course until after I graduated, but it was so worth it...

It's one thing to solve a problem once it's in front of you, but it's another
to make the plan that exposes you to the problems, and keeps new problems
coming along so that you can keep solving them, until one day... the project
is done.

------
jimmyjazz14
You could probably replace "CS degree" and 'program' with a lot of different
degrees and vocations. This is what people seem to fail to understand about
collage, anything worth doing takes far more effort then making it through 4
years of college. All college does (at least the first 4 years) is get one
ready for the lifetime of learning that is ahead.

------
signa11
imho, cs degrees are not _supposed_ to be about programming. their focus
should be purely theoretical side of computation e.g. heavy emphasis on
algorithms, data structures etc. etc. which pushes them mostly towards applied
mathematics imho. most programmers are autodidacts anyways, and picking stuff
up is generally not _that_ hard.

------
Jun8
This sentiment is true, I think, for _any_ profession, graduating with an
undergraduate degree just gets the door open, you still have a long way to
walk. Similarly, if you're an English major reading _The New Yorker_ , you may
not feel like you know how to write a decent piece.

------
nixpunk
Graduating with a CS degree from where?

------
axod
Choose another career ASAP. Find something you love.

This is why there are so many bad programmers around. Depressing.

~~~
simplegeek
I respect your opinion, however I'm quite sure that person who asked this
question actually cares about what he does because I don't think he would have
posted this otherwise. I mean I could be wrong but this is what I felt when I
read it.

~~~
axod
Either he just doesn't have the natural aptitude, or he doesn't love it enough
to learn.

I can't fathom how anyone could be a programmer/trying to become a programmer
and not have constant side projects, partially written OSes, games, etc

It's easy to say "I want to be an X", but then you realize that you're not
spending enough time doing X to become good at it. And the reason you're not
spending enough time doing it is because you just don't love it enough,
perhaps you love something else more.

He writes "I'm trying to improve my knowledge by studying algorithms, but it
is a long and painful process."

Which is depressing. You do not learn how to program by 'studying algorithms'.

Do you learn to become a great author by reading the dictionary? No.

It doesn't sound like he wants to be a programmer for the right reasons to me.

~~~
eftpotrm
I disagree.

The (quite old; it'd be interesting to see how this panned out) question came
across to me as someone who, at the end of their many years in education up to
this point, has got very used to directed learning. They are used to learning
by being set a challenge with some accompanying theory and completing the
challenge. They may well be good at this and enjoy doing it, but they haven't
become used to searching out the material for themselves.

In fairness, for a corporate setting this may not be a great limitation! When
you're working on someone else's project doing maintenance work as most
developers end up doing, the need to seek out new problems and work out novel
methods can come later; for now, your work domain is fairly closely
controlled.

We may well have a CS graduate without the passion to stick at development,
but this isn't necessarily the case. I did very little personal work then,
because I had other interests as well and was doing plenty of programming for
my course, thank you. I think we've got someone with the self-awareness to
realise their limitations but insufficient experience of learning outside of
education to know how to address this.

~~~
axod
It came across to me as someone who wants to learn programming for the wrong
reasons. For example they heard it pays well. Rather than wanting to learn it
because they love it.

------
joelhooks
If I was a fresh grad (or non-grad with some level of self-taught skill) I
would be looking at companies that have formal apprenticeship programs. There
are shops like Obtiva that do this sort of thing and look to lift people up
through the "craftsmanship" approach.

------
Uchikoma
From my experience people can programm( _) or they can't. I rarely have seen
someone "learn" programming. A CS degree has nothing to do with it.

Becoming a good programmer is something different.

(_) Deconstructing problems into smaller problems and expressing those in
computer commands.

------
ramirez60
I think I can help you out wiht the job situation..and a perfect match for
what you're looking for. send me an email. gaurav.namit at lbi.com

------
gohat
I'm sure that you've done a great deal of challenging/complex programs in
pursuing your major.

If this is so, and you can't program, then how did they appear?

------
rebel19
This person should work for GE. Most of their senior and lead Software
engineers can't code either.

