Skip to content

Latest commit

 

History

History
296 lines (150 loc) · 58.1 KB

Teach_yourself_cs-2020-RU.md

File metadata and controls

296 lines (150 loc) · 58.1 KB

Как выучить Computer Science самостоятельно?

Данный гайд переведён с английского языка Ильей Моисеевым и Степаном Ракитиным. Оригинал был написал авторами Oz Nova и Myles Byrne и доступен по ссылке https://teachyourselfcs.com/. От себя мы добавили альтернативные материалы на русском, для тех у кого сложности с английским.

Если ты учился программировать самостоятельно или недавно прошел буткэмп, твой следующий шаг - углубиться в профессию и изучить Computer Science. Классно, что сейчас можно получить образование в области компьютерных наук на уровне лучших университетов, не тратя на это годы и целое состояние💸.

У нас есть доступ к невероятному количеству различных ресурсов, но некоторые из них лучше, чем другие. Тебе не нужен еще один список в духе "200+ бесплатных онлайн курсов". Все, что тебе нужно, ответы на два вопроса:

  • Какие дисциплины я должен изучить, и почему?
  • Какая книга или курс видеолекций лучшие, чтобы изучить эти дисциплины?

Данный гайд поможет тебе найти ответы на эти вопросы.

Если вкратце:

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

Предмет Зачем изучать? Лучшая книга Лучшие видео
Программирование Чтобы не быть тем человеком, который "не совсем понимает" что-то уровня рекурсии. Структура и интерпретация компьютерных программ Brian Harvey’s Berkeley CS 61A
Архитектура компьютера Когда ты не знаешь, как устроен компьютер, твое понимание того, что можно и нельзя делать с кодом, будет поверхностным. Архитектура компьютера и проектирование компьютерных систем Berkeley CS 61C
Алгоритмы и структуры данных Если ты не знаешь, как использовать базовые структуры данных, такие как стек, очередь, дерево, графы, ты не сможешь решать сложные задачи. Алгоритмы. Руководство по разработке Steven Skiena’s lectures
Математика для CS CS, по сути, одно из ответвлений прикладной математики. Поэтому, знание математики даст тебе значительное преимущество. Mathematics for Computer Science Tom Leighton’s MIT 6.042J
Операционные системы Большинство кода, который ты пишешь, выполняется ОС. Поэтому, ты должен знать, как ОС и код взаимодействуют. Operating Systems: Three Easy Pieces Berkeley CS 162
Компьютерные сети Интернет везде: узнай как он работает, чтобы использовать его потенциал на 100%. Computer Networking: A Top-Down Approach Stanford CS 144
Базы данных Данные - это основа большинства программ, но лишь избранные понимают, как системы баз данных работают на самом деле. Readings in Database Systems Joe Hellerstein’s Berkeley CS 186
Языки и компиляторы Если ты понимаешь, как работают языки и компиляторы, ты сможешь писать более качественный код и изучать новые языки эффективнее. Компиляторы: принципы, технологии и инструменты Alex Aiken’s course on Lagunita
Распределенные системы В наши дни большинство систем - распределенные системы. Распределенные системы. Принципы и парадигмы MIT 6.824

Все еще кажется, что это много?

Если идея изучать самостоятельно эти девять тем в течение пары лет кажется совсем не привлекательной, мы предлагаем сфокусироваться на двух книгах: Компьютерные системы: взгляд программиста и Высоконагруженные приложения (Designing Data-Intensive Applications). По нашему опыту, эти две книги - идеальный вариант, чтобы инвестировать свое время, особенно для тех, кто работает с сетевыми приложениями, и изучал программирование самостоятельно или на буткэмпе. Они также могут служить отправной точкой для того, чтобы лучше понимать другие темы и ресурсы, приведенные выше.

Зачем изучать Computer Science?

В мире каждый день пересылается около 20 миллиардов СМС-сообщений. WhatsApp же ежедневно сталкивается с нагрузкой в 42 миллиарда, имея 57 программистов в штате. pic.twitter.com/zZrtSIzhlR

— Бенедикт Эванс (@BenedictEvans) 2 февраля 2016

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

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

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

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

Инструкции по темам

Программирование

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

Для изучения такого материала обычно рекомендуют классическую книгу Структура и интерпретация компьютерных программ (Structure and Interpretation of Computer Programs) и одноименный курс лекций от MIT. И книга, и курс лекций доступны онлайн совершенно бесплатно (на английском). Нам очень нравятся эти лекции, но мы предлагаем вместо них взять курс лекций Брайана Харви - запись курса 61А университета Беркли. Нам кажется, что информация в них разобрана более детально, и новичкам будет легче воспринимать именно их.

Мы рекомендуем пройти как минимум первые три главы книги Структура и интерпретация компьютерных программ и выполнить упражнения к ним. В дополнение к этому можно еще порешать задачки на exercism.

Так как этот гайд был впервые опубликован в 2016, нас часто спрашивают, рекомендуем ли мы более новую версию курса 61А от Джона Денеро и соответствующую им книгу Composing Programs, в которых основным языком программирования является Python. Мы считаем, что курс Денеро также очень неплох, и некоторым студентам он понравится даже больше. Но мы все же советуем начать с книги Структура и интерпретация компьютерных программ и курса Брайана Харви. Мы считаем, что эти ресурсы уникальны и что они могут в корне изменить твое представление о компьютерах и программировании. Конечно, они подойдут не всем. Кому-то книга не понравится, многие не уйдут дальше первых страниц. Но эта книга обладает большим потенциалом и стоит того, чтобы попробовать ее прочитать.

Если Структура и интерпретация компьютерных программ все же не понравилась, попробуй Composing Programs. Если снова чувствуешь, что это не то, что нужно, попробуй How to Design Programs. Если все они кажутся слишком сложными, попробуй отложить их на время и перейти к другим темами, а к ним вернуться через год-другой.

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

Альтернативы на русском: Русский перевод SICP, Программирование на Python от Stepik.

Архитектура компьютера

"Железо" - это платформа.

— Майк Актон, Engine Director в Insomniac Games (смотри его выступление на CppCon)

Архитектура компьютера (компьютерные системы, организация компьютера) - это очень важная тема. Знание архитектуры позволяет заглянуть вглубь и узнать, что же кроется за программным обеспечением. Мы заметили, что многие программисты, не имеющие формального образования в CS, старательно избегают этой темы.

Ресурсы, которые мы можем порекомендовать начинающим, это книга Компьютерные системы: архитектура и программирование. Взгляд программиста (Computer Systems: A Programmer's Perspective) и курс по архитектуре компьютера, основанный на этой книге, который покрывает большую часть глав 1-6.

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

Для тех, кто предпочитает изучать материал в более медленном темпе, а также в равной степени заинтересован как в аппаратном, так и в программном обеспечении, мы рекомендуем книгу Элементы вычислительных систем (The Elements of Computing Systems). Она также известна как “Nand2Tetris”. Эта книга дает исчерпывающие знания на тему того, как же работает компьютер. Каждая глава нацелена на то, чтобы спроектировать одну из частей большой системы - игры в Тетрис, от написания простейшей логики в HDL до работы с CPU и ассемблером.

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

Первая половина книги и все проекты доступны бесплатно на сайте Nand2Tetris. Также по этой книге есть курс на Coursera.

Книга достаточно проста для понимания, при том что покрывает она как аппаратное, так и программное обеспечение. Это дает ощущение законченности после ее прочтения. К сожалению, книга не покрывает пару очень важных концептов - иерархию памяти и конвейеризацию вычислений.

Если ты хорошо разобрался с Nand2Tetris, мы рекомендуем вернуться к книге Компьютерные системы: архитектура и программирование. Взгляд программиста или попробовать почитать уже ставшую классической книгу Архитектура компьютера и проектирование компьютерных систем Паттерсона и Хеннеси (Computer Organization and Design). Некоторые главы в этой книге можно пропустить, она довольно подробная; мы рекомендуем следовать курсу CS61C course университета Беркли для изучения каких-то конкретных тем. Конспекты лекций и лабораторные доступны онлайн, а старые версии лекций можно найти в архиве.

Альтернативы на русском: Русский перевод CS-APP, Цифровая схемотехника и архитектура компьютера.

Алгоритмы и структуры данных

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

— Ричард Хамминг

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

Книг по алгоритмам - сотни. Наша любимая - Алгоритмы. Руководство по разработке Стивена Скиена (The Algorithm Design Manual. Решать сложные проблемы - его страсть, поэтому ему удается также заинтересовать и своих студентов и читателей. Мы думаем, что Алгоритмы. Построение и анализ Кормана и Алгоритмы. Руководство по разработке Седжвика содержат слишком много доказательств и слишком теоретические, поэтому не очень подходят для тех, чья цель - научиться использовать алгоритмы и структуры данных на практике.

Для тех, кто предпочитает видеолекции, у Стивена Скиены также есть курс лекций, выложенный на YouTube. Еще нам очень нравится курс Тима Рафгардена, который доступен на Coursera и здесь. Так что, материалов много, нужно лишь выбрать то, что больше подходит именно тебе. На самом деле, сейчас существует огромное количество ресурсов, которые мы здесь не указали. Если найдешь что-то стоящее, мы рекомендуем остановиться на нем, это вопрос личных предпочтений!

Чтобы попрактиковаться, мы советуем решать задачки на Leetcode. Там попадаются нетривиальные задачки с примерами возможных решений и дискуссиями о том, какое из них лучше. Решение задачек на Leetcode также очень помогает подготовиться к интервью с большими компаниями типа Яндекса, так как они очень любят спрашивать что-то подобное. Мы рекомендуем прорешать около 100 рандомных задачек, чтобы научиться эффективно использовать алгоритмы и структуры данных.

И, наконец, мы настоятельно рекомендуем гайд How to Solve It; это отличное пособие, которое подойдет как для практики CS, так и математики.

Альтернативы на русском: Русский перевод Скиены, Алгоритмы, Разработка и Применение, Алгоритмы: теория и практика.

Математика для CS

Люди не видят, как проста математика, потому что не осознают, как сложна жизнь.

— Джон фон Нейман

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

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

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

Для более продвинутых читателей мы советуем книгу Математика для компьютерных наук (Mathematics for Computer Science) - конспект лекций одноименного курса MIT, собранный в отдельную книгу. Видеолекции курса также доступны бесплатно, и мы рекомендуем именно их для изучения дискретной математики.

Изучение линейной алгебры мы советуем начать с серии видео Essence of linear algebra, затем перейти к книге Гилберта Стрэнга и видеолекциям от MIT.

Альтернативы на русском: Дискретный анализ. Учебное пособие, Ликбез по дискретной математике.

Операционные системы

Две классические книги по операционым системам - Operating System Concepts и Современные операционные системы Таненбаума (Modern Operating Systems). Обе эти книги критикуют за запутанность и излишнюю сложность, они не очень подходят для среднестатистического студента.

Хорошая альтернатива - Operating Systems: Three Easy Pieces, она доступна бесплатно на английском языке. Особенно нам нравится структура книги и ее простота для прочтения. Упражнения в этой книге определенно стоят того, чтобы уделить им время.

После этой книги, мы советуем изучить устройство отдельных ОС, используя учебники типа "Архитектура {название ОС}". Например, Lion's commentary on Unix, The Design and Implementation of the FreeBSD Operating System, Mac OS X Internals. Для изучения Linux мы предлагаем обратить внимание на замечательную книгу Роберта Лава Linux Kernel Development.

Отличный способ закрепить полученные знания - почитать код небольшого ядра и добавить туда свои фичи. Например, можно поэкспериментировать с ОС xv6, написанной по образцу Unix V6 на ANSI C и работающей на x86. Эта ОС поддерживается для одного из курсов MIT. В книге Operating Systems: Three Easy Pieces есть аппендикс с лабораторными для xv6, где можно подсмотреть много полезных идей для потенциальных проектов.

Альтернативы на русском: Курс «Операционные системы» (книга внутри).

Компьютерные сети

Мы не можем подсмотреть будущее в хрустальном шаре. Интернет будущего будет таким, каким сделает его общество.

— Боб Кан

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

Наша любимая книга по этой теме это Computer Networking: A Top-Down Approach. Книга содержит неплохие проекты и упражнения, а особенно мы рекомендуем эти лабораторные, которые доступны онлайн.

Тем, кто предпочитает учиться по видеолекциям, мы советуем попробовать Стенфордский курс Introduction to Computer Networking, который раньше был доступен как официальный открытый курс Стенфорда, но сейчас его, к сожалению, можно найти только в виде неофициального плейлиста на YouTube.

Альтернативы на русском: Компьютерные сети от тех же авторов.

Базы данных

Базы данных - одна из наиболее сложных и времязатратных тем для самостоятельного изучения. Эта область относительно новая - появилась после 1970-х. Так сложилось, что компаниям не выгодно чтобы материалы по базам данных были свободном доступе. К тому же, многие потенциальные авторы, которые могли бы написать хорошие учебники по этой теме, предпочли работу в больших компаниях или вообще основали свои компании.

Так что, мы советуем тем, кто хочет изучить эту область самостоятельно, избегать учебников и начать с записи курса по базам данных от Джо Хеллерстайна CS 186 университета Беркли, а затем перейти к изучению статей по этой теме.

Одна из статей для новичков в этой области, которые стоит упомянуть, это “Architecture of a Database System”. Она хороша тем, что дает общие представления о том, как работают системы управления реляционными базами данных. Она послужит отличной основой для дальнейшего обучения.

Readings in Database Systems, больше известная как “Красная книга” - это коллекция статей, собранная и отредактированная Питером Бейлисом, Джо Хеллерстейном и Майклом Стоунбрейкером. Для тех, кто уже хорошо изучил курс CS 186, красная книга - следующий шаг.

Если ты все же предпочитаешь использовать учебник для знакомства с областью, мы предлагаем рассмотреть Database Management Systems. Если хочется перейти на более продвинутый уровень, стоит обратить внимание на классическую книгу Джима Грея Transaction Processing: Concepts and Techniques.

Также хочется упомянуть, что моделирование данных - аспект работы с базами данных, которым часто пренебрегают и не уделяют должного внимания его изучению. Книга, которую мы предлагаем почитать по этой теме, это Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World.

Альтернативы на русском: хороших материалов на русском мало, но как минимум рекомендуем Погружение в СУБД и Введение в базы данных.

Языки и компиляторы

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

— начало курса по компиляторам Раса Бодика

Большинство программистов учат языки программирования, в то время как большинство тех, кто занимается CS, учат, как работают языки и на чем они основаны. Это дает им значительное преимущество, даже в программировании! Их знания переносимы; они могут понять, как работает новый язык, быстрее и глубже, чем те, кто просто изучал конкретные языки.

Для начала, мы советуем почитать Crafting Interpreters Боба Нистрома. Текст хорошо огранизован, его очень интересно читать, и он подойдет тем, чья цель - лучше понимать, как работают языки и инструменты, которые они используют. Мы советуем проработать весь текст и попробовать прорешать задачки ("challenges"), которые там встречаются.

Обычно для изучения компиляторов рекомендуют книгу Компиляторы: принципы, технологии и инструменты (Compilers: Principles, Techniques & Tools), она также известна как "книга с драконом". К сожалению, она не очень подходит для самостоятельного обучения. Она хороша для преподавателей, чтобы выбрать темы на пару семестров для своих курсов.

Если ты все же решишь использовать "книгу с драконом", то лучше выбрать из нее определенные темы. Хорошо, если тебе в этом поможет твой ментор или преподаватель. Мы бы рекомендовали изпользовать эту книгу скорее как дополнение к видеолекциям. Например, к лекциям Алекса Айкена на edX.

Альтернативы на русском: Драконы на русском:)

Распределенные системы

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

Для самостоятельного изучения мы предлагаем книгу Мартина Клеппманна Designing Data-Intensive Applications. Эта книга отличается от классических учебников в этой области: она легко читается и создана для тех, кто хочет применять полученные знания на практике. В то же время, книга дает достаточно глубокие фундаментальные знания.

Для тех, кто предпочитает классику, мы советуем Распределенные системы. Принципы и парадигмы Таненбаума (Distributed Systems, 3rd Edition*). Она доступна онлайн бесплатно на английском языке.

Замечательный курс для тех, кто предпочитает видеолекции - курс 6.824 от MIT, который читает Роберт Морис. Дополнительные материалы доступны здесь.

Не важно, используешь ли ты учебник или другие ресурсы, для изучения распределенных систем также обязательно чтение статей. Хороший список статей можно найти здесь. Еще очень советуем посетить ресурс Papers We Love.

Альтернативы на русском: Высоконагруженные приложения перевод на русском, Распределенные системы.

Часто задаваемые вопросы

Какая целевая аудитория у этого гайда?

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

А что насчет AI/графики/еще-какой-то-темы?

Мы пытались составить список тем, которые, как мы думаем, должен знать каждый практикующий программист, вне зависимости от специализации или отрасли, в которой он работает. По нашему опыту, изучение тем, собранных здесь, принесет наибольшую пользу большинству программистов, которые пришли в индустрию, не имея формального образования в компьютерных науках. Изучив эти темы, ты построишь фундамент для того, чтобы продолжить свой путь, исследуя уже более специфические области. Более того, после их изучения тебе будет гораздо легче самостоятельно выбирать учебники и статьи, изучать другие темы. Однако вот пара полезных ресурсов, которые мы хотим порекомендовать в качестве "элективов":

  • Для изучения искусственного интеллекта: видео и проекты (Pacman projects) вводного курса по AI университета Беркли. В качестве учебника можно взять Искусственный интеллект: современный подход (Artificial Intelligence: A Modern Approach) Рассела и Новига.
  • Для машинного обучения: курс Andrew Ng на Coursera. Убедись, что хорошо понимаешь все основы, прежде чем переходить к более сложным и хайповым темам, как, например, глубокое обучение.
  • Для компьютерной графики: пройди курс CS 184 Беркли и используй в качестве учебника Computer Graphics: Principles and Practice.

Насколько важен порядок прохождения курсов?

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

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

Чем этот гайд отличается от программы Open Source Society и freeCodeCamp?

Данный гайд был создан в 2016. В то время гайд Open Source Society содержал слишком много предметов, некоторые предложенные для изучения ресурсы были неполноценны, к тому же, в нем не обосновывался выбор предложенных для изучения аспектов и курсов. Мы стремились собрать в нашем гайде только те ресурсы, которые действительно должен знать каждый программист, вне зависимости от его специализации. К тому же, мы старались обосновать наш выбор и дать понимание, зачем нужен каждый из приведенных здесь ресурсов. Со временем гайд Open Source Society был улучшен, однако мы все еще считаем, что наш гайд предлагает более понятную и целостную программу.

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

Что насчет языка X?

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

А что насчет технологии X, о которой все говорят?

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

Почему вы рекомендуете книгу Структура и интерпретация компьютерных программ, несмотря на то, что она сложна для понимания?

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

Почему вы рекомендуете "книгу с драконом"?

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

Как получить доступ к книгам и учебникам, не потратив кучу денег?

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

Кто создал этот гайд?

Первую версию этого гайда создали Oz Nova и Myles Byrne, в 2020 он был обновлен Озом. Гайд основан на нашем опыте преподавания компьютерных наук более чем тысяче выпускников буткэмпа и программистов, не имеющих формального образования, - в маленьких оффлайн группах в Сан-Франциско и онлайн. Мы благодарим всех наших студентов за фидбек.

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

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