Supply and Demand
Google "best jobs," and you will find numerous surveys that rank software development at the top. While it may be difficult for experienced software developers to admit, being a software developer beats out most other jobs in terms of pay and quality of life. Add to this the millions of unfilled jobs in IT, and there is a massive demand for software developers.
The fact that software development is one of the best careers has led to a worldwide surge in people wanting to become software developers. With the explosion of code schools, online coding courses, and computer science majors, new developers are entering the market every day. As with most things in economics, however, the more supply you have, the lower the price.
When a software developer currently working for a company asks for more money, they often play a game of brinksmanship: either pay me more, or I'll leave. However, with a flood of new talent entering the job market, a company will call that bluff if they believe any software developer can be replaced. Whether these replacements are qualified, however, is another matter entirely.
It is well understood that there can be a massive talent gap between software developers, even with the same title and years of experience. Unfortunately, a vague idea such as talent is no match for hard data on the average software developer pay in a given job market. Still, though software developers are not fungible commodities, that does not stop many companies from paying that as if they are.
Limited Career Progression Beyond "Senior Developer."
At most companies, the career path up to being a senior software developer is relatively straightforward:
Within four years of being a Junior Developer, there is typically an opportunity to become a full Developer.
Within eight years of being a Developer, there is usually an opportunity to become a Senior Developer.
If these time ranges seem arbitrary, that's because they most often are. The software development industry has a bad habit of basing seniority primarily on a developer's experience rather than their level of expertise.
Once the Senior Developer title is reached, all bets are off, and you might be a senior developer until the end of your career. Considering that a software developer might have a 40-year career, that means career progression largely halts after the first 10 years. With an unchanging title often comes a stagnant salary, cost of living increases notwithstanding.
That said, there are job titles beyond a senior developer, such as Technical Lead, Principle Developer, or Architect. These title increases typically come with a pay increase, but there is a catch:
There is no industry consensus on beyond-senior job responsibilities, making it difficult to steer your career towards one of these titles.
There is usually only one beyond-senior slot available per team, i.e., you won't have two people with the title of "Lead" or "Principle."
Beyond-senior titles tend to just be the new cap on career progression.
Therefore, even if you are one of the lucky few to secure a beyond-senior job title, your pay will still stagnate, albeit at a higher level.
Equity Instead of Salary Increases
Companies who employ software developers can be thought of as belonging to one of two groups:
Companies that self-identify as tech companies, and therefore consider software developers critical to their success.
Companies that self-identify only as an enterprise, and therefore consider software developers a cost to be minimized.
There are many stark differences between a tech company and an enterprise:
Tech companies tend to have a more casual and fun work environment. Enterprises pride themselves on their seriousness and professionalism.
Tech companies will tend to have software at the core of their business strategy. Enterprises see software as only an enabler of their business strategy.
Tech companies generally have rigorous and challenging coding interviews. Enterprises will tend to hire based on relevant past experience.
Tech companies are willing to pay a premium for the best software development talent. Enterprises only want to pay for the minimum talent they need to reach business objectives.
Tech companies often cluster in specific geographic regions to gain access to the best talent, creating massive salary competition. Enterprises can and do operate from anywhere.
Despite these differences, software developer salary stagnation happens at both tech companies and enterprises, but for different reasons:
Enterprises are always looking for ways to cut software development costs and therefore baulk at the idea of paying a software developer more than the standard for the job market. Instead, temporary labour in the form of contractors or outsourcing is seen as preferable to offering ever-increasing salaries to full-time employees.
Tech companies also tend to lock salary to market rates, even though rates can be far higher in the competitive job markets where they tend to operate. However, they usually provided additional compensation as stock options with a fixed vesting cycle.
The rationale of a tech company granting equity stems from the belief that to get the most out of a software developer, they must be motivated to increase company value. Unlike industrial-era factory workers, a software developer's productivity cannot be observed, measured, or optimized. Tech companies know that without direct methods of increasing productivity, creating a financial incentive to increase company value is the only way to maximize a software developer's contribution.
Considering the vast wealth a software developer can generate when a tech company is sold or goes public, most developers accept the tradeoff of equity for salary.
A Lack of Merit-Based Performance Bonuses
Companies that offer pay bonuses tend to use two different models:
Standard company-wide bonuses that are a percentage of overall company profits distributed evenly among all employees.
Merit-based bonuses that pay more to top performers, with little or nothing paid to bottom performers.
Considering the massive differences in software developers' ability, basing bonuses on individual achievement is the obvious choice. However, a merit-based bonus system is complicated to implement:
A set of criteria must be established that enable software developers to be objectively compared.
A performance review system must be adopted by management that eliminates the role of subjective favouritism.
A forum must be established where managers can argue how much of the bonus pool should be allocated to their team.
A scale must be decided upon that dictates how a team's bonus pool is distributed among software developers across the performance spectrum.
Due to these complexities, companies tend to opt for the far more straightforward arithmetic of the standard company-wide bonus. Such bonus systems are often argued to be fairer, despite their side effect of punishing top performers while rewarding bottom performers.
An additional barrier to establishing bonus systems that reward top-performing software developers is the trend towards only recognizing team achievement. While this is becoming standard practice, giving performance credit only to the team ignores situations where a few developers do most of the work. Sadly, a few top performers contributing most of the code is more the rule than the exception.
Not Knowing When or How to Negotiate
Software Developers have the reputation of being poor communicators. Whether this is deserved can be argued, but there would seem to be a correlation between the time spent in conversation and communication skill development. Compared to roles where talking is the job requirement, such as customer service or sales, a professional coder has far less opportunity to engage others in conversation. Therefore, a consequence of being a diligent software developer committed to being highly productive is often underdeveloped communication skills.
A software developer who prides themselves on being an experienced coder may see no problem in being an inexperienced communicator. However, when such a software developer finds themselves in a salary negotiation, they will find themselves at a massive disadvantage. Of all the various types of communication skills, negotiation is among the most difficult to master.
As opposed to the average software developer, a sales professional enters into a salary negotiation with a wide variety of communication tools at their disposal:
They can seem to be friendly and open to working for the company.
They can feign shock and disappointment after seeing the initial offer, regardless of what it is.
They can act confused and seek clarification as to what the job actually entails.
They will ask question upon question to fully understand the context under which the offer was made.
They will ask for time to think, to deliberately slow the pace of the conversation.
They will hint that they have competing offers even if they do not.
They will use emotional arguments as to why underpaying them is unfair, short-sighted, and in no one's long-term best interest.
They will play hard-to-get, signalling that they are not interested in the job, regardless of if they are.
When the offer is increased, they will repeat the process until they are sure they are getting the maximum possible salary.
The average software developer, however, will often take the first offer they are given.
Considering that a company will always start negotiations near the bottom of what they are willing to pay, salary stagnation is guaranteed for a software developer with no negotiation skills.
How to avoid salary stagnation
There's no way to fully avoid any type of salary stagnation unless you own your own company, but to delay stagnation as long as possible:
Invest in developing your skills far beyond that of someone new to software development.
Aspire to be more than just a senior developer, and manage your career accordingly.
Aim to work for a tech company that offers equity instead of an enterprise that offering no share in the company.
Find a company that financially rewards top performers, and then strive to be a top performer.
Learn how to negotiate, and then negotiate relentlessly for the maximum compensation the company has to offer - be it salary or otherwise.