Путь в программисты (С++)
Привет. С вами я. Мне нравилось боксировать и бегать на дальние дистанции, и думал я только о спорте, но выучился на моряка. Работал в авиации, а стал программистом С++ в 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.
- учить С, чтобы потом учить С++ не надо. К тому же, вакансий по С практически нет, а для начинающих тем более.
По поводу Qt, если вы, как и я, решите его изучать и хотите к началу работы действительно иметь хорошее, пусть и поверхностное, представление, то советую разобраться в архитектуре модель/представление — model/view (кстати, не плохое будет начало для изучения паттернов MVC model/view/controller, MVP model/view/presenter). Эта архитектура- как бы упрощенный паттерн MVP.
Информация здесь. Её не так много, но у меня ушли месяцы на то, чтобы более менее уверенно пользоваться всеми благами Qt.
Ничего этого я не знал до трудоустройства, но советую вам изучить.
Резюме
Моё резюме в том виде, в котором оно попало на стол моему работодателю. Ничего в нём не менял, кроме ссылки на ГитХаб и номера телефона.
Резюме рассылал по всей стране, чтобы увеличить шансы трудоустройства. Собеседования все проходил по удалёнке. Но устроился в итоге без собеседования в городе проживания. Работодателя просто устроило то, что было в резюме.
Резюме во время поиска работы переписывал много раз.
- Не перечисляйте множество рабочих мест, я, например, удалил свой опыт работы за границей моряком, т.к. общая картина резюме сильно резонировала- казалось будто бы человек скачет из крайности в крайность, то вот он моряк, то вот своим делом занялся, а тут вдруг уже в авиации и ищет работу программистом. После того, как причесал резюме под одну сферу- монтажник, откликов стало примерно на треть больше.
- Не указывайте подработку/промежуточные места работы.
- Не умоляйте взять вас на работу. Видел такое во множествах резюме соискателей. Описывайте суть, по вашему резюме работодатель должен понять кто вы, как специалист в первую очередь и также можно передать основное о себе, например, ваш характер. Я старался через своё резюме передать посыл работодателю о том, что я серьезно настроен стать специалистом в этой области. Остальное никому не интересно.
- Обязательна ссылка на гитхаб
- Деловой стиль в резюме и общении с работодателем, по-моему, самый подходящий.
- Не врите в резюме о том, какой вы крутой программист. Всё обязательно всплывёт на собеседовании. В остальном — можно приукрашивать, никто не узнает. Правдивость моего резюме в том, что не касается программирования — процентов 80. К примеру, в резюме указано, что ИП я занимался почти 5 лет, но это не правда. Я занимался этим ровно одно лето, потом всё загнулось, т.к. в Сибири у народа просто нет денег на услуги. Я продолжил заниматься этим же, но уже в Воронеже на своего товарища. А потом просто подрабатывал у него время от времени. Но кому какое дело? Основное- года 3 я был в сфере монтажа всего, что связано с IT. Это и отображено. А 2 года до этого работал в море, месяц консультантом у провайдера, 2 недели грузчиком, 3 недели консультантом на телефоне в компании по доставке грузов, во время учебы 4 года барменом, пару месяцев на буксире в порту Владивостока, перед трудоустройством 2 года в авиации очень хотел сделать карьеру и много где еще за последние 14 лет, но это не нужно знать работодателю- лишняя инфа, не относящаяся к программированию. Все живут в похожих условиях и все крутятся, как могут, меняют профессию — ищут деньги — это СНГ, под лежачий камень вода тут не течёт. Поэтому, я написал так, как написал и сделал правильно.
- Укажите свои достижения. Если вы крутой художник, почему не указать? Вы чего-то достигли, вы молодец.
- Не указывайте свои недостатки.
- Качественная фотография для портфолио. Не мой, конечно, случай :-), но, я был близок к тому, чтобы потратить тысяч 5 на фото-сессию для нормальной фотографии в резюме.
Собеседования
С чем я подошел к этому этапу в IT — Стек знаний (а может куча?), что касаемо программирования: всё основное в ООП, 11 стандарт плюсов, STL, поверхностно Qt (не умел пользоваться даже сигнально/слотовыми соединениями), основные запросы SQL и git, паттерны, о которых писал выше.
Более подробно (переписываю то, что у меня на шпорах к собеседованиям было, на каждый пункт один-два листа): auto, decltype; forward; explicit; noexcept; mutable; — выучил зачем-то все методы этих классов отсюда; перегруженные функции/перегрузка операторов; шаблонные классы/функции; всё о «виртуальности» в ООП (функции, классы, чисто виртуальные функции и пр); всё о конструкторах (конструктор копирования, делегирующий коструктор, перемещающий и пр); отключение копирования в классе; 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х часов. На этой волне было легко эмоционально. Мне не представлялось это как будто ты должен влезть в лямки и тащить этот груз, или же пробиваться… нет. Ничего вообще внутри не было, я просто, просто учился, как в магазин ходить- это ведь не цель и мотивация для этого не нужна, просто шлёпаешь в магаз и всё. Вот и я — просто шёл.
Главное, что я усвоил из бокса и это помогло мне выучиться, и настроить себя именно так- побеждает тот, кто больше работает. Тот, кто ставит в ринге перед собой какие-то задачи, решает их, каждую секунду чем-то занят, а не просто там позирует, тот и побеждает. И это проецируется на всё в нашей жизни.
В заключение, хотел бы оставить этот ролик здесь «пока мы работаем, мы живём».
Что нужно знать и уметь, чтобы стать разработчиком на С++
Про разработку на C++ ходит много слухов и мнений: одни говорят, что это очень сложно, другие — что это универсальный язык для всего, а третьи — что это самый лучший язык для начинающих. Мы решили разобраться, правда ли это и что нужно для того, чтобы стать разработчиком на C++.
Что такое C++
C++ — это язык программирования высокого уровня. Это значит, что он работает не напрямую с процессором (хотя такие возможности там есть), а с помощью привычных и понятных программисту команд, похожих на слова в английском языке.
Ещё C++ поддерживает ООП — там есть объекты, классы, свойства, методы и всё остальное. Это значит, что на нём можно реализовать любой современный алгоритм, используя всю мощь объектного программирования.
Сила С++ в том, что он позволяет напрямую работать с процессором, памятью и другим железом. Это позволяет писать на нём супербыстрые программы. Например, большинство популярных алгоритмов сортировок во многих языках написано на С++, потому что он напрямую работает с памятью и быстро работает с данными в ней.
Обратная сторона такой мощи — в сложности С++. Сам по себе язык не очень сложный, с простым синтаксисом, но для серьёзных задач нужно знать архитектуру процессора, устройство памяти, системные функции операционной системы и много других тонкостей.
Вот пример кода на С++:
#include #include using namespace std; const int INFINITE_ROOTS = -1; int solve_linear(double a, double b, double &root) < if (a == 0) return b == 0? INFINITE_ROOTS: 0; root = -b / a; return 1; >int main() < cout > a >> b;) < const int roots = solve_linear(a, b, x); if (roots == 0) cout return EXIT_SUCCESS; >
Что сейчас пишут на С++
За 40 лет существования языка в сфере разработки мало что поменялось: на С++ традиционно пишут критически важный софт:
- драйверы;
- операционные системы;
- приложения для встраиваемых систем (например, охранная сигнализация);
- высокопроизводительные серверы и сервисы;
- компьютерные игры и движки для них;
- языки программирования;
- компиляторы и интерпретаторы.
Один из основных профилей С++ — программы, в которых нужна максимальная скорость и производительность. Например, большинство банковских приложений по обработке транзакций написаны на C++, так же как и популярные базы данных — MongoDB и Redis.
Чем отличается C++-разработчик от всех остальных
Главное отличие С++-разработчика — в его кругозоре и глубоком знании внутренней работы процессора, памяти и компьютера в целом. В большинстве остальных языков такое погружение не требуется — программист просто подключает нужные библиотеки, а они делают за него всю работу. Это удобно, но сделать максимально быструю программу так не получится.
Программист на С++ тоже пользуется библиотеками, но большинство из них работает тоже на низком уровне, и ему всё равно нужно вручную предусматривать много ситуаций. Это сложнее, требует высокой квалификации, но по скорости готовых программ им часто нет равных.
Что нужно знать кроме С++
Чтобы хорошо программировать на C++, недостаточно знать только синтаксис и основные конструкции языка. Если разработчик хочет профессионально расти и развиваться, кроме этого нужно знать много разного.
Алгоритмы и структуры данных. Они помогут эффективно решать задачи и оптимизировать свой код. Важно иметь представление о различных типах данных, списках, стеках, очередях, деревьях, хеш-таблицах и других структурах данных, а также о популярных алгоритмах сортировки, поиска и обхода графов. К другим языкам это тоже относится, но для C++ это база.
Операционные системы. Если программист будет понимать, как в ОС управлять процессами, потоками, памятью и файлами, это позволит ему написать более быстрый и эффективный код.
Сетевая архитектура. Пригодится, если программе нужно будет работать с сетью и получать оттуда данные (или отправлять их). Для разных задач — разные сетевые протоколы.
Инструменты разработки. Тоже нужно всем, не только разработчикам С++. Сюда относятся отладчики, системы контроля версий (например, Git), среды разработки и средства автоматической сборки кода (например, CMake или Make).
Стоит ли выбирать С++ как первый язык
С одной стороны — да, это хороший язык для обучения: в нём хороший и понятный синтаксис, много документации, примеров и можно начать с несложных программ.
С другой — кроме самого языка нужно периодически разбираться с устройством памяти, указателями, ссылками, адресацией и прочими сложными терминами. Это требует больше времени, и некоторые понятия могут показаться сложными.
Наше мнение такое: если вам нужен первый язык программирования, после которого все остальные языки будет выучить гораздо проще, — начните с С++. Или если вы хотите сразу погрузиться в системное программирование — С++ будет отличным стартом.
Сколько платят
По данным Хабр Карьеры, средняя зарплата разработчика на C++ составляет 184 тысячи рублей. При этом новички получают в среднем 88 тысяч, а мидлы — в два раза больше, 172 тысячи:
Программист С (Си)

Программист C (Си) создает системное ПО, драйверы, прикладные программы, используя язык программирования C. Профессия со стопроцентным техническим уклоном, подойдет тем, кто любит информатику и математику. Кстати, недавно центр профориентации ПрофГид разработал точный тест на профориентацию, который сам расскажет, какие профессии вам подходят, даст заключение о вашем типе личности и интеллекте.
Читайте также

Краткое описание
Язык программирования Си был создан во второй половине XX века, но до сих пор не теряет актуальности. Как утверждают разработчики языка, к его преимуществам относятся:
Как узнать, подходит ли вам профессия «Программист С (Си)»?

- отличная читаемость;
- высокая производительность;
- гибкость.
Язык C создали для системного программирования. Он «легковесный», рассчитан на работу с кодом низкого уровня, поэтому идеально подходит для разработки операционных систем (ОС) и ПО микроконтроллеров. На С пишут драйвера, ядра ОС, библиотеки для суперпопулярного Python и других языков. На языке Си полностью написаны Windows, Linux, Mac OS, а iOS и Android – частично.
Мечтаешь создать свою игру?
Воплоти мечту в реальность вместе с XYZ School!

ЗИМНЯЯ РАСПРОДАЖА SKILLBOX
Cкидки до 60% на все курсы всех направлений, а также курс в подарок (с выполнением ДЗ) при покупке!
Еще одно направление использования языка C – проектирование встроенных систем. Си экономно потребляет ресурсы системы, благодаря этому написанные на нем программы выполняются без задержек и встроенные системы работают быстро. Плюс к этому Си кросс-платформенный, не привязан к конкретному микропроцессору или системе, поэтому встроенную программу можно компилировать в разных устройствах и платформах с небольшими изменениями или вообще без корректировок.
Как все эти достоинства применяются? Автомобили-беспилотники, сенсорные интерфейсы, всевозможные промышленные и бытовые приборы и целые системы, использующие технологию IoT (Internet of Things – Интернет вещей), например, автоматические осветительные приборы и системы орошения, «умный дом» – все это работает на встроенном ПО, написанном на C или C++. Соответственно, эти многочисленные сферы – поле для приложения навыков программирования на языке Си.
Особенности профессии
С развитием относительно новых языков программирования, таких как Python, Kotlin, Swift, PHP, Си стал терять лидирующие позиции монополиста. Многие молодые программисты и вовсе считают его мертвым языком, однако это далеко не так: на протяжении 40 лет он входит в список самых популярных языков, а синтаксис Си стал основой для создания Objective-C, C++ и C#.
Зима в ИПО скидки до 60%!
Государственный диплом Института профессионального образования. Рассрочка и индивидуальные скидки. Ведется набор студентов

ЗИМНЯЯ РАСПРОДАЖА SKILLBOX
Cкидки до 60% на все курсы всех направлений, а также курс в подарок (с выполнением ДЗ) при покупке!

Новогодняя акция! Скидки до 60% и «Тайный Санта»
Всеми любимый «Тайный Санта» здесь: те, кто приобрел у нас курс, получат курс в подарок и смогут подарить мини-курс своему другу.
Согласно рейтингам TIOBE и IEEE, язык C стабильно входит в пятерку самых востребованных языков программирования. В TIOBE включаются языки, на которых написано больше всего строк кода. IEEE для ранжирования использует больше критериев – популярность в вакансиях на сайтах поиска работы, упоминания в сервисах для программистов, соцсетях и другие (всего 11 метрик).
Обязанности программиста C такие же, как задачи любого другого разработчика:
- создание программ;
- отладка, исправление чужого кода;
- интеграция ПО;
- определение возможностей использования продуктов;
- ведение технической документации.
Востребованность программистов C средняя, действительно грамотных разработчиков не слишком много. Сложность обучения заключается в недостаточном количестве дидактических материалов, многие действительно полезные книги о языке C устарели. Поэтому программист должен безупречно владеть разговорным и техническим английским языком, чтобы иметь возможность общаться с иностранными разработчиками. Си – основа основ, если вы заинтересованы в его изучении, то стоит начать с книги «Язык программирования Си», написанной Б. Керниганом и Д. Ритчи – создателем языка C (новичкам она может показаться сложной, так как требует от читателя знания основ программирования).
Плюсы и минусы профессии
Плюсы:
- Действительно талантливый программист C без проблем найдет высокооплачиваемую вакансию.
- Люди, владеющие языком программирования Си, легко изучают и C++, и C#, и Objective-C, и другие языки.
- Профессия открывает перспективы трудоустройства в крупные компании, в которых можно работать в том числе и удаленно.
Минусы:
- Высокий порог вхождения, немного обучающей литературы и курсов.
- Работа малоподвижная.
Как стать c разработчиком

Для начала разберём преимущества и недостатки этого популярного языка программирования.
C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, переменные, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML.
Преимущества:
- Глубокая связь с Windows. Разрабатывая приложение на C#, можно не заботиться о проблемах с поддержкой – с высокой вероятностью оно заработает везде, где установлены требуемые версии компонентов .NET.
- Если на какой-то платформе есть проблемы с поддержкой, благодаря .NET их легко устранить.
- C# – компилируемый язык. Не имея доступа к исходным текстам, программу на нем сложнее взломать или модифицировать.
- C# легко учить: времени на освоение синтаксиса языка тратится намного меньше, чем, например, на С++. К тому же у C# большое комьюнити, в котором охотно помогают новичкам.

- C# – компилируемый язык. Это значит, что после любого изменения в коде придётся заново компилировать всю программу. Лучше заранее распланировать все связанные с разработкой действия.
- Язык является частью инфраструктуры .NET, поэтому для работы требуется установленная платформа и Windows. Можно писать и приложения для Linux, но все-таки чаще C# используют для создания кроссплатформенных продуктов и программ для операционных систем Microsoft.
- Из-за прекращения поддержки старых версий .NET нужно своевременно обновлять фреймворк до актуальных версий или придётся решать многочисленные проблемы совместимости.
.NET Framework и .NET Core
.NET Framework – созданная в Microsoft платформа, основанная на среде CLR (Common Language Runtime). CLR транслирует байт-код на CIL (Common Intermediate Language или высокоуровневый ассемблер) в машинный код во время исполнения. Все NET-совместимые языки высокого уровня и среды разработки должны (с некоторыми оговорками) уметь компилировать программы в промежуточный язык CIL. Его реализация от Microsoft называется MCIL, а виртуальная машина CLR также обеспечивает приложениям доступ к библиотеке классов .NET Framework.
Открытая модульная платформа .NET Core (теперь ее называют просто .NET) основана на .NET Framework и предназначена для разработки ПО под различные операционные системы. Ее можно использовать и для создания приложений с графическим интерфейсом, но, справедливости ради, для кроссплатформенного GUI есть гораздо более удобные инструменты. .NET Core больше подходит для веб-приложений, притом к ее преимуществам можно отнести уже упомянутую модульность, возможность работы в облаке, а также разделение библиотеки CoreFX и среды выполнения CoreCLR. Компоненты .NET Core обновляются отдельно, в то время как у .NET Framework обновление накатывается сразу на весь пакет.
.NET Framework:
- Работает с множеством готовых библиотек и инструментов – нужно лишь освоиться и ознакомиться с ними.
- Можно напрямую пользоваться различными функциями Windows.
- Из-за тесной интеграции с Windows отсутствует кроссплатформенность.
- Открытая платформа.
- Кроссплатформенность и модульность дают разработчику массу преимуществ. Например, создавая приложение для Windows, можно включить и необходимые модули для Linux.
- Код .NET переписан с нуля, что повышает быстродействие.
Существует также отдельная спецификация под названием .NET Standard, поддерживаемая всеми реализациями платформы .NET. По ней разрабатываются, например, совместимые с .NET Framework и .NET Core библиотеки.
Выбор инструмента сводится к решению конкретной задачи и долгосрочному планированию профессионального развития. Перед началом обучения стоит создать индивидуальную дорожную карту освоения специальности (roadmap).

Первые шаги
Если вам еще не приходилось заниматься разработкой, начинать придётся с азов: принципов объектно-ориентированного программирования, синтаксиса C#, оформления кода и работы с базами данных. На этом этапе стоит подумать о специализации: веб-приложения (серверное ПО), игры или программы с графическим интерфейсом. Также потребуется изучить приёмы работы со средой Visual Studio (на C# программируют преимущественно в ней): это, например, горячие клавиши, хитрости для быстрой генерации кода и прочее, прочее, прочее.
Продвинутое изучение
Освоив простые вещи, можно перейти к асинхронному и многопоточному программированию на C#, особым форматам файлов, библиотеке классов .NET Framework, тонкостям архитектуры Windows и к другим необходимым профессионалу вещам. Их список зависит от вашей специализации.
Специализация разработчика игр
Этот путь стоит рассмотреть отдельно и после первых шагов сразу идти по нему. Дальнейшее углублённое изучение будет не столь эффективно: лучше приступить к освоению игрового движка, например, Unity.
Прочие специализации
Если заложен прочный фундамент, самое время поточнее определиться со специализацией. Выбранная ранее технология веб-приложений или программ для десктопа начнёт оказывать прямое влияние на изучение C#.
Веб-разработка
Для работы в этом направлении потребуются дополнительные подготовительные курсы. Придётся разобраться с основными CSS, HTML и JavaScript хотя бы на базовом уровне, чтобы понимать их устройство и при необходимости уметь написать простенький код.
Потом опять придется выбирать между .NET Framework и .NET Core:
- ASP.NET – развитие Microsoft ASP. Предназначенная для создания веб-приложений платформа входит в состав .NET Framework и включает веб-сервисы, программную инфраструктуру, а также модель программирования.
- ASP.NET Core – свободно-распространяемый кросс-платформенный фреймворк для создания веб-приложений. Разрабатывается Microsoft совместно с сообществом и отличается более высокой производительностью по сравнению с ASP.NET.
Взаимодействие с базами данных в .NET Core осуществляется с использованием технологии Entity Framework Core (EFC, EF Core). EF Core работает на высоком уровне абстракции, предполагающем манипуляцию данными без привязки к их типу.
- ASP.NET MVC Framework – инструментарий для создания веб-приложений, реализующий шаблон Model-view-controller. Сейчас разрабатывается как часть ASP.NET Core, а вместо EF Core здесь используют EF 6.
Разработка настольных приложений
Здесь особого выбора нет, поскольку пытаться писать кроссплатформенные NET-приложения с графическим интерфейсом – экзотическое развлечение. Придется использовать .NET Framework и две основные платформы: WPF (Windows Presentation Foundation) или UWP (Universal Windows Platform). Последняя – более современная. Она позволяет создавать универсальные приложения для Windows в т.ч. на C#.

Где изучать язык?
Определившись со специализацией, можно перейти к получению знаний. Есть два варианта: самостоятельное изучение и/или курсы. Процесс может проходить в онлайне, но придется запастись терпением и, при необходимости, деньгами.
Онлайн-университеты:
- Coursera – американский провайдер онлайн-курсов. На сайте можно найти платные уроки, а также бесплатные. Coursera сотрудничает с различными учебными заведениями по всему миру и выдаёт сертификаты.
- GeekBrains – российская образовательная онлайн-платформа с уклоном в IT, но там хватает курсов и по смежным отраслям. Успешно завершившим обучение студентам выдают диплом о профессиональной переподготовке и помогают с трудоустройством. Занятия ведутся на русском языке.
- ITVDN – еще один российский портал, предлагающий видеокурсы по программированию и выдающий дипломы.
Самообразование:
Самостоятельное изучение – основа основ, особенно в программировании. Для этого потребуется время и источник информации. Вам обязательно понадобится официальная документация с сайта Microsoft. Лучше читать в английском варианте, поскольку перевод на русский может быть неточным.
Не стоит забывать и об актуальности знаний – в этом вам помогут блоги и различные каналы для программистов:
- Официальный блог .NET от Microsoft . Здесь можно найти описания обновлений, обсуждения нововведений и напоминания обновить платформу, если истекает срок поддержки.
- С# Helper . Конкретные примеры кода, объяснения новинок.
- Eric Lippert`s Blog . Блог одного из разработчиков программного кода для Facebook и создателя C#.
- Уголок “С-шарперов” . О громное количество материалов от людей, занимающихся в .NET или программированием на C#.
- BestDotNetTraining . Сайт и одноимённый канал на Youtube о программировании от индийских разработчиков. На сайте есть платные обучающие курсы, а также бесплатный контент.
- #SimpleCode . Русскоязычный Youtube-канал о практическом применении возможностей C#.
- CodeBlog . Ещё один русскоязычный Youtube-канал о C#. Здесь можно найти обзоры книг и способы решения практических задач.
- Habr . Это один из основных IT-порталов в русскоязычном сегменте. Публикации, обсуждения, обзоры и многое другое – на Хабре можно сидеть часами, при этом всё время пойдёт на самообразование. Если, конечно, выбирать обучающие публикации.
- GitHub . Открытая библиотека программного кода со всего мира. Здесь собираются команды разработчиков, и хранится код в открытом доступе.
Книги тоже считаются серьёзным источником знаний для программистов:
- Герберт Шилдт. C# . Полное руководство, но актуальны только версии, начиная с 4.0. Каждая книга подробно расписывает возможности языка и их практическое применение. Можно сказать, что это авторская переработка документации кода. Она отлично подойдёт не знакомым с синтаксисом языка.
- Джефри Рихтер. CLR via C#. Это издание углублённо рассказывает о C#, так что без уверенного знания синтаксиса языка информация в нем покажется вам слишком сложной.
- Албахари. C# . Карманный справочник по языку, среде CLR и сборкам .NET. Обычный справочник слишком объемный, но этот вариант удобно держать под руками.
- Джон Скит. C# для профессионалов. Один из основных учебников для программистов на C#.
- Эндрю Троелсен и Филипп Джепикс. Язык программирования C# 7 и платформы .NET и .NET Core. Отличная книга, разбирающая всё ещё актуальные возможности C#, платформу .NET и их прикладное применение. Объём велик – 1300 страниц.
Хочу освоить алгоритмы и структуры данных, но сложно разобраться самостоятельно. Что делать?
Алгоритмы и структуры данных действительно непростая тема для самостоятельного изучения: не у кого спросить и что-то уточнить. Поэтому мы запустили курс «Алгоритмы и структуры данных», на котором в формате еженедельных вебинаров вы:
- изучите сленг, на котором говорят все разработчики независимо от языка программирования: язык алгоритмов и структур данных;
- научитесь применять алгоритмы и структуры данных при разработке программ;
- подготовитесь к техническому собеседованию и продвинутой разработке.
Курс подходит как junior, так и middle-разработчикам.
