Skip to main navigation Skip to main content

Start a project.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Software craftmanship

What we think.

Software craftmanship


Software engineering is amongst the youngest of all professions, and writing code instructing computers to do things on our behalf is one of the newest and most incredible tools humanity has invented. It's astonishing to think about what we are capable of creating with computers today, from immersive virtual worlds to life-saving medical systems. So many aspects of our lives are now in some way dependent on software.

Perhaps no other industry is changing as rapidly as ours, and as with any young industry the advancements are substantial and at times astonishing. The sheer volume of information at our fingertips, brought to us largely by the invention of the internet, has led to massive changes in software development techniques and the proliferation of languages and platforms over the past few decades.

To me, building software is a craft. It requires a great deal of attention and skill, as well a never-ending committment to learning and self-improvement. What you learn today will be obsolete tomorrow, such is the pace of our technological advance. There is quite often a lot of complexity and detail that goes into the building of software, and the management and planning of such complexity requires a great deal of care. If you do not truly care about your craft, you cannot practice it well.

Unfortunately our industry also has the characteristic of being able to hide its blemishes all too easily. Most code will never be viewed by anyone other than the developers who wrote it, and even if it was visible the vast majority of people would not know what they were looking at. For developers it is often far too easy to just build the quickest thing that works right now, without giving consideration beyond the present.

While it is impossible to predict the future and see exactly what changes will be required, a big part of designing any application is considering not just what is required today, but how the application may be required to change in its lifetime. It is a constant juggle between just enough functionality and future flexibility. With careful consideration and the use of proven design patterns, this can make a huge difference to the ongoing maintenance and development of an application, potentially saving a great deal of time and money.

Of course there are always opposing forces in your quest for nirvana, and the development of any application is a balancing act between three elements: quality, time and budget. It is often said that you can have two of these things, but never all three. The unfortunate reality is that for many projects, quality takes a back seat. Software is often churned out on a production line due to developers either not having adequate resources, or not taking enough care in their work. The ever-present demands of time and budget often scream louder and are driven by client expectations, which whilst being perfectly justified, must also be balanced by a developer's instincts and sensible software design.

Considering what is required not only today, but also in the future, is an essential part of software craftsmanship. The one thing you can always be sure of is change, and your code needs to be able to adapt to such changes painlessly. If a piece of software is going to be used for any significant amount of time it is important to build flexibility into the system, as the time saved in the future will easily outweigh the additional effort up front.

It also helps to build an application out of small, independent components. The larger and more complicated a component becomes, the harder it is to make changes to it. Maintenance becomes a nightmare, additional features take much longer to implement than they should, and it becomes harder for other developers to understand your code.

Think of it as building a collection of small, working parts, which together can be combined to create the final product. This concept of building complexity out of simplicity is how all technology works really. At the end of the day everything you see in the industry - websites, games, business applications, and much of the infrastructure on which our society functions - is created out of mere 1's and 0's.

Complexity from simplicity. This is the craft of building software.