It is modern to be data-driven. Organizations brag: “We make decisions based on data.” Having spent a decent amount of time building data-crunching systems, I have a lot of sympathy for this attitude. In fact, I have suggested data-driven approaches in previous articles. But I also think that the tendency to measure and quantify everything... Continue Reading →
Clean Code: Simple and Easy
If we had to write a list of typical skills we expect of Software Engineers, “writing clean code” would probably be on it. However, the trouble with clean code is that it is hardly an objective measure. I don't think I've ever worked in a team where everyone had the same understanding of what it... Continue Reading →
A Solution to the Diamond Dependency Problem
In this article, I want to explore a strategy of dependency management that enables transitive dependencies to evolve independently and to disentangle the gnarly problem of conflicting transitive dependencies. Dependency hell is a real place. The times I am struggling trying to find a matching set of dependencies are moments in which I ask myself... Continue Reading →
Good Systems / Bad Systems
In “Good Strategy / Bad Strategy”, Richard Rumelt provides a framework for strategic thinking. I found that the ideas from his book also translate to the design of software systems: The key is to have a good sense of the relative strengths and weaknesses of your current position and to apply coherent design decisions. Analysis... Continue Reading →
Bayesian Software Architectures: An Exercise of Predicting the Future
I have talked about how software architecture design is a way of constraining the solution space for a project. Here is another angle on this: Any attempt to design a software architecture is an exercise in predicting the future. The usual way to make predictions is to extrapolate data from the past. This is based... Continue Reading →
The Trouble With Rewrites
I have a bit of a soft spot for legacy systems. They have a certain charming ugliness to them. Clearly, there is a ton of challenges with legacy projects, partly related to organizational incentives, and partly related to technical concerns. Sometimes the response to these challenges is: Let’s rewrite all of it. I think that... Continue Reading →
On CV-Driven Development
When someone first mentioned the term CV-driven development to me, I remember finding it both extremely apt and equally funny. The concept describes the propensity of software professionals to select a tool not only by its ability to do the job but by its effect on the engineer’s career prospects. Indeed, some risky bets on... Continue Reading →