The principles that guide life often directly conflict with the principles of Software Engineering. I am not saying that all principles are head-butting each other, but some fundamental ones conflict a lot. A disclaimer: You might disagree with me on some Life or Software Engineering principles, but that is also a fine lesson in Life.
Life is more art than science
Software Engineering is based on science and its limitations, even though you can be creative within the boundaries of these limitations. But you must do more than go your separate ways to build software. It’s a discipline that takes time to master. You must build on top of what has come before or within the boundaries set by your team, company, funding, or technology.
Life is more art than science. Following the best practices laid down by someone will rarely get you the best results. Being mindful yet curious will take you the farthest. You can desire anything, act on it, accept the consequences, and desire it again. You can outgrow your desire and find a new one. As your circumstances and context will be different than anyone else, your actions will be quite different, too, even if the desire is the same. Your life is unique, and no one can replace your life; your series of actions and their consequences will also be unique.
Life is about discovery
Software Engineering needs a certain level of certainty. You need to plan and act according to the plan, and sometimes, you might have to have a plan for the plan in case things don’t go according to the plan. For example, at Amazon, we would run load tests and several other tests with traffic at the levels the Tech Ops team thought we would get based on several heuristics. Now, even if we came back green, i.e., we passed all the tests, we still had to present a list of things that could go wrong and what we could do to fix these; as an example, let’s say we are running into performance issue for one of our services, could we then pull a lever and shutdown some non-critical functionality so that we can alleviate the issue or get to a graceful degradation of service.
Life, on the other hand, is anything but living by a plan. You will constantly face challenges requiring you to use your experience or learn on the fly to overcome them. That is what makes life beautiful. Sure, you might need some security now and then, but too much of it and you have created a life not worth living anymore. Planning your life away is throwing your life away. Yes, you need desires to act on them, to find out if they work. And then outgrow them and have new desires. But don’t confuse desires with goals; machines, processes, and systems have goals, and a living, thinking being has desires.
Life gets easier with time
Software Engineering gets complex with time. You need to constantly learn new things as new approaches, from new languages to new technologies, arise. And with experience, you gain trust; with it, the stakes get higher and higher, and the room to make mistakes gets smaller and comes with larger consequences with every mistake.
Life is just the opposite. It gets simple: you know what you like to eat, what you like to do for recreation, what kind of people you like to keep around. You start asking the right questions and learn to listen to yourself for answers. With trust, it becomes easier to get new opportunities to get into groups you always desired to be part of, and you build a network of like-minded individuals who keep you motivated and desire things that were out of reach before.
Goals in life evolve
The goals of Software Engineering rarely evolve. It’s the same non-functional requirements you try to optimize with newer, better tools year after year. There is a saying that if you squint hard enough, you will see the same thing being done with the same constraints in 2 separate systems used for completely different purposes. The overall goal of what the system was supposed to do might evolve. In that case, you build another system that, in many senses, will look and feel similar to what you have already done.
Life should not have goals; desires, yes, which you must have, or else it’s not worth living, but goals not really. God forbid you have SMART Goals for your life that are attainable, relevant, and time-bound. Why would you spend your entire life, or even part of it, on something attainable — when you know it’s attainable? If it’s attainable, then you need to think bigger. When you were small and desired a toy, did you plan according to what your parents could afford or when they would say yes? Or when you fell in love, did you think s/he was out of your league, so not worth pursuing? And desires are never relevant, or attaching a reason for the desire doesn’t make it more or less desirable. When you want something and truly desire it, you have to have it, not by committing a crime. Also, when you have a desire, you can only act on it; the results are not in your hands. You can constantly nag your parents for the toy, try to woo that girl or boy, or study for that exam. But when your desire is met, or will it even be, it is not in your hands in most cases.
Conclusion
Sometimes, we let our software engineering selves run our lives, too. We look for best practices to live, plan for bad days, think our lives are getting worse, and want things we can achieve something meaningful immediately. I hope you found a new way to look at life, taking your eyes off your favorite IDE.