Skip to content

Latest commit

 

History

History
1949 lines (1627 loc) · 180 KB

File metadata and controls

1949 lines (1627 loc) · 180 KB

Coding Interview University

Оригінал англійською

Спочатку я створив це як короткий список завдань для вивчення тем, щоб стати інженером програмного забезпечення, але він збільшився до великого списку, який ви бачите сьогодні. Пройшовши цей навчальний план, мене найняли розробником програмного забезпечення в Amazon! Можливо, вам не доведеться вчитися так багато, як мені. У будь-якому випадку, все, що тобі потрібно, є тут.

Я навчався приблизно 8-12 годин на день, протягом декількох місяців. Це моя історія: Чому я навчався очно протягом 8 місяців для інтерв’ю в Google.

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

Перелічені тут ресурси добре підготують вас до технічної співбесіди практично в будь-якій компанії, включаючи гігантів: Amazon, Facebook, Google та Microsoft.

Нехай щастить!

Переклади:
Переклади в процесі:

Що це?

Програмування у дошки — з серіалу «Silicon Valley» HBO

Це мій багатомісячний план навчання, щоб стати інженером програмного забезпечення у великій компанії.

Необхідно:

  • Невеликий досвід кодування (змінні, цикли, методи/функції тощо)
  • Терпіння
  • Час

Зверніть увагу, що це навчальний план з інженерії програмного забезпечення, не фронтенд-разробки чи фуллстек-розробки. Для цих кар'єрних шляхів існують дійсно чудові дорожні карти та курси із завданнями в інших місцях (дивись https://roadmap.sh/ для отримання додаткової інформації).

На університетській програмі з комп'ютерних наук можна багато чому навчитися, але для проходження співбесіди достатньо знати лише 75%, тож саме про це я розповідаю тут. Для повної програми самонавчання компʼютерним наукам, ресурси для мого навчального плану були включені в дорожню карту курса з комп'ютерних наук Камран Ахмеда: https://roadmap.sh/computer-science.


Зміст

Навчальний план

Теми для вивчення

Отримання роботи

---------------- Все, що нижче цього пункту необов'язково ----------------


Чому це використовувати?

Якщо ви хочете працювати інженером програмного забезпечення у великій компанії, це те, що вам потрібно знати.

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

Коли я починав цей проект, я не знав, як відрізнити стек від купи, не знав нічого про Big-O, або про дерева, або про те, як обходити граф. Якби мені довелося писати алгоритм сортування, можу сказати, що він був би жахливим. Кожна структура даних, яку я коли-небудь використовував, була вбудована в мову, і я взагалі не знав, як вони працюють під капотом. Мені ніколи не доводилося керувати пам'яттю, хіба що процес, який я запускав, видавав помилку «не вистачило пам'яті», і тоді мені доводилося шукати обхідний шлях. У своєму житті я використовував кілька багатовимірних масивів і тисячі асоціативних масивів, але я ніколи не створював структури даних з нуля.

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

Як це використовувати

Весь текст нижче - це список, а вам потрібно пройти всі його елементи зверху вниз.

Я використовую спеціальну Github розмітку - markdown, щоб відслідковувати свій прогрес.

Якщо ви не хочете використовувати git

На цій сторінці натисніть кнопку «Код» ("Code") вгорі, а потім натисніть «Завантажити ZIP» ("Download ZIP"). Розпакуйте файл, і ви зможете працювати з текстовими файлами.

Якщо ви відкриваєте код у редакторі коду, який розуміє розмітку, ви побачите, що все відформатовано правильно.

How to download the repo as a zip file

Якщо вам зручно працювати з git

Створіть нову гілку, аби ви могли відмічати зроблені задачі, поміщаючи x в квадратні дужки: [x]

  1. Форкніть репозиторій GitHub: https://github.com/jwasham/coding-interview-university натиснувши на кнопку Форк (Fork).

    Fork the GitHub repo

  2. Клонуйте в локальний репозиторій:

    git clone https://github.com/<YOUR_GITHUB_USERNAME>/coding-interview-university.git
    cd coding-interview-university
    git remote add upstream https://github.com/jwasham/coding-interview-university.git
    git remote set-url --push upstream DISABLE  # so that you don't push your personal progress back to the original repo
  3. Позначте всі поля X після того, як ви внесли зміни:

    git commit -am "Marked personal progress"
    git pull upstream main  # keep your fork up-to-date with changes from the original repo
    
    git push # just pushes to your fork

Не почувайтесь недостатньо розумними

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

Про відеоресурси

Деякі відео доступні лише за умови реєстрації на курсах Coursera або EdX. Це так звані масові відкриті курси (MOOCs). Іноді заняття не проводяться, тому вам доведеться чекати кілька місяців, і ви не матимете доступу.

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

Оберіть мову програмування

Вам потрібно буде обрати мову програмування для співбесід з кодування, але вам також потрібно буде знайти мову, яку ви зможете використовувати для вивчення концепцій комп'ютерних наук.

Бажано, щоб мова була однаковою, щоб вам потрібно було володіти лише однією мовою.

Для цього навчального плану

Коли я складав навчальний план, я використовував 2 мови для більшої його частини: C та Python

Ви можете використовувати мову, якою вам зручно виконувати завдання на написання коду, але для великих компаній ці мови є найкращим вибором:

  • С: Дуже низький рівень. Дозволяє працювати з покажчиками та розподілом/виділенням пам'яті, тому ви відчуваєте структури даних та алгоритми до мозку кісток. У мовах вищого рівня, таких як Python або Java, вони приховані від вас. У повсякденній роботі це чудово, але коли ви вивчаєте, як побудовані ці низькорівневі структури даних, чудово відчувати себе ближче до металу.
    • C є скрізь. Ви побачите приклади в книгах, лекціях, відео, всюди під час навчання.
    • Мова програмування C, 2-е видання The C Programming Language, 2nd Edition
      • Це коротка книжка, але вона дасть вам чудові знання про мову C, і якщо ви трохи попрактикуєтесь ви швидко станете вправним. Розуміння C допоможе вам зрозуміти, як працюють програми та пам'ять.
      • Вам не потрібно заглиблюватися в книгу (або навіть дочитувати її). Просто дійдіть до того рівня, на якому вам буде комфортно читати і писати C.
  • Python: Python: Сучасна і дуже виразна, я вивчив її, тому що вона дуже корисна, а також дозволяє мені писати менше коду під час співбесіди.

Це мої уподобання. Ви, звичайно, робіть, що хочете.

Можливо, вам це не знадобиться, але ось кілька сайтів для вивчення нової мови:

Для співбесіди з кодування

Ви можете використовувати мову, якою вам зручно писати код під час співбесіди, але для великих компаній ці мови є найкращим вибором:

  • C++
  • Java
  • Python

Ви також можете скористатися цими, але спочатку почитайте навколо. Можуть бути застереження:

  • JavaScript
  • Ruby

Ось стаття, яку я написав про вибір мови для співбесіди: Pick One Language for the Coding Interview.

Це оригінальна стаття, на якій ґрунтується мій пост: Choosing a Programming Language for Interviews

Ви повинні дуже добре володіти мовою і бути обізнаним.

Дізнайтеся більше про вибір:

Дивіться мовні ресурси тут

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

Ця книга стане вашим фундаментом у вивченні компʼютерних наук.

Просто виберіть одну, мовою, яка вам буде зручна. Вам доведеться багато читати і кодувати.

C

  • Алгоритми на C, частини 1-5 (комплект), 3-тє видання Algorithms in C, Parts 1-5 (Bundle), 3rd Edition
    • Основи, структури даних, алгоритми сортування, пошуку та побудови графів

Python

Java

Ваш вибір:

  • Goodrich, Tamassia, Goldwasser
  • Sedgewick and Wayne:
    • Алгоритми Algorithms
    • Безкоштовний курс на Coursera, який охоплює книгу (викладається авторами!):

C++

Ваш вибір:

Книги з підготовки до співбесіди

Вам не потрібно купувати купу цих книг. Чесно кажучи, "Проходження співбесіди з кодування" ("Cracking the Coding Interview"), мабуть, достатньо, але я купив ще, щоб мати більше практики. Але я завжди роблю забагато.

Я купив обидві наступни книжки. Вони дали мені багато практики.

  • Програмування співбесіди розкрито: Кодування вашого шляху через співбесіду, 4-е видання Programming Interviews Exposed: Coding Your Way Through the Interview, 4th Edition
    • Відповіді на C++ та Java
    • Це хороша розминка перед Cracking the Coding Interview
    • Не надто складно. Більшість проблем можуть бути простішими, ніж ті, що ви побачите на співбесіді (з того, що я читав)
  • Проходження співбесіди з кодування, 6-й випуск Cracking the Coding Interview, 6th Edition
    • відповіді на Java

Якщо у вас багато вільного часу:

Оберіть одну:

Не робіть моїх помилок

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

Ось кілька помилок, яких я припустився, щоб у вас був кращий досвід. І ви заощадите місяці часу.

1. Ви не запам'ятаєте всього.

Я дивився години відео і робив численні нотатки, і через місяці багато чого не пам'ятав. Я провів 3 дні, переглядаючи свої нотатки і роблячи флеш-картки, щоб мати змогу повторити. Мені не потрібні були всі ці знання.

Прочитайте, будь ласка, щоб не робити моїх помилок:

Збереження знань з комп'ютерних наук Retaining Computer Science Knowledge

2. Використовуйте флеш-картки

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

Зробіть свій власний безкоштовно:

Я НЕ РЕКОМЕНДУЮ використовувати мої картки. Їх занадто багато, і більшість з них - тривіальні дрібниці, які вам не потрібні.

Але якщо ви не хочете мене слухати, то ось вам:

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

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

Альтернативою використанню мого сайту є Anki, який мені неодноразово рекомендували. Там використовується система повторень, щоб допомогти вам запам'ятати. Він зручний у використанні, доступний на всіх платформах і має систему синхронізації в Cloud. Коштує $25 на iOS, але безкоштовно на інших платформах.

Моя база даних флеш-карт у форматі Anki: https://ankiweb.net/shared/info/25173560 (дякую @xiewenya)

Деякі студенти згадували про проблеми з форматуванням пробілів, які можна виправити наступним чином: відкрийте колоду, відредагуйте картку, клацніть на картки (Cards), виберіть радіо-кнопку «стилі» (Styles) і додайте до класу картки стиль "white-space: pre;".

3. Складайте питання для співбесіди під час навчання кодуванню

ЦЕ ДУЖЕ ВАЖЛИВО.

Почніть кодувати питання для співбесіди, поки вивчаєте структури даних та алгоритми.

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

Після того, як ви вивчили тему і відчуваєте себе комфортно з нею, наприклад, зв'язані списки:

  1. Відкрийте одну з книг для підготовки до співбесіди з кодування (або веб-сайти з проблем кодування, перелічені нижче)
  2. Поставте (зробіть) 2-3 запитання (задачі) про зв'язані списки.
  3. Перейдіть до наступної навчальної теми.
  4. Пізніше поверніться і розв'яжіть ще 2-3 задачі зі зв'язаними списками.
  5. Робіть це з кожною новою темою, яку ви вивчаєте.

Виконуйте завдання під час навчання, а не після.

Вас наймають не за знання, а за те, як ви їх застосовуєте.

Для цього є багато ресурсів, перелічених нижче. Не зупиняйтеся.

4. Зосередьтеся

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

Що не буде охоплено

Це поширені технології, але вони не є частиною цього навчального плану:

  • Javascript
  • HTML, CSS, та інші фронтенд технології
  • SQL

Щоденний план

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

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

Ви можете побачити мій код тут:

Вам не потрібно запам'ятовувати кожен алгоритм. Ви просто повинні розуміти його достатньо, щоб мати можливість написати власну реалізацію.

Практика з питань кодування

Чому це тут? Я не готовий до співбесіди.

Тоді поверніться і прочитайте це.

Чому потрібно практикуватись у розв'язуванні задач з програмування:

  • Розпізнавання проблеми, і де потрібні правильні структури даних та алгоритми
  • Збір вимог до задачі
  • Обговорення проблеми так, як ви будете говорити на співбесіді
  • Кодування на дошці або папері, а не на комп'ютері
  • Визначення часової та просторової складності ваших рішень (див. Big-O нижче)
  • Тестування ваших рішень

Існує чудовий вступ для методичного, комунікативного вирішення проблем під час співбесіди. Ви можете знайти це в книгах із співбесід з програмування, але я вважаю, що цей посібник є видатним: Algorithm design canvas

Пишіть код на дошці або папері, а не на комп'ютері. Протестуйте з деякими зразками вхідних даних. Потім надрукуйте його та протестуйте на комп'ютері.

Якщо у вас вдома немає дошки, візьміть великий блокнот для малювання в художньому магазині. Ви можете сидіти на дивані і практикуватись. Це моя «диванна дошка». Я додав ручку на фото лише для масштабу. Якщо ви використовуєте ручку, ви пошкодуєте, що не можете її стерти. Швидко стає брудно. Я використовую олівець і гумку.

моя диванна дошка

Практика з питань кодування - це не про запам'ятовування відповідей на задачі програмування.

Проблеми кодування

Не забудьте свої ключові книги по співбесідам з кодування тут.

Вирішення проблем:

Відео з питаннями до співбесіди на кодування:

Сайти викликів/практик:

  • LeetCode
    • Мій улюблений сайт із завданнями на кодування. Він вартий того, щоб заплатити гроші за підписку на 1-2 місяці, які ви, ймовірно, витратите на підготовку.
    • Дивіться відео Ніка Уайта та ФішерКодера вище для покрокового вивчення коду.
  • HackerRank
  • TopCoder
  • Codeforces
  • Codility
  • Geeks for Geeks
  • AlgoExpert
    • Створений інженерами Google, це також чудовий ресурс для відточування навичок.
  • Project Euler
    • дуже математично орієнтований і не дуже підходить для співбесід з кодування

Давайте починати!

Гаразд, досить розмов, давайте вчитися!

Але не забувайте виконувати завдання з кодування зверху, поки будете вчитися!

Складність алгоритмів / Big-O / Асимптотичний аналіз

Що ж, цього вже достатньо.

Коли ви проходите "Cracking the Coding Interview", там є розділ про це, а в кінці є тест, щоб перевірити, чи можете ви визначити складність виконання різних алгоритмів. Це супер огляд і тест.

Структури даних

Масив

  • Про масиви:

  • Реалізувати вектор (змінний масив з автоматичною зміною розміру):

    • Практика кодування з використанням масивів і вказівників, а також математики вказівників для переходу до індексу замість використання індексації.
    • Новий масив вихідних даних з виділеною пам'яттю
      • можна виділити масив int під капотом, просто не використовувати його можливості
      • починати з 16, або якщо початкове число більше, використовувати степінь 2 - 16, 32, 64, 128
    • size() - кількість елементів
    • capacity() - кількість елементів, які він може вмістити
    • is_empty()
    • at(index) - повертає елемент за заданим індексом, зникає, якщо індекс виходить за межі
    • push(item)
    • insert(index, item) - вставляє елемент за індексом, зсуває значення цього індексу та наступні елементи праворуч
    • prepend(item) - може використовувати вставку вище з індексом 0
    • pop() - видалити з кінця, повернути значення
    • delete(index) - видаляє елемент за індексом, зсуваючи всі кінцеві елементи вліво
    • remove(item) - шукає значення і видаляє індекс, що його містить (навіть якщо в декількох місцях)
    • find(item) - шукає значення і повертає перший індекс з цим значенням, -1, якщо не знайдено
    • resize(new_capacity) // приватна функція
      • при досягненні ємності, змінює розмір на подвійний
      • при видаленні елементу, якщо розмір становить 1/4 від ємності, зменшити розмір до половини
  • Час

    • O(1) для додавання/видалення в кінці (амортизується для виділення більшого простору), індексації або оновлення
    • O(n) для вставки/видалення в іншому місці
  • Простір

    • суміжні у пам'яті, тому близькість допомагає продуктивності
    • необхідний простір = (ємність масиву, яка >= n) * розмір елемента, але навіть якщо 2n, все одно O(n)
  • Зв'язаний список

  • Опис:

  • C Code (відео) C Code (video) - не все відео, лише фрагменти про Node struct та виділення пам'яті

  • Звʼязані списки vs масиви:

  • Чому слід уникати зв'язаних списків (відео) Why you should avoid linked lists (video)

  • Пастка: вам потрібні знання про вказівник на вказівник: (на випадок, якщо ви передаєте вказівник у функцію, яка може змінити адресу, на яку вказує цей вказівник) Я не рекомендую цей стиль обходу списків. Читабельність і обслуговуваємість страждають через складність.

  • Реалізувати (я зробив з хвостовим вказівником та без):

    • size() - повертає кількість елементів даних у списку
    • empty() - bool повертає true, якщо пусто
    • value_at(index) - повертає значення n-го елемента (починаючи з 0 для першого)
    • push_front(value) - додає елемент на початок списку
    • pop_front() - видаляє перший елемент і повертає його значення
    • push_back(value) - додає елемент в кінець списку
    • pop_back() - видаляє кінцевий елемент і повертає його значення
    • front() - отримати значення переднього елементу
    • back() - отримати значення кінцевого елементу
    • insert(index, value) - вставити значення за індексом так, щоб на поточний елемент за цим індексом вказував новий елемент за індексом
    • erase(index) - видаляє вузол за заданим індексом
    • value_n_from_end(n) - повертає значення вузла на n-ій позиції від кінця списку
    • reverse() - реверсує список
    • remove_value(value) - видаляє перший елемент списку з цим значенням
  • Подвійно зв'язаний список

  • Стек

  • Черга

    • Черга (відео) Queue (video)
    • Циклічний буфер/FIFO Circular buffer/FIFO
    • [Огляд] Черги за 3 хвилини (відео) [Review] Queues in 3 minutes (video)
    • Реалізувати за допомогою звʼязаного списка, з хвостовим вказівником:
      • enqueue(value) - додає значення до позиції у хвості
      • dequeue() - повертає значення і видаляє останній доданий елемент (передній)
      • empty()
    • Реалізація з використанням масиву фіксованого розміру:
      • enqueue(value) - додає елемент в кінець доступного сховища
      • dequeue() - повертає значення і видаляє останній доданий елемент
      • empty()
      • full()
    • Вартість:
      • погана реалізація з використанням зв'язаного списку, де ви створюєте чергу в голові та чергу в хвості, буде O(n) тому що вам потрібен передостанній елемент, що призводить до повного обходу кожної черги
      • enqueue: O(1) (амортизований, зв'язаний список і масив [зондування])
      • dequeue: O(1) (зв'язаний список та масив)
      • empty: O(1) (зв'язаний список та масив)
  • Геш-таблиця

Більше знань

Дерева

Сортування

Як підсумок, ось візуальне представлення 15 алгоритмів сортування. Якщо вам потрібна більш детальна інформація на цю тему, зверніться до розділу "Сортування" у Додаткова інформація про деякі теми

Графи

Графи можна використовувати для представлення багатьох проблем у комп'ютерних науках, тому цей розділ довгий, як і розділ про дерева та сортування.

Ще більше знань


Фінальний огляд

У цьому розділі зібрані короткі відео, які ви можете переглянути досить швидко, щоб повторити більшість важливих понять.
Це дуже зручно, якщо ви часто хочете повторити матеріал.
  • Серія 2-3-хвилинних коротких тематичних відеороликів (23 відео)
  • Серія 2-5-хвилинних тематичних відеороликів - Майкл Самбол (48 відео):

Update Your Resume

Interview Process & General Interview Prep

Mock Interviews:

Be thinking of for when the interview comes

Think of about 20 interview questions you'll get, along with the lines of the items below. Have 2-3 answers for each. Have a story, not just data, about something you accomplished.

  • Why do you want this job?
  • What's a tough problem you've solved?
  • Biggest challenges faced?
  • Best/worst designs seen?
  • Ideas for improving an existing product.
  • How do you work best, as an individual and as part of a team?
  • Which of your skills or experiences would be assets in the role and why?
  • What did you most enjoy at [job x / project y]?
  • What was the biggest challenge you faced at [job x / project y]?
  • What was the hardest bug you faced at [job x / project y]?
  • What did you learn at [job x / project y]?
  • What would you have done better at [job x / project y]?

Have questions for the interviewer

Some of mine (I already may know the answers, but want their opinion or team perspective):

  • How large is your team?
  • What does your dev cycle look like? Do you do waterfall/sprints/agile?
  • Are rushes to deadlines common? Or is there flexibility?
  • How are decisions made in your team?
  • How many meetings do you have per week?
  • Do you feel your work environment helps you concentrate?
  • What are you working on?
  • What do you like about it?
  • What is the work life like?
  • How is the work/life balance?

Once You've Got The Job

Congratulations!

Keep learning.

You're never really done.


*****************************************************************************************************
*****************************************************************************************************

Everything below this point is optional. It is NOT needed for an entry-level interview.
However, by studying these, you'll get greater exposure to more CS concepts and will be better prepared for
any software engineering job. You'll be a much more well-rounded software engineer.

*****************************************************************************************************
*****************************************************************************************************

Additional Books

These are here so you can dive into a topic you find interesting.
  • The Unix Programming Environment
    • An oldie but a goodie
  • The Linux Command Line: A Complete Introduction
    • A modern option
  • TCP/IP Illustrated Series
  • Head First Design Patterns
    • A gentle introduction to design patterns
  • Design Patterns: Elements of Reusable Object-Oriented Software
    • AKA the "Gang Of Four" book or GOF
    • The canonical design patterns book
  • Algorithm Design Manual (Skiena)
    • As a review and problem-recognition
    • The algorithm catalog portion is well beyond the scope of difficulty you'll get in an interview
    • This book has 2 parts:
      • Class textbook on data structures and algorithms
        • Pros:
          • Is a good review as any algorithms textbook would be
          • Nice stories from his experiences solving problems in industry and academia
          • Code examples in C
        • Cons:
          • Can be as dense or impenetrable as CLRS, and in some cases, CLRS may be a better alternative for some subjects
          • Chapters 7, 8, and 9 can be painful to try to follow, as some items are not explained well or require more brain than I have
          • Don't get me wrong: I like Skiena, his teaching style, and mannerisms, but I may not be Stony Brook material
      • Algorithm catalog:
        • This is the real reason you buy this book.
        • This book is better as an algorithm reference, and not something you read cover to cover.
    • Can rent it on Kindle
    • Answers:
    • Errata
  • Algorithm (Jeff Erickson)
  • Write Great Code: Volume 1: Understanding the Machine
    • The book was published in 2004, and is somewhat outdated, but it's a terrific resource for understanding a computer in brief
    • The author invented HLA, so take mentions and examples in HLA with a grain of salt. Not widely used, but decent examples of what assembly looks like
    • These chapters are worth the read to give you a nice foundation:
      • Chapter 2 - Numeric Representation
      • Chapter 3 - Binary Arithmetic and Bit Operations
      • Chapter 4 - Floating-Point Representation
      • Chapter 5 - Character Representation
      • Chapter 6 - Memory Organization and Access
      • Chapter 7 - Composite Data Types and Memory Objects
      • Chapter 9 - CPU Architecture
      • Chapter 10 - Instruction Set Architecture
      • Chapter 11 - Memory Architecture and Organization
  • Introduction to Algorithms
    • Important: Reading this book will only have limited value. This book is a great review of algorithms and data structures, but won't teach you how to write good code. You have to be able to code a decent solution efficiently
    • AKA CLR, sometimes CLRS, because Stein was late to the game
  • Computer Architecture, Sixth Edition: A Quantitative Approach
    • For a richer, more up-to-date (2017), but longer treatment

System Design, Scalability, Data Handling

Additional Learning

These topics will likely not come up in an interview, but I added them to help you become a well-rounded software engineer, and to be aware of certain technologies and algorithms, so you'll have a bigger toolbox.

--

Additional Detail on Some Subjects

I added these to reinforce some ideas already presented above, but didn't want to include them
above because it's just too much. It's easy to overdo it on a subject.
You want to get hired in this century, right?

Video Series

Sit back and enjoy. "Netflix and skill" :P

Computer Science Courses