2008-09-28 3 views
15

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

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

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

ответ

10

Сложный вопрос:

  • Некоторые части кода могут быть обобщены в виде библиотек или API. У нас есть общая библиотека, которая постоянно обновляется с решениями общих проблем. Обычно: валидация, кеширование, классы доступа к данным, ведение журнала и т. Д.

  • Некоторые детали специфичны для конкретного приложения. Они не могут быть легко обобщены. Мы конвертируем их в HowTos и даем внутренние презентации. Код также перерабатывается с использованием легко просматриваемого SCM (в нашем случае SVN).

  • У нас также есть инструменты, которые генерируют код, который одна рука не может быть переработана, а с другой - всегда похожа (подумайте, чтобы вызвать хранимую процедуру).

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

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

4

Рефтор безжалостно и надеемся на лучшее.

Update (спустя 4 года и, надеюсь, мудрее)

  • Как комментарий С. Лотт говорит: Обратите внимание на Нейминг. Распространите слово всем «коммиттерам» в команде. Хорошие имена делают вещи доступными для поиска и тем самым уменьшают дублирование.
  • Иметь ОДИН способ сделать что-то и сохранить его ДОСТУПНЫМИ И ПОИСКАМИ.
  • Напишите код для среднего программиста (L.C.D.). Не будьте умны там, где просто было бы достаточно. (Это включает в себя укупоривание обуви и связанных с ним расстройств)
  • Принять общий набор условностей, стилей, руководств, стандартов, et.all early. Обеспечьте бай-ин и тем самым соблюдение в команде. (Это означает, что каждый использует вкладки (или пробелы)!). Неважно, что вы выберете - цель состоит в том, чтобы код выглядел последовательным.
  • Имейте привратника (уважаемого командой), который бросает в глаза все проверки для красных флагов.
  • Напишите код test-first/outside-in. Обычно это гарантирует, что ваш код можно использовать несколькими клиентами.(См. Пулю GOOS о независимости контекста)
+0

Хорошие имена для рефакторинга. Не там, откуда оно взялось, или что оно делало, или где оно используется в настоящее время, но что это ДЕЙСТВИТЕЛЬНО. – 2008-09-28 13:26:09

1

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

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

Еще одно преимущество: TDD имеет шаг для удаления дублирования (рефакторинга) в качестве части цикла.

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

2
  • Имейте каркас, который активно поддерживается.

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

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

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

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

1

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

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

1

Профиль всего приложения и начните рефакторинг с более тяжелой части кода. (80% времени, затрачиваемого на 20% наиболее используемого кода)

Используйте инструмент профилирования, который имеет возможность выявлять утечки памяти, повторные вызовы, длительные звонки, unfreed память, неотчужденный ресурсы и т.д. ,.

По правилу Новый код всегда использует наилучшую практику.

0

Как вы (физические и юридические лица) управляете своим источником, чтобы сделать его проще для повторного использования? Вы специально поддерживаете библиотеку повторного использования? И если да, то как вы индексируете его, чтобы максимизировать коэффициент попадания?

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

  1. Повторное использование глючный код, который будет у вас тратить часы отладки кода других людей не желательно.
  2. Повторное использование кода, который уравновешивает такой широкий спектр разрозненных потребностей, что он едва удовлетворяет ваши собственные потребности и требует от вас перепрыгнуть через множество обручей, чтобы в конечном итоге получить неудобное и неэффективное решение нежелательно.
  3. Повторное использование кода, которое постоянно требует изменений в дизайне и проходит через изъятия, которые потребуют от вас переписать код, используя его каждые 6 месяцев, является нежелательным, если вы могли бы просто реализовать решение самостоятельно через полчаса таким образом, t нуждается в изменениях в дизайне в будущем, поскольку он служит только вашим конкретным потребностям.
  4. Кодовая база, заполненная чужим кодом, нежелательна по сравнению с тем, который использует больше языка и стандартной библиотеки по идиоматическим и знакомым способам, даже если для этого требуется немного больше кода.
  5. Разработчики наступают друг на друга, потому что они хотят сделать несовместимые изменения одного и того же дизайна во время борьбы и споров и внесения изменений, которые вызывают ошибки в реализации друг друга, нежелательны.
  6. Бросание лодок зависимостей от незрелых конструкций, которые еще не доказали себя (не было тщательного тестирования, не было времени, чтобы действительно звукоизолировать дизайн и убедиться, что он эффективно удовлетворяет потребностям пользователя без каких-либо дополнительных изменений конструкции) нежелательно ,
  7. Необходимо включить/импортировать/связать лодку с библиотеками и классами/функциями с самым сложным сценарием сборки, чтобы написать что-то простое нежелательно.
  8. Прежде всего, повторное использование кода таким образом, который требует гораздо больше времени как в краткосрочном, так и в долгосрочном плане, чем повторное использование, нежелательно.

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

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

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

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

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

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