Люди стареют. Вместе со щёлкающей шеей, сединой в бороде и морщинами проявляется ещё одно возрастное изменение - непреодолимое желание вещать.

Политики садятся за мемуары. Спортсмены открывают тренировочные площадки . Режиссёры катают жемчужины воспоминаний о встречах с легендарными коллегами по цеху.

Программисты же бросаются излагать свои философские системы. Меня время тоже не щадит.

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

Кому может быть полезна статья:

  • Неистовым фанатам разработки которые не чувствуют себя счастливыми в командной работе.

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

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

1. Воин исходного кода

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

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

Режиму берсерка на смену придут зрелые подходы. Но сохраните в себе это неровное дыхание к новаторским, смелым решениям!

2. Внезапные проблемы

Это вскрывается не сразу - но в командной разработке воину исходного кода становится несладко. Оплеухи прилетают каждый день. Проблемы с дизайном... Нет, не кода который пишет воин. Он-то действительно может всё делать хорошо: проектировать отличное API, делать всё идеально по SOLID, с качественной, быстрой реализацией... Но удары прилетают с неожиданной стороны: подводят соратники по разработке... Эти болваны попросту издеваются над хорошо продуманным API за авторством нашего воина!

Попытка объяснить как надо использовать систему выглядит, на первый взгляд, успешной. "Дёргаешь функцию Init() для инициализации, потом UpdateState() и ChangeStatus() в течение жизни объекта и Deinit() напоследок". В ответ: "Во-от оно как, теперь понятно!" Коллега хлопнул себя по лбу и пошёл переделывать. Кажется, всё нормально... Но на очередном ревью история повторяется.

Агитации мало, думает воин исходного кода. Подавив раздражение, садится за доку. Пишет по пунктам: что за чем нужно вызывать. Создаёт схемы жизненных циклов объектов. Кидает коллеге. Тот отвечает: "Вау, супер! Теперь точно понятно!" Переделал, вышло приемлемо. Апрув, в мастер... Ура!.. Но тут приходит новый разраб. И история повторяется как по писанному.

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

Боже, что не так со всеми людьми?!

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

Простой путь ведёт к келейной фанатичной разработке и, в конце концов, к кабинету психиатра.

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

Вы стоите перед зеркалом.

3. Дизайн кода - это вы

Воин исходного кода часто думает, что пишет код для компьютера. "Оптимизнём логику - векторизируем, разложим cache-perfect по памяти - скомпилируем unity-билдом - идеально!" Кажется, работа воина направлена прежде всего, на то чтобы дышалось легче электронным собратьям: CPU, GPU, RAM.

Но истинное прозрение придёт с осознанием истины. Встретившись с самим собой, воин исходного кода осознает: он всегда писал код для других людей, а не для железки. Битик к битику, учёт каждого такта, проскальзывание между потоков во имя оптимизаций - всё это, на самом деле, было чтобы услышать: "Чёрт побери!.. Парнишка знает что делает! Делаем как он!"

Очевидно, процессор не способен на похвалу; даже если результаты выражен формальной метрикой - "оптимизация времени исполнения в восемь раз" - без восхищения коллег работа не принесёт удовлетворения.

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

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

Чёртовы людишки!..

Приходит отчаяние. Видимо, любой проект будет оборачиваться для вас болью. Видимо, никто не поймёт как надо делать, чёрт побери!

Видимо, стоит закрыться хиковать дома, оттачивая до блеска код мечты.

4. Общение - ваше спасение

Нет, не спешите ставить крест на человечестве и на себе! Выход есть!

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

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

Звучит слишком психоделично... Давайте разберём пример.

Сложно согласовывать популярные парадигмы. Возьмём пример... Коллега в упор не видит надёжности, которую даёт функциональное программирование. Вы, при этом, уверены: элементы функциональной парадигмы сделают API игры проще и безопаснее. А коллеге хоть кол на голове теши!..

Так, стоп! В первую очередь - не раздражаться. Вы ведь знаете слабые места мутабельности, верно? Вспомните какую-то недавнюю задачу вашего коллеги. Похвалите его за то что вам искренно понравилось в его решении и с участием задайте вопрос по возникшим трудностям: "Слушай, это ты ведь делал базовый класс для способностей игрового персонажа? Штука что надо, все ждали эту фичу: копи-паста ушла из пяти классов. И в мастер быстро зашло, да!.. Верно, я спрашивал на ревью про ассерты в сеттерах и на каждом апдейте... Хм, всё равно упало из-за влияния модификаторов на логике накопления маны?.. Расскажи, что там было?"

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

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

Разгул диктатуры в аргументах - не наш метод. Устройте максимально дружелюбную экскурсию по своему пониманию. "Слушай, а вот представь: что если бы класс менялся только раз - при создании. Как это?.. Начальная инициализация в конструкторе и вычисление состояний каждый раз заново вместо накопления его в тике... Да, увы, будут ограничения, хорошее замечание - от сеттеров придётся избавиться. Перфа может сесть - но незначительно, тут же сложить-умножить и по памяти на стеке всё считается... Но ты смотри какая штука выходит: не надо следить за каждым значением при каждом тике! А все ассерты уходят в конструктор. И больше нигде они теперь не нужны в принципе! Проверка консистентности состояния в конструкторе - и всё... Не надо боятся что каждый тик в состояние закрадётся ошибка"

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

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

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

Давайте разберём ещё один пример.

Допустим, коллега - убеждённый фанат функционального программирования. Вы же в своём API меняете состояния объектов на каждом тике, что коллеге кажется не лучшим решением. Обратитесь к его недавней задаче: "Помнишь, ты делал крутой класс для работы со способностями игрового персонажа?.. Там ещё у тебя здорово вышло избавиться от ассертов: проверки отправились в конструктор и код класса очень чистый получился. Ага... Оу, перфа села?.. Из-за копирований? Хм. А где именно?.. Жаль. И без копирования на тике никак не вышло?"

Искренно вникайте в его слова. Согласитесь как здорово было бы держать объекты в самосогласованом виде с минимальной вариативностью состояний (действительно ведь крутая концепция). Разделите боль что увы, эта концепция работает без просадок лишь если объекты выделять на стеке - а движок, собака, не позволяет создавать наследников от базового движкового объекта на стеке, только в подконтрольной сборке мусора динамической памяти. "Пытался сделать пулл короткоживущих объектов? Интересное решение... Тоже не выгорело? Блин, жаль... А что ещё пытался сделать?"

В какой-то момент он выговорится. Если вы задавали правильные вопросы, он готов пройтись с вами по свободным землям без догматов функционального программирования. "Слушай, а что если бы были поля - не все, некоторые! - значения которых менялись бы не только конструкторе?.. Да, нужно будет добавить проверок: два-три ассерата... Но проблема с лишними копированиями уйдет ведь так?".

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

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

Что ж. Наступите на горло собственной песне и попробуйте сделать так как кажется правильным вашим коллегам. Потерпите месяц. На проекте будет копиться опыт проблем с привычной для них парадигмой. Однажды за чаем вы спросите: "Слушай, я помню ты отличный класс написал недавно - для модульных заклинаний... Оу, снова упал на плейтесте? Неприятненько... Расскажи, что там было?"

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

5. Бремя программиста

Да... Вы, вероятно, возмутились моим примерам? Жульничество и софистика: в начале показать функциональное программирование как правильное решение, а потом привести обратный пример. Это разве честно?

Всё верно. Решение не вышло чисто функциональным. Не вышло по-мутабельному гибким в использовании... Но результат - это общее решение. Впитавшее опыт двух человек. Результат: взгляды на написание кода согласованы. Остаётся написать для практики ещё пару-тройку классов в общей парадигме, утрясти нюансы в нескольких коротких дискуссиях - всё! Не нужно дёргать друг друга по поводу подходов к организации API. Не нужно обижаться за то что окружающие глухи к вам. Вы работаете как команда, вы чувствуете и понимаете друг друга.

Это win-win стратегия коммуникации.

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

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

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

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

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

6. Заключение

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

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

Не бойтесь говорить и умейте слушайте.

Меняйте мир к лучшему!

Он того стоит.

Комментарии (10)


  1. ServPonomarev
    24.08.2022 08:53
    +3

    Хорошо написано, но, как въедливый программист, замечу - не рассмотрен ещё один вариант - мы ведём за ручку коллегу к границам его познания, и в итоге оказывается, что нас привели туда, куда хотели [не мы]. Как пережить эту боль?


    1. semenyakinVS Автор
      24.08.2022 17:13
      +3

      Отличный вопрос!

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

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

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


  1. zloddey
    24.08.2022 15:49
    +2

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


    1. semenyakinVS Автор
      24.08.2022 17:42
      +3

      Хороший вопрос. Доки которые я делал, по ощущениям, читались людьми плохо. И в этом большая доля моей ответственности. Я их писал со своих позиций и очень слабо собирал по ним обратную связь.

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

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

      По опыту, качественная документация получается в результате скурпулёзной обработки обратной связи. Нужно пересиливать себя и спрашивать у читателей доки: "Что понравилась? Что было не понятно? Что бы ты доработал?" Страшновато услышать критику - но с развитием опыта вы начнёте воспринимать критику не как набор упрёков, а как обучение коммуникации в документациях.


      1. lxsmkv
        25.08.2022 09:44

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


  1. mvv-rus
    24.08.2022 22:07

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


    1. zloddey
      25.08.2022 08:11

      А вариант прочитать статью повнимательней и подумать головой - не рассматривается? (пардон за сарказм)

      Проблема в том, что предугадать заранее, где именно придётся "стелить соломку" в командной работе, практически невозможно. Люди очень разные, в голову к каждому не заглянешь, и его будущие реакции на код не предугадаешь. На многие проблемы возможно реагировать только реактивно. С одним товарищем согласовали принципы работы с API, с другим баланс функциональщины и императивщины (иду по примерам из статьи), с третьим тесты, с четвёртым схему БД, с пятым... И это вещь совершенно перпендикулярная "хорошему умению именно программировать". Даже у хороших программистов будет разный личный опыт и разные собственные предпочтения в работе, которые могут влиять на итоговый результат из труда. Многие из этих отличий не будут оказывать существенного влияния на код, но в некоторых случаях будут. И статья про то, что делать в этих случаях.

      Конечно, если мы из раза в раз вынуждены объяснять определённые правила работы с кодом разным людям, это важный симптом. "Запах", как говорят некоторые. Если в определённом месте пахнет, это надо фиксить, факт. Либо, действительно, доки писать, либо код рефакторить. Но с доками всё тот же прикол, что и с кодом. Писать их надо уметь, это отдельный навык. Напишешь неправильно, и люди всё равно ничего не поймут или поймут по-своему (опять же, в силу отличий индивидуального опыта и предпочтений). И этот процесс недешёвый - см. выше. Писать документацию на всё подряд дорого и не особо полезно.


      1. mvv-rus
        26.08.2022 03:53

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


        1. zloddey
          26.08.2022 10:39

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


          1. zloddey
            26.08.2022 11:13

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