Monday, December 26, 2022

My premises about software development

Updated on April 18, 2025: Refined and expanded article, with more complete explanations and a new point.

It is very important that, as a software development team, we share certain premises about software and software development. This allows us to work more efficiently and effectively, as we are all aligned in terms of our vision and goals. Over the past few years (2019–2024), I have continued to reflect on and refine these premises, finding further evidence and nuances in both my own experience and industry insights.

That is why I originally did an exercise in introspection to extract the basic premises that I almost unconsciously apply when I think about software and the process of developing it. Here I update those premises with additional context and lessons learned in recent years.

These are my premises for software system development:

  • Software development is a team activity: We cannot work in isolation but must collaborate with other developers, designers, and professionals to create a high-quality product. Effective product development requires cross-functional teamwork with shared ownership and trust. Truly empowered product teams take end-to-end responsibility from idea to delivery, which requires autonomy and direct interaction with users and customers. In practice, breaking down silos and enabling team ownership yields better outcomes and a happier team. Collaboration and shared context across roles are essential to navigate complex projects.
  • There is no real trade-off between quality and speed: The way to go fast is to maintain good quality. In the long run, low quality only ensures that we will go slower, as we’ll have to fix errors and deal with the fallout of technical debt. Neglecting quality creates a vicious cycle that drags down a team’s velocity. In contrast, investing in technical excellence (clean code, refactoring, testing, etc.) sets up virtuous cycles: achieving Continuous Delivery requires high code quality and small batch changes, which in turn enable faster, safer releases. Quality is what lets you move faster over time.
  • Software is a means to achieve an impact: We are not working just for the software itself, but to achieve an impact on the business or mission. Code is just a tool to deliver value. Software should be seen as a means to an end, not the end itself. The outcome (the impact on users or the business) is what matters, and extra code or features beyond that are liabilities to be minimized. We must keep this in mind when making decisions and prioritizing tasks, focusing on results over output.
  • Only about one-third of business ideas actually prove effective: We have to accept that many of our ideas will not produce the benefits we hope. Research at Microsoft found that only about one out of three shipped ideas or features actually improved the targeted metrics, and even Amazon sees less than 50% of ideas succeed. Therefore, we must optimize for learning and validation. This means constantly testing assumptions, measuring outcomes, and being willing to pivot or discard ideas that don’t prove valuable. Even the ideas that succeed typically require several iterations with real feedback to generate a positive impact.
  • When developing software-based systems, there is always a high degree of uncertainty: We must optimize for quick feedback and work iteratively and incrementally, always taking small, safe steps. Working in small, safe steps allows us to iterate quickly, reduce risks, and improve our understanding at each stage. Fast feedback beats big upfront plans in uncertain environments.
  • Software has a basal cost that must be taken into account (software can be considered a liability): Beyond the initial development effort of a feature, simply having that feature in the system incurs an ongoing cost. This Basal Cost continues until the feature is removed or the system is retired. Every feature or module adds complexity: it has to be understood by the team, maintained, integrated, and secured. When combined with the understanding that software is only a means to an end, it becomes clear that code is a liability as much as an asset. We should minimize the software we create to achieve the desired impact, delete unused code, and relentlessly manage complexity.
  • In software development, maintaining options and flexibility is valuable: To do this, it is essential to defer commitment and favor reversible decisions whenever possible. This reflects the Lean principle of deferring decisions until the last responsible moment. By postponing irreversible choices, we avoid premature lock-in and keep our design options open longer. This leads to simpler, more adaptable designs with lower accidental complexity.
  • Continuous Learning and Improvement are essential (NEW PREMISE): A software development organization must continuously learn and improve, or it will inevitably fall behind. The environment around us is always evolving, and standing still is equivalent to moving backward. Teams should invest in breaking vicious cycles (like unmanaged debt or poor quality slowing them down) and reinforcing virtuous cycles (like quality-focused small releases and continuous delivery) to sustain long-term success. Continuous improvement is not optional; it is a survival mechanism in modern software development.

These are my personal premises with respect to software development, and they are not necessarily universal principles. However, they have proven essential for working efficiently and effectively in the contexts I’ve been in (primarily product-centric software teams). I recognize that these premises may not apply in the same way in all contexts, but I perceive them as accurate in the environments in which I have worked.

Notably, many of these ideas have gained additional support in the industry through research and practice in recent years. Data from experiments confirm the need to focus on learning, and the DevOps community has demonstrated how quality enables speed. Other premises are bolstered by my own experience and observations of repeated patterns. In any case, I would love to continue sharing and contrasting these ideas with more colleagues in the software community.

Do you share these premises? Do you have additional premises or principles that guide you in software development? Does any of the above seem contradictory, or do they conflict with your own experiences? I’m eager to hear other perspectives – the discussion and continuous learning never stop in our field.


Related


Monday, December 12, 2022

Mini TejonesConf 2022 / Honey Badger team gathering

It's been almost three years since we last gathered as a small group of friends for a (reduced) TejonesConf. This time, with the challenges posed by the COVID-19 pandemic, we decided to prioritize reconnecting with the original Honey Badger team and some special guests. We wanted to enjoy each other's company and be able to have intimate, in-person conversations.


As in previous TejonesConfs, we decided to use the open space format for this edition. Due to the small size of our group, we opted for a single track to allow for more focused discussions and deeper conversations. As always, the open space format proved to be a success, providing us with a minimal structure that allowed us to share experiences and spend a lot of time enjoying each other's company.


During the conference, we still managed to share some interesting experiences and insights. We discussed topics like observability and the transition from unstructured logs to structured events, lean software development and the importance of deferring commitment, the challenges of Kubernetes packaging, and the differences between clean architecture and vertical slice architecture. We also touched on product development through experimentation.


As always, the format allowed for some great conversations during lunch and breaks. We discussed issues like power dynamics in pair programming, the toxicity of certain corporate cultures, and the challenges facing our profession.


It was an absolute pleasure to reconnect with old friends and catch up on each other's lives. While we couldn't get the entire group together due to logistical limitations, it was wonderful to spend time with those who could make it. Some of us even continued the conversation over dinner.


Until next time, friends!


BTW Thanks to Nextail for allowing us to use their offices and to Fran for managing it.


Related:



Tuesday, December 06, 2022

Good talks/podcasts (Dec 2022 I)

 


These are the best podcasts/talks I've seen/listened to recently:
  • Keynote: Why web tech is like this (Steve Sanderson) [Inspirational, Technology] [Duration: 1:00:00] Interesting talk about the evolution of web technology. The talk includes interesting demos.
  • #12 e-Meetup | Sam Newman - Monolith Decomposition patterns (Sam Newman) [Architecture, Architecture patterns, Evolutionary Architecture] [Duration: 1:30:00] Great presentation on how to approach the division of a monolith and the patterns to evolve an architecture towards microservices. In addition to the presentation, the subsequent questions are also very interesting.
  • What makes a good developer (Christin Gorman) [Engineering Career, Inspirational] [Duration: 0:11:00] (⭐⭐⭐⭐⭐) Inspiring lightning talk about the importance of humanities, empathy for users and information management as the basis of our profession (beyond pure technology and knowledge about logic or mathematics).
  • Stop Writing Dead Programs (Jack Rusher) [Inspirational] [Duration: 0:43:00] (⭐⭐⭐⭐⭐) This talk argues that it would be better to focus on building new live programming environments that can help us solve the problems of the future.
  • SEDaily: Serverless Clickhouse for Developers with Jorge Sancha (Jorge Sancha) [Big Data, Data Engineering, Product, startup] [Duration: 0:40:00] Interesting conversation about tinybird with one of its founders. They talk about the company, the problem they solve and other interesting topics related to real-time data analysis.
  • Improving Observability and Testing In Production (Dave Farley) [Observability, Testing in production, testing] [Duration: 0:19:00] In this episode, Dave explores what Testing in Production is, and how to Test in Production, and how this is related to working more experimentally.
Reminder, All these talks are interesting even just listening to them.

Related: