Thinking in Design, Not Just Code
Notes from how I think about software 🧩I have never considered myself a raw coder, but I always considered myself a design person, maybe because I have come from a design mindset of learning design. Taking this philosophy, I have understood that everything can be connected with it. Here are a few things I have learned that shaped how I think.
A payment bug that was really a design problem
I was building a webshop and building all the frontend and backend. After releasing the app for a very initial, crappy release, I needed to answer the following question: how does this app handle concurrent payment requests if there is an issue on the network and the user clicks the pay button multiple times? The solution was Idempotency, which fixes the problem. And though I had to implement it on critical endpoints on the API part, I describe it as a design problem.
Choosing a language with intention
This is about not just blindly following the trends, but knowing what matters. For the technical side, there is not any single programming language or framework that fits for all. New programming languages are developed to overcome issues in existing languages, but come with another problem to be fixed. Microservices are not a silver bullet. There are different types of languages, dynamic and typed, and debating them based on social media hype, or some influence, or large organizations following them, would be biased, because neither is optimal for all types of application. So I learned that Rust is not good for every project, though we can code in it. Python is not the fastest language, though it is very popular among popular languages. JavaScript is not the best language. Every programming language is designed to solve a problem of their own.
For example, WhatsApp uses Erlang, which solves one of their greatest problems: concurrency. They chose the language to overcome the biggest problem, though it would have been very difficult to implement a UI in that language (I don't know if they ever used it for UI). But my point is that choosing a language should be intentional, for solving the biggest problem.
This has also happened when I was working as a software developer at Crystal Solution. We needed to be able to integrate a lot of modules of software, and each client wanted an app with a different set of modules. PHP was the primary language and we felt it very difficult to handle, because we did not have any method to know which part broke the app. So we moved to .NET Core, which helps to combine and take care of the app as it has type feedback. Most of the bugs are now patched by the IDE.
Three aspects of software
I also learned in an Advanced Software Engineering course that there are mostly 3 aspects to software: Technical, Security and Process. The technical one is what I already described above.
For the security aspect, software is not just concerned with developers, but with the people who use it daily, so security is very important. I also learned that there are different kinds of attacks other than cyber attacks in the high technical realm: the Social Engineering Attack. This type of attack involves a person manipulating people to extract identity information. I was very curious to know this dimension when learning about software development.
For the process aspect, software is developed in a process. It talks about how it is developed, how it will be tested, how it will be deployed, and how the client feedback is handled and injected into the software for software evolution.