Итак, погнали...

Ты сейчас оканчиваешь первый курс (а поверь, ничего не изменится и через год, и через два).
Но при этом в твоей голове практически нет никаких знаний. И даже когда ты окончишь универ, ты сможешь первый год рассчитывать на зарплату в 250, максимум 300 уе. Тебя даже джуном тяжело назвать, ибо ты знаешь крайне мало теории и у тебя нет практики.
Теорию ты плохо будешь знать по четырем причинам:
- Это очень обширная область, и изучить здесь все в рамках курса невозможно.
- Чаще всего изучается устаревший материал.
- На лекциях ты, скорее всего, сидишь в соцсетях, общаешься с одногруппниками и просто ходишь, чтобы отметиться, что пришел. Ты вникаешь только в 30-40 процентов происходящего, а даже если тема легкая и ты запомнил 80%, то ты это не подтверждаешь практикой после лекций, сидя после пар в свободное время за компом. На практических занятиях, например, я часто играл в контру по сетке (при этом успел кое-как сделать лабы — минимальный набор для зачетов).
- Чтобы что-то изучать и поглощать в виде знаний, надо идеальное настроение, идеальная заинтересованность и обстановка. В 8-10 утра вряд ли это будет у любого студента, и как итог материал плохо усваивается. Сидеть на лекциях в универе и смотреть эту же лекцию вечером дома на диване на YouTube — это разные вещи.

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

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

Просто нужно планировать свое время. Иногда стоит делать планы на недели, но планировать так, что что-то может поменяться. И самое главное — приучай себя обучаться... всегда и почти каждый день.

Программисты, как правило, ленивые люди... Лучше всего обучаться по книгам, но так как я тоже ленивый, я слушаю подкасты и смотрю YouTube (и сейчас я уже достиг достаточно хорошего понимания программирования, и мне тяжело найти на YouTube что-то годное и новое, но я все равно нахожу и смотрю, а изредка читаю книги). Поэтому приучи себя каждый день заниматься самообучением. Можешь выбрать подкасты по программированию, которые тебе по духу, и слушать новые выпуски — таким образом ты будешь в курсе новейших событий и технологий в IT-мире в целом.

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

Теперь на 1-м (или 2-м, не важно) курсе очень важно понять, что ты хочешь делать в этой сфере. Раз уж в IT ты выбрала именно программирование, а не SEO, например, или дизайн, то тут есть несколько направлений:
- Системное (написание ОС, драйверов и т.д.) — это низкоуровневое программирование, как по мне, немного скучное, но и сложное.
- Разработка игр — тут без комментариев... Неплохо бы знать физику.
- Веб-разработка — не так все сложно, довольно интересно, но могу сказать, что надо знать невероятно много всего (впрочем, в других областях, наверное, тоже).
- Мобильная — тоже не скажу, что сложно (тут скорее есть подразделение на 2 области: под Android или под iOS, хотя и другие мелкие области тоже есть). В веб, кстати, тоже есть 2 направления: backend и frontend.
- Прикладное — написание программ для ноутбуков, ПК — тоже обычное по сложности и интересности. С него и начинают в университетах, как правило.
- Научное — нечто специфичное, заточенное под узкий профиль и науку: будь то биология, химия, математика и др.
- AI

Наиболее востребованные как по мне это веб, мобильные, прикладные, AI. В любой момент ты можешь сменить направление. Но если ты сеньор в прикладном программировании, это не значит, что, придя в мобилки, ты и там будешь сеньором. Твой уровень на пару лет (в лучшем случае на год) скатится до мидла, так как это совсем другая кухня со своими рецептами.
Также у программистов есть своя классификация по уровням знаний:
- Джун — вообще ничего не умеет, очень косячный. Все задачи после него надо смотреть, возможно, исправлять. Без опыта работы или с крайне малым опытом.
- Мидл — вполне хороший программист, способный решать средние и порой тяжелые задачи (алгоритмы). Имеет опыт 1-2 года. Уже что-то знает, и ему можно доверять.
- Сеньор — очень крутой специалист, знает все или почти все. Опыт работы минимум 4-5 лет. Иногда, чтобы достичь этого уровня, может потребоваться и больше лет (зависит от личных качеств человека и, возможно, сферы).
Опять же, насчет опыта и всех этих разновидностей — это все условно. Сеньор в нашей минской компании, возможно, это только джун в гугл.
Ещё можно выделить тимлида (назовем его бригадиром в отряде :) ). Он распределяет задачи между своей парой, проверяет всё и также выполняет какие-то тяжелые задачи. Вся ответственность за задачи его команды лежит на нём. Как правило, они старшие, но могут и очень хорошие мидлы.
Ещё есть архитекторы программного обеспечения — это мегаумные люди, тоже сеньоры, а может, и даже выше (я сам пока что не достиг этого дзен-состояния, поэтому точно сказать не могу :)). Всё зависит от степени. Скажем, чтобы в вебе грамотно спроектировать архитектуру, мало быть бэкенд-сеньором; надо хорошо знать и фронтенд — а это уже, считай, фуллстек-разработчик.

Не особо слушай людей, которые будут диктовать свои технологии и языки программирования, говоря, что этот круче того... Всё исключительно зависит от ситуаций и задач. И потом на рынке есть топ-5-10 языков, которые уже около 20-25 лет не меняются и не сдают позиций (иногда просто между собой уступают позиции, если что-то новое вышло в плане фишек, обновлений или, например, фреймворков для этих языков, но все эти языки развиваются до сих пор). Я бы выделил следующие языки: C, C++, C#, Python, Java, JavaScript и PHP. Из более новых можно выделить Go, может быть, ещё Rust. Ну и языки мобильной разработки, типа Kotlin или Swift — последние два действительно сравнительно новые (наверное, примерно 4-5 лет всего как ими активно пользуются) — этому есть логичное объяснение, так как мобильная разработка — это одна из самых новых по сравнению с тем же вебом или прикладным, то и какие-то четкие языки с направления тут сформировались позже, чем где-либо.
Вообще надо понимать, что языки бывают как функциональными, так и объектно-ориентированными (есть и другие парадигмы), и надо понимать, что они отличаются друг от друга внутри... Плюс надо помнить, как они работают: где-то компилятор, где-то интерпретатор (но это уже нюансы). Очень круто, когда программист разбирается на уровне асинхронности, процессов и потоков, но к этому тоже приходят не сразу.
Также не слушай тех, кто говорит, что, например, PHP — плохой язык — это мнение людей, которые показывают свою тупость и незнание программирования (эта шутка пошла из-за говнокодеров, низкого порога вхождения языка, что скорее ему в плюс, чем в минус, ну и потому что раньше PHP был реально плох... но это было в 2000, максимум 2007-2010. Сейчас очень хороший, и на нём работает больше 70% веб-проектов в мире (backend). Также можно сказать про JavaScript (даже есть шутка про проститутку и JS). Мне он тоже не нравится, но его я тоже использую часто. Также слышал упрёки в адрес Java и Python... хотя думаю, про любой язык можно найти шутки. Так что это всё исключительно вкусовщина.

Итак, после того как ты определилась с направлением, я постараюсь на примере веб-технологий объяснить, почему так важно начать изучать программирование как можно раньше и почему не стоит рассчитывать на учреждения образования. Чтобы быть крутым специалистом, тебе надо хорошо знать всего пару языков программирования. Помимо языков, надо знать кучу технологий, протоколов и какой-то общей фигни, которая нужна не вебам, но и всем прогерам. Я даже опускаю то, что тебе нужно знать алгоритмы и крайне желательно математические дисциплины (от высшей математики и теории вероятностей до дискретной математики и математического моделирования). Хотя, откровенно отвечая на вопрос, нужна ли математика современным программистам (если это не специфическая работа), мой ответ — «нет, не нужна». В 80% случаев работа сводится к тому, чтобы взять данные из базы и вывести их во вьюшку (на экран, если быть проще). И не важно, мобильное это, прикладное или веб-приложение. Ну или записать данные в базу. Тут скорее важно сделать это правильно, согласно некоторой архитектуре. Я напишу список, пожалуй, который подойдет даже хорошему full-stack разработчику для веба (и frontend-разработчику, или backend-разработчику)... это просто огромнейший список. Но его надо знать. Итак, поехали:

Фронт:
- HTML5 (+ надо смотреть, что планируется в 6-й версии).
- CSS (в идеале надо смотреть черновики). Правильно использовать селекторы (помнить, что CSS работает справа налево и др.).
- Надо знать как минимум 1 CSS-фреймворк и понимать, как он работает (Bootstrap вполне подойдет).
- Надо знать CSS-препроцессоры (Sass, Less и др.) — знать, как они работают, и уметь использовать.
- Нужно знать базовые основы SEO — без этого никуда (понимать, как использовать теги HTML5, что нельзя класть блочные элементы в инлайновые, где и в каком количестве использовать теги h1-h6 и др.).
- JavaScript (с 6-м ECMAScript) — тут вообще можно один этот язык в чистом виде долго изучать... а ведь есть еще куча моментов, на что надо обратить внимание:
- jQuery (очень крутая библиотека... но фреймворки лучше).
- Фреймворки (React, Vue, Angular).
- npm — пакетный менеджер.
- Сборщики (Gulp, Grunt, Webpack) — причем они еще нужны и для SEO, чтобы на страницу отдавался именно код стилей и скрипты, нужные только этой странице, и ничего лишнего.
- - сборщики (gulp, grunt, webpack) — причем они ещё нужные и для сеошки, чтобы на страницу отдавался именно код стилей и скрипты нужные только этой странице и ничего лишнего.
- Освоить Emmet.
- Если не нравятся обычные скрипты, освоить CoffeeScript или TypeScript, или что-то подобное. Тогда не забудь выучить Babel или другой компилятор в JS.
- API поисковых систем и алгоритмы ранжирования (это скорее под SEO). (+ AMP, Turbo, Яндекс.Дзен).
- Верстка (валидная, кроссбраузерная, современная, адаптивная).

Бэк (буду на примере PHP):
- 1) Чистый PHP.
- 2) Движки (работал со многими, но советую WordPress).
- 3) Фреймворки (Laravel, Symfony, Yii или любой другой). Первые два наиболее крутые.
- 4) PSR — стандарты, как правильно писать код, где переносить кавычки, где ставить пробелы (табы), как называть переменные и многое другое.
- 5) REST — это, как и пункт 4, способ правильного программирования и правильного названия методов.
- 6) Безопасность. Я не знаю, насколько уделяется большое внимание безопасности, например, в мобильных приложениях, но в вебе это часто большая проблема. И это логично, потому что лучший дебаггер веб-разработчика — это браузер. С его помощью можно получить много информации о странице, а если установить некоторые расширения, то и вообще проводить неплохие манипуляции. Поэтому в вебе надо знать, как защититься хотя бы от SQL-инъекций, XSS-уязвимостей и межсайтовой подделки запросов CSRF — хотя это не единственные угрозы (сюда же можно добавить DoS и DDoS — но это скорее уже к настройке сервера).
- 7) ORM-системы (Doctrine подойдет) и PDO.
- 8) Консоль (я почти каждый день её использую).
- 9) Настройки сервера (хотя бы базовые, знать, как работают сервер и вообще что происходит на бэке при запросах).
- 10) Docker (вообще неплохо бы взглянуть на интернет-облачные хранилища и уже сконфигурированные «контейнеры» для проектов. Также знать, что такое, например, Kubernetes, OpenShift. И может проще сдаться облаку, чем разворачивать большой стек технологий у себя).
- 11) Composer
- 12) cURL
- 13) Протоколы — данный пункт следовало поставить повыше, к 4-6 пунктам. Но уже переписывать ничего не буду. Надо знать, чем отличаются и как работать с HTTP, HTTPS, FTP, SSH и некоторыми другими.
- 14) Выучить IDE, например, PhpStorm или хорошие текстовые редакторы (с установленными расширениями) — это касается и фронта.
- 15) Linux — большинство серверов работает на этой ОС, поэтому крайне желательно это знать.
Кроме этого, тебе надо знать ООП. Есть функциональные языки, где можно целый стартап написать без единого класса. Но PHP (как и большинство современных языков) объектно-ориентированный, поэтому надо знать ООП. Чем глубже понимание, тем лучше (классы, интерфейсы, трейты). Неплохо бы знать разные парадигмы программирования. Надо понимать, что один и тот же код на одном и том же языке через разные парадигмы можно писать по-разному. И твой проект должен придерживаться какой-то одной парадигмы. Это же касается и имен переменных, то есть или везде верблюжья нотация, или змеиная.
Надо знать паттерны — я признаюсь, во время изучения этого в универе я считал это самой бесполезной темой. И надо признать, это самая сложная тема (для меня). Любой паттерн можно трактовать по-разному (только в вебе можно найти несколько реализаций определенного паттерна. Если брать прикладное или мобильное приложение, там может быть чуть другая реализация). Короче, это тема, описанная вилами по воде. Но крайне важная.
SOLID — то, как писать код. И SOLID — это не единственные принципы. Кстати, REST и PSR (которые я писал выше) тоже можно отнести к принципам правильного написания кода.
Тестирование моча и чай на скриптах, юнит тесты на php. Но это в идеале. Я практически не пишу тесты... хотя они нужны. Надо понимать, что даже тестирование бывает разным: функциональные тесты, приемочные тесты, юнит-тестирование и др.
Нужно освоить гид, меркуриал или любую другую систему контроля версий.
Не забывай поработать с форматами данных: JSON, XML, YAML.

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

Когда я учился в учреждениях образования, мне казалось, что проблема больших данных и оптимизации кода меня не затронет или затронет крайне не скоро. На самом деле это не так. Я уже давно работаю с данными в несколько десятков тысяч записей. Если нормальное знание баз данных и нормализация таблиц мне помогает на бэке (крайне редко возникают проблемы именно там), то на фронте это случается чаще. Поисковые системы крайне требовательны к коду как с точки зрения оптимизации, так и быстродействия (особенно быстродействия). И тут надо понимать, как заставить это все грузиться асинхронно или отложенно. У тебя может быть идеально проработанное семантическое ядро, но какой в этом толк, если нет оптимизации в скорости загрузки страниц — так что на это тоже надо обращать внимание.
Пиши код правильно, чтобы с годами (месяцами) при удалении (отключении) модулей не остался код в проекте. Такое может, например, получиться на фронте с CSS и JS при неправильной организации кода. Я называю такой код мертвым. Он не нужен, но поисковые системы его находят и ругаются на него.
При этом базы данных я практически не затрагивал... это подразумевает, что ты уже знаешь и умеешь работать с ними. Какие именно базы — не принципиально.
Надо знать архитектурные подходы, архитектуру приложений... опять же, везде она совершенно разная: веб, мобилки и прикладное. Например, рассмотрим пример огромного проекта в вебе: бэк состоит из трех частей. Одна сделана на Symfony, вторая на Laravel, третья на чистом PHP. Фронт, например, состоит из двух частей, которые сделаны на React и Vue. Если углубиться в любую из частей, там своя архитектура, свои паттерны — как большие, так и маленькие. Надо разбивать большие участки кода на прослойки (например, обертка моделей в репозитории и обращение не к моделям, а к репозиториям, использование обсерверов и т. д.) — это все делает код элегантным, а приложение модульным и легко расширяемым. Но в то же время надо помнить, что чем тоньше прослойка, тем быстрее работает приложение (например, не использовать между базой и языком ORM-системы там, где хватит чисто PDO). Понимание всего этого придет с годами.

Ещё что очень важно: надо использовать фреймворки (хотя бы в больших проектах). На фреймворках сложнее писать, чем на чистом коде. Но фреймворки дают несколько хороших плюсов:
- ускоряют разработку приложений в целом;
- диктуют некий стиль и философию, которой ты придерживаешься, и меньше говнокодишь;
- есть много готовых модулей (например, авторизации), и тебе не важно, как она под капотом сделана (базовая авторизация, токенная, JWT или что-то другое);
- безопасность. Как я уже писал выше, в вебе это проблема, которой надо уделять много времени и сил. И фреймворки зачастую уже это сделали за тебя.

Есть мнение, что fullstack-разработчик — это вечный middle. Отчасти я согласен с этим, и я очень много свободного времени уделяю обучению и саморазвитию, чтобы эта фраза не касалась меня и чтобы можно было самому делать хорошие проекты под ключ как на фронте, так и на бэке — при этом не косячно, а с использованием чего-то нового и свежего.
Возможно, что-то забыл, ибо всё в голове не удержишь. Ну и да, про английский тоже говорить не буду... чем лучше — тем лучше))
Тебе необязательно учить сразу оба направления, можно одно.
И помни: если твой прошлогодний код ты считаешь говнокодом и ты могла бы его переписать лучше — значит, ты в правильном направлении мыслишь и развиваешься.
Итак, я описал веб... возможно, что-то забыл... но поверь, это точно в районе 90% того, что надо знать, чтобы быть хорошим специалистом. Другой вопрос, что всё это можно изучать годами.
Как видишь, по факту я использую только два языка программирования, но кроме них, как я перечис