
Ask HN: How do I improve my programming/engineering skills - lurking_lurker
Ask HN: How do I improve my programming/engineering skills<p>Hey HN. I've been lurking here for sometime now and have seen similar posts, usually with positive and helpful responses. So decided to see if you guys could help me too.<p>So a little background about me. I'm 23 years old and been living in Scandinavia for 3 years now.<p>I'm not one of those guys that have been programming since they started walking. I started programming about 3 years ago when I started Electronic and computer engineering. There I learned Java for 1 year, one course per semester. After that year I found out that a strictly engineering-focused education wasn't for me and that I didn't even like hardware stuff anyway! So I rebooted my bachelor degree in a cross-disciplinary education which included all kinds of topics, ranging from 3D modeling to making sounds in Max/MSP with a lot of focus on academic reports (around 100 pages for one semester, which I hate btw) and user testing, and programming courses sprinkled in-between.<p>Therein lies the problem, since the education is cross-disciplinary, maybe one third to half of the students aren't very or at all interested in programming and as a result the quality and the challenge of the programming courses have suffered. Since starting that education they have taught ActionScript, C++ and C#, each on it's own semester and no-one is close to proficient in any of them.<p>I do realize that no-one should be responsible for my education except me, therefore I started learning Python on my own last summer. I've only really played around with it, not doing anything serious with it. Started one or two Django sites, finished neither since I was in over my head wanting to implement very complex ideas. I have made one rather complete script to download Google Docs folders contents and compiling them to LaTeX for my reports, but it's neither very complex or impressive. I'm very interested in web development and want to get better.<p>I do agree that you learn most my actually doing, actually coding something and I have tried to find open source projects to participate in, but I cant seem to get into any of them due to me not understanding the whole program. Maybe I just haven't found a small enough program to get my feet wet. I'm also not making much head way with Project-Euler either, usually getting stuck on some math stuff. I read a lot of tech and code blogs about webdev, Python and programming to keep upto date.<p>I tried getting a job at some local startups hoping to get the chance to learn from great coders but, of course, no-one was interested in my underdeveloped skills.<p>I do like programming and trying to find solutions to problems but I seem to lack both ideas of a manageable size (maybe that's an idea for a web site? Practice programming ideas, ranked by "size" and only provide hints and no solutions.) or the skills to implement those that do pop up in my head...<p>I look at someone like Kenneth Reitz and I think to myself that I would like to become like him some day but I have no idea how to get there. I also wonder if it is worth it staying in university when so many hackers seem to do fine with out the degree. And I would have take a Master's degree to get anything out of my education since it's so broad.<p>Does anyone have advice how I can improve myself? Or should I just find another field to try to make it in?<p>Sorry for the long post and thanks for reading it.
======
duiker101
Hack. Side projects, websites, whatever, hack. Start a website, you don't
finish it? never mind you learnt something now start something new using
something different. You got it right, you just need to keep pushing. The only
thing that really pays is experience and to get experience you must try,
break, play. Never mind on what, how, why, just keep doing stuff. IMHO
university is useless. I did not need it and most of the good developers i
know did not need it. The fact is, it takes time. And there is nothing to do.
Experience is time converted in skills. To me you really seem to got it right
but as i said you just need to keep it up.

If you lack ideas(totally normal) think of small problems in your daily
routine that could be improved/fixed and do it.

Good luck, and don't give up, seriously. When you start getting rewarded for
your work this is one of the most emotionally(and maybe even financially)
remunerative jobs.

~~~
lurking_lurker
Thanks for the advise!

------
brudgers
My free advice: Learn Lisp for the reasons PG outlines in _Hackers and
Painters_ [<http://www.amazon.com/gp/product/0596006624>] i.e. Lisp is a
higher level language than _x_.

Peter Seibel's _Practical Common Lisp_ is available online (and as a book) and
provides a lot good advice including a link to lispbox, which in the best
"learn the hard way" tradition, requires you to finally learn emacs.

[<http://www.gigamonkeys.com/book/>] [<http://common-
lisp.net/project/lispbox/>]

PG's own _Ansi Common Lisp_ is more of a traditional textbook as well as a
reference to the language. The exercises are thought provoking. It is
available through Amazon including used copies.

Because Lisp originated as a way of describing Turing machines, the
discussions tend to cover a lot of the theoretical background and deeper
insight into how particular features may be used...or at least that's my
impression.

Good luck.

~~~
Ralith
Unfortunately, lispbox is badly out of date: "Last updated: February 6, 2011."

If you're on windows, try Lisp Cabinet. Elsewhere, you'll have to configure
things yourself.

------
manuscreationis
I think you're generally on the right path, just keep trying. Since you're
still getting your feet wet, you should pick a language and stick with it for
a little while, but don't stick with it as your only language forever. Too
many people make the mistake of getting comfortable with one technology, and
deeming themselves "done" learning anything else.

Start with Python, or Ruby, or Javascript. Something simple. If you're a fan
of Windows, take a look at C# (which you say you've had a semester of
already).

Start S M A L L. You say you try to build things that are over your head.
Don't do that. Build things that are just about your level, while still
providing a challenge. You're not going to come out of the gate with something
like Kenneth Reitz' "Requests" framework. You're going to have years of
learning and experience ahead of you before you can produce work like that
(unless you're a prodigy, which almost none of us are).

Most importantly, do not give up. You are not stupid or incapable of
programming if you hit a wall and can't seem to get by it. We all hit these
walls, at every level of our craft. The issue is recognizing when you have the
ability to climb the wall, to blow a hole through it, walk around it, or just
go back the way you came and pick another path.

You could try applying for unpaid (or lightly paid) internships as more of a
learning experience. If companies don't think you'll be a drain on resources,
I would imagine certain companies would love to have someone who is eager to
learn hanging around to take minor tasks and to be mentored for a few hours a
week. The key there is finding the right company with that kind of
time/support.

Best of luck.

------
jfaucett
I can only suggest some things that have helped me become better over the
years - and maybe they'll work for you :)

1\. Scratch the really high level stuff and start digging into some C or x86
assembly ( with GCC and binutils), read the coreutils and glib source and
program some of your own system tools ( like find or ls ). This will give you
a really solid understanding of memory and hardware internals which you can
use to your advantage in other software apps.

2\. Start programming games. It doesn't matter if its in javascript for
browsers or python but I would say do NOT use any external libs - program yor
own solutions and read other libraries source for ideas. Nothing has helped
improve my math and algorithm skills ( not to mention AI, physics, and
graphics ) like programming html5 js games.

hope this helps and good luck!

~~~
lurking_lurker
Both of your suggestions have been lingering at the back of my head. Your
encouragement is all they need to resurface and I think I'm definetly going to
go trough Learn C the Hard Way and I might start making small game (not the
biggest fan of gamedev but I do like the AI side of it).

------
thetabyte
There are a number of things you can do (which most other posts are covering)
but there is one I want to focus on: internships.

If you are in the financial situation to do so (especially if you are still in
school) find an (people won't like me saying this) unpaid internship. At 17,
in high school, living in the middle of nowhere, I put up my resume (with very
little web development skills) on HackerNews saying I would work for free,
remotely, about 8 hours a week. I got 10 responses. I took one doing Ruby on
Rails with an organization that did pair programming exclusively _and I
learned more than I did in years of Java classes_. With this training, I was
able to find a two month _paid_ internship in Ruby on Rails this summer, and
hopefully this chain will continue upward into jobs. I cannot explain the
value of on-the-job learning and experience, and if an unpaid internship is
what it takes to get you there, I really recommend it.

In the meantime: -Learn git inside and out if you don't know it -Pursue a web
development framework -If you have programmer friends, get together and code
with them. Productive people make you more productive. -Whatever you do, put
yourself out there. The more you are out there, the more opportunities will
come your way.

------
plinkplonk
here is a concrete suggestion (vs vague philosphizing).

Since you already know some Python, sign on to Udacity's (free) CS 212 Design
of Computer Programs by Peter Norvig. It has 7 weeks worth of classes and
teaches you a tonne in that time. It is a class targeted specifically at "I
know some basic programming but what do I do to get to the next level?"
people.

The official version of the class is over, but nothing stops you from joining
today, watching the videos, doing the assignments etc.

Since one of your aims is to 'learn from great coders' this should be right up
your alley since Peter is one of the best developers in the world and you can
see him developing multiple programs and refining them step by step till they
are gems of elegant code, and you can trawl the forums to see questions people
asked and answers to them.

Once you work through the class - should take you 7 weeks if you are
disciplined -and you understand all the techniques demonstrated there, you'll
be in good shape to start/join an open source project in a domain of your
interest.

And oh prepare to have your mind blown. Peter Norvig is one seriously good
developer.

Good Luck.

~~~
elrzn
A great programmer, sure! A good developer... I don't think so :) But I'm not
here to discuss semantics.

I wouldn't recommend that course at all and I would even rate it as an utter
failure.

It is not aimed to people with basic programming skills. The code snippets
mostly consist of complex, clever one-liners and the examples are bit
unfortunate.

You just need to take a look at the forums and see the prevailing discontent.
Folks who had just completed CS101 were just not able to get past the very
first units. And instead of addressing this problem, they just apologized and
(rightly) ranked the course under the advanced category!

He'll be better off reading PAIP. Which is an excellent, timeless book. And
still the best way to learn Common Lisp IMO.

Norvig has all the potential to be an excellent teacher, but he should stay
away from mentoring introductory courses.

~~~
lurking_lurker
Yeah, I just finished going through Unit 1 and I didn't feel like I was
learning that much from him and his cleaver, but a bit obscure, one-liners.
I'm thinking about looking at the Coursera.org courses.

------
countessa
Learn C - get <http://c.learncodethehardway.org> and work through it.
Seriously, it sounds so simple, but I was in a similar situation to you -
learned a bit of this and a bit of that. Nothing boosted my programming
knowledge like really working with C. It is the basis of so many modern
languages even if just from the syntactical point of view. Plus, learning
manual memory management, pointers etc, even if you never have to do it in
production, is invaluable in just making a better programmer.

------
eragnew
imo, keep asking questions. direct, honest questions can be scary, but they
can be remarkably effective.

also, start learning python and don't stop until you can actually build
something you like. experiment.

------
yashchandra
Before I write my advice, I want you to hear this. "Do not worry about the
fact that you are not finishing your side projects. The idea is to learn and
not necessarily get to the end goal i.e a working app". I am usually in same
boat as you but many of my unfinished side projects have taught me
tremendously. For example, I recently worked on a python program to covert
financial trasactions in OFX format to csv. It taught me how to use lists,
dictionaries in python, file input/output etc. I never finished it actually to
the point where my dream was to release it as open source library and I even
have a git page for it but I moved on. Even then, I learnt a heck of a lot.

"Start Small". But what does that mean really ? It means that focus on a
specific topic and give yourself a task/side project out of it. For example,
"Build a user registration system". Now pick the language/framework etc. You
seem to be using Python/Django already so that could work in your case.

Keep hacking even if not finished. "It is about the journey not the
destination" (cheap attempt at using a favorite quote).

------
Toshio
> Started one or two Django sites, finished neither since I was in over my
> head wanting to implement very complex ideas.

I think this is perhaps the first thing you should approach differently. Begin
with simple projects that you know are within your reach, even if they are
dead simple (make a tic-tac-toe in Django). Completing those projects will
boost your morale so you will stay motivated. Also I would say that you need
to build up your Github account into a professional signature that someone
would look at and see where your interests are, whether you have potential as
an intern / junior dev who may grow to become a good dev, with some coaching
and mentorship. Also, the world is moving towards agile and you are going to
impress a lot of people if your activity on Github shows that you have the
ability to build software in an agile way.

