> Първоначално създадох това като кратък списък с теми за учене, за това как се става софтуерен инженер, но то прерасна в този огромен списък, който виждате в момента. След като преминах през този учебен план, [бях нает като софтуерен инженер в Amazon](https://startupnextdoor.com/ive-been-acquired-by-amazon/?src=ciu)! Най-вероятно няма да Ви се налага да учите колкото на мен, но все пак всичко, от което се нуждаете е тук.
> Учих между 8-12 часа на ден в продължение на няколко месеца. Това е историята ми: [Why I studied full-time for 8 months for a Google interview](https://medium.freecodecamp.org/why-i-studied-full-time-for-8-months-for-a-google-interview-cc662ce9bb13)
> **Моля обърнете внимание:** Няма да Ви се налага да учите колкото мен. Загубих много време, учейки неща, които няма нужда да знам. Може да прочетете повече за това надолу. Ще Ви помогна да достигнете до крайната цел без да прахосвате скъпото си време.
> Темите, изредени тук, ще Ви подготвят добре за техническо интервю за почти всяка една компания, включително гигантите Amazon, Facebook, Google и Microsoft
Трябва да изберете език за програмиране за интервютата на които ще се явявате, но също така трябва да изберете език, който можете да ползвате за учене на концепции от компютърните науки.
Желателно е този език да е един и същ, така ще Ви се налага да владеете само един език.
### За този учебен план
Когато преминавах през учебния план ползвах 2 езика за по-голямата част от нещата: C и Python
* C: Език на много ниско ниво. Дава Ви възможност да се справяте с пойнтъри и управляване на паметта, за да разберете структурите
от данни и алгоритмите на много дълбоко ниво. В езици за програмиране на по-високо ниво тези неща са скрити от Вас. В ежедневната
работа това е прекрасно, но когато се учите как тези структури от данни работят е хубаво да усещате как става всичко.
- C е навсякъде. Ще виждате примери в книги, лекции, видеа _навсякъде_ докато учите.
- [The C Programming Language, Vol 2](https://www.amazon.com/Programming-Language-Brian-W-Kernighan/dp/0131103628)
- Това е кратка книга, но ще Ви даде добра представа за езика и с малко упражнения бързо ще имате добро владение над него. Ако разбирате C значи разбирате как програмите и паметта работят.
-Не трябва да се зачитате много надълбоко в книгата (или дори да я прочитате докрай). Нужно е само да сте уверени в способността си да четете и пишете в C.
- [Отговори на въпросите в книгата](https://github.com/lekkas/c-algorithms)
* Python: модерен и много експресивен. Научих го защото е наистина много полезен и ми позволява да пиша по-малко код когато съм на интервю.
- [Data Structures and Algorithms in C++, 2nd Edition](https://www.amazon.com/Data-Structures-Algorithms-Michael-Goodrich/dp/0470383275)
- Sedgewick and Wayne
- [Algorithms in C++, Parts 1-4: Fundamentals, Data Structure, Sorting, Searching](https://www.amazon.com/Algorithms-Parts-1-4-Fundamentals-Structure/dp/0201350882/)
- [Algorithms in C++ Part 5: Graph Algorithms](https://www.amazon.com/Algorithms-Part-Graph-3rd-Pt-5/dp/0201361183/)
Няма нужда да купувате цял куп от тези книги. Честно казано "Cracking the Coding Interview" най-вероятно ще Ви бъде достатъчна, но аз си купих повече, за да се упражня по-добре. Но аз винаги правя прекалено много.
Купих тези двете, дадоха ми предостатъчно упражнение.
- [Programming Interviews Exposed: Coding Your Way Through the Interview, 4th Edition](https://www.amazon.com/Programming-Interviews-Exposed-Through-Interview/dp/111941847X/)
- Отговори в C++ и Java
- Това е добра подготовка за "Cracking the Coding Interview"
-Нее прекалено сложна. Повечето проблеми са по-лесни от тези, които ще срещнете на интервю (от това, което аз съм прочел)
- [Cracking the Coding Interview, 6th Edition](http://www.amazon.com/Cracking-Coding-Interview-6th-Programming/dp/0984782850/)
- [Elements of Programming Interviews (C++ version)](https://www.amazon.com/Elements-Programming-Interviews-Insiders-Guide/dp/1479274836)
- [Elements of Programming Interviews in Python](https://www.amazon.com/Elements-Programming-Interviews-Python-Insiders/dp/1537713949/)
- [Elements of Programming Interviews (Java version)](https://www.amazon.com/Elements-Programming-Interviews-Java-Insiders/dp/1517435803/) - [Companion Project - Method Stub and Test Cases for Every Problem in the Book](https://github.com/gardncl/elements-of-programming-interviews)
## Не повтаряйте грешките ми
Този списък се разрасна с времето и да, нещата излязоха извън контрол.
Споделям някои от грешките, които направих, за да имате по-добро преживяване и за да си спестите месеци с време.
### 1. Няма да запомните всичко
Изгледах часове с клипове и водих записки за всичко, но след месеци имаше доста неща, които не си спомнях. Прекарах 3 дена преразглеждайки бележките си, за да си припомня някои неща. Несе нуждаех от всичките тези знания.
Моля, прочетете това, за да не повторите грешките миЛ
[Да запазваме знания свързани с компютърни науки](https://startupnextdoor.com/retaining-computer-science-knowledge/).
### 2. Използвайте флаш карти
За да се справя с проблема си направих малък сайт за флаш карти, където можех да добавям 2 вида карти: общи и такива с код. Всяка карта има ралично форматиране. Направих сайта mobile-first, за да мога да ги разглеждам от телефона или таблета си, навсякъде където съм.
Направете свои безплатно:
- [Flashcards site repo](https://github.com/jwasham/computer-science-flash-cards)
**НЕ ПРЕПОРЪЧВАМ да ползвате моите флаш карти.** Има прекалено много и някои от тях съдържат информация, която не е нужно да знаете.
Но ако не искате да ме послушате, ето:
- [Базата ми от данни с флаш карти (1200 карти)](https://github.com/jwasham/computer-science-flash-cards/blob/main/cards-jwasham.db):
- [Базата ми от данни с флаш карти (екстремно - 1800 карти)](https://github.com/jwasham/computer-science-flash-cards/blob/main/cards-jwasham-extreme.db):
Забележете, че аз прекалих и имам карти, които покриват всичко от assembly language и Python Trivia до machine learning и статистика. Прекалено много е за това, което се изисква.
**Бележка за флаш картите:** Първия път когато видите, че знаете отговора, не я отбелязвайте като "позната". Трябва да видите същата карта и отговора няколко пъти, преди наистина да знаете отговора. Повторението ще накара мозъка Ви наистина да запамети знанието.
### 3. Решавайте задачи от интервюта по програмиране докато учите
ТОВАЕ МНОГО ВАЖНО.
Почнете да решавате задачи от интервюта по програмиране докато учите структури от данни и алгоритми.
Трябва да прилагате това, което учите като решавате задачи иначе ще забравите. Аз направих тази грешка.
Когато сте научили някоя тема и се чувствате що годе комфортно с нея, например **linked lists**:
1. По-късно се върнете и отново решете 2-3 задачи свързани с linked lists.
1. Повтаряйте това с всяка нова тема, която учите.
**Продължавайте да решавате задачи докато учите всичко това, а не след това.**
Няма да ви наемат за знанията, които имате, а за това как ги прилагате.
Има много ресурси свързани с това надолу. Продължавайте да четете.
### 4. Фокусирайте се
Има много неща, които могат да отвлекат вниманието Ви и да Ви загубят ценно време. Да сте концентрирани е трудно. Пуснете си музика без текст и ще можете да се фокусирате сравнително добре.
## Какво няма да намерите тук
Това са широко разпространени технологии, но не и част от учебния план:
- [Как да намерим решение](https://www.topcoder.com/community/competitive-programming/tutorials/how-to-find-a-solution/)
- [Как да направим дисекция на условие на задача от Topcoder](https://www.topcoder.com/community/competitive-programming/tutorials/how-to-dissect-a-topcoder-problem-statement/)
- [ ] [Big O Notations (общ наръчник) (клип)](https://www.youtube.com/watch?v=V6mKVRU1evU)
- [ ] [Big O Notation (и Omega, и Theta) - най-доброто математично обяснение (клип)](https://www.youtube.com/watch?v=ei-A_wy5Yxw&index=2&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN)
- [ ] [[Review] Linked lists in 4 minutes (video)](https://youtu.be/F8AbOfQwl1c)
- [ ] [Код в C (клип)](https://www.youtube.com/watch?v=QN6FPiD0Gzo) - не цялото видео, само частите за Node structs и алокация на памет
- [ ] Свързани списъци срещу масиви:
- [Core Linked Lists Vs Arrays (клип)](https://www.coursera.org/lecture/data-structures-optimizing-performance/core-linked-lists-vs-arrays-rjBs9)
- [Свързани списъци срещу масиви в истинския свят (клип)](https://www.coursera.org/lecture/data-structures-optimizing-performance/in-the-real-world-lists-vs-arrays-QUaUd)
- [ ] [Защо да избягваме свързаните списъци (клип)](https://www.youtube.com/watch?v=YQs6IC-vgmo)
- [ ]Аха: трябват Ви pointer to pointer знания:
(за да можете да подавате pointer към функция, която може да промени адреса, към който сочи pointer-a)
Тази страница служи само да схванете ptr to ptr. Не препоръчвам този стил на обхождане на списъка. Четливостта
и поддържаемостта страдат заради хитрости.
- [Pointers to Pointers](https://www.eskimo.com/~scs/cclass/int/sx8.html)
- [ ] Имплементация:
- [ ] size() - връща броя на елементите
- [ ] empty() - булева стойност, връща true ако списъка е празен
- [ ] value_at(index) - връща стойността на n-тия елемент (почвайки от 0 за първия елемент)
- [ ] push_front(value) - добавя стойност към началото на списъка
- [ ] pop_front() - премахва първия елемент и връща стойността му
- [ ] push_back(value) - добавя елемент към края
- [ ] pop_back() - премахва последния елемент и връща стойността му
- [ ] front() - взима стойността на първия елемент
- [ ] back() - взима стойността на последния елемент
- [ ] insert(index, value) - вкарва елемента на дадения индекс, така че новия елемент да сочи към стария елемент на този индекс
- [ ] erase(index) - изтрива node-а на дадения индекс
- [ ] value_n_from_end(n) - връща стойността на node-а, седящ на позиция n от края на списъка
- [ ] reverse() - обръща списъка
- [ ] remove_value(value) - премахва първия елемент от списъка, съдържащ тази стойност
- [ ] [Phone Book Problem (клип)](https://www.coursera.org/lecture/data-structures/phone-book-problem-NYZZP)
- [ ] Дистрибутирани хеш таблици:
- [Instant Uploads And Storage Optimization In Dropbox (клип)](https://www.coursera.org/lecture/data-structures/instant-uploads-and-storage-optimization-in-dropbox-DvaIb)
- [ ] [[Review] Binary search in 4 minutes (video)](https://youtu.be/fDKIpRe8GW4)
- [ ] Имплементирайте:
- двоично търсене (на сортиран масив от integers)
- двоично търсене чрез рекурсия
- ### Побитови операции
- [ ] [Bits cheat sheet](https://github.com/jwasham/coding-interview-university/blob/main/extras/cheat%20sheets/bits-cheat-sheet.pdf) - трябва да знаете доста от степените на 2 от (2^1 до 2^16 и 2^32)
- [ ] Бъдете сигурни, че разбирате добре битовата манипулация: &, |, ^, ~, >>, <<
- [How To Count The Number Of Set Bits In a 32 Bit Integer](http://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32-bit-integer)
- [ ] [Двоично дърво за търсене - имплементация в C/C++ (клип)](https://www.youtube.com/watch?v=COZK7NATh4k&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=28)
- [ ] [BST имплементация - memory allocation in stack and heap (клип)](https://www.youtube.com/watch?v=hWokyBoo0aI&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=29)
- [ ] [Намиране на мин. и макс. елемент в двоично дърво за търсенея (клип)](https://www.youtube.com/watch?v=Ut90klNN264&index=30&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P)
- [ ] [Намиране на височината на двоично дърво (клип)](https://www.youtube.com/watch?v=_pnqMz5nrRs&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=31)
- [ ] [Обхождане на двоично дърво - стратегии за обхождане по ширина и по дълбочина (клип)](https://www.youtube.com/watch?v=9RHO6jU--GU&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=32)
- [ ] [Двоично дърво: преминаване на порядъка на ниво (клип)](https://www.youtube.com/watch?v=86g8jAQug04&index=33&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P)
- [ ] [Проверка дали двоично дърво е двоично дърво за търсене (клип)](https://www.youtube.com/watch?v=yEwSGhSsT0U&index=35&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P)
- [ ] [Изтриване на възел от двоично дърво за търсене (клип)](https://www.youtube.com/watch?v=gcULXE7ViZw&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=36)
- [ ] [Редовен наследник в двоично дърво (клип)](https://www.youtube.com/watch?v=5cPbNCrdotA&index=37&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P)
- [ ] Имплементирайте:
- [ ] insert // вкарване на стойност в дървото
- [ ] get_node_count // вземане на бройката на запазените стойности
- [ ] print_values // принтира стойностите в дървото от най-малкия до най-големия
- [ ] delete_tree
- [ ] is_in_tree // връща true ако дадената стойност съществува в дървото
- [ ] get_height // returns the height in nodes (single node's height is 1)
- [ ] get_min // връща най-малката стойност, съхранявана в дървото
- [ ] get_max // връща най-голямата стойност, съхранявана в дървото
- [ ] is_binary_search_tree
- [ ] delete_value
- [ ] get_successor // връща следващата най-голяма стойност след дадената, -1 ако такава не съществува
Графите могат да се ползват за онагледяване на много проблеми в компютърните науки, така че тази секция е дълга, също както тази за дърветата и сортирането..
- Бележки:
- Има 4 основни начина една графа да бъде представена в паметта:
- обекти и пойнтъри
- матрици на съседство
- списъци на съседство
- мап на съседство
- Запознайте сес всяка от начините за представяне и плюсовете, и минусите, които предоставят
- BFS и DFS - знайте изчислителната им сложност, компромисите, които носят и как да ги имплементирате в истински код
- Когато Ви зададат въпрос, първо потърсете решение с граф и преминете нататък ако няма такова
- [ ] MIT(клипове):
- [ ] [Обхождане по ширина](https://www.youtube.com/watch?v=s-CYnVz-uh4&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=13)
- [ ] [Обхождане по дълбочина](https://www.youtube.com/watch?v=AfSk24UTFS8&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=14)
- [ ] Skiena Lectures - чудесно въведение:
- [ ] [CSE373 2012 - Лекция 11 - Граф като структура от данни (клип)](https://www.youtube.com/watch?v=OiXxhDrFruw&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=11)
- [ ] [CSE373 2012 - Лекция 12 - Обхождане по ширина (клип)](https://www.youtube.com/watch?v=g5vF8jscteo&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=12)
- [ ] [6.006 Задача за най-кратък път от един източник (клип)](https://www.youtube.com/watch?v=Aa2sqUhIn-E&index=15&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
- [ ] [6.006 Как да забързаме Дейкстра (клип)](https://www.youtube.com/watch?v=CHvQ3q_gJ7E&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=18)
- [ ] [Aduni: Алгоритми за графи I - Топологично сортиране, Минимално обхващащи дървета, Алгоритъм на Прим - Лекция 6 (клип)](https://www.youtube.com/watch?v=i_AQT_XfvD8&index=6&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
- [ ] [Aduni: Алгоритми за графи II - DFS, BFS, Алгоритъм на Крускал, Union Find структура от данни - Лекция 7 (клип)](https://www.youtube.com/watch?v=ufj5_bppBsA&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=7)
- [ ] [Aduni: Алгоритми за графи III: Най-кратък път - Лекция 8 (клип)](https://www.youtube.com/watch?v=DiedsPsMKXc&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=8)
- [ ] [Aduni: Алгоритми за графи IV: Въведение в геометричните алгоритми - Лекция 9 (клип)](https://www.youtube.com/watch?v=XIAQRlNkJAw&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=9)
- [ ] ~~[CS 61B 2014 (от 58:09) (клип)](https://youtu.be/dgjX4HdMI-Q?list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd&t=3489)~~
- Най-вероятно няма да срещнете задачи с динамично програмиране в интервютата си, но си струва да можете да разпознавате задачи, които са годни за решаване с динамично програмиране.
- Тази тема може да е доста сложна защото всяка задача, която може да се решава с ДП трябва да бъде дефинирана чрез рекурсивна връзка, а понякога може да е сложно да се измисли такава.
- Препоръчвам да разгледате много примери за задачи с ДП докато имате стабилно разбиране на структурата им.
- [ ] Клипове:
- клиповете от Skiena могат да бъдат сложни за проследяване, тъй като той понякога ползва дъската, която е прекалено малка, за да се види
- [ ] [The RNA secondary structure problem (клип)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/80RrW/the-rna-secondary-structure-problem)
- [ ] [Алгоритъм за динамично програмиране (клип)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/PSonq/a-dynamic-programming-algorithm)
- [ ] [Илюстриране на алгоритъма за ДП (клип)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/oUEK2/illustrating-the-dp-algorithm)
- [ ] [Време за изпълнение на алгоритъма за ДП (клип)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/nfK2r/running-time-of-the-dp-algorithm)
- [ ] [ДП срещу рекурсивна имплементация (клип)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/M999a/dp-vs-recursive-implementation)
- [ ] [Глобално подравняване на последователности по двойки (клип)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/UZ7o6/global-pairwise-sequence-alignment)
- [ ] [Локално подравняване на последователности по двойки (клип)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/WnNau/local-pairwise-sequence-alignment)
- ### NP, NP-Complete and Approximation Algorithms
- Знайте за най-известните задачи за NP-завършеност като пътуващия търговец и бъдете сигурни, че можете да ги разпознавате, когато интервюиращия ви ги даде прикрити
- Ресурси, от които се нуждаят процесите (памет: код, статично пространство, стек, heap, и file descriptors, i/o)
- Ресурси, от които се нуждаят нишките (споделя същите като по-горе (без стек) с други нишки в същия процес, но всяка има свой pc, стек брояч, регистри и стек)
- Forking is really copy on write (read-only) until the new process writes to memory, then it does a full copy.
- Смяна на контекста
- Как смяната на контекста се инициира от операционната система и хардуера?
- [ ] [Нишки в C++ (серия - 10 клипа)](https://www.youtube.com/playlist?list=PL5jc9xFGsL8E12so1wlMS0r0hTQoJL74M)
- [ ] [CS 377 Spring '14: Операционни системи от University of Massachusetts](https://www.youtube.com/playlist?list=PLacuG5pysFbDQU8kKxbUh4K5c1iL5_k7k)
- [ ] concurrency в Python (клипове):
- [ ] [Кратка серия върху нишки](https://www.youtube.com/playlist?list=PL1H1sBF1VAKVMONJWJkmUh6_p8g4F2oy1)
- [ ] [Търсене на на шаблон в текст (клип)](https://www.coursera.org/learn/data-structures/lecture/tAfHI/search-pattern-in-text)
Ако ви трябват допълнителни детайли по тази тема вижте секцията "String Matching" в [Допълнителни детайли по някои теми](#допълнителни-детайли-по-някои-теми).
- Обърнете внимание, че има различни видове tries. Някои имат prefixes, а други нямат, също така някои ползват низове вместо битове за да следят пътеката
- [ ] [3. Character Based Operations](https://www.coursera.org/learn/algorithms-part2/lecture/jwNmV/character-based-operations)
- [ ] [Бележки върху структурите от данни и техники за програмиране](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#Tries)
- [ ] Малък курс с клипове:
- [ ] [Въведение в Tries (клип)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/08Xyf/core-introduction-to-tries)
- [ ] [Производителност на Tries (клип)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/PvlZW/core-performance-of-tries)
- [ ] [Имплементиране на Trie (клип)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/DFvd3/core-implementing-a-trie)
- [ ] [Trie: неглежираната структура от данни](https://www.toptal.com/java/the-trie-a-neglected-data-structure)
- [ ] [TopCoder - използване на Tries](https://www.topcoder.com/community/competitive-programming/tutorials/using-tries/)
- [ ] [Stanford лекция (приложение в истинския живот) (клип)](https://www.youtube.com/watch?v=TJ8SkcUSdbU)
- [ ] [MIT, Структури от данни за напреднали, Низове (може да има доста неяснота към половината на клипа) (клип)](https://www.youtube.com/watch?v=NinWEPPrkDQ&index=16&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf)
- ### Floating Point Numbers
- [ ] simple 8-bit: [Репрезентация на Floating Point числа - 1 (клип - има грешка в изчисленията - вижте описанието на клипа)](https://www.youtube.com/watch?v=ji3SfClm8TU)
- [ ] [Абсолютният минимум от знания всеки софтуерен разработчик трабва да има за уникод и набори от символи ](http://www.joelonsoftware.com/articles/Unicode.html)
- [ ] [Какво трябва всеки програмист да знае за кодирането и наборите от символи за да работи с текст](http://kunststube.net/encoding/)
- ### Endianness
- [ ] [Голям и малък Endian](https://web.archive.org/web/20180107141940/http://www.cs.umd.edu:80/class/sum2003/cmsc311/Notes/Data/endian.html)
- [ ] [Голям Endian срещу Малък Endian (клип)](https://www.youtube.com/watch?v=JrNF0KRAlyo)
- [ ] [Голям и малък Endian отвътре-навън (клип)](https://www.youtube.com/watch?v=oBSuXP-1Tc0)
- Много техничен разговор за kernel разработчици. Несе тревожете ако не схващате повечето неща.
- Първата половина е достатъчна.
- ### Мрежи
-**очаквайте въпроси по тази тема ако имте опит с мрежи или искате да бъдете reliability engineer/ operations engineer**
Тази секция съдържа по-кратки клипове за най-важните понятия, които можете да изгледате сравнително бързо. Полезни са ако искате да си припомните нещо от време на време.
- [ ] Серия от 2-3 минутни кратки клипове по различни теми (23 клипа)
- See Resume prep information in the books: "Cracking The Coding Interview" and "Programming Interviews Exposed"
-Не знам колко важно е това (можете сами да си направите проучване), но ето една статия за това как да направим резюмето си ATS Compliant:
- [Как да проверим дали резюмето ни е ATS Compliant](https://ayedot.com/97/MiniBlog/Meaning-of-ATS-compliant-resume-and-How-to-create-ATS-Resume-for-Free)
- ["This Is What A GOOD Resume Should Look Like" от Gayle McDowell (авторът на Cracking the Coding Interview)](https://www.careercup.com/resume),
- Бележка от автора: "Това се отнася към резюмета за САЩ. Към CV-тата за Индия и други държави има различни изисквания, но много от точките ще са същите."
## Намерете позиция
- [Сайтове за намиране на работа](https://ayedot.com/151/MiniBlog/Top-10-Best-Websites-for-Careers--Jobs)
- Научете как да се подготвяте за интервюта за софтуерен разработчик от бивш интервюиращ в Google
- [Python for Data Structures, Algorithms, and Interviews (платен курс)](https://www.udemy.com/python-for-data-structures-algorithms-and-interviews/):
-Курс, ориентиран към Python, който покрива структури от данни, алгоритми, mock интервюта и много повече.
- [Intro to Data Structures and Algorithms using Python (безплатен курс от Udacity)](https://www.udacity.com/course/data-structures-and-algorithms-in-python--ud513):
- Безплатен курс върху структури от данни и алгоритми, ориентиран към Python.
- [Data Structures and Algorithms Nanodegree! (платен Nanodegree от Udacity)](https://www.udacity.com/course/data-structures-and-algorithms-nanodegree--nd256):
- Get hands-on practice with over 100 data structures and algorithm exercises and guidance from a dedicated mentor to help prepare you for interviews and on-the-job scenarios.
- [Grokking the Behavioral Interview (безплатен курс от Educative)](https://www.educative.io/courses/grokking-the-behavioral-interview):
- Много често, не техническата Ви компетентност, а личностното интервю Ви спират да започнете мечтаната си работа.
Mock интервюта:
- [Gainlo.co: Mock интервюта от големи компании](http://www.gainlo.co/) - Използвах това и ми помогна да се успокоя за телефонното, screen и on-site интервютата
- [Pramp: Mock интервюта от/с връсници](https://www.pramp.com/) - модел за подготовка за интервю с връсници
- [interviewing.io: Mock интервюта за подготовка със senior инженери](https://interviewing.io) - анонимни интервюта за дизайн на алгоритми/системи със senior инженери от FAANG компаниите
## Мислете за това, когато дойде интервюто
Помислете за около 20 въпроса за интервю, които може да ви се паднат и редовете надолу. Имайте поне един отговор за всеки от тях. Имайте история, а не само данни за нещо, което сте постигнали.
- Защо искате тази работа?
- Дайте пример за труден проблем, който сте разрешили.
-Коее най-голямото предизвикателство, с което сте се сблъсквали?
- Best/worst designs seen?
- Дайте идея за подобрение на съществуващ продукт.
- Как работите най ефективно- самостоятелно или като част от екип?
- Кои от уменията Ви ще са важни активи в позицията и защо?
- Какво най-много Ви хареса на [работа x / проейт y]?
- Какво беше най-голямото предизвикателство, с което се сблъскахте на [работа x / проект y]?
- Кой е най-трудния bug, с който сте се сблъсквали на [работа x / проект y]?
- Какво научихте на [работа x / проект y]?
- Какво можехте да направите по-добре на [работа x / проект y]?
- Ако Ви се струва трудно да давате отговор на подобни въпроси, ето някои идеи:
- [Общи въпроси за интервю и отговорите им](https://ayedot.com/119/MiniBlog/General-Interview-Questions-and-their-Answers-for-Tech-Jobs)
## Подгответе въпроси за интервюиращия
Ето някои от моите (може вече да знам отговорът им когато ги задавам, но искам да чуя тяхното мнение и да видя перспективата им):
- Колко е голям екипът Ви?
- What does your dev cycle look like? Ползвате ли waterfall/sprints/agile методологии?
- Често ли се случва да гоните срокове? Или има гъвкавост?
- Как вземате решения във вашия екип?
- Колко срещи имате на седмица?
- Как работната среда Ви помага да се концентрирате, според Вас?
Всичко оттук надолу е по желание. НЕе нужно за entry-level интервю, но ако научите тези неща ще сте изложени пред повече концепции от компютърните науки и ще сте добре подготвени за всяка работа за софтуерно инженерство. Ще сте много по-добър софтуерен инженер.
- [Head First Design Patterns](https://www.amazon.com/gp/product/0596007124/)
- A gentle introduction to design patterns
- [Design Patterns: Elements of Reusable Object-Oriented Software](https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612)
- [Write Great Code: Volume 1: Understanding the Machine](https://www.amazon.com/Write-Great-Code-Understanding-Machine/dp/1593270038)
- 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](https://en.wikipedia.org/wiki/High_Level_Assembly), 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](https://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press/dp/0262033844)
-**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](https://www.amazon.com/dp/0128119055)
- For a richer, more up-to-date (2017), but longer treatment
## System Design, Scalability, Data Handling
**You can expect system design questions if you have 4+ years of experience.**
- Scalability and System Design are very large topics with many topics and resources, since
there is a lot to consider when designing a software/hardware system that can scale.
Expect to spend quite a bit of time on this
- Considerations:
- Scalability
- Distill large data sets to single values
- Transform one data set to another
- Handling obscenely large amounts of data
- System design
- features sets
- interfaces
- class hierarchies
- designing a system under certain constraints
- simplicity and robustness
- tradeoffs
- performance analysis and optimization
- [ ] **START HERE**: [The System Design Primer](https://github.com/donnemartin/system-design-primer)
- [ ] [System Design from HiredInTech](http://www.hiredintech.com/system-design/)
- [ ] [How Do I Prepare To Answer Design Questions In A Technical Interview?](https://www.quora.com/How-do-I-prepare-to-answer-design-questions-in-a-technical-interview?redirected_qid=1500023)
- [ ] [8 Things You Need to Know Before a System Design Interview](http://blog.gainlo.co/index.php/2015/10/22/8-things-you-need-to-know-before-system-design-interviews/)
- [ ] [System Design Interview](https://github.com/checkcheckzz/system-design-interview) - There are a lot of resources in this one. Look through the articles and examples. I put some of them below
- [ ] [How to ace a systems design interview](http://www.palantir.com/2011/10/how-to-rock-a-systems-design-interview/)
- [ ] [Numbers Everyone Should Know](http://everythingisdata.wordpress.com/2009/10/17/numbers-everyone-should-know/)
- [ ] [How long does it take to make a context switch?](http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html)
- [ ] [Transactions Across Datacenters (video)](https://www.youtube.com/watch?v=srOgpXECblk)
- [ ] [A plain English introduction to CAP Theorem](http://ksat.me/a-plain-english-introduction-to-cap-theorem)
- [ ] [Engineering for the Long Game - Astrid Atkinson Keynote(video)](https://www.youtube.com/watch?v=p0jGmgIrf_M&list=PLRXxvay_m8gqVlExPC5DG3TGWJTaBgqSA&index=4)
- [ ] [7 Years Of YouTube Scalability Lessons In 30 Minutes](http://highscalability.com/blog/2012/3/26/7-years-of-youtube-scalability-lessons-in-30-minutes.html)
- [ ] [How PayPal Scaled To Billions Of Transactions Daily Using Just 8VMs](http://highscalability.com/blog/2016/8/15/how-paypal-scaled-to-billions-of-transactions-daily-using-ju.html)
- [ ] [How to Remove Duplicates in Large Datasets](https://blog.clevertap.com/how-to-remove-duplicates-in-large-datasets/)
- [ ] [A look inside Etsy's scale and engineering culture with Jon Cowie (video)](https://www.youtube.com/watch?v=3vV4YiqKm1o)
- [ ] [What Led Amazon to its Own Microservices Architecture](http://thenewstack.io/led-amazon-microservices-architecture/)
- [ ] [To Compress Or Not To Compress, That Was Uber's Question](https://eng.uber.com/trip-data-squeeze/)
- [ ] [When Should Approximate Query Processing Be Used?](http://highscalability.com/blog/2016/2/25/when-should-approximate-query-processing-be-used.html)
- [ ] [Google's Transition From Single Datacenter, To Failover, To A Native Multihomed Architecture](http://highscalability.com/blog/2016/2/23/googles-transition-from-single-datacenter-to-failover-to-a-n.html)
- [ ] [The Image Optimization Technology That Serves Millions Of Requests Per Day](http://highscalability.com/blog/2016/6/15/the-image-optimization-technology-that-serves-millions-of-re.html)
- [ ] [Tinder: How Does One Of The Largest Recommendation Engines Decide Who You'll See Next?](http://highscalability.com/blog/2016/1/27/tinder-how-does-one-of-the-largest-recommendation-engines-de.html)
- [ ] [Design Of A Modern Cache](http://highscalability.com/blog/2016/1/25/design-of-a-modern-cache.html)
- [ ] [Live Video Streaming At Facebook Scale](http://highscalability.com/blog/2016/1/13/live-video-streaming-at-facebook-scale.html)
- [ ] [A Beginner's Guide To Scaling To 11 Million+ Users On Amazon's AWS](http://highscalability.com/blog/2016/1/11/a-beginners-guide-to-scaling-to-11-million-users-on-amazons.html)
- [ ] [A 360 Degree View Of The Entire Netflix Stack](http://highscalability.com/blog/2015/11/9/a-360-degree-view-of-the-entire-netflix-stack.html)
- [ ] [Latency Is Everywhere And It Costs You Sales - How To Crush It](http://highscalability.com/latency-everywhere-and-it-costs-you-sales-how-crush-it)
- [ ] [What Powers Instagram: Hundreds of Instances, Dozens of Technologies](http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances)
- [ ] [Salesforce Architecture - How They Handle 1.3 Billion Transactions A Day](http://highscalability.com/blog/2013/9/23/salesforce-architecture-how-they-handle-13-billion-transacti.html)
- [ ] [ESPN's Architecture At Scale - Operating At 100,000 Duh Nuh Nuhs Per Second](http://highscalability.com/blog/2013/11/4/espns-architecture-at-scale-operating-at-100000-duh-nuh-nuhs.html)
- [ ] See "Messaging, Serialization, and Queueing Systems" way below for info on some of the technologies that can glue services together
- [ ] Twitter:
- [O'Reilly MySQL CE 2011: Jeremy Cole, "Big and Small Data at @Twitter" (video)](https://www.youtube.com/watch?v=5cKTP36HVgI)
- [Timelines at Scale](https://www.infoq.com/presentations/Twitter-Timeline-Scalability)
- For even more, see "Mining Massive Datasets" video series in the [Video Series](#video-series) section
- [ ] Practicing the system design process: Here are some ideas to try working through on paper, each with some documentation on how it was handled in the real world:
- review: [The System Design Primer](https://github.com/donnemartin/system-design-primer)
- [System Design from HiredInTech](http://www.hiredintech.com/system-design/)
Добавих тези теми, за да Ви помогна да бъдете по-добри софтуерни инженери и да сте наясно с определени технологии и алгоритми, което ще разшири "инструментите", с които можете да работите
- ### Компилатори
- [Как работи един компилатор в ~1 минута (клип)](https://www.youtube.com/watch?v=IhC7sdYe-Jg)
- [Да разберем оптимизирането на компилатори (C++) (клип)](https://www.youtube.com/watch?v=FnGCDLhaxKU)
- ### Emacs and vi(m)
- Запознайте сес някой unix-базиран кодов редактор
- vi(m):
- [Редактиране с vim 01 - Инсталация, настройване и различните режими (клип)](https://www.youtube.com/watch?v=5givLEMcINQ&index=1&list=PL13bz4SHGmRxlZVmWQ9DvXo1fEg4UdGkr)
- [Основите на Марковския текст](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/waxgx/core-markov-text-generation)
- [Основите на имплементацията на Марковския текст](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/gZhiC/core-implementing-markov-text-generation)
- [Проект = Ръководство за Марковския текст](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/EUjrq/project-markov-text-generation-walk-through)
- Вижте повече в серията Information and Entropy MIT 6.050J надолу
- [Как да преброим един милиард различни обекта ползвайки само 1.5KB памет](http://highscalability.com/blog/2012/4/5/big-data-counting-how-to-count-a-billion-distinct-objects-us.html)
- [Разделяй и владей: van Emde Boas Trees (клип)](https://www.youtube.com/watch?v=hmReJCupbNU&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=6)
- [Бележки от лекции към MIT](https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-design-and-analysis-of-algorithms-spring-2012/lecture-notes/MIT6_046JS12_lec15.pdf)
- [An Introduction To Binary Search And Red Black Tree](https://www.topcoder.com/community/competitive-programming/tutorials/an-introduction-to-binary-search-and-red-black-trees/)
- [MIT 6.851 - Memory Hierarchy Models (video)](https://www.youtube.com/watch?v=V3omVLzI0WE&index=7&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf) - covers cache-oblivious B-Trees, very interesting data structures - the first 37 minutes are very technical, may be skipped (B is block size, cache line size)
- [Geometric Algorithms: Graham & Jarvis - Lecture 10](https://www.youtube.com/watch?v=J5aJEcOr6Eo&index=10&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm)
- [Divide & Conquer: Convex Hull, Median Finding](https://www.youtube.com/watch?v=EzeYI7p9MjU&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=2)
- ### Discrete math
- [Computer Science 70, 001 - Spring 2015 - Discrete Mathematics and Probability Theory](http://www.infocobuild.com/education/audio-video-courses/computer-science/cs70-spring2015-berkeley.html)
- [Discrete Mathematics by Shai Simonson (19 videos)](https://www.youtube.com/playlist?list=PLWX710qNZo_sNlSWRMVIh6kfTjolNaZ8t)
- [Discrete Mathematics By IIT Ropar NPTEL](https://nptel.ac.in/courses/106/106/106106183/)
- [How Google Is Remaking Itself As A Machine Learning First Company](https://backchannel.com/how-google-is-remaking-itself-as-a-machine-learning-first-company-ada63defcb70)
- [Large-Scale Deep Learning for Intelligent Computer Systems (video)](https://www.youtube.com/watch?v=QSaZGT4-6EY)
- [Deep Learning and Understandability versus Software Engineering and Verification by Peter Norvig](https://www.youtube.com/watch?v=X769cyzBNVw)
- [Practical Guide to implementing Neural Networks in Python (using Theano)](http://www.analyticsvidhya.com/blog/2016/04/neural-networks-python-theano/)
- Courses:
- [Great starter course: Machine Learning](https://www.coursera.org/learn/machine-learning) - [videos only](https://www.youtube.com/playlist?list=PLZ9qNFMHZ-A4rycgrgOYma6zxF4BZGGPW) - see videos 12-18 for a review of linear algebra (14 and 15 are duplicates)
- [Neural Networks for Machine Learning](https://www.coursera.org/learn/neural-networks)
- [Google's Deep Learning Nanodegree](https://www.udacity.com/course/deep-learning--ud730)
Добавих тези, за да подкрепя някои от темите и материалите посочени по горе, но не исках да ги добавям там, защото са прекалено много. Лесно е да научите прекалено много по някоя тема.
- [ ] [Bob Martin SOLID Principles of Object Oriented and Agile Design (video)](https://www.youtube.com/watch?v=TMuno5RZNeE)
- [ ] S - [Single Responsibility Principle](http://www.oodesign.com/single-responsibility-principle.html) | [Single responsibility to each Object](http://www.javacodegeeks.com/2011/11/solid-single-responsibility-principle.html)
- [ ] O - [Open/Closed Principle](http://www.oodesign.com/open-close-principle.html) | [On production level Objects are ready for extension but not for modification](https://en.wikipedia.org/wiki/Open/closed_principle)
- [ ] L - [Liskov Substitution Principle](http://www.oodesign.com/liskov-s-substitution-principle.html) | [Base Class and Derived class follow ‘IS A’ Principle](http://stackoverflow.com/questions/56860/what-is-the-liskov-substitution-principle)
- [ ] I - [Interface segregation principle](http://www.oodesign.com/interface-segregation-principle.html) | clients should not be forced to implement interfaces they don't use
- [Interface Segregation Principle in 5 minutes (video)](https://www.youtube.com/watch?v=3CtAfl7aXAQ)
- [ ] D -[Dependency Inversion principle](http://www.oodesign.com/dependency-inversion-principle.html) | Reduce the dependency In composition of objects.
- [Why Is The Dependency Inversion Principle And Why Is It Important](http://stackoverflow.com/questions/62539/what-is-the-dependency-inversion-principle-and-why-is-it-important)
- [6.006: ДП IV: Guitar Fingering, Tetris, Super Mario Bros.](https://www.youtube.com/watch?v=tp4_UXaVyx8&index=22&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb)
- [6.046: Динамично програмиране & ДП за напреднали](https://www.youtube.com/watch?v=Tw1k46ywN6E&index=14&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp)
- [2004: MapReduce: Simplified Data Processing on Large Clusters](http://static.googleusercontent.com/media/research.google.com/en//archive/mapreduce-osdi04.pdf)
- [2006: Bigtable: A Distributed Storage System for Structured Data](https://static.googleusercontent.com/media/research.google.com/en//archive/bigtable-osdi06.pdf)
- [2006: The Chubby Lock Service for Loosely-Coupled Distributed Systems](https://research.google.com/archive/chubby-osdi06.pdf)
- [2007: Dynamo: Amazon’s Highly Available Key-value Store](http://s3.amazonaws.com/AllThingsDistributed/sosp/amazon-dynamo-sosp2007.pdf)
- [2007: What Every Programmer Should Know About Memory (very long, and the author encourages skipping of some sections)](https://www.akkadia.org/drepper/cpumemory.pdf)
- 2012: AddressSanitizer: A Fast Address Sanity Checker:
- [2014: Machine Learning: The High-Interest Credit Card of Technical Debt](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43146.pdf)
- [2015: Continuous Pipelines at Google](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43790.pdf)
- [2015: High-Availability at Massive Scale: Building Google’s Data Infrastructure for Ads](https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/44686.pdf)
- [2015: TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems](http://download.tensorflow.org/paper/whitepaper2015.pdf)
- [2015: How Developers Search for Code: A Case Study](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43835.pdf)