33 KiB
Coding Interview University
Първоначално създадох това като кратък списък с теми за учене, за ставане на софтуерен инженер, но то се разрасна до този огромен списък, който виждате в момента. След като преминах през този учебен план, бях нает като софтуерен инженер в Amazon! Най-вероятно няма да Ви се налага да учите колкото мен, но все пак всичко, от което се нуждаете е тук.
Учих по около 8-12 часа на ден за няколко месеца. Това е историята ми: Why I studies full-time for 8 months for a Google interview
Моля обърнете внимание: Няма да Ви се налага да учите колкото мен. Загубих много време, учейки неща, които нямах нужда да знам. Може да прочетете повече за това надолу. Ще Ви помогна да достигнете до крайната цел без да прахосвате скъпото си време.
Темите, изредени тук, ще Ви подготвят добре за техническо интервю за почти всяка една компания, включително гигантите Amazon, Facebook, Google и Microsoft
Пожелавам Ви успех!
Преводи:
Текущи преводи:
Become a sponsor and support Coding Interview University!
Special thanks to:
exclusively on supporting early-stage COSS (commercial open source) startup founders.
Dev environments built for the cloud
Какво е това?
Това е моят многомесечен план за ставане на софтуерен инженер към голяма компания.
Изисквания:
- Малко опит с програмиране (променливи, цикли, методи/функции и т.н)
- Търпение
- Време
Забележете, че това е учебен план за софтуерно инженерство, а не уеб разработка. Големите компании като Google, Amazon, Facebook и Microsoft различават софтуерното инженерство и уеб разработката. Amazon, например, имат Frontend инженери (FEE) и Software Development инженери (SDE). Това са 2 отделни позиции и интервютата за тях няма да са еднакви, тъй като всяка една от тях има своите специфики. Тези компании изискват знания по компютърни науки за позиции свързани с софтуерно инженерство/разработка
Съдържание
Учебният план
- Какво е това?
- Защо да го ползвате?
- Как да го ползвате?
- Не мислете, че не сте достатъчно умни
- Бележка за видео ресурсите
- Изберете език за програмиране
- Книги за структури от данни и алгоритми
- Книги за подготовка за интервю
- Не повтаряйте грешките ми
- Какво няма да намерите тук
- Дневния план
- Подготовка за въпроси за програмиране
- Задачи по програмиране
Теми за учене
- Алгоритмична сложност / Big-O / Асимптотичен анализ
- Структури от данни
- Повече знания
- Дървета
- Дървета - бележки & основи
- Дървета за двоично търсене: BSTs (Binary search trees)
- Heap / Priority Queue / Binary Heap
- балансирани дървета за търсене (основна концепция, без детайли)
- обхождане: preorder, inorder, postorder, BFS, DFS
- Сортиране (Sorting)
- selection
- insertion
- heapsort
- quicksort
- merge sort
- Графи (Graphs)
- directed
- undirected
- adjacency matrix
- adjacency list
- traversals: BFS, DFS
- Още повече знания
- Рекурсия (Recursion)
- Динамично програмиране (Dynamic programming)
- Design Patterns
- Комбинаторика & вероятности
- NP, NP-Complete and Approximation Algorithms
- Как компютрите обработват една програма
- Кеширане (Caches)
- Процеси и нишки
- Тестване (Testing)
- String searching & manipulations
- Tries
- Floating Point Numbers
- Уникод (Unicode)
- Endianness
- Мрежи (Networking)
- Последен преглед
Как да спечелите позицията
- Актуализирайте резюмето си
- Намерете позиция
- Процесът на интервюто & обща подготовка
- Мислете за това, когато дойде интервюто
- Подгответе въпроси за интервюиращия
- След като са Ви наели
---------------- Всичко оттук надолу е по желание ----------------
Допълнителни теми и ресурси
- Допълнителни книги
- Системен дизайн, мащабируемост, обработка на данни (ако имате над 4 години опит)
- Additional Learning
- Компилатори
- Emacs and vi(m)
- Unix command line tools
- Information theory
- Паритет & код на Хаминг
- Ентропия
- Криптография
- Компресия
- Компютърна сигурност
- Garbage collection
- Паралелно програмиране
- Системи за съобщения, сериализация и queueing
- A*
- Fast Fourier Transform
- Bloom Filter
- HyperLogLog
- Locality-Sensitive Hashing
- van Emde Boas Trees
- Разширени структури от данни
- Балансирани дървета за търсене
- AVL trees
- Splay trees
- Red/black trees
- 2-3 search trees
- 2-3-4 Trees (aka 2-4 trees)
- N-ary (K-ary, M-ary) trees
- B-Trees
- k-D Trees
- Skip lists
- Мрежови потоци
- Disjoint Sets & Union Find
- Математика за бърза обработка
- Treap
- Линейно програмиране
- Geometry, Convex hull
- Дискретна математика
- Machine Learning
- Допълнителни детайли по някои теми
- Видео серии
- Курсове по компютърни науки
- Papers
Защо да го ползвате?
Ако искате да работите като софтуерен инженер в голяма компания, това са нещата, които трябва да знаете.
Ако също като мен не сте учили компютърни науки в университет това ще Ви помогне да наваксате и ще Ви спести години.
Когато започнах този проект не знаех какво е стек или опашка, нямах представа какво е Big-O, не знаех нищо за дървета или как да обхождам графи. Ако трябваше да напиша сортиращ алгоритъм мога да Ви кажа, че бих се справил ужасно. Всяка от структурите от данни, които бях използвал досега бяха имплементирани в езика, който ползвах и нямах представа как работят реално. Никога не ми се беше налагало да управлявам памет освен ако някой от процесите, които бях пуснал не връщаха грешка "out of memory"- тогава се налагаше да търся заобиколен път. Бях ползвал хиляди асоциативни масиви и многоизмерни масиви няколко пъти, но никога преди не бях имплементирал структури от данни от нулата.
Планът е дълъг. Може да Ви отнеме месеци. Ако вече сте запознати с повечето от темите ще Ви отнеме многи по-малко
Как да го ползвате
Всичко надолу е само схематично изложение и трябва да преминете през темите от горе до долу.
Не мислете, че не сте достатъчно умни
- Успешните софтуерни инженери са умни, но много имат чувството, че не са достатъчно умни
- Митът за гениалния програмист
- Опасно е да сте сами: битката с невидимите чудовища в IT
Бележка за видео ресурсите
Някои видеа са достъпни само след записване в курс на Coursera или EdX- т.нар. MOOCs. Понякога се налага да изчакате няколко месеца, за да стартира ново издание на курса, така че няма да имате достъп до тях.
Би било чудесно такива ресурси да бъдат заменену с безплатни и винаги-достъпни публични източници като YouTube видеота (по възможност университетски лекции), за да могат всички да учат навсякъде и по всяко време, а не само когато даден курс върви в момента.
Изберете език за програмиране
Трябва да изберете език за програмиране за интервютата на които ще се явявате, но също така трябва да изберете език, който можете да ползвате за учене на концепции от компютърните науки.
Желателно е този език да е един и същ, така ще Ви се налага да владеете само един език.
За този учебен план
Когато преминавах през учебния план ползвах 2 езика за по-голямата част от нещата: C и Python
- C: Език на много ниско ниво. Дава Ви възможност да се справяте с пойнтъри и управляване на паметта, за да разберете структурите от данни и алгоритмите на много дълбоко ниво. В езици за програмиране на по-високо ниво тези неща са скрити от Вас. В ежедневната работа това е прекрасно, но когато се учите как тези структури от данни работят е хубаво да усещате как става всичко.
- C е навсякъде. Ще виждате примери в книги, лекции, видеа навсякъде докато учите.
- The C Programming Language, Vol 2
- Това е кратка книга, но ще Ви даде добра представа за езика и с малко упражнения бързо ще имате добро владение над него. Ако разбирате C значи разбирате как програмите и паметта работят.
- Не трябва да се зачитате много надълбоко в книгата (или дори да я прочитате докрай). Нужно е само да сте уверени в способността си да четете и пишете в C.
- Отговори на въпросите в книгата
- Python: модерен и много експресивен. Научих го защото е наистина много полезен и ми позволява да пиша по-малко код когато съм на интервю.
Това е моя личен избор. Вие можете да изберете каквото пожелаете, разбира се.
Може да не Ви трябват, но ето някои сайтове за учене на нов език:
За интервюто Ви по програмиране
Може да изберете език, в който се чувствате комфортно за интервюто Ви, но за големите компании това са най-добрите опции:
- C++
- Java
- Python
Може да ползвате и тези, но поразгледайте преди това, защото може да има уловки:
- JavaScript
- Ruby
Това е статия, която написах за избирането на език за вашето интервю: Pick One Language for the Coding Interview. Това е оригиналната статия, на която базирах моя пост: http://blog.codingforinterviews.com/best-programming-language-jobs/
Трябва да се чувствате много удобно с вашия език и да сте знаещи.
Повече за вариантите:
Вижте ресурси за специфични езици тук
Книги за структури от данни и алгоритми
Тази книга ще положи вашата основа в компютърните науки.
Просто изберете една в език, с който ще се чувствате комфортно. Ще трябва да четете и да пишете код доста.
C
- Algorithms in C, Parts 1-5 (Bundle), 3rd Edition
- Основни познания, структури от данни, сортиране, търсене и алгоритми за графи
Python
- Data Structures and Algorithms in Python
- от Goodrich, Tamassia, Goldwasser
- Тази книга ми допадна много. Покрива всичко и още нещо
- 'Питоничен' код
- Докладът ми за тази книга: https://startupnextdoor.com/book-report-data-structures-and-algorithms-in-python/
Java
Изборът е ваш:
- Goodrich, Tamassia, Goldwasser
- Sedgewick and Wayne:
- Algorithms
- Безплатен курс в Coursera, който покрива материала от книгата (воден от писателите!):
C++
Изборът е ваш:
- Goodrich, Tamassia, and Mount
- Sedgewick and Wayne
Книги за подготовка за интервю
Няма нужда да купувате цял куп от тези книги. Честно казано "Cracking the Coding Interview" най-вероятно ще Ви бъде достатъчна, но аз си купих повече, за да се упражня по-добре. Но аз винаги правя прекалено много.
Купих тези двете, дадоха ми предостатъчно упражнение.
- Programming Interviews Exposed: Coding Your Way Through the Interview, 4th Edition
- Отговори в C++ и Java
- Това е добра подготовка за "Cracking the Coding Interview"
- Не е прекалено сложна. Повечето проблеми са по-лесни от тези, които ще срещнете на интервю (от това, което аз съм прочел)
- Cracking the Coding Interview, 6th Edition
- отговори в Java
Ако имате изобилие от време:
Изберете една:
- Elements of Programming Interviews (C++ version)
- Elements of Programming Interviews in Python
- Elements of Programming Interviews (Java version) - Companion Project - Method Stub and Test Cases for Every Problem in the Book
Не повтаряйте грешките ми
Този списък се разрасна с времето и да, нещата излязоха извън контрол.
Споделям някои от грешките, които направих, за да имате по-добро преживяване и за да си спестите месеци с време.
1. Няма да запомните всичко
Изгледах часове с клипове и водих записки за всичко, но след месеци имаше доста неща, които не си спомнях. Прекарах 3 дена преразглеждайки бележките си, за да си припомня някои неща. Не се нуждаех от всичките тези знания.
Моля, прочетете това, за да не повторите грешките миЛ
Да запазваме знания свързани с компютърни науки.
2. Използвайте флаш карти
За да се справя с проблема си направих малък сайт за флаш карти, където можех да добавям 2 вида карти: общи и такива с код. Всяка карта има ралично форматиране. Направих сайта mobile-first, за да мога да ги разглеждам от телефона или таблета си, навсякъде където съм.
Направете свои безплатно:
НЕ ПРЕПОРЪЧВАМ да ползвате моите флаш карти. Има прекалено много и някои от тях съдържат информация, която не е нужно да знаете.
Но ако не искате да ме послушате, ето:
- Базата ми от данни с флаш карти (1200 карти):
- Базата ми от данни с флаш карти (екстремно - 1800 карти):
Забележете, че аз прекалих и имам карти, които покриват всичко от assembly language и Python Trivia до machine learning и статистика. Прекалено много е за това, което се изисква.
Бележка за флаш картите: Първия път когато видите, че знаете отговора, не я отбелязвайте като "позната". Трябва да видите същата карта и отговора няколко пъти, преди наистина да знаете отговора. Повторението ще накара мозъка Ви наистина да запамети знанието.
3. Решавайте задачи от интервюта по програмиране докато учите
ТОВА Е МНОГО ВАЖНО.
Почнете да решавате задачи от интервюта по програмиране докато учите структури от данни и алгоритми.
Трябва да прилагате това, което учите като решавате задачи иначе ще забравите. Аз направих тази грешка.
Когато сте научили някоя тема и се чувствате що годе комфортно с нея, например linked lists:
- Отворете една от книгите за интервю за програмиране (или един от сайтовете със задачи, изредени по-долу)
- Решете 2-3 задачи свързани с linked lists.
- Продължете към следващата тема.
- По-късно се върнете и отново решете 2-3 задачи свързани с linked lists.
- Повтаряйте това с всяка нова тема, която учите.
Продължавайте да решавате задачи докато учите всичко това, а не след това.
Няма да ви наемат за знанията, които имате, а за това как ги прилагате.
Има много ресурси свързани с това надолу. Продължавайте да четете.
4. Фокусирайте се
Има много неща, които могат да отвлекат вниманието Ви и да Ви загубят ценно време. Да сте концентрирани е трудно. Пуснете си музика без текст и ще можете да се фокусирате сравнително добре.
Какво няма да намерите тук
Това са широко разпространени технологии, но не и част от учебния план:
- SQL
- Javascript
- HTML, CSS, и други front-end технологии
Дневния план
Този курс преминава през множество от теми. Всяка от тях най-вероятно ще Ви отнеме няколко дена или дори седмица, или повече. Зависи от графика Ви.
Всеки ден взимайте следващата тема в списъка, изгледайте няколко клипа по тази тема и след това напишете имплементацията на въпросната структура от данни или алгоритъм в езика за програмиране, който сте избрали за този курс.
Можете да видите моя код тук:
Не е нужно да помните всеки алгоритъм наизуст. Необходимо е просто да ги разбирате достатъчно добре, за да можете да напишете собствена имплементация.