Software Engineering Complete

A dedicated handbook on the whole development process of a software engineering project

Based on textbook of CS2103T Software Engineering
Correct as AY2017/2018 Semester 1
School of Computing, National University of Singapore

A PDF version of this document is available at here.

Introduction

According to IEEE Standard Glossary of Software Engineering Terminology, software Engineering is the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software.

According to The Mythical Man-Month, software engineering (or programming) is fun because:

Frederick P. Brooks also stated in his book, software engineering may not be fun because:

A software project may be either:

Requirements

A software requirement specifies a need to be fulfilled by the software product. Requirements come from stakeholders (a party that is potentially affected by the software project, usually users).

There are two types of software requirements:

Gathering requirements

Specifying requirements

Glossary

A glossary serves to ensure that all stakeholders have a common understanding of the noteworthy terms, abbreviation, acronyms, etc.

Design

Design is the creative process of transforming the problem into a solution; the solution is also called design. There are two types of design in software engineering:

In a large software engineering project, design should be done at multiple levels. This can be done in a top-down manner, bottom-up manner or a mix.

Apart from an overall design, sometimes agile design is also important but it is different in the following ways: agile designs are emergent, they’re not defined up front. Although you will often do some initial architectural modeling at the very beginning of a project, that will be just barely enough to get your team going.

Design principles

Object-oriented programming

Class relationship

Class inheritance

Design pattern

MVC diagram

Implementation

Code quality

Refactoring

Refactoring is a process that improves a program’s internal structure in small steps without modifying its external behavior. It is different from code rewriting or debugging. It may reveal hidden bugs and improve performance, sometimes.

Given below are some common refactoring:

Documentation

Error handling

Integration

Build automation

CI/CD

Reuse

Quality assurance

Code review

Static analysis

Formal verification

Testing

Test case design

Project management

Revision control software

Project planning

Software Development Life Cycle

UML diagram

UML stands for unified modelling language. It is a general-purpose, developmental, modeling language in the field of software engineering, that is intended to provide a standard way to visualize the design of a system.

UML was originally motivated by the desire to standardize the disparate notational systems and approaches to software design developed by Grady Booch, Ivar Jacobson and James Rumbaugh at Rational Software in 1994-1995, with further development led by them through 1996.

Architecture diagram

The diagram below shows the architecture diagram of TEAMMATES:

Architecture diagram

Class diagram

UML class diagrams describe the structure (but not the behaviour) of an OOP solution. It is probably the most commonly used UML diagram among OOP programmers.

The diagram below shows the two basic rules above:

Class diagram for the table class

The diagram below shows how to draw association in the class diagram:

Class diagram for school

The diagram below shows how to draw association as an attribute in the class diagram:

Class diagram for square piece

The diagram below shows how to draw an association class in the class diagram:

Class diagram for library

Class diagram for book       Class diagram for club

Class diagram for student

Class diagram for vehicle and pet

Class diagram for staff

Class diagram for abstract staff

Class diagram for die and player

Conceptual class diagram

Below is an example of conceptual class diagram for snake-and-ladder game:

OODM for snake-and-ladder game

Object diagram

Below is a simple example of the object diagram:

Object diagram

Sequence diagram

The sequence diagram below illustrates these basic rules:

Sequence diagram for minefield       Sequence diagram reference

Activity diagram

The activity diagram below illustrates these rules:

Activity diagram for minefield       Activity diagram reference

Use case diagram

The diagram below shows how to draw a use case diagram:

Use case diagram for a blog system

Deployment diagram

A deployment diagram shows a system’s physical layout, revealing which pieces of software run on which pieces of hardware.

Deployment diagram

Component diagram

A component diagram is used to show how a system is divided into components and how they are connected to each other through interfaces.

Component diagram

Package diagram

A package diagram shows packages and their dependencies

Package diagram

Composite structure diagram

A composite structure diagram hierarchically decomposes a class into its internal structure.

Composite structure diagram

Timing diagram

A timing diagram focus on timing constraints.

Timing diagram

Interaction overview diagram

An interaction overview diagram is a combination of activity diagrams and sequence diagrams.

Interaction overview diagram

Communication diagram

A communication diagram are like sequence diagrams but emphasize the data links between the various participants in the interaction rather than the sequence of interactions.

Communication diagram

State machine diagram

A state machine diagram models state-dependent behavior.

State machine diagram

UML notes

UML notes

Software engineering principle

The five principles below are collectively known as SOLID:

Some other principles: