Artisanal software - Beyond pragmatism2019-07-15
Whenever we design and create software we need to pay attention to the trade-offs we are making.
When you make software for a business purpose within a company, the trade-offs are made in relation to business goals, available resources, the deadline and often office and team politics. Quite a few things come into play to shape what you are doing. And developers in these environments generally can't control all the trade-offs that are being made.
I find myself growing wary about what trade-offs we make and whether we are aware of them all.
Need to make a desktop application?
Electron would be a popular choice.
Upsides? We build with the web stack we know. We have a lot of flexibility in the UI design. It runs anywhere that can run Chromium. It is modern and convenient to work with as a developer. Getting web frontend devs is generally also cheaper than developers comfortable with any other UI toolkit.
Trade-offs? Disk space and memory usage are the first to go. We simplify to a mostly single-threaded browser runtime which while fast for what it is shouldn't be anywhere near a native UI toolkit in performance. And the UI won't fit the OS in any real way.
Who is paying the cost for the benefits we gain? It doesn't seem to be the developer. Nope, it's the user.
And it is a pragmatic choice. I don’t think developers should feel any particular shame in making choices they believe will serve them well. Especially not when working within tight constraints without full control. But I also don’t like where some of the current software trends are taking us. A pragmatic choice is usually not the ideal choice. It is a situational choice and if we can loosen the constraints a bit we might have the room to make a better choice.
Electron is not the problem. It is simply the new cross-platform solution, much like a Java GUI was a few hundred years ago. It worked everywhere and barely felt at home anywhere. It too had performance trade-offs. Today they'd be blazingly fast and incredibly efficient in comparison I imagine.
This is one of many kinds of choices made frequently in software development where the downside is largely placed on the end-user’s shoulders. There are plenty of others. How many slightly-too-big-but-very-productive frameworks do we bring in? I don't feel the same about Bootstrap as I once did, for example. It is useful, don't get me wrong. But is it in line with what I envision my craft to be? Do I feel professional pride in a good choice well made or did I just default into it?
Maybe you write things single-threaded and have to think less as a developer. Yay, we've solved UI! But your application meanders along where it could be blazing forward on 8+ under-utilized cores. Ads show up in an operating system you paid actual money for, costing you performance, peace of mind and pissing you off all at the same time.
Computers are fast now, right? It won’t even be noticeable. And ads are fine, right? Software has ads. Right?
Many of us know the feeling of a new PC laptop full of pre-installed garbage where all you really want are the basic drivers. A lot of people work with Slack every day, I tend to. That is not a snappy client, I’m sorry to say. Is it any wonder that our computers don't seem to be getting much faster?
Spotify got rid of their old client which was a fast, competent, music player and now it is a sluggish web-based beast. They did not make that change for us customers. Or did they? I guess it could be argued that they can execute on their plans and development faster and build more visually compelling designs with less effort and complexity. But there was a significant cost in performance. It went from an app that I enjoyed using to one I'm constantly a little bit annoyed with. It might be a sensible choice for them and their business. Can you tell that I think they made a poor choice?
This is normal. It aligns with business goals I’m sure. But what I want to see more of is software that serves the customer or user directly and primarily. It does not have to mean minimalist. Maybe there is a point to Discord looking the exact same on every device. Maybe it would never have hit market if they couldn’t lean on Chromium’s WebRTC implementation for communication. But I’d love it if it was leaner.
On the Mac and iOS side there is a culture of power-users paying for software. Software that works for the user, where ads would detract from the quality and experience. Instead the developer gets paid for the software, often these days, with a subscription to make the business case more sustainable. They are often written with the native tooling, they fit into the system as a whole, they extend it where need be. There might a significant Windows subculture for power user software like that. I’m not familiar with it.
I’ve heard trying to sell software to Linux users can be a bit of an uphill battle. Understandably so. But the open source community also has a pretty good tradition of native clients, native software and so on. A bit more fragmented perhaps but for fair cultural reasons. There are solid options with GTK, Qt and probably plenty more.
So should everything be like Mac power-user software? Not necessarily. I think of this model as the artisanal coffee, craft beer, audiophile approach to software. I don't think we can get everyone to abandon the free-as-in-ads services, arguably the fast food of software. We don't have to bring everyone over. But if we can make sure people are aware that there are options. That they are either making trade-offs or are suffering the trade-offs of heavy-handed business choices. Much like a modern hipster-compliant café we would just need to seem nicer, cooler, the high-quality choice.
I think we could make software that is fast, useful to the actual user and costs money where it makes sense. I don't think you can get the same scale. But if you are a single developer, or a small company, you don't need web-scale, you don't need the growth hacking or VC money. Just get paid, normally. You just need to make a good living. And in spite of the current mainstream, I think you can make a living getting paid for making good software, even great software. Some people definitely do that.
This is something I want to aspire to in how I build software. I want to build fast and performant. I want to make software that fulfills its purpose well. Not apps that are trying to capture the user's engagement, min-max their emotional response or profile them for marketing. I want to provide systems and services that serve the user well rather than serving an opaque mess of business interests.
This grass-fed, hand-ground artisanal development generally won't be a good fit for client-work so I'm likely to primarily apply it for my own creations. I'm holding some hope that with the declining value of random ads as a means of funding apps, services and websites we might even see this kind of craftsmanship- & quality-oriented software rise in popularity. As a selling point if nothing else. Much like the organic growth of business or Company-of-One attitude, I think this is a long-term more sustainable thing for our culture. But of course, I'm not holding my breath.
If you have some thoughts to share on this topic, feel free to let me know at firstname.lastname@example.org. If you have an interest in my professional services in spite of this post, feel free to browse the rest of the site.