Microservices Until Macro Complexity
At QCon New York last month I hosted a panel on architecture and nearly all of the questions were about microservices. It isn’t hard to sense the excitement many are feeling about this approach. When I first heard about microservices, the people talking about them framed them as a reaction to monolithic architecture, frameworks, and SOA. It . . .
Microservices and the Failure of Encapsulation
One of the things that we don’t appreciate enough in software development is the way that ideas echo across the industry. I remember seeing Rich Hickey and Stu Halloway presenting Datomic and feeling palpable echoes of git’s repository model. A similar thing happened to me a while ago with microservices - I got the sense that they were an . . .
Literate Chains for Functional Programming
One of the clear benefits of functional programming is composability. It’s easy to take fundamental operations like maps, filters, and folds, and build up computations that are both powerful and concise. But sometimes concision can come at the expense of readability.
This Ruby code creates a data structure that is used to generate . . .
Code Change Complexity
Recently, I’ve been using algorithmic complexity as a metaphor for change complexity.
Usually, when people talk about complexity in code, they are talking about cyclomatic complexity in classes and methods, but the fact of the matter is that there are other forms of complexity that are worth noting - particularly the complexity of . . .
Ripeness for Refactoring
People don't refactor nearly enough in most projects. It’s easy to find large classes and methods, inscrutable logic and poor naming in most code bases. When we have that sort of situation it’s easy to just look the code and say “that needs refactoring.” The implication is that we should fix problems when we see them - if we can identify . . .
A Default Identity Value for Programming
Default values can make programming easier. On the other hand, they can confuse us a bit. In C and C++ default values are considerable work. We need to know when the language (or our abstractions) are providing them and when they aren't. In some languages, things are clearer - numerics are always initialized to a flavor of zero.
. . .Making Map Operations Implicit in Programming
Every once in a while a couple of ideas come together. I was running a workshop on error handling the other day and over the course of it we started discussing the Maybe monad and Scala's Option type. I put this example from the Scala docs up on the screen:
val name: Option[String] = request getParameter "name"
val upper . . .