Developing a software application means building new ways for humans to interact productively with a computer.
Like a specialised language, an application enables two-ways communication with a counterparty — the computing machine — for a specific goal.
When the machine is driven by the user to perform a task, it relays back some notion of its inner workings.
The fidelity of this feedback loop is essential to the quality of user experience: as with any sophisticated instrument, by using a computer we iteratively learn what it enables us to do, and we adjust, in response to that, the realm of our creative possibilities.
Arbitrary limitations, poor performance, lack of self-consistency, rather than being simply annoying traits of software applications, which make our work more difficult than it needs to be, are in fact hampering our ability to reason in innovative ways: like an out-of-tune piano, a poorly developed application affects creativity at its source, impeding an ideal user performance with its own idiosyncrasies and impossibilities.
Developing applications in a way that enables an empowering level of interaction is only possible by carefully and professionally mediating between the client's applicative domain and a properly selected stack of technologies.
Minimum viable products, early and frequent releases are vital practices for success, but they must be accompanied by a speculative activity, continuously challenging the current domain model, ready to revise and rework architecture and code when hypotheses are falsified.
Technical skills must not be a barrier to erect as a protection from the world, but the means for a developer to display and let others experiment with a novel view of the world: a living thing that is destined to be tested, criticised, recast, amended, redone, improved perpetually, precisely because there is value in it.