Что делать, если разработчик, чей код я рецензирую, занимает оборонительную позицию?

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

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

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

Должен ли я прекратить делать код-ревью? Как лучше поступить в этой ситуации?

Всего один свежий пример, чтобы понять суть. Разработчик пишет класс, который выглядит как что-то среднее между Factory и Container, затем называет его SomethingBuilder, где часть Something не связана с окончательно построенным объектом. Я, конечно, комментирую это, и скажем так, он принимает это на свой счет. Что мне здесь делать? Похоже, техлиду команды все равно. На самом деле он много его защищает. Он говорит, что у каждого свой стиль. Я не уверен, что это за стиль называть Factory a Builder, но неважно. Является ли избегание здесь лучшей стратегией, особенно когда техлид проявляет к парню сострадание?

что ты имеешь в виду под "немного личного"? что вы имеете в виду под "достаточно тщательно" и "вполне серьезно", можете ли вы привести пример того, что вы отвергаете или комментируете? что значит "работает очень близко"? физически? у вас есть тимлид в команде, которому вы можете поднять это?
Когда я говорю сквозной, я имею в виду, что действительно трачу время на то, чтобы найти проблемы в коде и указать на его слабые места. Обычно я избегаю использования слова «вы», а ссылаюсь на сам код.
Я имею в виду, что я не делаю обзоры просто формально.
вы просто комментируете соглашения об именах классов? Я вижу, как это кого-то раздражает — некоторые разработчики используют имена классов как выход для творчества. Я думаю, что когда-то назвал класс сопоставления с образцом как «DeviceHarmoniser». Если наихудший пример, который вы можете придумать в обзоре кода, — это присвоение имени классу, то я думаю, что можно спокойно оставить это без внимания.
@bharal На самом деле это очень запутанный класс. Когда вы читаете его, вы ожидаете, что Builder создаст конкретный объект. Затем вы понимаете, что у него нет классического API Builder. Затем вы понимаете, что на самом деле он не строит то, что говорит, а затем вы понимаете, что он делает намного больше, чем то, что он на самом деле строит. Мне потребовалось 30 минут, чтобы понять логику, и я считаю себя очень быстрым читателем кода.
@bharal, вернемся к твоему вопросу. Нет, это не просто имя класса. Злоупотребление именем превращает что-то в сложный беспорядок, который вы едва можете прочитать и просмотреть.
@Pesho Это то, как вы сформулировали это в обзоре, или вы сформулировали это более мягко?
@Dukeling, конечно, я не использовал эту формулировку :) нет, я просто сказал, что класс не является строителем, что он не строит то, что, по его словам, строит. Привел пример того, как должен выглядеть конструктор, и пример того, как, на мой взгляд, должен быть реализован класс. Возможно, я где-то упомянул, что в нынешнем виде мне потребовалось 30 минут, чтобы понять, что делает класс, но это было сделано только для того, чтобы подчеркнуть сложность, которую он добавляет.
Я также упомянул, что класс нарушает принцип единой ответственности.
«В моей команде я столкнулся с разработчиком, который не следовал рутине и делал коммиты прямо в ветке разработки». - Почему кому-либо разрешено делать коммиты в основной ветке?
Существуют ли какие-либо организационные стандарты кодирования, на которые вы могли бы сослаться? Замечание о стилях кодирования, которое делает техлид, справедливо. Это одна из причин, по которой люди соглашаются с общими стандартами/методами кодирования. Помимо плохого именования / читабельности, какие еще распространенные ошибки, как эти ребята пиарятся, работает ли код, близок ли он к оптимальному с точки зрения эффективности? Может ли хорошая документация/комментарии помочь с плохим именованием?
Можно сделать вывод, что вы в основном ищете подтверждение здесь, а не объективную обратную связь. Чтобы отклонить это понятие, возможно, процитируйте себя в своем вопросе. Опубликуйте отзыв дословно.
@Pesho «я только что сказал, что класс не является конструктором ... [и я привел пример], как, на мой взгляд, должен быть реализован класс». - Похоже, вы сосредоточились на том, как бы вы это реализовали, а не на названии. В следующий раз просто скажите: «Как насчет того, чтобы вместо этого назвать его FooFrobber? Он больше связан с Foo, чем с Something, и я думаю, что Frobber лучше описывает то, что он делает, чем Builder».

Ответы (9)

Я думаю, что если ваш техлид определенно не поддерживает вас, то вам придется изменить свое поведение.

Такова печальная реальность жизни в компании.

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

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

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

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

Еще одна важная вещь, которую вы можете сделать, это объяснить, почему что- то нужно изменить. Не говорите просто: «Эй, поменяй X на Y». Объясните ему, что X вызывает ошибки в реалистичном сценарии Z или что Y чище и упрощает поддержку кода. Снова попытайтесь сформулировать это таким образом, чтобы ваш коллега почувствовал, что вы активно пытаетесь помочь ему стать лучше, а не просто делаете ему выговор за то, что он поступил по-своему, а не по-вашему.

Укажите хорошие вещи в их коде, а также плохие. Если они сделали что-то разумно, скажите им, что вам понравилось, как они это сделали. Это поможет им не чувствовать, что вы хотите их заполучить.

Разработчик пишет класс, который выглядит как что-то среднее между Factory и Container, затем называет его SomethingBuilder, где часть Something не связана с окончательно построенным объектом. Я, конечно, комментирую это, и скажем так, он принимает это на свой счет.

Многое зависит от того, как вы это прокомментируете. Сравнивать:

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

к:

Интересно, может быть, стоит разделить это на Factory и Container следующим образом:

[.. небольшое количество псевдокода, чтобы продемонстрировать, что вы имеете в виду..]

Думаю, это даст нам [конкретное преимущество X].

Что вы думаете?

Кроме того, кажется, что Нечто на самом деле не раскрывает намерения, так как это скорее Другое. Может быть, переименовать его в Другое?

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

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

Он говорит, что у каждого свой стиль. Я не уверен, что это за стиль называть Factory a Builder, но неважно.

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

Возможно, ваш коллега просто пишет глупый код; Я не знаю. Но сказать ему, что «ты пишешь глупый код», не очень эффективно, чтобы изменить это. Спросите, почему он так поступил. Слушать. Предоставьте осмысленные альтернативы и объясните, почему вы считаете, что это лучше; дайте ему возможность обдумать это и поэкспериментировать с ним.

Не ждите, что он изменится, просто бросив ему словарные определения «Фабрика» или «Строитель»; объясните, как это улучшит ситуацию с объективной точки зрения. «Более элегантно» часто используется, но не очень хороший аргумент. Если вам трудно придумать лучшие аргументы, чем «более элегантный», тогда, может быть… это не так уж важно?

Честно говоря, я обычно делаю довольно тщательные обзоры кода.

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

В своих собственных обзорах кода я всегда останавливаюсь и думаю, прежде чем оставить комментарий: «Действительно ли это объективно улучшит качество кода или это просто мое личное предпочтение?» Нередко это просто мое личное предпочтение; поэтому я отпустил его.

Я видел, как люди комментируют очень незначительные субъективные вещи. Можно прокомментировать небольшую орфографическую ошибку/опечатку в комментарии, так как это объективно неправильно, но я думаю, важно признать, что программирование — очень субъективное ремесло, и что объективность трудно обеспечить (именно поэтому программисты постоянно во всем боремся ).

Часто используется «более элегантный», но не очень хороший аргумент. Если вам трудно придумать лучший аргумент, чем «более элегантный», то, может быть… это не так уж важно ? дам вам несколько + только за это, если бы я мог :)

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

1) Если команда не занимается PR/CR процессом, вы должны настаивать на его внедрении (вы это сделали).

2) Если люди штампуют PR, вы должны призвать их остановиться (вы сделали это).

3) Вы должны быть примером, и когда кто-то присылает вам плохой PR, вы должны прокомментировать его и объяснить, что не так (вы сделали).

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

На данный момент технический руководитель обязан справиться с ситуацией так, как он хочет. В этом случае культура идет сверху; самый опытный разработчик должен либо объяснить остальной команде, почему процесс PR важен, либо навязать, что они должны делать это правильно, даже если они не понимают, почему (оптимально первое, но второе тоже работает). Однако, если технический руководитель не понимает, почему это ценный процесс, или не хочет прилагать усилия, чтобы убедиться, что он выполнен правильно, вы мало что можете сделать.

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

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

Вот несколько практических идей для решения этой проблемы.

  1. Попробуйте разделить комментарии обзора кода на объективные и субъективные моменты. Объективные точки включают наблюдения, такие как «здесь потенциальная ошибка» или «это не соответствует требованиям». Субъективные комментарии включают «есть лучший способ сделать это» или «это лучше назвать X». Часто бывает полезно прямо указать в комментариях разницу: «По моему мнению…» / «Подумайте о том, чтобы попробовать…». Я думаю, это помогает снизить обороноспособность.

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

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

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

  5. Что касается вопросов более высокого уровня о том, как получить согласие PR, или о том, как разрешить конфликт из-за PR, это хорошие темы для обсуждения в ретроспективе (при условии, что ваша команда придерживается какого-то Agile-процесса).

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

Технический руководитель

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

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

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

коллега

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

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

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

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

Если вы обнаружите, скажем, утечку памяти или какой-то странно неэффективный код, то да, обратите на это внимание. Но не попадайтесь в ловушку «когда меня просят прокомментировать что-то, я должен прокомментировать это каким-то образом». Вы не знаете. Вы в промышленности, 75% — это похвальное усилие, черт, 35% — это проход в большинстве случаев.

Пока все работает и не дает сбоев, и все делается вовремя, чего еще вы хотите? Вам платят не за строки красивого кода, вам вообще не платят за строки кода — вам платят за практическую отдачу .

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

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

Обсуждение именования

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

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

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

  1. опишите вывод
  2. описать бизнес-логику, содержащуюся в

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

saveDataInAthreadSafeAndDataConsistentManner(){...}

не полезно. Но

saveAddressDetailsAsTheresAConcurrentProblemWhenSavedWithEverythingElse()

ну, это полезное имя метода.

Но, в конце концов, рабочий код >> хорошо названный код, который не работает, и быстро созданный рабочий код >> медленно произвел хорошо названный рабочий код.

Другая мысль

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

Что ты сейчас говоришь? Что вы не знаете, в чем разница между шаблоном Builder и шаблоном Factory? Или что, по вашему мнению, нет ничего страшного в том, чтобы назвать шаблон Factory шаблоном Builder? На самом деле это даже не Фабрика, я назвал ее наиболее близкой к ней, но это совсем другое. В том же контексте можно ли назвать туалет pissuare, а pisuare — туалетом? Было бы интересно, если кто-то слеп, что он будет делать.
@ Пешо, наверное, нет. Для меня они оба что-то делают, основная разница в том, как они это делают. Но мне было бы все равно , как сделана эта вещь, если бы я был ее потребителем, я бы просто с удовольствием ее использовал. Применение соглашений об именах означает, что вы хотите, чтобы имя четко соответствовало тому, как . Вздох, я расширю свой ответ ...
Я хочу, чтобы имя соответствовало хотя бы «Что». Он не строит то, о чем говорит, что строит.
Я согласен с тем, что вы написали в «Обсуждении именования». И я снова повторяю, что класс не делает того, о чем говорит. Если мы оставим в стороне часть Строителя, это говорит о том, что он строит один объект, хотя на самом деле он строит другой.
@Pesho, это другая проблема - я думаю, вам следует отказаться от проблемы «строитель против фабрики» и снова спросить своего TL о бите «что-то». Но если ваш TL против этого, то пусть это останется незамеченным. Это не принесет вам очков или повышения по службе.
Я просто процитирую вас из моего вопроса. Возможно, вы пропустили это при чтении или я не сказал об этом достаточно явно: «Разработчик пишет класс, который выглядит как что-то среднее между Factory и Container, а затем называет его SomethingBuilder, где часть Something не связана с окончательно построенным объектом».
Часть «Что-то» в моей цитате. Я указываю вам на. Я уже сказал это в своем первоначальном вопросе, возможно, вы пропустили это.
@ Пешо да, точно. Просто спросите TL о «что-то» и, возможно, это нужно исправить. Но отбросьте бит «factory v builder».
Я думаю, что мы слишком сильно зацикливаемся на том, что «важно ли соглашение об именах». Я думаю, что более важно учитывать изменения штамповки (которые OP воспринимает правильно или нет, является культурой компании) по сравнению с фактическим обзором кода (который OP может или не может делать правильно).
«Соглашения об именах глупы». Если вы занимаетесь разработкой для MacOS/iOS, именование очень и очень важно. Люди ожидают, что прочитают имя и получат от него очень много верной информации. Если вы используете плохое название, люди очень недовольны. Если вы улучшите что-то, что я назвал, я буду счастлив.
@ gnasher729 конечно, но кто тогда следит за соблюдением соглашений об именах? Является ли это частью процесса собеседования? как узнать, соответствует ли мое соглашение об именах тому, что вы ожидаете? я не говорю, что слова не важны или передача информации не важна, но что «условия» трудно соблюдать и они бессмысленны, если все не согласны с ними — что в случае с командой оперативников кажется Эээ, случай.
Если вы хотите соглашения об именах, они должны быть четкими, простыми, и вы должны согласиться с ними в руководстве по стилю. Например, начинайте имена классов с заглавной буквы, а каждое предыдущее слово — с заглавной. Предпочитайте словосочетания с существительными для имен классов. Например, «Сведения об адресе». Начинайте имена методов со строчной буквы, а каждое последующее слово — с заглавной. Предпочитайте глагольные фразы для имен методов. Например, "saveAddressDetails()". И так далее.

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

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

Кроме того, ваша управленческая цепочка проигнорировала основы математики и психологии.

Что касается математики, если один модуль имеет 99%-й шанс отсутствия ошибок (я не использую достаточно модульных тестов), то вы можете рассчитать (1-p)^n, что 100 модулей вместе имеют шанс 37%-го поведения без ошибок. . Вероятность очень быстро идет против вас. Повышение «качества» до 99,5% улучшает систему чуть более чем на 60%.

Что касается психологии, кто хочет работать на или с людьми, которым все равно?

Это поспешность с выводами. Когда я пришел в свою нынешнюю компанию, многие команды придерживались менталитета «стремление к мастерству». Потребовались некоторые усилия, поиск и ошибки, чтобы найти правильный способ проведения проверки кода (люди должны были к этому привыкнуть), но мы добились своего, и я все еще работаю там более 2 лет спустя. В частности, мне совсем не ясно, протестуют ли люди против обзоров кода как таковых или что проблемы заключаются в тоне/стиле ОП, проводящего обзоры. Подозреваю, что как минимум часть проблемы может заключаться в последнем.
Я думаю, что советовать кому-то покинуть компанию из-за того, что их стиль проверки кода немного противоречит, немного экстремально.
Это из моего собственного опыта, вложите сердце / душу, чтобы все было управляемо. Конечно, это инженерия, а не математика, совершенство не имеет значения. Мы избавились от использования глобальных переменных в качестве связи между потоками, вместо этого использовали передачу сообщений и конечный автомат в начале каждого потока. Заняло 2 месяца, уменьшил нагрузку на поддержку на 75%. Никаких опасностей гонки. Но руководитель группы хотел иметь репутацию человека, который «всегда доводит дело до конца». Снова появились глобальные переменные, несколько модульных тестов, каждый мог проверить любое изменение, которое хотел. Компания обанкротилась 3 года спустя из-за репутации кода со странным поведением, которое невозможно воспроизвести/отладить.