Как научиться писать абстрактный код?
Я могу посоветовать во время написания кода думать о тестировании - как именно написать unit test на конкретную функцию. Или как написать тест, который эмулирует некоторый процесс, в котором участвует несколько элементов. Если в приложении используется UI или DB, то как оттестить без них? К чему это приведет - к тому, что вы будете думать о коде как совокупности агентов или некоторых функций с низкой связностью. Т.е. каждую из них можно абстрагировать, подменить, отрефакторить и т.п.
Абстрактный код получается выделением абстракций из существующего кода, через параметризацию инвариантов.