Periodic Table of Software Engineering - Top 118 Fundamental Elements of Software Engineering
BY MARKUS SPRUNCK
The following table is my personal collection of most important and fundamental elements of software engineering. It may serve as a guideline what a software engineer or programmer should learn, know and most of them practice. Some are small topics or methods, others are huge knowledge areas.
The Periodic Table of Software Engineering
Figure 1: Periodic Table of Software Engineering Elements
Requirements Management is the most important fundament for successful software development. This may sound boring, but is you don’t know what to develop you will fail. The starting point is Requirements Elicitation and Requirements Analysis. Try to describe Atomic Requirements and maintain Requirements Attributes. Requirements Reviews help to discover missing or wrong Requirements. With Management of Requirements Portfolio an entire requirements catalog all the changes are managed, here Traceability Management is an essential factor to analyse the impact of single changes.
Before starting with the implementation at least a first design is needed. The Component Design describes the high level design of all components and identifies the interfaces in the system and at the boundaries. Going to detailed design the first aspect is Database Design where the question about persistent data is clarified. Design Patterns are a good source to lean about best practices and approved design principles. With Architecture Pattern the view will be extended to entire systems of software. Especially enterprise integration pattern help to get a common understanding about communication between components. All paper work is fine, but some things have to be tested with Prototyping. Finally Design Notations help to reduce misconceptions due to different styles for boxes-and-lines graphics.
The knowledge of Basic Coding Skills is essential for the development of quality software. Writing maintainable code is a craftsmanship which needs long time practice and a lot of experience. Write code and with Code Refactoring it should be improved without changing the initial functionality. A good way to improve the quality of code and qualification of the developer are Code Peer Reviews. Proper Code Comments and Code Format Standards may improve the maintainability. The Code Reuse should be planned and higher requirement to quality should be applied.
With Static Code Analysis and Dynamic Code Analysis the quality can be analyzed and typical defect avoided. All the metrics like Volume Metrics (number of classes, lines of code, etc.), Complexity Metrics (cyclomatic complexity, etc.), Code Coverage (branch coverage, line coverage, etc.) and Dependency Analysis help to get a clearer picture about the inner state of design, code and test cases.
Test automation with Unit Testing and Integration Testing is essential. Independent of the actual way of implementation (test driven development or classic approaches) the need of unit tests is one of the most important fundament for good working software. Some special tests like Service Testing (focus on interfaces), Performance Testing and Stress Testing should also be automated if possible. Automate as much as possible and economic reasonable. With systematic Defect Root Cause Analysis all problems should be recorded, classified and managed to prevent defects in the new future. Exploratory Testing can't be automated, but is always needed.
It is important to know if functions are free of errors. The use ability of software is crucial for the success. With good User Interface Design and exhaustive User Acceptance test the proper use of software can be improved. In Usability Labs this can be investigated in detail.
Most of the activities in the software development process may be supported by tools like Code Analysis Tools, Continuous Integration Tools (to support build, deploy, reporting), Requirements Management Tools (for managing attributes and dependencies, reporting and traceability), Integrated Development Environments (for coding, debugging), Test Automation Tools, Profiling Tools, Modeling Tools (for modeling, reverse engineering, code generation) and Version Control Systems (for software configuration management).
The most popular agile approach to project and team organization is Scrum. For maintenance and support activities Kanban gives methods based on lean management principles to organize the work. Some of the most popular agile methods, principles and/or techniques are: Agile Planning with User Stories and Backlog Management. Here the Planning Game helps to get estimations. Popular programming techniques are Test Driven Development (TDD), Spike Solution (for prototyping or experiments), Continuous Integration and Continuous Delivery. Pair Programming fosters Collective Code Ownership and Stand-up Meetings help to maintain communication. The System Metaphor tells about how the system works and the Definition of Done clarifies what tasks have to be done by the team. The principle Travel Light focus on the keep it simple principle, because everything what has been created, has later to be maintained in the future. No Overtime focus on sustainable quality and productivity.
Independent of the development approach (agile or classic) for most change activities projects exists. Two of the most important activities are Risk Analysis and Expectation Management (partly requirements management and communication). The Task Management helps to get things done and Project Management Basics help to plan and track. Several complete different Estimations approaches exist; it is a good idea to know more than one. With Measurement of Activities and Project Controlling the progress of work can be tracked and managed.
During the past years the interface to IT infrastructure got more and more important. Basics of ITIL (Information Technology Infrastructure Library) help to understand the language and way of working of the people in infrastructure. The topic DevOps is quite new and focus on communication, collaboration and integration between software developers and information technology professionals. Proper Monitoring, IT Change Management, Automated Deployment and Test Data Management help to reduce manual efforts.
Software Engineering Basics
Basics of software engineering are a huge field starting with topics like Big-O Notation, Data Structures, Algorithm Design, State Machines, Encryption Basics, Parallel Computing, and Numerical Mathematics. Game Theory is helpful for strategic decision-making. Distributed Computing, Parallel Computing, Robotic Basics, Machine Learning and Artificial Intelligence will be more and more important. The four basic paradigms for programming, Object Oriented Languages (like Smalltalk, Java), Functional Languages (like Erlang, Clojure, F#), Declarative Languages (like SQL, XSLT, Regular Expressions) and Procedural Languages (like C, COBOL, PL/I, FORTAN) should be known. Other topics like Software Security Basics, Web Application Security, Database Systems, Aspect Oriented Programming and Network Protocols are needed. Know-how about different Software Development Process paradigms and implementation are helpful.
As soon the software is in the maintenance phase Maintenance Planning helps to plan and manage all the needed activities. Re-engineering (replace incorrect, incomplete and/or unavailable documentation) and Reverse Engineering (especially useful for databases) are used in cases larger parts of the software have to be changes. Here the Program Comprehension (documentation) helps to understand the existing software. It is strongly recommended to do a systematic Defect Root Cause Analysis for all defects.
Last but not least, the soft skills help to work with people (and this is what we do every day). With Rhetoric, Presentation Skills, Training Skills, Leadership Basics, Marketing Basics, Conflict Management and Negotiation Skills some simple techniques help to convince people. Empathy helps to recognize the emotions and mood of others and the Creation of Relationships has long term strategies to find people willing to help you in critical situations. Also Good Manners help to get along with human beings. Intercultural Skills help to work with partners from other countries and/or cultural areas and Creativity Techniques support you to find new ways of doing. With Intrinsic Motivation (self-motivation) and Physical Fitness you may work even in critical situations over a log period. Finally sometimes it is helpful to be able to Stop Talking and to spend more time with listening to people.