As a very brief reintroduction to the MoneyCode series, here’s its central question:
How do software engineers deliver more quality value faster?
The first article of the series concentrates on delivery. Specifically, it declares that the only thing that matters is getting software into production. Without going to production, there’s really no reason to develop software in the first place.
The second article of the series emphasizes that quality deployments matter. Deploying poorly written code leaves you with nothing but poorly written code.
This article, the third in the series, foregrounds optimization of your income stream. It explains how to make sure the code you deliver has the highest possible value.
As a conclusion to this series, I talk about ensuring your customer gets maximum value out of the money you’re paid to deliver the product.
We’ll explore this in terms of optimizing cost.
Your salary is expensive (at least, I hope it is), so how do you optimize the things that matter the most to bring down the total cost of ownership for all of the software you and your team create?
To me, the faster you get something to production, the less expensive to own. As long as it’s good code.
Optimization of the delivery pipeline has all kinds of literature and ideas surrounding it.
The Phoenix Project is one of my favorite reads as an introduction to the theory of constraints and pipeline automation.
The general idea is that understanding where your bottlenecks are is key to increasing delivery velocity.
If you can figure out what part of your process routinely blocks your delivery, you can optimize that part.
Optimization of delivery time optimizes cost, because developer time is one of the most expensive things any company will pay for.
Economic and Accounting Costs
It’s important to recognize the difference between economic and accounting costs confronting the customer.
Economic costs are the combination of losses and gains your customer experiences when purchasing your product. Accounting costs are the actual payment you and your team receive for your work.
In the case of software development, the most obvious expense that cuts across both accounting and economic cost is developer salary. This kind of cost seems like the most appropriate kind of cost when talking about MoneyCode.
On the face of it, salaries can seem like an accounting cost, but every accounting cost becomes an economic cost for the customer.
Every dollar of your salary that your employer pays is one less dollar they can invest into the stock market or other diversifiable commodities.
Even though the most obvious cost in software development comes from accounting costs, the things your employers decide not to spend money on, instead hiring you, come into play.
Turning lines of code into MoneyCode means making sure we optimize our expense line.
The Human Element
Humans cost a lot to invest in.
That’s where the theory of constraints really comes into play, even more than the operational cost of keeping the software running.
In a software company, the largest expense is the salaries of the development staff.
If you’ve ever read The Mythical Man Month (or even if you haven’t), you’ll know for a fact that adding more programmers to a late software project makes it later.
Every developer you add to a project exponentially threatens the ratio of quality lines of code produced to developer salary dollars spent.
The theory of constraints and cost elasticity both impact general cost-optimization strategies, which impact the marginal cost curve, which impacts maximum profit.
Here’s what constraint optimization and operational optimization does to the maximum profit curve:
While it’s not obvious because the maximum profit bar is shorter and wider on the right than it is on the left, what these graphs show is that maximum profit happens on the second graph when we produce more quality lines of code.
Optimization of Operational Expenses
At times, it may come to bear that the constraint your team faces has nothing to do with human inefficiency. Sometimes, operational cost actually proves to be the largest hurdle for the team.
This makes performance testing really, really important.
High operational expenses negatively impact maximum profit. If you’re able to optimize both operation expenses and developer constraints, it changes the shape of the cost curve, flattening it.
Combine the two (constraint optimization and operational optimization), and you’re well on your way to amazing cost optimization.
Quality of Performance
Performance is one aspect of quality not discussed earlier in the series. The overall performance of your application under strain has a huge impact on the profitability of your solution. However, the impact of performance quality is felt in the longer term costs to the customer.
As we continue to build more software, we need more hardware to support the software we deploy—at least in the case of SaaS offerings, which I’m most familiar with.
As we run more and more services, microservices, batch jobs, database queries, and other things, we need to have more dedicated machine horsepower to do our computing.
As you ramp up more and more hardware, the more and more you have to pay per clock cycle. Price per gigabyte of storage, price per core, price per gigabyte of RAM—they all follow a pretty similar curve to the marginal cost curve.
In order to keep these costs down, you need to make sure your product performs as efficiently as possible.
DevOps—Not Just a Buzzword Near You!
While I certainly feel like our industry has adopted the buzzword DevOps, it’s more than just a buzzword. To me, its importance becomes most obvious when talking about optimization of the cost curve involved in creating software.
The DEVeloper part of the equation improves when you optimize your throughput constraints.
The OPerationS part of the equation improves when you optimize your hardware costs.
Optimizing Constraints (Dev)
The theory of constraints tells us that the harder we have to work to accomplish a task, the more often we should do that task.
If you struggle with the deployment part of the code process, your team should deploy over and over again. You'll quickly find areas that you can automate using tools like Bamboo, Chef, and Vagrant. Eventually, you end up with one-click deployment.
Better yet, allow deployment to be decided entirely by your pipeline, so when you merge into the develop branch, code will quickly appear in production.
If you struggle with quality, test. Test all the time. You'll soon find out that tools like Selenium, Gatling, JMeter, and your favorite unit testing and mocking frameworks can take the place of human intervention in your development pipeline.
To find a constraint, you have to know which step in the process takes the longest to complete. Therefore you need to measure your whole process.
Find the bottleneck. Optimize it until it's no longer the bottleneck. Lather. Rinse. Repeat.
Optimizing Operations (Ops)
The other side of the DevOps coin focuses on infrastructure.
But it's not just about easy-to-reach hardware—virtualized or otherwise. Eventually, the software will outgrow the amount you can afford to spend on hardware.
So operational optimization matters too.
It's not just humans who have bottlenecks working on processing. Computing has them too.
Tools like New Relic really shine here. They expose the biggest operational bottlenecks your software faces in an easy to use metric called apdex.
As defined on the New Relic website:
Apdex is an industry standard to measure users' satisfaction with the response time of web applications and services. It's a simplified Service Level Agreement (SLA) solution that gives application owners better insight into how satisfied users are, in contrast to traditional metrics like average response time, which can be skewed by a few very long responses.
Once you have something like New Relic identifying your bottlenecks, you can use BlazeMeter, or its equivalent, to help optimize them. BlazeMeter is a wonderful cloud-hosted performance testing suite that gives you all kinds of powerful tools for squeezing bottlenecks until they stop hurting you.
Combining tools like New Relic and BlazeMeter, your development team can isolate the largest offending friction points for your software. Optimization of operations at its finest.
Optimization For Everyone
While we may have all kinds of TLAs (three letter acronyms) and buzzwords like DevOps, the software craftsmanship profession really does boil down to one thing: Optimization.
If you want to optimize the amount of money in your wallet, optimize the way your team builds code. Optimized code production: MoneyCode. How much simpler can it get, really?