Новый/Старый динозавр на с++
Как я решил опять стать программистом и закончил Яндекс Практикум по С++
Вкратце опишу, как я к этому пришел в 46 лет.
В 90-х, когда я учился в институте я был повернут на программировании. Началось это еще в школе, когда я заполучил в собственность компьютер Спектр 001 с 32 килобайтами(!) памяти, в котором было три игры, язык бейсик и описание ассемблера. Три игры наскучили через три дня. Язык бейсик был изучен еще за месячишко и началось программирование в кодах.
В институте я устроился в компьютерную лабораторию через пару недель после начала первого курса и сразу попал в микро тусу любителей языка С. Затертая книжка Кернигана и Ричи переходила там из рук в руки и довольно быстро я углубился в написание систем защиты. Система DOS таковую не позволяла, поэтому все писалось своими руками - доступ на чтение/запись, доступ на исполнение, полная блокировка компа и всякие похожие вещи. До тех пор, пока я не купил случайно в книжном 3 тома Бьярна Страуструпа.
Открылся дивный мир объектно-ориентированного программирования. Первым пошел в свет "Питон"(игра, а не язык:)) который был объектом, благодаря чему в него можно было играть нескольким человекам. Множить питончиков на экране было приятно и легко. Дальше больше - библиотека окон под DOS, текстовый редактор. А потом у нас начался предмет "робототехника", куда я пришел делать лабу. Сел перед компом, где монитор был размером дюймов 7, клавиши нажимались на глубину 1.5 см и очередь на который была пару недель. Вернулся в компьютерный класс и накатал эмулятор процессора (уж позабыл как он там назывался на PDP-11). Все по-взрослому, со средой для дебага, работающими основными портами и экраном, где можно было писать мнемокодом а не цифровыми кодами. Преподаватель по робототехнике долго тестировал разные команды, в итоге поставил мне автомат по робототехнике и с тех пор лабы по ней проходили на PC.
Конечно, начитавшись Старуструпа, больше всего мне хотелось написать свой компилятор. Поэтому я делал дипломную работу систему создания тестов для учащихся, часть которого был «свой» язык программирования.
Немного жаль, что после всего этого я случайно устроился сисадмином и пошла совсем другая ветка моей постинститутской карьеры. Правда я все равно программировал, но на всякой ерунде – типа языка RSL – который изобрела компания R-Style для своих программ. Потом, так же по случаю, изучил Oracle в плане запросов и администрирования, потом немножко Java, а спустя какое-то время вообще вышел из IT и занялся бизнесом.
Не так давно релоцировался в Европу, а немножко загодя, понимая, что мне предстоит смена всего и вся, вытащил из закромов С++, который остался, пожалуй, каким-то незакрытым гештальтом и пошел в Яндекс Практикум на C++ девелопера.
Собственно о курсе.
С моим багажом знаний практикум поначалу казался легкой прогулкой. Я не работал, но совмещал учебу с релокацией, перевозом семьи, оформлением ВНЖ, устройством детей в школу и тому подобным. В итоге, первые спринты я делал в несколько раз быстрее, поэтому даже большие перерывы в 2 или 3 недели в моих подходах к учебе не приводили к сбоям.
Это меня расслабило. И очередной пропуск трех недель в середине курса полностью выбил меня из колеи. В момент дедлайна, я опустился на группу ниже и дальше, поняв, уже всю серьезность положения стал прямо-таки пахать. Сбоев больше не было, но вторая половина курса довольно плотная – да, я сдавал задания раньше дедлайна, но с разницей в несколько дней и не больше.
На удивление простым оказался диплом. Сделал его на неделю раньше, хотя поначалу казалось, что задание таково, что можно и не уложиться в сроки.
Яндекс подошел к курсам максимально серьезно, и в чем-то они разошлись с моими ожиданиями, а в чем-то нет.
Я представлял себе курсы с теорией на вебинарах и последующим воплощением всего этого на практике с возможностью оперативно обратиться к наставнику с вопросом.
У Яндекса все это было выведено на куда более крутой по автоматизации уровень – общение в слэке(теперь уже в Пачке, но сути не меняет), телеграм-каналы, тренажер, который автоматически проверяет все задания и ревьюверы, проверяющие задания в конце темы.
Но, как обычно, в больших схемах присутствуют и недостатки:
- Вебинаров было минимум. Некоторые из них проводили наставники, которые сильно плавали в тематике вебинара. По сути на доп вопросы они ответить не могли. Фактически основная теория была отдана на откуп студентам – довольно неплохо описана в виде текста, но за всем дополнительным нужно было идти в интернет и догадываться самим. У этого был побочный плюс – довольно быстро узнаешь все сайты с документацией, основные форумы и с++-тусовки.
- С наставниками была проблема. Понятно, что они не могут тебе отвечать круглосуточно, но время их ответа зачастую оставляло желать лучшего. Например, делаешь задание. Уперся в проблему. Час, два, три. Тщетно – не выходит. Пишешь в слэк/пачку часиков, например, в 5 вечера. Тишина. На следующий день часов в 10 наставник задает тебе уточняющий вопрос или дает совет, который не приводит тебя к решению. Часов в 15 ты отписываешься ему опять и ответ опять в 10 утра на следующий день. Так простейшее задание, на которое Яндекс явно отводил пару часов кодинга, ты можешь делать, например 3-4 дня. А если что посложнее, то и неделю. В общем и целом, если помощь наставников не нужна – идешь быстро. Если уперся – все, считай задержка на несколько дней.
-Тренажер. Это злой гений яндекс практикума. Невероятно крутая вещь. Написали его крутые люди. Но у него есть недостатки. По сути, тренажер штука – которая запускает твой код, применяет к нему кучу разных тестов, которые написали супер-тестировщики, и выводит в поток либо ошибки тестов, либо вожделенную надпись «Успех!». Если тренажер выводит «Успех!», то проблем нет. Но сообщения об непрошедших тестах зачастую малопонятны. По сути, вся сложность прохождения курса Яндекс практикума заключается в одной простой штуке: «Угадай, что имел ввиду тренажер». С ним довольно быстро осваиваешь diffchecker, потому как потерянный или лишний пробел или перенос строки можешь вызвать сообщение, в духе «Наташ, все упало». 99% помощи наставников посвящалась именно проблемам прохождения тестов в тренажере. Причем, сами тестов, ты, увы, не видишь. Иначе исправление было бы делом техники. Наверное, авторы хотели таким образом развить у студентов интуицию на всевозможные ошибки. Но, увы, развивалась лишь интуиция по разбору сообщений тренажера))
Вся моя задержка, из-за которой я откатился на одну когорту назад, в итоге, была обусловлена суммой этих факторов. Я знал, что на три недели у меня будут сложности с учебой и планировал потратить новогодние каникулы на кодинг, с тем что бы сделать все заранее. Но наставники в каникулы не работают. А тренажер, как раз наоборот. Тема была – параллельные вычисления. И я никак не мог побороть пол секунды лишнего времени выполнения своего кода. После каникул выяснилось, что наставники тоже сильно плавают в этом. Поэтому фактически я занялся подбором и угадыванием – какой код подсунуть тренажеру, чтобы он выполнялся на пол секунды быстрее. Все получилось. Но свои три недели я нагнать уже не смог.
Я не работал в крупных проектах с ревьюверами. Поэтому тема с ревьюверами была интересна. Ревьювер был крутой. Это был реально человек, с которым можно было подискутировать на тему «как лучше, как быстрее, как правильнее». Его опыт оказался неоценим. Прямо в этих строках передаю ему свою глубочайшую благодарность.
Теперь о содержании. Курс был построен очень круто. Наверное, как человек языка С, я бы начал преподавать и с++ с азов и указателей. Но тут было все с ног на голову. И это круто, потому что оказалось, например, что поисковый сервер ты можешь полностью написать, ни разу не применив *xx_ptr. Курс очень глубокий, задания варьируются от мелких – на экранчик, до больших проектов в десяток- полтора файлов исходников. Из интересного для меня лично:
- своя реализация всевозможных контейнеров – List, Vector – с глубоким погружением в суть вещей
-своя реализация optional, умных указателей – реально крутые задания. Так же позволили понять глубину проблемы, поработать с неопределенными параметрами.
-работа с JSON, XML. Опять-таки – не применение сторонних библиотек, а собственная реализация, позволившая охватить эти темы довольно глубоко.
-работа с изображениями bmp, jpeg и иже с ними. В бытность своей первоначальной практики я разбирал gif и bmp, а вот jpeg был тайной за семью печатями. Интернет тогда был в зачатках и документация по jpeg там не валялась. Закрыл гештальт.
-поисковый сервер. Конечно, покупая курс Яндекса – ты покупаешься на поисковый сервер. И он не подводит – я бы не назвал это погружение глубоким. К тому же это происходит в первой половине курса. Однако, все равно было интересно прикоснуться хоть краешком к святая святых Яндекса.
-Транспортный справочник. Первоначально простенький, он развивается в течение курса в огромного дикого монстра. Да, может быть, часть вещей в нем чисто учебные, но результат оказался крутой. Строим маршруты, считаем оптимальные. Сохраняем на диск, считаем, все это через JSON и использование сторонней библиотеки protobuf
-Ну и дипломный проект в виде этакого бэкэнда экселевской таблицы. Вся его сложность заключалась в использовании сторонней библиотеки ANTLR, которая занималась синтаксическим разбором формул. Все это было безумно занятно.
Из сложностей последней четверти курса – использование CMake. Когда я последний раз касался с++, это был вообще borland c++, хотя я экспериментировал с MS Visual тогда и с Watcom. Да, мы тоже писали свои батнички make, но это просто ничто по сравнению с махиной CMake. В курсе основная сложность была в том, что теперь компиляторов много, как и платформ. Но при том, что половина, наверное, студентов сидит на MS Visuаl Studio, никаких указаний, как собственно, собрать проект с внешними библиотеками в VS, Яндекс не дает. С этим пришлось провести не одну ночь. Так что, наверное, следующий мой пост будет посвящен этой теме.
Доволен ли я курсом? Очень. Считаю, что знания мне отгружали лопатами. А там уж кто что смог взять – тут дело каждого. Все инструменты для этого были.
Что буду делать дальше? Жду диплома. Пилю карьерный трек, который можно пройти в рамках курса – резюме, портфолио и иже с ними. Завел профиль на upwork, буду пробовать там брать небольшие задания для начала. Дальше будет видно, но я энтузиаст и настроен оптимистично.
Всем пис.