What kind of programmer are you? What kinds of programmer are there?
Are there 'real' vs 'fake' programmers? Is there a difference between a 'developer' and an 'engineer', and if so, what?
Large parts of the software industry seem to focus on stacks (e.g. Java vs PHP), environment (e.g. front end vs. back end) and/or industry/sector (e.g. tech vs. banking).
It might 'feel' right to distinguish PHP programming from Haskell programming. Each of those languages involves differing skills and knowledge. And yet, programmers can work at a very advanced or very basic level within either of those languages.
Or it might 'feel' right to distinguish UI programming from back-end programming. And yet, quite often, common concerns crop up in both: speed of execution, testing, algorithm design, etc.
I wonder whether these divisions truly represent where the real differences in skill and focus lie.
I wonder if our language will evolve in future, to better describe the different kinds of programming and programmers.
My attempt to 'play' with the categories of programmers and come up with some new groupings begins with 'camps'. These are groupings of people who program, independent of their level of 'maturity' (expertise, experience, etc).
Three main camps I see:
Tool users - people who have expertise in some specific field, e.g. biology, medicine, trading, music, whatever - and use programming as a powerful tool to augment/extend their pre-existing expertise.
Tool builders - people who use lower-level languages to create higher-level languages for tool users and/or for other tool builders. This includes people who invent languages, libraries and APIs.
Tool appliers - people who combine some expertise in both the above, in order to create applications which consume tools and are consumed by tool users. This includes various shades and varieties of software professionals - developers (such as myself), engineers, architects, analysts, recruitment agents and many other kinds of specialists.
Across these three groups there are also various levels of maturity, rigour and sophistication, depending on the nature and demands of the work being done and the competency of the practitioner.
I group these into 4 broad levels (which I caveat with a lot of fuzziness between the levels):
- Googling, StackOverflow, forums. Learn-as-you-go. Copy/pasting fragments.
- Applying frameworks and libraries. Consistent approach to structuring applications and code. Unit testing.
- Hand-picking architectural styles, design patterns, algorithms, data structures. Domain modelling. Design and planning up-front, as opposed to just writing code.
- Developing theories, proofs. System-building. New fields of research. Innovation. Pushing the envelope.
In these levels, I place myself somewhere between 2 and 3. Personally my interests lie between 2 and 3, but I could just as well have found opportunities around 1.
One of the coolest aspects of software and computing (in my opinion) is that you can (at least, at the time of writing) achieve personal and professional success at any of these levels. You're not necessarily 'stagnating' by remaining at one level, as long as you are actively working on something useful.
It's possible to stay at level 1 and get very far. For example, building an enormous and profitable online community with millions of users, using simple forum software such as BBCode, patched together with some StackOverflow code.
You could go to level 2 and build a good long-term salaried career, perhaps combined with some specific expertise in a particular industry, community, framework/library, software ecosystem, etc. For example, many advanced .NET developers have stuck with 2 and ended up being hired by Microsoft.
You could go to level 3 and build a career as a problem-solver, again, combining it with some specific expertise. This could lead to working as a niche contractor, running your own consulting business or working up the chain in a larger consulting company, taking a technical leadership role within a business, or simply improving your problem-solving abilities and perhaps publishing books or articles and becoming a 'thought leader' ala Martin Fowler, Mary Poppendiek, etc.
Then there's level 4, the realm of the most passionate, inquisitive, maybe obsessive minds. Theorists, synthesisers, system-builders, innovators. The inventors/discoverers of relational databases and relational theory, or of functional programming or of Reactive programming, etc. I think there's a bit of luck involved here as well, but it could just as well be attributed to an all-consuming obsession that drives certain individuals to invest an amount of time and energy that would be practically guaranteed to yield some kind of new insight, whatever field you did it in.
In summary, I see programming as a layer of human-machine augmentation, which overlays almost every field of human endeavour. Rather than a simple continuum of beginner to master, the space is more like a two-dimensional matrix in which you can choose any point or combination of points to focus on, work within and build knowledge, expertise and wisdom around.
As with many things in life, it's my belief that you get what you put in.
Thanks for reading!