Imagine a civilization that relied on bartering – tit for tat, apple for orange, donkey for horse, food for water. Commerce would be challenging: if you were an apple farmer and wanted oranges, you had to trade them with orange farmers. But if the orange farmers only liked to eat peaches, they would be unwilling to trade for your apples. To get oranges, you would need to first find someone willing to trade peaches for your apples and then trade those peaches to the orange farmers. That’s a lot of work getting oranges. If only there were some easier system of trade!
Oh wait, there is: money! Money is a universal currency that facilitates exchange of goods. Instead of trading apples for oranges, you can trade apple for money (sell) and then trade the money for oranges (buy). Since money is used by everyone, the orange farmers could then use the money you paid for their oranges to buy peach, thereby saving you the trouble of trading apples for peaches
Fundamentally, money facilitates trading and solves the problems poised by bartering. It is a tool to facilitate getting stuff you want or need.
Imagine a civilization without software. There are no cars, computers, phones, alarm clocks, or electronics. Life would be different. If only there were some way to quickly tell a friend to meet up in 5 minutes or to download Taylor Swift’s latest hits. How much easier life would be!
Software (along with hardware and other technologies) solves these problems. It is common nowadays to text a friend to arrange a meetup or to fly across the country to visit a relative. Software has advanced every industry and in some cases, has even cannibalized other industries, such as type writers.
Fundamentally, software is a bunch of instructions telling machines how to solve problems too complex for humans to solve, and in doing so, it augments us to surpass our own biological limitations.
Both money and software exist to make our lives easier. The former increases communication among ourselves; the latter increases communication beyond ourselves. Both of these are tools whose usefulness is determined by the problems they solve.
Money, often represented by coins, is almost useless until society assigns purchasing power to it. Money is used to buy many tangible goods and services but can't buy intangibles. Money can't buy something that doesn’t exist (although it is an incentive for finding new discoveries); it cannot buy love (it sure can buy fake love though); nor can it buy happiness.
Having excessive money isn't the key to happiness; it's simply a tool for getting better physical goods and services. It's sad that many people work tirelessly to earn extra money that they didn't need. The equivalent analogy would be to work hard amassing a huge toolbox filled with tools that will never be used. Yeah, not very useful. On the other hand, although money doesn’t guarantee happiness, lack of money often guarantees miserableness because of the inability to purchase life necessities. It is beneficial to view money not as a mythical substance but simply a tool whose usefulness depends on what it can buy.
As money is a common exchange system for humans, software is a common communication system for machines. Similarly, software, often comprised of thousands to millions of lines of code and is useful only when it solves a problem. Even beautifully written, highly maintainable, and naturally extensible code is not useful if it fails to solve a problem (unless that problem is to learn how to write beautiful code) or if it aggravates an existing problem.
As money facilitates our lives, so too should software. There’s a huge difference between writing beautiful software for the intellectual satisfaction and writing software as a tool to solve practical problems. The former is for enjoyment; the latter is to eliminate existing problems. As such, when writing software, it is important to know if you’re writing for academic/learning pleasure or to solve actual problems.
Seeing software as a tool adds perspective to design decisions. If the tool would be used only once, development speed would be more important than maintainability and as such, it would be better to quickly write bad but working code than to excessively dwell on writing quality code. On the other hand, if the tool will be used by many clients for a long time, writing maintainable code makes more business sense. How we approach software is determined by the problem it is intended to solve.
Money and software are both tools designed to solve problems. On their own, they are not so useful. After all, most people would agree that a phone is more useful than a thousand coins or a million lines of incorrect code. But when they are used to solve problems, they become essential to our daily lives.
This article was written in 2016 at https://lennycheng.com/blog/2016/09/04/software-and-money-are-both-tools/