Культура программирования
Однажды у меня был разговор про обучение с директором одной школы программирования. Там было одно слово, которое поменяло весь разговор.
Мы говорили про программу обучения и мое наблюдение, что чаще всего именно технологиям, например, 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 |