Доводилось ли тебе, дорогой читатель, когда-нибудь писать рассказы? Может быть это было сочинение в школе или эссе на тему «Как я провел Лето» «Смысл жизни» на факультете психологии в университете. Всегда от пишущего требовали одного, донести свои мысли четко и, по возможности, интересно. Мне хотелось бы поделиться с тобой историей о том, как я писал рассказ, в котором объяснял почему и почему . Статья несет в себе цель не сколько описать техническую сторону программирования, сколько ее эстетическую часть и, что главное, описать психологию программирования. Сопровождаться сия статья будет ссылками на коммиты в GitHub.
Немного о себе
К моменту начала истории с калькулятором я уже 2 месяца работал web-разработчиком в одном интернет-магазине (название пожалуй не буду упоминать) и проблем с работой не было, так как я обладал достаточными знаниями C# и сопутствующими технологиями для участия в полном цикле разработки и поддержки сайта. К тому же, так как проект уже был запущен к моменту моего прихода и функционировал более 4 лет, в мои задачи входило в основном расширение кода по "аналогии". Однако существовала проблема, внимания которой я не уделял в должной мере, и имя этой проблеме «Стиль кода».
Осознание проблемы
Одним прекрасным днем (по моему, это был вторник) я решил для общего развития заняться заданием, которое мне предложила выполнить знакомая, постоянно вращающаяся в кругах общения довольно опытных программистов. Задание было на первый взгляд очень простым — необходимо было написать парсер C-кода, определяющий потенциальную рекурсивность функций.
К заданию я подошел максимально несерьёзно и довольно быстро написал работающий парсер, так как на тот момент по тому же принципу писал весь код (работает и ладно). Но данный подход спортивного программирования резко не понравился человеку, который выложил это задание в виде гиста на GitHub и еще одному человеку, который и вбил в мою голову осознание того, насколько ужасно то, что я написал и почему нужно все исправить (далее будем называть его мастер Йода наставник).
Становление на путь исправления
Возврат в начало пути программиста и первый урок.
«Слушай дядю, дядя Senior, дядя плохого не скажет.»
До сих пор я не совсем понимаю, что в тот момент перемкнуло в голове моего будущего наставника и заставило его исправлять ситуацию с моим кодом, хотя у меня и есть теория. Вероятнее всего, мысль о том, что такой код может однажды по чистой случайности попасть в его проекты не давала ему спокойно жить. И вот, спустя несколько дней мы начали учиться так же, как дети учаться ходить, говорить а позже и писать.
Первым заданием, которое я получил, оказался типичный для любого начинающего программиста консольный калькулятор. «Что может быть проще» — подумал я, и, опять таки довольно быстро, написал сие творение. Это было несколько лучше парсера (за который мне, видимо, будет стыдно до конца времен), но все еще было очень далеко от того кода за который могло бы быть не стыдно. После первого же ревью на написанный мной код, я осознал с чем мне прийдется столкнуться. Ревью вроде даже был больше чем сам код (вместе с кодом стандартных библиотек .Net). Прочтя все замечания я внес изменения и попутно внес правки, которых, IMHO, не хватало данной великой программе. Я никогда так не лажал, друг мой. Код стал хуже, а я, впервые за сознательную жизнь программиста, столкнулся с яростью тим лида. Естественно я всячески оправдывал свои действия, но нет ничего более свирепого, чем ментор, чьи указы не выполняются или перекаверкиваются.
Первый урок, который я выделил для себя на пути выявления во мне сущности программиста можно сформулировать так — «Если ты не уверен что у тебя достаточно мозгов, лучше послушай более опытного программиста, если же ты уверен, что готов, перепроверь данные, кажется ты ошибся.»
Теория или практика? Вот в чем вопрос. Второй урок
Я хотел научится писать код по тому, что для меня программисты стоят на одном уровне с нейрохирургами и великими учеными, а приблизится к этому олимпу не хочет только глупец или web-дизайнер (они те еще странные хлопцы). Однако специальность в университете я выбрал не самую удачную для этого (Системный анализ и управление) и по стечению обстоятельств начал обучаться сам. Я начал читать книги, смотреть обучающие ролики на YouTube, но при этом умудрялся практически не решать казуальные задачки, так как считал,
что можно выехать только на теории а практические знания прийдут со временем.
И вот, спустя две недели занятий с ментором над простым калькулятором, я понял, что от моих теоретических знаний практически нет толку, так как куча статей и книг превратились в кашу, никак не подкрепленную механическим набиванием кода. Так вот, сейчас я могу смело заявить на весь мир и так очевидную вещь, которая для меня все же стала откровением
«Нельзя заниматься практикой программирования без должных познаний в теории и нельзя зубрить теорию в надежде на то, что после 18-ой книги то я точно смогу.»
И вот, на 14-й день кропотливого обучения создал он воду и морских животных
я постарался упорядочить все, что было замешано в моей голове с момента начала обучения,
но был повержен своим же мозгом, так как среди всего что я читал, я не помнил практически ничего из-за отсутствующего практического опыта. И все же, мой терпеливый учитель не бросил меня на съедение моей глупостью и сказал прочесть книгу, которая для многих была одной из первых, но была упущенна мной.
Код как искусство или последние уроки
Я думаю многие уже поняли о какой книге пойдет речь. «Чистый код» дядюшки Боба навел меня на мысль, которая, по моим ощущениям, засела глубоко и надолго в моем мозгу. Написать просто хороший алгоритм это 50% работы — написать же сложный алгоритм так, что бы человек, не особо разбирающийся в тонких материях, но хотя бы чуть-чуть знающий английский язык мог понять о чем ты написал — вот истинное искусство. И с этого момента обучение пошло легче, и конечно не без огрехов, не без огромных ревью и ударов по голове за глупейшие ошибки, но я таки привел код к тому виду, за который может быть не стыдно. Посмотреть его можно тут.
Какие же уроки я вынес к концу первого задания моего наставника?! Их не так много, но каждый из них стоит своего:
- Дисциплина и сосредоточенность во всем — от написания кода, до поиска информации.
- Умение балансировать. Равномерное наполение двух концов знаний — теории и практики.
- Умение задавать вопросы по существу и главное, не боятся их задавать.
- Думать. Постоянно думать и пытаться сделать лучше то, что казалось бы, уже сделано.
Вишенка на торте
Что же я получил в итоге. Как изменилось мое понимание программирования после месяца,
потраченного на калькулятор?! Все очень просто, изменилось моё отношение к коду. Буквально месяц назад тяжело было найти более несерьезного программиста, для которого любой код был лишь очередной шуткой, которую ты рассказал и забыл и неважно, понял ее кто-нибудь или нет. И вот я, стою перед исполинских размеров горой под названием «программирование», готовый карабкаться вверх и понимающий, что с каждым метром, с каждым шагом и с каждым вогнаным между камней скальным крюком будет все тяжелее и тяжелее. Но разве не за этим мы сюда пришли?! Разве не потому инженер-конструктор собирает новую модель свехбыстрого самолета или химик производит новые лекарства?! Ведь все это кому то нужно. И программирование, как явление, так же необходимо людям. И в такой ситуации относится к коду несерьезно было бы простым кощуством.
Закончить хотелось бы простым наставлением для начинающих программистов. Вы можете программировать все, что захотите: игры, вирусы, инженерные программы, фронт-энд анимации для сайтов — и все же, что бы вы не программировали, относитесь к коду так, как буд-то от его качества зависят жизни людей.
«Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.»
Oblomingo
Статья напомнила мне самого себя. В начале карьеры, тоже не было человека, который бы проверил и подсказал как надо писать. Потом попал в команду, где на каждый коммит был ревью и качество кода резко пошло вверх.
Главное не забывать, что пишем кода один раз, а читать его потом будут много раз.