Как сбалансировать качество кода с сильными разработчиками

15

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

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

Традиционно, у кого есть право вето на то, что проверено и как?

Как может код, который работает, но его слишком сложный / умный, удалить, не наступая на пальцы?

Иво
источник
7
Не могли бы вы добавить пример того, что вы считаете «умным», просто чтобы мы все были на одной странице?
Блэкджек
Какова иерархия лиц, вовлеченных в это?
2
Какое умное решение? Мне было бы неудобно рассказывать вам, как отрицать решение, если есть вероятность, что оно на самом деле превосходит вашу собственную идею.
Jojo
Является ли «умный» код преждевременно оптимизированным или преждевременно обобщенным? Обычно выигрывает кратчайший код для соответствующей меры краткости (СУХОСТЬ или токены, а не символы).
Кевин Клайн
3
Предложите альтернативу. В противном случае вы действительно просто препятствие для производительности. Трудно представить «контраргументы» для критики без альтернативного подхода. Это немного похоже на бремя доказывания обвиняемого. Вы просите их защищаться от всех возможных контр-сценариев.
Николь

Ответы:

16

Я люблю эту цитату:

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

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

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

Если вы не думаете, что это добавляет ценность, тогда поставьте встречный вопрос с вопросом: «Как вы можете провести рефакторинг этой части (у вас есть тесты на месте, верно?), Чтобы она была более читабельной?» Обязательно укажите, что сложнее сделать умный, читаемый код, чтобы сделать непроницаемые самородки.

Хавьер
источник
Почти -1, отладка не сложная, если ваш код не беспорядок и супер хрупкий. Единственная проблема с отладкой заключается в том, что многие разработчики понятия не имеют, как использовать инструменты отладки. Написание очень гибкого кода, учитывающего ошибки, НАМНОГО сложнее.
Кодер
Я думаю, что отладка, конечно, сложнее. Подумайте об этом таким образом. Если код изначально был написан правильно, отладка становится не проблема, так как тестирование его (модуль и интеграция) не обнаруживает дефектов.
Технит
10

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

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

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

gbjbaanb
источник
4
Мой тест «может ли дипломированный программист (может быть 1-2 года) поддерживать его?» .... Он может быть умным, но также должен быть четким и лаконичным.
Mattnz
1
@mattnz - Если бы я использовал этот тест, половина кода, который я написал за эти годы (или кто-либо еще в этом отношении), была бы признана плохой. Программисты для выпускников (1-2 года обучения) - это не все люди, которые их принимают. Не сказать, что мы должны писать плохой код; просто этот «тест» не имеет особого смысла.
Ладья
6

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

Это правило основано на личном опыте. Я начал (вероятно, как любой неофит) с фанатичного следования инструкциям и тщательно боролся со всеми отклонениями. Со временем я приобрел достаточно навыков и выучил достаточно трюков, чтобы сравнительно легко выигрывать такие бои, что, в свою очередь, позволило больше сосредоточиться на изучении общего воздействия моих «побед». И влияние, насколько я могу судить, было довольно негативным - парни, которые «проиграли бой», страдали и стали менее продуктивными - и, вы знаете, тот факт, что их код был на 200% совместим с рекомендациями по качеству, не компенсирует это.

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

  • Это как, вы знаете, как, скажем, я нахожу исходный файл 31K, превышающий рекомендуемый предел размера, скажем, 30K. Я могу либо потратить несколько минут / часов на борьбу, чтобы заставить владельца файла каким-то образом выжать этот лишний килобайт, либо потратить день или два на размышления и копания, чтобы выяснить, что, скажем, есть некоторый библиотечный API, который можно использовать вместо всех код в этом файле (чтобы его можно было просто удалить).

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

комар
источник
2

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

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

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

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

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

Калеб
источник
2

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

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

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

Почему это работает.

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

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

Zjr
источник
1

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

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

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

Также было бы полезно, если бы вы привели пример «умного» паттерна. Может быть, вы просто слишком остро реагируете ...

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

user606723
источник
0

Как и многие другие практики, я думаю, что ответ зависит от этого .

  • Если это дефект, то его обязательно нужно исправить.
  • Если код работает, вы должны сбалансировать значение настойчивости изменения кода с будущей стоимостью умного кода. Хотя существуют практические правила, касающиеся соотношения между разработкой и обслуживанием, они будут сильно различаться от проекта к проекту. Будь благоразумен.
  • Подумайте, почему вы не можете убедить своего партнера по команде, что код должен быть упрощен?
  • Вам не всегда нужно делать все идеально. Это означало бы проверку кода в бесконечном цикле и ничего не проверялось, потому что ничто (кроме моего кода, ха-ха) не является идеальным.
  • Мое личное предпочтение заключается в том, чтобы у автора кода было последнее слово. Очевидно, что если они постоянно выполняют очень плохую работу, то должны быть предприняты какие-то другие действия, но, как вы говорите, отрицательное значение принуждения разработчика к изменению кода может быть выше, чем выигрыш, полученный при его исправлении, если это очень редкая ситуация ,
Гай Сиртон
источник
0

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

Несколько замечаний, которые я могу предложить:

  1. Ваша команда нуждается в одном лидере, который примет окончательное решение, когда возникнут разногласия. В последнем выпуске я был в команде без руководства, и это было ужасно. Все стало аргументом, и если у вас мало людей с сильными личностями, ни один из них не сдвинется с места. Если у вас есть лидерство, независимо от того, какое решение выбрано, все в команде ДОЛЖНЫ понимать, что говорит лидерство. Вот почему руководство сделало его лидером.

  2. Держать людей счастливыми очень важно. Поэтому, вместо того, чтобы подталкивать всю команду к своей точке зрения, просто подталкивайте их туда. Объясните принципы SOLID, объясните важность небольших и взаимосвязанных классов / методов / интерфейсов и повторяйте эти вещи каждый раз, когда вы видите, что они нарушаются (например, в обзоре кода). В то же время не заставляйте их переписывать каждую вещь, которая вам не нравится. В конце концов, вам нужен баланс между личным самовыражением и соблюдением групповых стандартов. Надеемся, что они сойдутся, поскольку личные предпочтения сместятся в сторону того, как работает группа в целом.

  3. Я считаю, что гораздо важнее иметь чистый, понятный интерфейс классов, чем вообще не иметь «умного» кода. Например, у нас есть класс, который поддерживает список записей, которые ищутся тремя различными способами. В настоящее время он просто использует линейный поиск для всех поисков, который работает в небольшом масштабе, но поскольку этот класс находится на очень низком уровне, я вижу, что он не очень хорошо масштабируется. Я собираюсь заменить его другим классом, который использует контейнеры Boost Intrusive. Каждый элемент будет поддерживать одновременное размещение в каждом из индексов, и весь поиск будет выполнен в O (sqrt (N)). Да, это будет намного сложнее изнутри, и многим людям не понравится Boost, но снаружи останется 3 метода: Добавить, Удалить, Получить. Суть в том, что люди могут писать любой код, который они хотят (в пределах разумного),

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

DXM
источник
0

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

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

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

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

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

DVK
источник
0

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

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

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

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

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

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

rwong
источник