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