Как мне убедить мою команду использовать меньшие классы / методы?


27

Отказ от ответственности: я новичок (это мой третий день работы), и большинство моих товарищей по команде более опытны, чем я.

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

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

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

Моя команда получила наставника из основной команды (мы сателлитная команда). Должен ли я пойти к нему первым?


ОБНОВЛЕНИЕ : Поскольку некоторые ответы на вопросы о проекте, пожалуйста, знайте, что это рабочий проект. И ИМХО, огромные классы / методы такого размера всегда плохи.

В любом случае, я никогда не хочу разозлить мою команду. Вот почему я спросил: «Должен ли я сделать это, и если да, то как мне сделать это мягко?

ОБНОВЛЕНИЕ : Я решил сделать что-то на основе принятого ответа: потому что я новичок, поэтому я вижу все "свежим взглядом", я приму к сведению все запахи кода, которые я нашел (позиция, почему это плохо, как мы можем это сделать лучше, ...), но в данный момент я просто стараюсь завоевать уважение у моей команды: написать "лучший код", узнать людей, знать, почему мы это сделали ... Когда придет время, я постараюсь спросить мою команду о некоторых новых политиках кода (правила именования, меньшие классы, меньшие методы, ...) и, если возможно, реорганизовать старый код. Должно работать, ИМХО.

Спасибо.


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

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

4
Добро пожаловать в реальный мир :)
fretje

С меньшими функциями JIT компилятор будет счастливее, а код будет быстрее. Эффективное C # Второе издание, пункт 11. my.safaribooksonline.com/book/programming/csharp/9780321659149/…
Работа

3
Я не мог удержаться от смеха, когда увидел, как ты ужаснулся, увидев служебный класс длиной 2500 строк. За свою карьеру я видел более 25 000 линейных классов. Не поймите меня неправильно, я думаю, что класс становится слишком длинным после 500 строк.
PeterAllenWebb

Ответы:


19

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


Действительно хорошая идея. Запишите вещи сейчас, предложите некоторые изменения позже.
Роман Граждан

3
Это работает в теории, но на практике они просто выбьют из него мешок.
Работа

15

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

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


1
+1 для завершения кода. Также исследуйте термин «Техническая задолженность». Я считаю очень полезным объяснять другим, почему иногда (но не всегда) стоит инвестировать в упрощение кода. Первое правило, однако, заключается в создании тестов. Модульные тесты, системные тесты, интеграционные тесты и т. Д. Перед проведением рефакторинга создайте тесты. Тест, тест, тест. Тесты.
Бен Хокинг

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

3
@Gratzy: я уверен, что это зависит от вашего личного опыта. Я не хочу вдаваться в подробности, но когда вы видите проекты в «техническом долге» по уши, выражение становится очень подходящим. Кодеры могут тратить 90% своего времени на «выплату процентов» по ​​долгу. В этих случаях неудивительно, что никто из команды не слышал об этом термине.
Бен Хокинг

Чистый код также имеет много информации об этом (хотя, не так много статистики).
Стивен Эверс

Если вы посмотрите на страницу 173, Макконнелл представит некоторые статистические доказательства в пользу рутинных размеров, которые, вероятно, заставят большинство проворных сторонников отказаться. Он довольно четко помещает 150 строк в колонку «ОК» (но не в идеале), но дает сильную личную рекомендацию не идти дальше 200.
Дэн Монего

13

Отказ от ответственности: я новичок (это мой третий день работы), и большая часть моей команды более опытна, чем я.

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

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

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

Как дела? «Измерить дважды, разрезать один раз».


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

12

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

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

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

Удачи.


++ для "смягчить свой энтузиазм". ИМХО, страсть, с которой эти принципы обнародованы, обратно пропорциональна их обоснованию. (Религии такие.)
Майк Данлавей,

11

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

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

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

И да, во что бы то ни стало показать материал из Code Complete для всех.


3
+1 за «Вместо этого, иди сам и пиши компактный и чистый код». Часто лучше всего подавать пример. И очистка установленной базы кода больше похожа на марафон, чем на спринт; это требует терпения и настойчивости.
JeremyDWill

8

Вот пара трюков:

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

  • Одно за один раз - не бросайте бомбу на все свои мысли на встрече команды. Начните с некоторых предварительных вопросов, которые приходят с вашей конкретной точки зрения. Например: «Эй, как новый парень, я заметил, что некоторые из служебных классов действительно большие, есть ли причина для этого?»

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

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

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

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

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


6

Как мне убедить мою команду использовать меньшие классы / методы?

Не.

Купите себе лицензию Resharper и приведите пример. [Сильно опираться на рефакторинг « Метод извлечения ».]

Со временем другие должны оценить ваш более читабельный код и убедить себя сделать то же самое. *


  • Да - есть шанс, что их не убедят; но это все равно ваш лучший выбор.

IMO - не стоит пытаться убедить своих товарищей по команде стать лучшими программистами, прочитайте « Code Complete » и следуйте @Uncle Bob. Твердые принципы, и стать лучшими программистами, если они еще не убеждены.

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


4
+1 и согласие. Ваш второй момент - это то, что я считаю наиболее верным; хорошие программисты либо уже знают это, либо готовы немедленно начать изучать и применять их, плохие программисты либо делают вид, что им не все равно, или просто не понимают, почему эти вещи хороши (если бы они поняли, они бы уже это сделали). Скорее всего, вы ведете проигранную битву. Печально, что многие «программисты» не понимают, что такое правильная разработка программного обеспечения.
Уэйн Молина

4

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

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


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

4

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

Visual Studio имеет «Анализ кода», который может помочь с соглашениями об именах.

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

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

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


3

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

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

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

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

Теперь новый код, это другое. Это должен быть хороший код.


2

Методы, которые 150 строк ... Я видел методы с 10.000 строк кода.

Две ваши проблемы могут быть решены с помощью внешних инструментов :

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

В C # Resharper можно проверить обе проблемы. Имена, которые не соответствуют вашим правилам, помечаются как ошибки. Свойства, не помеченные как доступные только для чтения, также отображаются как ошибки. FxCop также может помочь.

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


2

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


1

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


1

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

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


1

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


как это отвечает на заданный вопрос?
комнат
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.