Engineering Principles

February 25, 2025

These are the principles I actually use when I build web applications and blockchain systems—for startups and for institutions. They're not tied to a stack. They keep quality and reliability in the same conversation as shipping.

Engineering Principles

User Experience First

The best technology in the world means nothing if users hate using it. Always prioritize clarity, usability, and performance. A clear, fast product beats clever internals.

Keep It Simple

The best code is no code. Avoid unnecessary abstractions and complexity. If a problem can be solved without writing more code, that's often the better choice. Simplicity scales, complexity does not.

Automate and Secure Everything

Security is non-negotiable. Automate processes to reduce human error and ensure predictable, repeatable deployments. Continuous testing and security-first development practices prevent disasters before they happen.

AI-Driven Workflows

Use AI to enhance productivity. Automate tedious tasks, streamline workflows, and integrate smart tooling. This is not about replacing engineers; it's about giving them time for the work that actually needs judgment.

Open Source and Portability

Build systems that can be deployed anywhere. Open-source technologies foster collaboration, reduce vendor lock-in, and keep you portable when platforms shift.

Ship Fast, Learn Faster

Frequent releases mean continuous learning. Get user feedback early and iterate quickly. Software is never "done"—it ages like milk, not wine. The longer you wait to ship, the higher the cost of mistakes. This is especially true when leading development teams.

Functional > Unit Testing

Unit tests are useful, but functional tests ensure real-world reliability. Test how the system behaves as a whole rather than getting lost in isolated components.

Optimize Later

Premature optimization is the root of all evil. First, make it work. Then, measure. Then, optimize only when necessary. This avoids overengineering and wasted effort.

Software Ages Like Milk, Not Wine

Software doesn't improve over time—it degrades. APIs change, dependencies become outdated, and technical debt accumulates. Constant maintenance and refactoring are necessary to keep systems relevant and functional.

The Unix Philosophy

The Unix philosophy is timeless and remains a gold standard for building software:

Modularity: Write simple parts connected by clean interfaces.

  • Clarity: Clarity is better than cleverness.

  • Composition: Design programs to be connected to other programs.

  • Separation: Separate policy from mechanism; separate interfaces from engines.

  • Simplicity: Design for simplicity; add complexity only where necessary.

  • Parsimony: Write a big program only when nothing else will do.

  • Transparency: Make systems easy to inspect and debug.

  • Robustness: Comes from simplicity and transparency.

  • Representation: Encode knowledge into data, so the logic stays simpler.

  • Least Surprise: Interfaces should do the least surprising thing.

  • Silence: If a program has nothing important to say, it should say nothing.

  • Repair: When failing, fail noisily and as soon as possible.

  • Economy: Programmer time is more valuable than machine time.

  • Generation: Write programs to write programs when possible.

  • Optimization: Prototype before polishing. Get it working before optimizing.

  • Diversity: Distrust all claims of a "one true way."

  • Extensibility: Design for the future—it will be here sooner than you think.

Engineering is not just about writing code—it's about crafting systems that stand the test of time. These principles guide decision-making, ensuring that software remains maintainable, scalable, and valuable to users.

Related writing