Programming The Wij Way: Principles, Values, and Practices

It’s amazing to see what age has done to me. Approaching forty, I am becoming more and more firm about who I am and what I want to be. I have become much more strongly opinionated. I am increasingly confident about what works for me and what doesn’t. On the flipside, I feel that my arrogance surging. I am starting to see that people are wrong more often than not. I feel like they should have done things better. I mean, I know that I can’t judge people. Each person’s achievement is a combination of luck, privilege, experience, and hard work. Everybody has their own struggle, point of view, fear, and hope. It’s not right to feel that I am better than any other person just because they are in a more disadvantageous position than me. But, some people that I used to admire, they are becoming more …​ normal. It seems that they are not as great as I thought they were. I don’t know why. Maybe, it’s just me. I am born smart and curious, and I tend to be arrogant.

Why "Principles, Values, and Practices"?

What age has to do with programming? And, why I have to program in a certain way? And, with certain values, principles, and practices? The subtitle "Principles, Values, and Practices" comes from the book "Extreme Programming Explained" by the legendary Kent Beck. While I am a fan of TDD and the content of the book fits with me so much, I feel that I am something else. There is more to me rather than just "Extreme Programming". This is what I want to explore in this article.

Talking about "Values, Principles, and Practices" seems like boastful. Well, they are indeed big words. What I want to say is while I myself cannot demonstrate consistently these things that I discovered and curated, they are the main driver behind everything I do about programming. I truly believe in them, and I feel guilty if I deviate from them. This is because they represent the ideal me. The smiling shadow that I can never catch up.

Now I am going a little bit pedantic. What Kent Beck means as values and principles are different from what Stephen Covey (in Seven Habits) means. I am confused, so I look up at a dictionary. There, stated that a principle is either:

  • a moral rule or a strong belief that influences your actions

  • a belief that is accepted as a reason for acting or thinking in a particular way.

Both are acceptable definitions. Both means the same thing.

How about values? Again, from the same dictionary, value means beliefs about what is right and wrong and what is important in life. Well, principle or value, they are all beliefs. But, it seems that principle is more universal, while value contains degree of importance relative to the person believing in it. It seems right. I will take this definition. So, while the principles could apply to anyone regardless their profession, the values in this article seems most suitable for programmers. It’s because I discovered these values on my journey becoming a good programmer.

The Principles

These are the core beliefs that I consider as universally good. They are much more than only about programming. These are the principles of my life, even though I discovered them as I learn my way of programming. These principles aren’t actually foreign to me. It’s just that I didn’t realize why they matters before. As I slowly gain confidence on myself, these principles crystallized. They are integrity, conscientiousness, and compassion.

To explain why these principles matters, I need to explain about intelligence. There are three levels of intelligence:

  1. The first level is to recognize the truth

  2. The second level is to acknowledge it

  3. The third is to act on it

Integrity is about acknowledging truth, while concientiousness is about acting on it. If I follow these principles, I can become an intelligent person. Only by then, I can live my life without regret. How about the first level? Well, I don’t think it’s anybody fault if they can’t recognize the truth. If I can’t recognize the truth, I don’t know any better.

But, intelligence is not enough. Life has to have a purpose. Intelligence is just a tool to achieve that purpose. I like to imagine myself as a tree. The purpose of life is to grow this tree well. Just following the procedures and techniques to grow a tree is not enough. We have to put our heart into it. Only by then, the tree will grow well. And life is not only about this single tree. The tree has soil and it lives among other trees. The purpose of life is to take care myself and everything around me. Everything means my family, my friend, and also …​ my code. To do that, I need compassion.

Integrity

Integrity is believing with your heart, saying with your words, doing with your actions

— Wij

Integrity is the principle that I have greatest affinity with. I am born and raised with this principle. My father used to work in a construction contractor company. Amazingly, we didn’t get rich! In Indonesia during 1990s, corruption was so much pervasive in government funded projects. Only a mad man deals with corrupted people every day and never take a cent for himself. That is my father. His insistence influences me so strongly. Even though I can only inherits a small bit of my father’s integrity, I will always keep his legacy in my heart.

I won’t say that I never lie, because people lie every ten minutes. I am just a bad liar. I am afraid that people will easily find out, so I end up being honest. But, integrity is not only about being honest to other people. It is more about living true to yourself.

Why this matters to programming? If a person can acknowledge the truth, he will make a good problem solver. Why? because then he can overcome his own biases to see problems more clearly. Problem solving is the soul of programming. With an ability to recognize facts, even though the data is not sufficient, the decision that comes from it is most likely the optimal one.

Conscientiousness

I score very low on conscientiousness in Big Five test, yet I make it my principle. Funny, isn’t it? I know this is my biggest weakness. But, I regard this principle as highly important. Why? Because only by conscientiousness we can make the most of us to achieve our goals. We can control our thoughts and our actions so that negative emotions and adverse environments will not derail us from our purpose. I am a spontaneous free spirit. So, I have to work hard everyday to master conscientiousness. It’s painful but necessary. Every time I lose myself, I waste highly precious things: time, hard work, and momentum. I must control myself. Conscientiousness is like a rein for a horse. The horse is energetic and powerful. However, without a rein it will run around wildly but never arrives anywhere.

Conscientiousness manifests in many forms. It’s leaning on the safe side on uncertainties. It’s having backup plans if something goes wrong. It’s to stay away from troubles. It’s being careful. It’s driving within the speed limit in the safe lane with seat belt put on. Being conscientious is an action that invites luck to my side. It makes my life easier, and it gets me out of trouble.

The opposite of conscientiousness are not carelessness or recklessness. They are excitement and mindlessness. Excitement seems like a good thing, right? Well, maybe, at some degree. But, it’s still a bad thing if you have too much of it. Pulling all nighter because you love to work so much is detrimental to your body. It hurts your mind. It makes you prone to burn out. On the other hand, mindlessness seems harmless. What’s wrong with wandering mind while driving? What’s wrong with listening to music while putting the 312nd food order on the table? Nothing, except that you make mistakes easily while wasting your precious time on earth. Things you do mindlessly, you forget about them. You don’t learn, you aren’t improving, and you don’t enjoy them. You don’t live them. By being conscientious, we are able to put the best effort on anything we do everytime. That’s one way to be happy. To live a purposeful life is to live intentionally and deliberately.

Compassion

One of the most selfish things you can do is help others

— Daniel Gilbert
The Science Behind the Smile

I am both selfish and oblivious to other people’s feelings. I just want myself to be happy. But, Daniel Gilbert said that happiness is social, and altruism is one thing that can make ourselves happy. No, I still won’t pay your debt if you have a bad investment. But, I care about you. If you are around me a lot, I will start thinking of doing something for you.

I know it’s confusing, so let me explain it. Programming is my passion. I love my code well made. I strive hard to write good code. But, programming is a team game. So, I have to share my love for well made software to my team mates. If it makes me happy, it will sure make them happy. But, well made software is not enough. It should be usable. It means the customer can achieve their goals using our software. So, I have to instill customer interest in my mind to do a good work. Personally elegant code become collectively elegant code, and a well engineered software become a useful software. Programming is a social activity. Your code is the social media. To do a good work, you have to care about people.

Humans desire power, and power tend to corrupt. Compassion is the antidote for that corruption. It’s also the only reason for you to lead other people. To lead other people you have to lead yourself first. You need to take care your personal wellbeing. The circle of compassion has come full.

The Values

Principles are universal and unchanging. Values are bound to specific place and time. Values are personal. The values below are based on my experience. They capture the essence on how I approach programming. They fit me best. They help me thrive as the best version of myself.

Humility

What is humility actually? It’s the opposite of arrogance. What is arrogance then? Arrogance is a feeling that just because some people is beneath you socially, it means that you are better than them. They are not important, so they aren’t worth listening. For a truth seeker like me, arrogance is a big no. If I stop paying attention, it means I stop receiving good ideas. I stray away from the truth. Arrogance makes me stupid. I don’t say I am always humble. I am born smart, and it’s been a long time since people started to call me senior programmer. You will know if arrogance act up. If I start to talk too much, interrupt you, or annoyed when my opinion is challenged, that’s the arrogant me. I know well this creature. Sometimes, I can tell right away if a person is under arrogance’s influence.

Humility is the first value that I discovered. I was deeply hurt by it. It’s during my first years programming professionally. My senior refused to acknowledge the bug I found in the code that he wrote. Instead, he criticized me for not following his exact order. He codes repetitively and the solution he gave us is to create code generator. I was merely taking a shortcut! That’s why I always keep in my mind two things: to appreciate my junior’s point of view and to take criticism properly.

Humility has its practical use in programming. You listen for the best possible technical decision available. You receive help when you need it, so you don’t waste time. You avoid making things difficult for yourself just because you can (like, writing web server in C++). You are not invulnerable, so you write tests for every line of code you write. You don’t deploy to production without testing.

There is a simple trick that works well for me to practice humility. It’s fatalism. The saying "you can achieve anything you want if you work hard enough" seems noble, but it’s actually the root of arrogance. In reality, we can only do so much. Result often betrays hard work. To be successful, we need everything else. Intelligence, money, loving family, good education, beautiful face, it’s all luck. So, while a lot of humble people shy away from saying they are smart or good looking, I won’t. I didn’t ask for it. I have to appreciate what nature has given to me. The trap is to feel better than other people just because you are born good looking, smart or rich. The true arrogance for me is when I feel that I work harder than everyone else. Hard work is the only thing determines a person’s value. If I work harder, I feel like I am better than the next person to me. This is illusion. Nobody can judge how hard working a person is. No one can really feel what other people have gone through.

Gratitude

There are two blunders that I often do. The first one is not appreciating the chance in front of me. I want more challenge that I despise my current responsibility. Consequently, my work quality crumbles and management think I can’t be trusted with more challenge. The second one is my high standard makes me seldom appreciate my own and other people achievements. I rarely praise. Iam ungrateful.

Psychologists agree about the benefits of gratitude. It can even increase patience. If I am grateful with my current responsibility, I will do it so well that the company will give me more challenge. If I appreciate myself and other people more, I won’t easily experience burnout. Gratitude is essential for programmer’s happiness.

We should be grateful for anything that makes us happy, even if it’s so small. But, apprecation should be genuine. It mustn’t be a generic one like "thank you", "nice" or "great work". It shouldn’t be overdone like "that was the most beautiful speech I ever heard". I rarely praise. I should do it more. But, when I do it, it should be specific. Something like "the MacBook is silent and it compiles fast. I will definitely more productive with this". Or, something like "I learnt new way of programming. Thank you for teaching me test-driven development". With specific words, we show other people that what they do for us matters and we truly appreciate it. And, you can’t come with specific words easily unless you are already grateful in your heart.

Mutual Support

For a significant period, I worked in a company that emphasize results and personal responsibility. If I as an engineer need some resource, I am responsible to acquire it myself. But, our product is made of components. Siloing hurts. If each component is well made but they don’t work together, the end product is crap. Some day, a big project started that needs close collaboration between different engineering disciplines. This is the right way to build a product, I thought. It becomes my go to way for software development. Although I find it uncomfortable every time, I always try to go out of my box to solve any problem together with other component developers.

Mutual support needs different way of thinking. We can’t just say "my part is done" or "the task has been completed". Any feature can only be said done if it works well for its intended target users. So, constant collaboration is needed between component developers. They have to work together until the components work well together.

Mutual support is more than delivering a good product. It’s also about shared interests. Developers want to do a good job while keeping themselves happy. That’s why I often make frameworks. I want to make everyone’s job easier. Let’s do the boring stuff as quickly as possible so we can spend our time working on the fun stuff. A senior developer will say that pushing grunt work to juniors as "delegating". It’s not. If the junior doesn’t enjoy it himself or doesn’t grow from it, it’s just plain abuse of power.

Communication

A program that doesn’t communicate with outside world is purely useless. A human that doesn’t communicate with outside world is dead. Expressing ideas clearly and effectively is essential. Expressing emotion properly will get you much further. Let people know how you love them.

People often forget about the receiving part of communication. People hearing without listening. People acting without understanding. To listen effectively, we need to look beyond what people say. We need to figure out what is his feeling when he say something, how he say it, why he say it, and in what context he say it. To listen is to understand.

We write code that our colleagues read. We review each other’s code. Our users interact with our software. We discuss with product owners and designers about how our software should looks and behave. Programming is clearly a communication intensive activity.

Last, nothing beats verbal communication. The most effective form of communication for programming is face-to-face communication. Things that can be resolved in 10 minutes becomes an hour just because we work from home. Remote working hinders collaboration.

Reliability

Reliability means that every time anyone trust us on something, we make it happens. Well, almost. Everybody can fail and will fail, but we need to commit on what we sign up for. Being reliable also means being able to say no. If there are too many tasks, refuse some of it. If a task is unclear, clarify it. If a task is risky, make everyone understand about the risk. If something unexpected happens, communicate it as early as possible.

One of the most difficult thing in programming is estimation. People seldom get it right. So, be as honest as possible when estimating. Practice everyday to improve its accuracy. Learn from more experienced people. Complex and uncertain tasks can’t never be estimated precisely. Be honest by telling people that you aren’t sure.

Some people believe that reliable means we have to complete a task given to us with whatever means. We already gave our word, so we have to work on it as if our life depends on it. I don’t agree. I understand where this comes from. Missing the date often means losing the money. If it happens everyday to you, please remember: it’s their money but this is your life. If you are an independent consultant, probably you don’t deserve that money in the first place. It’s your mistake, so you need to apologize. If you are desperate to pay the bills, then it’s an exception. Anything goes.

I believe that it’s enough to put our best effort. Before we accept a commitment, we already have other commitments. Focusing too much on a single commitment, and suddenly we neglect other commitments. Accepting a commitment means we treat it seriously. If someone give his house key for you to water his plants everyday, you make sure that you water his plants. You make sure you lock the door after it finished, and you don’t steal his stuff. That’s what reliable means.

Striving

What is striving? Is it about debugging your prototype in 4 am while you are going to demo it in 7 am? Is it about hitting a stretch goal every single sprint? Is it about typing furiously at your keyboard so you can deploy at the end of the day? Call me a slacker, but I disagree with all these definitions.

To me, striving is being all out. Your body, your mind, and your soul are here, right in the middle of the thing you are working on. Striving means you face the difficult stuff heads on. You don’t ignore the right solution and just typing your way toward the easy solution. Striving is about focus. You exert all your brain muscle to solve the problem at hand. There is an easy way to know if you are striving or not. If it doesn’t hurt, you are doing it wrong. If you aren’t exhausted, you don’t work hard enough.

Striving doesn’t mean you take no time to rest. On the contrary! An athlete needs some time off so their body can rest and grow stronger. So do our mind and our soul. They need some rest, so we wake up in the morning refreshed and inspired. That’s how we take our challenge, with full capacity. You don’t work hard by doing overtime. You just ruin yourself. You are deprived of your creativity. You lack focus. You are becoming stupid.

Perseverance

Bad things happen and they hurt. Bearing the pain and moving on is perseverance. Perserverance is about maintaining original course of action when faced with challenges or setbacks. It’s that simple.

However, persevering is so hard to do. If there is a tiny bit I can tell you about it, it’s my experience with C++. C++ is inconsistent, error prone, verbose, redundant, and confusing. I can survive this language, and it becomes a big part of my career. It’s something, right?

Besides C++, a lot of small things can make me irritated, annoyed, or even angry. I can’t work without setting up VS Code with the correct theme and font. It tortures me that I am not using vertical monitor. Trackpad is not comfortable enough. The chair is pretty hard for my ass. If only I can be more persevering, it would be good.

I want to. I don’t know how. But, if it means that I have to experience a truly hard life, then I refuse. I am terrified by my father’s story. He can’t complete his college. He got slandered by his coworkers until he almost got fired. He had a lot of debt so he need to hide everytime a debt collector came. No, thanks. I am weak. I can only handle C++, but that’s fine. Being a programmer’s is such an easy life. I don’t want to ask for more trouble.

Excellence

If there is a thing that often clashes with my professional life, it’s my desire for excellence. I failed to make case for excellence for any employer I ever work with. There wasn’t a company that can value excellence as much as me. It upsets me a lot that I never can say to myself, "I did well". Excellence is my second nature. But, only in programming. Other stuff, I couldn’t care less.

Even though excellence is my nature, I don’t say that my work is always perfect. To me, excellence means I care a lot about my work and I always find a way to improve it. How good I can improve something? Well, it depends on how I can get accurate feedback from my performance. Let’s say, my writing skill. It never improves because I only consider it as something I enjoy so that I become more and more comfortable with it. Another example, my FIFA skill. After 4 years, I am still the same lousy player.

In programming, I can apply excellence to high degree. I don’t know why, but I can sense if a software is not good enough to solve the problem. I have a good feeling about how to make a software more maintainable, clear, flexible, simple, and robust. That’s why I always do things a little bit differently every time. If there is one thing that I don’t improve in programming, it’s speed. I never work on optimizing my programming efficiency. It conflicts with the necessity to improve the software itself. Being faster implies to do the same thing over and over so your brain get used to it you don’t think about it. No, that’s not how I program. I think and program slowly.

Courage

Innovation and creativity comes from happy people. They don’t sprout from people with a lot of fear in their heart. In Project Aristotle, Google discovered that pyschological safety is the most important thing in high performing team. But, psychological safety is defined by how you feel your environment treats you. It’s not something that we can really control.

It means I can’t apply psychological safety to myself. I need to have something else. That something else is courage. This kind of courage is the kind that makes you think you have nothing to lose. I told you, we have nothing to begin with. We are just lucky to be born smart and good looking. We didn’t ask for it. We don’t actually deserve anything that we have.

With that kind of thinking, there is only one think we can do. As long as we mean well, as long we think it through rationally in calm manner, just do it. Say, this the best within my ability all I can come up with to do the right thing. Then, everything will be fine. Really, everything will be fine? Yes of course, God knows you tried your best.

But, please remember that being courageous doesn’t mean being sloppy! You lock the door before you sleep. You write extensive automated tests before you merge your code. You put your helmet before you ride. Courage comes afterward. You haven’t done your best if you are sloppy.

Consistency

Small thing done consistently is much better than great thing that doesn’t last

— Wij

Would you prefer to exercise for 30 minutes every other day, or 2 hours straight a week for a month and then stopped altogether? Thing that doesn’t last quickly become useless. We should not overdo something because we are easily bored. Worse, we can burnout quickly. What is the sign that we overdo something? Does being consistent means contradicting striving and perseverance?

I wonder myself. Sometimes it is. I admit it’s tricky to balance striving and consistency. They seems to be at odds with each other. But, I think the secret is in managing our energy. Do your best, but get some rest. After a hard day, proceed with hard play. Don’t take overtime. Overtime is eating your excellence. Give your mind and body time to recover.

Consistency is about acquiring good habits. Test driven development, regular exercise, sleeping on time, anything that can improve our quality of life sustainably. To acquire good habits, we have to integrate it in ourselves gradually. Drastic measures often don’t last. Being spontaneous doesn’t help. We get excited at one time, and then forget all about it the next time. Consistency requires us to recognize what is truly important and then invite it to our life. Consistency needs strong will with long term vision.

The Practices

It’s not easy to define all those principles and values. It took me more than a month until I got here. It’s much longer if we count the time I started to think what I want from myself. I don’t know, 2 years? 5 years? I believe it’s not final yet. There are more things to come. What I have right now is not perfect, but it’s good enough. It’s actually so good that I myself can’t seem to adhere to it fully. It’s okay. It’s the ideal me. I can’t be that perfect. But, it feels good to have some goals in life.

Now, let’s move on to the practices. The practices are the things that I had done in the past that I consider as good habits if I can do it consistently (damn!). They are always floating in my mind, and if I have a good chance, I try to apply them everywhere. Each of it have some real benefits. They are what I actually do to achieve the principles and values above. The practices is not final. They will grow. I will add more to them when I acquire more good habits.

Minimalism

I learn minimalism from Cal Newport. I did digital detox a year ago. It felt so good when I finally able to remove unimportant matters from my life. Suddenly, I feel that I have plenty of time. At the time, I was able to do some creative writing. Do exactly as Cal Newport told, you won’t regret it. Well, probably not. You don’t wan’t to live in small village cutting log by yourself in snowy winter, right? But, the point stands. If you focus only on stuff that matters, you can do everything well and live a fulfilling and meaningful life.

Self balancing

I believe that there are three dimensions of self, body, mind, and soul. Only by balancing these three, we can be the best version of ourself. I am a programmer. I tend to focus only on the mind. But, recently I tried to exercise regularly 3 times a week. I feel that I get a fresher mind to do programming, and I am less likely to be frustrated. Keeping emotion and mental health is important too. A happy person is more creative. A persevering person is more adaptive to bad situations.

I still need to take care my mental health. In the past, I have done some creative writing. Having a serious hobby is a good way to move away your mind from thinking about your job constantly. It’s ideal that this serious hobby is not related to your work, so your mind won’t come back to work again and again. Cal Newport suggested crafting. I don’t think I can enjoy it. I am mechanically challenged. Distractions such as watching drama or reading novels doesn’t help.

Slow Thinking

For the last 4 years, I feel like I am forced to always think fast and instinctively. People around me love the adrenaline rush from being in "dangerous" situation continuously. It’s excruciating. I didn’t have enough time to stop and examine what I already did. Slow thinking and fast thinking both have its uses. I feel peace and deep satisfaction when I can think slowly. It seems like waiting everything fall into their place. Slow thinking makes the best decision for important things. Fast thinking fits urgent matters better.

In this era of overinformation, slow thinking is a rare and precious skill. Slow thinking is about being able to filter out the gem from the junk. It’s about focusing on a problem until you truly understand what it means. With that, you can come up with high quality solution. I love it because not only it’s my nature, but also because it makes me happy. The solution might be incomplete or imperfect. That’s okay. The deepest satisfaction comes from understanding the problem. The solution is only one option among many options. It could change. It could be adapted into different situations if the problem mutates.

Plan, Do, Study, Adjust

I am a chaotic person. Heavyweight self management techniques doesn’t work for me. PDSA is what I do every day to manage my day. I choose the word study because I want to think more and look closer on what I did rather than just ticking a checkbox. I choose the word adjust instead of act to not confuse it with "do" phase.

When it works, it works really well. Having a plan keeping me from wandering around while working. It prevents me from entering a rabbit hole, something I often do in the past. When I do wandering around, it will become a regret when I review what I have done at the end of the day. Next day, I promise myself not to do it again.

No overtime

There are times when we need to do overtime. But, that times should not last long. Overtime is unsustainable. It ruins our health and it destroys our work. We stopped writing code and start writing bugs. We don’t add value, we remove it. No brilliant solution come from overtime. They are just hacks or grunt works. Overtime should be banned, they are detrimental to both you and your company.

Test-driven Development

Test-driven development is a brilliant method. You grow your software by writing tests. You are confident that your software works as you mean it to work. It doesn’t guarantee a bug free software. When poorly done, test-driven development seems like more a hassle than a life saver. So, a proper test-driven development is not easy. You need to have discipline and creativity.

But, if you stopped after you get used to it, you will suddenly feel a much higher pressure. You are forced to think a lot. You have to mentally compile and run your code in your head. If you don’t do that, you quickly feel clueless. You did a lot of thing, and now you have to think which one of things that you have done causes the error. When the error changes, you are relieved. But, you need to solve another one. Test-driven development is vastly superior to traditional development, especially if your code is much more logical than visual.

Continuous Teaching and Learning

You don’t truly understand something until you can make other people understand. So, that’s why I combine teaching and learning into single practice. Both often happen at the same time. Teaching is multiplying our team capability. By the time our colleagues understand things that was only known by us, we can say a few words and they immediately know what we mean. I love sharing what I know. I might not learn more, but I definitely understand more.

I am greedy of knowledge, especially in software engineering. I believe we all do. Or else, how can we survive in this ever changing field? I don’t learn just for the sake of learning. I don’t learn so that I can apply complex and advanced stuff to my craft so I can call myself master craftsman. Any sophisticated technology is only a tool to solve the problem. Programmers are problem solvers. But, we don’t use lathe to solve the problem. Great programmer is the one that can conjure simple solution for a complex problem.

Write, Write, Write

Writing to me has two uses. The first one is to retain the information I just gained. The second one is to organize my thoughts. When I don’t fully understand something, it is hard to write about it. After I understand more, I am able to write about it. And, there is a nice side effect too. Sometimes I put them in my blog. People can read about it if they find it useful.

I regret that I didn’t develop my writing skills much earlier and much more intensively. I have a belief that a good programmer must be a good writer. Programming is writing rigorously. A programmer with bad language skills will write unreadable code. Unreadable cod is unmaintainable. You might be a genius, but you aren’t a good programmer until you can write a clean code.