Программирование, являющееся упражнением в письменной форме в той же степени, что и все остальное¹, может черпать вдохновение в других, более устоявшихся писательских дисциплинах. Одна интересная техника письма, используемая в журналистике или для написания отчетов, называется перевернутой пирамидой². Этот подход улучшает понимание текста, поскольку сначала он начинает с самой важной информации, а затем углубляется в менее важные детали. читатель может быстро понять основную концепцию, не просматривая весь текст.

В этой метафоре начало текста — это основание пирамиды, оно содержит самую широкую или самую важную информацию. Потенциально читатель может пройти только эту базу и уйти с некоторым пониманием темы. Точно так же вершина пирамиды представляет собой конец текста, где находится наименее важная информация. Содержание становится все более и более «опускаемым» по мере продвижения в этом направлении.

«Как это применимо к коду?», — спросите вы. Тот же принцип можно применить и к уровням абстракции: сначала начинать с наиболее абстрактных определений (база) и переходить к деталям алгоритма только по мере необходимости (пик).

Представьте себе функцию, которая готовит для вас чашку горячего чая (кто хоть раз в жизни не писал код для приготовления чая, верно?):

fun makeCupOfTea(coldWater: ColdWater, teaLeaves: TeaLeaves): CupOfTea {
    val hotWater = boilWater(coldWater)
    val tea = brewTea(hotWater, teaLeaves)
    return pourTeaIntoTheCup(tea)
}

Потенциально вы могли бы перестать читать код здесь и получить общее представление о том, как выглядит процесс, не понимая, как именно кипятить воду или как наливать ее в чашку (????!??!?!? ?!?!)

В качестве альтернативы, если вы хотите глубже погрузиться в тайное искусство приготовления чая, вы можете прокрутить вниз до функции brewTea и изучить детали там (двигаясь от основания к середине пирамиды):

fun brewTea(hotWater: HotWater, teaLeaves: TeaLeaves): Tea {
    val teaPotWithLeaves = putLeavesInTeaPot(teaLeaves)
    val teaPotWithWaterAndLeaves = pourHotWaterIntoTeaPot(hotWater, teaPotWithLeaves)
    return steepLeaves(teaPotWithWaterAndLeaves, 3.minutes)
}

Это продолжается и продолжается по мере того, как вы продвигаетесь вниз и углубляетесь в детали алгоритма заваривания чая.

Теперь вы можете сказать: «Это немного глупый пример, не так ли?», И я соглашусь. В любом случае, этого должно быть достаточно, чтобы проиллюстрировать суть.

Это, конечно, имеет смысл только в сочетании с сохранением одних и тех же уровней абстракции. Все шаги в функции makeCupOfTea (грубо говоря) столь же абстрактны, как и шаги в функции brewTea.

При таком подходе, когда вы открываете функцию приготовления чая, вы не сразу перегружены всеми мельчайшими деталями алгоритма. Вы всегда можете контролировать количество отображаемых деталей, увеличивая и уменьшая масштаб по мере необходимости.

[1] http://www.sarahmei.com/blog/2014/07/15/programming-is-not-math/

[2] https://en.wikipedia.org/wiki/Inverted_pyramid_(журналистика)