Введение
Я точно не могу сказать, что заставило написать этот пост — может быть мой накопившийся опыт и принадлежность к php-программистам, которые, всемирно известны своим быдлокодом или недавний пост, в котором автор описывает проблему, появившуюся в его велосипеде и связанную с глобальными переменными в различных модулях.
Почитав комментарии к которому, мне стало уж совсем плохо… Я просто не понимал как люди не видят сути проблемы, а видят только лишь ее последствия — проблему в велосипеде. А суть то заключается в том, что у автора напрочь отсутствуют какие-либо познания в «велосипедостроении». И что самое страшное — эти знания отсутствуют не у одного него. А практически у всей массы изобретателей которые сами велосипеды видели только на картинках.
А если взять в расчет то, что они не хотят даже посмотреть на другие велосипеды…
Часть первая. История одного велосипедиста
Я думаю начать нужно с того, что следует мысленно вернутся к той планке опыта молодого велосипедостроителя, на которой я впервые столкнулся с трудностями. На полтора года назад — в снежную зимнюю ночь и мою комнату, освещенную 19-ти дюймовым элт-монитором, тихой депрессивной музыке, доносившейся из недр старого советского проигрывателя пластинок и собственно мне — сидящим на полу и высекающему медиатором на не подключенном семиструнном Ibanez'е.
В то время я был обычным студентом, учившимся на последнем курсе по специальности 230101, которому до преддипломной практики оставалось чуть больше одного месяца, а дальше… одна единственная черта — защита диплома, перешагнув которую я буду выкинут в совершенно иной мир, который по сложности, размерам, жестокости и количеству возможностей реализовать себя, едва ли сравнится с тем, в котором я пребывал. Со знаниями едва ли немногим превышающие те, что я получил еще в школе, да и с полным непониманием как их можно применять в реальной жизни.
А еще я был пыхарем и быдлокодером в своем самом ужасном проявлении — сорцы написанные мною в столбик представляли собой смесь из четырех языков(html, php, sql и javascript) с использованием функций и классов, разбросанный по различным файлам со всеми видами уязвимостей, которые только могут существовать. Но несмотря на это я чувствовал, что мне очень хочется развиваться дальше в этом направлении и совершенствовать свои навыки как программиста.
Поэтому я на отлично сдал диплом, тема которого звучала примерно так «CMS с использованием технологии AJAX», и так же как и многие пыхари, решил создавать свой велосипед. Я был полон энтузиазма, и мне не терпелось наконец-то собрать воедино все свои знания о современном велосипедостроении: парадигме объектно ориентированном программирования, технологии ajax, блочной верстки с использованием CSS и даже связку xml с xslt.
Это сейчас я понимаю, что тогда я ничего не знал о велосипедостроении. Все мои знания о двухколесных транспортных средствах ограничивались XIX-ым веком. Конечно они уже не были модификацией дрезины Макмилланом, который по сути и создал первый в мире велосипед в нашем понимании — с седлом и рулем, то они явно были не прогрессивнее детища Пьера Лалмана, который придумал оснастить велосипед педалями. На переднем колесе.
![]() |
![]() |
![]() |
Дрезина Макмиллана |
велосипед Пьера Лалмана |
Идеальный велосипед в понимании среднестатистического пыхаря |
Но тогда мне казалось, что я изобретаю, современный mtb-хардтейл на усиленной дёртовой раме, гидравлическими дисковыми тормозами, мультиспидом и достаточно легким весом. Что бы можно себя комфортно чувствовать как в кросс-кантри, не беспокоясь за то, что можно где-нибудь застрять посредине леса. Так и на улицах города, занимаясь стритом, даже не думая о том, что он может сложится под тобой при неудачном прыжке с лестницы.
![]() |
mtb-хардтейл |
Этому способствовало еще и мое окружение, состоящее из таких же пыхарей, разных возрастов. У некоторых из них был опыт гораздо больший нежели у меня. И все они твердили одно и тоже: «Надо писать свою cms», «Зачем мне пользоваться чужим фреймворком если я способен написать его сам» и «Веб — сомнительное место для объектно ориентированного подхода, где время жизни скрипта не больше чем одна пятая секунды».
Я был глуп, наивен и поэтому их слушал. И писал. Поэтому неудивительно что мой первый велосипед был похож на инвалидную коляску — некоторые детали в ней сначала прибивались друг к другу с помощью гвоздей, а уже после приваривались, образуя монолитную конструкцию, которой все ни по чем… но она все таки ездила. И было уже неважно, что для поворота налево, нам необходимо убрать ноги с педалей, приподнять руль и только потом поворачивать. Что передний амортизатор был заблокирован в одном положении и после езды по кочкам можно было ощущать себя как шахтером, отработавшим восемь часов с отбивным молотком. Что пробив камеру, если конечно такое вообще могло когда-нибудь случится с металлической камерой, — нам пришлось бы заменять пол велосипеда, орудуя молотком, ножовкой и газосварочным аппаратом.
Но я учился. И упорно следовал этим бездарным указаниями. Пиши свой велосипед крутилось в моей голове. ПИШИ! Я и писал. Опыта конечно у меня становилось все больше — картинки с различными велосипедами встречались все чаще и чаще, они становились больше, поэтому на них можно было разглядеть и некоторые детали. Да и узнал я о такой штуке как шаблоны проектирования.
На тот момент я считал их чем-то таким посланным свыше, давно решенными проблемами всего человечества, которыми не пользуется только последний дурак. А в тот момент я, глядя на себя со стороны, начинал считать себя именно дураком — я пишу, стараюсь, трачу свое время а у меня ничего не получается. Прогресса нет.
Сейчас то я понимаю, что трактовал эти шаблоны не совсем правильно — я воспринимал их как серебряную пулю, которая в идеале решает все проблемы, с которыми сталкивались люди до меня. И владея ей, я с легкостью мог создавать сложные приложения за очень короткий срок, даже не думая о том, что смогу наступить на неизвестные грабли- все уже решено до меня. Это до меня люди наступали на грабли. До меня они больно бились головой о стены, пока не нашли правильный путь. А мне стоит только лишь пройтись по нему — вот и все.
И я начал писать с использованием их. А знал я их порядка 15 штук. Вы знаете что такое эффект второй системы? Если нет, то представьте себе bmx с 20 дюймовыми шипованными колесами, рулем от шоссейного велосипеда, двумя амортизаторами, четырьмя гидравлическими тормозами по два на каждое колесо (дисковые и v-brake), поддерживающими боковыми колесами (для тех кто только учится ездить), тремя сиденьями, бардачком для инструментов, коляски сзади, планетарным механизмом переключения передач, контактными педалями, четырьмя фарами работающих от автомобильного аккумулятора, зеркалами заднего вида и ремнем безопасности.
![]() обыкновенный bmx |
А если это все заставить держатся на одном огромном объектно-ориентированном гвозде — Registry, благодаря которому мы точно не можем сказать сможет ли ездить этот велосипед, если мы захотим снять один из фонарей… то получим точную копию созданной мной системы…
Продолжение следует.
Часть вторая. Продолжение
Я не буду удивлен если многие программисты увидят в этой истории самих себя. Тем более я не удивлюсь, если они увидят себя в самом начале этого пути — в окружении пыхарей, которые советуют изобретать, изобретать и еще раз изобретать. Забывая о том, что для того, что бы создать что-то новое. Необходимо понимать как работает. Умные люди этот момент понимают.
Я даже приму как должное если вы дочитав до этой строчки ловите себя на мысли о том, что я вот с высоты своего опыта, который вы наверное уже поставили под сомнение, пытаюсь сказать «Изобретение велосипедов — зло». Пользуйтесь существующими. Нет. Тогда мы вернемся опять к уровню обезьян, а может быть даже и обратно в море.
Но давайте все разложим по полочкам.
Часть третья. Полочки
И так у нас существует небольшая проблема (мы положим ее на первую полочку), которая подогревается другими проблемами (их мы сложим на второй полочке), и которые в свою очередь порождают третий вид самых ужасных проблем, которые только могут существовать. Их мы положим на самую низкую полочку.
И так проблема лежащая на первой полочке предельно проста - низкий уровень вхождения. Научится изобретать все новые мутанты-велосипеды может любой человек за очень короткое время. К сожалению решить ее не просто. Просто так взять и поднять уровень вхождения в язык — практически невозможно. Причины вы и сами можете назвать.
Проблема лежащая на второй полочке видна невооруженным взглядом - слишком много свободы действий. Вначале это кажется очень привлекательным и не проблемой вовсе. Но только через некоторое время осознаешь всю опасность данной свободы. Когда сталкиваешься с чем-то выходящим за рамки общепринятой логики, или эффектом бабочки — комментировал строчку в одной части проекта, упала вся остальная. Такое видел сам, своими глазами. Не один раз.
А вот на последней полке у нас лежат самые интересные проблемы, о которых я здесь и распинаюсь. А именно о том, что люди, которые сами ничего не смыслят в велосипедостроении начинают поучать других, ведут их по самой неудачной тернистой тропе, по которой и шли когда-то сами, заставляя наступать на те же самые грабли на которые наступили они сами. Тропе изобретения велосипедов-мутантов.
И вот я только сейчас понял, что разложив все эти проблемы по полочкам, как-то легче и не становится. Скорее даже наоборот, еще больше понимаешь что механизм давно уже запущен и отлажено работает, порождая на свет все новых пыхарей, создающих тоннами быдлокод и считающих что лучше написать все самому, с нуля. Хотя вот интересно, что это они сами для себя домов не строят, одежду не шьют, деньги свои собственные не печают. Да почему они вообще пользуются программным обеспечением если в силах написать все сами и лучше!
Но мне все таки хочется надеется что выход из этой привычной всем системы существует. По крайней мере для себя я его нашел. И мне даже не пришлось изучать другой язык программирования велосипедов.
Часть четвертая. Начинаем с нуля.
И только после того, как я во второй раз осознал, что я делаю что-то не так. Я решил посмотреть на проблему с другой стороны. Просто сесть и подумать над тем что же именно я делаю не так. Через некоторое время я увидел ответ — я знал как можно решить проблему, но не знал почему её следует решать именно так. У меня банально была очень слаба теоретическая база.
И я начал учится. С нуля. По два-три часа в день, которые я нашел благодаря тому, что стал уделять меньше времени всему, что меня окружало — друзьям, любимым, музыке. И за это время я заново для себя открыл такие понятия как абстракция, полиморфизм. Я наконец-таки понял зачем нужно наследование, когда его следует применять, а когда вместо него необходимо использовать инкапсуляцию. Я заново открыл для себя объектно ориентированное программирование.
До меня дошло что то, что написано в учебниках годится только для написания глупых оторванных от реальности примеров с яблоками и геометрическими фигурами. Я понял что объект — это какая сущность, она не привязана к реальным объектам. У нее есть свое состояние, обязательства перед другими сущностями и потребности в других объектах. Это так просто. Это написано в каждом учебнике по программированию. Первыми строчками. Они дают нам понимание что такое объектно ориентированное программирование, а потом забирают его примерами с квадратом наследованным от прямоугольника. И человек привыкает считать что объект — это что-то из реального мира. А после вопит «наплодили тут объектов», когда встречает грамотный объектно ориентированный код. Ему приходится ломать свое понимание этого подхода. Так же как сломал его и я.
До меня наконец-то дошла суть шаблонов проектирования, которые действительно стали для меня шаблонами, а не серебряной пулей, решающей все возможные проблемы. Они нам не указывают как нужно писать. А всего лишь подсказывают. Теперь рефакторинг для меня не означал переписывание заново какого-либо куска кода не трогая все остальные.
Во многом благодаря различным книгам по проектированию (которые легко читаются во время поездки в метро) и копанию в чужих велосипедах (zend, ci, symfony), я понял, что не всегда использование планетарного механизма переключения передач, который идеально подходит для городских прогулок (который я могу собрать и разобрать с утра, с закрытыми глазами и жутким похмельем), гораздо лучше обычного механизма с кучей звезд. Я даже понял, что иногда он вообще не нужен. Зачем bmx'у с десяток скоростей. Чтоб банники дергать на скамейку было проще? Или занимала флетлендом (по сути танцы с велосипедом).
Нам не всегда требуется проектировать тяжелый двух подвес, который идеально подойдет для фрирайда, но так же ненадо и вдаватся в другую грань — создавая невероятно легкие шоссейники, на которых можно ездить с нереальной скоростью, но только по идеально гладкой поверхности.
Я каждый день пытался научится чему-то новому. Писал и по несколько раз переписывал код в песочнице, в которой происходило мое первое практическое знакомство с компонентами из которых должен состоять велосипед. Второго знакомства или не было, или оно уже происходило в реальных проектах. Где я видел, что эта штука работает. И именно так как я себе и представлял. Сейчас из них можно уже собрать неплохой велосипед*, который будет практически полностью копировать ZF. Но как раз поэтому я и не вижу в этом смысла. Он даже не появится тогда, когда я столкнусь с условиями в которых ZF станет камнем тянущем весь проект на дно (из за своей низкой производительности). Я понимаю, что там уже будут эффективно работать совершенно другие подходы к написанию кода.
Заключение
В заключение хотел бы извинится перед теми, кто считает, что я его задел, а среди таких я думаю наберется достаточное количество грамотных разработчиков со своими довольно грамотными велосипедами, на которых был поднят не один хороший проект. Речь шла все таки не о вас. Вас пыхарями назвать нельзя :)
*
Сейчас это уже не так. Сейчас он уже собран во один единственный «чертеж», в котором я оставил только лишь интерфейсы для каждого компонента вместе с эксепшнами. Безжалостно удалив все то, что когда-то было написано и лишив старого названия(brix framework), которое, думаю, только сейчас будет наиболее точно отражать его суть: brix от того, что briks (кирпичи), а не мера массового отношения растворённой сахарозы, как говорит нам википедия.