Modern era can easily be defined as the age of software. Software is so pervasive that it literally encroaches on every aspect of our lives, we interact with some form of software or other from the moment we wake in the morning until we go back to sleep at night, whether it be using our alarm clocks, making our coffee, driving our cars, watching television, listening to our radio's, ATM withdrawals the list goes on.
Software can be categorized into two distinguishing types :
- System Software is software that acts as tools to help construct or support applications software i.e. Operating Systems, Databases, networking software and compilers.
- Application Software is software that helps perform some directly useful or enjoyable task i.e. e-mail software, word processors, spreadsheet, smart phone apps, games etc.
Software can either be bought as off-the-shelf software i.e. Microsoft Office 365 or it can be the result of a bespoke development to accomplish a specific task like lunar landing module.
Many people don't realise that the development of software is not a simple task, and it often requires the interaction and collaboration of a team of professionals. Often these teams will include people with a diverse set of skill sets and specialities.
The challenges experienced by a software development team during the development of software are a direct result of the goals the software seeks to achieve which include;
- Meeting the users' needs
- low cost of production
- high performance
- low cost of maintenance
- high reliability
- delivery on time
In order to overcome the challenges and obstacles faced and successfully develop software product, a team will need to implement processes, methods and tools which are collectively known as software engineering. The basic main ideas are:
- Emphasis on carrying out all stages of development systematically
- emphasis on establishing exact user requirements
- formal specification of the requirements
- delivering early versions of system components to customers (prototyping)
- selection & use of programming languages
- Quality Assurance
What is software engineering ?
Software engineering not only covers the technical aspects of building software systems like programming etc. , but also includes management issues, such as directing programming teams, scheduling, and budgeting etc.
In a nutshell software engineering can be defined as the application of systematic, disciplined, quantifiable approach to the development, operation and maintenance of software and the study of these approaches. It is the application of systematic approach to the analysis, design, assessment, implementation, test, maintenance to software development integrating significant mathematics, computer science and practices whose origins are in engineering.
Many programmers view the writing of computer code as a craft and I personally do subscribe to that view, but I also concede that in order for a software solution to be successful it still requires the application of rigid engineering practices.
Although I do acknowledge that programming itself can be classified as a craft, I will have to affirm that great software is engineered. Code may well be elegant, beautiful and well crafted but it is still useless if it doesn't address requirements, produced to budget and delivered on time.
It is the process of gathering requirements, defining solution boundaries and quality control and a number of other processes involved in implementing a software solution, that is the actual engineering part. This is primarily the reason why I believe software is engineered rather than crafted. Programmers my consider themselves craftsmen, but they work on an engineering team.
What is your view is software crafted or engineered? would love to read your comments and opinions below.