English
Markdown

Опануй комп'ютерні науки самотужки

Примітка: цей посібник було суттєво оновлено у травні 2020 року. Попередню версію можна переглянути тут (англійською).

Якщо ти – інженер-самоучка чи випускник буткемпу, зроби собі послугу – опануй комп’ютерні науки. На щастя, зараз можна здобути першокласну освіту в цій галузі, не витрачаючи роки та цілий статок на університетський диплом 💸.

Існує безліч доступних ресурсів, але одні є кращими за інші. Ти потребуєш не чергового списку в дусі "200+ безкоштовних онлайн курсів", а відповідей на ці запитання:

  • Які дисципліни варто вивчати, і навіщо?
  • Яка книга або серія відеолекцій найкраще підходить для вивчення кожної з них?

Цей посібник – наша спроба дати вичерпні відповіді.

Стисло

Вивчай ці дев’ять дисциплін у зазначеному порядку, користуючись запропонованою книгою або серією відеолекцій (а краще всім одразу). Постав мету в 100-200 годин на вивчення кожної з тем, та, якщо потрібно, повертайся до них у міру розвитку своєї кар’єри 🚀.

Предмет Навіщо вивчати? Найкраща книга Найкращі відео
Програмування Аби не бути людиною, яка "не зовсім розуміє" щось типу рекурсії. Structure and Interpretation of Computer Programs Лекції Браяна Гарві з Берклі CS 61A
Архітектура комп'ютера Якщо ти не маєш ґрунтовного розуміння, як насправді працює комп’ютер, то всі твої високорівневі абстракції будуть крихкими. Computer Systems: A Programmer's Perspective Берклі CS 61C
Алгоритми та структури даних Якщо ти не вмієш використовувати хоча б найбільш розповсюджені структури даних, на зразок стеків, черг, дерев та графів, то не зможеш ефективно розв’язувати складні завдання. The Algorithm Design Manual Лекції Стівена Скієни
Математика для комп'ютерних наук За своєю суттю, комп’ютерні науки – лише одна з галузей прикладної математики. Вочевидь, її знання надасть тобі значну конкурентну перевагу. Mathematics for Computer Science Лекції Тома Лейтона з MIT 6.042J
Операційні системи Більшість коду, який ти пишеш, виконується операційною системою, тож потрібно знати, як ці речі взаємодіють між собою. Operating Systems: Three Easy Pieces Берклі CS 162
Комп'ютерні мережі Інтернет абсолютно скрізь: дізнайся, як він працює, аби повною мірою використовувати його потенціал. Computer Networking: A Top-Down Approach Стенфорд CS 144
Бази даних Дані лежать в основі більшості сучасних програм, однак лише одиниці знають, як насправді влаштовані системи баз даних. Readings in Database Systems Лекції Джо Геллерштайна з Берклі CS 186
Мови та компілятори Якщо ти розумієш, як працюють мови програмування та компілятори, то зможеш писати кращий код і навчатися нових мов набагато легше. Crafting Interpreters Курс Алекса Айкена на edX
Розподілені системи В наші дні переважна більшість систем – розподілені системи. Designing Data-Intensive Applications Мартіна Клеппманна MIT 6.824

Все ще забагато?

Якщо ідея самостійного вивчення дев’яти тем протягом кількох років видається нездоланною, то ми пропонуємо зосередитися лише на двох книгах: Computer Systems: A Programmer's Perspective і Designing Data-Intensive Applications. З нашого досвіду, вони більш ніж вартують витраченого на них часу, особливо для самоучок і випускників буткемів, що наразі працюють із мережевими програмами. Вони також можуть слугувати відправною точкою для інших тем та ресурсів, перелічених вище.

Навіщо вивчати комп'ютерні науки?

Є два типи програмістів: ті, хто розуміють комп’ютерні науки достатньо добре, щоб виконувати складну роботу та впроваджувати інноваційні рішення, і ті, хто просто обходиться кількома інструментами високого рівня, через відсутність поглиблених знань.

Усі вони звуться програмістами та отримують приблизно однакові зарплати на початкових етапах. Однак інженери першого типу згодом переходять до змістовнішої та високооплачуванішої роботи, хай то буде комерційна діяльність чи проривні проєкти з відкритим кодом, управління чи високоякісні індивідуальні внески.

Глобальною системою SMS щоденно надсилається близько 20 мільярдів повідомлень. Зараз через WhatsApp надсилається близько 42 мільярдів. З 57 інженерами у штаті.

— Бенедікт Еванс

Інженери першого типу отримують поглиблені знання в сфері комп’ютерних наук, послуговуючись традиційними методами або невпинно навчаючись протягом своєї кар’єри. Представники ж другого типу лишаються на поверхні, вивчаючи конкретні інструменти та технології, а не теорію, на якій вони засновані, й підхоплюючи нові навички лише тоді, коли вітри технологічної моди змінюють свій напрямок.

Нині все більше людей іде в IT-індустрію, тоді як кількість дипломованих фахівців із комп’ютерних наук залишається більш-менш сталою. Таким чином, надлишок людей "другого типу" призводить до скорочення їхніх можливостей працевлаштування та утримує їх від змістовнішої роботи в галузі. Не важливо, прагнеш ти стати інженером першого типу чи просто хочеш мати більший попит для роботодавців і почувати себе впевненіше, бо вивчення комп’ютерних наук – це єдиний надійний шлях.

Тематичні посібники

Програмування

Більшість бакалаврських програм із комп’ютерних наук починається із введення у програмування. Найкращі з цих курсів підійдуть не лише початківцям, а й тим, хто пропустив фундаментальні концепції та моделі програмування, коли вперше навчався писати код.

На цю тему ми зазвичай рекомендуємо класичну працю – Structure and Interpretation of Computer Programs (скор. SICP). Вона доступна цілком безкоштовно (англійською) як у вигляді електронної книги, так і у вигляді курсу онлайн-лекцій від MIT. Хоча ці лекції чудові, замість них ми пропонуємо лекції Браяна Гарві для курсу 61A університету Берклі. На нашу думку, вони більш досконалі та краще підходять новачкам.

Рекомендуємо опрацювати хоча б три перших розділи книги Structure and Interpretation of Computer Programs та виконати вправи до них. У якості додаткової практики, розв’яжіть невеличкі завдання на exercism.

Оскільки цей посібник було вперше опубліковано у 2016-му році, нас часто запитують, чи рекомендуємо ми нову версію курсу 61A від Джона ДеНеро та/або відповідну їй книгу Composing Programs, що "пішла стопами SICP", проте використовує Python. Ми вважаємо, що ресурси від ДеНеро також чудові, і деяким студентам вони сподобаються навіть більше, та все ж ми наполегливо радимо почати з SICP, Scheme та курсу Браяна Гарві.

Чому? Бо SICP є унікальною у своїй здатності змінити твої фундаментальні переконання про комп’ютери та програмування як таке (принаймні потенційно). Звісно, вона підійде не всім. Дехто зненавидить книгу, інші не підуть далі за перші сторінки. Проте вона має великий потенціал і варта того, щоб спробувати її прочитати.

Якщо Structure and Interpretation of Computer Programs все ж не подобається, спробуй Composing Programs. Якщо й ця книга все одно не підходить, спробуй How to Design Programs. Якщо ж узагалі жодна з них не влаштовує, то це, ймовірно, означає, що тобі слід зосередитись на інших темах, а до програмування як теоретичної дисципліни повернутися через рік-другий.

І наостанок, мусимо уточнити: цей посібник НЕ розрахований на цілковитих новачків. Він націлений радше на компетентних програмістів, що не мають попереднього досвіду в комп’ютерних науках й радо шукають можливості заповнити якісь прогалини у знаннях. Той факт, що ми включили розділ "програмування" до нашого посібника, є лише нагадуванням, що завжди є куди зростати. Якщо ти ніколи раніше не програмував, але дуже хотів би, то можеш спробувати посібник типу цього.

Архітектура комп'ютера

Архітектура комп’ютера (також відома, як "комп’ютерні системи" або "організація комп’ютера") – це важлива тема, за допомогою якої ти можеш дізнатись, які обчислення ховаються за програмним забезпеченням. З нашого досвіду, саме цією сферою найбільше нехтують інженери-самоучки.

Наш улюблений підручник для початківців – Computer Systems: A Programmer's Perspective. Який-небудь типовий вступний курс з архітектури комп’ютера, заснований на цій книзі, охопив би більшу частину розділів 1-6.

Ми любимо цей підручник за практичний підхід, орієнтований на програмістів. Попри те, що архітектура комп’ютера містить набагато більше за описане в книзі, ця праця слугує чудовою відправною точкою для тих, хто хоче зрозуміти комп’ютерні системи насамперед задля написання швидших, ефективніших та надійніших програм.

А тим, хто шукає лагідніший вступ до теми, який однаково добре висвітлював би як апаратне, так і програмне забезпечення, ми рекомендуємо книгу The Elements of Computing Systems, що також відома під назвою "Nand2Tetris". Цей підручник дає вичерпні знання про те, як працює комп’ютер. Кожен розділ націлений на проєктування одної з частин великої системи — гри в тетріс, охоплюючи всі аспекти: від написання найпростішої логіки в HDL до роботи з центральним процесором та асемблером.

Ми радимо прочитати перші шість розділів книги та завершити відповідні проєкти. Це розвине твоє розуміння зв’язку між архітектурою машини та програмним забезпеченням, яке на ній працює.

Перша половина книги (і всі її проєкти) доступні безкоштовно на вебсайті Nand2Tetris. До того ж вона доступна, як курс із відеосупроводом на Coursera (прим. перекл.: на YouTube можна знайти неофіційні плейлисти як для першої, так і для другої частини).

Намагаючись бути простішим і зрозумілішим, Nand2Tetris, на жаль, поступається глибиною. Зокрема, в цій книзі не розкрито два дуже важливих поняття в сучасних комп’ютерних архітектурах – конвеєрність та ієрархія пам’яті. Візьми це до уваги.

Як тільки ти розберешся з Nand2Tetris, ми рекомендуємо повернутися до Computer Systems: A Programmer's Perspective чи спробувати почитати чудову книгу, що вже стала класичною – Computer Organization and Design Паттерсона і Геннессі. Але слід зауважити, що ця праця дуже докладна, і не кожен її розділ вартує твоєї уваги; ми пропонуємо ознайомитися з курсом CS61C "Great Ideas in Computer Architecture" університету Берклі для вивчення якихось окремих тем. Конспекти лекцій та лабораторні роботи доступні онлайн, а минулі версії лекцій можна знайти в інтернет-архіві.

Computer Systems: A Programmer's Perspective

Апаратне забезпечення – це платформа

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

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

Ми погоджуємось із загальноприйнятою думкою, що знання типових алгоритмів та структур даних є одним із найважливіших аспектів освіти з комп’ютерних наук. Це також є чудовим місцем для тренування загальних навичок розв’язання проблем, які можна застосувати до будь-якої іншої галузі навчання.

Існують сотні книг по алгоритмах, однак наша улюблена – The Algorithm Design Manual Стівена Скієни. Автор вочевидь полюбляє розв’язувати важкі алгоритмічні задачі, через що, зазвичай, йому вдається прищепити такий же ентузіазм своїм студентам і читачам. На нашу думку, два більш часто пропоновані тексти, а саме Introduction to Algorithms Кормена та Algorithms Седжвіка, надто вже сильно наголошують на теоретичних доводах, а тому не дуже підходять тим, чия мета – навчитися розв’язувати проблеми на практиці.

Для учнів, які надають перевагу відеолекціям, Стівен Скієна також має свій відеокурс, опублікований на YouTube. Окрім того, нам дуже подобається курс Тіма Рафґардена, доступний на Coursera, або інших платформах. Тебе може зачепити лекційний стиль Скієни чи Рафґардена, а може й ні – все залежить від твоїх особистих уподобань. Насправді існує кільканадцять хороших альтернатив, тож якщо ти знайдеш іншу, яка тобі до вподоби, радимо дотримуватися її!

Для практики, ми радимо розв’язувати завдання на LeetCode. Зазвичай там трапляються цікаві проблеми, що супроводжуються прикладами рішень та їх обговореннями. Вони також допоможуть перевірити ваш прогрес у питаннях, які часто використовуються під час технічних співбесід у більш конкурентоспроможних компаніях, що займаються програмним забезпеченням. Ми пропонуємо виконати близько сотні випадкових завдань протягом навчання.

І зрештою, ми наполегливо радимо How to Solve It у якості чудового й унікального посібника із розв’язання загальних проблем; він однаково добре застосовний як до комп’ютерних наук, так і до математики.

The Algorithm Design Manual How to Solve It

У мене є лише один метод, який я наполегливо рекомендую — він називається "подумай, перш ніж писати".

— Річард Геммінг

Математика для комп'ютерних наук

У певному сенсі комп’ютерні науки є такою собі велетенською гілкою прикладної математики. Хоча багато програмістів намагаються ігнорувати цей факт, інколи навіть досягаючи успіху, ми заохочуємо тебе поставитись до нього серйозно. Вивчення математики надасть тобі неймовірну конкурентну перевагу над тими, хто цього не робить.

Найбільш релевантну галузь математики для комп’ютерних наук зазвичай називають "дискретною математикою", де "дискретна" є протилежністю "неперервної". По суті, йдеться про набір цікавих прикладних тем поза математичним аналізом. Зважаючи на розпливчасте визначення, немає сенсу намагатися охопити всю широту "дискретної математики". Більш реалістична мета – зміцнити розуміння логіки, комбінаторики, ймовірностей, множин, графів, а також основ теорії чисел, що широко використовується у криптографії. Окремої уваги заслуговує лінійна алгебра, зважаючи на її важливість у комп’ютерній графіці та машинному навчанні.

Почати вивчення дискретної математики ми пропонуємо з конспекту лекцій Ласло Ловаса. Професор Ловас добре попрацював, зробивши зміст доступним та інтуїтивно зрозумілим, тому, на нашу думку, ця праця є помітно кращою за більшість формальних текстів.

Більш просунутим читачам радимо книгу Mathematics for Computer Science, яка фактично є конспектом лекцій для однойменного курсу MIT. Відеолекції курсу також є у вільному доступі, і ми рекомендуємо саме їх для поглибленого вивчення дискретної математики.

Знайомство із алгеброю ми пропонуємо почати з відеосерії Essence of linear algebra, а потім перейти до книги та відеолекцій Гілберта Стренга.

Якщо люди не вірять, що математика проста, це лише тому, що вони не усвідомлюють, наскільки складним є життя.

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

Операційні системи

Operating System Concepts (так звана "книга з динозаврами") та Modern Operating Systems є класичними книгами про операційні системи. Проте слід зауважити, що обидві вони викликали шквал критики, через свою заплутаність та "недружність" до студентів.

Operating Systems: Three Easy Pieces (скор. OSTEP) – хороша альтернатива, яка є у вільному доступі англійською мовою. Особливо нам подобається структура книги й те, як легко вона читається. Ми вважаємо, що вправи в ній також варті уваги.

Після OSTEP ми радимо вивчити будову окремої ОС, використовуючи підручники типу "Архітектура {назва ОС}", таких як 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. Зрештою, в OSTEP є розділ із лабораторними роботами для xv6, сповнений корисних ідей для потенційних проєктів.

Комп'ютерні мережі

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

Наш улюблений підручник на цю тему – Computer Networking: A Top-Down Approach. Книга містить невеличкі проєкти та вправи, серед яких нам особливо подобаються "Лабораторні роботи з Wireshark", які автори щедро розмістили в Інтернеті.

Для тих, хто надає перевагу відеолекціям, ми пропонуємо курс Стенфордського університету Introduction to Computer Networking, який раніше був доступний на платформі Стенфордського MOOC "Lagunita", але тепер, на жаль, лише у вигляді неофіційних плейлистів на YouTube.

Ти не можеш подивитись в кришталеву кулю і побачити майбутнє. Інтернет у майбутньому стане таким, яким його зробить суспільство.

— Боб Кан

Computer Networking: A Top-Down Approach

Бази даних

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

Це відносно молода галузь досліджень (з’явилася після 1970-х років), в якій існують вельми сильні комерційні стимули, щоб ідеї залишалися за зачиненими дверима. Крім того, багато потенційно чудових авторів, які могли б написати відповідні підручники, надали перевагу роботі у великих компаніях або заснуванню власних.

За таких обставин радимо взагалі уникати підручників, а натомість почати із записів курсу CS 186 Джо Геллерштайна для університету Берклі, і поступово переходити до читання статей на цю тему.

Одна з таких статей, яку особливо варто згадати для початківців – "Architecture of a Database System". Вона надасть тобі загальне уявлення про те, як працюють реляційні системи керування базами даних (РСКБД/RDBMS). Ця праця стане корисною основою для подальшого навчання.

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.

Мови та компілятори

Більшість програмістів вивчають безпосередньо мови програмування, тоді як більшість фахівців із комп’ютерних наук вивчають те, як вони влаштовані. Це дає явну перевагу перед програмістами навіть у сфері програмування! Справжні фахівці мають узагальнені знання, а отже здатні зрозуміти, як працює нова технологія, набагато глибше та швидше за тих, хто просто вивчав певні мови.

Спочатку ми радимо ознайомитися з Crafting Interpreters Боба Ністрома. Текст добре організований, його надзвичайно цікаво читати, і він добре підходить для тих, чия головна мета – краще розуміти, як працюють мови, а також інструменти, які вони використовують. Ми рекомендуємо опрацювати весь матеріал і спробувати пройти якісь челенджі, аби підтримати інтерес.

Більш традиційною рекомендацією є Compilers: Principles, Techniques & Tools, яку часто називають "книгою з драконом". На жаль, вона не призначена для самостійного навчання, а радше є матеріалом для викладачів, щоб обрати теми для своїх курсів на 1-2 семестри.

Якщо ти все ж вирішиш використовувати "книгу з драконом", то дуже важливо правильно підібрати теми, в ідеалі за допомогою наставника. Також радимо спробувати цю книгу, як довідник до певної серії відеолекцій. Наприклад, до лекцій Алекса Айкена на edX.

Compilers: Principles, Techniques & Tools

Не будь шаблонним програмістом. Натомість створюй інструменти для користувачів та інших програмістів. Згадай історію текстильної та металургійної промисловості: ти хочеш створювати машини та інструменти, чи керувати ними?

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

Розподілені системи

Разом зі збільшенням кількості комп’ютерів, вони стрімко почали поширюватися. Якщо раніше бізнеси скуповували все потужніші процесори, то тепер, як правило, навіть найменші програми працюють на кількох машинах. Розподілені системи — це наука про те, як осмислювати компроміси, пов’язані з таким підходом.

Для самостійного вивчення ми радимо книгу Мартіна Клеппманна Designing Data-Intensive Applications. На відміну від традиційних підручників для програмістів-практиків, цю книгу легко читати, але від того вона не стає менш глибокою чи точною.

Для тих, хто надає перевагу більш класичним працям або просто шукає онлайн-підручники у вільному доступі, рекомендуємо Distributed Systems, 3rd Edition Мартена ван Стіна та Ендрю Таненбаума. Ця книга розповсюджується безкоштовно англійською мовою.

Для тих, кому до вподоби відеолекції, радимо чудовий курс 6.824 від MIT, який викладає Роберт Морріс. Додаткові матеріали доступні тут.

Незалежно від вибору підручника чи будь-яких інших другорядних ресурсів, вивчення розподілених систем абсолютно точно вимагає читання статей. Гарний перелік можна знайти за посиланням. Окрім цього, ми щиро заохочуємо відвідати ваш місцевий осередок Papers We Love.

Часті питання

Яка цільова аудиторія цього посібника?

Ми розраховуємо на те, що цим посібником будуть користуватися програмісти-самоучки, випускники буткемпів і студенти коледжів, які бажають доповнити формальну освіту, а також прості учні старшої школи, що захоплюються програмуванням. Питання про те, з якого етапу починати навчання, є суто індивідуальним, але більшість людей, як правило, краще засвоює теорію комп’ютерних наук, маючи певний професійний досвід. Наприклад, ми помітили, що студенти полюбляють вивчати системи баз даних, якщо вже працювали з ними професійно, або комп’ютерні мережі, якщо займались розробкою певного вебпроєкту.

А як щодо AI, графіки чи якоїсь іншої теми?

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

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

Насправді-то, усі ці предмети значною мірою перетинаються і посилаються один на одного. Візьмемо, наприклад, взаємозв’язок дискретної математики та алгоритмів: спочатку вивчення математики допоможе глибше проаналізувати й краще зрозуміти алгоритми, тоді як вивчення алгоритмів дасть мотивацію, щоб надалі розбиратися в дискретній математиці. В ідеалі краще неодноразово повертатися до кожної з цих тем протягом своєї кар’єри.

Таким чином, запропонована послідовність повинна допомогти тобі просто почати… якщо ти маєш вагому причину, аби навчатися в іншій послідовності – спробуй. Найважливішими передумовами/пріоритетами, на нашу думку, є: вивчення архітектури комп’ютера перед операційними системами або базами даних, а також вивчення мережі та операційних систем перед розподіленими системами.

Чим цей посібник відрізняється від програми Open Source Society та freeCodeCamp?

Коли цей посібник було вперше написано у 2016 році, у посібнику OSS було забагато тем, до більшості з яких пропонувалися неповноцінні ресурси. До того ж посібник не містив обґрунтування того, які аспекти окремих курсів потрібно вивчати, та чому саме вони варті уваги. Ми прагнули обмежити список тільки тими ресурсами, які дійсно повинен знати кожен інженер програмного забезпечення, незалежно від його спеціалізації. Окрім того, ми намагалися обґрунтувати наш вибір і дати розуміння, навіщо потрібний кожен із наведених вище ресурсів. У наступні роки OSS було удосконалено, проте ми все ще вважаємо, що наш посібник пропонує більш зрозумілий і повноцінний шлях.

freeCodeCamp, в свою чергу, здебільшого зосереджений саме на програмуванні, а не на комп’ютерних науках як таких. Пояснення, навіщо тобі потрібно вивчати комп’ютерні науки, можна знайти вище. Проте, якщо ти тільки починаєш програмувати, ми радимо спочатку пройти freeCodeCamp, а потім, через рік-два, повернутися до нашого посібника.

А як щодо мови X?

Вивчення конкретної мови програмування знаходиться в зовсім іншій площині, ніж вивчення певної галузі комп’ютерних наук — опанувати мову набагато легше, але, вочевидь, і саме це знання буде значно менш цінним. Якщо ти вже знаєш пару мов, ми радимо просто слідувати нашому посібнику, а нові мови вивчати в проміжках між вивченням зазначених тем або взагалі відкласти їх на потім. Якщо добре знаєш програмування (наприклад, прочитавши Structure and Interpretation of Computer Programs) і, особливо, якщо ти вже ознайомився із компіляторами, то на вивчення основ нової мови знадобиться не більше кількох днів, а бібліотеки, інструменти й екосистему можна буде засвоїти в процесі роботи.

А як щодо новомодної технології X?

Жодна з цих технологій не важлива настільки, щоб її можна було взяти за основу твоєї освіти. З іншого боку, чудово, що тобі подобається навчатися чомусь новому. Хитрість тут полягає в тому, щоб повернутися до "джерел" та концепцій, на яких ґрунтується технологія, аби мати змогу використовувати її повною мірою.

Чому ви досі рекомендуєте Structure and Interpretation of Computer Programs?

Слухай, просто спробуй. Для когось ця книга перегорнула саме уявлення про програмування, а це, взагалі-то, характеристика, що притаманна дуже малій кількості інших книг. Якщо SICP не сподобається, завжди можна спробувати щось інше і, можливо, повернутися до неї пізніше.

Чому ви досі рекомендуєте "книгу з драконом"?

Наразі, т.з. "книга з драконом" залишається єдиним вичерпним ресурсом про компілятори. Вона має погану репутацію здебільшого через те, що занадто сильно наголошує на таких не дуже актуальних та модних у наш час темах, як, наприклад, парсинг. Річ у тім, що книга ніколи не була призначена для вивчення від краю до краю. Натомість вона має надати достатньо матеріалу для викладача, аби той міг скласти курс на її основі. Подібним чином, той, хто навчається самостійно, може підбирати необхідні теми власноруч, або, що навіть краще, слідувати пропозиціям досвідчених викладачів. Просто візьми за основу їхні курси, що є у вільному доступі.

Як отримати якісні підручники, не витративши на них всі свої заощадження?

Багато запропонованих нами підручників можна знайти онлайн у вільному доступі (прим. перекл.: переважно, англійською), завдяки щедрості їхніх авторів. Якщо книга не доступна безкоштовно, ми радимо купувати потримані екземпляри. Зазвичай книги перевидаються по кілька разів, і старіші версії теж цілком підійдуть. Вірогідність того, що нова версія в 10 разів краща за попередні, надзвичайно мала, хоч вона зазвичай набагато дорожча.

Хто створив цей посібник?

Першу версію цього посібнику створили Оз Нова і Майлс Бірн, із подальшим оновленням від Оза у 2020 році. Посібник заснований на нашому досвіді викладання комп’ютерних наук для понад 1000 інженерів, переважно самоучок, і випускників буткемпів у невеликих офлайн-групах у Сан-Франциско та в режимі онлайн. Дякуємо всім нашим студентам за постійні відгуки про ресурси для самонавчання.