Как правильно составить план самообучения?

Всем привет!

Сейчас заканчиваю первый курс по специальности "Компьютерные Науки". За год обучения понял, что ничему нормальному, в плане программирования, меня не научат, и, что нужно начинать учиться самому (до этого я и так занимался самообразованием, но в каких-то конкретных вопросах, а не в целом).

Цель - параллельно с учёбой в ВУЗе самостоятельно получить достаточный уровень теоретических знаний и практических навыков для того, чтобы устроиться хоть на какую-то адекватную работу по специальности и получить возможность заработать на оплату обучения на магистра где-нибудь за границей, попутно получая опыт и стаж работы.

На данный момент столкнулся с двумя проблемами:

  1. Выбрать направление, которому буду уделять наибольшее количество времени. Очень много языков и мнений касательно того, что стоить выбрать. Чего только стоят споры касательно Java vs C#.
  2. Что сейчас актуально и будет востребовано за рубежом? В строну WEB разработки я не смотрю, как я понял, там сейчас огромнейшая конкуренция, которая постоянно увеличивается желающими быстрого и простого заработка (поправьте меня, если я не прав).


В ходе учёбы познакомился с С/С++/С#, больше всего понравился С#. В целом, заинтересован в разработке приложений под Windows/Android/IOS и GameDev'e, но я думаю, последнее не самый лучший выбор для старта.

Как составить план обучения?

На каждом сайте разные рекомендации того, что нужно изучать, в каком порядке, разная рекомендованная литература и т.д. Везде разные требования к junior-разработчикам. Одним словом, очень быстро теряешься во всем этом.

  1. Как составить эффективный план обучения?
  2. Как контролировать свой прогресс?
  3. Как правильно выбрать литературу?
  4. Стоит ли, как можно быстрее, пытаться устроиться на работу "за бесплатно" (ради опыта) или лучше уделить время на самообразование и создание собственных проектов для портфолио?



Хотелось бы получить советы от опытных разработчиков. Спасибо за внимание.
  • Вопрос задан
  • 2525 просмотров
Решения вопроса 3
saboteur_kiev
@saboteur_kiev Куратор тега IT-образование
build engineer
C# неплохой выбор. Углубляйтесь в него. Освойте типы данных, базовые библиотеки.

Напишите несколько простых приложений - стандартные простенькие калькуляторы чего-либо, с окошками, с менюшками. Какие-нить крестики нолики.

Подучите основы tcp, напишите несколько простых сервер-клиентских приложений - простой чатик, простой мессенджер.

Углубляйтесь в ООП и паттерны.

Парралельно почитывайте вакансии и требования к ним - там все что надо для работы указывают.
Ответ написан
@php65535
Для начала определись, чего хочешь на самом деле. Если твердо уверен в желании связать всю оставшуюся жизнь с программированием, советую пока сконцентрироваться на теории. Самостоятельно углубляйся в темы, которые дают в ВУЗе, подбирай дополнительную литературу. В качестве ориентира можешь взять программу одного из ведущих американских университетов, в интернете есть множество вариантов со ссылками на все необходимые материалы (пример). Всем этим стоит заниматься именно сейчас, потому что потом может банально не хватить времени и мотивации.

Если же пока хочется просто заработать денег, стоит уделить больше внимания прикладным знаниям и практике с прицелом на то, чтобы как можно скорее устроиться на работу. Для начала следует определиться с нишей. Она должна соответствовать как минимум двум критериям:
  • Достаточная широта. Чем больше в нише компаний, тем статистически больше твои шансы найти работу.
  • Минимальное время, за которое можно получить навыки, необходимые для работы в нише. От начала обучения до трудоустройства тебя должно отделять 12-18 месяцев. Чем быстрее сможешь устроиться на работу и начать зарабатывать, тем лучше. Это даст хороший толчок как мотивации, там и твоему профессиональному росту.


Я знаю только 2 ниши, удовлетворяющие этим критериям (заметь, это не значит, что других нет):
  • Мобильная разработка (Android, iOS).
  • Веб (фронтенд или бекенд). Ты правильно подметил, что в вебе большая конкуренция. Но конкурируют между собой в основном низкоквалифицированные работники. Минимально адекватных людей с базовыми знаниями отрывают с руками. Если потратишь год-полтора на правильное самообразование, то без проблем сможешь получить свои $1.5-2k (в Москве/на удаленке) на старте.


Мобильную разработку и веб совершенно точно можно освоить за полтора года, если голова соображает хоть сколько-то. Подтверждений тому множество, есть они и на Тостере (пример).

При выборе направления игнорируй безосновательные мнения задротов с их "настоящий мужик программист должен" и "X - плохо, пнятненько?". Все эти выпады - просто сезонное обострение синдрома вахтера.

Когда определился с нишей, выбирай самый популярный в этой нише язык. Критерий популярности - количество вакансий на этом языке. Для разработки под Android это будут Java и Kotlin, для iOS - Objective C и Swift, для веб бекенда - PHP, для веб фронтенда - JS и TypeScript. Как уже писали, первый язык программирования - не приговор. Если ты хорошо освоишь хотя бы один, то сможешь без проблем перейти на другой (в той же парадигме) за 3-6 месяцев.

Один из вариантов плана обучения такой:
  1. Заходишь на свой любимый сайт с вакансиями
  2. Ищешь 10 вакансий "middle %language% developer" (именно middle, это важно)
  3. Выписываешь все, что встречается хотя бы в 8 из 10 вакансий
  4. Гуглишь одну из тем по запросу "%topic% interview questions". Отмечаешь вопросы, на которые не знаешь ответа. Поначалу многое будет непонятно - это нормально, по мере изучения картина станет ясней.
  5. Гуглишь тему по запросу "%topic% introduction"
  6. Если попадаются книги, берешь первую попавшуюся и читаешь. Если книг нет, читаешь первые 5 статей. Как-то особенно заморачиваться с выбором книг на данном этапе вряд ли стоит: вводная литература вся примерно одинакова, и у тебя еще нет нужных знаний, чтобы отделить зерна от плевел. Если очень хочется, можешь попросить рекомендации на форумах/в чатах, где сидят программисты, работающие в выбранной тобой нише.
  7. Возвращаешься к пункту 4. Если еще остались какие-то непонятные вопросы, гуглишь их индивидуально.
  8. Повторяешь пункты 4-7 для каждой темы


Если изучаешь какой-то практический навык (например, работу с системой контроля версий или язык программирования), обязательно подкрепляй теорию решением небольших, но реальных задач. Один из хороших вариантов - сделать какой-то свой проект и экспериментировать на нем. Если совсем нет идей для проектов, можно выбрать что-то из https://eax.me/programming-language-learning/ .

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

Контролировать прогресс в теоретических вопросах самостоятельно трудно, желательно иметь внешнюю обратную связь. Один из вариантов ее получения - собеседования. Если на следующем собеседовании смог ответить на вопросы, на которых завалился на предыдущем, значит, прогресс есть)

Практические задачи и проекты можно разбивать на небольшие завершенные шаги. Например, если делаешь мобильное приложение, которое выводит погоду в выбранном пользователем городе. Можно выделить следующие подзадачи:
  1. Создать проект в IDE
  2. Добавить главный экран
  3. Добавить на главный экран контрол выбора города
  4. ...

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

Как только сможешь без подглядывания в Гугл отвечать на 80% вопросов с собеседований по всем темам своего направления, можешь начинать рассылать свое резюме. Лучше устроиться на работу как можно быстрее, но ни в коем случае не "за бесплатно". В компаниях, где платят мало, как правило, плохая инженерная культура, и никакого полезного опыта там все равно не получишь, а только потеряешь время.
Ответ написан
@dzolotarev
Программирую на Go, Rust и C, админю Linux.
Нравится C#, ну так и учите его. Охота в геймдев - учите Unity, напишите небольшую игру.
Но лучше всего учите теорию: алгоритмы, принципы проектирования, архитектуру ЭВМ, дискретную математику, матлогику и теорию алгоритмов, вышку и физику (для геймдева очень полезно). Английский тоже очень пригодится.
Теория важнее языка, потому что языки приходят и уходят, и учатся, как правило, по документации, примерам и на собственной практике. Грамотный специалист должен уметь выбрать язык под конкретную задачу, поэтому думайте о языке, как об инструменте, каковым он и является.
На популярность ориентироваться тоже не стоит: это очень изменчивый критерий.
Книги выбирайте, основываясь на годе издания и отзывах и лучше читать в оригинале, если язык позволяет. Чем свежее книга, тем лучше, но учитывайте отзывы: книга может быть свежая, но бестолковая.
По C# обязательно надо прочитать Джеффри Рихтера, никто больше не даст глубокого понимания того, как это все внутри устроено. По крайней мере, мне в свое время его книга очень помогла.
Еще стоит читать "Совершенный код" Макконелла, "Рефакторинг" Фаулера, "Банду четырех", книги Дяди Боба очень хороши, например, "Чистая архитектура". Все это даст понимание, как проектировать и разрабатывать ПО.
Для общего развития (но абсолютно необязательно) можно почитать "Мифический человеко-месяц" и прочую литературу подобного рода, это если есть свободное время.
По алгоритмам, безусловно, Кормен, можно начать с его "Введения в алгоритмы", если основная книга покажется слишком сложной. Скиена и Род Стивенсон очень хороши.
По архитектуре Таненбаум, книга так и называется и ее достаточно.
Дискретная математика - Хаггарти, тоже достаточно, дальше сами разберетесь, куда двигаться.
По вышке и физике берите советских авторов, например, "Курс высшей математики" Смирнова, Ландафшица. Но это, если ориентируетесь на геймдев, обычному разрабу вышка и физика постольку поскольку. А в вебе ни то ни другое вообще не нужны.
По устройству ОС можно почитать Руссиновича, этого будет достаточно, поскольку C# - это Windows. Захотите углубиться в теорию и практику на примере Minix: Таненбаум.
По сетям Олиферы или Таненбаум. Обе хороши, выбор - дело вкуса.
И практика, практика и еще раз практика. Ни одна, даже самая лучшая книга, вас ничему не научит, если не будете практиковаться. Есть куча сайтов с задачами, берите и решайте.
И учитесь пользоваться поиском. Все вышеизложенное легко ищется в том числе и на тостере.

PS: хочу дополнить прекрасной статьей на хабре, которую прочитал только что: https://habr.com/ru/post/456342
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
inoise
@inoise
Solutions Architect, AWS Certified, Hybrid Cloud
1. Гуглить по тостеру никого не учили видимо, опять
2. Выбирай что хочешь - перспективны не технологии, а люди с головой, не задающие таких вопросов
3. Люди, идущие в IT за деньгами не зарабатывают
4. Нет универсальных или проверенных тропинок - пробуй, набивай шишки и учись на них. Будут конкретные затычки в процессе - задавай тут, не стесняйся
Ответ написан
@CasperIsNotAGoodGhost
Не тратьте время на составление плана. Если в ходе обучения, каких то знаний будет не хватать, подтянете при необходимости. Вообщем не парьтесь и делайте.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы