JAVA-201
Professional Java Best Practices and Test-Driven Development
Course Overview
As Martin Fowler wrote in his famous blog post, Flaccid Scrum, many Agile Software Development efforts fail, because they do not adopt Agile Engineering practices, which are not covered by the Scrum methodology. Agile Engineering practices allow teams to accommodate frequent changes, while still delivering code that is low in bugs, and deployable at the end of each sprint.
This course goes beyond an academic discussion of Object-Oriented Design and goes into a deep discussion of its effects on practical software engineering concerns such as maintainability, testability and reuse. The course then proceeds to discuss critical Java best practices which affect performance and correctness. This is followed by a discussion on modern software engineering approaches of Test-Driven Development and Refactoring, which improve the quality and maintainability of the codebase.
Students are provided with numerous hands-on exercises, the most challenging of which is the final team mini-capstone project, which includes changes to requirements mid-way!
Learning Outcomes
- Master object-oriented programming in Java for creating robust applications.
- Harness Java’s multithreading for enhanced performance and responsiveness.
- Excel in Spring and Hibernate frameworks for building enterprise applications with seamless database integration.
Suitable For
Anyone who has basic knowledge and experience with Java, wanting to explore Agile Engineering practices
Course Outline
Agile Engineering Overview
- Economic effect of bad code
- Technical debt vs technical investment
Review of Object-Oriented Programming
- Basic Pragmatic considerations
- Importance of encapsulation
- Advantages & disadvantages of inheritance & polymorphism
- Refused Bequest,
- Fragile Base Class Problem
- Danger of complexity
- Composition & delegation
- Favor composition over inheritance
- Liskov Substitution Principle
- Design by Contract
- Principle of Least Surprise
Object-Oriented Design
- Code Smells
- Information Expert
- Law of Demeter
- Single Responsibility Principle
- Separation of Concerns
- Don’t Repeat Yourself
- Protected Variations
- Common Reuse Principle
- Common Closure Principle
- Acyclic Dependencies Principle
- Stable Dependencies Principle
Continuous Integration
- A continuous integration tool will be used in their final mini-capstone project
Unit Testing and Test Driven Development
- JUnit introduction
- Tests as documentation
- Tests drive design
- FAQs & best practices
- several mob coding exercises on TDD & Refactoring
Refactoring
- Boy scout principle
- Two-hats metaphor
Java Best Practices
- String Pool,
- String Immutability
- String vs StringBuffer
- Performance considerations
- BigDecimal vs floating point primitives
- Collections best practices
- Exception Translation
- validating parameters and fields
- Defensive Copies
- Enums vs Constants
- Favor Immutability
- Overriding toString()
- Overriding equals() & hashCode()
- Avoid Passing Null
- Use Optional
- Exceptions best practices
- Closing resources
- Synchronization best practices
Mini-Capstone Project
- Group work that tests the team’s ability to write maintainable code
- Change request will be introduced towards the end of the mini-capstone project to challenge the maintainability of the code
Code Review
- Review of mini-capstone project