- Exercises and possible solutions
- Slides
- Homework
- Demo project – this one has some interesting code examples
- How to transform data and avoid nesting
- Aleksei Hemeljainen - http://certs.devchampions.com/NN72YUEDXZ
- Zhanna Drobinina - http://certs.devchampions.com/N5BNWTUHSD
- Johanerik Pukk - http://certs.devchampions.com/LRMPINZ7PD
- Mats Kivistik - http://certs.devchampions.com/UMR55NVE7X
- Allar Vendla - http://certs.devchampions.com/2SE3NNP883
- Roel Rahkema - http://certs.devchampions.com/XSSHNIVCQB
- Meelis Tolk - http://certs.devchampions.com/15V4KD9CNB
- Karl Kyynal - http://certs.devchampions.com/QQDTIJAUK8
- Venno Viinapuu - http://certs.devchampions.com/KZLSEGTYMQ
- Joel Arula - http://certs.devchampions.com/W4P5BNFKMV
- Svetlana Usakova - http://certs.devchampions.com/PSEAY8SWR5
- Taras Maslych - http://certs.devchampions.com/PNFTMQ72XG
- Kylli Kangro - http://certs.devchampions.com/65ISDL6DPP
- Jaanus Raudsik - http://certs.devchampions.com/RL2GHXAZ9Y
- Raido Kuus - http://certs.devchampions.com/1UHK69JEU8
- Madis Janno - http://certs.devchampions.com/61H6RQMU8Y
- Mohamed Salem - http://certs.devchampions.com/XIU7YL581J
- Ahti Laurisson - http://certs.devchampions.com/6B7T4HNTWN
- Tiit Ginter - http://certs.devchampions.com/AIGKNH3PNJ
Congrats! : )
- Growing Object-Oriented Software Guided by Tests — Testing and TDD book
- TDD: TDD by Example (Kent Beck) — TDD book
- Secure by Design (Dan Bergh Johnsson, Daniel Deogun) — Software Design book
- Java Application Architecture (Kirk K.) — Architecture book
- Patterns of Enterprise Application Architecture – Architecture book
- Clean Code — coding book
- Head First Design Patterns (2nd edition) – Software Design book
- Domain-Driven Design (Vaughn Vernon) – Software Architecture and Design book
- Elegant Objects – OOP book, explains CQS well
- The Software Craftsman – inspiration to become a better programmer :-)
- The Clean Coder – inspiration to become a better programmer :-)
- Vavr — has
Either
class - Mug — has
Maybe
class - Shadow – gradle plugin that can relocate/repackage dependencies, to avoid transitive dependency conflicts.
- JSR 305 — contains @Nullable and other useful annotations that ErrorProne and NullAway understand
- 36 more awesome libraries: https://sizovs.net/2020/11/24/java-libraries-i-like/
- 🍿 SOLID principles
- 🍿 10 Reasons Why we Love Some APIs and Why we Hate Some Others
- 🍿 TDD, Where Did It All Go Wrong
- 🍿 Acceptance Testing for Continuous Delivery
- Marker interface
- The stepdown rule (explained well in Clean Code book)
- Don't let @Entities escape the transaction boundary. Always return DTOs.
- Spring "sees" static nested classes.
- Day I: more or less 100% coverage
- Day II: Managing dependencies between packages and why it matters. You can watch my old but still relevant video from XPDays conference in Ukraine. It's in Russian. English version is available too, but it's not that good IMHO. Or is it? :-)
- Day II: Unit and acceptance testing. Slides are pretty self-explanatory.
- Day II: Validation. Nothing particularly exciting here – just use Bean Validator to validate data classes. And remember that good objects are secure by design, t.i. objects should fail fast if you provide some falsy data; Even better – they shouldn't allow you to provide falsy data thanks to strong types. For example:
class Customer {
Customer(UniqueEmail email) {
this.email = email;
}
}
class UniqueEmail {
UniqueEmail(String uncheckedEmail, Uniqueness uniqueness) {
checkArgument(uniqueness.isGuaranteed(uncheckedEmail), "Email {} is not unique", uncheckedEmail);
this.email = uncheckedEmail;
}
}
interface Uniqueness {
boolean isGuaranteed(String email);
@Component
class AmongUsers implement Uniqueness {
AmongUsers(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public boolean isGuaranteed(String email) {
return !userRepository.existsByEmail(email);
}
}
}
- Day II: Aggregate roots. Software architecture best practices suggest that we should only create Repositories for Aggregate Roots. For example, BankAccount "owns" a collection of Transactions and controls access to them. So, Bank Account is an Aggregate Root. So our system should have one repository – BankAccountRepository, and never provide a separate repository for Transactions. Why? Check out the slides here: https://sizovs.net/jninja/part_2.html#86. For more explanation, read DDD book.
- Day II: Transactional Outbox Pattern. Good explanation here: https://microservices.io/patterns/data/transactional-outbox.html
- Twitter: @eduardsi
- LinkedIn – provide my email ([email protected]), as the account is protected
- Goodreads