Из журналистки в программистки. Часть вторая

Сны о чьем-то коде.

Наша героиня Даша Борисенко-Орловски продолжает осваивать C++ на Coursera и уже преодолела две трети начального курса. В новом выпуске дневника она делится впечатлениями от всё усложняющихся задач, ругает себя и размышляет о философии «плюсов». 

Больше кода для бога кода

10 часов в неделю. Столько по плану Яндекса должен тратить разумный человек, решивший научиться C++. Я уже второй раз подряд забываю, что на деле это не так. Конечно, если вы опытный прогер и просто учите новый язык, может, вам нужно и того меньше — часа четыре. Я, знаете ли, сносно заговорила на испанском за полтора месяца занятий с мобильным приложением. Просто это не третий и даже не пятый иностранный язык в моей жизни. Но вот «плюсами» похвастаться не могу — курс затягивает меня на целые дни. 

Вторая неделя началась бодро. Половина уроков и задач посвящена функциям. Вообще это довольно сложная тема. Когда я впервые столкнулась с ними на курсах по JavaScript и Python, то сломала весь мозг. Почему в коде должна быть отдельная штука, в которую я передаю свои переменные? Почему нельзя проделать все те же операции с нужными мне цифрами и буквами и забыть о них?

Но стоит однажды въехать в функции, забыть их основы уже не получится 

В курсе бывает два типа задач: Practice Programming Assignment и обычный Programming Assignment. Первые проще, и решения для них открыты сразу: если случится затык, можно подсмотреть и перекроить свой код. Конечно, это вариант для слабаков, но, признаюсь честно, мне так хотелось прорваться сквозь задачи раздела побыстрее, что пару раз я сорвалась. Для второго типа задач решения закрыты, и узнать их не получится, пока ваш собственный код не пройдет все встроенные тесты, даже если на это уйдет тридцать пять попыток. 

Подсказки есть. Часть из них — прямо в условии задачи. А еще к каждой задаче прикреплена дискуссия, где можно задать вопрос наставнику и показать свой код или проверить, не возникала ли похожая проблема у других студентов. Я обычно смотрю в дискуссии, чтобы немного повысить постоянно падающую самооценку и убедиться, что кому-то это дается так же тяжело. Ну а если дискуссия не поможет, можно поискать аналогичные задачи в недрах интернета. Но это вредный совет. 

Первая практическая задача недели под названием «Факториал» подарила мне очередной флешбэк. Хоть я никогда толком не учила математику дальше школьной программы, а потому не обязана знать, что такое факториал, тут мне повезло. В седьмом классе математичка Надежда Алексеевна решила, что из меня может выйти особый толк, и предложила индивидуальные занятия. Долго я не выдержала и скоро променяла алгебру на литературу, но за крэш-курс углубленной математики успела запомнить крупицы теории вероятностей, и значок факториала «!» намертво впечатался в мой мозг. К тому же «факториал» — очень красивое слово. Короче, «5!» значит 1 * 2 * 3 * 4 * 5, и эта штука работает для других неотрицательных целых чисел. В общем, больше вам знать для решения задачи и не надо. 

Печальная очередь и непристойные остановки

Другие задачи на функции посложнее и поинтереснее факториала: надо определять и отбирать палиндромы, разворачивать последовательности и перемещать строки из одного вектора в другой. Неожиданно для себя самой я щелкала их как орешки. Вдохновленная тем, как быстро удалось расправиться с функциями, расслабилась, а потом к тому же простудилась. И когда вернулась к курсу, поняла, что за несколько дней без практики забыла совершенно всё, чему научилась до этого. И тут начались мучения. 

Главная цель второй недели — донести до студентов идею разных контейнеров, в которых можно хранить всякие данные: числа, слова, булевы значения (True или False). Первым делом идут векторы. Я прохлопала ушами половину того, что говорили в лекциях, и даже не задумалась, а чем же векторы отличаются от всяких других контейнеров. Чтобы вы не повторили моих ошибок, скажу сразу. В векторах данные остаются в том порядке, в каком вы их записали. Вроде очевидная истина, но она в разы сокращает массы пота, крови и слез, пролитых над задачами. Потому что в контейнерах set (множество) и map (словарь), о которых рассказывают после векторов, данные перераспределяются, и последовательность сохранить не выйдет. 

За разминочным заданием идет задача про очередь, настолько поэтичная, что я процитирую первую часть условия: 

«Люди стоят в очереди, но никогда не уходят из ее начала, зато могут приходить в конец и уходить оттуда. Более того, иногда некоторые люди могут прекращать и начинать беспокоиться из-за того, что очередь не продвигается».

За филологическим восторгом от этого текста последовал ужас 

Надо было писать команды, которые добавляют людей в очередь, заставляют их беспокоиться, успокаиваться и порой совершать перекличку среди беспокойных. Но пока глаза боялись, руки делали, и пусть не за полчаса, отведенных на задачу Яндексом, а за пару часов, очередь я выстроила. 

Дальше — хуже. Нужно написать программу-календарь, в которую добавляются ежемесячные дела. Человек путешествует из месяца в месяц, из года в год и напоминает себе, что седьмого числа надо гулять с собакой, а двадцать первого — платить за газ. Если следующий месяц короче предыдущего, дела с последнего дня (или дней, если речь о январе и феврале) сдвигаются на первый день нового месяца. Я битый час придумывала абстрактную логику Григорианского календаря (сколько дней где отнять, сколько прибавить), пока не призналась себе, что проще всего тупо записать нужное количество дней в каждом месяце в вектор и путешествовать по нему. 

Только я начала понимать устройство векторов, как пришло время следующей темы — контейнеров map. Это словари, где все элементы — пара, ключ и его значение. Практические задания показались мне обманчиво сносными, но самостоятельные задачи это с лихвой компенсировали. Их в разделе две на одну и ту же тему — виртуальный автобусный парк. Надо написать систему, которая хранит названия автобусных маршрутов и списки остановок для каждого. Вроде ничего особенного, но, например, система должна уметь рассказывать обо всех маршрутах, которые проходят через заданную остановку или обо всех возможных пересадках для каждой остановки на маршруте. Я потратила на них целый день, который планировала посвятить волонтерству. К счастью, волонтерю я в книжном магазине-кафе и день был пустой, так что я просто несколько раз вылезла из бездны кода, чтобы налить желающим кофе. 

К середине второй недели задачи доходят до такого уровня сложности, что первое желание — закрыть ноутбук. Поначалу я просто не знаю, как к ним подступиться. Но строчка за строчкой вырисовывается образ того, что надо сделать. Правда, я столько раз пошла неверным путем, что уже отчаялась найти верное решение и вместо этого час развлекалась с теми кусками кода, которые работали. Играла во Владимира Сорокина автобусных остановок: придумывала максимально омерзительные названия, складывала из них маршруты и выводила в консоль. Видимо, бог кода оценил степень моего отчаяния и подарил немного ума.

Я решила обе задачи диким и нелепым, но зато оригинальным способом

Конечно, версия решения от Яндекса гораздо красивее, но я почувствовала себя настоящим доктором Франкенштейном, который собрал работающий код из векторов, словарей и пары костылей.

Видимо, раздел про map задуман как кульминация недели, потому что последняя тема про множества set (и даже третья задача про автобусный парк) показалась после них детским лепетом. Но именно словари стали для меня переломным моментом в курсе. 

Снова новые «плюсы»

Пришлось признать, что я паршивая и невнимательная студентка. Я всю жизнь слушаю преподавателей вполуха, думая, что до всего могу дойти потом, своим умом. Но часто это просто не стоит того. Если бы я записала и запомнила несколько методов прямо из коротких лекций, могла бы сэкономить часы, проведенные за чтением о тех же методах на форумах. И тут я преодолела себя и завела настоящий конспект. В него я переписываю важный код (заодно тренируюсь внимательно писать и не пропускать всю эту дикую пунктуацию «плюсов») и складываю скриншоты переломных моментов из лекций. На самом деле, к каждому разделу курса Яндекс предлагает готовый pdf с конспектом, но писать самой эффективнее. 

Въезжать в содержание курса и не отвлекаться на лекциях помогает и фишка, которая возможна в лекциях на Coursera — в видео вставляют интерактивный тест, привязанный к моменту из лекции. Отвечать на вопрос теста не обязательно, можно пропустить и смотреть дальше, но к третьей неделе я поняла, что лучше включать собственный мозг как можно чаще. Не все преподаватели курса пользуются этими вставками-тестами, но, например, Антон Полднев, который рассказывает о структурах и классах большую часть третьей недели, вставляет такие блиц-опросы в каждую лекцию. И за это ему спасибо, а то я опять бы все проспала. 

На третьей неделе тоже нашлась пара-тройка сложных задач. Они снова объединены в серию — имена и фамилии. Нужно задавать и изменять имена людей, хранить архив с датами изменений и выдавать по запросу выписки из этого архива. Я снова наваяла совсем не лаконичный код, но после эпопеи с автобусными остановками уже твердо знала — нерешаемых задач не существует. 

Третья неделя показывает еще одну новую сторону C++ — структуры и классы, которые позволяют упражняться в объектно-ориентированном программировании. Пока что это самое интересное и понятное мне занятие на «плюсах», потому что знакомый мне Python как раз создан для ООП. Работать с объектами кажется занятием гораздо более человеческим, чем игра в математический бисер с компьютером, которой C++ показался мне сначала.

Хотя я едва подступилась к языку, как говорят в Америке, «намочила ноги», он уже не раз озадачил меня своим разнообразием

Не удивлюсь, если на четвертой неделе опять выяснится, что «плюсы» не то, чем мне кажутся.

Сегодня мне всю ночь снился код. Он проступал сквозь личные драмы и фантастические события черным экраном, по которому бегали красные и зеленые значки. Помню, что божественные голоса говорили мне, мол, готового алгоритма нет, ты должна написать его сама и тогда все исправится. Я проснулась, и муж тут же показал мне эссе одного разработчика, которое он прочитал на днях. Оно начиналось словами: «Сегодня мне снова снился код».