О туннельном мышлении

Когда у тебя в руках молоток, то вокруг всё гвозди мерещатся.
Народная мудрость

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

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

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

У меня в практике был эпизод. Планировали мы новый модуль для системы. С самого начала было очевидно, что нам нужно будет изолировать фронт-энд от бэк-энда, то есть мы должны будем иметь как минимум два потока. Обычно в подобных проектах нам удавалось обойтись без многопоточности, на в данном конкретном случае это был единственный вариант. На слове «многопоточность» технического лидера (на тот момент) нашей команды конкретно заклинило.

Оказалось, что раз наш модуль многопоточный, нам совершенно необходима lock-free очередь. И даже не только очередь, а lock-free контейнеры (как потом оказалось, построенные на основе этой самой очереди). Причем очередь оказалась нужна еще до начала обсуждения архитектуры. Более того, оказалось, что обсуждать архитектуру совершенно не надо, ибо lock-free контейнеры суть решение всех проблем и нам надо всего лишь их реализовать и сразу наступит вселенское Щастье с большой буквы «H» (потому что по-английски). С этими словами он и кинулся эти самые очереди писать/выковыривать из других проектов. Да, прямо посередине первого обсуждения архитектуры. Еще до того, как мы определились даже не с фичами, а с требованиями (про stories и таски я даже не заикаюсь).

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

Результат оказался довольно предсказуем. Дикий срыв сроков, треш и угар в архитектуре, лингвини** в коде, чертовщина в багзилле, нервный тик у менеджера проекта. Вообще весь проект со стороны напоминал попытку впихнуть прямоугольную пробку в треугольную дырку. Ваш покорный слуга потом это рефакторил. Конейнеры эти в итоге оказались не нужны и были выброшены. В паре мест получил где-то 1000-кратное увеличение производительности просто за счет применения правильной архитектуры, еще в нескольких местах убрал несколько алгоритмов с якобы O(log N), а на деле хорошо если O(N) и заменил их на O(1).

В процессе рефакторинга, который скорее напоминал вскрытие, выяснилось, что весь дизайн программы своидлся к грубому приколачиванию модных lock-free гвоздями туда, где в них не было никакой нужды. Простейший анализ data flow показал, что обмен данными между потоками минимален и направлен в одну сторону, и применение lock-free контейнеров просто не давало никакой выгоды. Ну хотелось человеку их применить, и все тут. Более того, передовые лок-фри контейнероы оказались не thread safe в некоторых применениях, как бы ни смешно это звучало. Архитектура же модуля была представлена кучей строительного мусора, местам скрепленного гвоздями (жидкими). Вкупе с отстутствием юнит-тестов (стандартное — тесты писать некогда, копать надо!) рефакторинг этого превратился в увлекательный квест.

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

О результатах такого подхода можете догадаться сами.

*шутка
**лингвини — вид макаронных изделий. Представляет собой толстые, но слегка зауженные феттучини***
***феттучини — это широкие спагетти
  1. Не, ну все стандартно) Еще прикольнее, когда «великий» архитектор ваяет свой могучий тул/фреймворк/и т.п., а потом мы, простые негры, должны его круто использовать. И никого не волнует, что эта штуковина вообще не работает и на рынке полно нормальных реализаций! Если бы это был коллега — послали бы куда-нить далеко, а то ведь он еще и заказчик — обижать нельзя.
    Потом оно само отмирает и приходит следующий архитектор… со своими идеями, как все тут написать самим и круче еще в 10 раз)

    • О, изобретатели фреймворков на ровном месте. Типа напишем фреймворк, а потом за пять минут долетим. Сказочнеги 🙂
      Одно хорошо, что иногда на архитекторов можно просто болт сложить

Оставить комментарий


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

15 посетителей онлайн
5 гостей, 10 bots, 0 зарегистрированных
Максимум сегодня:: 20 в 12:49 am UTC
В этом месяце: 53 в 09-21-2021 08:53 am UTC
В этом году: 248 в 07-26-2021 10:24 am UTC
За все время: 332 в 11-22-2019 03:23 am UTC