Год изучения бэкенда: от растерянности к осознанному подходу
Я — начинающий C#.NET разработчик, и я здесь для того чтобы поделиться своими успехами за год на пути становления backend‑разработчиком. Если вы чувствуете, что путь программирования очень тяжел и подумываете о том, чтобы сдаться — надеюсь, моя история станет для вас мотивацией продолжать.
Первые шаги
Мой путь в программировании начался с поступления в колледж на специальность «Инженер программного обеспечения». Когда я поступил в колледж, я и понятия не имел насколько программирование способно изменить мою жизнь. В колледже я познакомился со своим первым языком программирования — всеми известным C. До сих пор помню свое удивление от того, насколько «чистым» мне казался синтаксис у этого языка, так как до этого я писал только примитивный код на языке Pascal, и код на этом языке ужасно воспринимался из‑за «шумного» синтаксиса. И вот, при изучении своего первого языка я столкнулся со своей первой преградой, из‑за которой я чуть было не сдался.
Первая преграда
Первая преграда на моем пути была психологической: мне очень тяжело давалось решение даже самых простых задач. Помню какие я прикладывал усилия чтобы решить банальные задачи вроде «убрать из массива парные числа», или «оставить в массиве числа кратные 0». Каждая новая тема, и каждая новая задача казалась мне непреодолимой. Каждый видеоролик в котором утверждалось что «хорошим программистом может стать далеко не каждый, и далеко не каждый программист сможет попасть на свою первую работу» только навивал сомнений. Я начал сильно загоняться из‑за этого, начал думать что программирование это не мое, однако я все же находил в себе силы пробовать вновь, и вновь, пока не наступил день, который, возможно, перевернул мою судьбу с ног на голову.
В этот день я задал себе вопрос: «Если не программист, то кто?», и в этот момент я понял, что другого пути у меня просто‑напросто нет. В этот день я твердо решил, что мне пора самостоятельно браться за обучение, и делать это с максимальным упорством. В этот день я составил свою «дорожную карту», первым испытанием которой стало изучение ООП, и языка программирования C#.
Начало изучения ООП и языка программирования C#
Свои первые шаги в изучении C# я начал с прохождения бесплатных курсов на ютубе. Помню, что эти курсы были далеко не самого лучшего качества, в некоторых даже вредные советы преподносились как «очень полезные», однако эти курсы дали мне базовое понимание принципов ООП, и синтаксиса языка C#.
Сначала мне было очень тяжело — меня засыпали множеством непонятных терминов, и как вишенка на торте — объясняли это все на плохих примерах кода, в которых часто были противоречия. Например: автор рассказывает о принципах инкапсуляции, и при этом оставляет коллекцию в классе публичной, то‑есть открытой к изменениям извне. С тех пор я начал более осторожно относиться к обучающим материалам в интернете, и при возможности все перепроверять, так что на самом деле таким «курсам» я отчасти благодарен.
Шло время, я постепенно осваивал на практике принципы ООП, синтаксис языка C#, и закрывал пробелы в полученных знаниях. И в этот момент я понял, что курсы — не вариант, и начал искать другие источники для получения знаний. Первым таким источником стала книга «Язык программирования C# 7 и платформы.NET и.NET Core» авторов Эндрю Троелсен и Филипп Джепикс. На данный момент эта книга очень устарела и я не рекомендую ее к прочтению, однако эта книга стала моим первым толчком к более углубленному пониманию языка C# и.NET в целом.
Первая прочитанная мною книга
Интересный факт: эта книга стала не просто моей первой книгой по программированию, но и первой книгой которую я прочитал от начала и до конца. Эта книга значительно расширила мой взгляд на разработку ПО, я впервые увидел какое большое количество технологий может стоять за обычным приложением.
Первая половина книги была посвящена самому языку C# и встроенным в него библиотекам. В остальной части поверхностно рассказывалось про основные технологии которые используются при разработке, такие как: LINQ, Entity Framework, ASP.NET Core, WPF, WCF и т. д. В этой книге я впервые познакомился с многопоточностью, асинхронностью, рефлексией, поздним связыванием, и множеством других возможностей. Я впервые узнал про особенность платформы.NET — совместимость с другими языками этой платформы. Я узнал про этапы компиляции программы, о низкоуровневом языке CIL, и множеству других мелких деталей.
Как итог: эта книга дала начало моему пути разработчика. В ней я узнал огромное количество новых для себя концепций, и стал чувствовать себя намного уверенней. Мне очень понравился опыт получения совершенно новых для себя знаний, поэтому я сразу принялся к более углубленному изучению C# и платформы.NET.
Погружение в детали
Я принял для себя решение что буду изучать в первую очередь то, что мне самому интересно. Поэтому я начал изучать управление памятью.NET, и в целом устройство этой платформы. Изучение я начал с чтения книги «Управление памятью в.NET для профессионалов» автора Конрад Кокоса. Скажу честно: я не осилил прочитать эту книгу до конца, оказалось что я не был готов к такому большому количеству деталей. Но даже то что я успел освоить дало мне очень ценные базовые знания, которые реально пригодились на практике.
Эта книга дала мне базовое понимание работы механизма автоматического управления памятью. Здесь я впервые услышал новые для себя термины, например: Stack, Stack Pointer, Program Pointer, Heap, CLR, CTS, CLS. Я впервые узнал про инструмент автоматического управления памятью.NET — о сборщике мусора. Впервые узнал про существование среды выполнения CLR, CTS и CLS.
Поначалу такое большое количество терминов и деталей страшили меня, однако со временем я стал понимать связь между ними, и воспринимать все эти «страшные» термины стало намного проще. По итогу эти знания мне реально понадобились на практике. Например, в одном проекте нужно было взаимодействовать со сборщиком мусора чтобы очистить ссылку на.dll сборку, а для этого нужно было понимать, в какой момент ссылка может быть занята, а в какой нет. Для этого нужно было понимать как заполняется стэк.
Первое прозрение (SOLID)
В один прекрасный вечер листая ленту новостей в браузере, мне попалось объяснение некого принципа под названием SOLID. Я кликнул на эту ссылку, и сказать что этот клик полностью изменил мой взгляд на ООП — это ничего не сказать.
Этот клик стал моим самым настоящим прозрением. Чтобы вы понимали: до этого я не особо ценил наличие интерфейсов, не понимал зачем они нужны, однако SOLID все изменил. Я до сих пор помню то чувство — как все знания в моей голове стали будто‑бы обрушаться и перестраиваться, и в тот момент я понял — мои старые проекты очень далеки от хорошей архитектуры, и я удалил их почти все:)
Я невероятно благодарен тому вечеру, поскольку благодаря нему я именно тот разработчик, которым сейчас являюсь. И в этот же вечер я прочитал статью про негативные моменты SOLID, поэтому я понимал: применять эти принципы нужно с умом.
Первый проект
Введение в проект
Я уже говорил, что первым делом изучал то, что мне было самому интересно. Меня заинтересовала разработка игр, и я начал изучать использование C# в Unity. Спустя несколько дней обучения я стал чувствовать себя комфортно, и решил приступить к созданию своего первого более или менее большого проекта.
Этот проект стал для меня особенным — я впервые ощутил на себе тяжесть масштабирования подобных проектов, а я напомню, что обучался я на мягко говоря плохих примерах кода из бесплатных курсов, но об этом чуть позже.
Реализация проекта
Наступил день когда я приступил к реализации проекта. Поначалу все шло гладко, я постепенно реализовывал механики. И вот спустя некоторое время я столкнулся со своими первыми проблемами.
Основные проблемы:
Классы нарушали SRP.
Прямые зависимости между компонентами без использования интерфейсов
Эти проблемы стали мешать нормальной разработке. Из‑за разбухших классов изменения в одной области кода могли сломать другую. Из‑за прямых зависимостей изменение кода одного компонента ломало те компоненты, которые зависели от первого. Из‑за них я начал подумывать о забрасывании проекта, и тут, как гром среди ясного неба — мне попалась та самая статья про SOLID. После ее прочтения я решил провести свой первый масштабный рефакторинг кода — в итоге структура проекта стала в разы понятнее, а вносить изменения стало проще и безопаснее!
В ходе реализации этого проекта я применил на практике множество паттернов, тщательно продумывал логику реализации механик. С удовольствием бы поделился деталями этого проекта, например реализованными механиками и другими трудностями, с которыми я столкнулся. Однако это заняло бы слишком много времени, поэтому просто оставляю ссылку на репозиторий GitHub. Сразу отмечу: сейчас я не горжусь тем кодом который я писал при создании этого проекта, сейчас я считаю, что могу намного лучше. Также подмечу, что к сожалению в репозитории нет версии кода до рефакторинга, поскольку тогда я еще не был ознакомлен с Git.
Финал проекта
Я занимался разработкой своего проекта, и вдруг я понял, что больше времени трачу на работу с движком, чем на само программирование, и решил сосредоточиться на проектах, где фокус будет именно на коде. Поэтому я принял решение забросить его, и перейти на проект в котором я целиком и полностью могу посвятить себя программированию. Этим проектом я в целом доволен, я реализовал множество механик, узнал очень много нового, и отработал большое количество полученной информации на практике.
Как итог: этот проект стал моим первым серьезным испытанием, я впервые осознал важность качества кода, и уже имел представление о проблемах, с которыми, возможно, мне придётся столкнуться в работе.
Ошибки - это здорово
Этому разделу я хочу уделить отдельное внимание. На этом этапе я начал смотреть на ошибки иначе. Главное что я понял — ошибка это не провал, а двигатель прогресса. Как только я это осознал — разработка стала приносить мне гораздо больше удовольствия.
Ошибки стоит воспринимать как шанс научиться чему‑то новому — ведь избежать их невозможно.
Одни из таких ошибок дали мне колоссальный опыт. Об этом следующий раздел.
Первый проблемный проект
Честно говоря не знаю, можно ли назвать этот проект проблемным — ведь он был учебным, и с этой задачей он справился отлично. Однако за время разработки он прошел через около 15 крупных рефакторингов, некоторые из них в корне меняли архитектуру, а результатом я все еще не доволен.
Причины проблемности:
Отсутствие четкого плана. Я приступил к созданию проекта сам не до конца понимая что я хочу создать. По сути, я просто пропустил этап проектирования и работал вслепую.
Недооценка архитектуры. Я заранее не спланировал архитектуру. Из‑за чего она расширялась очень хаотично и слабо поддавалась масштабированию.
Неудачный эксперимент. Так как проект был исключительно учебный я решил в нем экспериментировать, и я впервые вручную реализовал паттерн «Медиатор». Этот паттерн был выбран для уменьшения связности компонентов, однако по мере расширения проекта моя реализация паттерна стала очень громоздкой и усложнила расширение.
Большая связность и чрезмерная ответственность. Компоненты не только выполняли свою логику, но и управляли другими компонентами, что очень усложнило тестирование и расширение.
Многие из этих проблем я позже поправил. Например: моя самодельная реализация медиатора была полностью вырезана. Структура кода и разделение компонентов были существенно улучшены. Однако остался недочет с большою связностью и ответственностью компонентов. В будущем я планирую вернуться к этому проекту и окончательно доработать его.
Как итог: этот проект дал мне неоценимый опыт. Самое главное что я из него вынес — понимание важности этапа планирования и построения качественной архитектуры. Но пожалуй самое ценное — этот проект стал для меня переходом на следующий этап. Я стал воспринимать код не просто как набор синтаксиса, структур и различных техник. Написание кода по праву можно считать искусством, в котором можно выразить себя, свой стиль, и свое видение решения задачи.
Подведение итогов
В этой статье я описал ключевые этапы, которые повлияли на мое становление как разработчика. Конечно, взлетов и падений было гораздо больше — однако их описание займет огромное количество времени и текста.
Главной мотивацией написать эту статью стало желание подвести для себя некие итоги, и заодно поделиться своими этапами роста. Я доволен тем, как прошел этот путь. И я особенно рад что не сдался на самом старте.
Оглядываясь назад я также понимаю: мне не всегда удавалось эффективно использовать свое время. Одни проекты так и не были доведены до конца, другие оказались проблемными. Однако я уверен в том, что все это было не напрасно. Все эти проекты дали мне неоценимый опыт, и научили меня гораздо большему, о чем я мог мечтать.
Мои слова начинающим
Если вы хотите войти в мир разработки, но боитесь и думаете что у вас «ничего не получится» — откиньте эти мысли. Я был на вашем месте. Самое главное — просто начать и делать. Не бойтесь допускать ошибки, наоборот — будьте им благодарны! Ведь они являются катализатором вашего профессионального роста.
И напоследок
Я написал эту статью, в первую очередь, для себя. Но если вы случайно наткнулись на нее и прочитали до конца — большое спасибо за внимание! Надеюсь мой путь оказался для вас интересным, или хотя‑бы немного вдохновляющим.