Привет всем читающим! Здесь я хочу поведать вам о своей истории как я искал себя в IT - чем хочу заниматься, в каком направлении развиваться и все подобные вопросы.
Уже глядя на список литературы, который я прочитал за это время, можно понять, что я попробовал несколько, а может даже и много направлений (список есть в конце статьи).
Началось все в 2018 году, когда я поступал в универ. Я, думаю как и многие, начал с разработки сайтов. Я учился верстать странички, писать стили и какую-то логику на php. Этим я занимался все лето перед поступлением и это был мой первый опыт работы с каким-то кодом.
С началом первого курса интерес к сайтам начал пропадать, и я начал интересоваться C++ и программированием. Я начал учить синтаксис, возможности языка, какие-то базовые вещи по типу массивов, указателей, работы с файлами и прочим. Придумывал себе задачи и решал их. Одной из первых была подсчет и ранжирование слов в тексте. После того, как я хоть в какой-то степени понял что такое программирование, я полез в ООП. Но на C#.
На втором семестре универа меня завлекло машинное обучение. Но тогда я решил попробовать решить задачку так, как я это видел, вместо того, чтобы почитать книжки или посмотреть лекции. В общем, я хотел научить компьютер играть в крестики-нолики. Простая задача, но не для того, у кого 0 знаний и понимания как устроен ИИ. Мое решение выглядело как простой алгоритм с использованием файлов и статистики. После я все же прочитал книгу [12] и посмотрел некоторые видео, пообщался с преподом на эту тему. С преподавателем я начал дальше работу в сторону машинного обучения, он давал мне какие-то задачи на потренироваться, я строил глубокие нейросети, сверточные, читал про рекуррентные нейросети и т.д, даже написал НИР и курсовую на эти темы.
Параллельно с этим, во время локдауна мне было интересно как устроены библиотеки Keras и TensorFlow внутри (библиотеки для построения нейронных сетей). У меня было полно времени, поэтому я взялся гуглить. Прочитал книжку [11] о программировании на GPU. Решил написать с нуля простенькую нейронку с вычислениями на графических процессорах. Было сложно, но я это сделал, не знаю зачем, но сделал.
Еще в универе нам предподавали ассемблер, мне даже немного понравилось, темой курсача я выбрал "Вывод изображения формата TIFF на экран в OS Linux", с чем успешно справился. Но быстро понял, что у ассемблера будущего нет.
После этих двух случаев, я понял, что занимался чем-то, что не принесло мне реальной пользы. Ну да, я заимел представление как это делается, но четкого смысла в этом не было. Мне было интересно машинное обучение и нейросети, и можно было бы не тратить время на написание готовых библиотек с нуля для интереса.
Летом я подумал, что помимо умения строить и понимать работу нейронных сетей, нужно еще хотя бы иметь представления о разраобтке информационных систем. Я опять придумал себе задачу - электронная библиотека. Я взял в руки C# и его WPF для написания десктопного приложения, и EF Core для работы с бд. Эта работа потом пошла на написание курсача.
Я решил углубиться в C# и прочитал книгу [2]. В целом, она дала понимание как устроен C# и что происходит при вызове определенных функций или создания строки. Я подумал, что преуспел над остальными в своем универе и познал эту сферу и осталось только убедиться, что я красиво пишу код, поэтому я прочитал еще 2 книги [3,4].
Спустя еще год, был уже 4 курс, нам преподавали курс по микроконтроллерам. Не сказать, что мне сильно понравилось, но было интересно. Пары были на предприятии, предподавали молодые парни, которые работали там несколько лет. К концу семестра меня позвали к ним работать, на что я согласился, т.к. подумал, что неплохо было бы получить какой-то опыт решения реальных задач и может быть работы в команде. Впоследствии я понял, что это не мое. Писать на чистом C и работать со схемами это не мое, хотя и неплохо получалось. Я продолжал работать, но также стал интересоваться какой бы еще язык программирования можно рассмотреть, потому что писать на C и C# было уже не так интересно. И по всем моим требованиям идеально подошел Go - многопоточность, работа на производительность, простота.
Я написал пару пет проектов простых, чтобы понять синтаксис. Также я подумал, что было бы неплохо закрыть пробел с алгоритмами и структурами данных. Да-да, это базовые вещи, но нам в универе их не пропадавали (за исключением алгоритма сортировки пузырьком и стека с очередью), а я все это время периодически решал задачи на codewars, думая, что это алгоритмы... В общем, я прочитал [7] и осмелился попробовать пройти на стажировку в Яндекс. Меня позвали на интервью, где я решал алгоритмечкие задачки, после второго интервью мне отказали. Посоветовали порешать задачи на leetcode, что я потом 2 месяца бесперерывно и делал.
Спустя эти 2 месяца, я закончил универ, все еще работал на предприятии, но перестал писать под микроконтроллеры. Мне предложили писать код на C++ и решать задачки, в которых требовалось быстрое выполнение. Спустя еще 2 месяца я второй раз попробовал пройти на стажировку в Яндекс. Тут уже была одна АА секция, после которой меня позвали познакомиться с командами и меня взяли.
Вот так и начался мой путь в этот прекрасный мир!
TL; DR
Если бы я начинал этот путь с нуля, я бы порекомендовал себе:
Если тебе что-то интересно - занимайся этим. Будет куча вещей, которые будут появляться на твоем пути, это тоже может быть интересно, но иногда это не стоит твоего времени.
Проходи стажировки в крупных компаниях. Я всегда думал, что попасть с Яндекс это супер сложно, и я этого пока не достоин. Однако, стоит разок попробовать, пофиксить проблемы и дальше ты уже сможешь попасть в любую крупную компанию (ну или почти). На время универа можно просто проходить стажировки летом, либо устроиться на 0.5 ставки. Стажировки более эффективны, чем твой простой интерес решать свои задачки.
Постоянно пиши код и решай алгоритмы (они помогут в собесах).
Что я прочитал за этот период:
PHP 7. Дмитрий Котеров, Игорь Симдянов.
CLR via C#. Программирование на платформе Microsoft .NET Framework 4.5 на языке C#. Джеффри Рихтер.
Совершенный код. Стив Макконнелл.
Чистый код. Создание, анализ, рефакторинг. Роберт Мартин
Чистая архитектура. Искусство разработки программного обеспечения. Роберт Мартин
Хакинг. Искусство эксплойта. Джон Эриксон
Алгоритмы. Теория и практическое применение. Род Стивенс
Грокаем алгоритмы. Адитья Бхаргана
Компьютерные сети. Виктор Олифер, Наталья Олифер
Паттерны объектно-ориентированного проектирования. Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес
Cuda by example. An introduction to General-Purpose GPU Programming. Jason Sanders, Edward Kandrot
Глубокое обучение. Погружение в мир нейронных сетей. С. Николенко, А. Кадурин, Е. Архангельская
Markscheider
Секунд до начала срача: 3..2..1..
Вы не шутите? На профильных (ИТ) специальностях не преподают алгоритмы?
diPhantxm Автор
Не шучу, в филиале МГТУ им. Баумана не преподают нормально алгоритмы
voldemar_d
Поэтому среди прочитанных книг нет Кнута?
miroshnichenko_me
Я вот тоже заметил, что Кнут подзабыт.
И если говорить об алгоритмах, то кто если не ОН!??
В универе читал библиотечные книги, а тут решил прикупить себе на полку. Был немного шокирован ценой четырех томов!
P.s. С универа помнится шутка: «Метод Кнута и Пряника» - Метод разработанный Кнутом и модифицированный Пряником!
voldemar_d
Вот я тоже не понимаю. Многие, похоже, не знают, что все основные алгоритмы были придуманы еще в 60-х, и ничего принципиально нового уже не придумать, разве что их какие-то частные оптимизации, комбинации и т.д. У Кнута всё разложено по полочкам, в том числе сложность алгоритмов.
Если я правильно помню, всего их семь. Последние 3 так и не переведены до сих пор, получается.