Provides a 'force-multiplier' model for large-scale technical debt reduction, demonstrating how to reverse 'negative' migration curves through strategic component prioritization.
Heap successfully migrated its large CoffeeScript codebase to TypeScript by focusing on developer productivity and 'force-multiplier' files. Initially, the migration was losing ground, with new CoffeeScript code being added faster than it was removed. The renewed strategy prioritized converting the ubiquitous data access layer (ORM) first, which immediately provided type safety across most dependent files and validated the effort for the engineering team. By automating mechanical conversion via 'decaffeinate' and using a standalone manual commit for type annotations (preferring 'unknown' over 'any'), the team achieved 5-minute conversion times per file. A dedicated #typescript Slack channel and tracking line counts via Grafana helped maintain cultural momentum and peer-to-peer unblocking throughout the multi-year transition.
The project was initially failing its migration because legacy CoffeeScript was being added faster than it was being removed, indicating a state of 'migration stagnation'.
indefinite reliance on a dying language ecosystem that will eventually lack modern tooling and talent
detecting 'migration stagnation' is a leading indicator of technical debt becoming unmanageable, as shown by the 'negative' migration curves initially experienced by Heap.
Converting files strategically would be a more compelling sell... converting the data access layer would be a force multiplier.
Risk Guard identifies outdated or risky languages (like CoffeeScript) but doesn't identify which files or dependencies are 'Force Multipliers' for a potential migration.
Risk Guard would be better if it provided a 'Migration Priority Map' that ranked files by their dependency 'degree' (how many other things use them).