Skip to content

Instantly share code, notes, and snippets.

What would you like to do?

Rich Hickey on becoming a better developer

Rich Hickey • 3 years ago

Sorry, I have to disagree with the entire premise here.

A wide variety of experiences might lead to well-roundedness, but not to greatness, nor even goodness. By constantly switching from one thing to another you are always reaching above your comfort zone, yes, but doing so by resetting your skill and knowledge level to zero.

Mastery comes from a combination of at least several of the following:

  • Knowledge
  • Focus
  • Relentless considered practice over a long period of time
  • Detected, recovered-from failures
  • Mentorship by an expert
  • Always working slightly beyond your comfort/ability zone, pushing it ever forward

Imagine your proposal recast:

  • Writing Achievements
  • Learn a variety of languages
  • Experience the ins and outs of various platforms
  • Enhance your understanding of the building blocks that we use as writers
  • Write in the open
  • Teach

These are largely the activities of beginners and students, not practitioners nor masters (or, in the case of teaching/publishing, people who should already be practitioners/masters). N.B. I am not questioning the many benefits of broadening or learning activities, just the premise that they lead to any sort of mastery.

Musicians get better by practice and tackling harder and harder pieces, not by switching instruments or genres, nor by learning more and varied easy pieces. Ditto almost every other specialty inhabited by experts or masters.

One can become a great developer in any general purpose language, in any domain, on any platform. And, most notably for the purposes of this discussion, such a developer can carry that greatness across a change in any of them. What skills then are so universally useful and transportable in software development? Two are:

the ability to acquire knowledge, and the ability to solve problems.

How does one get better at acquiring knowledge and solving problems? Not by acquiring a lot of superficial knowledge nor solving a lot of trivial problems (a la your 'achievements'), but by acquiring ever deeper knowledge and solving ever harder problems.

You should take heed your phrase 'leveling up'. You don't level up by switching games all the time, but by sticking with one long enough to gain advanced skills. And, you need to be careful to recognize the actual game involved. Programming mastery has little to do with languages, paradigms, platforms, building blocks, open source, conferences etc. These things change all the time and are not fundamental. Knowledge acquisition skills allow you to grok them as needed. I'd take a developer (or even non-developer!) with deep knowledge acquisition and problem solving skills over a programmer with a smorgasbord of shallow experiences any day.

Copy link

You might enjoy my book Level Up! How to Become a Great Professional Software Developer.

It is not specific to any language platform or stack but covers techniques and approaches to help you operate at your best and advance as quickly as you can.

Copy link

xpe commented Feb 16, 2015

Here's a big problem: how do you test and verify advice that people give you about getting better? It seems to me that many of us compare advice by (a) how reasonable it sounds to us (b) how impressive the advice-giver seems to us. I think we need to question the degree to which (a) or (b) are strongly correlated to how well the advice will work for you.

Here's another idea: define a goal for yourself and then try to achieve it. If you do this enough times, you may be able to find (but probably not 'prove' in any meaningful sense) which techniques work reasonably well for you.

Put another way, the world is very complicated. Knowledge is contingent. I think that the search for "best practices" is reasonable, but finding broadly applicable answers is certainly not guaranteed.

Copy link

There's a lot of actual psychology research done that confirms at least some of Rich's advice. Here's an example from a researcher named K. Anders Ericsson: The Role of Deliberate Practice in the Acquisition of Expert Performance

Copy link

Personally I am trying to follow: Read, Write, face problems, solve it, think more on it, get better solution??, re-factor old ones, look closely at the business and then again: Read, Write, face problems, solve it, think more on it, get better solution??, re-factor old ones, look closely at the business.....

Never stop learning. That will make me mature.

Copy link

I think a lot of people use "learn lots of languages" as a proxy because there are so many developers who've been repeating their first year for a decade or more.

Learning lots of languages can't really be done in a year, so it indicates a continued and deliberate practice.

I'll admit that harder and harder projects is a fantastic goal, but to follow the music analogy, most musicians practice increasingly difficult existing pieces, they do not invent new music as the majority of their practice.

Perhaps some equivalents would be: make a parser, remake your favorite programming language from scratch, remake Super Mario Brothers in the same memory and drive footprint, remake a relational database, remake a Lisp Machine, remake Datomic, etc.

Copy link

Musicians get better by practice and tackling harder and harder pieces, not by switching instruments or genres, nor by learning more and varied easy pieces. Ditto almost every other specialty inhabited by experts or masters.

I feel the music analogy can also work differenty:

  • Practicing only takes you half the way, you also have to perform live as a musician to really grow. To compare, I'd say it is the same as writing the code version then actually getting it into production.
  • Switching instruments is beneficial as well as you learn more than a single way to think about music. It can also improve the technique, playing the dzembe improves funk-groove playing skill for keyboard players. It is as if you learn your first functional programming language and discover a totally new mindset of approaching the problems.

To be a master, you also need breadth in addition to depth.

Copy link

Sicaine commented Apr 18, 2018

I think both things are important and you shouldn't forget to do one side after you did the other side for a while.

After all you don't stop becoming a software developer when it is your hobby and your job. I can't speak for people who only see it as a job because if it would only be my job, i might not be interested in becoming better and better and better.

Copy link

kthejoker commented Mar 5, 2020

Just leaving some other academic research on the subject of skill acquisition and mastery that (in general) validate Rich's commentary.

Copy link

For context, this is a response to a blog post by Jason Rudolph:
Programming achievements: How to level up as a developer

Copy link

cynici commented Mar 10, 2020

Just came by to share what Peter Norvig wrote 20 years ago, Teach yourself programming in ten years

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment