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 intervyudan o'tish uchun 8 oy davomida kechayu kunduz o'qidim?
Bu yerda 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!
Bu mening web dasturchi (web developer) darajasidan katta kompaniyada ishlaydigan dastur injineri (software engineer) darajasiga chiqish uchun qilgan ko'p oylik o'qish rejam.
Bu proyekt yangi dasturchi injinerlar uchun juda foydali. Va yana, oddiy programmistlikdan (masalan web yoki mobildan) dasturiy injinerlikka (dastur injinerlaridan computer science bilimlari talab qilinadi) o'tmoqchi bo'lganlar uchun foydali.
Agar sizda dasturchilik bo'yicha ko'p yillik tajribangiz bo'lsa, shuni bilingki: Google, Amazon, Facebook, va Microsoftga o'xshagan katta kompaniyalar dasturiy injinerlikni (software engineer) oddiy dasturchilik (software/web developer) dan farqli deb ko'radi va ular computer science bilimini talab qiladi.
---------------- Quyidagilar ixtiyoriy ----------------
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 bo’lib, sizga bir necha oy kerak bo'lishi mumkin. Agar siz allaqachon bu narsalarni ko'pini bilsangiz, bu resurslar sizni ko'p vaqtingizni olmaydi.
Quyida foydalanish qoidalari berilgan bo'lib, bosqichlarni yuqoridan pastga tartibda bajarishingiz kerak.
Men natijalarni kuzatish uchun vazifalar ro'yxatini o'z ichiga olgan Github markup-idan 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
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
ma'ruzalaridan foydalanish yoqadi.
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:
Shuningdek quyidagilarni ham ishlatishingiz mumkin:
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.
To'g'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.
Bu sizning vaqtingizni tejash uchun men ishlatgan kitoblar ro'yxatining qisqartirilgan ko'rinishi.
Quyidagi kitoblardan birini tanlashingiz mumkin:
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.
Men bularning ikkitasini o'qimaganman, lekin ular yuqori baholangan va Sedgewick tomonidan yozilgan. Sedgewick aka zo'rlar :)
Agar sizda C++ bo'yicha yaxshiroq tavsiyalaringiz bo'lsa iltimos biz bilan baham ko'ring.
Yoki:
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.
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.
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 xohlagan joyda foydalana olishim uchun mobil telefonga 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 huddi 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 bilan 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).
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 bo'yicha savollar ustida ishlash.
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.
Atrofimizda juda ko'p narsalar bizni chalg'itib qo'yadi va qimmatli vaqtimizni oladi. Shuning uchun diqqatni jamlash va konsentratsiya qilish oson emas. Buning bir usuli, matnsiz biron musiqa tinglang, bu esa diqqatingizni jamlashingizga yordam beradi.
Bular keng tarqalgan texnologiyalar lekin bu proyekt ularni o'z ichiga olmaydi:
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:
Sizga bularni hammasi kerak emas. Intervyu uchun sizga faqat bitta til kerak.
Nega turlicha yozish kerak?
Har bir mavzuni tepadagi tarzda o'qiyolmasligim 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.
[ ] C ni o'rganing
[ ] Kompyuterlar dasturni qanday boshqarishadi
[ ] Videolar:
[ ] Onlayn kurslar:
[ ] 'Linear probing' ishlatgan holda amalga oshirish (massiv bilan)
Animatsiya orqali ma'lumotlar tuzilmalari va algoritmlarini vizualizatsiya qilish. Quyidagi havolada siz ma'lumotlar tuzilmasi aslida qanday ishlashini tushunib olasiz.
[ ] Eslatmalar:
- sorting bilan ishlang va eng yaxshi/eng yomon holatlarni, har birining o'rtacha murakkabligini biling:
- bubble sort ishlatmang - agar n <= 16 bo'lmasa, O(n^2)-bu juda yomon
- [ ] Algoritmlarni saralashdagi barqarorlik (stability) ("Quicksort barqarormi?")
- [Sorting Algorithm Stability](https://en.wikipedia.org/wiki/Sorting_algorithm#Stability)
- [Stability In Sorting Algorithms](http://stackoverflow.com/questions/1517793/stability-in-sorting-algorithms)
- [Stability In Sorting Algorithms](http://www.geeksforgeeks.org/stability-in-sorting-algorithms/)
- [Sorting Algorithms - Stability](http://homepages.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf)
Heapsort uchun yuqorida berilgan ma'lumotlar tuzilmasini ko'ring, Heap sort ajoyib lekin barqaror emas.
[ ] UC Berkeley:
[ ] Merge sort kodda:
[ ] Quick sort uchun kod:
[ ] Kodda yozish:
[ ] Quyidagilar talab qilinmaydi lekin shaxsan men ularni tavsiya qilaman:
Vizual tarzda ma'lumot olish uchun 15 ta saralash algoritmlari. Agar sizga ushbu mavzu bo'yicha batafsil ma'lumot kerak bo'lsa, "Saralash" bo'limiga qarang Ba'zi mavzular bo'yicha qo'shimcha ma'lumotlar
Computer science da graflar bir talay masalalarni tasvirlashda ishlatiladi. Shuning uchun tree va tartiblash algoritmlari kabi bu qism yetarlicha uzun
Eslatmalar:
[ ] MIT(videolar):
[ ] Skiena ma'ruzalari - ajoyib kirish:
[ ] Graflar (tahlil va boshqa ko'p narsalar):
To'liq Coursera kursi:
Kodda yozaman:
traveling salesman and the knapsack muammosi kabi NP-ning eng mashhur klasslari haqida bilish, va intervyu beruvchisi ularni niqob bilan so'raganda ularni taniy olish.
NP-complete nima ekanligini biling.
[ ] Simonson:
[ ] Skiena:
Piter Norvig traveling salesman masalasining maqbul yechimlarini muhokama qiladi:
1048 - 1140 sahifalari CLRS da agar bu sizda bo'lsa.
Agar bu mavzuda ko'proq ma'lumot olmoqchi bo'lsangiz, "String Matching" bo'limini ko'ring Ba'zi mavzular bo'yicha qo'shimcha ma'lumotlar.
agar sizda 4+ yil ish tajribasi bo'lsa intervyularda sizga tizim dizayn bo'yicha savolar tushadi
Bu qismda ko'p muhim tushunchalarni tez qaytarib olish uchun kerak bo'ladigan qisqa videolar bor
Yuqoridagi barcha "computer science" mavzularini bilb oldingiz, endi coding bo'yicha masalalarga javob berishni mashq qilish vaqti keldi.
Coding masalalarini yechishga tayyorlanish bu javoblarni yodlab qolish emas
Masalalar yechishni mashq qilish nima uchun zarur:
Suhbatda metodik, kommunikativ muammolarni hal qilish uchun ajoyib kirish qismi mavjud. Siz buni dasturlash uchun intervyu kitoblaridan ham topa olishingiz mumkin, lekin men buni ular ichida juda foydali deb topdim: Algorithm design canvas
Uyingizda doska yo'qmi? Bu tabiiy. Men o'zgacha insonman, menda kotta doskam bor. Doska o'rniga, rasm chizish uchun mo'ljallangan daftar ishlating. Shunda divanda o'tirib, mashq qilishingiz mumkin. Bu mening "divanga mo'ljallangan doskam". Men rasmda qalamimni ham qo'shganman qulaylik uchun. Agar siz ruchkadan foydalansangiz, o'chirish istagi paydo bo'lishi mumkin. Tez Chalkashib ketadi. Shuning uchun men qalam va o'chirg'ichdan foydalanaman.
Qo'shimcha:
Dasturlash masalalarini o'qing va bajaring (ketma ketlikda):
Ko'ring Book List above
Miyyangiz og'rigunigacha o'rganib bo'lganingizdan keyin o'sha miyyangizni ishga soling Har kuni coding savollar ishlang, qancha ko'p bo'lsa shuncha yaxshi
Coding Intervyu Savollar Videolari:
Mashq saytlari:
Til o'rganish saytlari, mashqlari bilan
Mashqlar repolari
Mock intervyular
Sizdan so'rashlari mumkin bo'lgan 20 tacha intervyu savollarini o'ylab toping (pastagi savollarga o'xshagan). Har biri uchun 2-3 javobiz bo'lsin. Siz amalga oshirgan biror narsa haqida hikoyangiz bo'lsin.
Mening savollarimning bazilari (Bu savollarga javobni bilsam ham ularni fikrlarini yoki jamoaviy nuqtai nazarlarini bilishni xohlayman):
Tabriklaymiz!
O'rganishda davom eting.
Hech qachon tugatgan bo'lmaymiz.
*****************************************************************************************************
*****************************************************************************************************
Ushbu bandning ostidagi hamma narsalar ixtiyoriydir.
Ularni o'rganish orqali siz ko'proq CS tushunchalariga ega bo'lasiz va har qanday dasturiy injinerlik
ishi uchun yaxshi tayyorlangan bo'lasiz. Siz ancha mukammal dasturchi darajasiga erishasiz.
*****************************************************************************************************
*****************************************************************************************************
O'zingizni qiziqtirgan mavzuga chuqur sho'ng'ishingiz uchun resurslar
Computer Architecture, Sixth Edition: A Quantitative Approach
Men bularni har tomonlama rivojlangan dasturchi bo'lishingizga yordam berish va ba'zi texnologiyalar va algoritmlardan xabardor bo'lishingiz uchun qo'shdim,
Natijada sizda kattaroq asboblar qutisi bo'ladi.
AVL tree-lar
Splay trees
Red/black tree-lar
2-3 search tree-lar
2-3-4 Tree-lar (shuningdek 2-4 tree nomi bilan tanilgan)
N-talik (K-talik, M-talik) tree-lar
B-Tree
Men bularni Yuqorida keltirilgan ba'zi fikrlarni mustahkamlash uchun qo'shdim, lekin yuqorida qo'shishni xohlamadim
chunki juda ko'p resurslarni o'z ichiga oladi. Bitta mavzuda juda ko'p qolib ketish ham yaxshi emas.
Siz shu asrda ishga qabul qilinishingizni xohlaysiz shundaymi?
SOLID
Union-Find
Dinamik dasturlash haqida batafsil (videolar)
Advanced Graph Processing (videolar)
MIT Ehtimollik nazariyasi (matematikaga oid, sekin astalik bilan ko'rib chiqing, matematikaga oid narsalar uchun yaxshi) (videolar):
String Matching
Sorting
Qulay joylashib oling va maroqlaning. "Netflix va skillar" :P
List of individual Dynamic Programming problems (each is short)
Excellent - MIT Calculus Revisited: Single Variable Calculus
Computer Science 70, 001 - Spring 2015 - Discrete Mathematics and Probability Theory
CSE373 - Algoritmlarning tahlillari (25 ta videolar to'plami)
UC Berkeley CS 152: Computer Architecture and Engineering (20 videos)
Carnegie Mellon - Computer Architecture Lectures (39 videos)
MIT 6.042J: Mathematics for Computer Science, Fall 2010 (25 videos)
MIT 6.050J: Information and Entropy, Spring 2008 (19 videos)