Послушайте: я не профессионал. Я студент информатики, сейчас учусь на первом курсе. В период с января прошлого года по настоящее время я предпринял то, что я бы назвал своим самым большим достижением: я самостоятельно разработал часть программного обеспечения от начала до конца. Я многому научился; Вероятно, я узнал о программировании и о себе больше, чем когда-либо. Именно поэтому я решил написать эту статью — чтобы поразмышлять, проанализировать и вдохновиться. (Хорошо, вдохновлять — это немного оптимистично. Скажем, мотивировать).

Давайте установим сцену. Я сразу поступил в университет в сентябре 2014 года с приличным набором A-levels в кармане и высоко поднятой головой. Изучив вычислительную технику на уровне A, я знал, что хочу стать программистом. Я не был уверен, чем точно хочу заниматься, но программирование определенно было моим призванием. Я начал учиться на степень в области компьютерных наук, что стало естественной отправной точкой. Это было, когда дела пошли под откос.

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

Я принял решение взять «незапланированный год перерыва», так как у меня не было другого выбора. Примерно через месяц безуспешных поисков работы я устроился на добровольную должность помощника по ИТ-поддержке в школе для детей с особыми потребностями. Мое время там было продуктивным, познавательным, и я полностью наслаждался собой. Я планировал остаться там с октября до рождественских каникул, но в итоге остался там до конца учебного года, до июля 2016 года. Именно здесь я получил свою первую «работу» по программированию в реальной жизни. Мне было поручено создать систему бронирования ресурсов в школе, таких как комнаты и ноутбуки. Я написал его, используя PHP и базу данных MySQL. У меня был лишь небольшой опыт работы с PHP и SQL с первого года обучения в университете, но это была настоящая проверка моих навыков, и в итоге я многому научился.

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

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

Планирование — это все

Не игнорируйте жизненный цикл разработки систем! Это не просто так!

Когда я начинал этот проект, мне дали распечатку документа формата А4, состоящую из двух разделов. В первом были изложены общие расчеты, используемые системой, а во втором был исходный код существующей системы, написанный на полностью устаревшем языке Visual FoxPro. Причина, по которой компании понадобилась новая система, заключалась в том, что исходная система была написана в конце девяностых, когда я был еще малышом. Первоначальная система работала медленно из-за большого количества записей в базе данных, и ее нельзя было запустить даже на 64-разрядных компьютерах (каждому сотруднику приходилось использовать два компьютера, один для запускать систему, а другой выполнять другие задачи).

Мне не терпелось приступить к работе, поэтому я нырнул прямо в Microsoft Access, чтобы попытаться перенести котировки из файлов старой базы данных в новую базу данных. Примерно через неделю безделья и ничего не добившись, я понял, что мне нужно использовать язык программирования, чтобы создать правильно функционирующую программу. В итоге я стал использовать C# .NET из-за его сходства с Java, с которой я был хорошо знаком.

Мое представление о «планировании» и «дизайне» заключалось в том, чтобы набрасывать схемы в блокноте и писать плохо оформленные функции. Это привело к тому, что я создал довольно дрянной первый прототип. Это было довольно уродливо, и функциональность была очень ограничена, но это работало как доказательство концепции. В конце концов я отказался от использования Windows Forms, потому что понял, что мой пользовательский интерфейс был довольно простым и уродливым и не очень поддающимся настройке. Я открыл для себя WPF, и мой дизайн значительно улучшился.

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

Программирование — это тяжелая работа

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

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

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

Но и это пройдет.

И оно того стоит.

Программирование вознаграждает

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

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

И когда вы, наконец, завершаете проект, над которым работали больше года.

Блаженство.

Лучший способ чему-то научиться — это на практике

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

Работая с C# и .NET framework больше года, могу сказать, что мне с ними очень комфортно. Я ни в коем случае не эксперт, но теперь у меня очень хорошее практическое знание обоих.

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

Вещи занимают намного больше времени, чем вы ожидаете

Закон Хофштадтера: это всегда занимает больше времени, чем вы ожидаете, даже если принять во внимание закон Хофштадтера.

— Дуглас Хофштадтер, Гёдель, Эшер, Бах: вечная золотая коса

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

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

Это только сделало чувство завершения его намного слаще.

Тестирование требует времени

Если отладка — это процесс устранения ошибок, то программирование должно быть процессом их добавления.

— Эдгар В. Дейкстра

Остерегайтесь ошибок в приведенном выше коде; Я только доказал, что это правильно, не пробовал.

— Дональд Кнут

Отладка в два раза сложнее, чем написание кода. Следовательно, если вы пишете код максимально умно, вы по определению недостаточно умны, чтобы его отлаживать.

— Брайан В. Керниган

Да, отладка. Проклятие каждого программиста с момента зарождения самого программирования. Есть бесчисленное множество цитат, которые можно использовать, чтобы обобщить это; Я определенно недооценил важность отладки и то, сколько времени я трачу на нее.

И какую адскую боль он причинит мне.

Представьте себе: восемь месяцев назад, в июне, я был в темном, мрачном месте. Расчеты материалов, на которых основаны все расчеты цен на трубы, выдавали неверные значения. Целый месяц пыток, пытаясь отлаживать относительно сложные расчеты. Это было ядром системы ценообразования, и оно терпело неудачу.

Решение, как всегда, оказалось простым. Это был единственный символ в одной из функций: я написал «‹» вместо «‹=». Отсутствовал один символ. Один символ. Любой, кто когда-либо пытался отлаживать относительно большой проект, понимает, к каким страданиям это приводит.

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

Цикл страданий выглядит так:

1. Пользователь сообщает об ошибке

2. Я исправляю ошибку

3. Загружаю исправленную версию

4. Перейти к шагу 1

Это повторяется до тех пор, пока не будет выполнено одно из двух условий: либо все, что может пойти не так, пошло не так, или «пока не умрет последний пользователь» (Сидни Марковиц, 1995).

Подводя итог, тестирование — это худшее, и оно занимает больше времени, чем вы ожидаете.

И это мягко сказано.

Будьте строги

Много боли и страданий, через которые я прошел при отладке, было нанесено мне самому; то есть 90% ошибок, с которыми я сталкивался, были вызваны небрежностью и небрежностью.

Хотя моя техника программирования значительно улучшилась, я по-прежнему упускаю из виду то, чего не должен делать, и это в конечном итоге приводит к тому, что я кусаю себя за задницу.

Будьте строги, будьте сознательны. Не ищите ярлыков.

Как правильно программировать

Оглядываясь назад на год назад и даже дальше, я вижу, насколько улучшилась моя техника программирования. То, на что у меня когда-то ушло несколько часов, я легко могу сделать за несколько минут. По общему признанию, я был довольно новичком в мире программирования, и я до сих пор новичок, но тот факт, что я знаю, «что я делаю» (вроде как), вызывает у меня гордость.

И, ну, если вы чего-то не знаете, просто погуглите.

StackOverflow — ваш друг

Шутки в сторону.

Это то, что я хочу сделать

Если бы мне пришлось описать этот опыт одним словом, я бы сказал «открытие глаз» во многих смыслах. Я чувствую, что только что нырнул с 5-метровой платформы для прыжков в воду, и теперь мне не терпится нырнуть с 10-метровой. Самое важное, что я вынес из этого проекта, это то, что теперь я уверен, что это то, чем я хочу заниматься до конца своей жизни. Это придало мне уверенности и мотивации идти по этому пути.

У меня есть вкус к этому, и я горю желанием продолжать.