- PVSM.RU - https://www.pvsm.ru -
Привет. С вами я. Мне нравилось боксировать и бегать на дальние дистанции, и думал я только о спорте, но выучился на моряка. Работал в авиации, а стал программистом С++ в 29. Расскажу, как так получилось.
О программировании к октябрю 2017 я знал ровно столько, сколько сейчас о квантовой физике- ничего. Абсолютно. «hello world»- даже не слышал о такой фразе. Время от начала обучения до трудоустройства — полтора года.
Почему решил расписать свое обучение?- потому что знаю по себе, как тяжело найти хорошую работу в СНГ. Мест, где есть карьерный рост, нормально оплачивается труд в инженерии и смежных областях я не встретил, везде ты просто рабочий, всем до одного места на твои амбиции, желание повысить квалификацию, как-то вырасти.
Особенно этот пост пишу с мыслями о земляках в Сибири и на Дальнем Востоке, так как там с хорошей работой тяжелее дважды, о людях с ограниченными возможностями, которые не могут жить полноценной жизнью не только из-за своих физических ограничений, но и из-за того, что у них нет возможности работать на нормальной должности и чувствовать себя уверенно в том, что завтра ты не пропадешь, ты нужен, тебя ценят. К слову, мой коллега имеет инвалидность по зрению и работает вполне успешно. Поэтому, для некоторых, я уверен, подойдет мой копи-паст учебы. Сразу опишу его, потом остальное.
Что нужно, чтобы начать: доступ в интернет (можно и не постоянный, просто загрузить страницу), старенький компьютер 10- летней давности подойдет, высшее образование для трудоустройства не обязательно для 30% вакансий в России. И около года времени на учебу, если заниматься продуктивно. Не верьте обучалкам «стать программистом за 1-4 месяца», это невозможно. Работа программиста далеко не заканчивается на знаниях синтаксиса ЯП (язык программирования).
Помимо ЯП, нужен язык английский. Если вы не решили с чего начать, то с английского и начните.
Я повышал знания с помощью чтения и перевода текстов, использовал андроид приложение — Smart Book [1]. И скачал игру на телефон, в которой много текста, переключил на английский и вот таким образом повышал словарный запас. Игра — Exiled Kingdoms [2].
10 октября 2017 года впервые наткнулся на «уроки С++», в первую неделю потратил часов 40.
За учёбой проводил от 2 до 10 часов в будние дни, в выходные и отпуск занимался мало, либо даже не вспоминал об этом.
Начал с этого сайта [3] — там хорошие задачки.
Одновременно темы можно изучать и здесь [4].
half year later
Решил все задачи, кроме последнего уровня (там 3-4 только смог) — тут [5]. Вообще, на этом сайте лучший список задач, а также хорошее объяснение тем.
Когда тема совсем до вас не доходит, то советую смотреть урок этого преподавателя [6]. Отлично объясняет, поймет действительно любой. *не увлекайтесь видео уроками- бесполезно без практики.
Одновременно с решением задачек, через пол года обучения, решил закрепить тему массивов написанием консольного морского боя. Было трудно, сначала вся программа была около 1300 строк в одном .cpp файле. Со временем, походу обучения, я улучшал код и, в итоге, в резюме попал код в четырех файлах .h .cpp размером строк в 500.
Прошел почти год, я начал изучать библиотеку Qt. Написал свою читалку .fb2 файлов + там был встроен небольшой англо-русский переводчик с возможностью сохранять свои слова для повторения, удалять их, отображать то одну колонку слов, то другую, как удобно. Переключение между окнами с помощью кнопок, но без использования сигнально-слотовой связи. Написание этой программы позволило мне изучить SQL и немного html-разметку. Это тоже попало в резюме.
В это время уже настал 2019 год, и я начал отсылать резюме прямо в новогодние праздники (ридер-переводчик еще не был написан).
Во время его написания я также увлекся реализацией своих STL контейнеров и умных указателей (после первого провального собеседования понял, что без 11 стандарта и глубокого понимания STL делать на собеседованиях нечего).
У меня были реализованы: вектор, одно связный список, двух- связный список, unique_ptr, shared_ptr, auto_ptr. И после того, как я покопался во всем этом, чувствовать себя стал увереннее намного на собеседованиях, сильно помогло.
Всё это залил на гитхаб [7] (пользоваться гитом легко, но изучение может занять не малое время), в итоге, в резюме было следующее- позорный морской бой, «проект» ридер-переводчик, реализация STL + smart_pointers (только по STL и SmartPointers мне задавали вопросы, указывали ошибки, просили исправить их прямо на собеседовании, было интересно обсуждать. На остальные мои «писульки» никто внимания не обратил).
+ я немного, совсем поверхностно, старался изучить основные паттерны (на собеседовании вопрос о паттернах всегда был под звездочкой), устно мог рассказать про MVC, MVP (но различия объяснить не мог), и 3-4 основных порождающих паттерна- вот хороший сайт [8] по паттернам. Этот [9] ещё и красиво оформлен.
Также, я прослушал и законспектировал лекции по углубленному программированию [10].
И выучил около 15 различных сортировок (на самом деле знал наизусть 5- остальные только с помощью шпор).
Мне очень в изучении помогали два форума, пользуюсь ими и сейчас- cyberforum [11], evileg [12].
За всё время обучения лишь 6 раз обратился для разъяснения некоторых тем к частному репетитору С++ (около 1500р одно занятие), 5 из этих занятий были по Qt (туго он мне давался тогда и некоторое время после трудоустройства). После нового года я начал посещать курсы английского. В месяц на индивидуальные занятия английского тратил примерно 3000р.
Советую:
16 мая 2019 я устроился на работу после 6 собеседований (4 неудачных), был офер в Питер, я выбрал город проживания.
ссылки:
purecodecpp.com [3] — теория, практика
ravesli.com [4] — теория
cppstudio.com/cat/285 [5] — в основном задачи
www.youtube.com/playlist?list=PLrCZzMib1e9qjGLjg83bCksf3N7FIy7jg [10] — углубленное изучение плюсов
cpp-reference.ru/patterns [13] — паттерны
refactoring.guru/ru/design-patterns/catalog [9] — паттерны (с визуализацией)
www.youtube.com/channel/UCtLKO1Cb2GVNrbU7Fi0pM0w [6] — ролики, в которых темы объясняются более детально.
www.cyberforum.ru/cpp-beginners [14]
evileg.com [12] — форумы, где вам помогут.
По поводу Qt, если вы, как и я, решите его изучать и хотите к началу работы действительно иметь хорошее, пусть и поверхностное, представление, то советую разобраться в архитектуре модель/представление — model/view (кстати, не плохое будет начало для изучения паттернов MVC model/view/controller, MVP model/view/presenter). Эта архитектура- как бы упрощенный паттерн MVP.
Информация здесь [15]. Её не так много, но у меня ушли месяцы на то, чтобы более менее уверенно пользоваться всеми благами Qt.
Ничего этого я не знал до трудоустройства, но советую вам изучить.
Моё резюме [16] в том виде, в котором оно попало на стол моему работодателю. Ничего в нём не менял, кроме ссылки на ГитХаб и номера телефона.
Резюме рассылал по всей стране, чтобы увеличить шансы трудоустройства. Собеседования все проходил по удалёнке. Но устроился в итоге без собеседования в городе проживания. Работодателя просто устроило то, что было в резюме.
Резюме во время поиска работы переписывал много раз.
Основные рекомендации:
Рассылал примерно по 20 резюме в неделю. Иногда, после плохих собеседований, делал перерыв (один был месяца полтора), чтобы подтянуть знания и потом рассылал снова.
Работодателю, на которого работаю сейчас, я отсылал резюме в марте, оно было без ответа. Позвонили мне в мае.
С чем я подошел к этому этапу в IT — Стек знаний (а может куча?), что касаемо программирования: всё основное в ООП, 11 стандарт плюсов, STL, поверхностно Qt (не умел пользоваться даже сигнально/слотовыми соединениями), основные запросы SQL и git, паттерны, о которых писал выше.
Более подробно (переписываю то, что у меня на шпорах к собеседованиям было, на каждый пункт один-два листа): auto, decltype [17]; forward [18]; explicit [19]; noexcept; mutable; {deque, stack, queque, unordered_map} — выучил зачем-то все методы этих классов отсюда [20]; перегруженные функции/перегрузка операторов; шаблонные классы/функции; всё о «виртуальности» в ООП (функции, классы, чисто виртуальные функции и пр); всё о конструкторах (конструктор копирования, делегирующий коструктор, перемещающий и пр); отключение копирования в классе; 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х часов. На этой волне было легко эмоционально. Мне не представлялось это как будто ты должен влезть в лямки и тащить этот груз, или же пробиваться… нет. Ничего вообще внутри не было, я просто, просто учился, как в магазин ходить- это ведь не цель и мотивация для этого не нужна, просто шлёпаешь в магаз и всё. Вот и я — просто шёл.
Главное, что я усвоил из бокса и это помогло мне выучиться, и настроить себя именно так- побеждает тот, кто больше работает. Тот, кто ставит в ринге перед собой какие-то задачи, решает их, каждую секунду чем-то занят, а не просто там позирует, тот и побеждает. И это проецируется на всё в нашей жизни.
В заключение, хотел бы оставить этот [21]ролик здесь «пока мы работаем, мы живём».
Пока.
Автор: Евгений
Источник [22]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/352155
Ссылки в тексте:
[1] Smart Book: https://play.google.com/store/apps/details?id=com.kursx.smartbook&hl=ru
[2] Exiled Kingdoms: https://play.google.com/store/apps/details?id=net.fdgames.ek.android&hl=ru
[3] сайта: https://purecodecpp.com
[4] здесь: https://ravesli.com
[5] тут: http://cppstudio.com/cat/285/
[6] смотреть урок этого преподавателя: https://www.youtube.com/channel/UCtLKO1Cb2GVNrbU7Fi0pM0w
[7] гитхаб: https://github.com
[8] хороший сайт: http://cpp-reference.ru/patterns/creational-patterns/
[9] Этот: https://refactoring.guru/ru/design-patterns/catalog
[10] лекции по углубленному программированию: https://www.youtube.com/playlist?list=PLrCZzMib1e9qjGLjg83bCksf3N7FIy7jg
[11] cyberforum: https://www.cyberforum.ru
[12] evileg: https://evileg.com
[13] cpp-reference.ru/patterns: http://cpp-reference.ru/patterns/
[14] www.cyberforum.ru/cpp-beginners: https://www.cyberforum.ru/cpp-beginners
[15] здесь: https://webhamster.ru/mytetrashare/index/mtb0/1392580691nchkxju7yz
[16] Моё резюме: https://voronezh.hh.ru/applicant/resumes/view?resume=920968feff058ff0f30039ed1f684d4872776e
[17] auto, decltype: https://habr.com/ru/post/206458/
[18] forward: https://habr.com/ru/post/242639/
[19] explicit: https://habr.com/ru/post/436296/
[20] отсюда: https://en.cppreference.com/w/
[21] этот : https://www.youtube.com/watch?v=J_9Hhfdxk_Q
[22] Источник: https://habr.com/ru/post/497158/?utm_source=habrahabr&utm_medium=rss&utm_campaign=497158
Нажмите здесь для печати.