Showing posts from March, 2021

Technical Debt - The Unseen and Surprising

TL;DR; We accrue technical debt in different, often unseen and innocent ways: 'Unexpected' - created by unpredictable or aggressive change. 'Unintended' - created by something missed at the design/development phase. 'Tools and Tech' - opportunity cost of not leveraging faster, more effective tooling and technologies. 'Team changes' - codebase incoherence due to number of contributors (who may no longer be part of the team). As with all work - get it into the backlog so it's visible. Weigh up not only the cost of clearing technical debt, but also the value gained from clearing quickly . If you can't 'sell' the benefits of a refactoring - you probably shouldn't do it. 'Technical Debt' (Tech Debt) is explained nicely by Wikipedia : Technical debt (also known as design debt or code debt, but can be also related to other technical endeavors) is a concept in software development that reflects the implied cost of ad

Deliberate Practice for Programmers - Learn a New Language!

In the last post - we talked about why deliberate practice is important, and that I aim to approach my practice with: Purpose - I’m spending my non-refundable time on something, I want it to count. Plan - Before I start, I think about how I’m going to structure my practice so that it (hopefully) meets it’s purpose. Progress - Ensuring I take time to reflect on the practice, and adjust as necessary. To get specific (we’re programmers, after all) - this translates to: Defining Purpose Creating plans to exercise ‘something’ that I encounter in my career - for example (and this list is far from exhaustive): Learning a new programming language. Working with different IDE’s to develop and debug. Traversing and processing data. Effective automated testing. From unit to end-to-end. Creating build and deployment pipelines. Working with different databases and ORMs. Performance profiling and testing. Finding memory leaks. Rapid prototyping. Paradigm shifts - e.g. object-