2014-03-04
Я посредственный программист.
Я хорошо знаю основные принципы. В своей практике я совершил достаточно ошибок, чтобы иметь представление об их причинах. Я знаю, что мне ещё многое предстоит узнать.
Понадобилось много времени, чтобы я наконец признался себе, что я — посредственность. Мне больше не надо доказывать свою правоту там, где я не совсем всё понимаю. Я больше не боюсь сказать, что я чего-то не знаю.
Так было не всегда. Можете мне не верить, но когда-то я считал себя гуру-программистом.
Хотя бы просто потому, что в то время даже простое наличие домашнего компьютера считалось чем-то особенным; а уж если ты умел им пользоваться…
Вот тогда я и был очень опытным программистом. В подростничестве писал программы на С++, С#, Pascal, JavaScript, а моей главной гордостью была платформа для е-коммерции, написанная на PHP с нуля.
А на самом деле я был всего лишь на ступеньку выше, чем «да он что-то сечёт в вебсайтах!». Ведь я тогда совершенно не общался с другими программистами, и мог сравнивать себя только с теми, кто меня окружал – с людьми, которые совершенно ничего не понимали в компьютерах, говорили «Кажется, у меня сломался интернет» и разрешали диалоговым окнам устанавливать очередной плагин в IE.
Вот теперь я и расскажу вам историю моей жизни.
Юный техник
Когда мне было 9 лет, в гостях у своего друга я впервые увидел спутниковое телевидение. Поскольку я уже тогда устал от четырёх государственных каналов Великобритании, я решил сделать собственную спутниковую тарелку и смотреть Евроспорт. Соединил с помощью медного аудиокабеля металлическую спицу открытого зонта с антенным разъёмом телевизора, и думал, что это сработает. Вы первые, кто читает о том моём опыте.
Несколько лет спустя я впервые увидел Интернет. Тогда у моего отца в офисе появился 14,4к-модем. В то время, чтобы посмотреть анимированный gif-файл, загрузку каждого фрейма приходилось ждать по минуте. Тогда же с помощью Netscape Composer я создал собственный сайт. О котором тоже никто не знал.
В подростничестве мы с друзьями увлеклись фрикингом (да-да, тем самым взломом телефонных систем и городских телефонных автоматов). Мы не зашли дальше совершения бесплатных международных звонков (звонили девчонкам, с которыми знакомились по аське) и взлома голосовых ящиков. Возможно, если бы нас не отвлекало увлечение скейтбордингом и домашние задания, сейчас мы бы уже сидели за взлом государственных сетей – до того это было интересно.
Об этих эпизодах я рассказал для того, чтобы сказать одну вещь: всё моё детство я пытался найти что-то, что станет интерфейсом, напрямую связывающим моё воображение с реальностью.
Генератор факов
Поворотным моментом стало моё четырнадцатилетие. Я приобрёл журнал PC Plus, к которому был приложен CD с полной версией Borland C++ Builder.
Тогда передо мной открылся новый мир. Были разрушены все преграды между моей мыслью и материальным миром. Передо мной лежала захватывающая плоскость бесконечной свободы творчества. Как же я мог применить новый мощный инструмент, попавший ко мне в руки?
Ну, это было очевидно. Fuck Generator. Простая и элегантная программа (fgen.exe), которая запрашивала у пользователя любое число, а в ответ выводила ровно столько fuck-ов, сколько он попросил. Собственно, это всё, что умела моя первая программа. Но то ощущение, которое дарит программисту даже самое примитивное его детище — незабываемо. Ты создал нечто, что работает, и ты понимаешь, как именно оно работает. Оно и создано, чтобы работать так, как ты ему сказал. Власть!
Немного позже вышел новый номер PC Plus, на этот раз с полной версией Borland Delphi. Этот диск помог мне усовершенствовать программу, добавив Windows GUI и возможность генерировать ругательства, состоящие из четырёх слов. Да, пока мои одноклассники уныло развлекались с PlayStation, я занимался настоящей творческой деятельностью. Я генерировал факи. И мир ещё не знал, на что я способен.
Мой шедевр
В конце 90-х я сделал вебсайт для маленькой, но гордой почтовой компании. Поначалу это был типичный статичный веб-сайт с бесконечными рамочками и счётчиком посещений на главной странице. Потом, когда к сайту стало обращаться всё больше посетителей, мы решили добавить элементы интернет-магазина: тогда и началось блуждание между cgi-скриптами и использованием <select> почти для всех действий пользователя. В общем, это было чудовищное создание из фреймсетов и JavaScript. В конце концов мы поняли, что для более-менее приличного онлайн-магазина нам нужно собственное решение. Я вспомнил свой успешный опыт с fuck-генератором, и понял, что моё время пришло. Я решил всё сделать сам. С нуля.
Корнечно, тогда я и слыхом не слыхивал о фреймворках с открытым исходным кодом. Но ведь у меня был свой план. Я накупил литературы по PHP и MySQL, и начал изучать их в процессе создания нового сайта. К тому же – какая удача! — одним из основных примеров, рассматриваемых в одной из книг, была как раз корзина покупок. Всё было логично: category.php, product.php, cart.php… Я добросовестно следовал всем советам, использовал все новейшие в то время техники, удобные mysql_ функции для доступа к данным, разделил функции в файле functions.php, и вообще загорелся идеей построить молниеносный процедурный код.
Я строил башни и лабиринты из кода. Его структура росла ввысь и вширь с каждой новой фичей, которую я добавлял. А их было много: профили покупателей, рейтинги продуктов, истории заказов, бонусные баллы, ваучеры, спец.предложения, логи, шифрование платёжных данных… Целая галактика функций всех форм и размеров, возникшая из одной неподвижной центральной точки: cart.php.
Восемь месяцев я убил на это. Самый ожидаемый исход этого крестового похода на несчастный вебсайт – это рассказ о том, как всё пошло не так, и как мы не смогли его запустить.
Увы. Он заработал.
Худший подход
Да, несмотря на то, что я тогда использовал самые плохие решения из тех, что можно было придумать, оно работало. Я впихнул туда всё зло, которое только можно было придумать. Спагетти-код? Да. Мутные наименования данных? Да. Неизвестно откуда взявшиеся цифры и перетасовка данных? Да.
Тогда ООП мне казалось какой-то надуманной головной болью. Тестирование? Ну да, я знал, что такое тестирование: кликни несколько раз, если всё нормально, запускай в продакшн. Архитектура? Что мне нужно было о ней знать, если то, что создал я, прекрасно работает?
Я был просто ослеплён тем фактом, что голыми руками и собственной головой мне удалось построить функциональный работающий интернет-магазин. Я не видел никакой разницы между моим творением и, скажем, amazon.com. Amazon разве что был чуть больше.
Тогда меня и настиг эффект плато (в спорте так называют период застоя и отсутствие видимых результатов). Я не то чтобы не хотел учиться дальше — я просто не видел в этом необходимости. Зачем, если у меня и так всё получается?
Назад к земле
С таким уровнем самосознания я прожил несколько лет. Эти годы я продолжал работать над сайтом, а основное время посвящал совершенно другой области деятельности. И постепенно я начал понимать, что поддержка сайта становится всё труднее. Всё труднее было находить что-то конкретное в исходниках. Всё труднее было фиксить баги, которые появлялись в самых неожиданных местах.
Что-то новое я изучал с черепашьей скоростью. Например, как-то я выяснил, что функции mysql_, которые я использовал тогда, скорее всего, не будут поддерживаться будущими версиями PHP. В итоге я просто решил вручную использовать SQL-инъекции во всех формах на сайте, которые только мог найти, и забыл об этом.
А в прошлом году сайт лёг (ошибка 500). Как оказалось, сайт подвергся редкой атаке SQL-инъекций (редкой для меня, ведь я мало читал).
«Наверное, настало время перейти на PHP Data Objects», — подумал я.
Прозрение
Когда я сел за переписывание функций доступа к данным, меня озарило. Я понял, что это будет тяжкий труд. Самое главное — я понял, почему это будет тяжкий труд.
Функции были раскиданы по всему коду; код был нестабилен, крив и кос; я не знал, как повлияет на него то или иное изменение; всё могло сломаться от моего малейшего движения.
Тогда я и понял, как я ошибался. Никакой я не талантливый самоучка. Я – карета из сказки про Золушку, и вот наступила полночь.
Я понял, что понятия «правильно» и «неправильно» — это не пустые слова, которые нам говорят в детском саду. Что действительно можно что-то сделать хорошо, а что-то плохо, и это не вопрос вкуса и воспитания. И уж тем более это не зависит от того, у кого круче аргументация. «Правильно» — это то, что делает вашу жизнь и жизнь окружающих лучше и проще. «Неправильно» — это то, что тратит время и усложняет процесс. Я не буду сейчас говорить о том, как же «правильно». Факт в том, что я понял: то, чем я занимался, не было правильным.
Признание вины
С внедрением PDO в том сайте я справился. И больше я этот эксперимент повторять не хочу.
Сейчас я на подъёме и стараюсь изучать всё, что можно. Читаю книги из списка «То, что должен прочесть каждый программист» (у каждого есть такой список). Читаю блоги. Слушаю подкасты. Смотрю видеозаписи с конференций. Посещаю местные встречи и даже кое-где выступаю. Работаю над сторонними проектами. Делаю всё, чтобы построить свой собственный правильный путь.
Программирование — это крайне абстрактная деятельность, которую невозможно ограничить простыми материальными барьерами. В программировании единственным ограничителем является только голова программиста.
Под конец своей исповеди хочу привести слова Стива МакКоннелла (автора легендарной книги «Code Complete»):
«Не зазорно быть новичком или середнячком. Не зазорно быть хорошим программистом, а не лидером. Зазорно оставаться новичком или посредственностью, если вы знаете о своих слабых сторонах».
Перевод: Люся Ширшова. По материалам блога Michael Bromley.