whoisjoe.com

My name is Joe Basirico, I help people build secure software. Learn more »

So you want to be a better programmer

6/14/2017 - Posted by joe


Artem Sapegin
I get asked sometimes how some people on my team can become a better programmer. I think it's useful to think in terms of different evolutions of the programmer. In the beginning there's a scripter or coder and at the highest level you have an architect. There is much, much more to go into here, but this is a rough framework to plot your skills over time.

Use this to fill in your current skills and to identify key areas of improvement.

http://sijinjoseph.com/programmer-competency-matrix/

Progression from Scripting to Developing

Move from "scripting" to "programming" to "developing"

Coder

  • Coders understand how to solve immediate problems in a sometimes brute force way. Question -> Google -> StackOverflow -> Copy -> Paste is a standard method of development and problem solving.
  • Lack algorithms or data structures understanding well enough to know when there may be an efficient solution to the problem
  • Develop primarily in a text editor
  • Write code -> compile -> fix compiler errors -> run -> fix runtime errors -> repeat
  • Struggles to estimate coding projects larger than one month

Programmer

  • Understands their IDE can use it for debugging
  • Understands basic Algorithms and Data Structures
  • Breaks problems into reusable parts
  • Is comfortable with their programming language and the common libraries and frameworks
  • Googling is still common, compiler errors are less frequent, runtime errors are less frequent
  • Can break problems down to estimate more effectively

Developer

  • Fluent with their IDE and all features
  • Understand all features and components of the software (from DB, to unit tests, to OS, etc.)
  • Knows multiple languages and when to do different things in different areas (for example when it's best to let the database handle something vs. code)
  • Understands Advanced algorithms and data structures
  • Deeply understands language constructs, libraries and frameworks they're using. Understands The Law of Leaky Abstractions.
  • Understands performance tradeoffs
  • Can reliably create time estimates, and track progress toward them

Architect

  • Knows when to use different systems for best performance/security/logic
  • Sophisticated knowledge of data structures and algorithms including space and time complexity analysis

Books to read: