Скепсис и компетентность

11 февраля 2014, 11:59

Изображение с сайта www.quickmeme.comАвтор этого поста размышляет об этапах развития разработчика, опасности слишком сильной зависимости от мнения, озвучиваемого «хором экспертов» в «интернетах», а также о том, где именно и почему можно застрять надолго и чем это чревато.  

В разработке ПО действуют скрытые иерархические системы. Место человека в такой системе зависит не столько от названия занимаемой должности и списка навыков, сколько от разговоров в кулуарах. Человек, постепенно преодолевающий программерскую карьерную лестницу, на каждом этапе может рассчитывать лишь на ограниченный выбор из небольшого числа позиций. Эти позиции диктуются громогласным хором «экспертных мнений», тиражируемых в книгах, блогах, Твиттере, на конференциях и по всевозможным другим каналам. Лишь изредка, когда возникает конфликт пропагандистских высказываний, складывается сказочная ситуация, в которой наивный кодер-новичок позволяет себе усомниться в справедливости происходящего и заявляет: «А король-то голый!». Самые сообразительные из таких новичков быстро научаются плыть по течению или хотя бы угадывать, куда ветер дует. Остальные продолжают барахтаться на месте, не в силах свыкнуться с объективной реальностью и продолжая строить о ней собственные экстравагантные теории.     

Итак, именно об этом я хотел поговорить

Итак, именно об этом я хотел поговорить.

Эксперт-дилетант

Эрик Дитрих написал замечательную статью «The Rise of Expert Beginner», суть которой такова: в процессе профессионального роста разработчик проходит этапы Новичка, Продвинутого Начинающего, Компетентного Специалиста, Профессионала и Эксперта. Но с этого пути легко сбиться уже на втором этапе: немного освоившись в профессии, кто-то начинает сразу считать себя «Экспертом», будучи на самом деле всего лишь «Продвинутым Начинающим». Развивая этот тезис, автор доказывает, что из-за такого раннего заблуждения вчерашний новичок так никогда и не дорастает до «интуитивного понимания глобальной перспективы» — а именно такое умение является определяющим для Эксперта.

Все «Продвинутые Начинающие» могут избрать один из двух путей: либо постепенно развиваться до Компетентного Специалиста и начинать улавливать не только глобальную перспективу, но и свое место в ней, либо «дорасти» до Эксперта-дилетанта, но при этом мнить себя настоящим Экспертом.

Что в итоге? Преждевременное провозглашение себя «Экспертом» и пренебрежение всей оставшейся работой, которую еще предстоит проделать для профессионального развития:

Эксперт-дилетант оказывается в тупике, поскольку для дальнейшего роста требуется признать, что необходимо еще работать и работать, и что данный этап отнюдь не является заключительным. Вы можете заметить, что "Эксперт-дилетант" все же немного профессиональнее "Продвинутого начинающего", но компетентным специалистом он так и не становится. Дело именно в том, что он не видит глобальной картины происходящего и не осознает, как глупо остановился в развитии. Некоторое профессиональное превосходство "Экспертов-дилетантов" над "Продвинутыми начинающими" объясняется в основном тем, что они нарабатывают чуть больший практический опыт, оставаясь при этом "Начинающими"».

Дитрих предупреждает, что эти рассуждения «не так смешны, как могут показаться», но эта ремарка представляется лишней, поскольку мне его тезис совсем не кажется смешным, даже на первый взгляд. В определенном смысле очень многие работники (в любой отрасли) останавливаются в развитии на уровне эксперта-дилетанта, и вышеизложенные соображения кажутся естественным и исчерпывающим объяснением этой напасти. Могу себе представить тысячи читателей-программистов, знающих HTML+CSS+jQuery+PHP, мысленно кивают, одновременно соглашаясь со мной и начиная осознавать масштабы своей проблемы. «Точно подметил», — признаются они сами себе, по крайней мере, самые честные из них. — «А я тут сижу на этом стабильном приколе, могу без подготовки состряпать любое веб-приложение, слепив его из привычных и знакомых деталей. Но, черт возьми, как же противно, что мой код и близко не сравним с произведениями настоящих экспертов».   

И как преодолеть этот «пик», который на деле — просто тупик?

Но что происходит, когда "Продвинутый начинающий" не удосуживается советоваться с широким профессиональным сообществом либо по каким-то другим причинам не находит времени на общение с коллегами? Он терпит фиаско, даже будучи совершенно уверен, что в этом виноват кто угодно — только не он. Ведь сами правила игры таковы, что гораздо проще сваливать вину на других, избавляясь таким образом от когнитивного диссонанса».

И вот на этом этапе анализа наши с Дитрихом взгляды начинают расходиться. Я даже немного опасаюсь, что после прочтения нижеизложенного кто-то упрекнет меня, что я как раз «сваливаю вину на других» в ответ на гнетущий меня «когнитивный диссонанс» — всё как по Дитриху. Однако если я прав, то вы, дочитав эту статью до конца, согласитесь, что я описываю здесь совершенно иной когнитивный диссонанс, и что мое альтернативное объяснение мытарств новичка ничуть не противоречит теории Дитриха, а заслуживает не менее пристального внимания. 

Когнитивный диссонанс

Рассмотрим, какое место занимает этап «Продвинутого начинающего» на графике Дитриха. Как мы помним, по Дитриху такой человек может либо дорасти до уровня «Компетентного специалиста» (усердно работая), либо выродиться в «Эксперта-дилетанта» (из-за ложного ощущения самоуверенности и самодостаточности). В таком случае подъем графика превращается в «плато». Я согласен с самим фактом существования этого плато, но считаю, что человек оказывается на нем в результате гораздо более сложных причин, чем излишняя самоуверенность.

Многие «Продвинутые начинающие» дорастают до этого уровня, развиваясь в аккуратном и простом мире, который описан на страницах книг для начинающих и в онлайновых руководствах. Важная общая черта всех подобных материалов заключается в том, что их авторы тщательно абстрагируются от всех сложностей и практических соображений, действующих в реальном мире, ради более полного описания языка и инструментальных примитивов (то есть «Hello World»++). В таких пособиях практически полностью замалчиваются вопросы производительности и то, как на ней сказывается динамическое выделение памяти, обработка событий JavaScript, импровизированные реализации протокола HTTP или проблемы браузерной (не)совместимости.  

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

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

В этом мире его насильно заставляют говорить на языке, пересыпанном разными терминами вроде «MVC», «фабрика», «декоратор», «паттерны», «антипаттерны» и т.п. Тем временем он все сильнее задумывается о том, что колоссальный объем весьма надежного кода, написанного за последние 40 лет, вполне обходится без всех этих парадигм, и новые идеи никак не заменяют прежние — более простые и интуитивно понятные (а также красивые и приятные), согласно которым алгоритм O(log(n)) может заменить алгоритм O(n^2). 

Это мир бессмысленных языковых войн, где сторонники C, Perl или PHP кичатся огромными базами написанного кода и его успешностью в реальных проектах, а в ответ им предъявляют альтернативные языки, отличающиеся красивыми абстракциями или чистотой (большинство из таких альтернативных языков относятся к функциональным).

В этом мире новичок узнает: чтобы вырасти от jQuery (в установленном порядке) до AngularJS, ему потребуется, в частности, изучить сомнительное искусство внедрения зависимостей. Здесь все говорят о необходимости четко разграничивать представление и логику приложения (часто называемую «бизнес-логикой»). В то же время эти люди продвигают HTML-шаблонизаторы, которые смешивают описание пользовательского интерфейса (уровень вида/представления) с фрагментами немодульного кода, практически всегда написанного на специальном DSL (предметно-ориентированном языке). 

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

Бей? Беги?

Разве после этого удивительно, что многие перспективные новички испытывают когнитивный диссонанс и отступают на твердую почву, не сумев самостоятельно переварить очередной вариант этой гремучей смеси? Ведь новичок всего-то хотел оказаться на стороне победителя, когда отгремят эти пропагандистские войны.

Если нашему герою повезет, то он вовремя прочитает статью Дитриха, либо эмоциональный пост Стива Йегге, либо взвешенные размышления Реджа Брэтуэйта. Во всех этих работах изложены значительно менее догматичные представления о мире экспертов, чем в тех проповедях, которые вам читают сторонники бесчисленных языков, фреймворков и методологий. Я уже не говорю об Agile, о культе разработки через тестирование (TDD). Если такие методологии приняты в нанимающем вас стартапе (а в наши дни они могут встречаться и в больших корпорациях), то вам придется их осваивать, хотите вы того или нет. Возможно, вчерашний новичок научится отделять зерна от плевел и сгладить когнитивный диссонанс, возникающий от необходимости работать лишь с дозволенными инструментами, языками, фреймворками, методологиями, руководствами по оформлению, эдиктами и т.п.

Но гораздо вероятнее, что наш герой запутается в гуле яростных споров, которые ведутся в блогах и сообществах. На таких сайтах полно Компетентных Специалистов и Профессионалов, которые тешат свое эго, бездумно повторяя критику, высказанную любимыми Экспертами. Либо потеряет время за штудированием фолиантов «Продвинутое программирование» или «Разработка масштабируемых приложений на [X]», где X — какая-то модная нынче платформа. Однако такие книги раскупались бы гораздо хуже, если бы в них честно и обстоятельно описывались и недостатки, и ограничения той технологии, название которой красуется на обложке.

Рождение компетентных скептиков

Если моя теория верна, то среди «Продвинутых начинающих» существует довольно широкая прослойка людей, которые умеют справляться с текущими задачами, достаточно умны, чтобы воспринимать новые идеи, достаточно увлечены своим делом и работоспособны, но просто не решаются сесть на следующий скорый поезд — в результате примерно такой цепочки рассуждений:

  • JavaScript — язык сценариев! Годится только для браузерных трюков. Язык для неудачников.
  • Да, в JavaScript есть свои сильные стороны, на самом деле это функциональный язык, только это неочевидно. Смотри-ка, оказывается функции здесь — объекты первого класса!
  • Что, в вашем языке нет нормальных замыканий? Ха-ха! А в моем вот-вот появятся пространства имен.
  • NodeJS — классная штука (кстати, да), а за async будущее (на самом деле, уже прошлое; почитайте в старой статье Дэйва Стивенса. Вы просто не понимаете async, вот и все.
  • О нет, треклятая пирамида! Эти обратные вызовы — сущий ад!
  • EventEmitters, да. Это выход.
  • Свет в конце туннеля!
  • NPM рулит! (Можно не переживать о бесчисленных версиях модулей. Да, кстати, вам не требуется изменять путь включения файлов во время исполнения, так что мы убрали эту возможность).

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

И на этот поезд опоздали не только Эксперты-дилетанты, но и целый класс Продвинутых начинающих, которые за годы работы превратились в Компетентных скептиков. Эти разработчики, действительно знающие свое дело, могут решать многие проблемы красивыми и простыми способами. Но они опасаются попасть на поезд, который собрали Эксперты, а ведут Бывалые Профессионалы (те самые, которые «принципиально» не отвечают на четко поставленный вопрос на рассылке или StackOverflow, а просто отмахиваются: «даже не думайте это делать!»). Компетентные скептики — те самые люди, которые когда-то чурались таких «единственно верных» решений, как CORBA, XML, Java и других отборных идеологий прошлого — или, скрепя сердце, принимались их осваивать, зарплату-то получать надо. Сегодня такие же люди видят вопиющие недоработки в новых «единственно верных» решениях — NoSQL для хранения данных, AWS для хостинга, MVC для структурирования приложений, веб-приложениях, способных снять многие проблемы кросплатформенности, Hadoop для работы с большими данными и др.  

Когнитивный диссонанс, нажитый такой категорией разработчиков, может быть продуктивным и даже необходимым на каждом новом витке прогресса. Из этой группы непокорных выделится меньшинство тех, кто даст начало новому поколению Экспертов. Именно такие люди однажды реализуют REST, чтобы избавиться от монополии SOAP, изобретут Node+Express, чтобы оставить в прошлом WebSpheres (или другие гигантские системы для управления веб-сервисами, о которых я, к счастью, ничего не знаю), внедрят методологию, альтернативную Agile (которая сама в свое время сильно потеснила водопадную модель) и сделают еще массу новых важных вещей. 

Источник

подписка на главные новости 
недели != спам
# ит-новости
# анонсы событий
# вакансии
Обсуждение