Week 1. Software Engineering and Software Lifecycles
5 min read
Week 1. Soft Eng. and Lifecycles
Software Engineering
Software Engineering
Software Engineering is the “systematic application of scientific and technological knowledge, methods, and the experience” to the design, implementation, testing, and documentation of software.
Maintainability: software should be written in a way that it can evolve to the changing needs of a customer. Software change is an inevitable requirement.
Dependability and security: dependable software should not cause physical or economic damage in the event of failure. Malicious users should not be able to access or damage the system.
Acceptability: Software must be acceptable to the type of users that it’s designed for. Must be understandable, usable and compatible with the systems that they use.
Business and social change (issue affecting software)
Business and social change: business and society are changing as emerging economies develop and new technologies become available. They need to be able to change their existing software and to be able to rapidly develop new software.
Scale: software has to developed across a very wide range of scales, from very small embedded systems in portal or wearable devices to Internet-scale, cloud-based systems that serve customers globally.
There are many different types of software systems and there is no universal set of software techniques applicable to all of these. The software engineering methods and tools used depend on the type of application being developed, the requirements of the customer and the background of the development team.
Types of Applications
Stand-alone applications
Stand-alone applications are application systems that run on a local computer, they include all necessary functionality and do not need to be connected to the internet.
Interactive transaction-based applications: applications that execute on a remote computer and are accessed by users from their own PCs or terminals. These include web applications.
Batch processing systems: business systems designed to process data in large batches, process large numbers of individual inputs to create corresponding outputs.
Systems should be developed using a managed and understood development process. Dependability and performance are important for all types of system.
It is important to understand and manage the software specification and requirements.
Where appropriate, software should be reused rather than developed again.
Internet software engineering
The web is now a platform for running applications and many organisations are now increasingly developing web-based systems. Web services allow application functionality to be accessed over the web.
Cloud Computing
Cloud computing is an approach to provisioning of computer services where applications run on the ‘cloud’ (remote servers). Users do not buy software but usually pay to use.
Before starting a project, we need to know whether it can be done successfully.
Business need: is there a case or use for this system?
Technical feasibility: is it possible with available technology?
Financial feasibility: can it be developed within the budget?
Time: is it possible to develop in a useful time frame?
Resources: are all necessary resources available for development?
2. Requirements Analysis
Systematically identify and record requirements of stakeholders.
The requirements should reflect the needs of the stakeholders:
Functional requirement
A functional requirement is what the system should do, it is a series of statements of the services the system should provide, how the system should react to particular inputs and how the system should behave in particular situations.
A non-functional requirement is how the system should do it. (refers to performance, usability, extensibility and related)
It includes constraints on the services or functions provided by the system.
Constraints imposed by system context. (existing systems, policy, law, etc.)
Requirements may be conflicting or ambiguous so analysis aims to resolve ambiguity and conflict. These final requirements may be eventually written up as a specification, this can be in any form such as a multi-page document, formal-logic specification, user stores, use cases, etc.
A specification should include requirement prioritisation:
MoSCoW style
MoSCoW style is based on risk / benefit analysis and follows as “Must, Should, Could, Won’t”.
Design by thinking through detailed structure and algorithms within components.
This is risk / value driven, so invest an appropriate amount of effort into each part of the system. Don’t design everything, some things can just be programmed.
Focus on parts that are technically difficult.
High-level analysis of performance, security, safety, reliability, potentially using automated tools.
4. Implementation
This stage involves building the software following the design documents, using the appropriate languages and tools. May involve expertise from different areas and including code for physical and development views.
5. Testing
Aim is to discover errors before they make it into production.
White-box testing
White-box testing is test cases determined based on understanding of code / design structure, aiming to test each program path.
Risk of failure increases with project length since increments are short.
Project always delivers something.
Disadvantages:
Difficult to identify the end of the project.
Difficult to plan costs and budgets.
Can easily deteriorate into code and fix.
Susceptible to technical debt.
Examples of incremental approaches
Agile Lifecycle
Agile lifecycle
Agile approaches favour incremental / iterative approaches, it is often driven by a feature list. It is regularly reviewed and re-prioritised with the product owner and any relevant stakeholders.
Planning horizon is often very short-term, architectural concerns are sometimes only captured through the “Minimum Viable Product”. In SCRUM (see below), it is sometimes captured through a “Sprint 0”, which does initial planning work.