INTRODUCTION
Everyday life is like programming, I guess. If you love something you can put beauty into it. -- DONALD KNUTH
Have you ever wondered, "What is programming?"
I don't think the answer is by any means obvious. Programming is a term bandied about, describing any number of activities in the tech world. We see two people, ostensibly both programmers, working on entirely different types of projects. We go online and see a wide range of opinions on what we thought were simple topics. And few people even have the title "Programmer" on their business card. What's going on?
My goal with this book is to show the myriad of things that a programmer does. I'm interested in looking at the profession from all angles. Many of those you may not be familiar with, and that's okay. If one quality defines programming, it's learning. From the first line of code you write, you will be adapting and discovering new things. Being sedentary is not an option.
Software is the nervous system of our world. Our society is built from millions of bits of hardware, working together to control everything we do. The internet ushered in an unavoidable information age that is reshaping our culture. Whether you find this good or bad, depends a lot on small details of the software that holds it all together.
At the forefront is basic communication. Our telephone calls, our emails, the routing of traditional mail, chatting, and the waves of social media, are all anchored in software. This places a significant level of control in the hands of people who write that software: the programmers. Daily questions about governance and morality end up being answered by lines of code. It seems prudent that we have a good idea about what programmers do. Especially if you're a programmer yourself.
Despite it permeating society, the creation of software is still shrouded in mystery. There's no definitive plan one can follow to create a successful product. Solving real-world problems is not straightforward. We often end up with the wrong solution or one that doesn't work correctly. By looking at all aspects of programming, we can better understand the troubles in the current landscape, and how to resolve them.
This book is suitable for programmers and non-programmers alike. Though I will be writing from the point of view that you are a programmer. I'll keep the level of detail approachable enough for any interested person. Programmers don't exist in a vacuum. It's vital that the teams we work with understand what we're doing.
There are many skills a programmer should learn. I take the view that all of them, over time, can be acquired through practice and study. While some people may have helpful innate abilities, great programmers are those with a growth mindset.
When I started listing all the skills, I noticed some patterns. I was able to group the skills into three broad categories. A good programmer isn't one who targets just one category but has a balance of all three.
These are the three skill categories of a programmer:
People - People are the reason software exists. Software is built by people, for people. How do we figure out what all these people want, and how do we organize them to get something done? This section introduces the user, and the forms of communication needed to develop software.
Code - At the heart of any software is its source code. It is the most tangible part of the product. A healthy product requires clean code. This section looks at the diverse set of technical skills and theoretical knowledge needed to write good code.
You - Behind the screen is a real person: you. There are many challenges you need to overcome to excel in this profession. Programming can be an immensely rewarding activity but also bears a heavy burden. This section deals with getting ahead and remaining healthy.
ANALOGY
We can compare software to a tree.
The beautiful canopy, with all the leaves and the delicious fruit, that's what people really want. Without it, people are not interested in the tree. This is the people part of the software. We need to understand what people want in order to grow a tree they're interested in.
Those leaves and the fruit are attached to the branches, which in turn, are connected to the trunk. This is the support system. It's what holds the tree together and provides the foundation for the fruit. In our analogy, this refers to the code. Code is what holds everything together. There can be no software without code, as there can be no tree without branches.
Deeper down we have the roots, an often overlooked component. They literally give life to the tree. Any trouble with the roots will show symptoms in the branches and the bushy foliage. In software, the roots are the programmers. This is you. We can't expect to build a reliable product without strong developers.
In this book, I'm looking at the whole tree. This offers the best opportunity for growth.