| One of the most challenging things in growing a software product is managing complexity. If you are designing a product for future use cases, you add complexity upfront. To keep a healthy balance, I try to follow simple guidelines: * Focus on the current assignment. Implement it using clean code principles, don't overthink the problem. * Rather than spending time on design decisions, allocate time on handling edge-cases. These will save you from PageDuty alerts. * Plan excessive for future use-cases only around data models that insert/read into the database. Data migration is super-painful. A more generic design around your database is almost always preferable. * Have a feature toggling[1] service in your codebase. It will provide you with a better understanding of how you can implement new features alongside existing codebase in the same branch. Releasing features from long-running separate branches is almost always a wrong decision. * Always keep in mind time-constraints and how urgent is the requested functionality. Don't let perfection be the enemy of productivity. * Have a process in place that allows for the technical debt tasks to be tackled independently. It helps fix some bad design decisions, which become apparent in light of new requirements. [1] https://martinfowler.com/articles/feature-toggles.html |