Megaworkarounds (long)

Computing technology is still in its infancy with respect to durability, reusability and correctness of code, as evidenced by the fact that developers have to deal with system issues constantly in application code. We are always writing almost the same code over and over because the new code is running on a different language or platform, takes advantage of new system features, or needs different dependencies. We don’t have a space to construct abstracted data and operations where we are free from thinking about the machine boundaries, memory management and other concerns that detract from the purity of the logic. Therefore most of what we write is within the space bound by those limits.

Engineering today is therefore an art of tying together the abstract perfection of pure logic with the finesse of manipulating actual machines. That art – working around limitations – is essentially what’s difficult about the art. It’s hard mainly because the technology is immature.

To be highly effective, we have to stay focused on what’s coming and meanwhile work with what we have. That’s the concept of “megaworkarounds” – the collection of work patterns and techniques used to effectively work around the limitations of the state of technology. We need to be aware when we are doing a megaworkaround and why, and that’s what this article covers. It’s not about “best practices” (as if that characterizes some kind of end state) but it’s rather about ways to do things solidly despite being amidst chaos.

Read more

Writing Requirements

This article captures the art of software requirements writing as it’s done at Divergent Labs.

The requirements document lists everything the product or feature will do, in a way that everyone on a team can read. Let’s start with a few examples from a hypothetical project that allows a user to enter comments attached to specific frames in a video. These requirements are in no particular order for this example.

Read more

Software Engineering Overview at Divergent Labs

This article describes the software development approach used at Divergent Labs. In the early part of my career I focused on small projects ranging in size from $500 to $5,000 each, completing a dozen or more of them per year. Through that experience I learned how to manage rapid life cycles efficiently and comprehensively. The process I developed works for larger projects too, and so it became standard for the work we do.

Read more

Software Engineering Versus the Alternative

In my decades of work as a custom software developer, I’ve concluded that engineering is a good idea.

Engineering is what happens when requirements are distilled into the simplest, most elegant, fast and beautiful machine that enables long-lasting performance. If you just manage to get something to work through repeated fiddling, it probably shouldn’t be called “engineering”. Engineering requires a plan and process, projecting into the future, knowing the steps in advance, and reliably achieving the results.

Read more