Миф о гениальном программисте

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

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

Хотя они были в восторге от того, как далеко они продвинулись, у них также было видимое разочарование вообще, о чем они до сих пор не подозревали.

Это распространенная, но забавно противоречивая мысль:

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

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

Я хотел поделиться с ними этим прекрасным выступлением Брайана Фицпатрика и Бена Коллинза-Сассмана; у которого я бессовестно украл титул. Когда я собрал слайды, чтобы пересказать эту беседу, они быстро испортились моими собственными мыслями и предубеждениями и превратились в поток эссе о сознании.

Далее следует презентация, которую я сделал. Если вы, как и все мы, окажетесь среди напуганных высокомерием, надеюсь, эта статья поможет нам сжечь этот распространенный миф дотла.

Миф

Гениальный программист намеревается написать программу.

Они знают все, что им нужно знать, чтобы справиться с задачей. Они отправились одни в свою пещеру, где безупречный код вылетает из их рук в течение нескольких месяцев. Когда они заканчивают печатать, они запускают свой код в первый раз, и все работает Just Works ™ ️! Они появляются с чем-то блестящим и меняющим мир. Их код не содержит ошибок, надежен и даже имеет поэтическую красоту.

Мир изменился навсегда; наверное к лучшему. Код запомнен и никогда не нуждается в изменении.

Звучит глупо, правда? Но, к сожалению, я видел, как с его помощью описывают, что значит быть «настоящим» разработчиком.

Гении - это «фейковые новости»

Гениальный программист намеревается написать программу.

Нет гениев.

Скорее они настолько редки, что представляют собой статистически незначительную категорию. Число людей с IQ более 140 составляет около 0,25% населения. Это около 200 миллионов человек во всем мире, что звучит много, если вы не вспомните, что население планеты превышает 7 миллиардов человек.

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

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

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

Ты не знаешь Джека

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

Это то, что большинство людей ошибается. Они встретят незнакомое слово или понятие, затем решат "о, я недостаточно умен, чтобы понять это", и прекратят читать.

Если, по вашей оценке, ваш текущий набор знаний уже завершен, то непременно прекратите читать, но тогда возникает вопрос, почему вы вообще читали что-то новое.

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

Некоторое интеллектуальное смирение здесь может иметь большое значение.

Ты не знаешь Джека ... пока

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

Когда вы видите что-то незнакомое, читайте об этом правильно. Продолжайте читать, пока не убедитесь, что знаете, что это такое.

Вам не нужно изучать все, что нужно знать по теме; ровно достаточно, чтобы узнать его роль, плюсы и минусы, когда это может быть важно, и куда обратиться, чтобы узнать больше.

Поищи в Гугле. Прочтите страницу в Википедии. Просто получите общее представление о том, что это такое.

Люди по умолчанию ничего не знают. Таким образом, вы гарантированно столкнетесь с вещами, о которых не знаете. Вам будет комфортно учиться!

Вы МОЖЕТЕ узнать Джека

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

Вы можете научиться чему угодно.

Главный барьер на пути к приобретению навыков не интеллектуальный, а эмоциональный. Это происходит из-за переоценки масштабов и последствий рассматриваемой проблемы.

У меня есть что-то вроде мантры, которая мне хорошо послужила:

«Я могу решить любую проблему, которую могу описать»

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

По мере того, как вы лучше понимаете проблему, вы также улучшаете свою способность ее решать. Чем более надежным будет ваше понимание, тем лучше будет ваше решение.

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

Но ты все еще не знаешь Джека

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

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

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

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

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

Если вы чувствуете, что должен быть лучший способ сделать что-то, вы, вероятно, правы. Найди это!

Программирование - это совместная деятельность

Они пошли одни в свою пещеру ...

Старайтесь работать с людьми, которые знают больше, чем вы, в данной теме. Знания - это не линейная шкала, а скорее пики и спады вокруг отдельных тем. Найдите кого-нибудь, чья топология знаний дополняет вашу. Стаж здесь не имеет значения.

Делитесь своими знаниями с другими и слушайте, что они говорят.

Объясняйте свои идеи вслух; вы будете удивлены, как часто вы не можете объяснить свои мысли, потому что они не полностью сформированы.

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

Делитесь своими идеями со всеми, кто их выслушает. Знание хочет быть свободным.

Обзоры кода

Они пошли одни в свою пещеру ...

Не бойтесь выглядеть глупым перед другими.

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

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

Укажите на сложный или запутанный код; если вас что-то смущает, скорее всего, это слишком сложно.

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

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

Просить помощи

Они пошли одни в свою пещеру ...

Как долго вы будете ехать, прежде чем спросить дорогу?

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

Обратитесь к своей команде, они готовы достичь той же цели, что и вы. Если вы позволите кому-то что-то вам объяснить, это даст ему возможность проверить собственное понимание. #командная работа

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

Написание кода сложно

безупречный код вылетает из их пальцев ...

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

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

Самый важный навык для обучения - это не заботиться о том, насколько вы хороши, и просто стремиться к этому.

Fail Faster

безупречный код вылетает из их пальцев ...

По мере того, как вы терпите неудачу и повторяете попытку, размер ваших неудач будет уменьшаться, а успехов - больше.

Чем быстрее вы проиграете, тем быстрее вы сможете набрать обороты и стать лучше.

В первую очередь беритесь за самое сложное. Следите за тем, в чем вы не уверены, сделайте минимум доказательств концептуальных изменений, чтобы убедиться, что ваше решение жизнеспособно.

Контроль версий - ваш друг. Всегда можно откатить код и развертывание. Не бойтесь ошибаться.

Вносите небольшие инкрементные изменения

… месяцами.

Ни в коем случае не отправляйте сразу большие изменения кода. Я обычно вижу это, когда кто-то боится показать свои изменения слишком рано, потому что это еще не идеально.

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

Не позволяйте вашему коду развиваться в вакууме. Вы рискуете отклониться от остальной части проекта и попасть в место, несовместимое с остальной системой.

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

Клиенты не получат никакой выгоды от вашего кода, пока вы не закончите, тогда как они могли бы получить небольшую выгоду от небольших изменений, внесенных в процессе.

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

Что, если вы строите не то?

Они появляются с чем-то блестящим и меняющим мир.

Знаете, что хуже, чем ошибаться? Быть правым в неправильном.

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

Лучший способ проверить это - протестировать. Поместите меньшие версии вашего решения против меньших версий вашей проблемы. То, что вы узнаете, тестируя более мелкие кусочки, часто может изменить ваше понимание проблемы и решения.

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

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

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

Весь код - отстой

В их коде нет ошибок…

Ржу не могу

Ты не твой кодекс

… В нем есть поэтическая красота.

Не относитесь сентиментально к тому, что вы создали. Программирование - это по своей сути творческая деятельность, но ваш код не является частью вас или вашей личности.

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

Постарайтесь не перехитрить себя. Проблема не может быть решена на том же уровне сознания, на котором она была создана. Если вы создаете что-то умное, убедитесь, что у вас достаточно ума, чтобы отлаживать собственный код.

Преждевременная оптимизация

код запомнен и никогда не нуждается в изменении.

Большая часть вашего времени в жизненном цикле кода будет потрачена на его поддержание и обновление.

В случае сомнений оптимизируйте свой код для человека, обслуживающего его; позвольте компьютеру понять, как оптимизировать ваш дружественный к человеку код. Кодируйте так, как будто Future You - это тот, кто вам глубоко небезразличен.

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

Поскольку мы любим аббревиатуры в этой отрасли, вот одна из моих любимых.

ЯГНИ: Тебе это не понадобится.

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

Абстракция

код запомнен и никогда не нуждается в изменении.

Отложите абстракцию до тех пор, пока не почувствуете, что достаточно хорошо понимаете проблему. Часто это понимание приходит после нескольких неудач и попыток решения.

Плохая абстракция хуже, чем ее отсутствие.

Качество абстракции определяется тем, насколько легко вы можете изменить что-то в будущем. Я видел большие и сложные абстракции, которые приводили к системам, которые трудно модифицировать. То, что что-то сложное, не делает его абстрактным.

Повторять, повторять, повторять. Лучшие идеи находятся на доработке.

Как считаться гением

  • Адаптироваться к изменениям
  • Измените свое мнение на основе чужих идей
  • Признать свои ошибки
  • Быстро потерпеть неудачу
  • Делитесь знаниями с другими
  • Принимайте критику

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

Если вы будете поступать так, люди будут думать, что вы гений.

Дополнительное вдохновение

«Когда-либо пробовал. Когда-либо терпел неудачу. Независимо от того. Попробуйте снова. Снова провал. Лучше провалиться »

- Сэмюэл Беккет, драматург

«Вы не особенная и неповторимая снежинка. Вы такое же разлагающееся органическое вещество, как и все остальное »

- Тайлер Дёрден, философ

«Любой может сделать то, что может»

- Оз Лопес, никто из влиятельных лиц