Note
Цей посібник був суттєво оновлений у травні 2020 року. Попередню версію можна переглянути тут (англійською).
Якщо ти – розробник-самоучка чи випускник буткемпу, тобі неодмінно слід навчитись інформатики. На щастя, зараз можна здобути освіту рівня найкращих університетів, не витрачаючи роки та цілий статок на диплом 💸.
Існує безліч доступних ресурсів, але декотрі з них є кращими за інші. Тобі не потрібен черговий список, на кшталт "200+ безкоштовних онлайн курсів". Натомість з'ясуй:
- Які дисципліни тобі варто вивчати, і навіщо?
- Яка книга або серія відеолекцій найкраще підходить для вивчення кожної з них?
Цей посібник – наша спроба дати остаточні відповіді на вищезгадані запитання.
Вивчай ці дев'ять дисциплін у зазначеному порядку, користуючись запропонованою книгою або серією відеолекцій (а краще всім разом). Постав мету в 100-200 годин на вивчення кожної з тем, та, якщо потрібно, повертайся до них у міру розвитку своєї кар'єри 🚀.
| Предмет | Навіщо вивчати? | Найкраща книга | Найкращі відео |
|---|---|---|---|
| Програмування | Аби не бути людиною, яка "не зовсім розуміє" щось типу рекурсії. | Structure and Interpretation of Computer Programs | Brian Harvey's Berkeley CS 61A |
| Архітектура комп'ютера | Якщо ти не маєш ґрунтовної ментальної моделі того, як насправді працює комп'ютер, то всі твої високорівневі абстракції будуть крихкими. | Computer Systems: A Programmer's Perspective | Berkeley CS 61C |
| Алгоритми та структури даних | Якщо ти не вмієш використовувати хоча б найбільш розповсюджені структури даних, на зразок стеків, черг, дерев та графіків, то не зможеш ефективно розв'язувати складні завдання. | The Algorithm Design Manual | Steven Skiena's lectures |
| Математика для інформатиків | За своєю суттю, інформатика – лише одна з галузей прикладної математики. Вочевидь, її знання надасть тобі значну конкурентну перевагу. | Mathematics for Computer Science | Tom Leighton's MIT 6.042J |
| Операційні системи | Більшість коду, який ти пишеш, виконується операційною системою, тож потрібно знати, як ці речі взаємодіють між собою. | Operating Systems: Three Easy Pieces | Berkeley CS 162 |
| Комп'ютерні мережі | Інтернет абсолютно скрізь: дізнайся, як він працює, аби повною мірою використовувати його потенціал. | Computer Networking: A Top-Down Approach | Stanford CS 144 |
| Бази даних | Дані лежать в основі більшості сучасних програм, але лише одиниці розуміють, як насправді працюють системи баз даних. | Readings in Database Systems | Joe Hellerstein's Berkeley CS 186 |
| Мови та компілятори | Якщо ти розумієш, як працюють мови програмування та компілятори, то зможеш писати кращий код і навчатися нових мов набагато легше. | Crafting Interpreters | Alex Aiken's course on edX |
| Розподілені системи | В наші дні переважна більшість систем – розподілені системи. | Designing Data-Intensive Applications | MIT 6.824 |
Якщо ідея самостійного вивчення 9 тем протягом кількох років видається нездоланною, то ми пропонуємо зосередитися лише на двох книгах: Computer Systems: A Programmer's Perspective і Designing Data-Intensive Applications. З нашого досвіду, вони цілком і повністю вартують витраченого на них часу, особливо для самоучок і випускників буткемів, що наразі працюють із мережевими програмами. Вони також можуть слугувати відправною точкою для інших тем та ресурсів, перелічених вище.
Глобальною системою SMS щоденно надсилається близько 20 мільярдів повідомлень. Зараз через WhatsApp надсилається близько 42 мільярдів. З 57 інженерами у штаті.
— Бенедікт Еванс
Є 2 типи розробників ПЗ: ті, хто розуміють інформатику достатньо добре, щоб виконувати складну роботу та впроваджувати інноваційні рішення, і ті, хто просто обходиться кількома інструментами високого рівня, через відсутність поглиблених знань.
Усі вони називають себе розробниками та отримують приблизно однакові зарплати на початкових етапах. Однак інженери першого типу згодом переходять до змістовнішої та високооплачуванішої роботи, хай то буде комерційна діяльність чи проривні проєкти з відкритим кодом, управління чи високоякісні індивідуальні внески.
Розробники першого типу отримують поглиблені знання в інформатиці, послуговуючись традиційними методами або невпинно навчаючись протягом своєї кар'єри. Другий тип програмістів лишається на поверхні, вивчаючи конкретні інструменти та технології, а не теорію, на якій вони засновані. Представники цього типу підхоплюють нові навички лише тоді, коли вітри технологічної моди змінюють свій напрямок.
На цей час все більше людей іде в 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. Якщо жодна з них не влаштовує, то це, ймовірно, означає, що тобі слід зосередитись на інших темах, а до дисципліни програмування повернутися через рік-другий.
І наостанок, мусимо уточнити: цей посібник НЕ розрахований на цілковитих новачків. Він націлений радше на компетентних програмістів, що не мають попереднього досвіду в інформатиці й радо шукають можливості заповнити якісь прогалини у знаннях. Той факт, що ми включили розділ "програмування" до нашого посібника, є лише нагадуванням, що завжди є куди рости. Якщо ти ніколи раніше не програмував, але дуже хотів би, то можеш спробувати посібник типу цього.
Апаратне забезпечення – це платформа.
— Майк Актон, Engine Director в Insomniac Games (переглянь його виступ на CppCon)
Архітектура комп'ютера (також відома, як "комп'ютерні системи" або "організація комп'ютера") – це важлива тема, за допомогою якої ти можеш дізнатись, які обчислення ховаються за програмним забезпеченням. З нашого досвіду, саме цією сферою найбільше нехтують розробники-самоучки.
Наш улюблений підручник для початківців – 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" університету Берклі для вивчення якихось окремих тем. Конспекти лекцій та лабораторні роботи доступні онлайн, а минулі версії лекцій можна знайти в інтернет-архіві.
У мене є лише один метод, який я наполегливо рекомендую — він називається "подумай, перш ніж писати".
— Річард Геммінг
Ми погоджуємось із загальноприйнятою думкою про те, що знання типових алгоритмів та структур даних є одним із найважливіших аспектів інформатичної освіти. Це також є чудовим місцем для тренування загальних навичок розв'язання проблем, які можна застосувати до будь-якої іншої галузі навчання.
Існують сотні книг по алгоритмах, але наша улюблена – The Algorithm Design Manual Стівена Скієни. Автор вочевидь полюбляє розв'язувати важкі алгоритмічні задачі, через що, зазвичай, йому вдається прищепити такий же ентузіазм своїм студентам і читачам. На нашу думку, два більш часто пропоновані тексти (Introduction to Algorithms Кормена та Algorithms Седжвіка) надто вже сильно наголошують на теоретичних доводах, а тому не дуже підходять для тих, чия мета – навчитися розв'язувати проблеми на практиці.
Для учнів, які надають перевагу відеолекціям, Стівен Скієна також має свій відеокурс, опублікований на YouTube. Окрім того, нам дуже подобається курс Тіма Рафґардена, доступний на Coursera, або деінде ще. Тебе може зачепити лекційний стиль Скієни чи Рафґардена, а може й ні – все залежить від твоїх особистих уподобань. Насправді існує кільканадцять хороших альтернатив, тож якщо ти знайдеш іншу, яка тобі до вподоби, радимо дотримуватися її!
Для практики, ми радимо розв'язувати завдання на LeetCode. Зазвичай там трапляються цікаві проблеми, що супроводжуються прикладами рішень та їх обговореннями. Вони також допоможуть перевірити ваш прогрес у питаннях, які часто використовуються під час технічних співбесід у більш конкурентоспроможних компаніях, що займаються програмним забезпеченням. Ми пропонуємо розв'язати близько сотні випадкових завдань протягом навчання.
І зрештою, ми наполегливо радимо 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.
Зазвичай, самостійному вивченню систем баз даних потрібно приділяти більше уваги, ніж іншим темам.
Це відносно молода галузь досліджень (з'явилася після 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 Боба Ністрома. Текст добре організований, його надзвичайно цікаво читати, і він добре підходить для тих, чия головна мета – краще розуміти, як працюють мови та інструменти, що вони використовують. Ми рекомендуємо опрацювати весь матеріал і спробувати вирішити якісь завдання (челенджі/challenges), щоб підтримати інтерес.
Більш традиційною рекомендацією є Compilers: Principles, Techniques & Tools, яку часто називають "книгою з драконом". На жаль, ця книга не призначена для самостійного навчання, а радше є матеріалом для викладачів, щоб обрати теми для своїх курсів на 1-2 семестри.
Якщо ти все ж вирішиш використовувати "книгу з драконом", то дуже важливо правильно підібрати теми, в ідеалі за допомогою наставника. Також радимо спробувати цю книгу, як довідник до певної серії відеолекцій. Наприклад, до лекцій Алекса Айкена на edX.
Разом зі збільшенням кількості комп'ютерів, вони стрімко почали поширюватися. Якщо раніше бізнеси скуповували все потужніші процесори, то тепер, як правило, навіть найменші програми працюють на кількох машинах. Розподілені системи — це наука про те, як осмислювати компроміси, пов'язані з таким підходом.
Для самостійного вивчення ми радимо книгу Мартіна Клеппманна Designing Data-Intensive Applications. На відміну від традиційних підручників для програмістів-практиків, цю книгу легко читати, але від того вона не стає менш глибокою чи точною.
Для тих, хто надає перевагу більш класичним працям або просто шукає онлайн-підручники у вільному доступі, рекомендуємо Distributed Systems, 3rd Edition Мартена ван Стіна та Ендрю Таненбаума. Ця книга розповсюджується безкоштовно англійською мовою.
Для тих, кому до вподоби відеолекції, радимо чудовий курс 6.824 від MIT, який викладає Роберт Морріс. Додаткові матеріали доступні тут.
Незалежно від вибору підручника чи будь-яких інших другорядних ресурсів, вивчення розподілених систем абсолютно точно вимагає читання статей. Гарний перелік можна знайти за посиланням. Окрім цього, ми щиро заохочуємо відвідати ваш місцевий осередок Papers We Love.
Ми розраховуємо на те, що цим посібником будуть користуватися розробники-самоучки, випускники буткемпу, студенти коледжу, які бажають доповнити формальну освіту, і просто звичайні учні старшої школи, які захоплюються програмуванням. Питання про те, з якого етапу починати навчання, є суто індивідуальним, але більшість людей, як правило, краще засвоює теорію інформатики, маючи певний професійний досвід. Наприклад, ми помітили, що студенти полюбляють вивчати системи баз даних, якщо вже працювали з ними професійно, або комп'ютерні мережі, якщо займались розробкою певного вебпроєкту.
Ми намагалися обмежити наш список лише фундаментальними дисциплінами, які, на нашу думку, повинен знати кожен практикуючий інженер, незалежно від спеціальності чи галузі. З нашого досвіду, вивчення тем, зібраних тут, принесе максимальну користь переважній більшості розробників-самоучок, а також створить міцну основу для подальшого навчання. Згодом вам буде набагато легше самостійно визначитись із вибором відповідних підручників. Ось рекомендовані нами "відправні точки" для кількох популярних "факультативів":
- Для штучного інтелекту: ознайомся зі вступним курсом від університету Берклі, переглянувши відео та виконавши чудові проєкти Pacman (прим. перекл.: йдеться про курс CS 188, що також доступний за цим посиланням). Як підручник спробуй Artificial Intelligence: A Modern Approach Рассела та Норвіґа.
- Для машинного навчання: курс Ендрю Ина на Coursera. Наберись терпіння та переконайся, що ти розумієш основи, перш ніж перейти до складних нових тем, на кшталт глибокого навчання (прим. перекл.: від себе можу порекомендувати книгу Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow Орельєна Жерона).
- Для комп'ютерної графіки: опрацюй матеріал курсу CS 184 Берклі та використовуй Computer Graphics: Principles and Practice як підручник.
Насправді-то, усі ці предмети значною мірою перетинаються і посилаються один на одного. Візьмемо, наприклад, взаємозв'язок дискретної математики та алгоритмів: спочатку вивчення математики допоможе глибше проаналізувати й краще зрозуміти алгоритми, тоді як вивчення алгоритмів дасть мотивацію, щоб надалі розбиратися в дискретній математиці. В ідеалі краще неодноразово повертатися до кожної з цих тем протягом своєї кар'єри.
Таким чином, запропонована послідовність повинна допомогти тобі просто почати… якщо ти маєш вагому причину, аби навчатися в іншій послідовності – спробуй. Найважливішими "передумовами/пріоритетами", на нашу думку, є: вивчення архітектури комп'ютера перед операційними системами або базами даних, а також вивчення мережі та операційних систем перед розподіленими системами.
Коли цей посібник було вперше написано у 2016 році, у посібнику OSS було забагато тем, до більшості з яких пропонувалися неповноцінні ресурси. До того ж посібник не містив обґрунтування того, які аспекти окремих курсів потрібно вивчати, та чому саме вони варті уваги. Ми прагнули обмежити список тільки тими ресурсами, які дійсно повинен знати кожен розробник ПЗ, незалежно від його спеціалізації. Окрім того, ми намагалися обґрунтувати наш вибір і дати розуміння, навіщо потрібний кожен із наведених вище ресурсів. У наступні роки OSS було удосконалено, проте ми все ще вважаємо, що наш посібник пропонує більш зрозумілий і повноцінний шлях.
freeCodeCamp, в свою чергу, здебільшого зосереджений на програмуванні, а не на інформатиці. Пояснення, навіщо тобі потрібно вивчати саме інформатику, можна знайти вище. Проте, якщо ти тільки починаєш програмувати, ми радимо спочатку пройти freeCodeCamp, а потім, через рік-два, повернутися до нашого посібника.
Вивчення конкретної мови програмування знаходиться в зовсім іншій площині, ніж дослідження інформатики — вивчення мови набагато легше та, вочевидь, менш значуще. Якщо ти вже знаєш пару мов, ми радимо просто слідувати нашому посібнику, а нові мови вивчати в проміжках між вивченням зазначених тем або взагалі відкласти їх на потім. Якщо добре знаєш програмування (наприклад, прочитавши Structure and Interpretation of Computer Programs) і, особливо, якщо ти вже ознайомився із компіляторами, то на вивчення основ нової мови знадобиться не більше кількох днів, а бібліотеки, інструменти й екосистему можна буде засвоїти в процесі роботи.
Жодна з цих технологій не важлива настільки, щоб її можна було взяти за основу твоєї освіти. З іншого боку, чудово, що тобі подобається навчатися чомусь новому. Хитрість тут полягає в тому, щоб повернутися до "джерел" та концепцій, на яких ґрунтується технологія, аби мати змогу використовувати її повною мірою.
Слухай, просто спробуй. Дехто вважає, що від SICP вибухають мізки – характеристика, яка притаманна дуже малій кількості інших книг. Якщо SICP не сподобається, завжди можна спробувати щось інше і, можливо, повернутися до неї пізніше.
Наразі, т.з. "книга з драконом" залишається єдиним вичерпним ресурсом з компіляторів. Вона має погану репутацію здебільшого через те, що занадто сильно наголошує на таких не дуже актуальних та модних у наш час темах, як, наприклад, парсинг. Річ у тім, що книга ніколи не була призначена для вивчення від краю до краю. Натомість вона має надати достатньо матеріалу для викладача, аби той міг скласти курс на її основі. Подібним чином, той, хто навчається самостійно, може підбирати необхідні теми власноруч, або, що навіть краще, слідувати пропозиціям досвідчених викладачів. Просто візьми за основу їхні курси, що є у вільному доступі.
Багато запропонованих нами підручників можна знайти онлайн у вільному доступі (англійською), завдяки щедрості їхніх авторів. Якщо книга не доступна безкоштовно, ми радимо купувати потримані екземпляри. Зазвичай книги перевидаються по кілька разів, і старіші версії теж цілком підійдуть. Вірогідність того, що нова версія в 10 разів краща за попередні, надзвичайно мала, хоч вона зазвичай набагато дорожча.
Першу версію цього посібнику створили Оз Нова і Майлс Бірн, із подальшим оновленням від Оза у 2020 році. Посібник заснований на нашому досвіді викладання інформатики для понад 1000 розробників, переважно самоучок, і випускників буткемпів у невеликих офлайн-групах у Сан-Франциско та в режимі онлайн. Дякуємо всім нашим студентам за постійні відгуки про ресурси для самонавчання.