Путь в программисты (С++)

в 8:45, , рубрики: c++, изучение языков, интервью, Карьера в IT-индустрии, Программирование, стать программистом

Привет. С вами я. Мне нравилось боксировать и бегать на дальние дистанции, и думал я только о спорте, но выучился на моряка. Работал в авиации, а стал программистом С++ в 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; исключения в деструкторе/конструкторе; где уместен trycatch; сопоставление хэш таблиц и 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х часов. На этой волне было легко эмоционально. Мне не представлялось это как будто ты должен влезть в лямки и тащить этот груз, или же пробиваться… нет. Ничего вообще внутри не было, я просто, просто учился, как в магазин ходить- это ведь не цель и мотивация для этого не нужна, просто шлёпаешь в магаз и всё. Вот и я — просто шёл.

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

В заключение, хотел бы оставить этот ролик здесь «пока мы работаем, мы живём».

Пока.

Автор: Евгений

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js