Предисловие: это гайд для старшеклассников, первокурсников и тех кто отчаялся в программировании и подумал, что это сложно и не для меня. Здравствуй, Хабр! Это моя первая статья, не судите строго, надеюсь помогу кому-то своими наблюдениями и опытом. На своем жизненном пути через универ я повстречал немало людей, которые мало того, что отчисляются со специальностей, на которые они поступили, так еще и некоторые умудряются еле закончить злосчастные 4 курса, поступить в магистратуру и по итогу пойти работать в школу танцев (если речь шла не о танцевальном училище) или продавцом-консультантом в модные бутики и ловить с этого кайф. Я никого не осуждаю, каждый выбирает свой путь и свое место сам, но потраченных лет уже не вернуть. И речь идет не только про айти специальности, но говорить мы будем сегодня именно про них Придя в универ, первое с чем ты сталкиваешься - это огромный поток информации и абсолютная дезориентация. Вокруг все новое, возможно новый город, люди, преподаватели, аудитории и так далее и плыть в этом бесконечном потоке для некоторых студентов крайне тяжело. У каждой специальности свои подводные камни и мы разберём именно IT специальности. У айтишников встает ряд проблем связанных с информационным потоком. Программирование - направление современное и постоянно развивающееся и каждый день(если не чаще) появляются новые технологии, а с ними и новые термины, алгоритмы, парадигмы. И на первой лекции услышав слова "паттерн программирования", "Компилирование", "Инкапсуляция", "полиморфизм" у некоторых пробегают мурашки по коже, ведь еще вчера ты мирно сдавал экзамен по информатике, где дают задачки по типу "переведи число 12 из десятичной в двоичную СС", писал школьные задачки на паскале и думал, что программирование это твое. Может оно и так, но новый поток информации способен сильно потрясти новоиспеченного студента. Столкнувшись с омутом неизведанного, первое, что ощущает человек, это страх, ведь непонятное для нас чаще всего ассоциируется с опасностью и некоторой боязнью. Это уже само по себе отталкивает, а сверху появляется и еще ряд препятствий:  Программирование не любит неточности. Как говорится: "Одна ошибка и ты ошибся". Случайно поставил букву в рандомном месте программы? - compilation error  Ошибся с типами переменных?  - compilation error  Недопонял материал, и чуть-чуть неточно написал синтаксис языка?  - compilation error Запустил среду разработки?  - compilation error  Включил компьютер?  - compilation error  Код скомпилировался? хммм..... runtime error! Конечно есть питон, js с динамической типизацией, но там будет не меньше рантайм ошибок, чем ошибок компиляции в компилируемых языках. И первокурснику никто не будет объяснять, чем отличается ошибка рантайма от ошибки компиляции, он должен опытным путем сам во всем разбираться хоть и видит их в первый раз. Огромное количество ошибок при изучении нового языка и синтаксиса, это нормальная практика, однако на понимание того, как используются функции, приводятся типы данных, как работают свойства, методы, лямбды и т.д. уходит порядочное количество времени и практики. И это еще пол беды. Информационная гонка. Мало того что человек не имел достаточного количества практики и даже базовых знаний для неучебных языков программирования, так еще его заваливают всеми возможными языками сразу. Обычно на начальных курсах изучают сразу множество языков: си-подобные языки, питон, js, sql, ассемблер и много чего другого. И все друг от друга довольно сильно отличаются вплоть до того, что вроде бы две программы делают одно и то же, а выглядят как китайский и английский в одном тексте. И научиться всему и сразу вряд ли получится, ведь программирование это про практику, а не про теорию, можно прочитать сколько угодно статей и посмотреть миллионы гайдов на ютубе, но кодить ты от этого не станешь. Практика, и только практика даст понимание всей теории, которую человек изучил. А времени на "покодить" остается очень мало, ведь по началу разобраться как работает this в классах может занять несколько часов. И то поверхностно. А пока ты изучаешь этот вопрос, у тебя появится еще 5 других, требующих столько же времени. Получается неутешающая геометрическая прогрессия информационного потока, в котором очень легко утонуть. Дополнительные предметы. В универе помимо непосредственно программирования есть и еще другие предметы: всеми любимый матанализ, алгем дискретная математика, вектан. И хоть эти дисциплины условно помогут в программировании, то Философия, История, БЖД, физра  и другие - очень вряд ли. Я не отрицаю их важности на пути студенчества, но они добавляют весомую часть сложности в обучение. Нехватка времени. Как я уже сказал практика программирования занимает уйму времени, а помимо нее есть и другие предметы, друзья, семья, студенческая жизнь... И разорваться на все это бывает физически невозможно. Печалька( Выбор направления. Программирование имеет несколько направлений. Хабр распределил эти направления как Front-end, Back-end, Desktop development, Mobile. И это обобщенные категории. Если начать искать "профессия программист" на популярных платформах по поиску работы, ваш запрос выдаст (дабы не быть голословным предлагаю вам, уважаемый читатель, самим посмотреть сколько) N > 50 разных предложений. И каждое из них требует своего набора(стека) технологий. И часто бывает так, что ты планировал делать игры и хотел полностью уйти в геймдев, а попробовав front end, он тебе стал милее всех на свете. Это и плюс и минус, все же универ предлагает возможность попробовать все и не делать конечный выбор направления вплоть до окончания обучения. Однако переметнуться с одной отрасли на другую, при этом не имея достаточного опыта, довольно сложно. Отдых. Времени на прилечь отдохнуть будет категорически не хватать. Любая слабина будет сказываться на процессе обучения, а выпасть из потока учебы чрезвычайно просто. Стоит пропустить одну две темы - и приходится тратить все выходные и вечера восстанавливая пробелы и практикуя упущенное. Тем более вкус свободы сладок, и привыкнуть к безделию, особенно когда вокруг полным-полно студентов прогуливающих пары и закрывающих предметы посредством списывания или еще как-либо очень легко. Тут ситуация неоднозначная. По моему мнению, что бы стать программистом, нужно хотеть быть программистом или иметь к этому предрасположенность. И любить учиться. Очень любить учиться. Многие успешные выпускники, которых я знаю, грезили программирование еще у школьной доски. Многие начинали в 7-10 классах писать что-то свое, чаще всего игры. Некоторые писали плагины и моды для майнкрафта на Java, кто-то свои игры на юнити на C#\C++, кто то копался по конфигам и так далее. Естественно, старт в универе у них был намного увереннее, чем у тех, кто пробовал кодить на уроках информатики, когда у них это хорошо получалось. Однако есть и люди, которые буквально с нуля стали вливаться в айти и вышли достойными специалистами с любовью к своему делу. Все дело в целях Немного пофилософствуем и поразмышляем. Что может заставить человека стремиться к чему-то, преодолевать сложности и не опускать руки? Ответ чрезвычайно прост: цель. Однако не абы какая, а грамотно сформулированная, достигаемая цель. Например: Я хочу переехать в другую страну с лучшим уровнем жизни, что мне для этого нужно? Найти желательно высокооплачиваемую профессию, востребованную в стране N, и, желательно, чтобы во мне как в кадре была заинтересованность. Из глобальной цели "переехать в другую страну" мы вывели подцель - найти востребованную работу в той стране, чтобы она приняла меня, и я смог там комфортно жить. Думаю уже стало понятно, что под этой профессией подразумевается программист - профессия с огромным быстрорастущим дефицитом на рынке труда и хорошим уровнем заработка. Итого, получаем что наша абстрактная задача "переехать в другую страну" превратилась в "стать хорошим специалистом для того, что бы другая страна была заинтересована во мне как в кадре, и я смог переехать в нее". Пример гипотетический и в роли такой абстрактной цели, которую мы сводим до конкретной, может быть и "улучшить свое финансовое состояние", "принести достаток в семью", "иметь стабильность в жизни и на рынке труда", "оправдать ожидания близких" и тд. Правильная поставленная задача - залог успеха в любом начинании. Играя в любую игру, мы идем к конечной цели: "Найти Цири", "Спасти друзей попавших в плен на острове наемников", "Остановить вторжение ада на Землю", "Уничтожить вражеский трон" и тд. И мы испытываем интерес в процессе достижения этой цели. Если в игре кончаются цели, и даже если не все сайд квесты выполнены, в нее, чаще всего, больше не хочется играть. Поэтому на пути становления программистом, у вас должна быть цель ради которой вы становитесь программистом.  Начнем с того что цель - это уже пол дела и огромным плюсом будет вовлечение в ее исполнение. Все же профессий много и для выполнения цели необязательно быть программистом, есть куча альтернатив. Давайте разберем, как понять, что программирование, если вы им серьезно займетесь, вам подойдет.  На самом деле, без преувеличения, минимальным программистом может стать каждый. Гуманитарий, медик, певец, работник завода - все. И каждый из нас, в своем роде, уже программист, или станет им в будущем. Практически все пользуются компьютером, телефоном, знают какой-то базовый функционал, кто-то даже углубленно знает некоторые программы для обработки фото, видео, документов, а некоторые даже могут, не без помощи гугла, установить самостоятельно винду. А ведь раньше программистом считался любой, кто умеет создавать папку на рабочем столе. Однако сейчас программист - это человек умеющий намного больше и строящий многоуровневые программы, зачастую вовлекая не один язык программирования, кучу сторонних библиотек, фреймворков и тд. Давайте разбираться, стоит ли вам этим заниматься или нет.  Тесты. Существует куча онлайн тестов на профориентацию, прохождение которых абсолютно бесплатно. Тесты на профпригодность для программистов тоже есть. Алгоритмы. Программирование это всегда про алгоритмы. Строить логику преобразований от А до Я, оптимизация работы, поиск наиболее оптимальных решений. Если вам это нравится и у вас это получается - это неоспоримый плюс. Матеша. Математика нужна не всегда и не везде, некоторые специалисты могут ее вообще не знать и спокойно справляться со своей работой, однако чем лучше вы ее знаете - тем лучше. Для некоторых профессий типа дата-сайнс и машинное обучение глубокое знание математики и теории вероятности - мастхев, а для условного фронтенд- разработчика - (утрирую) ограничивается таблицей умножения Конструктор. Большие программы всегда состоят из компонентов, которые связаны между собой особой логикой (это называют архитектурой приложения). Их может быть сотни и даже тысячи. И в конечном итоге это всё по деталькам собирается в один конечный продукт. Прямая аналогия с лего. Самообучение. Неотъемлемая часть работы программиста. Постоянно появляются новые технологии, новые компоненты включаются в продукт и все новое новое новое. А еще и куча того, что человечество успело придумать за информационную эру. И все это изучить просто невозможно, однако всегда можно быть "в курсе последних событий" и иметь уверенные знания в какой-либо области и постепенно их расширять. Программист ооооочень много гуглит, поверьте.  Серфинг. Вытекает из предыдущего пункта. Если вы умеете отлично серфить по сети интернет, находить то, что нужно за пару запросов - вы отличный кандидат в программисты). P.S. на самом деле можно написать простенький скрипт, при должном навыке поиска в интернете, не умея программировать от слова совсем. Сложив эти пункты, вы можете приблизительно понять - по душе ли вам быть программистом. Но только попробовав можно узнать наверняка.  Резко взвалившийся объем информации, ошибки при написании кода, нехватка времени сильно давят и негативно влияют на процесс обучения. И что бы избежать этого, я постараюсь дать вам несколько лайфхаков, основанных на моем личном опыте и опыте студентов моего вуза.  Старайтесь разобраться в терминах. Их очень много для каждой отдельной стези программирования, так они еще и появляются каждый день новые. SPA, git, Vue, js, docker, инкапсуляция, полифилы, лямбды, паттерны, типизация, MVP, ООП, наследование, операционные системы, дистрибутивы, плагины, библиотеки, фреймворки и еще очень много слов, аббревиатур и названий технологий, с которыми вам придется столкнуться и использовать в своем лексиконе. Часто бывает что на учебных курсах лекторы подразумевают, что ученик знает какой-то термин, например «инкапсуляция», и спокойно начинают его использовать, а люди, которые этот термин не знают или не до конца его усвоили, теряются и не понимают о чем идет речь, хотя 5 минут назад все было нормально. Старайтесь гуглить и запоминать новые термины и грамотно использовать их в речи. Научитесь гуглить. Бóльшая часть проблем, с которыми вы можете столкнуться - решается первой открытой ссылкой после поискового запроса. Иногда приходится сильно углубляться, но это необходимо делать, что бы научиться самостоятельно искать решения проблем. Общайтесь. Многие ваши сверстники или преподаватели не откажут вам в помощи если их попросить. Всегда можно спросить: что это за слово они использовали или как они сделали что-то в коде. Главное сильно не навязываться;). Программисты всегда общаются при командной разработке и это норма - задавать вопросы. Не откладывайте на потом. Часто бывает, что при обучении расставленные приоритеты отодвигают на второй план "неважные" предметы, которые в итоге снежным комом сваливаются на плечи студента. Так делать не надо. Это может плохо кончится, и речь идет не только о бессонных неделях перед сессией. Практикуйтесь. Айтишник закаляется в бою. Вы будете постоянно сталкиваться с проблемами при кодинге и каждая из них ускорит ваше понимание кода, усилит ваши знания и даст вам опыт. Сначала будете писать один метод минут 20, а через пол года 20 секунд. Соблюдайте режим. Программирование - это как физическая форма тела, ее сложно набрать и легко потерять. Шучу, набрать ее тоже легко, и не нужно занимать себя изнуряющими тренировками. Достаточно практиковаться 2-3 часа в день и через полгода вы будете уже уверенно себя чувствовать даже в других языках программирования, отличных от вашего основного.  Изучайте технологии. По возможности старайтесь использовать при обучении технологии, которыми потом будете пользоваться на работе. Среда разработки(IDE), Git, Библиотеки, фреймворки - знакомство с ними на этапе собеседований уже будут огромным плюсом вам. Научитесь тайм менеджменту. Важная штука в жизни в целом. Стабильно отдыхайте, спите, учитесь, работайте. Обучение это как подготовка к олимпиаде: все должно быть по графику, что бы поддерживать боевую форму и боевой настрой. Стать программистом достаточно просто. Главное - иметь цель, инструментом к достижению которой будет ваша освоенная профессия. Комбинируйте обучение в вузе\школе и самообучение. Много практикуйтесь, больше кода - выше скилл. Будьте терпеливы и не растрачивайте себя зря. И не забывайте вкусно кушать;3