С++ как первый язык: путь преподавателя GeekBrains
В мире программирования если не все, то очень многие дороги ведут к Си. Интерпретаторы и компиляторы большинства модных сегодня языков написаны на С/С++. Если вы хотите выжать максимум из любого «железа», программировать роботов, создать свою ОС, свой язык или другую мощную и жадную до ресурсов штуку, надо учить «плюсы». Это де-факто стандарт и в крупных игровых студиях, таких как Electronic Arts и Blizzard.
Но есть ли смысл выбирать С/С++ в качестве первого языка программирования? И откуда взялся вокруг Си ореол неприступности? Я решила обсудить это с преподавателем GeekBrains Иваном Овчинниковым.
Иван начал изучать С++ с нуля в 29 лет. Сейчас ему 33 и он — ведущий специалист и начальник группы программистов в центре разработки информационных систем АО «Российские Космические Системы».
— Иван, в чем, на ваш взгляд, сила «плюсов»? Можно ли сказать, что на сегодня это — «Царь-язык»?
— Я против ранжирования языков, потому что каждый из них решает свои задачи. В целом, языки С/С++ отличает чрезвычайная скорость исполнения и тотальный контроль над происходящим.
Да, можно сказать, что С++ — один из самых влиятельных языков программирования и прародитель многих других ЯП. Это универсальный инструмент, который позволяет подобраться к «железу» ближе, чем любой другой высокоуровневый язык. Вы можете программировать микроконтроллеры и серьезную аппаратуру, ускорять требовательные к ресурсам системы.
— Зачем учить сложный язык, если можно выучить простой? Все наверняка слышали страшилки, что С++ адски сложен и коварен. Что вы об этом думаете?
— Выучить названия всех фреймворков для JavaScript куда сложнее, на мой взгляд!
Прежде всего нужно определиться, зачем вы идете в программирование.
Если у человека программа-максимум — всю жизнь верстать сайты для знакомых или писать попсовые приложеньки для хипстеров, учить С++ совершенно не обязательно. А если вы хотите написать свою операционную систему или программировать роботов, которые полетят в космос и будут кататься по другим планетам — добро пожаловать в С++!
Конечно, С/С++ устроены нетривиально: многое в них не так просто понять и выучить. Но это возможно. И это сильно расширит ваши возможности как программиста.
Опытные разработчики любят пугать новичков «этими жуткими плюсами». Правда в том, что простых языков программирования не бывает, как и простой работы. Любая работа — сложная. Работа программиста — тоже, вне зависимости от выбранного языка. И да, дорогу осилит идущий: если не начать изучать С/С++, они так и останутся невероятно и запредельно сложными.
— Как можно упростить изучение C++ для студентов?
— Понятными объяснениями, которые помогли и мне в свое время. Я ведь стал программистом довольно поздно — в 29 лет. До этого никак не был связан с IT-сферой. Поэтому рассказываю студентам о языке, как рассказал бы себе начинающему.
Есть такой канал на Reddit — ELIF (Explain like I’m five — «Объясни, как пятилетнему»). Так можно сформулировать принцип, по которому я стараюсь доносить до людей сложную информацию, в том числе и про «этот страшный Си».
Еще хочу сказать, что в изучении языка (а оно никогда не заканчивается) я для себя изначально выбрал кратчайший путь — путь практики. И это себя оправдывает.
— Как случилось, что к 30 годам вы решили сменить профессию? И почему начали сразу с трудного языка?
— Решение освоить новую специальность пришло быстро и безболезненно. Мук выбора не было, потому что с прошлой профессией при 12-летнем стаже я зарабатывал что-то около 35 тысяч рублей. Это, в принципе, равнялось зарплате начинающего программиста-стажера. А если учесть, что программирование подразумевало интересные для меня задачи, выбор был очевиден.
Поскольку решение я принимал сам, а не под влиянием рекламы, исследовать рынок и выбирать язык для изучения тоже пришлось самостоятельно. В итоге сделал вывод, что если один раз выучить С, дальше легко освоишь практически любой популярный язык. Ведь почти все они — «наследники Си». Так и произошло.
Сейчас профессионально работаю на Java (Spring, VAADIN, EclipseLink). В быту — для себя — очень люблю писать на Python. Например, когда нужен Telegram-бот с напоминалками и детектором, фотографирующим котиков в кадре веб-камеры.
Есть у меня и кусочек умного дома, созданный с использованием Raspberry PI, и маленькая домашняя бухгалтерия на Django. Плюс всякие смешные поделки на Arduino — вроде новогодней елки.
— Сколько времени потребовалось, чтобы начать зарабатывать программированием?
— На поиск первой работы ушло около полугода. Я пришел к работодателю и выложил все как есть: мне 30 и я совсем без опыта, недавно дошел до изучения указателей в С. Попросился работать «за еду и опыт» — взяли. Через три месяца я полностью влился в коллектив и уже обучал коллег, как пользоваться трекерами задач и git-ом.
Огромным плюсом оказалось то, что я попал в молодой коллектив! Большинство ребят недавно выпустились из институтов: у них были еще свежи общие технические знания, а я мог поделиться с ними жизненным опытом. Получился симбиоз.
К тому же у меня в запасе всегда была и остается интересная история, как один тридцатилетний парень решил перевернуть свою жизнь с ног на голову. Начал учить С++, через полгода после устройства на работу — закрыл свое первое ТЗ, а дальше пошло-поехало...
— Какими были ваши первые проекты?
— Первые мои задачи были типовыми для начинающего программиста: надо было разобраться, как работает «вот этот код, написанный чуваком, который год назад уволился».
Мне поручали мелкие доделки готовых программ для аппаратов, которые недавно вернулись с испытаний.
Опытным разработчикам за такие задачи браться скучно, а мне на тот момент — в самый раз. Мне нравилось, что можно посмотреть на готовый код, сделать что-то полезное, но в глобальном плане ничего не сломать.
— Что считаете самым сложным в изучении С++? Есть какие-то темы, которые, если осилишь, то остальное — не сложнее, чем в других языках?
— На мой взгляд, самые сложные темы в изучении С — это указатели, указатели на указатели и указатели на функции. Если уж про них у вас в голове все встанет на свои места, остальное — детский лепет.
С++ сложно выражает идеи объектно-ориентированного программирования (ООП). Нужно время, чтобы вникнуть, чем отличаются между собой виртуальные, абстрактные, приватные и публичные методы. Еще есть модификаторы видимости и связывания, несколько видов конструкторов и деструкторов. С этим тоже нужно разобраться.
Проблема в том, что учебники и руководства по программированию просто вываливают на студента гору информации и как бы говорят: «Либо ты это все запоминаешь, либо ты бесполезен».
Преподаватели «старой школы» действуют по тому же принципу. Они забывают, каково быть новичком. Что программисту с опытом «интуитивно понятно», то для студента — 100500 новых слов, не подкрепленных опытом и практическими навыками. Студент еще не понимает внутренних механизмов языка и не может увязать их с реальным кодом.
Поэтому при подготовке учебного курса по С++ в GeekBrains мы старались оценить материал глазами новичка, который никогда раньше не программировал.
— Я слышала, что в C++ легко допустить ошибки, которые потом очень сложно найти, потому что в языке нет «защиты от дурака». Так ли это? Или главная сложность все-таки в другом? Если говорить именно об особенностях языка, а не о проблемах мотивации студента.
— Да, когда вы работаете с языками типа С/С++, легко наделать ошибок, которые могут годами себя никак не проявлять. Но они связаны не с самим языком или «защитой от дурака», а, скорее, с невнимательностью программиста.
Возьмем, к примеру, потоки ввода-вывода. Их надо закрывать и в Java/C#, и в C++. Если в Java/C# поток не закрыть, он будет висеть и тормозить программу. Если в C++ поток не закрыть, он будет… Да! Висеть и тормозить. А проявится проблема когда? Когда таких незакрытых потоков наберется сотня-другая.
Так что проблема не в инструменте, а в руках и голове, которые его используют. Но эти «сакральные» знания приходят только с опытом. Никакие курсы и учебники этого не дадут.
— Спрошу как раз о том, что дают курсы. Как вы балансировали учебную программу? У С/С++ очень много применений, а времени на изучение — всего год.
— Конечно, учебная программа будет очень сжатой, потому что, как заметил один мой коллега: «С, как религия — им надо заниматься всю жизнь». Отсюда и акценты — глубокое погружение в основы языка и беглый обзор всех его возможностей. Чтобы и игроделам, и банкирам, и браузерописцам будущим достались полезные знания.
Например, когда вы научитесь писать свои драйверы, можно коснуться и внешних вещей — библиотек и фреймворков, которые пригодятся в работе над конкретными проектами. До веб-разработки вряд ли дотянемся, но будем стараться.
Главное, вы будете понимать, как все работает, и узнаете о разных подходах к решению задач. Это заложит фундамент, на котором вы сможете строить то, что вам интересно. Конечно, придется много трудиться самостоятельно: читать, экспериментировать. Но вы уже не «потеряетесь» в языке.
— Я обратила внимание, что в учебном плане первым курсом идет Linux. Основы работы с этой ОС закладываются еще до уроков С/С++. Понятно, что Linux повлиял на многие платформы, в том числе MacOS и Windows. Но почему в курсе С++ такое внимание именно этой ОС?
— Считаю, что Linux — краеугольный камень в изучении программирования. Без знания этой ОС вы не сможете создавать кроссплатформенные приложения, потому что не будете понимать, в каком окружении им предстоит работать. 96 % устройств в интернете — это UNIX-подобные устройства. Куда без них?
UNIX, который стал родителем Linux и MacOS X, был написан на С. Собственно, С для того и создавали, чтобы написать на нем UNIX. Отсюда и свойства языка — его близость к аппаратному обеспечению. Можно сказать, что история развития современных ОС пересекается с историей языка Cи. И на примере Linux это хорошо видно.
Даже если вы твердо решили программировать исключительно для Windows, знание Linux расширит ваши горизонты: позволит посмотреть на дивный новый мир, от которого вы отказываетесь.
— Иван, спасибо! Что скажете в напутствие своим будущим студентам?
— Если вы повелись на рекламу и пришли в программирование только потому, что тут много денег, — остановитесь. Через пару-тройку лет на нелюбимой работе, которая держит лишь финансово, вы просто свихнетесь от тоски. Но! Если кто-то отговаривает вас становиться программистом, а вы этого очень хотите — игнорируйте мнение этих людей и идите к своей цели. Не пожалеете! Желаю вам заниматься тем, что вам нравится. До встреч!