Итак, вам стало немного комфортно на работе. Жизненный цикл развертывания больше не является черной магией. Проверки кода короче вашего кода. И вы отправили кое-что.

Надеюсь, у вас есть мотивация расшириться и узнать больше. Но сам объем ресурсов ошеломляет!

Один из прагматических подходов - придерживаться того, что также поможет вам лучше провести собеседование.

Таким образом, у вас будет чувство прогресса и цель, на которой нужно сосредоточиться.

Сосредоточьтесь на этих 5 областях:
1. Низкоуровневый / библиотечный дизайн
2. Дизайн системы
3. Параллелизм
4. Шаблоны проектирования
5. Общие методы программирования

Ресурсы, которые я перечислил, будут насыщены Java, но вы сможете найти эквиваленты для других языков. В любом случае большинство концепций дизайна не зависят от языка.

Низкоуровневый / Библиотечный дизайн

Если вы посмотрите на прошлые вопросы собеседований по SDE2 / 3 в Uber, Amazon и др., Вы увидите, что по крайней мере один раунд имеет тенденцию задавать такой низкоуровневый дизайн. Я слышал о двух наиболее распространенных из них:
1. Разработка библиотеки регистратора
2. Реализация Streams Framework на Java.

Мне особенно нравится вопрос о Регистраторе; вы можете рассчитывать на ряд ответов в зависимости от того, насколько квалифицирован собеседник.

Остановитесь на минутку и попробуйте. Когда вы закончите, задайте себе следующие вопросы:

  • Вы разложили свою реализацию на разные интерфейсы? Или это один суперкласс со всем?
  • Вы осведомлены о поточной безопасности своих классов?
  • Ваш регистратор синглтон? Ленивая загрузка или нетерпеливая загрузка? Почему?
  • Это подключаемый? Может ли сторонний производитель расширить вашу библиотеку альтернативными реализациями?
  • А как насчет сборки мусора? Вы создаете слишком много объектов?

Log4j2 прекрасно документирует собственный дизайн. Попробуйте взглянуть, когда решите проблему.

Мне не удалось найти других хороших ресурсов для лоу-дизайна. Сообщите ниже в комментариях, если найдете что-нибудь полезное.

Системный дизайн

Это больше соответствует тому, о чем обычно думают разработчики, когда кто-то задает «вопросы по дизайну». Два общих принципа:
1. Разработайте систему сокращения URL-адресов
2. Разработайте систему ленты новостей Twitter.

Хороший способ начать - Учебник по дизайну Донна Мартина. Это длинный, но отличный подход к пониманию того, как удобно проектировать систему.

По крайней мере, вам должно быть комфортно с -
1. Async v / s Sync пишет; Очереди обмена сообщениями
2. Шаблоны согласованности - особенно согласованность в конечном итоге
3. Типы баз данных (SQL v / s NoSQL) и шаблоны масштабирования
4. Кэширование на разных уровнях
5. Нарушение постановка проблемы в разные независимые службы

Прекрасным продолжением является Интервью по проектированию системы. В нем подробно обсуждаются конкретные вопросы проектирования системы, такие как два, упомянутых выше. Это платный, но отличный ресурс.

Параллелизм

Параллелизм - еще одна тема, которая отличает младших инженеров от более старших. Это на удивление сложно сделать правильно.

«Параллелизм Java на практике» является обязательным к прочтению. Вы уйдете с гораздо лучшим пониманием -
1. Модель памяти Java
2. Связи "происходит до"
3. Ложные вызовы пробуждения
4. Неустойчивые v / s Синхронизирован
5. Безопасность потоков, ожидание и уведомление и многое другое.

Если вы пишете код на другом языке, найдите эквивалентную книгу. Отладка условий гонки без полного понимания концепций будет очень болезненной.

Многопоточность и параллелизм Java от Educative - отличный дополнительный ресурс. Прочтите концепции; затем посмотрите на пару решенных вопросов на собеседовании. Это будет намного проще, чем попробовать их в холодном виде.

Шаблоны проектирования

Вас вряд ли спросят об этом. Но вы увидите, как они появляются, когда вы будете решать различные проблемы дизайна.

Прочитав о них, вы начнете видеть их повсюду. Несколько примеров -
1. Адаптер - Arrays.asList ()
2. Декоратор - Collections.synchronizedCollection (новый ArrayList ‹› ())
3. Прототип - Immutables.copyOf () < br /> 4. Команда - Рабочий интерфейс
5. Стратегия - java.util.Comparator # compare ()

В StackOver есть огромный список шаблонов, которые можно найти в основных библиотеках Java здесь.

Я пробовал читать легендарную книгу GoF - Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения, но, признаюсь, мне не удалось пройти через нее.

Вместо этого я попробовал Шаблоны проектирования "Сначала - первым делом". Это совсем не похоже на техническую книгу, но на самом деле ее приятно читать.

Различные странные истории прилипают и отлично справляются с выявлением тонкостей схожих шаблонов. Я закончил это за выходные и долго смеялся над книгой.

Я попробую GoF еще раз через пару месяцев. Обсуждения в нем, вероятно, больше связаны с опытом.

Общее кодирование

Книги, книги, книги

«Эффективная Java». Это отличный способ привыкнуть к идиомам и лучшим практикам Java. Он разбит на 90 независимых тем, каждая по несколько страниц. Так что вы можете прочитать разделы, относящиеся к тому, над чем вы работаете.

«Чистый код» - последнее, что я обещаю! - еще одно отличное чтение и очень удобно, когда вы начинаете просматривать чужой код. Это поможет вам мгновенно распознать запахи кода. Как и «Эффективная Java», пролистайте только те разделы, которые, по вашему мнению, актуальны в данный момент.

Удобство работы с IDE

Хорошо, это не проходит тест «помогает лучше проходить собеседование». Но на самом деле, свободное владение вашей IDE делает программирование чертовски увлекательным!

Я использую IntelliJ, и у него есть отличный плагин «Key Promoter X». Каждый раз, когда вы используете мышь вместо сочетания клавиш, она кричит вам. Через пару недель вы должны почувствовать себя профессионалом (и очень обеспокоенным). Если вы используете другую среду IDE, попробуйте найти там эквивалент. Или используйте IntelliJ, это круто.

42 совета и хитрости IntelliJ Idea - это доклад на конференции на Youtube. Это интересный способ познакомиться с наиболее часто используемыми функциями питания.

Это большой список - и в нем есть книги! Вместо того, чтобы торопиться закончить работу, подумайте о том, чтобы каждый день немного улучшаться, проходя через некоторые из них. Удачи!

Да, кстати, я предполагаю, что у большинства читателей есть опыт работы от 0 до 4 лет. Если вы еще не начали работать, придерживайтесь LeetCoding. Вернемся к этому позже.

Концепции дизайна не осваиваются до тех пор, пока вы не поработаете пару систем в реальном мире.

Приложение











Https://www.youtube.com/watch?v=eq3KiAH4IB - занимательная беседа о советах и ​​приемах использования IntelliJ IDE.

Книги
Мне нравится выбирать по одной хорошей книге для каждой основной области и следить за тем, чтобы каждая книга была ортогональна остальным.

  1. Эффективная Java - Учебник по лучшим практикам Java. Очень легко читать.
  2. Чистый код - хорошие практические правила кодирования.
  3. Java Concurrency In Practice - Основополагающая книга для понимания параллелизма
  4. Шаблоны проектирования - прежде всего - увлекательный и эффективный подход к объектно-ориентированному дизайну.
  5. Разработка приложений с интенсивным использованием данных - техническая книга с самым высоким рейтингом, которую я когда-либо видел. Отлично подходит для системного дизайна, но огромен. Лучше читать понемногу.