SE-EDU
Home
About
Search
About this book
About
How to use this book
Software engineering
Software engineering
Object-oriented programming
Object-oriented programming
Requirements
Requirements
Gathering requirements
Specifying requirements
Design
Design
Design fundamentals
Modeling
Architecture
Design patterns
Design approaches
Implementation
IDEs
Code quality
Refactoring
Documentation
Error handling
Integration
Reuse
Quality assurance
Quality assurance
Testing
Test case design
Project management
Revision control
Project planning
Teamwork
SDLC process models
Tools
UML
IntelliJ IDEA
Git and GitHub
Principles
Principles
Supplementary
C++ to Java
Combined exercises
List of definitions
List of references
List of learning outcomes
Printable version
Software Engineering for Self-Directed Learners »
Learning outcomes
Software engineering
Can explain pros and cons of software engineering
Requirements
Requirements
Can explain requirements
Can explain non-functional requirements
Can explain prioritizing requirements
Can explain quality of requirements
Gathering
Can explain brainstorming
Can explain user surveys
Can explain observation
Can explain interviews
Can explain focus groups
Can explain prototyping
Can explain product surveys
Specifying
Can explain prose
Can explain feature list
Can write simple user stories
Can write more detailed user stories
Can use user stories to manage requirements of project
Can explain use cases
Can use use cases to list functional requirements of a simple system
Can specify details of a use case in a structured format
Can optimize the use of use cases
Can explain glossary
Can explain supplementary requirements
Design
Software design
Can explain what is software design
Design fundamentals
Can explain abstraction
Can explain coupling
Can reduce coupling
Can identify types of coupling
Can increase cohesion
Can explain cohesion
Object oriented programming
Can describe OOP at a higher level
Can describe how OOP relates to the real world
Can explain the abstraction aspect of OOP
Can explain the encapsulation aspect of OOP
Can explain the relationship between classes and objects
Can explain class-level members
Can explain the meaning of enumerations
Can explain associations
Can explain the meaning of navigability
Can explain the meaning of multiplicity
Can explain dependencies among classes
Can explain the meaning of composition
Can explain the meaning of aggregations
Can explain the meaning of association classes
Can explain the meaning of inheritance
Can explain method overriding
Can explain method overloading
Can explain interfaces
Can implement abstract classes
Can explain dynamic and static binding
Can explain substitutability
Can explain OOP polymorphism
Can explain how substitutability operation overriding, and dynamic binding relates to polymorphism
Can answer frequently asked OOP questions
Can combine some OOP concepts
Modeling
Can explain models
Can explain how models are used
Can identify UML models
Can use basic-level class diagrams
Can use intermediate-level class diagrams
Can use advanced class diagrams
Can use basic object diagrams
Can explain object oriented domain models
Can explain deployment diagrams
Can explain component diagrams
Can explain package diagrams
Can explain composite structure diagrams
Can use basic-level activity diagrams
Can draw basic sequence diagrams
Can draw intermediate-level sequence diagrams
Can interpret advanced sequence diagrams
Can explain use case diagrams
Can explain timing diagrams
Can explain interaction overview diagrams
Can explain communication diagrams
Can explain state machine diagrams
Can explain how modeling can be used before implementation
Can use simple class diagrams and sequence diagrams to model an OO solution
Can use intermediate class diagram and sequence diagram concepts to model an OO design
Architecture
Can explain Software Architecture
Can interpret an architecture diagram
Can draw an architecture diagram
Can explain architectural styles
Can identify n-tier architectural style
Can identify the client-server architectural style
Can identify transaction processing architectural style
Can identify service-oriented architectural style
Can identify event-driven architectural style
Can name several other architecture styles
Can explain how architectural styles are combined
Design patterns
Can explain design patterns
Can explain design patterns format
Can explain the Singleton design pattern
Can apply the Singleton design pattern
Can decide when to apply Singleton design pattern
Can explain the Abstraction Occurrence design pattern
Can explain the Facade design pattern
Can explain the Command design pattern
Can explain the Model View Controller (MVC) design pattern
Can explain the Observer design pattern
Can combine multiple patterns to fit a context
Can recognize some of the GoF design patterns
Can explain pros and cons of design patterns
Can explain how patterns exist beyond the domain of software design
Can differentiate between design patterns and principles
Design approaches
Can explain multi-level design
Can explain top-down and bottom-up design
Can explain agile design
Implementation
IDEs
Can explain IDEs
Can explain debugging
Code quality
Can explain the importance of code quality
Can explain the importance of readability
Can improve code quality using technique: avoid complicated expressions
Can improve code quality using technique: avoid deep nesting
Can improve code quality using technique: avoid long methods
Can improve code quality using technique: avoid magic numbers
Can improve code quality using technique: make the code obvious
Can improve code quality using technique: avoid premature optimizations
Can improve code quality using technique: do not 'trip up' reader
Can improve code quality using technique: practice KISSing
Can improve code quality using technique: SLAP hard
Can improve code quality using technique: structure code logically
Can improve code quality using technique: make the happy path prominent
Can explain the need for following a standard
Can follow simple mechanical style rules
Can follow intermediate style rules
Can explain the need for good names in code
Can improve code quality using technique: use nouns for things and verbs for actions
Can improve code quality using technique: use standard words
Can improve code quality using technique: avoid misleading names
Can improve code quality using technique: not too long, not too short
Can improve code quality using technique: use name to explain
Can explain the need for avoiding error-prone shortcuts
Can improve code quality using technique: avoid empty catch blocks
Can improve code quality using technique: delete dead code
Can improve code quality using technique: don't recycle variables or parameters
Can improve code quality using technique: use the default branch
Can improve code quality using technique: minimize code duplication
Can improve code quality using technique: minimize scope of variables
Can explain the need for commenting minimally but sufficiently
Can improve code quality using technique: do not repeat the obvious
Can improve code quality using technique: write to the reader
Can improve code quality using technique: explain what and why, not how
Refactoring
Can explain refactoring
Can apply some basic refactoring
Can decide when to apply a given refactoring
Documentation
Can explain the two types of developer docs
Can distinguish between top-down and bottom-up documentation
Can explain the advantages of top-down documentation
Can write documentation in a top-down manner
Can explain the need for comprehensibility in documents
Can write reasonably comprehensible developer documents
Can write minimal yet sufficient documentation
Can explain that documentation should be minimal yet sufficient
Can write JavaDoc comments
Can explain JavaDoc
Can explain Markdown
Can write documents in Markdown format
Can explain AsciiDoc
Error handling
Can explain error handling
Can explain exceptions
Can explain how exception handling is done typically
Can avoid using exceptions to control normal workflow
Can explain assertions
Can use assertions
Can use assertions optimally
Can explain logging
Can use logging
Can explain defensive programming
Can use defensive coding to enforce compulsory associations
Can use defensive coding to enforce 1-to-1 associations
Can use defensive coding to enforce referential integrity of bidirectional associations
Can explain when to use defensive programming
Can explain the Design-by-Contract approach
Integration
Can explain integration
Can explain how integration approaches vary based on timing and frequency
Can explain how integration approaches vary based on amount merged at a time
Can explain how integration approaches vary based on the order of integration
Can explain build automation tools
Can explain continuous integration and continuous deployment
Can combine some integration concepts
Reuse
Can explain software reuse
Can explain the costs and benefits of reuse
Can explain APIs
Can design reasonable quality APIs
Can explain libraries
Can make use of a library
Can explain frameworks
Can differentiate between frameworks and libraries
Can explain platforms
Can explain cloud computing
Can distinguish between IaaS, PaaS, and SaaS
Quality assurance
Quality assurance
Can explain software quality assurance
Can explain validation and verification
Can explain code reviews
Can explain static analysis
Can explain formal verification
Testing
Can explain testing
Can explain testability
Can explain unit testing
Can use stubs to isolate an SUT from its dependencies
Can explain integration testing
Can explain system testing
Can explain alpha and beta testing
Can explain dogfooding
Can explain developer testing
Can explain the need for early developer testing
Can explain exploratory testing and scripted testing
Can explain the choice between exploratory testing and scripted testing
Can explain acceptance testing
Can explain the differences between system testing and acceptance testing
Can explain regression testing
Can explain test automation
Can semi-automate testing of CLIs
Can explain test drivers
Can explain test automation tools
Can explain automated GUI testing
Can explain test coverage
Can explain how test coverage works
Can explain dependency injection
Can use dependency injection
Can explain TDD
Can follow TDD
Test case design
Can explain the need for deliberate test case design
Can explain positive and negative test cases
Can explain black box and glass box test case design
Can explain equivalence partitions
Can apply EP for pure functions
Can apply EP for OOP methods
Can explain boundary value analysis
Can apply boundary value analysis
Can explain the need for strategies to combine test inputs
Can explain some basic test input combination strategies
Can apply heuristic ‘each valid input at least once in a positive test case’
Can apply heuristic ‘no more than one invalid input in a test case’
Can apply multiple test input combination techniques together
Can explain test case design for use case based testing
Can explain test case design techniques at a higher level
Can combine test case design techniques
Project management
Revision control
Can explain revision control
Can explain repositories
Can explain saving history
Can explain basic concepts of how RCS history is used
Can explain remote repositories
Can explain branching
Can explain DRCS vs CRCS
Can explain forking workflow
Can explain feature branch flow
Can explain centralized flow
Project planning
Can explain work breakdown structures
Can explain milestones
Can explain buffers
Can explain issue trackers
Can explain Gantt charts
Can explain PERT charts
Teamwork
Can explain common team structures
Process models
Can explain SDLC process models
Can explain sequential process models
Can explain iterative process models
Can explain agile process models
Can explain XP
Can explain scrum
Can explain the Unified Process
Can explain CMMI
Can explain process models at a higher level
Tools
UML
Can explain/identify class diagrams
Can draw UML classes
Can interpret simple associations in a class diagram
Can interpret association navigabilities in class diagrams
Can explain/use association roles in class diagrams
Can explain/use association labels in class diagrams
Can explain what is the multiplicity of an association
Can use dependencies in a class diagram
Can show an association as an attribute
Can interpret enumerations in class diagrams
Can interpret class-level members in class diagrams
Can interpret association classes in class diagrams
Can interpret composition in class diagrams
Can interpret aggregation in class diagrams
Can interpret class inheritance in class diagrams
Can interpret abstract classes in class diagrams
Can interpret interfaces in class diagrams
Can explain/identify object diagrams
Can draw UML objects
Can interpret simple associations among objects
Can explain/identify sequence diagrams
Can interpret sequence diagrams with basic notation
Can interpret sequence diagrams with object creation
Can interpret sequence diagrams with object deletion
Can interpret sequence diagrams with loops
Can interpret sequence diagrams with self invocation
Can interpret sequence diagrams with alternative paths
Can interpret sequence diagrams with optional paths
Can interpret sequence diagrams with parallel paths
Can interpret sequence diagrams with reference frames
Can interpret sequence diagrams with minimal notation
Can explain activity diagrams
Can interpret linear paths in activity diagrams
Can interpret alternate paths in activity diagrams
Can interpret parallel paths in activity diagrams
Can use rakes in activity diagrams
Can explain swimlanes in activity diagrams
Can use UML notes
Can specify constraints in UML diagrams
Can distinguish between class diagrams and object diagrams
Intellij IDEA
Can setup a project in an IDE
Can navigate code effectively using IDE features
Can use some useful IDE productivity shortcuts
Can step through a program using a debugger
Can use automated refactoring features of the IDE
Git and GitHub
Can create a local Git repo
Can commit using Git
Can set Git to ignore files
Can tag commits using Git
Can load a specific version of a Git repo
Can use Git to stash files
Can clone a remote repo
Can pull changes from a repo
Can fork a repo
Can push to a remote repo
Can use Git branching
Can use Git to resolve merge conflicts
Can create PRs on GitHub
Can review PRs on GitHub
Can review and merge PRs on GitHub
Can follow Forking Workflow
Principles
SE principles
Can explain single responsibility principle
Can explain interface segregation principle
Can explain Liskov Substitution Principle
Can explain dependency inversion principle (DIP)
Can explain open-closed principle (OCP)
Can explain SOLID Principles
Can explain separation of concerns principle
Can explain the Law of Demeter
Can explain Brooks' law
Can explain YAGNI principle
Can explain DRY principle
Can combine some concepts of principles
Learning outcomes
Software engineering
Requirements
Requirements
Gathering
Specifying
Design
Software design
Design fundamentals
Object oriented programming
Modeling
Architecture
Design patterns
Design approaches
Implementation
IDEs
Code quality
Refactoring
Documentation
Error handling
Integration
Reuse
Quality assurance
Quality assurance
Testing
Test case design
Project management
Revision control
Project planning
Teamwork
Process models
Tools
UML
Intellij IDEA
Git and GitHub
Principles
SE principles