There is often spirited discussion and debate about the differences between Programmers, Hackers, and Developers. Most descriptions I’ve seen are flawed in at least one serious way, so I wanted to assemble my own—hopefully more accurate—definitions.
- A Programmer is someone who can solve problems by by manipulating computer code. They can have a wide range of skill levels—from just being “ok” with basic scripting to being an absolute sorcerer with any language.
- A Hacker is someone who makes things. In this context, it’s someone who makes things by programming computers. This is the original, and purest definition of the term, i.e., that you have an idea and you “hack” something together to make it work. It also applies to people who modify things to significantly change their functionality, but less so.
- A Developer is a formally trained programmer. They don’t just solve problems or create things, but do so in accordance with a set of design and implementation principles. These include things like performance, maintainability, scale, robustness, and (ideally) security.
In short, all three solve problems using code. Programmer is the umbrella term which means problem solver, a Hacker is the creator/tinkerer, and a Developer is a formally trained programmer who doesn’t just solve problems but does so in a structured and disciplined way likely learned as part of a formal education.
People can be any combination of these. Here’s how they relate to each other (also see the Venn diagram above):
- All hackers and developers are programmers
- Many programmers, and even developers, are not creative enough to be considered hackers
- Many programmers, and even hackers, are not educated or experienced enough to be considered developers
Ideally, one would strive to be all three, i.e., creative enough to be considered a hacker, but with enough formal training and experience to design software rather than simply…well, hacking it together.
But even if you aren’t very creative, and/or lack the education and/or experience to properly build massive applications, you should still be proud to be a programmer. Solving problems using code is a superpower by itself.
- There is a broader type of Hacker which can apply to any field, not just computers. This article specifically deals with the software type.
- A “coder” is basically a synonym for programmer.
- Hacking is often, but not always, associated with poor quality. This is because it usually takes place in a rush of creativity that is best not slowed by the friction of doing things properly. In cases where a hacker is also a developer, or has an eye for design and quality elsewise, they almost inevitably have to come back to their creations afterward and clean them up.
- The determination of who gets called a hacker and who doesn’t is a contentious one. The basic rules that most agree on include 1) that you need to have made one or more things that people find useful, and 2) be recognized as a hacker by other hackers.
- The term “Software Engineer” is nearly synonymous with Developer for these purposes. It means someone who is well-rounded in all aspects of software creation, and not just a few.
- It is possible for someone to have engineer/developer-type skills without formal training, but it is not common.
- In the security world, a hacker also means multiple things. For testers it usually means someone who understands systems and can defeat their security controls. In the top tiers of security, however, the definition returns to its more pure form, i.e. someone who creates security software or tools used by others.
- In popular culture, hacker means computer criminal. Within the security world that type of actor is often referred to as an “attacker”.
- Eric Raymond, a notable programmer and personality in the original computer community, defines a hacker like so, “An intelligent, creative, and open-minded individual who enjoys problem-solving, learning, and the sharing of knowledge above all else.”
- “Software Engineer” is synonymous with Developer. It implies a formal education in the core concepts of software architecture, design, and the requisite pre-education to support it.