Об авторе и сайте

Дмитрий ЕлисеевДобрый день, друзья!

Меня зовут Дмитрий Елисеев. Я заядлый web-программист и это мой персональный блог. В большей степени он посвящён повышению профессиональной культуры программистов на различных языках в общем и на PHP в частности. Об этом рассказано далее.

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

Как всё начиналось

Давным-давно, в последних классах средней школы один маленький очкарик играл в самоспрограммированный тетрис. На Бэйсике. Через пару месяцев уже играл на Microsoft Visual Basic и собирал странички на HTML. Потом школа закончилась. На втором курсе университета попалась ему на глаза в журнале необычная статья о «тяжкой» жизни фрилансеров, которые что-то там рисуют и программируют, получая за это деньги. Понравилось. То есть зацепило. Вот и пришла возможность направить свои компьютерные знания в правильное русло. Пришёл задор. Пошёл фриланс.

Задачи менялись, требования тоже. Тем, кому надо «просто сайт» – шли к мастерам «под ключ» и получали свой экземпляр на Joomla или WordPress. В специализации web-программистов было не так просто, так как к программистам шли целенаправленно и с длинным техзаданием, чтобы делать что-то нестандартное. В общем, большой простор для фантазии. Тут уже Джумлой не отделаешься.

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

Новые открытия

После небольшого знакомства с CodeIgniter в поле зрения попал Yii Framework. Прочёл руководство, пример создания блога и рецепты на официальном сайте, статьи в блогах некоторых программистов. Нашёл несколько Yii проектов на GitHub и поковырялся в их коде.

Изначально возникли небольшие затруднения с кучей новых вещей: маршрутизацией, ActiveRecord, виджетами Zii, фильтры... Про MVC имел некое представление по документации CodeIgniter. Начал переписывать свою вторую самописную систему на Yii. По привычке выводил разбивку на страницы и таблицы в админке вручную, без использования CListView и CGridView. Да и другие инструменты не поприменяешь порой по их незнанию.

Вначале просто делаешь всё по инструкции, и ко второму-третьему сайту уже волей-неволей начинаешь понимать как это работает. Ну и параллельно читаешь что-то ещё. И если вам не достаёт документации для понимания какого-либо фреймворка, то прочтите что-то ещё. А некоторые классические бестселлеры и подавно.

Первым делом, книга «PHP 5» Гутманса ознакомила не только с новым после PHP 4 синтаксисом, но и научила работать с сервисами, парсить XML, использовать PDO. В труде «Путь Rails» сразу обратило на себя внимание понятное описание системы маршрутизации. Большой талмуд «Философия Java» во всех подробностях раскрывает принципы ООП, а также много чего об общеязыковых сопутствующих вещах: замыканиях, итераторах, коллекциях... Также благодаря несомненному бестселлеру «ActionScript 3.0» Колина Мука произошло закрепление знаний из Java и пришло понимание принципов организации пакетов, областей видимости, удобства работы с событиями и важность обработки исключений.

Совместно с изучением общих принципов приятно было перенимать опыт разработки архитектуры. Книга «Паттерны проектирования» Фрименов буквально на пальцах показала, как всё можно привести в порядок и упростить, что дополнило и подробнее объяснило содержание книги «Паттерны ОО проектирования» банды четырёх, прочитанной до и после неё.

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

С Yii в жизни появилась ActiveRecord со связями и можно забыть о SQL-запросах? Ну уж нет. Без книг по MySQL и теории баз будет весьма сложно сразу понять, что в руководстве имеется в виду под разными терминами (нормализация, связи, ленивая и жадная загрузка) и осознать различие используемых инструментов с точки зрения производительности.

Было прочитано много. Все тут перечислить сложно. К чему это привело? Об этом написано в следующем пункте.

О чём этот блог

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

Но стоит разобраться с учётом приобретённой мудрости... и тут же происходит чудо. Объём кода начинает уменьшаться. Да-да! Кучи громоздких сложных конструкций выносятся в отдельные компоненты с простым банальным интерфейсом, пропадают ненужные зависимости Модели и контроллеры стремительно пустеют, когда из них выносится ненужный хлам, а опустевшие классы становятся похожими настолько, что уже легко наследуются друг от друга с добавлением или изменением всего пары строк...

В этом блоге приведён код нескольких расширений (порой достаточно больших), но ни разу ни от кого не поступало вопросов о серьёзных проблемах при подключении и какой-либо критики.

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

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

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

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

Примеры такого подхода и раскрываются в данном блоге.