DEV Community

Cover image for 7 Ranks of Coderhood: Coder, Programmer, Computer Scientist, Developer, Engineer, Architect

7 Ranks of Coderhood: Coder, Programmer, Computer Scientist, Developer, Engineer, Architect

Lorenzo Pasqualis on November 30, 2017

This post was first published on CoderHood as 7 Ranks of Coderhood: Coder, Programmer, Computer Scientist, Developer, Engineer, Architect. CoderHoo...
Collapse
 
ben profile image
Ben Halpern

I've been reading CoderHood as Coder Hood, as in Coder Neighborhood. But now I feel like it's supposed to be more like livelihood or knighthood, right? If that's the case it may be worth making the H lowercase.

Collapse
 
lpasqualis profile image
Lorenzo Pasqualis

That is correct, and you have a good point. I'll need to think about it. Changing it would be a major pain, but probably worth it... Thank you.

Collapse
 
jess profile image
Jess Lee

for what its worth, I always thought CoderHood was related to knighthood and think the lowercase h would actually make it seem more like Code Neighborhood. πŸ™ƒ

Thread Thread
 
ben profile image
Ben Halpern

Thread Thread
 
lpasqualis profile image
Lorenzo Pasqualis

Ha! I like this interpretation better, Jess! :) :) I think I will (conveniently) follow your instincts ;)

Collapse
 
ben profile image
Ben Halpern

Probably that big a deal, but yeah, I think it could help. The most important thing is the content. XKCD has gotten along just fine without getting trivial naming details just right. πŸ˜„

Thread Thread
 
kayis profile image
K

I watched Black Dynamite lateley so I was thiking about the neighborhood.

But while I read A Song of Ice And Fire I probably would have thought about knighthood.

Thread Thread
 
lpasqualis profile image
Lorenzo Pasqualis

LOL. This discussion reminds me of this quote:

There are only two hard things in Computer Science: cache invalidation and naming things.
-- Phil Karlton.

:)

Collapse
 
kayis profile image
K

Seeing these "levels" I feel I have a bit of every part, but nothing really "full"

I studied CS, but my focus was on usability, and programming techniques and not complexity theory.

I worked as a dev for 10 years now and did a bit of everything while focusing on UIs.

Often I ask myself, how can I grow as a dev and deliver more value, but I find it hard to find and adress problems in my skillset. Often I simply learn a new technology to tell myself "I got better"

Collapse
 
lpasqualis profile image
Lorenzo Pasqualis

Yeah, I can see that. Despite my attempt and dissertation about classifying "ranks linearly," I fully realize that reality, in practice, is a multi-dimensional beast and things are never that simple.

Thank you for taking the time to read!!

Collapse
 
david_j_eddy profile image
David J Eddy

Love the article! I have had a similar discussion with a number of other professionals over the years. If now there was a was to empirically demonstrate a person a strengths and knowledge in order to progress through the ladder...properly and not game the system.

Collapse
 
lpasqualis profile image
Lorenzo Pasqualis

Thank you, David! I think that results (not effort) are what demonstrate strength. Unfortunately, it takes time, but I have not found a better proxy.

Collapse
 
codemouse92 profile image
Jason C. McDonald • Edited

The levels look interesting! I like how you separated the levels of proficiency. This really is a field where we continually improve, and I think the comparison to marshal arts is apt.

However, I take some umbrage with the titles. "Computer scientist", "software engineer", "software architect," and similar suggest that this is a scientific, engineering-based field...and it really isn't.

Building code is nothing like building bridges, and every rule of computer programming is technically one of our own invention. Math and physics affects it, much in the same way math affects music and color science affects painting, but math and physics do not define programming like it does any scientific field. (See The Cake Is A Lie for more detail.)

Meanwhile, hacker is actually tricker territory than I think your article realizes. Removing the illegitimate, media-fueled uses of the word, a Hacker is truly the most skilled of coders. We aren't just come up with kludgy solutions. True "Hackers" write the most efficient algorithms, the cleanest code, and the best functioning software. We come up with unusual solutions, true, but those solutions are elegant, not kludgy. Eric S. Raymond, Linus Torvalds, Alan Kay, Guido Van Rossum, Bjarne Stroustup - these gentlemen are Alpha Hackers, having truly earned the title.

According to hacker culture rules, you cannot even call yourself a Hacker until a Hacker calls you one first. I only recently earned that distinction myself.

Honestly, a Hacker can appear anywhere in this spectrum. I agree we're something of a "street fighter" type - we follow our own credo, and not that of the Big Organized Groups. You can be a Hacker in infosec ("white hat"), in programming, in computer engineering, and in many other branches of the computer industry, but you are either a member of Hacker Culture who has earned the title, or you are not. All others who claim the title are imposters.

Collapse
 
lpasqualis profile image
Lorenzo Pasqualis • Edited

Thank you for your note. However, I am going to respectfully disagree with some of what you said.

Math is made-up by humans, and so is physics. We invented theories and rules to describe and model reality, but math is not "reality," it is only a tool to describe it. Physics is the same thing, a set of rules to describe, study and make sense what we experience.

Many "laws of physics" break down when you change the conditions (like at the sub-atomical level or speed of light), clearly showing how little we know and how those are only approximations.

Computer science is the same thing. It is a set of models to and theorems used to describe characteristics of problems that affect real life. In other words, computer science is a science as much as Math and Physics are sciences.

Collapse
 
codemouse92 profile image
Jason C. McDonald

Well, no, I would not be able to agree at all. Don't confuse the fact that we don't fully grasp math and physics with the idea that they're somehow theoretical, fluid concepts.

Gravity works. It will always work. We can't stop it from working. We just haven't fully comprehended or described how it works.
Similarly, 2+2=4. For all time, those quantities add up in that way, and it is literally impossible to get anything else out of it. You can change the names on the quantities, describe the problem differently, but the principle that addition and the quantities describe is real, has always been, and will always be.

You only described how our understanding of the laws changes and breaks down. The laws themselves are beyond our present grasp, but they're there, complete and unbreakable.

By contrast, we invented every rule of computer science. We decided to use binary for storage (granted, it was the most efficient, but there are other working systems). We wrote assembly code. We decided what instructions a CPU could process. We designed the behaviors and specifications of every single language. The rules, flaws, foibles, and factors of programming are entirely the result of one human-created design piled on top of another.
Thus, it is more akin to an art, such as music or painting, than to building a bridge.

In fact, I'd venture that you'll have a very hard time finding any Founding Fathers of Modern Programming who would equate software to engineering. By way of example, Donald Knuth, Eric Raymond, Alan Kay, Gerald Weinberg, and Fred Brooks have all made these observations before. Programming isn't a science. Trying to cram it into that box is what keeps getting us into trouble.

Thread Thread
 
lpasqualis profile image
Lorenzo Pasqualis • Edited

The vast majority of computer science theory doesn't have much to do with physical computer hardware and programming. A lot of it is the study of problems and algorithms, which is much closer to math than to computers. In other words, it is a theoretical science that can be applied to real problems. That is very all similar to Math and Physics.
You are right that Programming isn't a science, but Computer Science is absolutely a science.
Confusing computer science with programming is similar to confusing math with woodworking.

Thread Thread
 
codemouse92 profile image
Jason C. McDonald • Edited

Well, and I think we can agree there. The trick is, when 99% of people say "computer science," they mean "programming," and that gets really tricky, because it's wrong.

So, in general, I avoid the term "computer science", and separate things out - programming, computer engineering (a branch of engineering, definitely a science), and...whatever you call algorithmic mathematics. (Dangit, I'm two mugs of coffee shy of remembering what you call that.)

Incidentally, "computer science" was itself coined by the ACM with the intention of approaching computer programming as a science, centuries after mathematics first began studying algorithms.

But, bringing the point back around, software architect and software engineering, as well as "computer science" in the context of programming, are...definite misnomers.

Thread Thread
 
lpasqualis profile image
Lorenzo Pasqualis

I covered this in the post, but software engineering is not just about programming. Software architecture is also not just about programming. Programming is part of it, but it is not the same thing.

The terms describe exactly what they describe, and that is not programming.

That's why, in my view, they are levels on a path, like belts in a martial art.

What a black belt can do and understands is not the same as what a yellow belt studies. It is not "more of the same", it is "more and different."

Many people who code can't architect systems. Many people who code also cannot engineer systems. The confusion stems from using programming and those other terms interchangeably. The entire premise of the post is to differentiate between the terms, which mean different things and describe different levels on a path.

Thread Thread
 
codemouse92 profile image
Jason C. McDonald • Edited

To be honest, I hadn't caught that the first time around, but I can see now that's the point your making. And, once again, I would have to disagree. To place them in a continuum would somehow suggest that a programmer must become a "computer scientist" (algorithmic mathematician), and must become a software architect, etc etc, to progress in career.

Yet Donald Knuth, who is regarded as one of the greatest programmers and mathematicians in computer science history wasn't a "systems architect", and yet he was far more skilled in the computer industry than most systems architects ever will be. You'll find the same true of many other greats. Meanwhile, some of those greats do not have degrees in computer science, and quite a few people with CS degrees aren't half as skilled as many peers with no degrees.

So, in short, I'd say that to place these differing fields on the same continuum is missing the point; it's like saying that a sculptor is more advanced than a painter, and therefore a painter must become a sculptor to move up in career. Clearly, that is not the case - painting and sculpting are different, but they are in no way inferior or superior to one another.

But, if you were to stop short of blurring entirely different branches of study into one continuum, and focus purely on one's skill in software development, you'd be onto something.

Thread Thread
 
lpasqualis profile image
Lorenzo Pasqualis • Edited

Programmer is before computer scientist, so no... a programmer does not have to be a computer scientist. At all. In the post I also talked about how many people stop at Programmer, and have fine careers. Sometimes great careers.

I knew that a 3000 words post would not be read completely by lots of people. Oh well.

Thread Thread
 
codemouse92 profile image
Jason C. McDonald

Well, yes, I saw that part. The problem is, if we were to equate this to levels of marshal arts, the problem remains that Donald Knuth, Alan Kay, and many other true black-belts would get relegated to a lower level, below people they can code circles around. See my issue?

Thread Thread
 
lpasqualis profile image
Lorenzo Pasqualis

Martial arts (not marshal).

You don't have to be a black belt in martial arts to kick a win a fight against a black belt. That is a fallacy. There are masters of martial arts in their 90's who don't have a chance against strong and much younger athletes. That's why the analogy works so well.

Lots of people become masters of their niche and don't need to progress past it to have an amazing career. Donald Knuth is a master computer scientist and programmer. I am not sure what is the point you are contending. You call that "true black belt," but what does that mean? In many schools of martial arts, if you don't study certain Katas and other things, it doesn't matter if you are a super strong fighter. To get a new belt you need to master certain skills.

Does he also possess the skills that I described for Software Engineers and Software Architects? If not, then in my book he is not a "black belt," even if he can run circles in programming and computer science theory around people who I define as architects.

Anyway, I think I described a model in the post and I also made it clear that I expect some people to disagree. I am happy to see that I was right on that one at least :)

Thread Thread
 
codemouse92 profile image
Jason C. McDonald

Well, I can appreciate your perspective, even if I don't agree with it.

Collapse
 
djtai profile image
David Taitingfong

If no one has told you yet Lorenzo, we appreciate your posts here. You continue to give us quality posts, sound advice, and easy-to-understand analogies. I'm always appreciative of leaders who can share their wisdom!

Collapse
 
lpasqualis profile image
Lorenzo Pasqualis

Thank you, David. Your note made my day!

Collapse
 
dondenoncourt profile image
Don Denoncourt

Amazing piece. Andy Hunt, in Pragmatic Thinking and Learning, covered the Dreyfus model of skills acquisition to five levels: Novice, Advanced Beginner, Competent, Proficient, and Expert. You have made great improvements over the Dreyfus model and Andy's use of it. I actually have an InfoQ article scheduled to be published where I talk, very briefly, about Dreyfus, and, when I get the article back for last edit, I'm going to add a reference to this piece.

Collapse
 
lpasqualis profile image
Lorenzo Pasqualis

Thank you, Don. I am honored and humbled by your thoughtful note. If you do add a link from your article, please consider linking the original as it helps my SEO and it helps to spread the word about the work I am doing. Looking forward reading your article.
Ho letto nel tuo profilo che hai imparato l'Italiano. Bravissimo! Io sono nato e cresciuto a Firenze, dove ho vissuto per 26 anni. Mi fa piacere vedere che la lingua Italiana e' apprezzata e studiata.

Collapse
 
dondenoncourt profile image
Don Denoncourt

Gracie per tua risposto. Io e mio moglie amato Firenze quando noi visitato li cinque anni fa. Uno domanda per te -- Lascia conosco qualcuno siti de Italiana for tech. Mi piacerebbe a leggere buono articoli in Italiano. Io gia letto multissimo romanzi in Italiano. A proposito, I letto, (in realtΓ , ascolto) in Inglese, due del il libri che te ha consigliato in "11 Books All Software Engineers Must Read" in il ultimo mese.

Collapse
 
xxxandbeer profile image
XXXandBEER • Edited

Or! We can just stick to Junior/Senior/Lead titles. And not make up our own interpretations of words we act like we understand. Ie Hacking is programming... Hackathons. Engineers and Developers are entirely dependent on the company. Most Engineers I know don’t touch a lick of OOP code.

 
lpasqualis profile image
Lorenzo Pasqualis • Edited

About performance, you might find this is interesting:

def trace(&block)
  printf "%8s | %-10s | %-20s | %-15s\n", 'event', 'line', 'id', 'classname'
  printf "%8s-+-%-10s-+-%-20s-+-%-15s\n", '-'*8, '-'*10, '-'*20, '-'*15
  set_trace_func proc { |event, file, line, id, _, classname|
    printf "%8s | %-10d | %-20s | %-15s\n", event, line, id, classname unless ['trace','set_trace_func'].include? id.to_s
  }
  yield
  set_trace_func(nil)
end

puts "Method 1"
trace do
  [1,2,3,4,5].sum
end

puts "\n\n"
puts "Method 2"
trace do
  '1+2+3+4+5'.
      scan(/([-+\/*])?(?:\s*)(\d+)/).
      reduce(0) { |res, (op, num)| res.public_send(op || :+, num.to_i) }
end

Prints:

Method 1
   event | line       | id                   | classname      
---------+------------+----------------------+----------------
    line | 15         |                      |                
  c-call | 15         | sum                  | Array          
c-return | 15         | sum                  | Array          


Method 2
   event | line       | id                   | classname      
---------+------------+----------------------+----------------
    line | 23         |                      |                
  c-call | 22         | scan                 | String         
c-return | 22         | scan                 | String         
  c-call | 23         | reduce               | Enumerable     
  c-call | 23         | each                 | Array          
    line | 23         |                      |                
  c-call | 23         | to_i                 | String         
c-return | 23         | to_i                 | String         
  c-call | 23         | public_send          | Kernel         
  c-call | 23         | +                    | Integer        
c-return | 23         | +                    | Integer        
c-return | 23         | public_send          | Kernel         
    line | 23         |                      |                
  c-call | 23         | to_i                 | String         
c-return | 23         | to_i                 | String         
  c-call | 23         | public_send          | Kernel         
  c-call | 23         | +                    | Integer        
c-return | 23         | +                    | Integer        
c-return | 23         | public_send          | Kernel         
    line | 23         |                      |                
  c-call | 23         | to_i                 | String         
c-return | 23         | to_i                 | String         
  c-call | 23         | public_send          | Kernel         
  c-call | 23         | +                    | Integer        
c-return | 23         | +                    | Integer        
c-return | 23         | public_send          | Kernel         
    line | 23         |                      |                
  c-call | 23         | to_i                 | String         
c-return | 23         | to_i                 | String         
  c-call | 23         | public_send          | Kernel         
  c-call | 23         | +                    | Integer        
c-return | 23         | +                    | Integer        
c-return | 23         | public_send          | Kernel         
    line | 23         |                      |                
  c-call | 23         | to_i                 | String         
c-return | 23         | to_i                 | String         
  c-call | 23         | public_send          | Kernel         
  c-call | 23         | +                    | Integer        
c-return | 23         | +                    | Integer        
c-return | 23         | public_send          | Kernel         
c-return | 23         | each                 | Array          
c-return | 23         | reduce               | Enumerable     
Collapse
 
justinctlam profile image
Justin Lam

This reminds me of how Riot Games organizes their title bands.

engineering.riotgames.com/news/deb...

engineering.riotgames.com/news/deb...

Just FYI. Thanks for the article! Would love to see your perspective on their categorization.

Collapse
 
lpasqualis profile image
Lorenzo Pasqualis

Thank you! I'll need to take a peek.

Collapse
 
lpasqualis profile image
Lorenzo Pasqualis • Edited

As long as it is clear what problem it resolves and the tradeoffs. For example:

  • it resolves the original problem, but it is very slow at doing so.
  • it is a solution for a class of related problems.
  • it does not resolve a general expression problem. For example, if 1+2*3.5-4+5 is to be interpreted as an expression, the correct result is not 10, so the code doesn't solve that problem. (The correct result is 9.)
Collapse
 
menzimanqele profile image
Menzi Manqele

Great read. Love the closing "Serious martial artists study their art all of their life; serious software developers do the same"

Collapse
 
dragonza profile image
My Ngoc Vuong

Thank you for writing this. :) very enjoy the reading. Now I have a clearer look on software engineering.

Collapse
 
peterchaula profile image
Peter Chaula

The hacker way of getting the sum of numbers in an array

eval([1,2,3,4].join('+'))

Collapse
 
janguianof profile image
Jaime Anguiano

the read that made my week : )

Collapse
 
sage_godspeed profile image
Godson Njoku

You forget to add the Tech Enthusiasts level

Collapse
 
lpasqualis profile image
Lorenzo Pasqualis • Edited

Thank you, Njoku. "Tech enthusiast" in my model is not a level; it is a motivation for studying programming. A tech enthusiast could be a beginner, a coder, or any of the other levels, depending on proficiency a skills.

Collapse
 
chrsw profile image
Yung Klopp OnDa Beat

What would a C version of this look like?

Collapse
 
antimidas profile image
Caigan Fuego

has Zaha Hadid worked as a construction worker?

Collapse
 
noornashad profile image
NoorNashad

wow find to much interesting discussion here. performance in computer architecture

Collapse
 
risopito profile image
Risopito

Good day Brothers

I am looking for a good programmer , who can build a software with a very beautiful interface , Write me a message