Writing software is essentially translating descriptions of what a system should do into an exact specification a machine can understand. Descriptions usually come in a human language and are written in terms specific to a problem area. Exact specifications are usually source files that then will be automatically translated into machine codes by compilers.
Translation from one lanuage into another is at the core of software development. What are some of the implications of this view point?
- Software Engineers are people who translate technical requirements into source code which is essentially just a technical blue print for a machine to execute
- Product Managers are persons who gather and systematize the descriptions of a system and can help translate them into technical requirements
- Bug is a misunderstanding, either a developer did not get the blue print for the machine right from the technical requirements or the technical requirements were wrong, contradictory or incomplete
- Software Testers are people who make sure that no misunderstanding occurs during the translation, that is, the system does what it is asked to do and in an expected manner
- To do software development better means faster and cheaper translation and fewer misunderstandings along the way, that is overall communication should be better and occur at appropriate times, hence various Agile processes make perfect sense, since a lot of communication is between humans
- In order to translate better and faster the system blue prints should reflect the problem domain, i.e. if we have the notion of ‘shipment’ in the problem domain language we better have something corresponding to it in the system blue prints, say, a class ‘Shipment’, hence domain-driven design is a good idea
- The higher the level of abstraction in the system blue prints software developers operate with when they are translating, the more productive they are, that is why it is important to have a DSL (domain specific language) emerge over time as the system is developed, and this is also why Ruby and specific problem oriented languages such as BPMN are so popular as they allow for more effective development by either providing effective means for constructing DSLs or making such DSLs available out of the box