Recently I was involved in a software development project. The software design was built with all the classes and their elements defined. Obviously this design was an object oriented design. At this stage I asked my team if we have everything needed to start writing the source code? The team affirmed that they have a good design and now they are ready to start writing the source code.
Frankly speaking this instant confidence in the team came from working on projects of similar nature for quite some time. But unfortunately this is not always the case. On most projects, you need to provide additional information to the project team apart from class designs.
Suppose you need to build a web based software application. Then you need to find out which programming language and which programming technology will be used on the project. Based on these choices your class designs may even need to be changed. In any case, these considerations play a profound role in software design and implementation. For example suppose in the web based application you want to display a message to the user in response for successful or unsuccessful operation for a user input. This type of response mechanism can be implemented in various ways. You can write the logic inside the server side scripts or inside a compiled class.
Without incorporating technological considerations, a software design may not work perfectly.