Software engineering: Should it be a product, or a craft?

Software engineering: Should it be a product, or a craft?
Kodak Australasia Pty Ltd, Carpenters Workshop, Abbotsford, circa 1938 - Photo by Museums Victoria / Unsplash

I always had strong opinions about the value of craftsmanship, and of product as a kind of fake replica of craft. I still think that product is something falsely glorified in the hyper-commercialized world we live in today, while craftsmanship is the actual value-adding component of everything we build. But I have tried to curb my feelings a bit. Hear me out.

Discussing this AI craze with people I respect the most got me thinking about it more than ever. I think these "vibe coding" trends I see are going to result in a continuous decrease in the reliability, and maintainability of software. This isn’t an article against AI. Don't get me wrong: I have already included a few of today's most popular LLM tools in my workflow. But there is a very clear distinction between using AI as a tool to craft something with good design and real value, and just throwing pieces together to create a mediocre solution to a possible problem.

I am going to mention a little bit of my background because I think it is relevant to my view on the subject. I had my first interaction with an actual computer in 1995 when I was 5 years old. I used computers mainly for games for a while. Then, when I was 9, my father got me the Turkish translation of the book "Build Your Own Web Site" by Asha Kalbag. At that point, computers were no longer just game machines for me. They had become also tools I could use to build things.

I got into computer science not because I wanted to make a living out of it, but because how computers worked fascinated me and I wanted to spend time with computers.

And for the last 15 years, I have been working on different kind of projects. From being the sole technical owner at a creative agency, to building and leading the engineering team at a competitive e-sports startup, to founding and running my own uptime monitoring SaaS serving thousands of customers.

Asha Kalbag - Bilgisayardaki Adresiniz Web Sitesi

Before anything else, here are the relevant meanings of these two words from the Merriam-Webster Dictionary:

product:
something that is made to be sold, usually something that is produced by an industrial process or, less commonly, something that is grown or obtained through farming
craft:
an occupation, trade, or activity requiring manual dexterity or artistic skill

Even though I used them as opposites in the title (it was clickbait, I see it worked), craft and product can co‑exist. For example, if we put software engineering into the context, the websites you visit are a combination of craft and product, in varying degrees. What worries me today is not that products exist, but that the product mindset is overwhelming the craft mindset.

Product

Commercialized product-building mindset is about marketability and profitability. It requires identifying a problem that solving will be commercially beneficial in the foreseeable future, coming up with something that is going to solve that problem in some way. Or it can be worse, in a hyper-commercialized world, you can go the other way around and make people believe they have a problem, and offer a solution.

Whac-A-Mole - Willis Lam (Wikimedia)

Enterprise software-as-a-service products are generally products that contain very little craftsmanship. They are built mostly under strict commercial incentives, tight deadlines, and, more importantly without solid principles, often by people who want to do just enough to make their work tolerable. Does it look ugly? Doesn't matter. Is there something that can be added that will hurt the experience but generate more revenue? Hurry up, it should have been done yesterday! (see also Enshittification on Wikipedia)

Craft

Craftsmanship, on the other hand, is more about having strong principles and sticking by them throughout the process. It can be about how different parts work under the surface, optimum performance, clarity of the design, or long-term maintainability. Or it can be about open source license choice, privacy-first design; something solely ideological, or political.

I have been using Stripe as an example of a 'good craft' for years. They are not the first payment gateway, I used others before. But I still remember the astonishment I had years ago when I first discovered they had the prorations built-in, so that when a customer changes plan in the middle of the month, I don't have to calculate how much I should charge for the rest of the month (relevant Stripe docs here). I feel like people at Stripe spend a lot of time thinking what they want to build and how to make it happen. And more importantly, it is probably a culture thing, just how things work around there.

I’m not going to make this article about my personal taste in software, listing all my favorites and what I like about them. But write me if you want to exchange ideas about your favorites too, I would love to chat.

Craft is not something you build by asking around. It is something you have deep knowledge of, and strong opinions about. It can’t be raised on top of an idea that occurred to you the first time you thought about something, it is the result of a tinkering process with trial and error.

Even though my heart is fully on the side of craftsmanship, as a professional in this field I accept that product building is a big part of the economy. But it shouldn’t be about solving problems in a mediocre way. We should make more room for craftsmanship. Because in the long run, the things we invest real time and sincere effort in don’t just function, they serve their purpose in a beautiful way.