суббота, марта 18, 2006

Хакеры, программисты и путь к изящному коду

Когда говорят о "хакерах", подразумевают некого человека, который способен на что-то большее, чем простые пользователи компьютера. Он способен проникнуть в систему, посмотреть и разобораться как работает программа. Найти кусок кода, где нужно изменить "je" на "jmp near". Но со временем все это надоедает. Когда ты смотришь на программу, особенно на исходный код - это своего рода вызов. "Попробуй сделать как я" - говорят исходники какого-нибудь программиста с огромным стажем.

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

Когда программируешь достаточно долго, наступает такой момент, когда можешь сделать практически все. Дайте мне алгоритм, свою идею, описание системы. Через какое-то время вы получите то, что вы хотите. Рано или поздно это становится довольно скучно.

Мы имеем два этапа. Первый. Хакер - ты можешь что-то сделать, но твоя работа не достаточно креативна. Ты правишь байты, проникаешь в систему, ищешь какие-то баги. Все это недостаточно захватывает тебя с течением времени. По крайней мере так было для меня. Это интересно, но это не дает тебе возможности раскрыть полностью свой творческий потенциал. Попробуй-ка поломать что-нибудь в течение года, двух. Быстро надоедает. Может ты посвятишь себя секъюрити в широком смысле этого слова. Ты будешь много знать. И твои знания помогут тебе, когда ты что-то будешь делать. Но опыта создания чего-то, своего креатива, своего детища у тебя не будет. И это большой минус. Кстати, в программерской среде пометка "HACK" применяется в том месте программы, когда что-то не соответствует логике. И это считается дурным тоном и обязательным к исправлению.

Этап второй. Программист. Ты можешь создать все что угодно, затратив на это какое-то время. По началу это очень завораживает и это говорит о начальной стадии. Начальную стадию определить просто. Ты читаешь книги для начинающих и для среднего уровня. Ты покупаешь литературу по С++, ООП, толстые книги Страуструпа, в которых освещаются самым подробным образом все тонкости языка. Твоя любимая книга - "C++ в подлиннике" на 800 страниц. Но эта книга по сути не больше чем справочник. Посмотрел и отвалил. Когда программируешь в этой стадии и со временем тебе становится не интересно, знай - ты подошел к окончанию этой стадии. Стадии линейного программирования. Линейное программирование - когда ты пишешь код, не особо думая об архитектуре. Ты делаешь именно то, что должна делать программа. Можно написать большой проект, похвалиться перед друзьями. Но все это будет линейное программирование. Это тоже своего рода творчество. Точнее даже этап творчества.

Этап второй, часть вторая. Все начинается с того, что линейное программирование не доставляет особого удовольствия. Ты начинаешь просматривать чужие исходники, обычно каких-нибудь больших и серьезных проектов (только не думайте, что я фанат opensource - известно, что дерьма там хватает). Исходный код кажется интересным и ты понимаешь, что ты бы так не написал. Возможно в стадии линейного программирования тебя бы хватило на этот проект, но твой код был бы простым и линейным. Как раз в линейности кода и скрывается твой непрофессионализм. Мартин Фаулер называет такой код "с душком". Когда его становится слишком много, появляются две очень неприятные вещи:
  1. Другим людям становится сложно читать код. Кто-то из хороших людей говорил (кажется Кент Бек): "Писать программы, чтобы их понимал компьютер может каждый. Попробуй написать программу, чтобы она была понятна людям".
  2. Изменение таких программ становится все тяжелее.
Если ты это понимаешь, уже хорошо. Если нет, значит еще не пришло время. Или программирование для тебя всего лишь способ заработка. Понимание является толчком к действию.

Для меня этот толчок произошел не так давно, поэтому дать море советов я не могу. Пожалуй, только совет почитать хорошие книги, таких авторов как Мартин Фаулер, Кент Бек. Вы должны открыть для себя что значит рефакторинг, паттерны проектирования. Что такое архитектура программы. Это будет следующим достойным шагом в вашей карьере. Если вы это усвоите, это не останется безнаказанно ;) И рано или поздно вы поплатитесь за это уважением и признанием колег (а также продвижением по карьерной лестнице). Полезно будет создать что-нибудь для себя. Какую-нибудь программу или проект, который будет интересно поддерживать и который сможет приносить доход (если доход будет больше 100 долларов, это уже хорошо, не так ли?). Это даст хорошую пищу для размышления в тот момент, когда ваш мозг хотел бы отдохнуть. Архитектура программы - это то, над чем можно думать постоянно.

Все эти шаги ведут к качественному, изящному коду. Это именно то, что дает тебе пищу, стимул в этой жизни. Качество кода приносит очень много удовольствия. Одним из условий успешного проекта, говорит Стив Макконнелл, является самоуважение и самореализация разработчика. Это то, что позволит работать и творить более эффективно и с удовольствием.

Но в каждом деле не обходится без грустных ноток. Из моего опыта - стать хорошим программистом и архитектором дано не всем. Также как и не все студенты, обучающиеся на программистов понимают суть указателей в Си. Но не стоит отчаиваться. "Гений - это на 99% пот и 1% вдохновения. А 1% вдохновения есть у всех".

Комментарии: 1:

Anonymous Анонимный сказал(а)...

Интересный пост, переживаю нечто подобное. Но у меня все гораздо хуже -- я подвергаю критике почти всякий чужой код. И свой код тоже, причем написанный всего пару месяцев назад. Я постоянно ругаю себя за то, что я вовремя до чего-то не додумался в плане архитектуры или чего-то не учел, когда проектировал свои классы.

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

К чужим исходным кодам я стараюсь быть более снисходительным, и даже при этом чужой код мне нравится крайне редко. У меня слишком часто возникает желание переписать его, в корне изменив его архитектуру. По большому счету я не могу назвать ни одного проекта, архитектура и код которого меня бы полностью устраивал.

Я веду речь главным образом о PHP. Сам язык неплох, но на мой взгляд на нем написано очень много некачественного кода. Или это просто я такой эстет.

3:10 AM  

Отправить комментарий

Подпишитесь на каналы Комментарии к сообщению [Atom]

<< Главная страница