- Exercises and possible solutions
- Solution to Exercise #20 (transforming data w/o nesting)
- Slides
- Homework
- Demo project β this one has some interesting code examples
- Karel Vuks - http://certs.devchampions.com/3JXCEWUHU5
- Raido Everest - http://certs.devchampions.com/RK7WWJFL3Y
- Janar Kallson - http://certs.devchampions.com/QYEKD17KET
- Mark Alexander Helme - http://certs.devchampions.com/DIUC5D9DFD
- Mattias Sokk - http://certs.devchampions.com/63J5ZP7ST2
- Jaanus Raudsik - http://certs.devchampions.com/Y3HJ7DL86E
- Madis Janno - http://certs.devchampions.com/GVKC4CQ4K1
- Mats Kivistik - http://certs.devchampions.com/IUYFYDHUXR
- Tonu-Priit Tammepuu - http://certs.devchampions.com/FBDGQXX77M
- Vladyslav Cherkashyn - http://certs.devchampions.com/2JBYM68IPA
- Toomas Tamm - http://certs.devchampions.com/5LG39XZHWU
- Martin Oblikas - http://certs.devchampions.com/H3PP6WIH1E
- Kiilian Lemberg - http://certs.devchampions.com/1DVPTH72I1
- Kertu Tootsmann - http://certs.devchampions.com/JG3U28HU5J
- Robert Mannik - http://certs.devchampions.com/UMM3QQW6AE
- Lev Girich - http://certs.devchampions.com/NV893GRTBL
- Maarja-Liis Uiboupin - http://certs.devchampions.com/NY9XM623RV
- Dmitry Shchenov - http://certs.devchampions.com/2EJY4USBTD
- Hans Matthias Andreas - http://certs.devchampions.com/GUJEYS98GY
- Pavel Rozhkov - http://certs.devchampions.com/8P8FJ189BG
- Toomas Jarvi - http://certs.devchampions.com/FR4CLQJEB1
- Raigo Raudseping - http://certs.devchampions.com/2CCN5CG6AY
Congrats! : )
- Growing Object-Oriented Software Guided by Tests β The best testing and TDD book
- TDD: TDD by Example (Kent Beck) β TDD book from the creator of TDD
- 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
- Head First Object-Oriented Analysis & Design β Software Design book
- Implementing Domain-Driven Design (Vaughn Vernon) β Software Architecture and Design book
- Elegant Objects β OOP book
- Agile PPP (Robert Martin) - a book about SOLID principles (and other cool things)
- The Software Craftsman β inspiration to become a better programmer :-)
- The Clean Coder β inspiration to become a better programmer :-)
- eXtreme Programming Explained (Kent Beck) β engineering practices book
- Thinking, Fast and Slow (Kahnenam) β how our brains work
For more books, follow me on Goodreads
- Vavr
- Faux-pas β goodies for exception handling
- ProtonPack β
Streamable
and other goodies - 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
- πΏ Mid-sized Building Blocks and Hexagonal Architecture
- Marker Interface
- Header Interface
- Role Interface
- The Stepdown Rule (how to order methods, explained well in Clean Code book)
- Spring "sees" static nested classes.
- Method Object pattern (turning a method into a class, see BankAccount Enforce* methods)
- Coupling = Measure of Connectedness.
- Cohesion = Measure of Relatedness.
- SRP = fancy name for Cohesion (SRP = does one thing; single reason to change)
- Reading vs. Writing is ~10:1 (developers read code much more than they write it)
- Our goal as code authors is to reduce Discovery Cost
- High level of abstraction = more scanning, less thinking = more productivity and happiness : )
- Reification = Thingification ("to thingify" something; to turn something into a thing)
- APIs are like diamonds β they're forever
- You Aint Gonna Need It (Yet)
- Sunk Cost Fallacy
- Java community moving away from checked exceptions to unchecked exceptions (runtime exceptions)
- Rich domain model (DDD, good for non-trival businesses) vs. Anemic domain model (good for CRUD)
- Use ByteBuddy instead of Cglib
- Typing is cheap, coupling is expensive (don't be afraid of creating some DTOs)
- DTOs and domain model change for different reasons
- Never let an entity escape transaction boundary
- https://github.com/sizovs/pipelinr/ (a good friend of .NET's MediatR)
- Spring core:
BeanFactory
,ListableBeanFactory
,ObjectProvider
- Cross-cutting concerns (AOP language)
- MDC = Mapped Diagnostic Context; NDC = Nested Diagnostic Context
- Database isolation levels: https://github.com/ept/hermitage
- UnitOfWork (the patterns that Hiberrnate and other ORMs are using to automatically sync object changes with the DB)
- Temporal coupling (ugly situation when you have to remember to do something before doing X)
- CQRS (Command-Query Responsibiltiy Segregation)
- jOOQ β super awesome fluent SQL for Java
- Moderl SQL: https://modern-sql.com/
### coupling = 2
| domain (1) | domain (2) |
agreement.setSigned(false) | agreement.setSigned(false);
### coupling = 1
| domain (1) | domain (2) |
agreement.callOff(); | agreement.suspendFraudulent();
- Day I: covered everything (but I suggest going through slides again).
- 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. For more, check out TDD books above. They are mind-blowing.
- 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:
- Day II: IDs, PKs, equality and hashCode. Slides are pretty self-explanatory.
- 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. For more explanation, read DDD book.
- Day II: Transactional Outbox Pattern. Good explanation here: https://microservices.io/patterns/data/transactional-outbox.html
- Day II: Fault Tolernace Patterns. Slides are pretty self-explanatory. For more, I suggest amazing
Release It! book (2nd edition).
A bit of Googling shows that the phrase blacklist/whitelist have etymological roots that are unrelated to race/racism. Also found a good alternative: Blocklist
:-)
- Twitter: @eduardsi
- LinkedIn β provide my email ([email protected]), as the account is protected
- Goodreads