Название этой статьи — « Устранение дублирования» , и когда вы прочитаете это, я думаю, вы догадались, я буду говорить о коде. Конечно, я уделю немного места вопросам, связанным с кодом, но не только: дублирование — это чудовище со многими головами, которое можно найти вне кода.
Но начнем с этого.
Код, конечно
Самая простая форма дублирования кода — это группа строк кода, которые копируются и вставляются. Они быстро выйдут из синхронизации с их исходным источником, что приведет к повторному появлению ошибок и высокой стоимости рефакторинга (из-за всех мест, где вам придется рефакторинг в точности одного и того же кода).
Но есть также много неочевидного дублирования, на которое мы должны нацеливаться, например:
- вызовы объекта, которые всегда выполняются вместе , признак слишком тонкого интерфейса.
- Излишние параллельные иерархии, которые должны быть параллельными.
- Несколько реализаций интерфейса, который на самом деле должен быть Bridges.
Говоря не о самом коде, а о комментариях
Ваши docblocks (или Javadoc) не должны говорить мне ничего, что уже есть в коде .
Комментарии часто могут быть удалены путем переименования переменных и извлечения методов и классов. Для имени метода сложнее устареть по отношению к собственному коду, чем для комментария, который обычно отфильтровывается нашими умами (которые иногда действуют как компилятор, удаляя все).
Когда вы пишете чистый код, комментарии дублируются и
быть удалены.
могут
Говоря о не фактическом коде, а о том, как вы его пишете
Сколько раз я писал classdef для класса Matlab в этом месяце? Слишком много, и следующее, что мне нужно сделать, это настроить некоторые фрагменты кода для генерации классов или методов. То же самое можно сделать для каждого языка, я использую vim, но многие редакторы позволяют вам определять фрагменты.
Сколько раз я перемещал руки с клавиатуры на мышь ? Я учусь или настраиваю все новые и новые сочетания клавиш.
Сколько раз я смотрел на клавиатуру сегодня ? Сенсорная печать действительно помогает в скорости и точности, так как мне не нужно постоянно переключать взгляд между экраном и клавиатурой.
И если говорить о написании статей: я переключился на Dropbox вместо rsync, чтобы не выполнять эти команды постоянно. Ищите ваши повторные команды в оболочке с:
history |awk '{print $2}' | sort | uniq -c | sort -n | tail
и создайте для них псевдоним или найдите способ не вводить их постоянно.
Тем не менее, мы не ограничены кодом
Проблема дублирования всегда одна и та же: идеальных дубликатов не существует . То, что реплицируется несколько раз в пространстве или времени, не всегда будет дублироваться, но будет синхронизировано или будет дублироваться неправильно.
Дублировано неправильно? Мой компьютер испортил Рам? Нет, но когда мы дублируем вещи с течением времени, переделывая их, у нас возникает естественная человеческая тенденция не копировать идеально. Это привело нас к следующему пункту.
Автоматизация испытаний
Каждый раз, когда вы проводите тест вручную, этот тест может повторяться другим способом (если вы не очень и очень осторожны в описании процедуры, которой следует следовать.) Хуже того, этот тест можно забыть: если вы продолжите аналогию с наборами тестов , забытые тесты являются проявлением неспособности дублирования ручного набора тестов отлично .
Ручные тесты скучно выполнять, особенно в настройках регрессии, и это уже является причиной их автоматизации. Неспособность их точно воспроизвести — это другое.
Автоматизация в Continuos Интеграция следует той же логике : шаги сборки часто бывают настолько сложными, что забыл один из них или сделал ошибку, что было бы нормой. Таким образом, вы можете полностью автоматизировать цепочку от фиксации до релиза (или развертывания), избегая дублирования одних и тех же шагов вручную каждый раз.
Инструменты управления проектами вместо разных листов и документов
Why we use many online, or however computer-based, project management tool? Of course, for managing everything in one place, but you have to be careful not introducing duplication between the computer database and your paperwork; they will certainly get out of sync. One of the key practices of the Getting Things Done framework for time management is to manage everything in one place, so that you don’t have to search for post-it under three different desks, and you can maintain a focused mind when you’re working, because you know you don’t have to keep in your brain RAM unrelated things.
It’s not about having an electronic board with fancy features like easy editing: it’s about having a single board which can be accessed everywhere without duplicating via faxes and prints. For example, I use a paper notepad for my GTD process phase (collecting thoughts and possible TODOs) on paper and .txt files in Dropbox for the GTD plan phase: there is no overlap between them, thus I find myself comfortable even without a central electronic management system.
So if you work with Uml diagrams in your office, and you write them with pencil on paper, why use an online tool? If you have telecommuting colleagues, you are forced to do so, but for a colocated team just prescribe that all diagrams should be kept on paper (pencil is editable). No old files in an unreadable format on the server. Agile methodologies indeed are favorable towards paper.
Take-home points
So one of the programmer’s jobs is to eliminate duplication: from code, from actions, from managegement tools, from documentation. Avoiding boring and repetitive tasks often puts the fun back in programming.
Now think about one duplicated thing you did yesterday and today and figure out a way to avoid doing it tomorrow.