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

Мы говорили про программу обучения и мое наблюдение, что чаще всего именно технологиям, например, TypeScript, React, REST API. Выглядит это достаточно странно, поскольку технологии в этой сфере меняются стремительно.

Возникает резонный вопрос: “Чему еще учить-то?”. Для обучения мне нравится аналогия с автошколой. Всем понятно, что школа учит сдавать экзамен по вождению, а вождению учит исподволь. И ученик, способный сдать экзамен достаточно неуверенно чувствует себя на дороге. А бывалый водитель с парой десятков лет стажа легко завалит экзамен.

Что есть у водителя со стажем, чего нет у ученика-отличника? Культуры вождения. Вот именно этого и не хватает - не только владения технологиями, но и владения дисциплинины/метода создания программного продукта на разных уровнях.

Как только я сказал слово “культура”, взгляд собеседника устремился куда-то вдаль, было заметно некоторое обновленное понимание - во внимание попали новые объекты.

Так о чем речь? Если мы говорим об уровне продукта, то нас не интересует, на каком языке он написан и какой технологией. Когда выходит новая версия приложения, мы думаем о новых фичах, дате выхода, версии. Есть различные способы версионировать продукт, например семантическое версионирование и календарное.

Когда разговор заходит о репозитории, то мы говорим о стиле кода (стиль может быть одинаковый для разных языков программирования - табуляция или пробелы для отступов), подходе/парадигме программирования и т.д.

На уровень ниже - ветки/branch и запросы на изменения/Pull request (изменение чего?…). По сути это одно и то же, поскольку в одном запросе одна ветка. На этом уровне ведутся дебаты на тему “Merge или Rebase?” и прочие холивары.

Ветка/branch состоит из commit - минимального изменения кода (которое не всегда дает изменение поведения продукта!). Есть различные методы/культуры создания коммитов, например, “коммит всего в конце дня” (ужас) или Conventional Commits. Мне также очень нравится Arlo.

Ну и наконец-то мы добрались до самого кода, только здесь начинаются функции, классы, циклы и прочее, что по сути является синтаксисом языка, с помощью которого собираются реализации/модели алгоритмов/мета-моделей. Алгоритм будет всегда одинаковым, он не зависит от языка, его можно описать хоть блок схемой.

Выходит следующий стек программирования:

Уровень Исполнитель Функциональные объекты и практики
Product/Code base Product manager/owner Feature, delivery, release, versioning, CI/CD, pipeline
Repository Maintainer Code style, linter, formatter, hook, programming language (paradigm)
Branch/Pull reques Submitter, reviewer Merge/rebase, Pull request, branch rules/conventions
Commit Commiter Commit rules/conventions, intention
Code change Programmer Programming language (syntax), framework, library