
How to learn how to program well - wensing
I graduated from undergrad with (essentially) a C.S. minor in 2003.  Since then I've managed to pick up some practical hacking skills and projects, but I really want to take my programming to a higher level.  What's the best way to do that?   <p>FWIW, my language of choice right now is Python, which is what our startup is written in.  What little I know and understand about functional programming and recursion, I enjoy, but I feel like I still don't have a very strong grasp on algorithms, performance, and what makes for truly beautiful code.  <p>I own PG's ANSI Common Lisp and have considered studying it as part of the answer to this question.<p>To complicate this, a little background: I've been offered two jobs: Job A means I can code in any language I want on a really cool skunkworks project--but I would have to be entirely self-taught; Job B means I would have to code in C#.NET, but I would be surrounded by some serious nerds (OS and graphics types) that would in theory be willing to mentor me.<p>What would you choose, assuming compensation was the same?
======
willarson
I would take the first job. Many people without a complete formal education
have this fear about the things they _should_ know. They also assume that if
they had only completed a CS major they would in fact understand these things.
Unfortunately this doesn't play out.

I graduated with a CS major, and many of my classmates who graduated with the
same did not have a very strong grasp on "algorithms, performance, or what
makes beautiful code". Don't let the lack of a formal CS education distress
you. The students who know the most are the ones who are off doing their own
projects and working with each other to create things, those who charge
through the curriculum learn a lot, but don't internalize the knowledge, and
thus retain little of it.

~~~
steve
Yes, A for sure. The guys at B probably have some actual work to do other than
teaching you all day long.

------
gcheong
I have a degree in CS and it taught me very little about how software is
developed in the real world. I would choose A mainly because the chance to
work on an interesting project and enjoy that level of freedom rarely comes
along in a paid position. Having to deal with all the decisions that go into a
software project will help move your skills forward much faster than just
being able to ask the nearest "guru". And besides, with the web and Google you
have access to the best minds in engineering and can easily compare approaches
to common problems. There will always be plenty of "B" jobs around.

~~~
gcheong
Speaking of the best minds in engineering. Here is some good advice:
<http://norvig.com/21-days.html>

------
Keios
Job A if your want to improve your creativity.

Job B if you want to encourage your technique.

To improve my programming I generally do things that I can't figure out how to
do in my head.

------
chazwozz
Obviously there are benefits to both options.

Personally, I find myself in similar dilemma. I studied CS, and the whole time
my goal in life was to be a programmer and work with computers. Then you get
into the industry and you realise you have achieved your goal, and find you
need new goals. You realise the IT world is so huge and there so much to do
out there. There is much more to IT than programming.

Theres probably no right answer. I would reassess my goals. Where do you want
to be in 10 years. 15 years? Imagine the path to this goal, and I'm sure the
right choice will present itself. It may be neither of those options. In fact,
I wouldn't limit myself to only 2.

Do you want to be a programmer all your life? (sounds pretty boring to me).
This is an important question to ask yourself. What is going to be the best
step to where you want to be later on?

~~~
euccastro
Programming has more than enough challenges to fill a lifetime.

~~~
chazwozz
agree. thats why i enjoy it so much. personally, i don't want to program all
day. variety is the spice of life. thats just me though..

------
luxiou
I would take the first job. It will likely put you in more "if I don't figure
this out, nobody else will, and we'll be completely screwed" type situations,
and those can be great motivators for doing/learning things you never would
have bothered with otherwise.

------
wensing
Thanks for all of your responses! I am leaning towards Job A, but we'll see
whether or not the offer officially comes through. I'm hoping that I can teach
myself. I'm also thinking that the other programmers at Job B might not really
play as much of a role as I might imagine . . . that I would still be on my
own in a way--self-motivated, self-taught . . . they would just be there to
get me through the tough(er) parts.

------
henning
It kinda just takes time.

I think the ideal situation would be having something like Job B for a while
until you feel like you're a solidly professional duder, and then move on to
something more risky and adventurous. I wasted vast amounts of time trying to
teach myself to program as a teenager because I didn't know where to go to.
Having some structure and guidance could help you.

~~~
euccastro
My suggestion is pick job B, but keep a hobby project on the side.

The internet makes self learning easier, but then again, mostly all you'd
learn from job A you could learn from hobby projects anyway. Face to face
interaction with other programmers is harder to substitute.

Just in case you haven't read this already:

<http://www.norvig.com/21-days.html>

[Sorry, meant to post this as a top level reply.]

~~~
wensing
Fantastic article . . . I think I'm going to be engrossed in the rest of
Norvig's site/articles for a long while now.

That article included a link to the video lectures of the Structure and
Interpretation of Computer Programs by A&S themselves, given to HP employees
back in the 80's:

<http://www.archive.org/details/mit_ocw_sicp>

~~~
euccastro
The full text of the book is also available online.

<http://mitpress.mit.edu/sicp/full-text/book/book.html>

