Есть ли способ избежать спагетти-кода на протяжении многих лет?[закрыто]

StackOverflow https://stackoverflow.com/questions/369683

  •  21-08-2019
  •  | 
  •  

Вопрос

У меня было несколько работ по программированию.В каждом по 20-50 разработчиков, проект длится 3-5 лет.

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

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

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

Это было полезно?

Решение

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

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

Позвоните им и попросите изменить это.

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

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

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

Другие советы

Я считаю, что ключ к предотвращению гниения кода лежит в разумных методологиях проектирования и реализации «снизу вверх» (я верю в это настолько сильно, что назвал свой бизнес — Think Bottom Up — в честь него!).Инструменты выбора здесь:

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

По мнению других респондентов, проблемы необходимо выявлять заранее.Для «зеленых» разработчиков это означает наставничество (здесь отлично подходит парное программирование) и обзоры (обзоры кода и дизайна).Для более старших разработчиков это означает бдительность.

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

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

Ваше здоровье,

Дэн

Вероятно, проблема состоит в том, что от 20 до 50 разработчиков.Это довольно высокая цифра, и для того, чтобы держать все под контролем, потребуется много управления и ресурсов.

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

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

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

Я думаю, самое главное, когда вы говорите

ты просто хочешь переписать все с нуля

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

Обзоры кода, стандарты кодирования и политика компании.

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

  • Рабочий процесс проверки кода — обеспечивает проверку кода как часть процесса.Содержит политику, которая предотвратит возвраты, если код не был проверен.
  • TeamReview — делает проверку кода менее болезненной, предоставляя полный опыт «внутри IDE».
  • Политики регистрации (в целом). Доступно множество интересных возможностей для управления потоком кода.Такие вещи, как проверка того, что общедоступные и защищенные методы задокументированы перед возвратом, чтобы гарантировать, что никакая работа не может быть проверена без соответствующего рабочего элемента.

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

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

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

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

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

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

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

Не позволяйте коду фиксироваться до тех пор, пока его не увидят хотя бы две пары глаз.

Рефакторинг

Стремитесь сохранить дизайн как можно более чистым.Это непросто, но оно того стоит.

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

Единственный способ избежать этого – изменить отношение:

«Отношение гибких разработчиков к дизайну программного обеспечения такое же, как отношение хирургов к стерильным процедурам.Стерильная процедура – ​​вот что делает операцию возможный.Без этого риск заражения был бы слишком высоким, чтобы его можно было терпеть.Agile-разработчики чувствуют то же самое в отношении своих проектов.Риск того, чтобы позволить даже самому крошечному роликости, слишком высок, чтобы терпеть ». Мартин С.Роберт «Адфейские принципы, закономерности и практики в C#»

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

Удачи!

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

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

Чтобы избежать этого, либо соберите всех программистов на одной «странице», сделайте нормализованный код частью вашего соглашения, либо гонитесь за работой, где команды разработчиков меньше (1-3 человека), а вы — большой кахуна.Когда-нибудь большие команды смогут найти способ создавать что-то получше, но до тех пор даже лучшим из них будет невероятно повезло, если они смогут приблизиться к 6 из 10.Мы создаем некачественное программное обеспечение, потому что именно для этого мы создали нашу отрасль...

Павел.

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

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

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

Нет

:)

Берег и Смотритель Искусство гибкой разработки — отличная книга с разделом «Применение XP к существующему проекту» (в главе 4).Проекты со временем становятся хуже, если вы не будете упорно бороться:Преодолеть такой технический долг сложно, и будет все труднее выпускать приемлемые релизы.Единственное решение — снизить скорость предоставления новых функций и потратить сэкономленное время на улучшение покрытия тестами и рефакторинг.

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

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

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

Больше проверок кода и, возможно, владения кодом.

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

А обзоры кода — это время, когда вы показываете свой код.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top