Programming Achievements: How to Level Up as a Developer
Published on Tuesday, August 09, 2011 in betterHow does a good developer become a great developer?
Forget greatness for a moment: How does a decent developer become a good developer?
There is no definitive path from Step 1 to Step n. Heck, it's not even clear what Step n is. And as logically-minded developer types, the lack of a well-defined route can make for a daunting journey from novice to master.
I've spent a fair bit of time over the last few years bumping up against this conundrum. What's next? How do I go from being a good developer to a being really good developer?
What Does Success Look Like?
I do my best work when I have a goal with clear, measurable criteria for success. For example, I want to run a 5-minute mile. Okay. That's easy to measure, and success is well-defined. I can figure out how fast I can run a mile now, and the Web is full of advice and training programs for getting faster. I can choose a training program, work hard, and I can be confident that I'll eventually get where I want to be. And it's so wonderfully measurable that, every week, I'll know just how close I am to my ultimate goal.
But how do you measure whether you've attained the rank of "really good developer?" In short, you can't. That goal, as stated, is too subjective, too vague, and is simply not measurable. So how do we find something that is measurable?
Much like the goal of wanting to run a 5-minute mile, we can start by looking at where we are as a programmer versus where we want to be. What experiences has a 5-minute-mile runner exposed himself to that a 10-minute-mile runner is lacking? What experiences has the master programmer benefited from that the novice programmer is missing? It's the experiences that matter.
We've all had specific experiences that clearly advanced our skills as developers. We've learned a new language that exposed us to a new way of thinking. Or we crafted the perfect design, only to watch it unveil its gross imperfections in the harsh realities of a production environment. And we became better programmers because of it. Some experiences equip you with new techniques. Others expose you to anti-patterns...and allow you to understand why they are anti-patterns. It's these experiences that teach you, that influence your thought process, that influence your approach to problems, that improve your designs. And conveniently, it's simple to measure whether you've gained a particular experience. (It might be fun to think of them as achievements.)
So it took a while, but I'm becoming more comfortable with the immeasurability of my pending goal: earning the rank of "really good developer." If such a developer earns this distinction because of his experiences, then maybe we can still have a well-defined path marching in the general direction of "really good developer" and beyond. I suspect that path looks something like this:
- Identify the experiences that advance a person as a developer.
- Select a particular experience to pursue.
- Pursue that experience to completion. (Achievement unlocked!)
- Reflect on that experience. Really soak it in. [A]
- Return to Step 2, this time selecting a new experience.
And what better way to get started with Step 1 than to crowdsource it? Here's a first cut at a list of programming achievements, loosely organized into groups. [B] I'll offer multiple ways for you to chime in with your thoughts at the end.
Achievements

Learn a variety of programming paradigms:
- Write a program in assembly language
- Write an application in a functional language
- Write an application in an object-oriented language
- Write an application in a prototype-based language
- Write an application in a logic programming language
- Write an application using the Actor model
- Write an application in Forth [C]
Experience the ins and outs of programming for different platforms:
- Write a nontrivial web app
- Write a nontrivial desktop app
- Write a nontrivial mobile app
- Write an embedded app
- Write a realtime system
Enhance your understanding of the building blocks that we use as developers:
- Write a networking client (e.g., HTTP, FTP)
- Write a device driver
- Write a B-tree database
- Wrap an existing library to provide a better (more pleasant) user experience
- Write an application or framework that provides a plugin model
- Write a testing framework
- Write a programming language
Enlighten yourself with koans, katas, and the wisdom of ages:
- Complete five code katas
- Complete the programming koans for a language that you want to learn
- Attend a code retreat
- Read SICP and complete all the exercises
Program in the open:
- Contribute to an open source project
- Have a patch accepted
- Earn commit rights on a significant open source project
- Publish an open source project
- Perform a Refactotum of an open source project
Learn by teaching others [D]:
- Present a lightning talk
- Present at a local user group
- Present at a conference
- Deliver a training course
- Publish a tutorial
- Publish a constructive code review of an open source project
- Write a programming book
About the Achievements
Now, let's go meta for a moment. Note that each of these achievements is measurable. Each one is Boolean: you've either completed it or you haven't. For example, it's hard to measure whether you've learned a functional language, but it's easy to know whether you've written an app in a functional language. The latter is observable. Measurable. Boolean. This measurability applies, quite intentionally, to all of these achievements.
Admittedly, the measurability isn't perfect. Consider the achievement of presenting at a conference: you could certainly do a half-assed job just to say you've earned this achievement. But if you're reading this post, I assume you want to be excellent. You know that it's lame to phone it in just to cross an item off the list.
Since We're Talking About Improvement ...
Since we're talking about improvement, what would you change about this list?
The list is available as a gist on GitHub. Feel free to fork it and add more achievements. (Make sure they're measurable.)
Or, fork it and mark off the achievements you've already conquered. You might even flag the one that you're currently working on. (For example, check out these forks from Justin Blake, Pierre Chapuis, and Yann Esposito.) [E]
Or just sound off in the comments: What experiences have made you a better developer? And what achievement will you unlock next?
Notes
[A] I can't emphasize Step 4 enough. To get the most out of each achievement, you owe it to yourself to pause and reflect on the experience before you move on to the next one. Introspect. Ask yourself what you learned. Take the time to write down those thoughts. And even better still, share them with someone else and see how your learnings compare to other people who've also earned this achievement.
[B] It's interesting to see some aspect of this achievement-based model at work on coderwall.com.
[C] Forth is essentially its own paradigm.
[D] This quote comes to mind: "Whoever teaches learns in the act of teaching ..." — Paulo Freire
[E] Nathan Hwang has developed and open sourced a tool for visualizing and tracking your journey through these achievements.
Updated 8/9/2011 4:32pm UTC - Added links to example forks of the achievement list.
Updated 11/27/2011 8:10pm UTC - Added links to Nathan Hwang's contributions.
--
Thanks to Michael Parenteau for providing the artwork for this post.
Thanks to Michael Nygard, Glenn Vanderburg, Alan Dipert, and Vojtech Rinik for providing feedback on drafts of this post.
Archive
Now that you've whetted your appetite with the most recent post, perhaps you'd care to dig into the archive.
- Helpful Resources For Upgrading to Rails 3.1 Published on Monday, June 06, 2011
- Now Available: Getting Started with Grails, Second Edition Published on Monday, February 08, 2010
- Live JavaScript TDD Action Coming to raleigh.rb Published on Wednesday, July 15, 2009
- Git Up! 10 Reasons to Upgrade Your Old Git Installation Published on Wednesday, May 27, 2009
- RailsConf 2009: JavaScript Testing in Rails Projects. No, Seriously! Published on Tuesday, March 24, 2009
- Developer Day: Evolving Your Git Workflow, and Much More Published on Thursday, March 12, 2009
- Git Tip: How to "Merge" Specific Files from Another Branch Published on Wednesday, February 25, 2009
- TextMate Oldie But Goodie Wrap-up Published on Tuesday, December 02, 2008
- Grails vs. Rails: Are we seriously still talking about this?! Published on Tuesday, November 18, 2008
- A Month of TextMate Productivity Tips Published on Tuesday, November 04, 2008
- Testing Anti-Patterns Potpourri - Quotes, Resources, and Collective Wisdom Published on Tuesday, October 07, 2008
- Audio, Video, Slides: How to Fail With 100% Test Coverage at raleigh.rb Published on Tuesday, September 09, 2008
- Grails Presentations Open Sourced on GitHub Published on Wednesday, September 03, 2008
- Testing Anti-Patterns: Invisible Code Published on Monday, August 18, 2008
- Testing Anti-Patterns: The Ugly Mirror Published on Wednesday, July 30, 2008
- Noteworthy Nonsense - July 25, 2008 Published on Friday, July 25, 2008
- iPhone App Store Now Live Published on Thursday, July 10, 2008
- Testing Anti-Patterns: Underspecification Published on Tuesday, July 08, 2008
- 5 Resources for Getting Up to Speed on Rails 2.1 Published on Tuesday, July 08, 2008
- Testing Anti-Patterns: Overspecification Published on Tuesday, July 01, 2008
- Testing Anti-Patterns: Incidental Coverage Published on Tuesday, June 17, 2008
- A Brief Discussion of Code Coverage Types Published on Tuesday, June 10, 2008
- Book Review: Rails Security Audit Published on Thursday, May 29, 2008
- Video: Grails Presentation at QCon San Francisco Published on Tuesday, May 20, 2008
- What's Under Your Monitor? Published on Friday, April 25, 2008
- git init: Say Hello to Agility Published on Tuesday, April 22, 2008
- history meme Published on Wednesday, April 16, 2008
- Noteworthy Nonsense - April 4, 2008 Published on Friday, April 04, 2008
- Interview at Groovy Zone Published on Thursday, April 03, 2008
- Getting Started with Grails: The Jasper Reports "Expansion Pack" Published on Wednesday, April 02, 2008
- Noteworthy Nonsense - March 18, 2008 Published on Tuesday, March 18, 2008
- Manning up: TextMate Meets Man Pages Published on Friday, March 14, 2008
- High Marks for Refactotum 2GX; Next Stop RailsConf Published on Friday, March 14, 2008
- Noteworthy Nonsense - March 9, 2008 Published on Sunday, March 09, 2008
- Lightning Talks at Tonight's Agile RTP Meetup Published on Monday, March 03, 2008
- Groovy Recipes: Greasing the Wheels of Java Published on Wednesday, February 27, 2008
- Getting Started with Grails: The Acegi "Expansion Pack" Published on Tuesday, February 26, 2008
- Refactotum: 2GX Edition Published on Sunday, February 24, 2008
- test/spec/rails => You Bettuh Recognize Published on Friday, February 08, 2008
- Grails Goes 1.0 Published on Tuesday, February 05, 2008
- Podcast Interview with aboutGroovy.com: The Sequel Published on Monday, February 04, 2008
- Programming Groovy: Metaprogramming No Longer an Afterthought Published on Saturday, January 19, 2008
- 2GX - Next-Gen Java Conference Is Right Around the Corner Published on Thursday, December 20, 2007
- Getting Started with Grails: Now Available in Chinese Published on Sunday, December 16, 2007
- Making acts_as_solr Act As Deployable Published on Monday, November 26, 2007
- Relevance is Hiring! Published on Saturday, November 03, 2007
- RubyConf.new('2007').observe(:order => :random) Published on Friday, November 02, 2007
- Evan Phoenix on Testing Private Methods in Ruby Published on Friday, November 02, 2007
- Web 2.0 Meetup in NYC Tonight: The Prophecy of Grails Published on Monday, October 22, 2007
- First International Grails eXchange is Underway Published on Wednesday, October 17, 2007
- EJB3 Domain Classes Presentation at Grails eXchange: Slides, Sample Code, & Rampant Agnosticism Published on Monday, October 15, 2007
- Slides from Northern Virginia Java Users Group Presentation Published on Thursday, October 11, 2007
- Streamlined 0.9 Released - Stop banging rocks together and build something! Published on Thursday, September 13, 2007
- Interview with WebDevRadio Published on Tuesday, September 11, 2007
- Grails 0.6 Released, Brings New Flow to Grails Development Published on Sunday, September 02, 2007
- Tonight at Agile RTP: Matthew Bass on "Chaotic Agility" Published on Tuesday, August 07, 2007
- Joining Relevance Published on Wednesday, August 01, 2007
- Grokking GORM - Part 3: Pimp My EJBs Published on Sunday, July 22, 2007
- Grokking GORM - Part 2: No Schema Left Behind Published on Saturday, July 21, 2007
- Grokking GORM - Part 1: Conventional Thinking Published on Friday, July 20, 2007
- Groovy 1.1-beta-2 Released, Introduces Joint Compiler for Java & Groovy! Published on Thursday, July 05, 2007
- Streamlining Your Way to Rails Published on Sunday, June 24, 2007
- InfoQ Review: Groovy in Action Published on Wednesday, June 13, 2007
- Upcoming Grails Presentation at the RTP JUG Published on Tuesday, June 12, 2007
- Slides from Princeton Java Users Group Presentation Published on Thursday, June 07, 2007
- Groovy + Grails Double-Header at Princeton JUG Published on Wednesday, May 30, 2007
- GSwG Source Code Now Updated for Grails 0.5 Published on Saturday, May 19, 2007
- JavaOne Day 4, Part 2: You don't have to go home, but... Published on Sunday, May 13, 2007
- JavaOne Day 4, Part 1: Where Do Standards Come From? Published on Sunday, May 13, 2007
- JavaOne Day 3, Part 2: Groove On! Published on Saturday, May 12, 2007
- JavaOne Day 3, Part 1: Mash-up your languages, Mash-up your web apps Published on Friday, May 11, 2007
- JavaOne Day 2, Part 3: Solutions for Sanity Published on Friday, May 11, 2007
- JavaOne Day 2, Part 2: An Afternoon of Rich UIs Published on Thursday, May 10, 2007
- JavaOne Day 2, Part 1: Breakfast of Champions Published on Thursday, May 10, 2007
- JavaOne Day 1: java.util.Random Observations Published on Wednesday, May 09, 2007
- JavaFX Mobile = iPhone - Cool Published on Wednesday, May 09, 2007
- JavaOne Day 0: San Francisco Gets Groovy Published on Tuesday, May 08, 2007
- JavaOne Preloaded: A Groovy/Grails Special Event Published on Tuesday, May 01, 2007
- Grails 0.5 Shipped: The Cup Overfloweth! Published on Tuesday, May 01, 2007
- Groovy 1.1-beta-1 Released - Takes Java Integration to the Next Level Published on Monday, April 30, 2007
- Slides from Virginia Java User Group Presentations Published on Wednesday, March 21, 2007
- Virginia Double Header: Upcoming Grails Presentations in Norfolk and Richmond Published on Wednesday, March 14, 2007
- Getting *Updated* with Grails - Updated Source Code Available for Grails 0.4.2 Published on Tuesday, March 13, 2007
- Grails Is on the Move Published on Monday, March 12, 2007
- Tag! Here Goes... Published on Monday, March 05, 2007
- Grails eXchange 2007 - Coming to a London Near You Published on Saturday, March 03, 2007
- Slides from Charlotte Java User Group Presentation Published on Thursday, February 22, 2007
- Upcoming Grails Presentation at Charlotte JUG Published on Wednesday, February 14, 2007
- Podcast Interview with aboutGroovy.com Published on Wednesday, February 14, 2007
- ExpandoMetaClass Teaches an Old Dog New Tricks Published on Friday, February 02, 2007
- Major UK Brand Launches Grails-based Site Published on Thursday, February 01, 2007
- Grails 0.4 Hits the Street Published on Wednesday, January 31, 2007
- Slides from Philadelphia Spring Users Group Presentation Published on Wednesday, January 24, 2007
- Just Released: Getting Started with Grails Published on Wednesday, January 17, 2007
- Upcoming Grails Presentation in Philadelphia Published on Friday, January 12, 2007
- Out of the Box Grails + JEE Integration Published on Monday, December 18, 2006
- Podcast Interview: Grails 0.3 Release, Upcoming Book, and More Published on Friday, November 17, 2006
- Getting Groovy with TextMate Published on Thursday, November 02, 2006
- Screencast: From Zero to Grails in Under 4 Minutes Published on Sunday, September 17, 2006
- Java Posse Recommends Grails + EJB3 Article Published on Sunday, September 10, 2006
- Grails + EJB3 Article on InfoQ Published on Tuesday, August 22, 2006
- Podcast Discusses Legacy DB Support in Grails Published on Monday, August 14, 2006
- Hoisting Grails to Your Legacy DB Published on Tuesday, June 20, 2006
