You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Instantly share code, notes, and snippets.
🌴
Mentoring software developers @ principal.dev
Eduards Sizovs
sizovs
🌴
Mentoring software developers @ principal.dev
dev, architect, ex-CTO, 15+ years of experience, growing world-class engineering leaders via https://principal.dev masterclass.
❌ Velocity is not a sum of individual work hours multiplied by work days:
3x full-time engineers = 240 hours of work (40h x 3ppl x 2-week sprint).
Because Velocity must account for for meetings, interruptions, onboarding, rework, waiting, handoffs, uncertainty, productivity fluctuations, pair programming, it's impossible to calculate it in advance by just counting heads.
✅ Velocity is determined empirically, by running a number of sprints, and then seeing how much the team can actually accomplish. Comfortably, without cutting corners, on Wednesday or Thursday. Not on Friday 6pm.
💥 Velocity determined by counting individual hours is a recipe for disaster. Empiritally determined team's velocity will always be less than total work hours. And because velocity is less than sum of individual work hours, that leads to conflict, pressure, and micro-management.
The idea of "Behind every request, there is an unsatisfied need" comes from the Nonviolent Communication book by Marshall Rosenberg. It's the best communication book ever written and it has helped me understand people better, and build the family I always dreamed of.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
README.md: no information on how to run and test the app.
README.md: no information on minimum runtime requirements (Java 11+).
Unused code: getSurname(), getLoans(), setLoans(...) etc. Best practice: never write/generate code "just in case".
Packaging: according to Common Closure Principle, classes that change together must be packaged together. So, instead of putting closely related classes in different packages (exceptions, models, enums, repositories, requests, services), put them together or split by domain (lending, client). More info here.
API: the API tries to be, but is not RESTful. E.g. plurals should be used: /loans, /loans/{clientUUID}
Architecture: domain model leaks to the API. Instead, we should decouple the domain model from our API/screens, because they change for different reasons. In practice, our APIs should always return DTOs, not entities.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters