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





Я не на 100% понимаю ваш вопрос, но я думаю, что вы можете сослаться на Кодовый запах, который нужно реорганизовать. Он содержит много примеров, которые вы могли бы показать другим.
Вот список того, когда следует использовать рефакторинг (список запаха кода)
Это, безусловно, полезно, но я не уверен, что это лучший способ научить кого-то концепциям и навыкам, необходимым при рефакторинге.
В моем университете (Канада) это был способ показать нам, почему рефакторинг важен и как развить способности, сравнивая эти запахи.
да. Это важная часть обучения рефакторингу (отсюда и голосование "за").
Парное программирование кажется мне лучшим способом передать это. Таким образом, поскольку мы работаем над реальным производственным кодом, и мы оба сталкиваемся с каким-то кодом, который плохо пахнет, мы вместе занимаемся рефакторингом кода. Пара действует как совесть водителя, говорящая о правильных действиях, а не о быстром исправлении, и, в свою очередь, они оба узнают, как выглядит хороший код в процессе.
Рефакторинг может быть искусством и требует практики. Чем больше вы это делаете, тем лучше у вас получается. Продолжайте изучать методы, описанные в книге Мартина Фаулера Ractoring, и используйте свои инструменты (Resharper для людей с Visual Studio)
Этот подход, безусловно, помог прошлой ночью. Я не думаю, что руководитель проекта разрешит это как постоянный подход к нашей работе, но я склонен использовать его снова в аналогичных обстоятельствах.
Если вы еще не читали, у Мартина Фаулера есть отличная книга по этой теме под названием Рефакторинг: улучшение дизайна существующего кода. Он подробно описывает, как и почему нужно реорганизовать конкретный фрагмент кода.
Я не решился даже упомянуть об этом из опасения, что знание этой книги предполагается кем-то, кто спрашивает о рефакторинге, и что вы подумаете: «Ага, я имел в виду Помимо, книгу Фаулера». Но что за эй, вот и все. :-)
Спасибо, я знаю о книге. Как я уже сказал, я не хочу обсуждать, что нужно реорганизовать и почему, я хочу обсудить, как вы научите кого-то этому. Книга конечно помогает, но, думаю, есть и другие методы.
Вы не упоминаете тесты. Чтобы «доказать», что рефакторинг не нарушает существующую функциональность, вам необходимо либо иметь существующие тесты, либо написать тесты перед выполнением рефакторинга.
Да, я понимаю, что тестирование важно при рефакторинге, но я хочу научить кого-нибудь важности рефакторинга и тому, как это делать. Хотя тесты являются элементом рефакторинга, они не обязательно соответствуют тому, как вы его преподаете.
Как и в большинстве случаев программирования, навык рефакторинга требует практики и опыта. Было бы неплохо думать, что этому можно научить, но этому нужно научиться - и есть значительная разница в объеме обучения, которое можно выполнить в разных средах.
Чтобы ответить на ваш вопрос, вы можете научить методам рефакторинга и хорошему дизайну педагогическим способом, и это нормально. Но, в конце концов, мы с вами оба знаем, что достичь определенного уровня можно только благодаря долгому и тяжелому опыту.
Это точно. Опыт, безусловно, играет важную роль. Мой коллега также считает, что здесь присутствует элемент таланта, и что некоторые из них «рождены для рефакторинга».
Один простой способ представить себе рефакторинг прямо в названии - это как если бы вы вычленили общую переменную из уравнения:
xy + xz
становится
x(y + z)
X был исключен. Рефакторинг кода - это то же самое, потому что вы находите повторяющийся код или логику и вычленяете их из него.
Спасибо. Это отличный способ объяснить, что делает рефакторинг, но он не доходит до обучения действиям рефакторинга и его практическим приемам.
Я бы отредактировал этот ответ, чтобы он использовал •.
Похоже, ваш подход очень хорош. В конце процесса вы показали, как вы можете обнаружить и исправить множество проблем. В образовательных целях было бы интересно изобрести новое изменение / улучшение / исправление. Затем вы можете спросить своего наставника, как они будут вводить это изменение со старой и новой кодовой базой. Надеюсь, они увидят, что внести новое изменение с помощью отремонтированного кода намного проще (или как дополнительный рефакторинг будет самым простым способом подготовиться к гипотетическому изменению).
Я вижу несколько разных способов научить рефакторингу:
Приведены хрестоматийные примеры. Обратной стороной здесь является то, что у вас могут быть надуманные или упрощенные примеры, когда полезность рефакторинга не обязательно проявляется так же хорошо, как в других случаях.
Рефакторинг существующего кода. В этом случае вы можете взять существующий устаревший код, который вы хотите очистить, или свой собственный код в разработке и показать до и после выполнения различных битов, чтобы увидеть, насколько лучше будет последующее с точки зрения удобочитаемости и простоты обслуживания. Это может быть лучшим упражнением, поскольку этот живой код в некоторой степени улучшается и улучшается.
Это не то, что кто-то может уловить мгновенно, это требует времени, практики, усилий и терпения, поскольку некоторые рефакторинги могут быть выполнены для личных предпочтений, а не потому, что код работает оптимально тем или иным способом.
Научить кого-то рефакторингу, когда он не является естественным, - трудная работа. По моему опыту, лучше всего сесть с ними в офисе и провести рефакторинг кода. Пока вы это делаете, поддерживайте диалог «поток сознания». Обсудите, что вы видите, почему код не пахнет, варианты рефакторинга и т. д. Также вы должны убедиться, что они делают то же самое. Самое важное - объяснить, почему, а не как изменить код. Любой порядочный программист может внести изменения и заставить их работать, но требуются навыки и опыт, чтобы суметь заявить, почему новое решение лучше, чем предыдущее.
Этот вопрос кажется не по теме, потому что он выходит за рамки обсуждения, как описано в справочном центре.