I have been writing software for more than two decades. And always have been curious about software engineering. Now, I mostly view writing software as a craft. The eternal question is how to write “good” software. Because thinking “software engineering” as a craft, then we must improve it. I feel the quest just got started; and, it has grown into more curiosity, resulting in reading, studying, and learning about writing better software, creating better products.
Software design and development are still in their infancy. It’s pretty new, although it has exploded in the last few years. Writing good software has been a challenge, and the ever-evolving landscape makes it complex.
While the software is very flexible and malleable, writing it in a modular, expandable, and pluggable way is a complex process, but not complicated.
Writing software requires us to express our intent precisely, and most of the time, we end up writing tactical solutions with no longevity and scalability. Having a tactical yet scalable and strategic yet faster development cycle is a balancing act that everyone needs to learn.
Computer languages have a very rigid structure. That forces us to express our business logic and intent precisely. Defining that is an arduous task unless we follow specific articulation, understanding, and reasoning practices with rules and acceptance criteria.
Software design is a very creative process. Over the years, it has resulted in many experiments around different aspects such as design, architecture, languages, and paradigms. There seems to be an explosion of trying out new ideas, new languages. We have seen paradigm-specific and even domain-specific languages evolve over the last 40 years.
We are now settling down in the phase of distributed computing, big data, functional programming, and many more exciting ideas extending into the field of artificial intelligence - the use cases which seemed distant now have become a commodity. And these evolutions led software engineering to be a very creative field.
And yet, people make mistake of creating a complicated architecture, instead of starting with simplicity.
I have experienced very few organizations emphasize software engineering as craft and software engineers as craftsmen. I hope it changes over time because it’s a fundamental change to make an impactful product.
Over the years, I have learned three things that make writing software, creating product and running it for people makes an enjoyable experience.
Writing code for computers is an easy task, especially when you have an abundance of code samples on the internet. The arduous task is to write code that humans understand. The code operates your business solutions that, in turn, provide frictionless product experiences to our users.
Technology has become essential for product growth. The scale of the “technology-backed” products goes into multiple areas: understanding and solving complex software engineering problems related to computer vision, estimation, or getting consumer’s intent using data, artificial intelligence, and machine learning.
Technology is the most effective tool to achieve the impossible.
As an engineer, I thought about “Code” “Deploy” “Automate” as engineering excellence, and especially automate part so that we can be lazy not to repeat same thing again again. but when building products, I believe much better way to put it is to ideate then implement, and finally iterate over and over, to go back to the ideation step.
After spending a uniquely amazing, crazy, and full of learning journey from 2015 to 2020, I hung up my boots at gojek and joined Sequoia Capital to pursue my aim of “doing something for the community.” One of the main driving forces was giving back to the startup community by helping companies with their technology and product-based challenges and learning from them to spread that knowledge to others.
So, if you want to talk about building products, software engineering, or just about people, do drop a line. The easiest way to get to me is Twitter.