[Из песочницы] Путь в программисты (С++)
Привет. С вами я. Мне нравилось боксировать и бегать на дальние дистанции, и думал я только о спорте, но выучился на моряка. Работал в авиации, а стал программистом С++ в 29. Расскажу, как так получилось.
О программировании к октябрю 2017 я знал ровно столько, сколько сейчас о квантовой физике- ничего. Абсолютно. «hello world»- даже не слышал о такой фразе. Время от начала обучения до трудоустройства — полтора года.
Почему решил расписать свое обучение?- потому что знаю по себе, как тяжело найти хорошую работу в СНГ. Мест, где есть карьерный рост, нормально оплачивается труд в инженерии и смежных областях я не встретил, везде ты просто рабочий, всем до одного места на твои амбиции, желание повысить квалификацию, как-то вырасти.
Особенно этот пост пишу с мыслями о земляках в Сибири и на Дальнем Востоке, так как там с хорошей работой тяжелее дважды, о людях с ограниченными возможностями, которые не могут жить полноценной жизнью не только из-за своих физических ограничений, но и из-за того, что у них нет возможности работать на нормальной должности и чувствовать себя уверенно в том, что завтра ты не пропадешь, ты нужен, тебя ценят. К слову, мой коллега имеет инвалидность по зрению и работает вполне успешно. Поэтому, для некоторых, я уверен, подойдет мой копи-паст учебы. Сразу опишу его, потом остальное.
Что нужно, чтобы начать: доступ в интернет (можно и не постоянный, просто загрузить страницу), старенький компьютер 10- летней давности подойдет, высшее образование для трудоустройства не обязательно для 30% вакансий в России. И около года времени на учебу, если заниматься продуктивно. Не верьте обучалкам «стать программистом за 1–4 месяца», это невозможно. Работа программиста далеко не заканчивается на знаниях синтаксиса ЯП (язык программирования).
Помимо ЯП, нужен язык английский. Если вы не решили с чего начать, то с английского и начните.
Я повышал знания с помощью чтения и перевода текстов, использовал андроид приложение — Smart Book. И скачал игру на телефон, в которой много текста, переключил на английский и вот таким образом повышал словарный запас. Игра — Exiled Kingdoms.
10 октября 2017 года впервые наткнулся на «уроки С++», в первую неделю потратил часов 40.
Учёба. Шаг за шагом
За учёбой проводил от 2 до 10 часов в будние дни, в выходные и отпуск занимался мало, либо даже не вспоминал об этом.
Начал с этого сайта — там хорошие задачки.
Одновременно темы можно изучать и здесь.
half year later
Решил все задачи, кроме последнего уровня (там 3–4 только смог) — тут. Вообще, на этом сайте лучший список задач, а также хорошее объяснение тем.
Когда тема совсем до вас не доходит, то советую смотреть урок этого преподавателя. Отлично объясняет, поймет действительно любой. *не увлекайтесь видео уроками- бесполезно без практики.
Одновременно с решением задачек, через пол года обучения, решил закрепить тему массивов написанием консольного морского боя. Было трудно, сначала вся программа была около 1300 строк в одном .cpp файле. Со временем, походу обучения, я улучшал код и, в итоге, в резюме попал код в четырех файлах .h .cpp размером строк в 500.
Прошел почти год, я начал изучать библиотеку Qt. Написал свою читалку .fb2 файлов + там был встроен небольшой англо-русский переводчик с возможностью сохранять свои слова для повторения, удалять их, отображать то одну колонку слов, то другую, как удобно. Переключение между окнами с помощью кнопок, но без использования сигнально-слотовой связи. Написание этой программы позволило мне изучить SQL и немного html-разметку. Это тоже попало в резюме.
В это время уже настал 2019 год, и я начал отсылать резюме прямо в новогодние праздники (ридер-переводчик еще не был написан).
Во время его написания я также увлекся реализацией своих STL контейнеров и умных указателей (после первого провального собеседования понял, что без 11 стандарта и глубокого понимания STL делать на собеседованиях нечего).
У меня были реализованы: вектор, одно связный список, двух- связный список, unique_ptr, shared_ptr, auto_ptr. И после того, как я покопался во всем этом, чувствовать себя стал увереннее намного на собеседованиях, сильно помогло.
Всё это залил на гитхаб (пользоваться гитом легко, но изучение может занять не малое время), в итоге, в резюме было следующее- позорный морской бой, «проект» ридер-переводчик, реализация STL + smart_pointers (только по STL и SmartPointers мне задавали вопросы, указывали ошибки, просили исправить их прямо на собеседовании, было интересно обсуждать. На остальные мои «писульки» никто внимания не обратил).
+ я немного, совсем поверхностно, старался изучить основные паттерны (на собеседовании вопрос о паттернах всегда был под звездочкой), устно мог рассказать про MVC, MVP (но различия объяснить не мог), и 3–4 основных порождающих паттерна- вот хороший сайт по паттернам. Этот ещё и красиво оформлен.
Также, я прослушал и законспектировал лекции по углубленному программированию.
И выучил около 15 различных сортировок (на самом деле знал наизусть 5- остальные только с помощью шпор).
Мне очень в изучении помогали два форума, пользуюсь ими и сейчас- cyberforum, evileg.
За всё время обучения лишь 6 раз обратился для разъяснения некоторых тем к частному репетитору С++ (около 1500р одно занятие), 5 из этих занятий были по Qt (туго он мне давался тогда и некоторое время после трудоустройства). После нового года я начал посещать курсы английского. В месяц на индивидуальные занятия английского тратил примерно 3000р.
Советую:
- Не обращаться к платным курсам по программированию- зря потратите деньги. Сделал такой вывод из просмотра некоторых из них, по многочисленным отзывам. Компания, в которой работает моя жена, прибегла к услугам одной из таких компаний для обучения сотрудников Python — такой там кавардак.
- Не нужно зависать в видео уроках, я прошел около 250 уроков (один урок от 10 мин до 1 часу) — на это ушло примерно полтора месяца, считай потерянное время, хватило бы и 30. Смотрите объяснение тех тем, которые плохо понимаете и чувствуете, что вам нужно более детально в этом разобраться.
- Больше пишите код, постоянно решайте задачи, каждый день.
- Как только пройдете основные темы- начните писать свой проект.
- Изучение программирования по книгам для меня было неприемлемо потому, что это слишком долго и, в моем случае, было совершенно не понятно о чем в книгах речь, тк у меня были совершенно нулевые знания в этой сфере. Если у вас нет времени, вы хотите быстрее устроиться на работу, то книги не ваш друг. Книги обязательны в дальнейшем для повышения квалификации. После трудоустройства я прочел пару, но всё- равно предпочитаю изучать эту сферу не в такой вот литературе, а смотря в сети различные фичи и применять их уже непосредственно в проекте. Книги по программированию — это слишком нудно, скучно для меня, с огромным трудом осиливаю. Хотя, худ. литературу и историю могу читать без перерыва постоянно, лишь бы время было. В общем и целом, изучение программирования по книгам- это качественно, но долго и требует большого терпения и усидчивости, у меня терпение отсутствует абсолютно и был ограничен во времени- я хотел успеть до 30.
- учить С, чтобы потом учить С++ не надо. К тому же, вакансий по С нет. С- deprecated.
16 мая 2019 я устроился на работу после 6 собеседований (4 неудачных), был офер в Питер, я выбрал город проживания.
ссылки:
purecodecpp.com — теория, практика
ravesli.com — теория
cppstudio.com/cat/285 — в основном задачи
www.youtube.com/playlist? list=PLrCZzMib1e9qjGLjg83bCksf3N7FIy7jg — углубленное изучение плюсов
cpp-reference.ru/patterns — паттерны
refactoring.guru/ru/design-patterns/catalog — паттерны (с визуализацией)
www.youtube.com/channel/UCtLKO1Cb2GVNrbU7Fi0pM0w — ролики, в которых темы объясняются более детально.
www.cyberforum.ru/cpp-beginners
evileg.com — форумы, где вам помогут.
По поводу Qt, если вы, как и я, решите его изучать и хотите к началу работы действительно иметь хорошее, пусть и поверхностное, представление, то советую разобраться в архитектуре модель/представление — model/view (кстати, не плохое будет начало для изучения паттернов MVC model/view/controller, MVP model/view/presenter). Эта архитектура- как бы упрощенный паттерн MVP.
Информация здесь. Её не так много, но у меня ушли месяцы на то, чтобы более менее уверенно пользоваться всеми благами Qt.
Ничего этого я не знал до трудоустройства, но советую вам изучить.
Резюме
Моё резюме в том виде, в котором оно попало на стол моему работодателю. Ничего в нём не менял, кроме ссылки на ГитХаб и номера телефона.
Резюме рассылал по всей стране, чтобы увеличить шансы трудоустройства. Собеседования все проходил по удалёнке. Но устроился в итоге без собеседования в городе проживания. Работодателя просто устроило то, что было в резюме.
Резюме во время поиска работы переписывал много раз.
Основные рекомендации:
- Не перечисляйте множество рабочих мест, я, например, удалил свой опыт работы за границей моряком, т.к. общая картина резюме сильно резонировала- казалось будто бы человек скачет из крайности в крайность, то вот он моряк, то вот своим делом занялся, а тут вдруг уже в авиации и ищет работу программистом. После того, как причесал резюме под одну сферу- монтажник, откликов стало примерно на треть больше.
- Не указывайте подработку/промежуточные места работы.
- Не умоляйте взять вас на работу. Видел такое во множествах резюме соискателей. Описывайте суть, по вашему резюме работодатель должен понять кто вы, как специалист в первую очередь и также можно передать основное о себе, например, ваш характер. Я старался через своё резюме передать посыл работодателю о том, что я серьезно настроен стать специалистом в этой области. Остальное никому не интересно.
- Деловой стиль в резюме и общении с работодателем, по-моему, самый подходящий.
- Не врите в резюме о том, какой вы крутой программист. Всё обязательно всплывёт на собеседовании. В остальном — можно приукрашивать, никто не узнает. Правдивость моего резюме в том, что не касается программирования — процентов 80. К примеру, в резюме указано, что ИП я занимался почти 5 лет, но это не правда. Я занимался этим ровно одно лето, потом всё загнулось, т.к. в Сибири у народа просто нет денег на услуги. Я продолжил заниматься этим же, но уже в Воронеже на своего товарища. А потом просто подрабатывал у него время от времени. Но кому какое дело? Основное- года 3 я был в сфере монтажа всего, что связано с IT. Это и отображено. А 2 года до этого работал в море, месяц консультантом у провайдера, 2 недели грузчиком, 3 недели консультантом на телефоне в компании по доставке грузов, во время учебы 4 года барменом, пару месяцев на буксире в порту Владивостока, перед трудоустройством 2 года в авиации очень хотел сделать карьеру и много где еще за последние 14 лет, но это не нужно знать работодателю- лишняя инфа, не относящаяся к программированию. Все живут в похожих условиях и все крутятся, как могут, меняют профессию — ищут деньги — это СНГ, под лежачий камень вода тут не течёт. Поэтому, я написал так, как написал и сделал правильно.
- Укажите свои достижения. Если вы крутой художник, почему не указать? Вы чего-то достигли, вы молодец.
- Не указывайте свои недостатки.
- Качественная фотография для портфолио. Не мой, конечно, случай :-), но, я был близок к тому, чтобы потратить тысяч 5 на фото-сессию для нормальной фотографии в резюме.
Рассылал примерно по 20 резюме в неделю. Иногда, после плохих собеседований, делал перерыв (один был месяца полтора), чтобы подтянуть знания и потом рассылал снова.
Работодателю, на которого работаю сейчас, я отсылал резюме в марте, оно было без ответа. Позвонили мне в мае.
Собеседования
С чем я подошел к этому этапу в IT — Стек знаний (а может куча?), что касаемо программирования: всё основное в ООП, 11 стандарт плюсов, STL, поверхностно Qt (не умел пользоваться даже сигнально/слотовыми соединениями), основные запросы SQL и git, паттерны, о которых писал выше.
Более подробно (переписываю то, что у меня на шпорах к собеседованиям было, на каждый пункт один-два листа): auto, decltype; forward; explicit; noexcept; mutable; {deque, stack, queque, unordered_map} — выучил зачем-то все методы этих классов отсюда; перегруженные функции/перегрузка операторов; шаблонные классы/функции; всё о «виртуальности» в ООП (функции, классы, чисто виртуальные функции и пр); всё о конструкторах (конструктор копирования, делегирующий коструктор, перемещающий и пр); отключение копирования в классе; move () семантика, ссылки (lvalue, rvalue, xvalue, glvalue, prvalue); std: forward; исключения в деструкторе/конструкторе; где уместен try\catch; сопоставление хэш таблиц и map; static; defaul; override; mutable; reinterpret_cast; constexpr; volatile; передача временного объекта по умолчанию; основное о модульном тестировании.
Из уроков об углубленном программировании, ссылку на которые давал выше- работа препроцессора, компилятора, компоновщика, память на низком уровне, виртуальная память, выделение памяти на стеке/куче, malloc, new, глобальная память, inline, особенности работы современных компиляторов в общих чертах- что часто ваш код компилятор представляет и парсит совсем в другой виде, а не который вы написали, особенности передачи объектов по указателю/ссылки/конст ссылки, исходя из этого- выбор того, как передавать объект, лямбда- функции, std: function, основное об кастах, friend, функторы, final, ромбовидное наследование, множественное наследование.
Это только то, что в шпорах и записной книжке.
Многопоточное программирование не понял совершенно (на паре собеседований спрашивали мои навыки в этом, я сразу отвечал «знаю немного теории, не пользовался»). STL контейнера понимал без проблем- это понятно, тк писал свои контейнеры, но умные указатели всё-равно использовать не умел, я просто хорошо знал теорию по ним и как они устроены внутри.
Этапы собеседования
Так как я отправлял резюме по всей России, то и собеседования, соответственно, проходили удаленно. Как это происходит: вам звонят и просят уделить минут 5–15, общаются с вами на общие темы и, если все хорошо, вы договариваетесь о техническом собеседовании — это 2 этапа, но может быть и больше. К назначенной дате обклеивал шпорами весь монитор стикерами с алгоритмами сортировок, на столе/полу/стене/кресле на 360 градусов вокруг были наклеены шпоры. В шпорах было всё + на коленях моя книжка с лекциями, на каждой странице я проклеил заметки- что на ней можно подсмотреть. К слову, шпорами пользоваться не успевал, можете их писать, но не использовать. Быстрее вспомнить, чем сориентироваться в этом хаосе.
Про мой уровень английского меня не спросили ни разу, но я и не стучался в компании, где требовался разговорный английский.
Все собеседования проходили в скайпе без видео (наверное, так совпало у меня, мне кажется, в большинстве случаев собеседования проходят с видео). Первые 20 минут вам расскажут о компании и вы о себе. Потом, с вами соединится тимлид и начнет терзать вас, с самого простого «что такое полиморфизм?, напишите функцию сложения двух чисел» и подобную базу, затем, внезапно, попросит в вашу примитивную функцию добавить какую-то логику и так будет всё усложняться в течении следующих минут 40–50. Всё это будет смешано с вопросами по теории. Далее, вам могут прислать тестовое задание, или же его могут прислать до собеседования, а может и не пришлют. Через недельку после собеседования, или прохождения тестов, будет обратная связь о результатах.
Про тест- задания: мне несколько раз на почту приходили задания от каких-то непонятных компаний, как потом я понял, это просто были определенные таски, решение которых зальют себе в проект после рефакторинга. Проще говоря, вам скидывают задание в надежде, что вы бесплатно поработаете (вроде- «распарсите сайт», вытяните оттуда-то такие-то данные и скомпонуйте их так-то). Но есть и действительно настоящие тестовые, я решал в DrWeb и еще в какую-то компанию… решал, но не решил.
О некоторых собеседованиях расскажу.
Второе собеседование
Мое второе собеседование проходило в Нижнем Новгороде. Мне очень понравилось, как они описали себя, их сайт, сфера их деятельности и те люди, с которыми я общался. К сожалению, знаниями я не дотянул, но в общем и целом был удовлетворителен. После этого собеседования связался с менеджером и объяснил, что мне понравился контакт с ними, их компания и я бы хотел получить второй шанс, чтобы сотрудничать с ними в дальнейшем. Мне дали контакты того, кто проводил у меня тех интервью (не тим лид), и я связался с ним по скайпу. Сначала, я попросил его помочь мне в обучении за деньги, чтобы он подготовил меня к собеседованию у них, он не согласился. Договорились на том, что он даст основные темы для изучения и будет время от времени мне подсказывать. Иногда, я связывался с ним, и он проводил мне небольшую лекцию. Его ник был Елоу-Пуки. Если ты читаешь это, я тебе очень благодарен, ты сделал процентов 20 моей подготовки к трудоустройству! Крепко жму руку, не забуду твоей помощи. После месяца обучения с ним было назначено следующее собеседование и только на нем я понял- вакансия не программиста, а тестировщика. Меня спрашивали о чем-то мне непонятном, я не ответил ничего, расстроился, сказал спасибо Елоу-Пуки и начал готовиться к следующему собеседованию. Вообще, не понятно, как меня готовили к плюсовому разработчику зная, что вакансия тестировщик. Странный момент, но было так, как было.
Третье собеседование
Третье собеседование (в Москву, то ли в Нижний Новгород) было отвратительным. У них была включена камера, и я их троих наблюдал за круглым столом. Сразу стало понятно, что с моим резюме ознакамливаются только сейчас, до этого они его не видели. После вопроса о моем возрасте все вопросы по технической части не поднимались выше 2+2, после того, как узнали, что мне скоро 30 на лицах появились ухмылки, короче, я сильно был зол и честно, если бы был у них в офисе в такой момент, то непременно сделал бы замечание «чего смешного?», а может и что-то жесткое. С трудом дотерпел до конца и прервал диалог во время стандартного «мы пере…(звоним, наверное)». Помню в тот вечер пробил рукой дверь в комнате. Их поведение было оскорбительным.
Пятое собеседование
Пятое собеседование проходило в Питер. Общались долго, наверное часа полтора. Получил большое удовольствие от вопросов, собеседуемому действительно было важно докопаться до всех минусов в моих знаниях, спрашивал и низкоуровневую работу определенных моментов, и реализацию некоторых моих контейнеров, и указателей на гитхабе, просил исправить ошибки, некоторые моменты объяснял сам и я тут же записывал себе в черновик, чтобы не забыть. Через недели 2 был офер от них, но я так понял, что всё равно они не были уверены во мне на все 100, хотя, собеседование прошло гладко и я ответил на пару вопросов «со звездочкой».
Шестое собеседование
Мне позвонил Андрей (мой руководитель) и пригласил на собеседование. Я отпросился с работы на обеде, немного волновался (ведь с глазу на глаз я еще ни разу код не писал), но в целом был уверен, особенно, после предыдущего собеседования и зная, что у меня уже есть местечко. В руках у меня были все мои шпоры и книжка (зачем я это потащил с собой не знаю), а в итоге, мне просто рассказали о проекте, работе в целом и «когда сможешь выйти на работу?». В тот же день написал на увольнение. Выбрал работу в городе проживания, т.к. в начале небольшая зп, соответственно- потеря по деньгам и нужен съем квартиры, плюс с женой не хотелось совсем расставаться на долгий срок.
Остальные собеседования были просто неудачными, рассказать особо нечего, я плохо отвечал на вопросы и был красный, как помидор, из-за стыда.
Было также приглашение в intel Нижний Новгород, договорились на 19:00 для небольшого диалога по телефону. Позвонили мне в 18:20 примерно, когда я был за рулем, когда нажал «ответить» телефон завис, перезвонить не получилось, в назначенное время звонка также не поступило… ну, судьба значит. Написал им на мэйл об этой ситуации и попросил связаться еще раз, но мне не ответили.
Что хорошего в этой профессии?
Безграничный рост по квалификации, упереться в потолок не получится. Квалификационный рост конвертируется в финансовый. Со знанием английского открыты все двери. Комфортная атмосфера для работы. Ценят твоё рабочее пространство и не создают лишний шум, который отвлекает от работы- раньше у меня постоянно болела голова на работе, особенно напрягала музыка, отовсюду радио, а я люблю работать в тишине, теперь с этим проблем нет. Возможность работать удаленно, вот уже третий день карантина в регионе и я впервые на удалёнке- не плохо, иногда можно практиковать, но всё же удалёнка не моё, в офисе продуктивней, поэтому дома приходится перерабатывать, хотя, это же время тратится на дорогу в офис. Эта работа отлично подходит интровертам.
Плохого
Для меня только пару моментов- опыта мало, всё познается с трудом и постоянное чувство, что ты тупой тебя не покидает, поэтому приходится иногда перерабатывать (что меня не напрягает), чтобы наверстать задачи. Отсюда вытекает второй минус- уже два года с начала учебы я не тренируюсь практически- не всегда хватает времени, плюс сидячая работа, физически я убавил сильно.
О мотивации
Я не мотивировал себя абсолютно. Раньше, я постоянно мучал себя этими мотивациями, целями, ты должен не сдаваться, «лежать в сторону своей мечты» и прочим бредом!
На такой волне я не осуществил ни одной своей мечты и цели до конца, просто перегорал. А у меня, поверьте, было их так много. В этот раз всё было по другому. Не думал ни о какой цели, её будто бы не было, мотивации вообще для меня не существовало, было одно уверенное, спокойное- надо. И всё. Надо каждый день тратить на учёбу не менее 3х часов. На этой волне было легко эмоционально. Мне не представлялось это как будто ты должен влезть в лямки и тащить этот груз, или же пробиваться… нет. Ничего вообще внутри не было, я просто, просто учился, как в магазин ходить- это ведь не цель и мотивация для этого не нужна, просто шлёпаешь в магаз и всё. Вот и я — просто шёл.
Главное, что я усвоил из бокса и это помогло мне выучиться, и настроить себя именно так- побеждает тот, кто больше работает. Тот, кто ставит в ринге перед собой какие-то задачи, решает их, каждую секунду чем-то занят, а не просто там позирует, тот и побеждает. И это проецируется на всё в нашей жизни.
В заключение, хотел бы оставить этот ролик здесь «пока мы работаем, мы живём».
Пока.