

10 tips for advancing from a beginner to an intermediate developer - baha_man
http://blogs.techrepublic.com.com/10things/?p=732

======
tptacek
Wow. How amazingly boring. Let's see if I can do better in 4 minutes. No
particular order:

1\. Start and complete small personal projects.

If you don't finish them, they have negative utility for you. It's fine to
start ambitious things, as long as you keep starting and finishing other
things. Momentum matters.

2\. Pick projects that will force you to learn new things.

Graphics. Signal processing. Math. SQL. External hashing. Networking.
Distributed systems. Concurrency. Code generation. Parsing. Natural language.
User interface. You will never run out of things. Don't pigeonhole yourself.

3\. Have some kind of UI toolkit.

Attention matters. It's easier to get attention to your work when people can
play with it. You'll need it anyways. jQuery is a fine answer.

4\. Add a small feature to a favorite open source app.

It'll force you to absorb how the app is designed and built without requiring
you to completely understand it, and it has a payoff (see #1).

5\. Fix a bug in an open source app.

Harder than #4, approximates dealing with bugginess on real teams, where
problems are caused by code you didn't write, builds debugging muscles,
crucial.

6\. Learn enough assembly to know how the stack works.

Even Python programs run off the stack. Helps debugging. Helps you understand
what's "possible", why things are slow and why things are fast. Makes new
languages easier to learn. Assembly is like Latin that way.

7\. Really, really learn GDB (or WinDBG).

Momentum matters. Nothing kills momentum like a 15 minute rebuild cycle just
to get a new printf-debugger. Even Python programs segfault when they get
_really_ interesting.

8\. Read code.

But you knew this, right?

9\. Build a personal library.

This is so important that it's an interview question for me. "What's in
libyou.so?" Builds momentum (that much easier to start the next project).
Gives you something to look at and reflect on. Solves tedious problems with
finality (memory management, data structures), instead of allowing you to blow
them off in future projects.

10\. Learn a profiler.

You don't know how to make code performant until you know ot to generate and
read a profile, and design experiments around them. This is even more
important than unit testing.

~~~
warp
Interesting. I don't have #9. Ofcourse I sometimes re-use code I've written
for previous projects, but mostly by forking and adapting the code for the
task at hand.

~~~
tsally
I find that thinking "could I turn this into a library?" whenever I code
improves the quality of my code dramatically (whether it gets turned into a
library eventually or not). Starting with the goals of quality and reuse is
always a good thing.

