I'm writing up my thoughts on, if not how to be a better developer,
at least how to be more like a developer who thinks like I do. I'll
leave it up to you to decide whether this is a good thing or not.
Rather embarassingly, one of my strongest beliefs is that you can't
make a good developer through paint-by-numbers, despite what I'm doing
here being to create a big piece of paper with numbered regions. I
guess what I'm hoping to produce is a guide for those with the
potential, to help them shortcut the process.
Or, alternatively, I can give up the pretence that it's to help
some hypothetical junior developer, and say it's a braindump of my
worldview, because I'm arrogant. Doesn't really matter, does it?
Anyway, this is quite long, so I'll break it into chunks...
Learning stuff
- Learn from your mistakes Some people have n years of
experience. A lot of people seem to have one year's worth of
experience, repeated over and over. If you don't learn from your
mistakes, it's not going to be much of a career. Learning from
successes is actually a little dangerous - there are often multiple
ways of doing things, and sticking with one that worked ok in the past
may stop you from exploring even better solutions. This is not
suggesting change for change's sake, but be wary of ignoring better
solutions, having found a "good enough" one. With failures, the cause
is often clear.
- Learn from others' mistakes If you only learn from your own
experience, you can only gain one lifetime's worth of experience, at
the rate of one year per year. If you can properly learn from others,
you can learn so much more, and moreover you won't actually have to
spend the time doing it wrong. When someone tells you "don't do it
that way", it's very possible they're wrong (see other rules), but
also that they have some experience or knowledge that you can learn
off.
- Learn who to trust Vociferousness, experience and
intelligence are all impressively unreliable indicators of whether
someone's opinions are trustworthy or useful! Some combination of
coherence and logic to their thoughts, effective domain-specific
experience, empirical evidence and self-knowledge of the speaker might
all be more helpful indicators, but it's difficult to articulate.
Which is a shame, as it's really important to choose the right people
to listen to (and no, "people I agree with" is not a good criterion
unless you want to get stuck in a rut). But you trust me, right?
- Learn outside work This isn't a workaholic "do work at
home" thing. This is just having "learn new stuff" as a hobby,
something you do all the time. Sometimes it's tangential to work,
sometimes it's unrelated, sometimes it's basically work stuff that's
interesting and you don't want to leave it in the office (if there's
nothing at work like that, get a better job). Always keep learning.
- Learn inside work Often, you'll accidentally learn things
as a side effect of doing your job. Learning new stuff should be a big
part of your job. It makes you more effective and more valuable, so
it's a good use of time. Colleagues will often have practical
knowledge that just isn't available in any books. Clearly it's more
useful to learn the generally applicable things, rather than
workplace-specific minutae, but there you go. Part of this is being
very willing to ask questions, even if they sound dumb. Generally, if
you phrase it in terms of wanting to clarify things, to make sure your
inferred model is actually right, it doesn't sound so dumb. Especially
if it reveals that you misunderstood something, or that the person
you're speaking to doesn't really understand it either!
- Learn from the good stuff As well as finding clever people
you trust to learn from, learn from the writings of the best. Find out
what the best books are, and read them. Generally they're written by
the real experts in the fields, and they're well-written, clear,
comprehensive and just awesome. Why would you pick up some "in 24
hours for dummies" book, when you could get a Cormen et al or Hennessy
and Patterson? Once you hit the end of standard textbooks, start
reading the best research papers. Open source gives you the
opportunity to read and learn from high quality code, and I should do
more of that (but choose wisely!). And nowadays, there are online
courses from some really decent academics (although the standard
mostly seems to stay around first year undergrad), and some really
funky research-level blogs. So much to learn.
- Learn hard Read up on how Ben Franklin taught himself
stuff. It's astonishing. If you can even vaguely emulate that... wow.
I'm pretty sure all the above must sound really, really obvious,
but I thought I'd spell it out because there just seem to be so many
people who don't keep learning, and over time just put themselves at a
disadvantage. Nutters.
Posted 2013-04-20.