Software Engineering |
Translate This Page To: Deutsche Francaise Espanol Italiana Português Russian Chinese Korean |
There are two different general approaches that are commonly taken in the software industry for software development. The first, most common approach is a heads down programming approach whereby developers frantically try to throw a system into place without identifying the relative importance of the key abstractions and problems in the problem space. This approach fails to fully work out a solid design. The second, less common path taken is to engineer the software.
The main problem with the first, programming-centric approach is that because key abstractions may not have been identified and the relative importance of abstractions has not been explicitly addressed, these discovery activities are not undertaken until later in the project at a point where work may already have been done related to these concerns. The work that has already been conducted may then be based upon the foundation of erroneous assumptions and will then have to be reworked. The higher level the impact for the mistake that was made, the more rework that will need to be done. This is a very prevalent problem in software development in the current software industry and is responsible for much of the thrashing in development and slipping schedules that commonly occur.
Software engineering is the systematic application of scientific principles to all aspects of software design and development in the development of software. This includes applying science to the development process itself, to the leveling of abstractions in the problem space, to the architectural design, detailed design, and design details in the development effort. This means that every aspect of the software design has been addressed with logical reasoning that can account for every decision that has been made in the development effort from the highest level abstraction to the lowest level detail. There is no slop and no arbitrary judgement involved. Problems are fully considered and the appropriate solutions are specified. Software engineering mitigates development risks by systematically applying science to the problems in the problem space, and by identifying problems and risks up front in the development effort.
It is not possible for two different approaches to be equally applicable when all pertinent considerations have been considered. One solution always has merit over another based on the relative importance of pertinent considerations. Taking this one step further, if we consider the range of problems that must be addressed in a software development effort, there can then be only one optimal solution that addresses all of the problems in the problem space that the project addresses. This optimal solution is modeled in the Pattern Model. This optimal solution takes into account the constraints that the project must be conducted within, such as available technologies, deployment considerations, and extensibility. Qualitative constraints such as performance and extensibility must be assigned prioritization or weighted importance.
Software engineering is NOT an art. Software engineering is a science. Artists usually do not have a grasp on the abstractions they will address when they begin their work. Artists address problems in their art as they arise, although they may have some general, vague plan for the work of art. Artists will not usually commit to a deadline, because they are unsure of the scope their work covers and the details involved. Artists rarely meet deadlines because they are guessing when they commit to a deadline. Many times artists can not articulate their reasoning because they do not understand it explicitly themselves. Many times artists hide behind the veil of calling themselves "artists" because it is convenient to hide these shortcomings. If you are managing a software development effort, you should not want an artist architecting or developing your system. You should want a professional scientist and an engineer running the show. Having command over the problem space is essential to optimizing the development time in a software development effort.
|