Coding is a creative effort. Do not let anyone tell you otherwise.
Realization, connection, combination and implementation. Even before that - learning, thinking, feeling and practicing… all of it, which is included in the programming, is the magical process of creating something out of nothing.
As each programmer is unique and every problem has countless solutions, every single solution to a specific problem will be unique to a programmer who came up with a said solution. It comes from that moment when you were sitting (or standing) at your desk and trying to wrap your mind around the problem.
You basically start with a “blank page” that just waits to be filled with new lines of code and imaginative ways to construct something that will eventually “come to life”. There are infinite ways to achieve that - and that is both the beauty and the danger of it.
You can learn a lot about an artist just by looking at their art - which for programmers is their code. That’s because we are not robots. We are human beings with our own strengths and flaws. Our feelings influence our work, and we leave traces of it in our code. We can be tired and distracted, brave and bold, or lazy and depressed in a way that can be reflected in the code. Reflected in a way that creates magical innovative things but also in a way that creates bugs, crashes and unwanted behaviour of the software.
We as programmers know that. Because of that we constructed a number of ways to combat our humanity, and to minimise its influence on our work. We write tests that ensure that the code does what it is intended to do, and new changes do not break our old logic. We construct architectures and patterns and employ rules to our coding styles so that we minimize subjectivity in solving problems and implementing features. We have coding reviews so we can hear second opinions from our peers which gives us more confidence in our code. We create backups, automatization, all to minimize errors, to minimize our human effect on our work.
As there are multiple ways to do something, conflicts arise between different programmers. Some of us are really sensitive about our work and if our code is challenged, this can be sometimes interpreted as an attack on our ego. We can be offended.
We are humans, thus we are faulty. However, we can be brilliant. We disagree on many things, but this boosts our creativity. A lot of inventions were created by pure accident. It is amazing when you think how far can human ingenuity go. At the same time, it is also amazing when “having a bad day” can cost us or our company a lot of money, while on a good day our innovative thinking can totally change the game, turn the market in our favor and smash the competition. In conclusion, our humanity can make or break the whole project.
So that creates a problem.
Professionally, our end goal is to create something that works exactly according to specification. A software product in itself is a collection of instructions and components that are interconnected by logic, dictated by human made design.
We as humans try to create a set of instructions that tell the computer what to do in a way that will result in a finished product and satisfy the definition of done.
Humans are not so good at that.
Most of the time, in a professional environment it goes like this (Ultra-simplified version). In the beginning, there is an idea. Software company gathers a team of experts to develop the idea. Managers manage the team, designers design the idea, and programmers program the idea at last.
There are a lot of moving parts, and brilliant people included and paid in this whole story “from nothing to something”. But the working part of the idea is the produced software and code behind it. It is basically the living, breathing embodiment of the idea. And the human responsible for that is the programmer.
But, let's imagine that you could just skip the programming part of developing the application and skip the hassle of handling the programmer's stress levels, feelings and needs. Imagine if you could have an idea, write everything down, draw and design everything and then it just magically comes to life with a click of a button. I bet you this thought crossed a lot of minds in the business world.
I'll be honest: That would be so efficient for the product and the whole process. Just if there was some kind of magical tool to program everything from the drawing board into the real thing.
There is only one “tool” for the job (until we create artificial intelligence and put ourselves out of jobs).
That tool is called the human programmer.
He is brilliant most of the time, although he can be a pain in the ass, and is not cheap of course. The human programmer will get you what you want but he is a human as we already learned and has feelings, flaws, and moods. He can be really eccentric, he is an artist after all - but not in your world. His artistry lives in another world, only accessible to the other human programmers.
Now we come to the tale of the TWO WORLDS.
World number 1 is the world of the product itself. It lives on the higher abstraction plane. Used by the users and managed by the product owners, managers and designers.
The creative process is primarily bound to the question WHY. Why do we need something? There is a question WHEN. When should we do this? But also there is a question of HOW MUCH. How much does it cost?
User experience and interface matter a lot in this world and can make or break the product.
Its main goal is to sell itself. So this world is also concerned about its business side. Without funds and resources and business plans, there probably would not be the product, and the idea will just be that - an idea.
There is also a creative process there. It comes from the designers and product managers who try to create something that users will use, on the visual and on the product level. But they are not actually building the product. They create guidelines for someone else.
So when it comes to building things in a real sense, we must go down a level in the abstraction plane and meet World number 2. The programmer world, the world of code. Full of intricate creative ideas and systems that work together to bring something to life and to its fully working state.
Nobody but the programmers can understand World number 2. Nobody but us can appreciate the imaginative ways and flows of algorithms and their beauty and efficiency when solving problems. Because sometimes it is hard to appreciate something you don’t understand.
The creativity and decisions are implemented on every line of code. Everything that you do can have consequences later on. You need to think in layers and abstractions.
It is easy enough to think that we just follow the rules and protocols and that there is no actual freedom or creative thinking in our jobs, but that is so far from the truth. Most of us really love our craft, and are passionate about it. We can argue with managers and clients, strongly object to new features or changes just because we do not want to ruin the beauty of our code that we invested so much time and thought into.
It’s a tricky situation.
Creating a beautiful, clean and reusable code does not necessarily equal creating a good product. Good code creates good software, it decreases bugs, improves readability and predictability of the software but it does not create a good product as a whole. Software in itself can be great, but if its business or design counterparts are not, the product can still be awful. Those two can be totally different things. As we are living in different worlds we can sometimes be blind to each other's jobs.
We need to balance our creative efforts and love for the art itself to the business needs of the product. And product owners or stakeholders need to balance it as well so we don’t just give up or create a monstrosity of a legacy code that can never be refactored.
In that comes the cooperation and understanding of each other's jobs.
The best people to work with are the ones that are multi-disciplined and have an understanding of both worlds, people that can bridge the gap of two worlds, and can work together to bring something to life on all fronts.
Programming is not just “follow the rules” or “build that in the least amount of time” - it takes effort, creativity and experience. What programmers create can make or break the whole thing.
They love their job, they can sometimes be blind to the business needs and care more about the art of programming than the finished product. But the best ones understand.