Содержимое
Нужно знать System Deign. Трудность System Design собеседования в том что вопросы тут “open ended” (тут нет четкого правильного или неправильного ответа, как в алгоритмах), плюс тем и понятий там так много что черт ногу сломит. С чего начать? Совет тем кто вообще не соприкасался с System Design: • Почитай курс Grokking the system design interview by educative.io(курс платный, но можно нагуглить копию этого курса). Умные люди скажут что он поверхностный. Но это отличный ресурс для первого знакомства, чтобы начать вникать в тему. Он отлично передает структуру собеседования, дает понимание куда двигаться, что спрашивать, на что обращать внимание. • Загугли и почитай курс System Design Primer. • Посмотри канал Gaurav Sen на YouTube, очень крутой канал. • Посмотри канал Success in Tech на YouTube • Посмотри лекцию Jackson Gabbard по System Design. • На курсах которые я порекомендовал попробуй поделать примеры задач, типа “Design TinyUrl”, попробуй симулировать настоящее собеседование и объяснить все на доске не глядя в конспект. • Не надо запоминать точные ответы которые там написаны. Тут нет верного или нервного ответа. Учи концепции и учи где и как их применять. • Тут нет золотого молотка который решит все твои проблемы. Тут нет одной деревянной концепции которую ты можешь запомнить и применять везде. Не делай так, тебя сразу отклонят. • Старайся понимать в чем плюсы и минусы разных технологий. • Почитай как работает Facebook, Google, Uber в реальной жизни. В интернетах очень много ресурсов на эту тему. • Элементарно почитай про технологии которые ты используешь каждый день, чем JSON лучше Protobuf, чем MySQL лучше PostgreSQL? • Если у тебя дофига времени почитай книгу Designing Data-Intensive Applications by Martin Kleppmann. Это акуительная книга. Ты почувствуешь е себя очень тупым в начале, но очень умным в конце. • Ну и самое главное применяй все это на практике, на работе, на личных проектах. Добавь индексы в базу данных, поставь gzip на выдачу статики и т.д. Опыт тут играет огромную роль. Как вести себя во время собеседования? • Веди разговор. 80% времени должен говорить ты. Но ты не должен болтать без умолку, нужно общаться с интервьюером и понимать куда двигаться и какие есть требования к системе. Тут нужен баланс. Нужно вести разговор, но в то же время не уйти в себя. Тут мне отлично помогли mock interview с друзьями. • Не используй buzzwords (ключевые слова), типа Cassandra, Redis, Sharding и т.д. без контекста или без обоснования. Если ты выбрасываешь какую то технологию на стол, ты должен на 100% быть уверенным что она тут необходима. • Задавай вопросы и общайся как с коллегой, представь что вы обсуждаете новую фичу на работе. Четко обозначь Scope of Work (объем работ) с самого начала, чтобы не тратить время не темы которые нас не интересуют. • Reasoning, обосновывай свои решения и приводи аргументы за или против тех или иных решений. • Tradeoff, выбирай одни решения перед другими в зависимости от требований системы. Какие темы учить? Тема очень обширная, как уровень коррупции в Казахстане. Но можешь начать с этих тем: • TCP/IP, UDP • DNS, HTTP 1, HTTP2, Websockets, Long Polling, HTTPS • API Design (REST, gRPC, SOAP) • Availability, Durability, Consistency, Scalability • CAP Theorem • ACID vs BASE • Latency, Bandwidth, Throughput • Vertical and Horizontal scaling • Partitioning, Replication • Consistent Hashing • Load Balancer • Strong vs Eventual consistency • SQL vs NoSQL • Key value Store, Document Store • Caching • Queues and Topics • CPU, Memory, Hard Drive, Network • OOP, Functional Programming • Design patterns, Singleton, Factory, Publisher/Subscriber. • Threads, Concurrency, Locking Это разумеется не полный список того что надо знать. То что в списке это супер базовые темы. Ты не обязан знать все это на 100%, но какие то основы знать надо. Что из этого мне попадалось часто? Все из списка выше и даже больше. #interviewtip#systemdesign