Как быть со старшим коллегой, который написал свой собственный язык программирования? [закрыто]

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

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

Мы являемся точкой, где вся новая бизнес-логика записывается на этом уровне перевода. Я чувствую, что это Плохая Идея™ по ряду причин:

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

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

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

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

Немного предыстории: у меня около 5 лет опыта, 2 из которых в этой компании. Я больше склоняюсь к фронтенд-разработке, если у меня есть выбор. Упомянутый выше уровень перевода разрабатывался около 2 лет, но еще не был запущен в производство. Дополнительные технические сведения об этом уровне перевода см. в комментариях.

Он кажется умным человеком, не очень уверенным в своей документации и навыках поддержки. Он во всем зацементировал свою важность и роль, надо хорошо плыть против течения...
Я смущен его описанием как языка программирования. Это больше похоже на фреймворк.
@GlenPierce нет большой разницы между небольшим языком программирования и большой структурой.
Это классическая внутренняя платформа: en.wikipedia.org/wiki/Inner-platform_effect . Если архитектор не может/не хочет это остановить, значит, дело решено. Живи с этим или иди дальше. Бороться с этим бессмысленно.
@WesleyLong предполагает, что «архитектор» будет иметь право заставить старшего разработчика отказаться от своего собственного встроенного языка. В противном случае это зависит от того, кто выше этого старшего со стороны руководства, если вы можете привести им правильные аргументы. Например, перевод в числах того, что означает «очень крутая кривая обучения» из-за этой части, и того, что вы ожидаете, без нее, может помочь.
На каком языке на самом деле построен этот «внутренний язык»/фреймворк? Есть ли какие-либо варианты постепенного перехода от использования библиотек, самостоятельно созданных вашим коллегой, к чему-то более стандартному для отрасли?
Это не язык программирования, если у него нет компилятора или интерпретатора. Это звучит как программа, которая, возможно, делает больше, чем должна.
Термин, который я ожидаю применить здесь, будет «язык предметной области», и это довольно хорошо понятный способ подхода к сложным предметным областям (что может звучать так): en.wikipedia.org/wiki/Domain- Specific_language У них также есть довольно хорошо понятные недостатки (которые обсуждаются по ссылке в Википедии). Часто системы более сложны, чем могут показаться на первый взгляд, и вполне возможно, что этот DSL является отличным инструментом для управления ими. Что может не перевешивать проблемы, но я бы не решился согласиться с утверждением, что это обязательно плохо.
@autophage звучит так, как будто он органично вырос из чего-то простого, посредника, в DSL - и это, имхо, всегда является красным флагом, что он, вероятно, не был разработан для учета проблем с DSL и т. д. Тот факт, что эта штука уже 2 лет, не находящихся в производстве, снова является еще одним красным флагом. Если бы я получил опыт написания того, что я мог бы затем указать в своем резюме как «проектирование и сборка DSL», тогда хорошо, но если бы я получил опыт только в том, чтобы «писать вещи на пользовательском языке работодателей», то это то, чем я бы занимался. подальше от быстрого.
Это также может быть предметно-ориентированный язык , который при грамотной реализации (что очень сложно) может значительно облегчить жизнь клиентам.
"поскольку все наши инструменты разработки должны быть написаны этим разработчиком" - Почему это? потому что люди недостаточно понимают его, чтобы внести свой вклад, или им не разрешено вносить свой вклад?
Вы можете назвать это макросами, а не языком программирования. Вы преувеличиваете свою проблему.
Чтобы добавить некоторые детали относительно слоя перевода: слой написан на RAML . Уровень реализует ряд «плагинов», доступ к которым осуществляется через RAML Annotations . В файле RAML каждая конечная точка может определять ряд «шагов», определяющих поведение конечной точки (т. е. проверка объекта, выполнение запроса к базе данных, преобразование результата и т. д.). Разработчик написал собственный синтаксический анализатор, который использует эти файлы RAML для выполнения. Вкратце: вся бизнес-логика реализована исключительно в RAML-файлах.
Лучшая ссылка для аннотаций RAML: raml.org/blogs/announcing-raml-10-ga#annotations

Ответы (5)

Давайте дадим вашему вопросу некоторый контекст.

В вашей компании есть:

  • Продукт 25-летней давности.
  • Старший бэкенд-разработчик со значительными институциональными знаниями
  • Предположение: Несколько мид/младших разработчиков
  • Желание модернизировать окружающую среду
  • Слой перевода

Неполный список требований к уровню перевода:

  • Преобразование сообщения
  • Проверка сообщения
  • Подключение к базе данных
  • Сетевая интеграция со сторонними системами
  • Обработка данных
  • Сложное условное исполнение

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

Есть несколько аспектов, которые я бы назвал Bad Ideas™, но существование промежуточного ПО для интеграции не входит в их число. Худшее, ИМХО, это отсутствие документации : это может быть связано с тем, что у вас есть только один разработчик с достаточным опытом, чтобы визуализировать весь процесс. Он должен задокументировать процесс, чтобы, если его собьет автобус, разработка не остановилась. Это также уменьшит потребность команды разработчиков в задачах поддержки API.

Насчет Node-сервера - вынужден, по крайней мере на начальном этапе, согласиться с вашим архитектором. Разделение бизнес-логики на разные платформы/языки без серьезной архитектурной причины можно назвать Плохой Идеей™. Две кодовые базы, которые нужно поддерживать, два набора требований для новых должностей. Принципы KISS, возможно, были применены здесь для снижения затрат.

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

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

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

+1. Лучшее решение этой проблемы, кажется, состоит в том, чтобы задокументировать дерьмо из того, что существует.
+1 за документацию. Независимо от решения, которое вы используете для удовлетворения своих требований, у вас все равно будет какой-то API или фреймворк для изучения вашими разработчиками.
Поскольку большой причиной здесь является отсутствие документации, а ОП достаточно опытен, возможно, они могут обратиться к старшему разработчику и попросить написать документацию для промежуточного программного обеспечения со старшим разработчиком в качестве наставника. Даже документация, написанная только для частей, которые вы используете по мере их использования, заслуживает внимания.
@LoganPickup Я согласен. Документация не обязательно должна быть написана первоначальным разработчиком. Черт возьми, большинство разработчиков, которых я знаю (включая меня), все равно не очень хороши в написании этого. Всегда полезно, чтобы кто-то помог — по крайней мере, они могут дать представление о том, что важно задокументировать.
+1 Еще один голос за документацию. Вдобавок к этому, документирование процессов, подобных этому, заставляет разработчика научиться сообщать о процессе кому-то другому, не на его уровне. Обычно это многое говорит о ремонтопригодности, присущей реализации, насколько интуитивны процессы и реализации и т. д. Для меня, если вы представляете части, а люди делают неправильные предположения о том, как это работает, то ваш дизайн, вероятно, ошибочен. Это было бы здорово для обзора архитектуры и способов ее улучшения.
Похоже, что фреймворк монолитный, он обрабатывает множество разных вещей, которые могут обрабатываться отдельными модулями. Я думаю, что отделение бизнес-логики от проверки сообщений было бы полезной задачей. Я также удивлен количеством обращений за документацией. Лучший код документирует сам себя. И если вы действительно серьезно относитесь к избавлению от этого чудовища или к его рефакторингу, документирование всего этого только замедлит ход событий. (Но оставлять комментарии, путая биты, может быть полезно.)

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

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

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

Закончил бардак вот такими мерами, на которые ушли буквально годы:

  • Выберите совершенно новый язык программирования и веб-фреймворк, а также модульную экосистему, чтобы заменить устаревшие языки и наш собственный фреймворк, который у нас был до этого момента.
  • Оценить и узнать все об этом в свободное время.
  • Реализуйте небольшой полностью оплачиваемый клиентский проект в качестве доказательства концепции с этой технологией, убедившись, что используются только действительно стандартные, общепринятые в этой экосистеме подходы, чтобы убедиться, что новые люди (имеющие предварительное знание языка , но не наш домен) разбежались.
  • Найдите способы запустить новое решение в стороне от старого, не попадая снова в ловушку промежуточного программного обеспечения (т. е. слабо связанного через микросервисы или косвенно через клиентский браузер).
  • Медленно и упорно убеждайте очень консервативную команду в том, что хорошей идеей[tm] является не делать новые проекты/фичи со старой структурой, а окунуться в новую. Это очень эмоционально выматывало.
  • Переориентация своей роли в компании, в конечном итоге уход из этой команды и создание новой с другим углом зрения, чтобы разорвать все связи с (техническим) прошлым (частично проблема заключалась в том, что я был решателем проблем в том старом команда, и пришлось заставить их встать на ноги, уйдя).

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

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

Дальнейшее чтение: Согласно комментариям, я, кажется, не изобрел этот процесс. :-) См. паттерн StranglerApplication, чтобы узнать больше о предмете.

Точно. В подобных ситуациях существует большая институциональная инерция, и для изменения направления требуются время и усилия. +1.
Это предполагает, что существующая система на самом деле плоха и должна быть заменена. Основываясь на информации в вопросе, я бы не сразу предположил, что это так. Если это так, то это хорошее решение.
Описанный вами процесс очень похож на паттерн StranglerApplication .
Отличная находка, @tavnab! An alternative route is to gradually create a new system around the edges of the old, letting it grow slowly over several years until the old system is strangled. Doing this sounds hard, but increasingly I think it's one of those things that isn't tried enough. => идеально.
@rooby, наоборот. Существующая система может быть отличной (на самом деле, вероятно , она должна была просуществовать так долго), но могут возникнуть организационные проблемы, связанные с подходом. Существует огромная проблема с документацией, общим распространением ноу-хау, фактором грузовика и очень длительным этапом обучения новых коллег. Кроме того, многие, особенно молодые разработчики, не очень заинтересованы в том, чтобы вкладывать много времени в изучение очень специфического контекста приложения, что совсем не поможет им в дальнейших проектах. Именно такие причины и привели (в моем случае) к описанному изменению.
Вы начали свой ответ как «Я был старшим парнем». В чем разница между "я был старшим парнем" и "я старший парень" ????
@IamtheMostStupidPerson AnoE буквально не является старшим разработчиком, описанным в OP, но несколько лет назад он был в очень похожей ситуации. Его ответ описывает, как он это изменил, поэтому он больше не находится в этом положении.
«Это ничего не говорит вам об интеллекте, характере или каких-либо скрытых планах вашего разработчика». Спасибо за это, это действительно помогло «демонизировать» этого разработчика в моей голове. Легко позволить своим эмоциям мешать и предполагать худшее о его намерениях/способностях.

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

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

Будьте готовы к тому, что этот разработчик будет против;)

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

Это может быть долгая битва, и в конце концов вы можете быть тем, кто разделяет ;)

Как я могу убедить этого разработчика (и остальную часть моей команды, которая довольно пассивно относится к такого рода проблемам), что это плохая идея?

Это не ваша задача "убедить" разработчика.

В принципе, главный вопрос здесь о вашей позиции:

  • если вы просто коллега того же уровня или ниже, вы можете отметить риски для руководства. При этом сосредоточьтесь на проблемах, которые могут возникнуть в текущей системе. Тогда это их решение, а не ваша проблема;
  • если вы начальник , согласуйте с другими менеджерами необходимость изменения системы программирования, а затем сообщите о решении программистам. Решение должно быть обосновано и правильно донесено (погуглите «управление изменениями») и должен быть организован переход, но тогда вы должны ожидать, что ваши подчиненные приспособятся к нему. Вы можете предложить старшему программисту какие-то бай-ины, чтобы он остался с компанией, например, повышение зарплаты, больше выходных и некоторое угождение его эго.

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

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

Параграф «если вы босс» — действительно плохой совет. Менеджер, который принимает технические решения и требует, чтобы команда их принимала, — некомпетентный менеджер, на которого не стоит работать, даже если решения правильны с технической точки зрения.
Здесь есть хороший совет. Мне было сложно отделиться, но @Toss очень корректен. Менеджеры и коллеги отдаляются от сотрудника, который продолжает продвигать свои планы. +1 сэр.

Редактировать: не бросайте свою работу; у меня было неправильное представление

Вау, при первоначальном чтении поста техническое решение звучало как слой перевода, который без необходимости выполнял несвязанные задачи. Звучало очень вопреки «принципу единой ответственности»/философии UNIX, не очень связно или хорошо структурировано.

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

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

Другие комментарии верны; документация в порядке

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

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

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

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