We have been asked many times to define the differences between Senior and Junior programmers. While there is no exact answer, this blog post attempts to clarify what we look for when hiring developers at different levels.
The labels “Senior” and “Junior” are difficult to comprehend as they can sometimes be bestowed on the same developer depending upon the context of assessment. A developer may be considered “senior” with respect to the .NET development platform while at the same time be considered “junior” at HTML5 and some of the more recent related technologies. Experience clearly plays an important role in working with multiple technologies as well. Developers who may intrinsically understand the internal nuances of a complex platform like J2EE may be lacking the full practical experience that only comes from using multiple versions of the language and migrating from one to another. In some cases, a developer who is knowledgeable about topics in great depth may actually lack the full breadth of experience. This latter experience augments the deep knowledge of more specific facets since the entire evolution of one part of that language may be a reaction to a shortfall or persistent problem a previous version had. Such context-specific assessments require those who assess developers to remain somewhat flexible in their own judgments concerning experience vs theoretical knowledge. Both help a developer get the whole picture of each language or platform.
Of course, the differences could be explained with a bit of humor. The following diagram helps non-developers understand the differences in mind-sets between the two groups.
To begin to place some formal constraints around the differences, the descriptions can be summarized as follows:
Junior developers are still acquiring many of the skills their senior counterparts possess. The reality is that the senior programmers only achieve the extra skills through experience and perseverance. Many of the skills cannot be taught in a classroom as real life experience is required to guide the developers knowledge bases. Junior programmers are often given tasks to do, but are seldom handed projects. A task takes no longer than a couple of weeks overall and often is not delivered as a customer-ready deliverable. The junior programmers often do not gather requirements and in many cases are not provided the details of “why” they are doing a certain task. They typically do not talk to customers or if they do, the interactions are often very limited. A junior programmer will not feel comfortable training other developers nor will they lead teams. They often need reviews from senior developers. On version control systems, an administrator will not provide the credentials or bestow the rights to “destroy” code or projects and are not permitted to over-write the work of others. They typically dream of working on bigger projects and are well situated to handling smaller tasks but cannot provide customer-ready solutions to business problems.
By contrast, a senior developer is given projects to do as opposed to tasks. Some projects can last up to 6 months and require the senior developer to gather requirements. They often will be part of the team that talks to customers directly and will develop “solutions” to those problems and explain their ideas to the customer. Senior programmers tutor juniors and provide paths for juniors to keep acquiring new knowledge. A senior developer will usually have “destroy” rights on version control systems and uses them to help others learn the errors of their ways. The senior developer dreams of designing, not coding but hacks all the time.
The following chart outlines some other fundamental differences we typically use to delineate a senior programmer from their junior counterparts.
 
The labels “Senior” and “Junior” are difficult to comprehend as they can sometimes be bestowed on the same developer depending upon the context of assessment. A developer may be considered “senior” with respect to the .NET development platform while at the same time be considered “junior” at HTML5 and some of the more recent related technologies. Experience clearly plays an important role in working with multiple technologies as well. Developers who may intrinsically understand the internal nuances of a complex platform like J2EE may be lacking the full practical experience that only comes from using multiple versions of the language and migrating from one to another. In some cases, a developer who is knowledgeable about topics in great depth may actually lack the full breadth of experience. This latter experience augments the deep knowledge of more specific facets since the entire evolution of one part of that language may be a reaction to a shortfall or persistent problem a previous version had. Such context-specific assessments require those who assess developers to remain somewhat flexible in their own judgments concerning experience vs theoretical knowledge. Both help a developer get the whole picture of each language or platform.
Of course, the differences could be explained with a bit of humor. The following diagram helps non-developers understand the differences in mind-sets between the two groups.
To begin to place some formal constraints around the differences, the descriptions can be summarized as follows:
Junior developers are still acquiring many of the skills their senior counterparts possess. The reality is that the senior programmers only achieve the extra skills through experience and perseverance. Many of the skills cannot be taught in a classroom as real life experience is required to guide the developers knowledge bases. Junior programmers are often given tasks to do, but are seldom handed projects. A task takes no longer than a couple of weeks overall and often is not delivered as a customer-ready deliverable. The junior programmers often do not gather requirements and in many cases are not provided the details of “why” they are doing a certain task. They typically do not talk to customers or if they do, the interactions are often very limited. A junior programmer will not feel comfortable training other developers nor will they lead teams. They often need reviews from senior developers. On version control systems, an administrator will not provide the credentials or bestow the rights to “destroy” code or projects and are not permitted to over-write the work of others. They typically dream of working on bigger projects and are well situated to handling smaller tasks but cannot provide customer-ready solutions to business problems.
By contrast, a senior developer is given projects to do as opposed to tasks. Some projects can last up to 6 months and require the senior developer to gather requirements. They often will be part of the team that talks to customers directly and will develop “solutions” to those problems and explain their ideas to the customer. Senior programmers tutor juniors and provide paths for juniors to keep acquiring new knowledge. A senior developer will usually have “destroy” rights on version control systems and uses them to help others learn the errors of their ways. The senior developer dreams of designing, not coding but hacks all the time.
The following chart outlines some other fundamental differences we typically use to delineate a senior programmer from their junior counterparts.
Task 
 | 
  
Junior 
 | 
  
Senior 
 | 
 
Codes
  up a given library 
 | 
  
Yes,
  task does not require knowledge of entire application.  When given the task, the API will be
  constrained and specified.  All work
  will be to ensure the library works as intended. 
 | 
  
Yes
  but can also engineer the library. This means defining the API and parameter
  list, understand what classes or libraries may call it and how it has to be
  architected (static classes? 
  Prototypes with concrete classes inheriting?  Method signatures?) 
 | 
 
Understands
  the method signatures 
 | 
  
No
  – is only proved with the specification and the API signature. 
 | 
  
Yes,
  additionally, the senior developer can architect the class to accept multiple
  parameters and figures out the correct order, data types and tests. 
 | 
 
UML 
 | 
  
Junior
  Developers are not required to interpret UML of an entire system 
 | 
  
Senior
  developer must understand the system architecture.  In addition to the class function, needs to
  understand the class relationships and methods. Typically uses class new
  diagrams, sequence diagrams and use case diagrams as well as other similar
  artifacts. 
 | 
 
Class
  methods 
 | 
  
Juniors
  usually scope everything to private. 
 | 
  
Can
  determine how to mutate the access modifier to public, private, protected etc.
  based on class use and function. Understands the rationale behind the
  decisions. 
 | 
 
Knows
  when to develop simple API’s vs complete web services 
 | 
  
No 
 | 
  
Yes 
 | 
 
Data
  types 
 | 
  
Does
  not understand which data type to use if not told.  Does not differentiate big endian vs.
  little endian types. 
 | 
  
Can
  study a system and determine which data types are optimal for each API call. 
 | 
 
Multi-thread
  experience 
 | 
  
Basic
  – understands the concepts. 
 | 
  
Advanced
  – uses keywords like “volatile” to denote variable uses when multiple threads
  may be trying to mutate values concurrently and knows how to mitigate these
  scenarios. 
 | 
 
Multi-thread
  experience 
 | 
  
Does
  not understand thread controllers 
 | 
  
Uses
  thread controllers to ensure optimal operations for all class instances. Can
  take advantage of multi-core processors. 
 | 
 
Abstract
  vs Concrete 
 | 
  
Basic
  knowledge, often tries to implement abstract classes resulting in errors. 
 | 
  
Understands
  when to prescribe abstract classes as prototypes and how to create concrete
  classes that may be instantiated based on the abstract classes. 
 | 
 
Naming
  conventions 
 | 
  
Basic 
 | 
  
Ensures
  consistent naming conventions are used throughout a project.  Will flag the project if it is apparent
  that no one else has specified this vs the Jr. Developer who will not see the
  need. 
 | 
 
Unit
  Testing 
 | 
  
Has
  some UT skills.  Occasionally writes
  test is not too busy. 
 | 
  
Uses
  Test-driven development and is a strict user of unit testing to ensure code
  can survive a code audit. 
 | 
 
Frameworks 
 | 
  
Has
  experience on one or two 
 | 
  
Can
  decide which framework/version to use based on functional requirements.  Knows how each one performs, where
  strengths/weaknesses are in each framework 
 | 
 
Localization 
 | 
  
No
  – often hard codes values and binds them to buttons, frames etc 
 | 
  
Yes
  – knows that any long lasting system requires localization and knows it is
  easier to do it once at the beginning of the project than trying to reverse
  engineer it in later. 
 | 
 
Architecture 
 | 
  
Can
  understand some drawing/specifications but needs to have a source of
  knowledge to ask questions 
 | 
  
Reads
  UML like their native spoken language. 
  Comfortable interpreting UML into code. 
 | 
 
Architecture
  process 
 | 
  
Codes
  first to get a head start. Can only be given tasks and not projects 
 | 
  
Does
  architecture first properly to ensure the system will work as required.  Can be given entire projects and will write
  any missing architecture docs to ensure others have documentation. 
 | 
 
Documentation 
 | 
  
Does
  not write 
 | 
  
Knows
  it must be written and ensures it is done along the way. 
 | 
 
Durability 
 | 
  
Writes
  code. 
 | 
  
Writes
  code to be maintainable over time. 
 | 
 
Problems 
 | 
  
Brings
  problems to Sr. programmers 
 | 
  
Finds
  solutions to problems 
 | 
 
Estimates 
 | 
  
Guesses.  Cannot envision all code in their head
  without writing some so cannot be accurate in estimates.  When given, estimates are often provided in
  < 1 hour 
 | 
  
Can
  estimate a complete project, Designs complete code in mind before starting to
  code in order to provide a realistic estimate.  Estimates take at least one week and asks
  many questions to ensure complete understanding of requirements. 
 | 
 
Motivation 
 | 
  
Needs
  to be motivated 
 | 
  
Knows
  how to motivate other coders to complete the project and produce quality
  code. 
 | 
 
Vision 
 | 
  
Only
  sees what is in front of eyes 
 | 
  
Can
  foresee problems others do not yet see and knows the best ways to eliminate
  them.  This work is often unrewarded as
  the product owner often thinks the problem never was, does not appreciate the
  Sr. Coders work in avoiding it all together. 
 | 
 
Coding 
 | 
  
Thinks
  users will only use the software as intended. 
  Writes code, discovers problems, fixes code, repeats multiple times. 
 | 
  
Knows
  users will abuse the software and use it for other things.  Ensures components will gracefully fail
  without bringing down the entire system. Eliminates points of failure. 
 | 
 
Knowledge 
 | 
  
Asks
  “what is the difference between junior and senior developers?”, assumes they
  are senior and forges ahead in the wrong direction.  Naïve and optimistic. 
 | 
  
Knows
  the difference but does not rub in in others faces.  Tries to help junior programmers.
  Humble.  Has scars from many IT
  projects. 
 | 
 
Optimizations 
 | 
  
Will
  often write code once and deliver it to project code base. 
 | 
  
Will
  try to write code in more than one manner to determine which code runs best
  and will then optimize it for the solution requirements. 
 | 
 

No comments:
Post a Comment
Do not spam this blog! Google and Yahoo DO NOT follow comment links for SEO. If you post an unrelated link advertising a company or service, you will be reported immediately for spam and your link deleted within 30 minutes. If you want to sponsor a post, please let us know by reaching out to duane dot nickull at gmail dot com.