I've been obsessed with integrating the processes of designing and programming when making software for over a decade.

By considering design and implementation as one, I am able to anticipate the evolution of the design as I program. Frequently adapting as the product evolves and I learn in more detail. It's led me to develop principles and workflows that help maintain a holistic perspective throughout the whole process of making something.

Areas prone to more iteration get built more loosely, creating flexibility to experiment and improve. Foundational components at the product's core are built with robustness and stability in mind.

The design is the end product, and the product is the final artifact.

One of the advantages of this approach is the elimination of most of the labor and back-and-forth communication typically associated with creating and editing in design tools. Another is that, incorporating engineering constraints as part of the design thinking process allows for a more accurate translation of your vision into tangible, functional products.

There are certainly downsides as well, such as the need to critically assess one's thought process and making reliable judgments on the tradeoffs made along the way.

This approach is reminiscent of crafts such as carpentry, architecture, and clock-making, where practitioners often seamlessly merge creative and technical aspects of their work. In these fields, the union of art and engineering is generally perceived as a single craft. Similarly, the integration of design and programming in software development should be regarded as the craft of making modern software, emphasizing the synergy between the creative and technical aspects of the process.