During the hiring process companies expect to fill certain level of expertise slot and productivity requirements in a cost-efficient manner. Simply saying, they are not willing to pay expert level salary for junior level job.

Employee is also required to evaluate his proficiency level to apply for a job in efficient manner. Attending interview for positions where required skillset is out of reach is just a waste of time.

That’s why it’s easier to incorporate job titles and say: “We are looking for junior/middle/senior iOS developer!”. But what does it mean exactly? What skills or competences should one acquire to become middle or senior?

Is there even a standard?

Modern software development has fast evolution pace. Even though it is still based on the principles invented decades ago, it is easy to lose track on what’s going on just by taking long vacation.

Industry requirements are changing. To be competitive on the market, employee has to know growing amount of frameworks and technologies. This rapid growth of the field makes it nearly impossible to form any concrete skillset required for certain level of expertise. CV keywords standardisation will not be efficient.

Adding perceived level of tech stack understanding will not work either. I interviewed people who were one of the brightest developers and their self esteem was low, and also people who’s knowledge was far below modest, but they were thinking themselves as top level experts.

Honestly, I don’t think that there is one reliable way to make a match between company and employee in efficient manner. If you know it - please, share it with me (my Twitter is @fewlinesofcode).

Job titles are not transferrable from company to company

At work I have not only to write code, but also do a team leading. Hiring process is a big part of it.

I view my team as a community with cumulative skillset. Before hiring new teammate I must answer a lot of questions. There are four of them related to this article:

  • What kind of expertise are we lacking? (Concrete tech stack)
  • What budget do we have for that? (Can we afford to hire more experienced people?)
  • What kind of person will fit the team? (Will this person be comfortable doing what we expect?)
  • What is the expertise level we require?

With tech stack it’s easy. It is solved by correct key-wording in job description.

Latter three requires to identify proficiency level we need/can afford.

To answer them I use “Five-Stage Model of Adult Skill Acquisition” by Stuart E. Dreyfus.

In a nutshell this model breaks down individual’s skill level to 5 stages:

Skill Level

  1. Novice
  2. Advanced beginner
  3. Competent
  4. Proficient
  5. Expert

Below is my (opinion biased) understanding of this model applied to software development team.


Follows the rules.

Person is able to perform programming tasks when provided with explanation what and how to do.

Example of the task (very far fetched :]):

Build network call method for X using Y as a reference, but change param A to B and add param C

Novice need support. Usually dedicated person who will provide answers, guidance explanation of reasons why things are done in certain way.

Advanced beginner

Recognises patterns.

When Novice has some experience on performing work defined by rule-based context, she will build an intuition on patterns emerging in the code base, work environment e.t.c. At this moment person is able to solve problems in specific domain she has experience with and efficiently collect missing bits of information from teammates.

Tasks formulation should contain references.


Choses a perspective.

The most stressful level. Competent person is able not only to follow the reference, but recognise and to be keen to certain solutions. Usually at this stage one knows few different angles of attack on particular problem, but has no enough experience to chose the best one (in her opinion). This causes doubts and stress.

Tasks should be formulated as a problem and limitations. Tasks may contain proposals of possible solution, but, and it’s crucial, should leave a room for investigation and encouragement to propose own solutions in existing realm. Basically, at this moment person is able to implement variety of features using established architecture and dev standards provided by the team.


Responds to the situation.

Proficient performer sees what needs to be done but decides how to do it based on previous experience. Most effort is devoted to make a correct choice by comparing alternatives based on situation. What pattern to use? Should I go with solution A or B? Will it be wiser to use this or that?

At this moment person can perform efficiently when provided with high level problem description and be responsible for solving this based on situation and limitations.


Creates their own rules.

Proficient becomes an expert with experience. Expert builds strong intuition and can predict outcomes of their choices. Predicted outcomes are managed in the context of limitations that exist at the moment. Expert knows the tradeoffs and odds of certain choices and solutions and has less emotional involvement in decision process. At this level technology is viewed as a tool.

Tasks for the expert can be formulated as a goals to achieve, and KPIs to hit.

Junior? Middle? Senior?

I think of Novice and Advanced beginner as Junior developers.

Competent are Middles.

Proficient and Expert are seniors in my opinion.

What we should understand, that any classification of continuous entity into discrete classes is not precise and not to try to judge anyone according to the title or label. It is just easier to build an intuition when we have one word that provides us with meaning.

What to read

The paper

  • The Five-Stage Model of Adult Skill Acquisition Stuart E. Dreyfus Bulletin of Science Technology & Society 2004 24: 177 DOI: 10.1177/0270467604264992

Alternate models

Shu Ha Ri Four stages of competence