
Ask HN: Going from programmer to engineer - srverma
Hey HN,<p>Long time lurker. I've finished up enough schooling to become a mediocre programmer. What I mean is I've learned enough C and done enough labs like implementing a paging algorithm or building a socket to be considered a mediocre programmer.<p>I want to take it to the next level though. I have plenty of ideas that I think up of where I'm like "why can't I just write software to do this, it'll be much easier". However, every time I sit down and try to learn MVC or django or iOS to implement my ideas I usually get stuck and flail and call it quits. Kind of a shame, I know, but I need some advice on HOW it's done. What resources or books do you use to go from someone who can do some kinda cool stuff to really cool stuff? I'm looking for that jump from amateur programmer to someone who can build a web app after a good few months.<p>What resources have you used to get there?
======
mcantelon
Maybe start with microframeworks. Something like Flask (Python), Express
(Node.js), or Sinatra (Ruby). Once you get a bit comfortable in them start
using template engines to separate your logic from your presentation. Then
look at adding libraries to support different storage engines, etc.

Using microframeworks, you will basically have to implement a lot of things
from scratch, but you'll end up recognizing the patterns of common web
application development. Knowing these patterns will make it easier to learn
monolithic web frameworks like Django. It'll also motivate you: at some point
having to reinvent every wheel gets old.

Try a lot of things and make lots of mistakes. At some point it'll all just
make sense.

------
NeilSmithline
IMO, find an open source project on Github that you think is cool and is, at
least, partially working. Then eyeball the code, ping others working on the
code, etc... You should be able to find a project that is a good fit.

Because you'd be joining a project with other devs working it, you'll be able
to start with small changes and progress to bigger ones. As you're not the
only dev, you don't need to get the whole thing done, just your little piece.

As the project already exists, you'll be able to look at the code's design and
work with the other devs to learn.

Like you, when I wanted to learn Ruby, I was nervous biting off a big project.
So I worked on the org-ruby gem. I only made a tiny mod to it but that gem is
one of the gems that Github uses. IMO, that's very cool.

You can look at the pull request history for the work I did at
<https://github.com/bdewey/org-ruby/pull/20> \- If you read the interchange I
had with the developer, you'll see that he really helped me understand Ruby,
Rakefiles, and the org-ruby gem.

I imagine that the gem owner spent more time helping me than it would have
taken him to implement what I did, but he seemed happy to help.

When you think you've found a good project, you may want to send the devs the
question you posted here and see what they say. Perhaps they'll be thrilled
about the help, perhaps not. Better to figure it out before you start.

~~~
srverma
Wow - totally forgot about Github, after reading your exchange I think I
certainly have a new avenue to look into now. I know reading about programming
is never a good substitute for actually doing, but seeing other code helps out
tremendously. Thanks!

------
issa
You really can't go wrong here (ish). I recommend picking a language/framework
you are comfortable with and just start building something. PHP, Python, or
whatever. Just dive right in. There is no secret---just try, make mistakes,
learn from them, try again. repeat.

------
brittohalloran
I'm a mechanical engineer who taught myself to code and now I've written a
full-blown web app. I'd recommend jumping right into Rails and building and
breaking stuff, which is how I learned.

On the plus side:

-There's a TON of documentation, resources and help online.

-It's really fast to get started, so you'll get quick wins. This is key for motivation.

-It will slowly introduce MVC to you, but you don't have to build it yourself to get started.

On the minus side:

-There's a lot of 'magic' stuff going on, which can be confusing when you're used to explicit C code.

~~~
srverma
Heh - its funny, I was really unnerved at my last internship where I was using
PHP, it felt so weird with all this abstraction because of my C background but
it felt really nice being able to not worry about to details and let the magic
take over as you stated.

Anyway, when you say Rails, are you talking about RoR, or just plain old Rails
(is there a difference)? The stuff you learn from rails, did it teach you good
software engineering or mostly implementing a specific type of web app?

Thanks for the advice though. Giving this stuff a try now!

~~~
brittohalloran
Yeah Ruby on Rails (same thing).

After building something for a couple months I feel like I have a decent grasp
on MVC, which is the biggest win. I also have a lot better grasp on all the
moving parts of a web app (website) -- how requests are routed, how it
interfaces with the database etc...

------
keyle
Just do your own thing. I wrote a lot of PHP when I was learning 10 years ago.
Because it was PHP everywhere and that's all I had in hands. Do I do a lot of
PHP today? Nope, occasional hacks and quickies, that's it. But from there I
went to actionscript, javascript, C#, Flex / WPF / Silverlight... Touched C,
C++, Haskell, Python, Go... Heck I even have some Haxe on my computer.

Whatever you have in hand, pick it up and do stuff. Pick a language that you
can run easily, debug easily, and that is mature in the sense that whatever
you google for, you will find. Try and pick a project that you are passionate
for and open a github repo and give it your best shot. Try and implement the
same thing in different languages if you think it's fun, or try tackle large
problems with simple solutions that may only work 60% of the time.

Who cares, just do stuff that you can then show. Get an internship anywhere,
stick in for a year or two. Then move on to the next place. Surround yourself
of smart developers. Seek them and see how they think. Not wankers, genuinely
good people. Not only they know their job, but they will love passing on
knowledge. Ask them to review your stuff, bounce ideas, dumb questions,
everything. That's far better than books IMO.

One thing is for sure, I don't learn much from books. Books help when you have
a very gritty issue you feel totally helpless against. But most of the time,
books as thick as bibles will drain you and turn you off and make you call it
quit.

It's a computer, it can do anything. Period.

EDIT: do read books still, watch talks, they greatly open the mind.

~~~
DanWaterworth
> It's a computer, it can do anything. Period.

Anything? I assume you mean it can compute anything, right?

So you could write a computer program that determines whether two distinct
programs do the same thing? Or whether a batch job will ever finish? Or
whether you could substitute the variables in a equation with integers in
order to satisfy it? Or a hundred other tasks that have been proven
impossible?

~~~
keyle
Of course it can't do anything. The computer just hasn't found the person to
tell it how to do it yet.

~~~
prophetjohn
No; the halting problem (etc.) is unsolvable. We're not just waiting for
someone to figure out how to solve it.

------
blaabjerg
How do you get stuck? Are there actual technical or pedagogical barriers, or
do you simply get bogged down in the amount of stuff to learn?

If it's the latter, I think some structure and simple project management could
help. Break down your projects into smaller, more manageable parts that you
can focus on and actually complete before you get stuck.

"Nothing is particularly hard if you divide it into small jobs." \- Henry Ford

~~~
srverma
I think the first part -- what I've learned in school has given me a good
foundation to programming, but I'm not sure how to take functional C
programming and make web apps out of my knowledge.

I've tried reading some tutorials and there is also a ton to learn, but it's
mostly the pedagogy of learning something like MVC. Although, I certainly
agree with what you're saying about dividing. That does help me nudge further
along anytime I attempt these projects.

~~~
dolphenstein
MVC is just a design pattern. Nothing magical. I'm sure you came across many
other patterns whilst learning C programming.

------
ssmc
For me, motivation is key.

I pick something I want to make, and make the feature that provides the most
"bang for my buck" per say.

IE: When I tinker around with my Arduino Uno, I always try to get something to
move first (turn the motors). Huge motivational boost for me. THAN, I figure
out how the heck to get it to talk wirelessly with my laptop.

------
krigath
Stuck learning Objective-C? This should kick you off:
<http://www.youtube.com/watch?v=1Xqn5IHbusA>

65 really simple to follow tutorials, most of which are 6-7 minutes long. He
does tutorials on pretty much everything; from iOS to go kart building.

------
double051
If you find yourself stuck anywhere with MVC or Django or iOS or anything
else, going to <http://stackoverflow.com/> will almost certainly save you time
and frustration.

------
yitchelle
Dude, you will need to jump in, and preserver with it. You said "my ideas I
usually get stuck and flail and call it quits", quitting means that you will
stop learning. As soon as you quit, the game is over. Persistent is one of the
key ingredient to gaining the knowledge.

I think that you should join an open source project that uses the same
framework that you want to learn. There are plenty of projects from github,
source forge, bitbucket, google code etc. That way, you get access to already
code that is working, and able to get some guidance from the folks already
working on the project.

Good luck!

------
aswath87
This is what helped me.

1\. Focus on one simple app, one framework(I'd recommend Django over Rails if
you are new to web development), one reference book
(<http://www.djangobook.com/>). Quick goals and instant gratification helps
when you are starting out. 2\. Reading the relevant chapter(s) of the book
before starting the implementation has worked better for me. 3\. Build the UI
first (use Twitter's Bootstrap to get this done quickly). I am more motivated
when I 'see' the end product.

------
capkutay
Focus and diligence are probably the most important tools to succeed as a
software engineer. Also, having lots of mental stamina is helpful. You read
the tutorial, write code, get stuck, take a break, re-read the docs, write
more code, repeat. Only way to do it...

Possibly collaborate with somebody? Some people work best alone, but pair
programming or working with someone else can help you stay focussed, learn and
teach with others, etc. Good luck!

------
overgryphon
One small step at a time. It doesn't matter what platform, framework or
language, you pick a project and figure out what simple thing you can do to
start.

You make mistakes, fail, backtrack and all of that is necessary to reach your
goal. Amateur or not, everyone gets stuck and flails around for awhile. The
difference between the person who has a few app a few months later and the
person who doesn't is whether they kept going when they got stuck.

------
signalsignal
The best resource is building something you consider useful. Start small and
make it a personal project. Don't even think about making money on it or else
you will destroy the enjoyment of making it. It doesn't have be long term, in
fact it is better if you don't plan on maintaining it but instead build it and
evolve it with every iteration.

------
tonyjwang
I've started and stopped programming, but feel like
<http://www.teamtreehouse.com> has been really helpful. They have lots of
videos to help fill gaps in knowledge, with a bunch on building web apps from
start to finish, including RoR and other languages/frameworks.

------
viscanti
How you deal with the frustration associated with learning programming plays a
huge role in how far you'll go. You can't read a book to learn how to press on
when frustrated. The best engineers that I've ever worked with had an uncanny
ability to motivate themselves through those intense moments of frustration.

~~~
vellum
Marco Arment had a good quote about frustration: "And there will certainly be
hard parts: you’ll get frustrated, go to Google, find some guidance, bang
against it for a while, then finally get it working and experience immense
satisfaction for as long as you can go before hitting the next wall of
frustration. Fortunately, as you get more experienced, you’ll hit those walls
less frequently."

[http://www.marco.org/2011/02/01/how-should-i-get-started-
wit...](http://www.marco.org/2011/02/01/how-should-i-get-started-with-
programming-which)

------
yawniek
its simple: try harder! learning a language is usually much easier than
learning to use a framework efficiently. it just takes time and a lot of
motivation. so its completely normal that you get stuck.

------
jwingy
It's kinda funny, because I often think this way but in the opposite
direction. How the hell does one build a socket anyways? (Yes I will go and
google this now so save your lmgtfy links :))

------
ecto
Buy an Arduino and hack on it! It will open a lot of mental doors for you.

If you're not down with electrical engineering, just start a web project. I've
found the easiest way to learn is to do.

~~~
srverma
I've actually used an arduino before in a robotics class, was loads of fun and
something I enjoyed!

Although, I'm sort of looking into building some web / mobile apps now.

------
yashchandra
You can ask yourself a few questions and get started accordingly. For example,
what languages are you interested in ? PHP ? Python ? Java ? Pick up 1 of
them. Since you mentioned Django,I assume you are working with Python. But
then, play around with at least 2 frameworks. May be try Flask (micro-
framework in Python) which I am falling in love with. Build the same app in
both frameworks. I personally did User management/registration app in both
Django and Flask. Start small. Build layers on top. There is no one way of
course but building a few small apps just for learning will help tremendously.

