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 explain 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 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 modelling 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
π Can combine some modeling concepts
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 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 software design domain
π 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 follow basic guidelines for improving readability
π Can follow intermediate guidelines for improving readability
π Can follow advanced guidelines for improving readability
π 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 follow basic guidelines for naming
π Can follow intermediate guidelines for naming
π Can explain the need for avoiding error-prone shortcuts
π Can follow basic guidelines for avoiding unsafe shortcuts
π Can follow intermediate guidelines for avoiding unsafe shortcuts
π Can explain the need for commenting minimally but sufficiently
π Can follow basic guidelines for writing code comments
π Can follow intermediate guidelines for writing code comments
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 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 do exception handling in code
π 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 bi-directional 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
OOP Implementation
π Can implement classes
π Can implement class-level members
π Can implement associations
π Can implement dependencies
π Can implement composition
π Can implement aggregation
π Can implement association classes
π Can implement basic inheritance
π Can implement operation overriding
π Can implement overloading
π Can implement interfaces
π Can implement abstract classes
π Can implement polymorphism
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 using history
π 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
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 push to a remote repo
π Can use Git branching
π Can use Git to resolve merge conflicts
π Can create PRs on GitHub
π Can review and merge PRs on GitHub
π Can follow Forking Workflow
Java
π Can use Java Collections
π Can use Java enumerations
π Can use Java varargs feature
π Can use JavaFX to build a simple GUI
π Can use Java8 streams
JUnit
π Can use simple JUnit tests
π Can use intermediate features of JUnit
Supplementary
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 principles concepts
Review
π Can combine software engineering concepts