Мозг. Сортировка. Абстракции
А давайте заглянем внутрь мозга программиста и попробуем посмотреть на один из самых, на мой взгляд, важных навыков программиста.
На умение перемещаться между уровнями абстракции.
Тяжело в ученьи
Во время учебы каждый программист хотя бы раз писал алгоритмы сортировки. Это важно сделать самостоятельно, чтобы понять, как работает тот или иной алгоритм. Важно также понимать различные свойства алгоритмов сортировки для того, чтобы блеснуть знаниями на собеседовании и удивить интервьюеров (увы, но нет).
Но во время разработки мы почти никогда не реализуем сортировку с нуля. Обычно мы берем готовую из той или иной библиотеки.
Похожая ситуация наблюдается и в музыке. Учащиеся долго и без особого энтузиазма играют гаммы, но собственно гаммы per se° практически не используются при игре произведений.
Так в чем же дело?
Всему свое место
Сортировка в разрабатываемой программе существует не в вакууме. Редко когда именно сортировка чего либо является желаемым результатом выполнения программы.
ЦИКЛ ДЛЯ J=1 ДО N-1 ШАГ 1 F=0 ЦИКЛ ДЛЯ I=0 ДО N-1-J ШАГ 1 ЕСЛИ A[I] > A[I+1] ТО ОБМЕН A[I],A[I+1]:F=1 СЛЕДУЮЩЕЕ I ЕСЛИ F=0 ТО ВЫХОД ИЗ ЦИКЛА СЛЕДУЮЩЕЕ J
Но даже в этом случае сортировка является частью чего-то большего, например частью функции обработки строки или файла.
function BubbleSort(s: string) -> string { ... }
Которая, в свою очередь, является частью всей программы.
Надеюсь, вы ухватили идею.
function main() { Прочитать имя файла Загрузить файл с диска Если не получилось - остановка ... BubbleSort(содержимое) ... Печать содержимого в терминал }
Останавливаемся на этом?
Как бы не так. Созданная программа используется, мы же её не просто так написали?
cat dump.txt | sort | grep Error > errors.txt
И так далее.
Можно пойти и в другую сторону. Сортировка строки, например, предполагает понимание внутренней структуры. Строка представлена массивом? Списком символов? Веревкой? Суффиксным деревом (да, я знаю, что это не совсем про сортировку, но просто ссылку дать хочется)? Используем длинные инструкции? И т.д.
Но зачем?
Я могу ещё привести массу примеров вроде этого.
Но важно отметить две вещи, как мне кажется.
- Какие-то навыки в профессии являются базовыми, «кирпичиками» для других дел. Сортировка для программиста, гаммы для музыканта. Они редко используются сами по себе, но очень важны для других более сложных дел и конструкций.
- Понимание того, на каком уровне (слое) абстракции находится та или иная сущность в программе – очень важный навык. Опытный программист как раз видит не только текущий уровень, например, сортировку строк, но и взаимоотношение этого слоя с другими, как вышестоящими, так и нижележащими.
Элементы программы на разных слоях абстракции имеют не только собственные свойства, но и иногда вносят дополнительные ограничения на работу других слоев в программе, порой весьма существенные.
И вот именно это умение ментально перемещаться между слоями – важный навык. С его помощью можно увидеть в программе больше, чем написано в ее тексте. И увидеть потенциально сложные места в программе.
°per se - как таковой