Skip to content
HomeWorkProcessAboutBlogContact[email protected]
← Back to blog

Software Development as a Craft Not a Commodity

Software Development as a Craft Not a Commodity. software craft philosophy Insights from The Proper Motion Company.

There is a persistent idea in business circles that software development is a commodity. That any competent team can build any application from a sufficiently detailed specification. That the work is interchangeable, the output predictable, and the only meaningful variable is cost per hour. This belief has launched a thousand failed projects, burned through millions in wasted budgets, and produced software that technically meets requirements while being utterly unusable. Software development is a craft, and treating it otherwise is the most expensive mistake a company can make when building custom tools and products.

The Commodity Illusion: Why Specs Alone Do Not Determine Quality

A specification describes what software should do. It does not describe how it should feel to use, how it should perform under load, how it should accommodate the requirements nobody thought of yet, or how it should evolve over the next three years. Two teams given identical specifications will produce radically different software, and the difference matters enormously.

Consider two teams building the same customer portal. Both deliver a login screen, a dashboard, and an order history page. Team A’s login page loads in 400ms, gracefully handles network errors, remembers the user’s session for 30 days, and works flawlessly on a phone. Team B’s login page loads in 3 seconds, shows a generic error message when the network hiccups, requires re-authentication every session, and has a password field that fights with mobile keyboards. Both teams “implemented login.”

The gap is not in the specification. It is in the hundreds of micro-decisions that developers make every day. How to handle edge cases. When to push back on a requirement that would create a bad user experience. Whether to invest an extra two hours in proper error handling or ship the happy path and move on. Whether to choose a library that is well-maintained or one that was convenient at the time.

These decisions are matters of judgment, taste, and experience. They are the decisions of a craftsperson, not a factory worker following an assembly manual.

Related: Why Great Software Feels Invisible to Users

What Craft Looks Like in Practice

Software craftsmanship is not about writing “elegant” code or using the newest framework. It is about consistently making decisions that serve the end user and the long-term health of the codebase.

Thoughtful architecture decisions. A craft-oriented team evaluates architecture choices based on the specific needs of the project, not on what is trending. They choose a monolith when a monolith is appropriate and microservices when the team and operational maturity support them. They document their reasoning so future developers understand why decisions were made.

Obsessive attention to error handling. Most applications work perfectly when everything goes right. Craft shows in what happens when things go wrong: when the payment processor times out, when the user submits a form with unexpected input, when the database connection drops during a write operation. A craftsperson anticipates these failures and designs graceful responses for each one. The user sees a helpful message and a clear path forward, not a stack trace or a silent failure.

Performance as a feature. A crafted application loads fast because performance was a consideration throughout development, not an afterthought. Database queries are optimized during development, not after users complain. Images are properly sized and served from a CDN. API responses are cached where appropriate. The cumulative effect of these individual decisions is an application that feels responsive and professional.

Code that communicates intent. Well-crafted code is not just code that works. It is code that clearly communicates what it does and why. Variable names describe their purpose. Functions are small enough to understand in a single reading. Complex business logic has comments explaining the business rule, not the code syntax. When the next developer opens a file six months from now, they can understand it in minutes rather than hours.

Rigorous testing. Craft-oriented teams write tests not because a process requires it but because they take pride in software that works reliably. They test edge cases because they have been burned by untested edge cases. They write integration tests that exercise real workflows because unit tests alone cannot catch the bugs that matter most.

The Cost of Commodity Thinking

When organizations treat software development as a commodity, they optimize for the wrong variable: cost per hour. The cheapest developer, the fastest delivery, the most features per sprint. This optimization produces predictable outcomes:

Technical debt accumulation. Commodity teams cut corners to meet velocity targets. They copy-paste instead of abstracting. They skip error handling to finish faster. They choose quick fixes over proper solutions. Each shortcut adds friction to every subsequent change, and within twelve to eighteen months, the codebase is so burdened with debt that adding a simple feature takes weeks.

We have taken over projects where the previous team delivered features quickly for the first six months, then ground to a halt. One client’s application had a codebase where changing the color of a button required modifying files in four different directories because styles were duplicated and inconsistent throughout the project. Another had an API where the same endpoint returned different response formats depending on which developer had written the handler. These are the hallmarks of commodity development: fast at the beginning, expensive forever after.

Hidden rework costs. A 2018 Stripe survey estimated that developers spend 42% of their time dealing with technical debt and bad code. Applied to a team of five developers at a blended cost of $150,000 per year per developer, that is $315,000 annually spent fixing the consequences of commodity thinking rather than building new capabilities.

User abandonment. Software that technically works but is frustrating to use does not get used. Internal tools with poor UX lead employees to create workarounds in spreadsheets. Customer-facing products with rough edges drive users to competitors. The indirect cost of poor craftsmanship shows up in adoption metrics, support ticket volume, and customer churn, not in the development invoice.

See also: Why the Traditional Software Agency Model Is Broken

How to Identify Craft-Oriented Teams

Whether you are hiring developers, selecting a vendor, or evaluating an agency, these signals distinguish craftspeople from commodity producers:

They ask questions before quoting. A commodity vendor will quote a fixed price from a feature list. A craft-oriented team will ask about your users, your business context, your constraints, and your goals before estimating anything. They know that understanding the problem is more than half the work.

They push back on bad ideas. A team that agrees with every requirement is not being collaborative. They are being compliant. Craft-oriented developers will tell you when a feature request would create a poor user experience, when a technical approach would create long-term problems, or when a timeline is unrealistic. This pushback is a sign of expertise and investment in the project’s success.

They show their work. Look at their code. Not just whether it functions, but whether it is organized, documented, and tested. Ask to see a pull request from a recent project (with sensitive details removed). The quality of code review comments, the thoroughness of tests, and the clarity of commit messages reveal more about a team’s values than any sales pitch.

They care about what happens after launch. Commodity thinking ends at delivery. Craft thinking extends to maintenance, monitoring, and iteration. A craft-oriented team will set up logging and error tracking, configure alerts for critical failures, and document operational procedures, because they know that launching software is the beginning of its life, not the end.

They invest in their own skills. Craft-oriented developers read, learn, and practice outside of client work. They contribute to open-source projects, attend conferences, experiment with new technologies, and share knowledge within their team. This continuous investment in skill development is what separates a ten-year veteran who has grown every year from a one-year developer who has repeated the same year ten times.

Building a Culture of Craft in Your Organization

If you are building an internal development team, fostering a culture of craftsmanship requires deliberate choices:

Measure outcomes, not output. Story points delivered, lines of code written, and features shipped per sprint are commodity metrics. They incentivize speed at the expense of quality. Instead, measure deployment frequency (how often you can ship safely), change failure rate (how often deployments cause problems), mean time to recovery (how quickly you fix issues), and customer-reported defects. These metrics reward sustainable quality.

Allocate time for improvement. Google’s “20% time” gets cited often, but even 10% dedicated to reducing technical debt, improving tooling, and refactoring problematic code pays dividends. A team that spends 10% of every sprint on housekeeping maintains velocity over years rather than months.

Make code review a learning opportunity. Code reviews are not gatekeeping. They are mentorship. Reviews should include explanations of why something should change, not just what should change. Over time, this practice raises the entire team’s skill level and creates shared standards that outlast any individual developer.

Hire for judgment, not just skill. A developer who can implement a feature three different ways and explain the tradeoffs of each is more valuable than one who can implement it one way very quickly. Interview for decision-making ability, not just coding ability. Ask candidates about technical decisions they have made and what they would do differently in retrospect.

The organizations that build the best software are the ones that treat development as an investment in craftsmanship rather than an expense to minimize. The initial cost may be higher, but the total cost of ownership, measured in maintenance burden, user satisfaction, and the ability to adapt over time, is dramatically lower.


We believe software should be built with care, attention, and pride. If you are looking for a development partner that treats your project as a craft, not a line item, reach out to us. We would be glad to show you the difference.

// Related posts