The 3 Different Tribes of Programmers
Computer Science is a very interesting area of study, because it has nothing to do with computers. And it’s not a science.
There are countless ways to call yourself: a programmer, a developer, software engineer, IT specialist, architect, hacker, data scientist, machine learning engineer, technology “fellow” and even ninja. Although there are some (not so) subtle differences between these terms, in general, they all represent someone who writes some sort of code which runs on some sort of a computer architecture to execute and is expected to return some result.
I believe the division should not be made on ‘front-end developer’ vs ‘back-end developer’ or JavaScript programmer vs GoLang engineer.
The division is much simpler. There are only 3 tribes of developers:
- Mathematicians.
These are the purists of all developers. They care more about the correctness of the program than anything else. And by correctness I don’t mean how correct the requirements are implemented, but how correctly is the code executed. This tribe dominates academia and research. This is where most (if not all) of the features we take for granted are developed. This is where new languages get invented! Since most programming languages are Turing complete, this tribe doesn’t root for a particular language, although functional programming languages might be favoured.Preferred languages: Haskell, LISP
UI: User Interface is of no concern to developers from tribe 1 - System Programmers.
This is the larger group that would include DevOps and some back-end developers. These are the guys that want to be closes to the machine and they understand that code and hardware go hand-in-hand. This is where Linus Travolis and Johnathan Blow are. This is where implementing a solution elegantly trumps theoretical correctness. This tribe usually doesn’t create new languages, but they might create compilers or transpilers to convert code from one existing language to another.Preferred languages: C, Assembly
UI: More important than first tribe, but not as important overall. As long as the system overall is doing what it’s supposed to do, how the user interacts with it comes second hand. Exception here is for the game developers which tend to be in this category, but also (naturally) care for the User Experience - Product Programmers
This is where most software developers are. This is where the most important thing is to create and deliver a product that many people use. The correctness of the program is purely determined by the user experience. Even some known bugs are accepted, considering the proportion of impact they have on the overall system. This tribe is actually further broken down into the following sub-tribes:- General Programmers (Full stack)
You hear this term a lot. These are programmers who can put together a system end to end even though they might not be an expert in any particular domain (such as databases, backend, front-end or devops.
Preferred languages: Ruby, PHP, JavaScript, Python - System Programmers (DevOps)
These guys are the ones that keep the infrastructure alive. They usually work closely with back-end developers or they might overlap with some backend development. Primary task for this tribe is to set up, automate and maintain the infrastructure. These are the guys who will set up the automatic build pipe-line and also the guys you call at 2am if the system goes down.
Preferred languages: Bash, C, Python, Pearl - Back End Programmers
These guys will talk bout scalability, distributed systems, concurrent connections and clustering. They are the ones that create the backbones of the systems and the ones that orchestrate the data flow of a program. The most important thing for this tribe is how much the system can scale. Can it support 100 million gazillion concurrent users? If not, it’s useless.
Preferred languages: Java, JavaScript(NodeJS), GoLang, Ruby, Scala, C# -
Front End Programmers
In this sub-tribe you will find the programmers closest to the end-user. They build UI interfaces, they add themes and they make the functionality that the end-user actually interacts with. These are the guys that will talk about MVVM patters, layouts, UI kits and User Experiences.
Preferred languages: JavaScript (React, Angular, Vuejs), C# (Unity, Hololens), Java (Android), Swift and Objective-C for iOS Development
- General Programmers (Full stack)
I believe a great engineer should be able to move up and down these tribes easily. One such programmer that is always in the spotlight is Alen Kay (XEROX PARC) (https://en.wikipedia.org/wiki/Alan_Kay). He can move up and down through the programming tribes with ease. I encourage everyone reading this to get out of their comfort zone and do things that are completely different. Are you a front-end programmer that is very well versed in the new shiny web-technologies? Try to build a compiler. Are you a CPU architect that spends hours on mathematical proofs that the CPU works as expected? Try to create a (nice) User Interface. You will be surprised how much more you end up learning in the end when you try new things.
So in which tribe do you belong to?