[RU] Как начать изучать Computer Science первокурсникам

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

Литература

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

  • Алгоритмы: построение и анализ (Томас Кормен). Хорошая книга по классическим структурам данных и алгоритмам (прежде всего поиск и сортировка). На первом курсе лучше всего читать всю целиком и по порядку, а позднее можно возвращаться к отдельным главам если нужно что-то повторить. Для меня хороша еще и тем что содержит строгие математические доказательства. Вся необходимая математика также есть в приложении к книге.
  • Структура и интерпретация компьютерных программ (Харольд Абельсон). Также известна как SICP - очень хорошая книга о программировании в целом. научит думать и писать программы разными способами. Есть бесплатная электронная версия в переводе от Добросвет. Также существует видеолекции с субтитрами на русском языке.
  • Компиляторы: принципы, технологии и инструменты (Альфред Ахо). В этой книге подробно рассматривается каждый аспект построения компилятора, к тому же после прочтения останется хорошая база по грамматикам, конечным автоматам и строковым алгоритмам.
  • Язык программирования Си (Брайан Керниган). Включил эту книгу потому как считаю что на первом курсе полезнее всего научиться программировать на языке Си. В качестве второго языка можно выбрать Python, Java или C#.

Видеокурсы

На русском языке в первый год полезно будет посмотреть два курса видео-лекций от Яндекса:

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

Хорошие cайты с онлайн-курсами и лекциями:

  • Алгоритмы для Интернета – наверное, первый онлайн-курс на русском языке, получивший даже в свое время грант от Яндекса. Материал не для первого курса, но несколько общих лекций будет полезно посмотреть и почитать. Все еще актуален. Автор, Юрий Лифшиц – математик, бывший исследователь Yahoo и Caltech, в данный момент занимается онлайн образованием в Кремниевой Долине.
  • Блог Computer Science Student - содержит много разного обучающего видео от интересного автора. Сейчас проект закрыт и больше не обновляется, но тем не менее содержит архив полезных материалов. Автор, Рахим Давлеткалиев, учился в Канаде и в свое время рассказывал в своем блоге о том, как изнутри выглядит обучение в Канадском университете.
  • Hexlet – онлайн университет. Этот сайт содержит большое количество обучающих, прежде всего практических, курсов по программированию и вычислительным технологиям. Основатель проекта также Рахим Давлеткалиев.
  • Lectorium – сайт с большим количеством видеолекций от Российских университетов. Не только по Computer Science.
  • Coursera – наверное, самый крупный в мире проект по онлайн-обучению. Основан известным стэнфордским профессором Эндрю Нг (сейчас – исследователь в китайской поисковой компании Baidu). Некоторые курсы, такие как CS101, можно проходить на первом курсе университета.

Coursera

  • Khan Academy – сайт с видеолекциями, ориентированный больше на школьников чем на студентов. Очень известен и популярен на западе. Есть вводный курс, обучающий программированию и Computer Science с помощью языка JavaScript. Проект несколько лет назад получил грант от фонда Мелинды и Била Гейтсов на 1 миллиард долларов.
  • Udacity – аналог Coursera с более прикладным и менее академическим уклоном.

Рекомендую за год пройти один или два онлайн курса или хотя-бы просмотреть видеолекции с одного из указанных выше сайтов. Также, почти у каждого хорошего западного университета есть свой Youtube канал с онлайн лекциями которые легко можно найти в Google по запросам вроде “MIT computer science video lectures” или “Stanford deep NLP class”.

Где Находить и Решать Задачи

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

  • HackerRank – платформа для практики в компьютерных науках (алгоритмы, ии, машинное обучение и др.) и прикладной математике. Вы можете составить себе курс, а HackerRank создаст для вас тестовые задания под выбранный вами язык программирования. В платформу интегрирована среда для программирования и также есть статистика ваших результатов в сравнении с другими пользователями – около 1 миллиона программистов.

HackerRank

  • GeeksforGeeks – на этом сайте собранны задачи с собеседований в разные крутые компании. Всегда акуально знать о том, что сейчас могут спросить на собеседовании в Google или Facebook.
  • ProjectEuler – сайт, на котором собраны разные абстрактные задачи (паззлы) по программированию с математическим уклоном. Хорошо научиться писать программы с помощью решения таких задач скорее всего не получится, но можно потренировать мозг или использовать их как правильный полигон для освоения нового языка. Задачи упорядочены по возрастанию сложности начиная от совсем уж простых.
  • GoogleCodeJam - архив задач с решениями и анализом с соревнований по программированию от Google.
  • Top Coder и Codeforces.ru – почти тоже самое что и Code Jam - сайты для решение задач по спортивному программированию с онлайн рейтингами участников и прочим.

Еще несколько списков:

Как Найти Интересный Проект

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

  • Знайте историю. Прочитайте о том как создавались известные проекты, истории компаний и биографии умных, выдающихся людей в компьютерных науках. Множество статей можно найти на habrahabr, википедии или в Google. Также, есть неплохие документальные фильмы, например “Revolutionary OS” и “Загрузка: Подлинная история интернета” и несколько других.

  • Старайтесь следить за тем, над чем сегодня работают команды разработчиков и исследователей в значимых организаций в индустрии, которая к вам ближе всего (например, Google в поиске или Disney в компьютерной графике и т.д.). Для этого можно читать блоги, следить за новостями (прежде всего через HackerNews) или конференциями (SIGRAPH, ACL, NIPS, arXiv).

HackerNews

  • Побольше путешествуйте и посещайте разные события, такие как конференции, воркшопы и летние школы. Если вы не знаете куда поехать, вот несколько хороших мест: ESSCaSS, АИСТ, ALMADA, Berkeley/Stanford Summer Schools.

  • Google Summer of Code – программа, участвуя в которой, вы можете поработать над каким нибудь проектом получая при этом стипендию от Google.

  • Почитайте Джейка Левайна о том как нужно учиться создавать вещи.

  • Пользуйтесь сайтом github.com и изучайте как устроены open-source проекты. Этот сайт можно использовать чтобы находить открытое ПО для своих задач, чтобы узнавать над чем сейчас активнее всего работает сообщество (есть рейтинг популярности проектов), или чтобы публиковать свой код.
  • Ежедневные списки самых интересных проектов можно находить на сайте Product Hunt.

В Чем Писать Код

HackerNews

В чем лучше всего писать код?

Первые годы лучше всего писать код в текстовых редакторах Vim или Emacs и не привыкать к средам разработки, таким как Visual Studio или Eclipse. Во первых, эти два редактора универсальны и подходят практически для всего что делает программист. Во вторых, они достаточно минималистичные и не нагружены лишними (и вредными) для первокурсника функциями. Vim с моей точки зрения - более простой и “понятный”, а Emacs более гибкий.

Если не нравятся Vim или Emacs, используйте SublimeText или Atom.

Поскольку вам придется работать с терминалом, а также потому что достаточно много программного обеспечения разработано следуя идеологии unix, то вы избежите большого количества проблем с которыми можете потенциально при разработке в Windows. Поэтому, в качестве операционной системы лучше всего использовать что-то unix-like: Mac OS или Linux.

Языки

На первом курсе я бы рекомендовал изучить один язык который достаточно близок к железу, такой как Си или Си++. На Си написаны большинство популярных операционных систем (windows, os x, linux, ios, android) и фактически, это язык на котором “говорит” ваша операционная система. Поэтому, хорошее знание Си даст хорошее представление о том как устроены основные функции ОС – среды, в которой будут работать ваши программы, на чем бы они не были написаны. Также, для вас в будущем будет легче перейти с Си/Си++ на Java, C#, Python и другие более высокоуровневые языки, но не наоборот. Помимо учебника Кернигана, есть хорошая статья о том как писать код на Си в 2016 году.

В дополнение к Си или Си++, рекомендую освоить один язык поддерживающий функциональную парадигму, такой как Lisp (можно его диалект Scheme) или Haskell. Такой опыт позволит начать по-другому смотреть на программирование, что будет полезно даже если вы не будете использовать эти языки на практике. Пол Грэкхэм хорошо написал зачем нужно изучить Лисп.

Места

Полезные места, где можно научиться компьютерным наукам в России:

Vova Zaytsev

Data at Uber