Прошлой осенью я прошел онлайн-курс CS 165: ускоренное введение в компьютерные науки в Университете штата Орегон. Это был мой первый курс в качестве студента по программе Пост-бакалавриат по информатике ОГУ, по которой я буду получать вторую степень бакалавра в течение следующих 2–3 лет.

Когда курс начался, я работал разработчиком Rails чуть больше года после окончания курса веб-разработки LEARN Academy. У меня был опыт программирования на Ruby и JavaScript, но у меня не было опыта работы с C++, языком, используемым в этом курсе, и никакого другого формального образования в области компьютерных наук.

В этой записи блога я опишу свой опыт прохождения курса в качестве профессионального веб-разработчика и выпускника буткемпа. Это поможет новым и будущим студентам OSU узнать, чего ожидать от CS 165, но, поскольку вводные занятия по CS будут охватывать много одного и того же материала, независимо от того, где вы учитесь, я думаю, что это также поможет другим выпускникам буткемпа решить, хотят ли они пройти аналогичный класс из любого другого университета или колледжа.

Структура курса

Курс представлял собой введение в программирование на C++ и включал следующие темы:

  • Типы данных
  • Условные операторы, циклы и функции
  • Классы и объектно-ориентированное программирование
  • Массивы и векторы
  • Указатели и динамическое выделение памяти
  • Алгоритмы поиска и сортировки и нотация Big O
  • Рекурсия
  • Шаблоны классов и стандартная библиотека шаблонов
  • Связанные списки, стеки и очереди
  • Makefiles

У нас был учебник и видеолекции. Я всегда читал, но смотрел лишь несколько видео, чтобы перед экзаменами повторить более сложные предметы. Лично я не нашел видео очень полезным, но я просто не люблю учиться на видео.

Большая часть наших оценок и затрат времени приходилась на еженедельные задания по программированию. Эти задания варьировались от отдельных функций до многофайловых программ: мой последний проект включал 14 файлов и 6 классов. Мы отправили их на Mimir, платформу автоматической оценки. Мимир выполнял несколько тестов по каждому заданию, но все, кроме одного, были скрыты до истечения крайнего срока, поэтому мы сами отвечали за тестирование нашего собственного кода. Поскольку разные компиляторы имеют разные настройки, нам посоветовали загрузить наш код на школьный сервер, скомпилировать и запустить его там, чтобы убедиться, что мы тестировали в среде, идентичной среде Мимира. Это было удобно для меня, так как мне не нужно было ничего устанавливать на свой Mac, кроме FileZilla для загрузки моих файлов.

Было два экзамена с несколькими вариантами ответов, которые в основном состояли из чтения фрагментов кода и прогнозирования их вывода. Экзамены приходилось контролировать. У нас была возможность использовать местного проктора лично или онлайн-сервис ProctorU, что я и использовал.

У нас также было несколько письменных заданий, в том числе два групповых проекта. Оба требовали, чтобы мы сравнили нашу работу над предыдущим заданием с работой других студентов, решили, чья работа лучше, и объяснили, почему.

Каково это было для меня

Первые несколько недель были для меня легкими, так как мы обсуждали концепции, уже знакомые мне по Ruby и JavaScript. Было много заданного чтения, но, к счастью, я смог просмотреть текст, просто пытаясь понять, чем C++ отличается от этих языков. Помимо незначительных различий в синтаксисе, основное отличие заключалось в том, что C++ имеет статическую типизацию, но я обнаружил, что к этому легко привыкнуть, как и к дополнительному этапу компиляции. На этом этапе большинство заданий по коду показались мне довольно простыми, и я мог выполнить все задания на неделю за один или два вечера.

Когда мы перешли к новым для меня темам — указателям, динамическому выделению памяти и перегрузке операторов — курс стал сложным, но все еще справлялся для меня, работая полный рабочий день. Количество назначенного чтения уменьшилось, что было к счастью, потому что теперь мне приходилось читать внимательно, а не бегло пролистывать. Для кодовых заданий мне требовалось как минимум 3-4 вечера, и бывали случаи, когда я изрядно расстраивался из-за ошибок, на разгадывание которых уходило много времени, но пока я оставлял себе достаточно времени, я был в порядке. Мне удалось набрать 100% баллов по всем заданиям, кроме одного, которое я полностью приписываю недостаточному тестированию из-за нехватки времени.

Экзамены были сложными по-другому. Большинство вопросов включало в себя чтение кода и прогнозирование его вывода, и они были непростыми. Я не был так уверен в своих ответах, как в коде, который написал, поскольку я мог запустить свой код и проверить результат, но на экзамене мне разрешили использовать белую доску только в качестве бумаги для заметок (поскольку ProctorU не т разрешить фактическую бумагу). Я получил пятерку на первом экзамене и четверку на втором, а так как у меня был солидный средний балл по кодовым заданиям, моя итоговая оценка была пятеркой.

С групповыми заданиями все в порядке. У меня были хорошие одногруппники, и мне нравилось видеть их код, но письменные задания были немного утомительными. Лучше, чем принудительное сотрудничество групповых заданий, было добровольное взаимодействие в неофициальной студенческой группе Slack, которая является удивительным ресурсом. Наличие Slack сделало курс более социальным и веселым, и это большая часть того, почему мне так понравилось занятие.

Что я из этого вынес

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

Я также рад, что получил опыт работы с компилируемым и статически типизированным языком. Недавно я узнал о Crystal, новом языке с синтаксисом, похожим на Ruby, но который компилируется и включает необязательную статическую типизацию. Поскольку я уже работал с C++, эта идея была для меня очень интересной, чего не было бы несколько месяцев назад. Теперь я лучше понимаю преимущества и недостатки различных языков программирования.

Прохождение этого курса заставило меня больше ценить Ruby, и я определенно предпочитаю программировать на Ruby, а не на C++. Я бы не стал начинать новый проект на C++ без веских причин для выбора этого языка, но сейчас я мог бы внести свой вклад в существующий проект C++.

Мой совет другим выпускникам буткемпа

Во многих вводных курсах по компьютерным наукам преподается C++, и если они этого не делают, они все равно должны охватывать многие те же темы, что и OSU 165, поэтому этот совет применим независимо от того, учитесь ли вы в OSU или где-либо еще.

Я настоятельно рекомендую пройти вводный курс CS другим выпускникам буткемпа. Если вы разработчик Ruby или JavaScript, это отличный способ почувствовать, как работают компьютеры на более низком уровне, чем тот, к которому вы привыкли. Если вы не планируете получать степень и не нуждаетесь в академических кредитах, Гарвардский CS50x — это бесплатный вариант, о котором я много слышал. Если вы заинтересованы в получении степени, я очень доволен своим опытом работы в ОГУ.

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

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

Некоторые советы для студентов OSU

Если вы опытный программист, вам почти наверняка следует выбрать 165, а не 161 и 162, если только вы не хотите действительно хорошо разбираться в C++. Оба варианта охватывают одни и те же концепции, но, по мнению других студентов, 162 на самом деле требует больше работы, потому что вам нужно написать намного больше кода. Эта дополнительная практика необходима новичкам, но если вы уже являетесь уверенным программистом, вы можете сэкономить много времени, взяв 165.

Если вы опытный программист, работающий полный рабочий день, CS 165 сам по себе является хорошей рабочей нагрузкой. Почти каждый день мне приходилось работать по несколько часов, но на личную жизнь оставалось время. Я мог бы вписаться еще в 4 кредита и выжить, но я рад, что решил этого не делать.

С другой стороны, если вы новичок, я бы настоятельно рекомендовал вместо этого брать 161 и 162, потому что вам нужна дополнительная практика. Если вы все-таки берете 165, будьте готовы уделять этому много времени, до 40 часов в неделю.

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

Наконец, следуйте советам инструкторов, чтобы скомпилировать и протестировать свой код на Flip. В моей секции были студенты, которые тестировались локально и обожглись, когда прошли видимые тесты Мимира, но провалили скрытые из-за различий между двумя средами.

Что дальше для меня

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

Зимняя четверть начинается завтра, и я буду изучать дискретные структуры (потому что это необходимое условие для дальнейших занятий) и веб-разработку (потому что это обязательный курс, и сейчас хорошее время, чтобы пройти его по пути, но он также возможность узнать о Node.js). Позже я с нетерпением жду более продвинутых курсов CS по языку ассемблера, операционным системам и многому другому.

Первоначально опубликовано на fionavoss.blog 7 января 2018 г.