Оригинальная версия: Английский
Это мой учебный план, рассчитанный на несколько месяцев для веб-разработчиков, не имеющих образования в Computer Science (CS) и планирующих работать инженерами-программистами (software engineer) в компании Google.
За основу учебного плана я взял список вопросов Google's coaching notes и значительно расширил его. Тут вы найдёте много полезных вещей, которые необходимо знать. Дополнительные вопросы я добавил в конец списка: их могут задавать на интервью, a также они могут быть полезны в решении повседневных задач. Некоторые пункты я взял из поста Стива Йеги (Steve Yegge) "Получить работу в Google", а некоторые слово в слово соответствуют вопросам, разбираемых Google в их постах о подготовке.
Я сократил тот объем знаний, который необходим, по сравнению с рекомендациями Йеги. Я изменил требования Йеги исходя из той информации, которую мне предоставил мой знакомый из Google. Это важно для тех, кто сейчас еще новички в разработке программного обеспечения или являются веб-разработчиками и планируют стать инженерами-программистами (это та профессия где требуются знания в области CS). Если вы опытный разработчик, ожидайте что собеседование будет сложным. Подробнее.
Если вы обладаете многолетним опытом разработки ПО, помните, что Google разделяет понятия инженер-программист и разработчик ПО/веб-разработчик. Первое требует знаний в области CS.
Если вы хотите быть инженерами обеспечивающими надежность ПО или системными инженерами, то уделите внимание вопросам из опционального списка (разделы Сеть, Безопасность).
---------------- Все что ниже - опционально ----------------
Я следую этому плану, готовясь к собеседованию в Google. Я разрабатываю веб-приложения, сервисы и запускаю стартапы с 1997 года. У меня есть степень по экономике, но нет по CS. На данный момент у меня очень успешная карьера, но я хочу работать в Google. Я хочу работать с большими системами и понять принципы их работы, изучить эффективность алгоритмов и различные структуры данных, узнать, как работают низкоуровневые языки программирования. Если ты не знаешь что-то из перечисленного, Google не возьмёт тебя на работу.
Когда я начал этот проект, я ничего не знал о стеке, куче, Big-O, деревья и способах обхода графа. Если бы мне нужно было писать код для сортировки, это было бы не очень хорошо. Структуры данных, которые я использовал, были частью языка, и я не знал, как они на самом деле работали. Мне никогда не приходилось управлять памятью, если процесс, который я запускал, сообщал об ошибке "out of memory", я искал способ как ее обойти. Я использовал в своей работе несколько многомерных массивов и тысячи ассоциативных, но никогда не создавал структуру данных "с нуля".
Но после выполнения этого учебного плана я поверил, что Google меня наймет. Это длинный путь. Я потрачу на это месяцы. Если вы уже знакомы с большинством тем, то потратите намного меньше времени.
Ниже описан способ использования, вы должны выполнить пункты в описанном порядке.
Я использую разметку Github, включающую список задач для оценки прогресса.
Создай новую ветку и тогда ты сможешь оставлять отметки у элементов списка, просто добавляя x внутрь скобок: [x]
Скопируй репозиторий и выполни команды перечисленные ниже
git checkout -b progress
git remote add jwasham https://github.com/jwasham/google-interview-university
git fetch --all
Mark all boxes with X after you completed your changes
git add .
git commit -m "Marked x"
git rebase jwasham/main
git push --force
Подробнее о разметке на Github
Напечатай знак "future Googler" и не отводи глаз от желанной добычи.
Пока я ожидаю своей очереди. Надеюсь интервью будет скоро.
Thanks for the referral, JP.
Моя история: Почему я готовился в течении 8 месяцев для собеседования в Google
Я ещё на пути к цели. Двигаемся вперёд:
Некоторые видео доступно в том случае, если вы являетесь слушателями курсов Coursera, EdX или Lynda.com Их называют MOOCs. Некоторые курсы не имеют круглогодичного доступа и вам нужно подождать несколько месяцев, прежде чем получите к ним доступ. Курсы на Lynda.com платные.
Я был бы вам благодарен за помощь в добавлении бесплатных, всегда доступных публичных ресурсов, таких
как видео с YouTube сопровождающих онлайн курсы. Мне нравится использовать университетские лекции.
Видео:
Статьи:
Подготовительные курсы:
Дополнительно (это не рекомендация Google, а моя собственная):
Я написал небольшую статью об этом: Важно: Выберите один язык для собеседования в Google
На этапе собеседования, когда требуется программировать, вы можете использовать наиболее комфортный для вас язык программирования. Для Google лучшим выбором будут следующие:
Также подойдут:
Вы должны хорошо знать выбранный язык и уметь комфортно писать на нём программы.
Подробнее о выборе:
Ресурсы по языкам программирования вы можете найти тут
Вы найдете кое-что по С, С++ и Python ниже, потому что я еще в процессе обучения.
Это краткий список того, чем я пользовался. Он сокращен для того, чтобы сэкономить ваше время.
Если у вас есть много свободного времени:
Если мало времени:
Если вы располагаете свободным временем (я хочу купить эту книгу):
Вам необходимо выбрать один язык для интервью (смотри выше). Здесь вы найдете мои рекомендации по языкам. У меня нет информации по всем языкам, но если есть у вас - добро пожаловать.
Если вы читали одну из них, то у вас есть достаточно знаний по алгоритмам и структурам данных и вы можете приступить к решению задач по программированию. Вы можете пропустить все видео лекции в этом разделе, если не хотите повторить темы.
Дополнительные ресурсы по языкам программирования здесь
Я не читал обе, но они весьма полезны и написаны Седжвиком (Sedgewick). Он отличный автор.
Если вы можете порекомендовать литературу по C++, которая лучше, сообщите мне об этом. Я ищу лучшие книги.
или:
**Некоторые рекомендуют эти книги, но я думаю это перебор, если только вы не инженер-программист с большим опытом работы и не ожидаете более сложного собеседования.
Руководство по разработке алгоритмов (Skiena)
Как обзор и описание проблем
Некоторые алгоритмы вряд ли попадутся вам на собеседовании.
Эта книга состоит из 2-х частей:
Цитата Йеги: "Больше чем какая-либо другая книга, эта помогла мне понять насколько банальны задачи на графы - они должны быть в инструментарии каждого программиста. Книга так же включает в себя разбор базовых структур данных и алгоритмов сортировки, что является приятным бонусом. Но важнейшей частью стала вторая часть книги, которая написана как энциклопедия, описывающая большое количество различных алгоритмических задач и способов их решения без лишних деталей. Почти каждая страница-описание содержит изображение, облегчающее запоминание. Это полезный способ, позволяющий запомнить и в последствии идентифицировать сотни типов задач."
Можете ее арендовать
Half.com - отличный ресурс, где можно заказать книги по выгодным ценам.
Ответы:
"Алгоритмы и программирование: Проблемы и решения" автор Shen
Я создавал эту учебную программу на протяжении нескольких месяцев своими руками.
Ниже я описал некоторые ошибки, которые я совершил. Это поможет вам их избежать.
Я смотрел часами видео делая заметки, но спустя несколько месяцев многое из этого я не помнил. После чего потратил 3 дня разбираясь в своих заметках и делая карточки-напоминания (flashcards) для того, чтобы потом можно было повторить пройденный материал.
Прочитайте пожалуйста эту статью, что бы не совершать моих ошибок:
Для решения этой проблемы я сделал небольшой сайт, на котором можно добавлять карточки двух типов: общие и с кодом. Каждая карта имеет разный формат.
Я сделал мобильную версию сайта и могу читать карточки на мобильном телефоне или планшете.
Сделай свой собственный бесплатно:
Заметка о карточках: в первый раз вы сразу вспомните ответ, но не помечайте эту карточку как изученную. Нужно просмотреть много раз карточку и ответить правильно прежде чем вы действительно ее запомните. Повторение позволяет мозгу надолго запомнить материал.
В качестве альтернативы вы можете использовать сайт Anki, который мне рекомендовали много раз. Он использует систему повторений для того что бы помочь вам запомнить. Это ресурс user-friendly, доступен на всех платформах и имеет возможность синхронизации с облаком. На платформе iOS стоит 25$, на других бесплатный.
Моя база данных в формате Anki: https://ankiweb.net/shared/info/25173560 (спасибо @xiewenya)
У меня постоянно с собой шпаргалки по ASCII, стеку OSI, Big-O нотации и другим темам. Я повторяю их когда у меня есть свободное время.
Делай перерывы от программирования на пол часа и повторяй свои карточки.
Есть много отвлекающих факторов, на которые тратится время. Сосредотачиваться и концентрироваться сложно.
Это список персональных тем, взятых из заметок Google по подготовке к собеседованию. Это распространенные технологии, но они не встречаются в других ресурсах:
Для изучения некоторых тем требуется один день, для других несколько. Некоторые нужно только изучить и не нужно программировать.
Каждый день я беру одну тему из списка ниже, смотрю видео на эту тему и программирую, используя пройденный материал:
Вам не нужны все эти языки для собеседования, нужен только один один язык для собеседования.
Зачем нужно программировать на нескольких языках:
У меня может и не будет времени на все это, но я попробую.
Вы можете посмотреть на мой код тут:
Вам не нужно запоминать внутренности каждого алгоритма.
Пишите код на доске или листе бумаги, но не компьютере. Проверяйте на простых входных данных. Затем тестируйте на компьютере.
Изучайте C
Как компьютеры выполняют программу:
Big O нотация (и Omega и Theta) - лучшее математическое объяснение (video)
Skiena:
TopCoder (включая рекуррентные соотношений и основную теорему):
Если в некоторых лекциях слишком много математики, вы можете ниже найти и посмотреть лекции по дискретной математике для получения базовых знаний.
Видео:
Онлайн курсы:
реализация с помощью массива и применением linear probing
Заметки:
Для пирамидальной сортировки, см. структуру данных "Куча" выше. Пирамидальная сортировка эффективна, но не устойчива.
UC Berkeley:
Код сортировки слиянием:
Код быстрой сортировки:
Реализация:
Необязательно, но я рекомендую:
Если вам необходимо больше информации, смотрите секцию "Сортировка" в Дополнительные детали о некоторых разделах
Графы могут быть использованы для представления многих задач в области CS, поэтому раздел включает в себя такие темы как деревья и сортировку.
Заметки от Стива Йеги:
Лекции профессора Стивена Скина - хорошее введение:
Графы (обзор и многое другое):
Полный курс на Coursera:
Стив Йеги: Если у вас есть возможность, попробуйте изучить более продвинутые алгоритмы:
Я смогу применить:
Вы найдете больше практических задач на графах в книге Стивена Скина (см. раздел книги ниже) и в книгах о прохождении интервью.
Если вам нужно больше подробностей по этому вопросу, см. Раздел «Соответствие строк» в Дополнительная информация по некоторым предметам
В этом разделе вы найдете короткие видео, которые можно посмотреть достаточно быстро чтобы повторить наиболее важные моменты.
Полезно освежать свои знания чаще.
Теперь, когда вы узнали все вышерассмотренные темы по компютерным наукам, настало время попрактиковаться в решении задач по программированию.
Решение задач по программированию - это не запоминание решений.
Для чего вам нужно практиковаться в решении задач по программированию:
Вот пример отличного введения в методичное, коммуникативное решение задач на собеседовании. Вы так же найдете это в книгах по интервью для программистов, но это подход мне кажется однм из лучших: Схема разработки алгоритма
Мой процесс подготовки к собеседованию по программированию (Книга) Упражнения
У вас нет доски дома? Не удивительно. Я немного неормальный и у меня есть большая доска дома. Но вместо доски можно использователь и планшет для рисования из магазина художественных товаров, и практиковаться сидя на диване. Это моя "диванная доска". На фото я положил ручку чтобы иметь вы имели представление о масштабе. Если вы будете пользоваться ручкой, постоянно будет возникать желание что-то исправить и решение захламляется достаточно быстро.
Дополнительно:
Прочитайте и выполните упражнения (именно в этом порядке):
См. Список книг ниже
Как только вы заполнили свою голову знаниями, самое время применить их на практике. Выполняйте упражнения по программированию каждый день, чем больше тем лучше.
Сайты с упражнениями:
Возможно:
Подумайте как отвечать приблизительно на 20 распостраненных вопросов которые задают на собеседовании, подготовьте 2-3 ответа на каждый из них. Расскажите историю, а не просто сухой пересказ о том над чем вы работали.
Вот, некоторые из моих (возможно, я уже знаю ответ, но хочу я услышать мнение интервьювера или точку зрения команды):
Поздравляю!
Не прекращайте учиться.
На самом деле это не конец.
*****************************************************************************************************
*****************************************************************************************************
Все что находится ниже этого места - опционально. Это мои рекоммендации, а не от Google.
Изучая все это вы узнаете больше о компьютерных науках, и будуте лучше готовы для любой вакансии программиста.
Вы станете более всесторонне-развитым разработчиком.
*****************************************************************************************************
*****************************************************************************************************
Знать как минимум один тип сбалансированного дерева поиска (и как его осуществить):
"Среди сбалансированных деревьев поиска AVL и 2/3 деревья теперь в прошлом, а красно-черные деревья все больше набирают популярность. Довольно интересный саморегулирующийся тип это расширяющееся дерево, который использует вращения для перемещения любого ключа к вершине" - Стивен Сол Лекена
Из всех них я предпочел написать расширяющееся дерево. Из того, что я читал, писать реализации сбалансированного дерева поиска во время интервью не понадобится. Но я хотел преодолеть еще одну задачу в програмировании, и будем честны, расширяющиеся деревья превосходны. Еще я прочитал довольно много про красно-черные деревья.
Я хочу изучить побольше про B-деревья, т.к. они применимы при работе с очень большими данными
AVL trees
Splay trees
Red/black trees
2-3 search trees
2-3-4 Trees (aka 2-4 trees)
N-ичные (K-ичные, M-ичные) деревья
B-Деревья
--
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?
Union-Find
More Dynamic Programming (videos)
Advanced Graph Processing (videos)
MIT Probability (mathy, and go slowly, which is good for mathy things) (videos):
String Matching
Sorting
Sit back and enjoy. "Netflix and skill" :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 - Analysis of Algorithms (25 videos)
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)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。