Software development topics I’ve changed my mind on after building PromoML
Last week I released a new app PromoML. The motivation for writing this post comes from the fourth rule of one of my favorite philosopher René Descartes: “recheck your reasoning”.
Things I’ve changed my mind on:
Work backward: Instead of starting with the dev environment, start working on prod environment, release the app, fix the bugs, and only then pack everything into infra as code.
Bad code is okay: Since the app is split into smaller modules there is no issue with code readability. Due to the tiny size of modules, the surface area for bugs is small too.
Perfectionism is not okay: Premature optimization is the root of all evil, be mindful of what you are doing and stop yourself once you drift away from shipping stuff. Don’t optimize for code, performance, and productivity yet.
Functional programming is overrated: There are only two things you need to know from functional programming, composition, and currying. Web development doesn’t need advanced functional programming concepts.
Estimates are not always wrong: You can learn to estimate well over time. In case of delays: cut corners, ditch best practices, play against the rules as long your software is stable. Technical debt? Maybe.
Opinions I’ve picked up along the way:
Microfrontends + Microbackends: It did work amazingly well for building frontends and backends. For the first time, I felt safe about developing every part of the application. Buy this book, you won’t regret it.
Web components: The last app I’ve built was in Svelte, before that in React. PromoML is built with Web components. Web components are 10x better. Why? They are native and you don’t need Dan Abramov’s or Rich Harris’s opinion to follow. MVC + Web components are the way to go. Boring, but effective!
Use Web Apis: We have everything we need to build a decent web app. Even direct DOM manipulation feels not that bad.
Immutable Web Apps: Treating
index.html
files as configuration files is a mindblowing concept. In general, the separation of release tasks from build tasks removes some of the complexity and feels lightweight.
Old opinions unchanged:
Expectation vs. reality: The reality is always messy, just make it work, lower your expectations if needed, adapt to circumstances.
First principles: Knowing pure CSS instead of TailwindCSS removes a large chunk of accidental complexity. Second order thinking feels painful and slow, but it makes you more resistant.
On fundamentals: The best time investment I have made is learning about the fundamentals. Building a modern computer from first principles, deeper understanding of Linux and the command line, Vim (probably the best investment ever), linear algebra, statistics, web APIs, web components, basic functional programming concepts, ergonomics of the keyboard (happy hacking 3). The worst time investment I have made, learning React, Redux, Svelte, advanced functional programming concepts, R lang, fancy algorithms, OOP design patterns, and their stupid names.
My post is highly inspired by Chris’s blog post.