The Creativity Of Computing
When we think of Programming we might think of the creative process. The one that enables us to solve complex problems with well designed and engineered algorithms, using advanced math. And at the same time by creating mesmerizing, intuitive interfaces that make everyday problems easy to solve for the entire world.
We all know that, like every article that has ever asked this question, we will conclude here that programming is in some way both artful and scientific. Is there ever any doubt about it? With that being said, in my book the proportion of what is science and what is art has shifted over the years; but let us take a closer look.
Who Does The Programming?
The people who perform tasks that are associated with programming have many names. They are called Software Engineers, Programmers, Developers or even Hackers, by definition or education Computer Scientists! When we learn programming we learn about all aspects that come with it and education starts from the ground up. We need to understand the physics behind flowing or not flowing electricity and how it forms our 0s and 1s. To learn how hardware components like diodes, resistors and transistors work together and how they form the basis to everything we work with by building blocks we use every day. We need to comprehend how to combine those ANDs, ORs and NORs, how they work, and what logic behind them creates the outcome we witness.
Over years we pore over books to create an image of how all of these maps to the programming languages we use today. Then we write our first components and learn how to construct them together. We sit through classes of Math and Algorithms and Linear Algebra, in order to apply those rules. They are useful to solve routing problems for Mapping Services, or to build physic engines for games to mimic how objects move. We use Geometry and vector math to build interfaces that photographers can use, to crop and rotate their images, or to interpret digital signals from an MRI or CT to show a visual representation of a patient’s body.
Our knowledge of geometry lets us display what was once hidden from the naked eye, but that is not all. These components need to communicate with each other and we get all these different architecture models at hand and acquire vast knowledge about various patterns which we later try to apply in different ways.
Scientific Programming
The approach we use while developing is very scientific as well. We have a hypothesis of how things should work and communicate together and based on that, we apply and design our code and components. Along the way we might find obstacles that we did not think of, so we adjust our hypotheses with new parameters and try again. Rinse and repeat until we achieve our goal. We learn about space and time complexity and how they set limitations to what we can build, but none the less we are not seldom astonished what people create with programs and the zeros and ones they are given. Tasks that once took months or years are just some quick display touches away, computations and simulations done quickly.
This all sounds very dry, logical and lonesome, which was further embodied by the stereotypical image that society had of a programmer. Jurassic Park for example pictured us as the nerdy boy with the glasses that obsessed over his computer in his basement and media portrait a programmer as a person with glasses in solitude in front of their screen immersed by darkness, the face only illuminated by the glow of their screen.
The Art Of Creative Coding
But programming has changed over the years! We do not need to understand anymore all the underlying mechanisms to build software. It got more and more abstracted by frameworks so that we can concentrate on implementing functionality. The image of a programmer has evolved as well. These days it is understood that huge parts of our work involve original ideas, creative problem-solving skills, and even greater communication skills. Without them, none of the above would be possible. We are often faced with hard to overcome challenges, and team up with colleagues to come up with brilliant solutions to these.
We feel deep satisfaction when we finally find an easier, elegant way to solve problems, as part of a great architecture that is simple enough to be understood by the ones that come after us. After all it is a direct reflection of the end product, and do not we all marvel at the code of others that is readable, comprehensible and straightforward? Make something complex appear easy is a trade that takes years to develop.
A lot of time is spent learning new technics, architectures, and styles and experimenting to find what works best given a certain problem. We see it as a craft that we refine with time, seek out teachers and masters, go through books, attend workshops and conferences to add yet another tool to our toolset to better our work. We explore different languages and environments to find the place where we feel comfortable. And all the while we never stop learning as everything around us keeps evolving and changing but though core concepts stay the same.
Developing A Programming Style
Over the years we evolve and look back at our earlier works, often with criticism or shame. Au contraire to what we feel, it is a good sign, an indication that we have grown. With more time we start developing a certain programming style, that makes us to the programmers we are today, formed by our journey. What you started out with often defines how you code. Was it a functional language or object-oriented, do you know how to work with pointers and did you have to manage memory yourself?
All of that defines your next approach with a new language. Soon enough we have a coding style that we apply and a way how we arrange variables, functions and where we put our brackets. You can also see our personal signature in the way our components communicate with each other, the way we handle errors and structure modules. We all know that one colleague who uses templates or protocols everywhere or who never writes more than 80 characters in one line. We do not even need to open the commit log to know who has written a certain piece. It is all there green on black. A simple look at the code structure is enough to know who built this. The significance of ones own code has even gotten so far that a project was developed by stylometry researchers to identify the anonymous authors of code.
There is a very strong stylistic fingerprint that remains when things are based on learning on an individual basis.
Everyone has their own unique style, no initials needed on the masterpieces you create. Very much influenced by the ones we worked with just like painters who teach their students, seniors brush off on their juniors.
The March Of Progress
Not only the underlying technical components have changed and evolved. The devices we work with have also become so powerful that we are able to build very computing intensive animations and visual elements to give our programs a unique touch. We are not bound anymore to standard elements, and can create interactions with our programs that will influence generations and pop culture. The interface elements and components created for popular programs shape our communication. For example sentences like “I would give it a like” or “I’d swipe right” have made its way into our everyday vocabulary to express approval. Both of these go back to parts of the widely used social platforms Facebook and Tinder.
Who Are Your Heroes?
Just like painters and other artists we programmers create master pieces in the hopes to one day proudly present and share them with the world. It even goes so far that some of our pieces are presented on giant stages, as the main act of a big presentation in artful orchestration. Received by applauding crowds that flew many miles and purchased expensive tickets and accompanied by other artists like U2. We have our idols that inspire us like Bill Gates, John Carmack and Steve Jobs who have created computer programs that have changed the way we live and work today.
And creating something that changes the world and makes a lasting impact is certainly what many programmers aspire but in order to influence the masses it is not enough to solve a problem with a piece of software. We need so much more than just math and algorithms turned into code. Our creations need to be intuitive and simple and delight but yet powerful. Achieving this needs a lot of work, many iterations, failures, set backs and from that learnings to make it all the way from an idea to a clunky prototype up to a refined piece of software. Often this software is never done, and requires a certain amount of empathy since it needs to evolve. We need to understand our users if we want to stay relevant, not only for our Applications but also the users of the framework we build.
What Is Programming?
So is programming Science or Art? It is a life long question ever since programming became popular and I do not dare to put a label on it since it depends very heavily on what you use it for.
Photo by Federica Galli on Unsplash.