coding-interview-university/translations/README-uz.md

138 KiB
Raw Blame History

Coding Interview University

Asl versiyasi: Inglizcha

Dastlab men bu proyektni dasturchi (software engineer) bo'lish uchun o'qish kerak bo'lgan mavzularning qisqacha ro'yxati sifatida yaratdim, ammo bu proyekt bugun siz ko'rib turgan katta ro'yxatga aylandi. Ushbu o'quv rejasidan o'tib, men Amazon-ga dasturchi sifatida ishga yollandim! Ehtimol, menga o'xshab o'qishingizga to'g'ri kelmaydi. Baribir sizga kerak bo'lgan hamma narsa shu yerda.

Bir necha oy davomida kuniga taxminan 8-12 soat o'qidim. Bu mening hikoyam: Nega men Google-da intervyu olish uchun 8 oy davomida kechayu kunduz o'qidim

Bu erda keltirilgan narsalar sizni har qanday dasturiy ta'minot kompaniyalari, shu jumladan gigantlar: Amazon, Facebook, Google va Microsoft-da o'tkaziladigan texnik suhbatga yaxshi tayyorlaydi.

Sizga omad tilayman!

Translations:
Translations in progress:

Bu nima?

Bu mening web dasturchisi (web developer) darajasidan katta kompaniyada ishlaydigan dastur injineri (software engineer) darajasiga chiqish uchun qilgan ko'p oylik o'qish rejam. Coding at the whiteboard - from HBO's Silicon Valley

Bu proyekt yangi dasturchi injinerlar uchun juda forydali. Va yana, oddiy programmistlikdan (masalan web yoki mobildan) dastur injinerlikka (dastur injinerlaridan computer science bilimlari talab qilinadi) o'tmoqchi bulganlar uchun foydali.

Agar sizda dasturchilik bo'yicha ko'p yillik tajribangiz bo'lsa, shuni bilingki: Google, Amazon, Facebook, va Microsoftga o'xshagan katta kompaniyalar dastur injinerlikni (software engineer) oddiy dasturchilikdan (software/web developer) farqli deb kuradi va ular computer science bilimini talab qiladi.

Agar siz reliability engineer yoki operations engineer bo'lmoqchi bo'lsangiz, unda siz ixtiyoriy ro'yxatdan ko'proq o'qing (tarmoq, xavfsizlik va boshqalar).

Table of Contents

---------------- Everything below this point is optional ----------------

Additional Resources


Nima uchun foydali?

Ushbu loyihani boshlaganimda, men stack bilan heap-ni farqini bilmas edim, Big-O ni nimaligini bilmas edim, tree-lar yoki graph-lar haqida hech qanday tushunchaga ega emas edim. Agar tartiblash algoritmini (sorting) yozishni so'rashganda, aniq qovun tushirgan bo'lar edim. Umrimda ishlatgan data strukturalarni hammasini tayyor holda ishlatganman (built-in library) va ularning asosida nimalar yotishini umuman bilmas edim. Juda ko'p kod yozgan bo'lsamda, lekin men hech qachon qandaydir data strukturani noldan yozmaganman

Bu uzoq vaqt talab qiladigan jarayon bolib, sizga bir necha oy kerak bo'lishi mumkin. Agar siz allaqachon bu narsalarni ko'pini bilsangiz, bu resurslar sizni ko'p vaqtingizni olmaydi.

Qanday foydalanish kerak?

Quyida foydalanish qoidalari berilgan bo'lib, bosqichlarni yuqoridan pastga tartibda bajarishingiz kerak.

Men natijalarni kuzatish uchun vazifalar ro'yxatini o'z ichiga olgan Github markupidan foydalanmoqdaman.

Bu kabi elementlarni tekshirishingiz uchun yangi "branch" yarating, so'ngra shunchaki qavs ichiga x qo'shib, ro'yxat elementlarini belgilashingiz mumkin: [x]

 Branch-ni o'zingizga fork qiling va quyidagi buyruqlarni ketma-ketlikda bajaring:

Ulash uchun https://github.com/jwasham/coding-interview-university havola(link) ga o'ting va "Fork" tugmasini bosing

Shaxsiy(local) repo-ga ko'chirib oling

git clone git@github.com:<your_github_username>/coding-interview-university.git

git checkout -b progress

git remote add jwasham https://github.com/jwasham/coding-interview-university

git fetch --all

O'zgarishlaringizni tugatganingizdan so'ng barcha qismlarni X bilan belgilang

git add .

git commit -m "Marked x"

git rebase jwasham/main

git push --set-upstream origin progress

git push --force

Github-flavored markdown-haqida ko'proq ma'lumot

O'zingizni omadsiz deb hisoblamang

Video qo'llanmalar haqida

Ba'zi video darsliklarni faqat Coursera yoki EdX platformalari orqali ro'yxatdan o'tgan holda olish mumkin. Ular MOOC (ommaviy ochiq onlayn kurs) deb nomlanadi. Ba'zan darslar sessiyada bo'lmaganligi sababli siz bir necha oy kutishingizga to'g'ri keladi.

Bepul va har doim ham ochiq ommaviy manbalarni yaratishda o'z hissangizni qo'shishingizni xohlagan bo'lar edim. 
Bu manbalar Youtube dagi video darsliklar ham bo'lishi mumkin. Masalan menga universitet 
maruzalaridan foydalanish yoqadi.    

Suhbat jarayoni va intervyuga tayyorgarlik

Intervyu uchun bitta dasturlash tilini tanlang

Intervyuning kodlash qismini bajarish uchun o'zingizga qulay bo'lgan dasturlash tilidan foydalanishingiz mumkin, lekin yirik kompaniyalar quyida berilgan tillarning biridan foydalanishni talab qilishlari mumkin:

  • C++
  • Java
  • Python

Shuningdek quyidagilarni ham ishlatishingiz mumkin:

  • JavaScript
  • Ruby

Quyida intervyu uchun dasturlash tilini tanlash haqida yozgan maqolam: Pick One Language for the Coding Interview.

Siz intervyu uchun tanlagan dasturlash tilida erkin kod yoza oladigan va o'z bilimingizga ega bo'lishingiz kerak.

Tog'ri tanlov haqida ko'proq o'qishingiz uchun manbalar:

Dasturlash tillari bo'yicha manbalar

Quyida berilgan kitoblar ro'yxatida o'zim o'rganayotgan C, C++, va Python ga oid manbalarni ko'rishingiz mumkin.

Kitoblar ro'yxati

Bu sizning vaqtingizni tejash uchun men ishlatgan kitoblar ro'yxatining qisqartirilgan ko'rinishi.

Intervyuga tayyorlanish

Agar sizda bo'sh vaqtingiz ko'p bo'lsa:

Quyidagi kitoblardan birini tanlashingiz mumkin:

Dasturlash tiliga oid

** Yuqorida aytilganidek siz intervyu uchun bitta dasturlash tilini tanlashingiz kerak **

Mening tilga oid tavsiyalarim. Menda barcha tillar uchun resurslar yo'q shuning uchun sizda qo'shimcha ma'lumot bo'lsa tavsiya qilishingiz mumkin. Agar siz bulardan birini o'qib chiqsangiz, masalalarni yechishda kerak bo'lgan barcha data strukturalar va algoritmlari bo'yicha bilimlarga ega bo'lishingiz kerak. ** Loyihadagi video resurslarni o'tkazib yuborishingiz mumkin**, agar ko'rib chiqishni xohlamasangiz.

Tilga oid qo'shimcha resurslar.

C++

Men bularning ikkitasini o'qimaganman, lekin ular yuqori baholangan va Sedvik tomonidan yozilgan. Sedgewick aka zo'rlar :)

Agar sizda C++ bo'yicha yaxshiroq tavsiyalaringiz bo'lsa iltimos biz bilan baham ko'ring.

Java

Yoki:

  • Java da ma'lumotlar tuzilmasi va algoritmlar
    • Goodrich, Tamassia, va Goldwasser tomonidan yozilgan
    • UC Berkeley-dagi CS(Computer Science) kirish kursi uchun qo'shimcha kitob sifatida ishlatiladi
    • Quyida Python dasturlash kitobi uchun men qoldirgan izohlar bu kitobga ham tegishli.

Python

O'rganishni boshlashdan oldin

Mazkur ro'yxat bir necha oylar davomida shakllanganligi sababli biroz qo'ldan chiqdi. Bu yerda men ba'zi yo'l qo'ygan xatoliklar bor, bu esa sizlarga yaxshiroq tajriba orttirishingizga yordam beradi.

1. Bularning barchasini eslab qolmaysiz

Men soatlab videolar ko'rardim va eslatmalar yozib qo'yar edim, va bir necha oydan so'ng hammasini eslab qola olmas edim. Men yozib olgan eslatmalarim va fleshkartalarim yordamida takrorlab chiqishim uchun 3 kun sarfladim.

Men qilgan xatolarni siz ham takrorlamasligingiz uchun iltimos o'qib chiqing:

Retaining Computer Science Knowledge.

Menga tavsiya qilingan kurs (shaxsan o'zim ko'rib chiqmaganman): Learning how to Learn.

2. Fleshkartalar(kartochkalar) ishlating

Muammoni yechish uchun, men fleshkartalar uchun sayt yaratdim, u yerga 2 turdagi fleshkartalar joylanadi: umumiy eslatmalar va kod. Har bir karta o'z formatiga ega.

Vebsaytdan telefon yoki tabletdan ham xoxlagan joyda foydalana olishim uchun mobilga moslangan sayt yaratdim.

O'zingizni saytingizni ham tekinga yarating:

Yodingizda bo'lsin, menda assembly language va Python triviyalaridan tortib, machine learning va statistikani o'z ichiga olgan kartalarim bor. Bu esa talab qilinadigan narsalardan ham ko'p hisoblanadi. (Ya'ni bularning barchasini siz bir vaqtda o'zlashtirgan bo'lishingiz shart emas)

Fleshkartalardagi eslatmalar : Birinchi marta fleshkartadagi javobni topa olganingizda uni o'zlashtirilganlar qatoriga qo'shmang. Aksincha xuddi shu kartani ajratib qo'ying va bir necha marta javob bering toki haqiqatdan ham javobni anglab yetguningizgacha. Takrorlash natijasida ma'lumot miyangizga chuqurroq joylashadi.

Fleshkartalar uchun bir necha marta menga tavsiya qilingan alternativ vebsayt Anki. Bu sizning eslab qolishingizga yordam berish uchun takrorlash sistemasini ishlatadi. Buni ishlatish qulay va barcha platformalarda mavjud va cloud bn sinxronizatsiya qilingan. iOS platformalari uchun narxi $25, lekin boshqa platformalar uchun tekin.

Anki formatidagi mening fleshkartalarim bazasi: https://ankiweb.net/shared/info/25173560 (@xiewenya ga tashakkur).

3. Ma'lumotlar tuzilmalari va algoritmlarini o'rganish jarayonida coding intervyu savollariga javob topishni boshlang.

O'rganayotgan narsalaringizni masalalar yechishda qo'llab ketishingiz kerak, aks holda o'rganganlaringizni tez unutishingiz mumkin. Shaxsan menda shunday bo'lgan. Biror bir mavzuni masalan bog'langan ro'yxatlar (linked lists) ga oid mavzuni o'rganganingizdan keyin agar o'zingizni shu mavzuda erkin his qilishni boshlasangiz coding intervyu kitoblaridan linked list ga oid masala yechishga urinib ko'ring. So'ng, keyingi mavzuga o'ting. Bir qancha vaqtdan keyin yana ortga qaytib linked listga yoki rekursiyaga oid masala yeching. Asosiysi o'rganish jarayonida ko'proq masalalarni yechishda davom eting. Sizni ishga bilimingiz uchun emas, bilimingizni qo'llay olishingiz uchun qabul qilishadi. Men sizlarga tavsiya qiladigan kitoblar va saytlar bor. Ko'proq ko'rish uchun havolaga o'ting:: Coding Question Practice.

4. Takrorlang, takrorlang va yana takrorlang

Menda ASCII, OSI stack, Big-O notations va boshqa mavzularda eslatma varaqlarim bor. Ularni biroz bo'sh vaqtim bo'lganda o'rganaman.

Masalalar yechish jarayonida biroz tanaffus oling va o'zingizni fleshkartalaringizni takrorlab chiqing.

5. Diqqatingizni bir joyga jamlang

Atrofimizda juda ko'p narsalar bizni chalg'itib qo'yadi va qimmatli vaqtimizni oladi. Shuningg uchun diqqatni jamlash va konsentratsiya qilish oson emas. Buning bir usuli, matnsiz biron musiqa tinglang, bu esa diqqatingizni jamlashingizga yordam beradi.

Bu proyekt nimalarni o'z ichiga olmaydi

Bular keng tarqalgan texnologiyalar lekin bu proyekt ularni o'z ichiga olmaydi:

  • SQL
  • Javascript
  • HTML, CSS, va boshqa front-end texnologiyalar

Kunlik reja

Bazi mavzular bir kun oladi, va bazilariga bir necha kunlar kerak bo'ladi. Bazilari faqat o'rganish, kod yozish kerak emas.

Har kuni bitta mavzu olib, videolarini ko'rib, quyidagi tillarda kodda yozib chiqaman:

  • C - struct-lardan va struct * oladigan funksiyalarni ishlatgan holda
  • C++ - built-in tiplarni ishlatmagan holda
  • C++ - built-in tiplarni ishlatgan holda, masalan STL-ning std::list
  • Python - built-in tiplarni ishlatgan holda (Python-ni mashq qilish uchun)
  • va testlar yozgan holda (oddiy assert() ishlatib)
  • siz Java yoki boshqa tilda qilishingiz mumkin

Sizga bularni hammasi kerak emas. Intervyu uchun sizga faqat bitta til kerak.

Nega turlicha yozish kerak?

  • Mashq, mashq, mashq, ko'nglim ayniguncha. Shunda muammosiz tushimda ham qila olaman.
  • Pastgi darajada (low level) yoza olish uchun (masalan, garbage collection ishlatmagan holda)
  • Har kunlik ishda built-in tiplardan bemalol foydalana olish uchun (production-da array listni yoki linked listni boshidan yozib o'tirmaymanku)

Har bir mavzuni tepadagi tarzda o'qiyolmashim mumkin, lekin harakat qilaman.

Meni kodlarimni bu yerda ko'rishingiz mumkin:

Har bir algoritmni ikr-chikirini eslab qolishingiz shart emas.

Birinchi kodizni doskada yoki qog'ozda yozing, kompyuterda emas. Og'zaki test qiling. Keyin kompyuterda yozib test qiling.

Oldindan nima bilish kerak

Algoritmik murakkablik / Big-O / Asimtotik tahlil

Ma'lumotlar tuzilmasi (Data structures)

  • Massivlar

    • Avtomatik ravishda o'lchamlarini o'zgartiradigan vektorni amalga oshirish.
    • Tavsif:
    • Vektorni bajaring (o'lchamini o'zgartiradigan massiv):
      • Massivlar va ko'rsatgichlar(pointerlar) yordamida kod yozishni mashq qiling va massivning index-iga o'tish uchun indexing o'rniga pointer matematikasini ishlating.
      • Massivimiz elementlarini ushlab turadigan ichki (private) massiv
        • int massivni elementlarni saqlash uchun ishlatsak bo'ladi, faqat uning xususiyatlaridan foydalanmaslik kerak
        • 16 dan boshlang, agar boshlanayotgan son kattaroq bo'lsa 2 ning darajalarini ishlating(2 - 16, 32, 64, 128)
      • size() - Massivdagi elementlar soni
      • capacity() - massiv o'z ichiga olishi mumkin bo'lgan elementlar soni
      • is_empty() - Massiv bo'sh yoki yo'qligini tekshirish
      • at(index) - Ko'rsatilgan index-dagi massiv elementini qaytaradi. Agar berilgan index massiv indexlaridan tashqarida bo'lsa xatolik qaytaradi.
      • push(item)
      • insert(index, item) - Ko'rsatilgan index-ga elementni qo'shadi, index-dagi eski element(lar)ni esa o'zidan o'ngga ko'chiradi
      • prepend(item) - Massivning birinchi elementidan oldin yangi element qo'shish
      • pop() - Massivning oxirgi elementini o'chiradi va o'chirilgan elemntni qaytaradi.
      • delete(index) - Massiv elementini index bo'yicha o'chiradi, Qolgan elementlar chapga ko'chiriladi
      • remove(item) - Berilgan qiymatni izlaydi va shu qiymatga ega index-larni barchasini o'chiradi
      • find(item) - Berilgan qiymatni izlaydi va shu qiymatga ega birinchi index-ni qaytaradi, agar topilmasa -1 qaytaradi
      • resize(new_capacity) // private function
        • Massiv hajmi to'lganda, uni ikki baravar oshirish uchun o'lchamini o'zgartiring
        • Massivda element olib tashlanganda, agar hajmi umumiy hajmning 1/4 ga teng bo'lsa, hajmini yarimiga o'zgartiring
    • Ish vaqt xarajati (Time)
      • O(1) Oxiriga qo'shish yoki olib tashlash (ko'proq joy ajratish uchun amortizatsiya qilingan), index, yoki o'zgartirish
      • O(n) boshqa joyga qo'shish yoki olib tashlash
    • Ish joy xarajati (Space)
      • elementlar xotirada yonma yon joylashgan, shuning uchun yaqinlik yordam beradi
      • bo'sh joy kerak = (massiv hajmi >= n) * element hajmi, agar 2n bo'lsa ham O(n) hisoblanadi
  • Linked Lists (O'zaro bog'langan ro'yxatlar)

    • Tavsif:
    • C Code (video) - butun videoni ko'rmang, Node struct va xotira ajratish (memory allocation) qismilarini ko'ring
    • Linked List va Array(massiv)lar:
    • nega linked list-dan foydalanmaganingiz maqul (video)
    • Yodda tuting: siz "pointer to pointer" nimaligini tushuningiz kerak: (funksiyaga pointer berilganda, funksiya pointer ko'rsatib turgan adresni o'zgartirishi mumkin) Bu sahifa "pointer to pointer" ni tushinish uchun foydali. Lekin bunday list traversal stilini tavsiya etmayman chunki kodni o'qish va uni maintain qilish qiyin.
    • Kodda yozaman (tail pointer va tail pointer-siz):
      • size() - listdagi elementlar sonini qaytaradi
      • empty() - agar list bo'sh bo'lsa true qaytaradi
      • value_at(index) - n-inchi elementning qiymatini qaytaradi (0 dan boshlab)
      • push_front(value) - listning boshiga element qo'shadi
      • pop_front() - birinchi elementni olib tashlab va uni qiymatini qaytaradi
      • push_back(value) - oxiriga element qoshadi
      • pop_back() - oxiriga elementni olib tashlab va uni qiymatini qaytaradi
      • front() - birinchi elementni qiymatini qaytaradi
      • back() - oxiriga elementni qiymatini qaytaradi
      • insert(index, value) - index-ni joyiga value-ni joylashtiradi
      • erase(index) - index joyida turgan elementni o'chirib tashlaydi
      • value_n_from_end(n) - oxiriga sanaganda n-inchi elementni qiymatini qaytaradi
      • reverse() - listni teskari safga qo'yadi
      • remove_value(value) - value qiymatiga ega bo'lgan birinchi elementni o'chirib tashlaydi
    • Doubly-linked List
  • Stack

    • Stacks (video)
    • Kodda yozmayman. Massivada stackni yaratish juda oson.
  • Queue

    • Queue (video)
    • Circular buffer/FIFO
    • linked-list dan foydalangan holda kodda yozaman (tail pointer bilan):
      • enqueue(value) - qiymatni queue-ni oxiriga qo'yadi
      • dequeue() - queue-ni boshidagi elementni o'chirib uni qiymatini qaytaradi
      • empty()
    • belgilangan o'lchamli massivdan foydalangan holda kodda yozaman:
      • enqueue(value) - mavjud xotirani oxiriga qiymatni qo'yadi
      • dequeue() - queue-ni boshidagi elementni o'chirib uni qiymatini qaytaradi
      • empty()
      • full()
    • Ish xarajati:
      • queue uchun linked-list ishlatib, list boshiga enqueue qilish va ohiridan dequeue qilish - bu yomon yondashuv chunki har safar dequeue qilinganda O(n) vaqt ketadi
      • enqueue: O(1) (amortized, linked list va massiv [probing])
      • dequeue: O(1) (linked list va massiv)
      • empty: O(1) (linked list va massiv)
  • Hash table

Qo'shimcha bilimlar

Trees

Sorting

As a summary, here is a visual representation of 15 sorting algorithms. If you need more detail on this subject, see "Sorting" section in Additional Detail on Some Subjects

Graphs

Graphs can be used to represent many problems in computer science, so this section is long, like trees and sorting were.

Even More Knowledge

System Design, Scalability, Data Handling

You can expect system design questions if you have 4+ years of experience.


Final Review

This section will have shorter videos that you can watch pretty quickly to review most of the important concepts.
It's nice if you want a refresher often.

Coding Question Practice

Now that you know all the computer science topics above, it's time to practice answering coding problems.

Coding question practice is not about memorizing answers to programming problems.

Why you need to practice doing programming problems:

  • Problem recognition, and where the right data structures and algorithms fit in
  • Gathering requirements for the problem
  • Talking your way through the problem like you will in the interview
  • Coding on a whiteboard or paper, not a computer
  • Coming up with time and space complexity for your solutions
  • Testing your solutions

There is a great intro for methodical, communicative problem solving in an interview. You'll get this from the programming interview books, too, but I found this outstanding: Algorithm design canvas

No whiteboard at home? That makes sense. I'm a weirdo and have a big whiteboard. Instead of a whiteboard, pick up a large drawing pad from an art store. You can sit on the couch and practice. This is my "sofa whiteboard". I added the pen in the photo for scale. If you use a pen, you'll wish you could erase. Gets messy quick. I use a pencil and eraser.

my sofa whiteboard

Supplemental:

Read and Do Programming Problems (in this order):

See Book List above

Coding exercises/challenges

Once you've learned your brains out, put those brains to work. Take coding challenges every day, as many as you can.

Coding Interview Question Videos:

Challenge sites:

Language-learning sites, with challenges:

Challenge repos:

Mock Interviews:

Once you're closer to the interview

Your Resume

  • See Resume prep items in Cracking The Coding Interview and back of Programming Interviews Exposed

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 answer to 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 work/life balance?

Once You've Got The Job

Congratulations!

Keep learning.

You're never really done.


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

Everything below this point is optional.
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
  • UNIX and Linux System Administration Handbook, 5th Edition

  • 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, 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
        • About to get to this part. Will update here once I've made my way through it
    • Can rent it on kindle
    • Answers:
    • Errata
  • 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
  • Programming Pearls

    • The first couple of chapters present clever solutions to programming problems (some very old using data tape) but that is just an intro. This a guidebook on program design and architecture

Additional Learning

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

Algorithms implementation

Papers

LICENSE

CC-BY-SA-4.0