вторник, 3 декабря 2019 г.

Главный навык программиста

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

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

Нужно ли писать тесты? Важно ли качество кода? Какая лучшая степень прожарки мяса? С чем лучше всего сочетается белое вино? Нужно ли делать жим лежа со становой или турника будет достаточно?

Когда я рассматриваю источники информации по некоторой теме я ищу в авторе глубину и осторожность. Желание дать фундаментальные принципы, а не конкретные ответы на сложные вопросы. В этом плане старина Боб Мартин меня давно разочаровал. Когда-то он для меня был автором лучших книг и статей, но его категоричность, негибкость в суждениях и неумение смотреть на проблемы шире перевели его в категорию "анти"-авторов. В категорию людей, чье мнение скорее опасно для индустрии, чем полезно.

Моя нелюбовь к старине Бобу началась с его книги "Принципы, паттерны и методики гибкой разработки на языке C#" (вот большая критическая статья на эту тему), но дядюшка Боб периодически выдает и вот, после очередного его высказывания, мне захотелось подумать над поднятой им темой более подробно.

Итак, вот его твит:

When you read code, the race, religion, politics, gender, and orientation of the author are irrelevant and invisible. The only thing you can tell about the author is their ability to write well organized code. Nothing else matters.

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

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

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

Поскольку тема эта интересна, то давайте немного пофилософствуем по этому поводу.

"Что самое главное в жизни?", может спросить Боб. "Семья, конечно", ответит один. "А как же здоровье? Если нет здоровья, то радости от семьи будет не много.", возразит второй. "А как же призвание, а деньги? На одной семье, пусть и здоровой, далеко не уедешь! Нужно ж еще и кушать вкусно, да и делом интересным заниматься!", скажет третий. "Ну а помощь другим? Это ж тоже важно! А друзья? А карьера? А красивое тело?".

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

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

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

Если же задаться вопросом о главном навыке (навыках?) специалиста из любой области, то я бы сказал, что это умение учиться и критически мыслить (да, и не быть м#$@ком). Эти два ключевых мета-навыка позволят развить любые другие.

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

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

Мне может лишь в страшном сне привидеться, что вся команда состоит из однотипных людей. Людей с одним, даже самым лучшим единственным навыком. Хорошая команда - это разнообразие в лучшем понимании этого слова. Разнообразие характеров, навыков, подходов. Их должны объединять схожие принципы и ценности, но попытка грести всех под одну гребенку вызывает у меня лишь недоумение.

Мне тоже хочется найти простое решение таких сложных проблем, как разработка ПО. "Развивай навык Х и ты будешь отличным специалистом!". Но мир и разработка ПО достаточно сложны и многогранны, чтобы был один главный навык, который бы в одиночку смог бы решить все наши проблемы.

14 комментариев:

  1. > А не залипли ли мы с этими практиками, которые работали когда-то, а сейчас дают больше вреда, чем пользы?

    "Когда кто-либо привязывается к одной какой-нибудь, хотя бы и верной, идее, то он, в сущности, попадает в то же положение, в каком находился бы человек, привязавший себя к столбу, для того чтобы не заблудиться. То, что может быть желанной истиной на известной ступени духовного роста, может быть помехой к этому росту и заблуждением на другой, более высокой ступени." - Люси Малори, сказано более 100 лет назад. До сих пор актуально.

    ОтветитьУдалить
  2. По поводу Боба Мартина меня всегда интересовал один вопрос — работал ли он когда-нибудь программистом? Судя по его профилю в LinkedIn, он всегда занимал руководящие должности.

    ОтветитьУдалить
  3. Да, в начале своей карьеры он довольно долго писал код для всевозможных динозавров (типа PDP и пр). Об этом подробно рассказано в приложении его "Чистой архитектуры". Много системного кода, прикладной софт часто прямо на голом железе...

    ОтветитьУдалить
  4. Мне кажется, Сергей, вы были достаточно предвзяты при оценке твита Боба Мартина - возможно он хотел сказать лишь о том, что нужно стараться писать хорошо структурированный код и все. Это как сказать, что спринтеру нужно очень быстро бегать - это же не отменяет то, что ему нужно еще заботиться об общей физической подготовке, быть человечным, любить семью.
    Если использовать ваш подход к реакции на такого рода высказывания (я о твите Боба), то можно разнести в пух и прах любой тезис. Думаю вы действительно его сильно не любите, потому были строги с реакцией на твит. Это мое личное мнение, как и ваше в блоге :)
    За статью спасибо, вы посмотрели на программиста шире, чем на "машинку" для написания кода. Время быстро идет, потому чем раньше каждый из нас поймет о важных вещах в жизни - тем лучше.

    ОтветитьУдалить
  5. Такого типа фанатики, как Боб Мартин или Ричард Столлман полезны. Просто они своей негибкостью заставляют многих других посмотреть на вещи немного с другой стороны.
    Как если Мартин говорит, что функция не более 3х строк, то это не значит, что на 4й строке приедет расстрельная команда. А сам автор подумает, а как можно сделать лучше.

    ОтветитьУдалить
  6. Этот комментарий был удален автором.

    ОтветитьУдалить
  7. Спасибо Вам за статью. Соглашусь с комментатором выше: мне тоже показалось, Вы "вложили в уста" дядьке больше, чем он написал:
    - "...единственная вещь, которая говорит об авторе кода - это его умение писать хороший код и что ничего другое не важно." Мне кажется, Мартин говорит, что, когда ты читаешь код, объектом исследования должен быть только код.
    - "...не делает "хорошо структурированный код" важным." А автор твита не говорит, что хорошо структурированный код важен. Он говорит, что когда читаешь код, ты можешь дать ему оценку (код хорошо организован - код плохо организован), но информации о том, что хорошо организованный код - безусловное благо - в твите нет.
    - "И с чего старина Боб решил, что должно какое-то одно главное качество, характеризующее специалиста?" Так, он и не решал (надеюсь). Он всего-навсего написал, что когда он дает оценку структуре кода, он дает оценку только структуре кода. Мне кажется, "nothing else matters" относится к полу, политической ориентации и подобным характеристическим особенностям автора кода.
    Возможно, я неверно понял и Боба Мартина, и Вас, Сергей.

    ОтветитьУдалить
  8. Я видел комментарии людей, которые уже получили ссуду от г-на Бенджамина Ли, и я решил подать заявку в соответствии с их рекомендациями, и всего через 5 дней я подтвердил свою ссуду на моем банковском счете на общую сумму 850 000,00 долларов США, которую я запросил. Это действительно отличная новость, и я советую всем, кому нужен настоящий кредитор, подать заявку по электронной почте: 247officedept@gmail.com или WhatsApp: + 1-989-394-3740. Я счастлив, что получил ссуду, о которой просил.

    ОтветитьУдалить
  9. Каждый имеет право на свое мнение и необязательно соглашаться с ним. Я тоже не согласен с тем, что бэкграунд программиста не имеет значения, да и с многими другими тезисами Мартина. Все мы люди и не в вакууме живем, семейные неурядицы, какие-то проблемы и недопонимание достаточно сильно влияют на качество работы.
    Что касается структурированного кода, то тут все достаточно сложно, тут много факторов: время, опыт, используемые технологии и многое другое. Например, для достижения предельной производительности, зачастую приходится отказываться от многих абстракций и код зачастую ужасен, непонятен, но быстро работает.
    Поэтому для меня "структурированный код" - это прежде всего компромиссы

    ОтветитьУдалить
  10. Вообще интересные мысли. Я по-другому понял твит)

    When you read code, the race, religion, politics, gender, and orientation of the author are irrelevant and invisible. The only thing you can tell about the author is their ability to write well organized code. Nothing else matters.

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

    Как понял я
    "Раса, религия и т.п не имеют значения. Единственное, по чему стоит оценивать человека это то, как он пишет код"
    Т.е. это больше политическое высказывание. А ля "не судите по обложке", смотрите, что человек "делает"

    ОтветитьУдалить
  11. Ну, я не знаю. Эта фраза
    The only thing you can tell about the author is their ability to write well organized code
    для меня звучит как: Единственная вещь, которую вы можете сказать про автора, это его способность писать хорошо организованный код.
    Заметьте, не оценка автора, а его способность писать. Остальные вещи в данный момент не важны. На этом всё.

    ОтветитьУдалить
  12. Сергей, ты сейчас пишешь еще где-то блог?

    ОтветитьУдалить