СоХабр закрыт.

С 13.05.2019 изменения постов больше не отслеживаются, и новые посты не сохраняются.

| сохранено

H Теория паттернов в черновиках


Я на коммерческой основе занимаюсь программированием уже около 6 лет. За это время для меня стало очевидным, что в программировании самый важный ресурс — это кадры. Кадры намного важнее всяких новомодных технологий, методологий разработки, и прочего ноу-хау. И компании которые хотят успеха должны вкладывать максимальное количество своих усилий в поиск и удержание самых лучших кадров до которых они только могут дотянуться. Ну а что нужно делать для того, что стать таким кадром, за которого компании собственно и будут биться? То есть если смотреть на проблему не с точки зрения компании, а с точки зрения отдельно взятого человека. И мне кажется что я нашел ответ, по крайней мере это самое разумное объяснение, которое я имею на текущий момент. Это тот ответ, который объясняет многие принципы но под другим углом. Эту теорию я называю теорией паттернов, и гласит она о том, что любой навык состоит из огромного количества паттернов. А программирование является частным случаем навыка, и так же как и другие навыки состоит из паттернов.

Вот примеры таких паттернов в программировании:
— 'display: flex' удобнее, чем 'float: left' для расположения блоков в линию, когда необходима одна высота у блоков;
— Изменение 'location.href' триггерит перезагрузку страницы, а изменение 'location.hash' нет;
— Более важные кнопки должны больше привлекать больше внимания (цветом, размером);
— Всегда использовать оператор '===' при сравнениях в JavaScript;
— 'git pull' это то же самое, что и 'git fetch' за которым следует 'git merge';
— … (и тысячи других паттернов, знание которых в конечном счете и формирует навык программирования);

Как видите, каждый паттерн является до жути простым, и это важно, потому что на подсознание могут интегрироваться только очень простые идеи. Каждый сможет сразу ответить сколько будет 7x7, потому что набит четкий паттерн, вы не производите никакие операции умножения у себя в голове, вы просто сразу помните результат. Но вряд ли вы сможете ответить сколько будет 19*22, а это потому что сложные действия, такие как умножение, не интегрируются на подсознание.

Уровень навыка программирования измеряется в количестве и качестве интегрированных на подсознание паттернов. И думать о навыке программирования через понятие «паттерн» намного удобнее, потому что это понятие более конкретное, чем понятие «опыт». Если думать о навыке программирования через опыт, то непонятно как именно нужно прокачивать этот эфемерный «опыт» (легко представить ситуацию при которой два программиста с опытом работы в 5 лет имеют совершенно разный уровень навыка программирования, так что количество опыта не является репрезентацией уровня навыка). В то время как паттерн — это значительно более предметная сущность и более хороший программист — это тот, который интегрировал в подсознание большее количество качественных паттернов в соответствующей области.

Паттерны автоматизируют типовые задачи, позволяя сконцентрироваться на том, что действительно имеет значение. Например если раньше для того, что бы обойти массив вам необходимо было это гуглить, то после того, как вы изучите циклы 'for', 'while', 'do while', вы сможете сразу подобрать более подходящее решение без гуглинга. То есть вы автоматизировали определенную область деятельности, и стали чуть более эффективным программистом. Задача каждого паттерна заключается в том, что бы автоматизировать какую-то работу.

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

Наработка паттернов — это долгий процесс проб и ошибок. Именно по этому у вас никогда не получится изучить C++ за 21 день. Потому что для программирования на C++ требуются тысячи паттернов, и 21 день — это просто не достаточный промежуток времени, что бы набить хоть сколько-нибудь стоящие паттерны.

Собеседования

Если рассматривать навык программирования как набор определенных паттернов, значит проверив наличие этих паттернов можно оценивать квалификации программистов. И это именно то, как я обычно провожу собеседования. Для собеседований я считаю идеальными вопросы типа:
1. Напишите код, который делает ajax запрос (нативно и на jQuery)
2. Расположите два div блока в строчку как можно большим количеством способов
3. Напишите на NodeJS 'Hello World' http сервер без фреймворков
4. Выведите список нодовских процессов в linux
5. Откатите рабочую директорию на состояние в репозитории
6.…
Да тысячи таких вопросов можно придумать. Они простые, максимально конкретные, хорошо показывают квалификацию, применяются в повседневном программировании. В то время как когда вы задаете алгоритмические задачи на собеседовании или задачи типа «что выводится в консоль при выполнении [] + []» то вы проверяете те паттерны, которые повседневно не используются (паттерны необходимо проверять в тех областях, в которых будущему программисту нужно будет работать).

Соответственно для проверки уровня кандидата составляете около 100 таких простых вопросов, и то на сколько вопросов сможет ответить кандидат и будет являться объективным отражением уровня знаний кандидата. Естественно разработчик не сможет ответить на вообще все из них (у абсолютно каждого программиста набор паттернов, которые он знает отличается от набора паттернов другого программиста, даже если они работают в одной области).

Мне могут возразить дескать ответы на все эти вопросы легко гуглятся и необходимо проверять уровень мышления кандидата, а не память. Но я не согласен с этим утверждением, я считаю, что необходимо проверять именно то, что кандидат помнит, а не уровень его мышления, потому что уровень мышления — это экстраполяция существующего опыта на новые области, а если кандидат ничего не помнит, то соответственно и мышлению тут взяться не откуда. Тут только главное, что бы список этих вопросов не утек к кандидату.

Повышение квалификации

И самое главное — это то, что если принять теорию паттернов, то ставится значительно понятнее как именно необходимо работать и в каком именно векторе нужно работать для повышения своей квалификации. Необходимо набивать паттерны, и вот лишь небольшой список активностей втечении которых можно набивать паттерны:
— Читать чужой код
— Обучать других людей
— Читать книги
— Заниматься парным программировании
— Ходить на конференции
— Читать stackoverflow

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

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

комментарии (1)

0
napa3um ,   * (был изменён)
Вы будто бы описали преимущества мозаичного (фрагментарного) мышления перед целостносным пониманием своей области. Иногда люди книги по той или иной проблематике не читают, а облепляются по-быстрому паттернами, которые интерпретирует каждый по-своему. Вашим способом можно нанимать только если какой-нибудь низкоквалифицированный персонал без предполагания карьерного роста.