Для тех, кто хочет стать программистом

Привет! Я — Unity-разработчик, работаю в этой сфере несколько лет. За время работы у меня успел накопиться опыт, которым я хотел бы поделиться с теми, кто только думает о том, как именно начать карьеру программиста.
В конкретно этой статье я постараюсь разобрать(опираясь на свои знания) одни из самых популярных вопросов, и ответить на них исчерпывающе.

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

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

Если все пойдет хорошо, то я напишу еще пару-тройку статей: одна для тех, кто уже программирует и ищет пути развития, а вторая — специфично для Unity-разработчиков.
В конце каждой из статей я буду приводить список полезных ресурсов, которые буду считать относящимися к теме написанного.

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

Ну, поехали:

1. Скорее всего, вы сможете обойтись без платных курсов

Сейчас в интернете невероятное засилье различных курсов, которые обещают сделать из вас разработчика/тестировщика/2D или 3D художника, стоит всего лишь заплатить 200 000 продавцу этих курсов. Я сторонник того, что делать этого не стоит, потому что единственный плюс такого обучения — взаимодействие с преподавателем и получение фидбека, однако подобные курсы зачастую ведут и проверяют люди далеко не самые профессиональные, поэтому здесь — кот в мешке, смотря кто попадется.
Минусов, на мой взгляд, намного больше

  • Большая цена — здесь даже говорить не стоит. Обычно она компенсируется рассказами о том, что курс окупится за 2-3 месяца работы, однако это только в том случае, если вы куда-то устроитесь. Более того, можно получить те же знания бесплатно, тогда и окупать ничего не придется
  • Преподаватели — как я уже написал, зачастую совершенно неясно, какой уровень у человека, который писал материал курса и человека, который преподает его. Как ни странно, доверие к людям с условного YouTube намного больше, так как их навыки подкреплены мнением людей, возможностью посмотреть историю канала и тем, что у них(зачастую) нет цели что-то вам продать. Конечно, обжечься о плохого учителя можно и здесь, но тут это хотя бы материально бесплатно.
    Ссылками на каналы, которые я считаю полезными, я поделюсь в конце статьи.
  • Отсутствие гарантий — я знаю, что часть школ «гарантирует» ваше трудоустройство(там тоже есть свои подводные камни), однако это только часть, и достаточно малая. Большинство, по-прежнему, не гарантируют ничего, кроме невнятного сертификата при прохождении.
  • В реальности, нужно учиться разбираться в непонятных вещах самому — если вы идете на курс по той причине, что вам нужен именно преподаватель, который разжует вещи понятным языком и забьет их вам в мозг, и не хотите разбираться сами, то такой курс — лишь временная панацея. Вся суть нашей работы в том, чтобы разбираться в чем-то, что не ясно изначально и никто не будет тратить время и деньги на то, чтобы постоянно объяснять и делать что-то за программиста.
    Здесь речь не идет о трейни, с которыми рядом постоянно находится ментор и помогает разобраться в работе. В таком случае, трейни уже попал на работу, потому что разбирался и учился сам, а ментор нужен для того, чтобы человек быстрее вник в предметную область и адаптировался внутри компании. Если трейни не захочет разбираться сам, то он очень быстро вылетит за борт

Трижды подумайте, прежде чем влезать в долги или кредиты ради получения работы под пальмой с ноутбуком 2 часа в день за $6000 в месяц, в реальности все не совсем так.
Даже если я не смог переубедить вас покупать курсы, пожалуйста, сначала позанимайтесь сами хотя бы пару недель, чтобы понимать, на что вы идете.

2. Английский необходим, но…

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

В нашем случае, две самых необходимых вещи это:

  • Умение формулировать мысли на английском (необязательно уметь правильно говорить или произносить их) — этот навык напрямую влияет на то, сможете ли вы найти информацию по своему вопросу в интернете. На самом начальном этапе искать можно и на русском, но быстро станет ясно, что это имеет очень мало смысла.
  • Умение воспринимать информацию на английском языке — этот навык напрямую связан с первым, так как мало толку от умения найти информацию, если нет возможности понять то, что было найдено.

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

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

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

3. Математика НЕ необходима, но…

И снова достаточно распространенное мнение, что «программисту необходимо знание математики», однако здесь конкретику можно встретить еще реже. Я тоже не готов расписать, какая область математики где может пригодиться, потому что это больше зависит от предметной области, в которой вы будете работать, чем от стека технологий. Однако, здесь есть исключения. Например, считается, что в разработке игр математика — один из самых важных инструментов, но это не совсем так. Вернее, не каждому Unity-программисту она нужна, а если и нужна, то далеко не каждый день и лишь какими-то точечными моментами. С другой стороны, разрабатывая физический движок, с математикой придется сталкиваться, скорее всего, каждый день.
Я сейчас нахожусь на стороне тех, кому математика в каждодневной работе не пригождается, поэтому не обладаю полным виденьем картины. Все, что я хочу сказать, это то, что если вы не знаете математику, и совершенно не хотите ее изучать, это не является поводом отказываться от идеи стать программистом. Скорее, это просто ограничит круг предметных областей, в которых вы можете работать.

Что программисту действительно необходимо, так это способность разбить поставленную задачу на дискретное количество малых выполняемых шагов, и методично делать их один за другим. Такой тип мышления обычно отсутствует у людей по умолчанию, но развивается на протяжении обучения и работы. Заметьте, что я не сказал «обучения программированию» и «работы программистом», потому что мышление дискретного типа — прерогатива большинства технических профессий: математиков, физиков, химиков и так далее.
Исторически, сама профессия имеет математические корни, и, фактически, появилась благодаря необходимости работать с калькуляторами, которые, в свою очередь, появились дабы решать математические проблемы. Соответственно, в прошлом, любой программист без исключения работал в предметной области, тесно связанной с математикой, поэтому и ее знание было необходимостью. В настоящем, как мы знаем, это совершенно не так, потому что программирование и автоматизация захватили все области жизни, а вот знание математики по-прежнему требуется только тогда, когда требуется работать в предметной области, с ней связанной.

4. Семь раз отмерь, один раз отрежь

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

Часто бывает так, что люди приходят в программирование, услышав о каком-то конкретном направлении, желая работать только в нем. Раньше, это была автоматизация математических вычислений, затем — игры, после этого — веб, потом в тренды попали нейросети, а сейчас популярны блокчейн технологии(если мейнстрим на момент публикации успел измениться, то это не важно и лишь подтверждает то, о чем я говорю). Если вы хотите стать программистом в одной конкретной области, потому что она кажется вам перспективной/интересной/прибыльной, но вы при этом не рассматривали ни одну другую, то это станет большой ошибкой, потому что огромен шанс того, что будет выбрано не самое лучше для вас направление.

Я понимаю, что время ограничено, и хочется стать профессионалом в одном деле, а не новичком во всем на свете, но призываю вас потратить немного времени, собрать небольшой список крупнейших областей, в которых вы могли бы работать и сделать по одному мини-проекту в каждой из них. Примерами областей могут быть: мобильная разработка, веб, десктоп, игры и так далее.
Когда вы определитесь с желаемым общим направлением, то я советую не останавливаться, а продолжать копать дальше.
Скажем, вы решили разрабатывать игры. Определите желаемую платформу: мобильные/десктоп/консоли/VR/…
После этого — 2D или 3D
И так далее. Исходя из отсеянного направления сразу станет ясен и стек инструментов, которые необходимо использовать, в нашем случае — игровой движок. А если не станет(существуют смежные области, где можно использовать сразу несколько движков), то решающим фактором будут такие вещи как используемый язык программирования, средняя зарплата, интерфейс используемых программ, количество гайдов по ней и так далее.

Главная мысль этого совета — не следуйте за мейнстримом при выборе области, в которой планируете работать многие годы. Потратьте пару дополнительных недель на фильтрацию выборки, дабы сэкономить себе годы в будущем.

P. S. Я не упомянул то, что таким образом вы станете намного более разносторонним разработчиком, и обретете, пусть и общее, но понимание множества дополнительных вещей, что очень ценится на работе.

Полезные ресурсы

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

  • АйТиБорода — YouTube канал, на котором ведущий берет интервью у разработчиков(и не только) из самых разных областей. Поможет получить общее понимание происходящего в области работы интервьюируемого человека.
  • Евгений Гришаков — YouTube канал, похожий на предыдущий, но менее популярный и ориентированный на разработку игр.
  • «Мысли и Методы» — Отличный подкаст без конкретного направления, в котором затрагиваются очень интересные темы.
  • «Кровь, пот и пиксели. Обратная сторона индустрии» — Захватывающая и хорошо написанная книга, которая не требует специфичных знаний для прочтения. Отлично подойдет для обретения мотивации в области разработки игр.
  • Различные IT-ориентированные сайты — сюда входят подсайты DTF’а, Хабр и множество других. Я советую просто держать руку на пульсе индустрии в целом.

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

Спасибо за уделенное время, желаю удачи в любом выбранном начинании!

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

335335
104 комментария

Хотелось бы порассуждать насчёт математики для программиста. Конечно, не всем она пригодится, но буду говорить как игровой разработчик-самоучка. Популярные движки, такие как UE или Юнька, содержат в себе очень много функционала, и конечно многое не нужна реализовывать самому. Но когда ты понимаешь, как работает под капотом та или иная система, использовать её куда проще. Тем более, в движках может не оказаться того, что нужно вам, и иногда знания, смежные с программированием, могут пригодится. Не нужно очень разбираться в математике, в большинстве случаев достаточно математики старших классов: тригонометрия, векторы, геометрия. Математика часто помогает в решении каких-то нетривиальных задач, что делает из тебя более крутого программиста. Возможно, кому-то не пригодится математика вовсе, но знания по этой науке точно лишними для специалиста не будут.

+ Хотелось бы посоветовать от себя еще каналы по Unity-разработке: Emerald Powder и Максим Крюков.

26
Ответить
Автор

Очень хорошее замечание. Я делаю упор на то, что математика не обязательна, да и вообще на то, что входной порог по знаниям не настолько высокий, как все думают(именно из-за этого сейчас огромное засилье джунов, при большом пороге входа такого бы никогда не случилось)
Но вы определённо правы, математика тем и хороша, что позволяет, при понимании, совершенно по-другому взглянуть на обыденные системы, и очень часто позволяет добиться более аккуратного кода или лучшей оптимизации.
Я планировал затронуть эту тему в аналогичной статье по Юнити непосредственно, потому что здесь не хотелось погружаться в такие детали.
Я надеюсь увидеть вас снова в комментариях под ней

8
Ответить

Хорошая вводная.
По математике, именно игровому разрабу хорошо бы знать - геометрию, тригонометрию хотя бы на уровне синус/косинус, как найти угол между тремя точками, вектора - обязательно (ничего сложного, можно без них, но с ними сильно проще), перемножение матриц, как найти неизвестную через заданную формулу, деление по модулю. Это то что должно быть хорошо знакомо, остальное гуглится. Еще можно кватернион, но этот орешек крепче чем то что надо повторить после школы.
Ну и мат логика - это любому пограммисту - и, или, xor, не - матрицы логических операторов. Всякие карты Карно и прочее мне не сильно пригодилось.

С другой стороны, я знаком с кучей пограммистов, для которых, все то что я выше написал - пустой звук, и они и так как-то пишут достаточно успешные игрульки (хотя иногда смеюсь с их решений, для вещей, которые решаются в одну формулу).

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

14
Ответить

Про кватернион зацепило :-) Если говорить о математике для программиста в общем, то хочется сказать, что она скорее нужна. А парадокс в том, что по опыту с кватернионами хочется сказать: лезть к ним под капот - это просто бессмысленно. Ими надо просто уметь пользоваться, как серыми ящиками.

2
Ответить

Комментарий недоступен

1
Ответить

Я в целом люблю математику. Но Ваши мысли и мысли комментаторов натолкнули на 2 вывода:

Ответить

На удивление хороший и конструктивный пост.

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

11
Ответить