Pragmatic software engineering = "UNPHAT"

Posted by Steven

I just read an article a friend tweeted: "You are not Google" by Ozan Onay. One of the concepts described is UNPHAT. Quoted from the article:

Next time you find yourself Googling some cool new technology to (re)build your architecture around, I urge you to stop and follow UNPHAT instead:

  1. Don’t even start considering solutions until you Understand the problem. Your goal should be to “solve” the problem mostly within the problem domain, not the solution domain.
  2. eNumerate multiple candidate solutions. Don’t just start prodding at your favorite!
  3. Consider a candidate solution, then read the Paper if there is one.
  4. Determine the Historical context in which the candidate solution was designed or developed.
  5. Weigh Advantages against disadvantages. Determine what was de-prioritized to achieve what was prioritized.
  6. Think! Soberly and humbly ponder how well this solution fits your problem. What fact would need to be different for you to change your mind? For instance, how much smaller would the data need to be before you’d elect not to use Hadoop?

This strongly reminded me of three things.

First, I used to be amazed by every new technology and wanted to work with it right away. Of course I want to do this even today, but not that strong. ;) This seems to be the case for a lot of young software engineers and is not particularly a bad thing.

Second, I recalled the advice two architects gave me independently from each other: "Be pragmatic. Design with a sense of proportion."

Third, there are a lot of architects like Stefan Zörner who strongly advice for documenting every major decision a project went through, including the options considered and the reasons the final candidate was chosen. That would be item 5 on the list, additionally written down and conserved.

These three things make me try to solve upcoming problems as good as I can. However, it's often just an informal decision I make on the spot. The UNPHAT principle Ozan Onay mentioned above is an easy to follow and great checklist to ensure that the solution is well-thought.


When solving problems with technology: Understand the problem. Think about multiple options to solve the problem. Do further research on the best option, including historical facts. Weigh the options against each other. Apply some more human intelligence and your experience. Then decide and act.