Обзор книги Refactoring: Improving the Design of Existing Code

Refactoring: Improving the Design of Existing Code Книга была написана в 1999(!) году Мартином Фаулером(Martin Fowler), автором, имя которого любой программист должен был хотя бы слышать. Он написал просто массу материала(как книг, так и отдельных статей) посвящённого различным аспектам разработки; главным образом он пишет по архитектурной части приложений, конечно. Но другие труды нас сегодня не интересует, мы будем говорить про конкретную книгу — Refactoring.

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

По традиции, начну с языка книги: здесь всё в порядке,— обычный технический английский, без каких либо изысков. Читать книгу довольно легко. Достоинством книги также является её структура: начальная часть книги посвящена вопросу рефакторинга в широком смысле: что это? откуда взялось? зачем и кому это надо? Всё это занимает каких-то ~100 страниц, и является хорошим вступлением в довольно интересную тему. Вся остальная часть книги(почти вся) выполнена в виде рецептов: рассматривается проблема, предлагается её решение. Каждый рецепт является независимым, хотя пачки рецептов и объединены в группы, которые являются главами книги. Безусловно, главы в этой книги условны — просто в книге должны быть главы, и рецепты худо-бедно объединены по принципу схожести тематики. Даже в самой структуре книги уже видны зачатки архитектурного подхода — хорошо структурированный текст читать куда проще, чем просто список рецептов, пусть даже их группировка и является условной.

Итак, что же представляет собой типичный рецепт? Рецепт состоит из заголовка — ёмкий заголовок, чтобы легче было искать впоследствии,— краткого описания проблемы, исходного кода и результирующего кода. Затем приводится мотивация того, зачем вообще нужно делать именно этот тип рефакторинга, приводится детальный план его выполнения и, наконец, приводится пример. Сразу хочется сказать, что примеры в этой книге приводятся исключительно для иллюстрации выполнения того или иного типа рефакторинга, они не блещут ни изяществом, ни архитектурной глубиной — и слава Богу! Все примеры в книге просты и понятны, они не пытаются запутать, а, наоборот, иллюстрируют применение только что прочитанного материала в «боевых» условиях.

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

Большая часть книги посвящена «мелкому» рефакторингу, какой поддерживают современные утилиты типа ReSharper: т.е. такой рефакторинг, который оперирует переменными, функциями и классами. Правда, есть глава, которая посвящена «большому» рефакторингу, но она не может покрыть эту тему — слишком тема обширная. Вообще, «большой» рефакторинг это уже совершенно другой уровень, уровень смены архитектуры, а поэтому глупо было бы ожидать от этой книги полноценного раскрытия данной темы. Эта книга для повседневного написания кода, а не книга по архитектуре и проектированию систем.

Теперь, что касается уровня книги: я читал её не так давно и не открыл в ней для себя ничего нового, фактически я её просто пролистал — почти всё, что в ней написано я уже познал либо сам, либо через статьи. Поэтому, вероятно, что человек с опытом работы от 5-6 лет(только не все 5-6 лет написания спагетти из кода, а хотя бы половину этого срока написание нормального, структурированного кода)  не найдёт здесь ничего нового. А вот те, у кого опыт поменьше, скажем год-два, на мой взгляд, могут открыть в этой книге много всего интересного, не набив многих ошибок собственным горбом(хотя кого я обманываю?). Тем более, как мне кажется, сейчас всё-таки требования к начинающим программистам выросли и от них уже в начале пути требуются навыки организации кода(хотя бы базовые), а когда нет времени пробираться сквозь все тернии в одиночку, такие книги могут оказаться хорошим подспорьем. Тем более, с повсеместным(?) внедрением TDD, без рефакторинга вообще никак. И лучше уметь делать его хорошо, чем никак.

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

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