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

Фон

Я инженер-программист и практикую TDD в своей компании. Мой менеджер также отвечает за кодирование (при необходимости) и управление подчиненными инженерами.

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

Проблема

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

Есть два распространенных варианта использования, которые я буду применять для решения проблемы:

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

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

    • Довольно часто требования к новой фиче не продуманы досконально. Столкнувшись с крайними сроками, мы должны оставлять «дыры» в нашем коде, чтобы позволить бизнесу принять решение, не влияя на прогресс.
    • Например, я мог бы реализовать интерфейс для извлечения значения времени выполнения из какого-то неизвестного источника данных, для которого я реализовал декоратор, который использует IRuntimeValueProvider для извлечения его во время выполнения. Я могу оставить фактическую реализацию до принятия решения, не влияя на другую бизнес-логику.
    • Менеджер думает, что я представляю интерфейсы с неизвестными ему именами, такими как IHttpContentFactory , IHttpClientProvider . Он все еще не удовлетворен моим объяснением и демонстрацией того, что эти фабрики служат определенным целям при создании компонентов и обеспечивают возможность расширения.
      • В ходе обсуждения моего использования IHttpClientFactory для абстрагирования конструкции HttpClient от ее потребителей он особо упомянул, что, по его мнению, потребитель должен нести ответственность за создание каждой детали реализации, что приведет к распространению логики построения повсюду.

У нас возникло несколько споров из-за подобных дизайнерских встреч. В одном жарком споре мне даже сказали, что «[он] занимается программированием более 20 лет!» , подразумевая, что я даже не смею сомневаться в его авторитете.

Что я пытался смягчить эту проблему

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

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

Как нам найти золотую середину?


Обновлять

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

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

Честно говоря, я очень разочарован, увидев так много ответов с сильным стереотипом «Почему вы, инженеры, не можете думать как менеджеры». В конце концов, все можно назвать чрезмерной инженерией: зачем помечать поля как privateвместо того, чтобы выставлять все напоказ, зачем выполнять модульное тестирование, если ни один пользователь не собирается выполнять только один модуль и т. д.

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

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

Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат .
То, что вы не упомянули, кажется важным: насколько вы опытны в разработке программного обеспечения? В частности, сколько лет вы практиковали и в скольких существенно разных проблемных областях вы работали? «Проблемные области» обычно эквивалентны «компаниям», но могут быть разными проектами внутри крупной компании.
Могут ли другие в вашей команде модифицировать/изменить ваш код так, как вы говорите?
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что он находится не на том сайте. Это для сайтов программного обеспечения, программирования или TDD.
@Fattie: это не вопрос программирования. Здесь не было задано ни одного вопроса о том, как программировать. Это вопрос о межличностных отношениях на рабочем месте между работником и руководителем. Конфликт возникает из-за программирования.
Привет @Ellesedil - я не согласен, но именно поэтому есть голосование!
Я работаю разработчиком программного обеспечения более 15 лет. Я никогда не видел такого интересного сценария, как ваш. :-) Вы наверное отличный разработчик, чему я рад за вас. Однако в целом, вероятно, лучше всего хорошо ладить с менеджерами, пока они намеренно не просят вас написать ошибочный код. :-) Кроме того, разработчики не работают на менеджера до конца своей карьеры. Когда-нибудь вы сможете работать на менеджера, который позволит вам иметь большую степень свободы в написании кода. На данный момент хорошо поладить с менеджером, вероятно, отличная идея.
Мой менеджер гораздо лучший менеджер, чем я. Я гораздо лучший разработчик программного обеспечения, чем он. Здравый смысл заключается в том, что я принимаю решения о том, как пишется программное обеспечение.

Ответы (12)

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

Я собираюсь предположить, что был. Потренируйтесь рассказывать эту историю. Это конкретно и реально. Это не «х может случиться» или «у может измениться», а «Однажды я сделал это таким образом, и вот как это сработало». Менеджеры (я говорю как один из них) с подозрением относятся к трате денег (и поверьте мне, вы пишете более сложный код, который другие не могут понять с первого раза, это трата денег) на то, что может произойти. Они не хотят финансировать спекуляции, которые могут быть основаны только на «книжном обучении» и последних причудах в Интернете. Но когда вы опираетесь на свой опыт? Это совсем другая ситуация.

Я не большой поклонник заводов, провайдеров, инжекторов и прочего. Как правило, они настроены для вещей, которые на самом деле никогда не произойдут (переход с MS SQL на Oracle) или имеют небольшое влияние, когда они это сделают (изменение папки, в которой сохраняются файлы). У них действительно есть место в аранжировках, которые очень изменчивы, в которых вы, кажется, участвуете. Поэтому вам нужно показать, что у них есть это место. Кажется, вы исходите из позиции: «Это нормальный способ делать что-то, и мне нужна причина, чтобы этого не делать». Ваш менеджер говорит: «Это не нормально, нормально — это просто и понятно. Дайте мне вескую причину, чтобы добавить еще один слой на пути». Работайте над этой причиной. Работайте над историей успеха в прошедшем времени, где этот дополнительный слой экономит дни или недели работы. Обоснуйте свою инженерию, иначе это действительно чрезмерная инженерия.

Комментарии не для расширенного обсуждения; этот разговор был перемещен в чат .
Вы не можете «переключиться с SQL на Oracle», поскольку базы данных Oracle используют SQL. Вы имели в виду "переключиться с SQL Server на Oracle"?
@MT0 ты явно никогда не работал с Oracle. содрогаться
Вся сложность имеет свою цену, которая должна быть оправдана четким формулированием стоимости. Я обнаружил, что когда я не могу четко объяснить, почему необходима какая-то сложность, то либо (а) она на самом деле не нужна, либо (б) нет большого вреда в том, чтобы подождать, пока причина не станет ясной, чтобы добавить сложность. сложность в.

Меня смущает эта цитата из одного из ваших комментариев:

Как инженеру-программисту, для меня стало второй натурой «делать вещи, которые могут не иметь веских оснований на поверхности», например взаимодействие с неизвестными, о которых я упоминал. Необходимость постоянно быть на грани объяснений по глубоко техническим (а иногда и очень самоуверенным) предметам истощает меня.

Я видел несколько повторений следующего жизненного цикла:

  • Квалифицированная команда программистов предлагает другой подход к программированию.
  • Он рассматривается в течение нескольких лет, вплоть до десятилетия, как нечто, что должно использоваться повсеместно, несмотря на любые недостатки и ограничения. На этом этапе достаточно сказать: «Я применяю методологию X», не анализируя, является ли X чистой выгодой.
  • Он выходит из моды, но его самые полезные идеи остаются частью набора инструментов для разработки программного обеспечения, и их можно извлечь и использовать всякий раз, когда они приносят чистую пользу.

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

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

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

+1 за все, но особенно за жизненный цикл парадигмы. Когда я начинал работать, объекты были в конце концов. Теперь они полезный инструмент.
Паттерны уже переходят на третий этап: softwareengineering.stackexchange.com/a/335894/92517
Я признаю, что, возможно, я не очень хорошо объясняю себя словами «делаю-что-может-не-иметь-веских-причин-на-поверхности». Возможно, это лучше объясняет пример: меня спросили, почему я использовал декоратор в определенном месте -> я объяснил, сказав, что пытаюсь реализовать новую функцию, которая включает изменение нетестируемого класса, я обернул декоратор поверх него, поэтому что я могу перехватить вызов и перенаправить его на новую логику на основе некоторого значения времени выполнения -> Мой менеджер объяснил, что это трудно понять, поскольку есть две реализации интерфейса.
.. Затем я ответил, что для этого и нужны интерфейсы (как в C#/Java), для полиморфизма -> Он не доволен моим объяснением до такой степени, что мы в основном не согласны с самой основой ООП, поэтому я прокомментировал, что я больше не могу объяснить себя. Это привело к тому, что я внес изменения в дюжину мест в зависимости от старого интерфейса, чтобы переключиться на новый интерфейс с полностью идентичными элементами в нем.
@rexcfnghk Полиморфизм, как и остальная часть ООП, - это просто инструмент, который может принести пользу или добавить общую сложность. Имея всего дюжину применений, которые можно достаточно легко найти, я бы выбрал между их редактированием или добавлением полиморфизма, в зависимости от того, что приводит к более простой и читаемой программе.
Согласен с необходимостью обоснования, не согласен с тем, что в 12 вариантах использования вместо полиморфизма следует использовать переключатель.
it is difficult to understand as there are two implementations of an interface.да, это в основном противоположно тому, что я думаю об интерфейсах; Я становлюсь подозрительным, когда интерфейс не имеет более одной реализации. Я понимаю, что это не единственная причина иметь интерфейс, но обращение к нескольким реализующим классам общим способом всегда было для меня основной причиной использования интерфейса.
Хотя все, что говорит PS, верно, теперь мы могли бы просто открыто задавать вопросы по синтаксису кода на этом сайте. Этот QA весело не по теме - вы не могли бы это придумать. На самом деле ведутся дискуссии об именах функций, инверсии, синтаксисе интерфейса и т. Д. - это совершенно нелепо (и смешно). Просто нажмите «закрыть». ОП, обязательно перенесите свой интересный вопрос на comp.sci. сайте или где лучше.
@Fattie Я пытался свести к минимуму техническое содержание в ответе и сделать его о принципе того, следует ли считать технику хорошей только потому, что она сейчас в моде.
@Fattie: Ответы, включающие обсуждение парадигм кодирования, по существу бросают вызов объему вопроса. Вопрос довольно четко спрашивает о том, как разрешить конфликт между сотрудником и менеджером, а не о том, как сотрудник должен кодировать по-другому. Этот вопрос, если его переместить в область разработки программного обеспечения, скорее всего, будет не по теме, поскольку речь идет о конфликте в отношениях между сотрудником и менеджером.
@ThomasW Использование полиморфизма вместо a switchпри написании токенизатора (полученного из конечного автомата и, вероятно, имеющего более 12 случаев) было бы самоубийством производительности для вашего анализатора языка и было бы еще более трудным для чтения. Всегда есть компромиссы.
Спасибо @jpmc26, иногда я работаю с парсерами. Однако я не читаю этот вопрос как относящийся к доменам лексеров/парсеров или FSM - предлагается использовать шаблон декоратора, имена интерфейсов, такие как IRuntimeValueProvider, IHttpClientFactory, IHttpContentFactory и т. д.

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

Вот общие аспекты вашей проблемы, как я ее вижу:

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

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

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

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

Вы правы насчет направленности ответов. Происходит от того, что многие из нас являются разработчиками программного обеспечения.
Я не согласен с тем, что вопрос дизайна, который поднимает ОП, можно решить, установив стандарты. Ни «Никогда не используйте технику X», ни «Используйте технику X везде, где она применима», скорее всего, не сработают. Вместо этого любое обсуждение должно быть посвящено тому, как найти компромисс между быстрой реализацией новых функций и долгосрочной поддержкой.
Что, если вы хотите написать красивый код и предоставить готовый продукт? Они ведь не исключают друг друга?
Это произошло потому, что ОП очень специфичен в отношении того, как он разрабатывает программное обеспечение. И то, как он это делает, не бесспорно, есть много сторон, на которые можно смотреть, и много людей с твердым мнением повсюду. Также задается вопрос: «Как мне поступить с менеджером, который отказывается использовать общие шаблоны проектирования…». Таким образом, ответ на вопрос, как поступить с менеджером, станет согласием с указанными практиками. Может быть, если бы из вопроса убрали специфику задач, было бы лучше.
Да, и, возможно, вместо этого, возможно, потребуется перенести его в Программную инженерию.
«Я единственный, кто недоумевает, почему в Workplace мы видим, что так много внимания уделяется методам кодирования, а не фактическим конфликтам на рабочем месте?» не мог не согласиться больше .

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

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

За 10 лет моей разработки настоящий шаблон стратегии/фабрики потребовался только три раза, два из которых были связаны с работой:

  • В приложении, которое отображало информацию о продукте, где некоторые из этих продуктов были, по сути, набором более мелких продуктов в коробке, мы использовали стратегию, чтобы определить, какая фабрика необходима для преобразования информации о продукте (запрошенной с помощью ключа) в представление. Не очень славно, но это сделало работу. Если мне будет позволено присоединиться к вашему скромному хвастовству об ошибках, за все время моего пребывания там у нас не было ни одной ошибки! (об одном сообщили после того, как я ушел, но оказалось, что это ошибка пользователя :)).
  • В приложении, которое показывало пользователям, куда идти на занятия, которые они посещали, мы использовали фабрику и абстракцию, чтобы обеспечить быстрый переход между Bing Maps API и Google Maps API. Это было связано с тем, что оба варианта имели соотношение цены и качества, а компания не решала, какой из них использовать. В конце концов мы узнали из нашего домашнего офиса, что у нас уже есть ключ API для одного из них, и мы смогли в последнюю секунду переключиться на этот API, прямо перед запуском.

И третий — это проект, над которым я возился, который занимается мониторингом серверов для серверов Windows:

  • Я использую интерфейс для вывода данных мониторинга и для самих мониторов. Мониторы легко настраиваются (в зависимости от настроек приложения). Реализация вывода зависит от того, тестирую ли я новый монитор или приступаю к развертыванию, например, IOutputInterface имеет ConsoleOutput и SqlOutput в качестве реализаций, которые могут различаться.

Обратите внимание, что мой личный проект сразу же чаще использует шаблоны и инверсию управления (IoC), чем мои рабочие проекты.

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

Хорошее использование паттерна Стратегия.
Что означает аббревиатура «LOB»?
Я был на проектах, где программисты везде применяли шаблоны проектирования, где раньше было 2 класса (интерфейс и реализация), теперь их 7. ОП, тебе действительно нужен ProxyProviderDecoratorFactory? Вы повышаете уровень сложности для всех остальных. Ваш менеджер тоже это видит. Погуглите "YAGNI" и попытайтесь сделать что-то проще.
@ThorbjørnRavnAndersen LOB расшифровывается как Line of Business, обычно это приложение, используемое для поддержки какого-либо бизнес-процесса.
@C Bauer «За 10 лет моей разработки настоящий шаблон стратегии / фабрики потребовался только три раза». Мне трудно в это поверить, используете ли вы какой-либо другой способ реализации полиморфимов? Например, шаблоны/дженерики или указатели на функции? Как вы применяете принцип «открыто-закрыто»? Неужели нельзя модифицировать интерфейс каждый раз, когда нужен новый функционал?
тявкать это в основном. если вы делаете что-то, что становится проблемой (потому что это слишком сложно или что-то еще), то, когда вас больше нет рядом, это становится проблемой ваших менеджеров.
На сайте разработчиков был пост «Мы начали использовать шаблон проектирования и перешли от 70 классов к 700. Что мы делаем сейчас?» Серьезно.

Простое решение: выйти .

Трудное решение: в любом разногласии половина вины лежит на вас .

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

  • качество продукта и время выхода на рынок
  • хороший продукт против хорошего кода
  • умный код против понятного кода
  • корпоративная культура «сверху вниз» и инженерная культура «снизу вверх»

Если это не работает, рассмотрите другую роль в команде, другую команду в компании или, наконец, другую компанию .

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

Очисти свой разум, будь бесформенным. Бесформенный, как вода. Если вы нальете воду в чашку, она станет чашкой. ... Теперь вода может течь или она может разбиться. - Брюс Ли

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

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

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

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

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

Мне нравится твой стиль. Аналогия — мощный инструмент, если им правильно пользоваться.

Что я должен делать?

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

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

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

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

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

Помните, эта борьба, в которой вы находитесь, — это марафон . Если вы хотите изменить культуру кодирования, вам придется продемонстрировать ценность шаблона.

Я не прекращал того, что делаю всегда, однако мне уже надоели постоянные споры и необходимость постоянно защищать себя по поводу своего кода. Как инженеру-программисту, для меня стало второй натурой «делать вещи, которые могут не иметь веских оснований на поверхности», например взаимодействие с неизвестными, о которых я упоминал. Необходимость постоянно быть на грани объяснений по глубоко техническим (а иногда и очень самоуверенным) предметам истощает меня.
Не голосовал против, но я думаю, что предложение о том, чтобы OP продолжал вести себя, из-за чего он ссорится со своим менеджером, может быть не лучшим советом.
@cdkMoose, если он хочет изменить культуру кодирования, настойчивость - единственный способ. Не говоря уже о том, что им не понадобится напутствие по пути.
Также может быть рецепт увольнения, для которого нужно больше, чем Адвил. Настойчивость может обернуться неповиновением, если менеджеру приходится достаточно часто говорить «нет». Не зная более подробной истории проекта, мне не ясно, что OP здесь полностью прав. Принуждение хороших методов кодирования к устаревшему проекту все еще может вызвать путаницу и ошибки у других членов команды.
@cdkMoose, вы делаете правильное замечание.
@rexcfnghk «для меня [это] вторая натура — делать вещи, которые могут не иметь веских оснований на поверхности». Ждать. Вы имеете в виду делать вещи, для которых причина требует более глубокого понимания? Если да, объясните это своему руководителю как можно глубже. Или вы имеете в виду делать вещи, для которых вы на самом деле не знаете веской причины? Потому что это просто культивирование грузов .
В каждом проекте есть что-то «правильное» и «неправильное». Так уж получилось, что «правильный путь» часто оказывается «неправильным путем» для многих проектов. Игнорирование того, что кажется четким указанием своего менеджера делать то, что вы считаете «правильным», очень часто не сработает. Столкновение голов и настойчивость не создадут «счастливой» рабочей среды. Правильный подход состоит в том, чтобы сначала ПРОВЕРИТЬ СЕБЯ. Кому-то с репутацией первоклассного разработчика, который постоянно работает над тем, чтобы его идеи были приняты, гораздо проще, чем тому, кто указывает на Интернет.
Я был свидетелем того, как старшего разработчика увольняли, потому что он шел и реализовывал функции так, как считал лучшим. Менеджер несколько раз пытался объяснить, как он хочет, чтобы все было сделано, но в конце концов выгнал его на обочину. Никто не является незаменимым, и соответствие часто рассматривается как более важное, чем чистое техническое мастерство. И как мой менеджер (он был действительно хорошим парнем и не легкомысленно уволил старшего разработчика) позже сказал нам: «Мне нужен код, который любой из ваших ребят мог бы обновить/отладить/расширить. понимание приносит больше вреда, чем пользы».
@AndreiROM Да, такое может быть.
@IamSoNotListening Вы и ОП можете счесть интересной книгу Репеннинга и Стермана « Никто никогда не получает признания за решение проблем, которых никогда не было» .
@AndreiROM: Эта история также звучит так, как будто ваша команда разработчиков упустила прекрасную возможность обучения для создания новых навыков кодирования.
@ellesedil - верь во что хочешь. Разработчики — это не просто программисты, мы — решатели проблем. Решение не всегда должно быть идеальным.

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

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

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

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

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

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

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

В основном то, что вы пытаетесь сделать, это иметь еще один уровень косвенности, еще один и так далее. Это все усложняет.

Действительно ли эти слои решают проблему? Упрощение добавления функций в будущем не решает проблему. Клиент не готов за это платить. Поэтому для бизнеса это не проблема. Для бизнеса проблемы не существует.

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

Таким образом, вы не только делаете несанкционированные инвестиции от имени своей компании, но и понятия не имеете о связанном с этим факторе риска.

Сложные вещи требуют больше времени для выполнения и обслуживания. Время - деньги.

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

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

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

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

Это предполагает, что они еще не понимают, но они могут просто не согласиться с необходимостью этого или с тем, что они считают это нерентабельным. Также OP не может навязывать производственную систему, такую ​​​​как парное программирование, на предприятии. Максимум, что он может предложить. ОП кажется слепым, что он просто ошибается и может упускать общую картину.
@StephenG Очевидно, что ОП не может объяснить, почему его подход объективно лучше, и, в свою очередь, понять, почему другие считают его выбор дизайна неоптимальным. Парное программирование, пожалуй, лучший способ, который я нашел (в тех немногих случаях, когда это было выгодно для нас), чтобы иметь возможность обсуждать процесс проектирования в том виде, в каком он происходит, потому что вы можете оспорить каждое решение, когда оно принимается, если вы этого не сделаете. оба согласны. Это вполне может быть в случае «Тысяча стежков вовремя экономит девять».
Мне кажется, что ОП слишком много и слишком агрессивно высказал свое мнение , но у него была возможность сделать это. Похоже, ему не хватает социальных навыков (и, возможно, терпения), необходимых для того, чтобы все делалось так, как вы хотите, в организации, в которой вы не очень старший. Его босс на самом деле кажется раздраженным из-за него - пора успокоиться и показать, что он уважает его босс, а не настаивать больше - он должен отдавать предпочтение поддержанию хороших рабочих отношений над своим личным техническим мнением (которое действительно звучит чрезвычайно самоуверенно, какими бы ни были технические достоинства).
@StephenG Возможно. Вот почему я превращаю это в ситуацию наставничества, когда, надеюсь, более опытный старший разработчик может указать, где цепочка предположений OP терпит неудачу.