Рубрики
Без рубрики

Решение для Лакмусовой бумажки разработчика Java

В этой статье мы рассмотрим решение ранее опубликованного теста и обсудим, как оценивать решения. С пометкой java, карьера, тест.

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

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

Это не тест типа “прошел/не прошел”, поскольку мы ищем не четко определенное решение, а скорее такое, которое распознает и устраняет ограничения дизайна. Это информирует нас о том, имеют ли разработчики реальное и глубокое понимание принципов проектирования и приверженность качеству, а не скорости.

Исходный репозиторий можно найти здесь . Решение можно найти в ветке решений.

Оценка решений кандидатов

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

Основные требования

Прежде чем углубляться в детали предлагаемого решения, проверьте следующее:

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

Принцип №1: Закрыт для изменений, открыт для расширения.

Принцип №1: Закрыт для изменений, открыт для расширения.

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

Чтобы добавить новую службу JMS, в класс Alert необходимо было бы добавить новое логическое значение, если бы применялся существующий подход. Но в идеале класс Alert не должен нуждаться в изменении только потому, что вводится новый вид сервиса. Чтобы закрыть оповещение об изменении, нам нужно отделить этот класс от доступных служб. Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Таким образом, все логические значения больше не требуются и заменяются списком отправителей.

  • Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Следовательно, все логические значения больше не являются, изменил ли субъект предупреждение, чтобы включить новое логическое значение для обработки новой службы, или они изменили его так, чтобы оно больше не зависело от подробностей доступных служб? исправлено, заменено списком отправителей.

Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Следовательно, все логические значения больше не являются, изменил ли субъект предупреждение, чтобы включить новое логическое значение для обработки новой службы, или они изменили его так, чтобы оно больше не зависело от подробностей доступных служб? исправлено, заменено списком отправителей. Принцип №2: Внедрение зависимостей

Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Следовательно, все логические значения больше не являются, изменил ли субъект предупреждение, чтобы включить новое логическое значение для обработки новой службы, или они изменили его так, чтобы оно больше не зависело от подробностей доступных служб? исправлено, заменено списком отправителей. Принцип №2: Основное применение.внедрение зависимостей java

Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Следовательно, все логические значения больше не являются, изменил ли субъект предупреждение, чтобы включить новое логическое значение для обработки новой службы, или они изменили его так, чтобы оно больше не зависело от подробностей доступных служб? исправлено, заменено списком отправителей. Принцип № 2: Исходное основное приложение создает экземпляры классов служб, которые оно будет использовать самостоятельно. Основное приложение.внедрение зависимостей java Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Следовательно, все логические значения больше не являются, изменил ли субъект предупреждение, чтобы включить новое логическое значение для обработки новой службы, или они изменили его так, чтобы оно больше не зависело от подробностей доступных служб? исправлено, заменено списком отправителей. Принцип № 2: Исходное основное приложение создает экземпляры сервиса Весь смысл использования Spring и других фреймворков внедрения зависимостей заключается в том, что вы можете легко внедрять новые реализации. классы, которые он будет использовать сам по себе. Основное приложение.внедрение зависимостей java Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Следовательно, все логические значения больше не являются, изменил ли субъект предупреждение, чтобы включить новое логическое значение для обработки новой службы, или они изменили его так, чтобы оно больше не зависело от подробностей доступных служб? исправлено, заменено списком отправителей. Принцип № 2: Исходное основное приложение создает экземпляры сервиса Весь смысл использования Spring и других фреймворков внедрения зависимостей заключается в том, что вы можете внедрять новые реализации, что очень полезно для тестирования, где вы можете изолировать классы для тестирования. хитрый. классы, которые он будет использовать сам по себе. Основное приложение.внедрение зависимостей java Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Следовательно, все логические значения больше не являются, изменил ли субъект предупреждение, чтобы включить новое логическое значение для обработки новой службы, или они изменили его так, чтобы оно больше не зависело от подробностей доступных служб? исправлено, заменено списком отправителей. Принцип № 2: Исходное основное приложение создает экземпляры сервиса Весь смысл использования Spring и других фреймворков внедрения зависимостей заключается в том, что вы можете внедрять новые реализации, игнорируя этот принцип и создавая классы внутри, нет способа протестировать класс изолированно. Это очень полезно для тестирования, где вы можете изолировать классы для тестирования. хитрый. классы, которые он будет использовать сам по себе. Основное приложение.внедрение зависимостей java

  • Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Следовательно, все логические значения больше не являются, изменил ли субъект предупреждение, чтобы включить новое логическое значение для обработки новой службы, или они изменили его так, чтобы оно больше не зависело от подробностей доступных служб? исправлено, заменено списком отправителей. Принцип № 2: Исходное основное приложение создает экземпляры службы Весь смысл использования Spring и других фреймворков для внедрения зависимостей заключается в том, что вы можете внедрять новые реализации, игнорируя этот принцип и создавая классы внутри этого. Может ли субъект определить проблему внедрения зависимостей и удалить создание служб из MainApplication? нет никакого способа протестировать класс изолированно. Это очень полезно для тестирования, где вы можете изолировать классы для тестирования. хитрый. классы, которые он будет использовать сам по себе. Основное приложение.внедрение зависимостей java

Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Следовательно, все логические значения больше не являются, изменил ли субъект предупреждение, чтобы включить новое логическое значение для обработки новой службы, или они изменили его так, чтобы оно больше не зависело от подробностей доступных служб? исправлено, заменено списком отправителей. Принцип № 2: Исходное основное приложение создает экземпляры службы Весь смысл использования Spring и других фреймворков для внедрения зависимостей заключается в том, что вы можете внедрять новые реализации, игнорируя этот принцип и создавая классы внутри therePrinciple # 3: Разделение проблем Выявил ли субъект проблему внедрения зависимостей и удалил создание служб из MainApplication? нет никакого способа протестировать класс изолированно. Это очень полезно для тестирования, где вы можете изолировать классы для тестирования. хитрый. классы, которые он будет использовать сам по себе. Основное приложение.внедрение зависимостей java

Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Следовательно, все логические значения больше не являются, изменил ли субъект предупреждение, чтобы включить новое логическое значение для обработки новой службы, или они изменили его так, чтобы оно больше не зависело от подробностей доступных служб? исправлено, заменено списком отправителей. Принцип № 2: Исходное основное приложение создает экземпляры службы Весь смысл использования Spring и других фреймворков внедрения зависимостей заключается в том, что вы можете внедрять новые реализации, игнорируя этот принцип и создавая классы внутри. Исходное основное приложение хранит сведения о конфигурации служб внутри себя. Принцип № 3: Разделение проблем Выявил ли субъект проблему внедрения зависимостей и удалил создание служб из MainApplication? нет никакого способа протестировать класс изолированно. Это очень полезно для тестирования, где вы можете изолировать классы для тестирования. хитрый. классы, которые он будет использовать сам по себе. Основное приложение.внедрение зависимостей java Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Следовательно, все логические значения больше не являются, изменил ли субъект предупреждение, чтобы включить новое логическое значение для обработки новой службы, или они изменили его так, чтобы оно больше не зависело от подробностей доступных служб? исправлено, заменено списком отправителей. Принцип № 2: Исходное основное приложение создает экземпляры службы Весь смысл использования Spring и других фреймворков внедрения зависимостей заключается в том, что вы можете внедрять новые реализации, игнорируя этот принцип и создавая классы внутри него, а затем используя различные механизмы для передачи конфигурации вниз по потоку различным службам. Исходное MainApplication хранит сведения о конфигурации служб внутри себя. Принцип № 3: Разделение проблем Выявил ли субъект проблему внедрения зависимостей и удалил создание служб из MainApplication? нет никакого способа протестировать класс изолированно. Это очень полезно для тестирования, где вы можете изолировать классы для тестирования. хитрый. классы, которые он будет использовать сам по себе. Основное приложение.внедрение зависимостей java Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Следовательно, все логические значения больше не являются, изменил ли субъект предупреждение, чтобы включить новое логическое значение для обработки новой службы, или они изменили его так, чтобы оно больше не зависело от подробностей доступных служб? исправлено, заменено списком отправителей. Принцип № 2: Исходное основное приложение создает экземпляры службы Весь смысл использования Spring и других фреймворков для внедрения зависимостей заключается в том, что вы можете внедрять новые реализации, игнорируя этот принцип и создавая классы внутри, если следовать оригинальному подходу, новая информация о конфигурации для JMS должна быть добавлена в MainApplication. Затем он использует различные механизмы для передачи конфигурации вниз по потоку различным службам. Исходное MainApplication хранит сведения о конфигурации служб внутри себя. Принцип № 3: Разделение проблем Выявил ли субъект проблему внедрения зависимостей и удалил создание служб из MainApplication? нет никакого способа протестировать класс изолированно. Это очень полезно для тестирования, где вы можете изолировать классы для тестирования. хитрый. классы, которые он будет использовать сам по себе. Основное приложение.внедрение зависимостей java

Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Следовательно, все логические значения больше не являются, изменил ли субъект предупреждение, чтобы включить новое логическое значение для обработки новой службы, или они изменили его так, чтобы оно больше не зависело от подробностей доступных служб? исправлено, заменено списком отправителей. Принцип № 2: Исходное основное приложение создает экземпляры службы Весь смысл использования Spring и других фреймворков внедрения зависимостей заключается в том, что вы можете внедрять новые реализации, игнорируя этот принцип и создавая классы внутри него. Однако детали конфигурации каждой службы не относятся к MainApplication и должны быть перенесены в сами классы служб. Если следовать первоначальному подходу, то в MainApplication необходимо будет добавить новую информацию о конфигурации для JMS. Затем он использует различные механизмы для передачи конфигурации вниз по потоку различным службам. Исходное MainApplication хранит сведения о конфигурации служб внутри себя. Принцип № 3: Разделение проблем Выявил ли субъект проблему внедрения зависимостей и удалил создание служб из MainApplication? нет никакого способа протестировать класс изолированно. Это очень полезно для тестирования, где вы можете изолировать классы для тестирования. хитрый. классы, которые он будет использовать сам по себе. Основное приложение.внедрение зависимостей java Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Следовательно, все логические значения больше не являются, изменил ли субъект предупреждение, чтобы включить новое логическое значение для обработки новой службы, или они изменили его так, чтобы оно больше не зависело от подробностей доступных служб? исправлено, заменено списком отправителей. Принцип № 2: Исходное основное приложение создает экземпляры службы Весь смысл использования Spring и других фреймворков внедрения зависимостей заключается в том, что вы можете внедрять новые реализации, игнорируя этот принцип и создавая классы внутри. Кроме того, существует блок операторов if, которые вызывают разные службы по-разному. Однако детали конфигурации каждой службы не являются предметом заботы MainApplication и должны быть перенесены в сами классы служб. Если следовать первоначальному подходу, то в MainApplication необходимо будет добавить новую информацию о конфигурации для JMS. Затем он использует различные механизмы для передачи конфигурации вниз по потоку различным службам. Исходное MainApplication хранит сведения о конфигурации служб внутри себя. Принцип № 3: Разделение проблем Выявил ли субъект проблему внедрения зависимостей и удалил создание служб из MainApplication? нет никакого способа протестировать класс изолированно. Это очень полезно для тестирования, где вы можете изолировать классы для тестирования. хитрый. классы, которые он будет использовать сам по себе. Основное приложение.внедрение зависимостей java

Таким образом, класс solution Alert представляет список отправителей, где Sender – это интерфейс, который будет реализован службами отправки. Следовательно, все логические значения больше не являются, изменил ли субъект предупреждение, чтобы включить новое логическое значение для обработки новой службы, или они изменили его так, чтобы оно больше не зависело от подробностей доступных служб? исправлено, заменено списком отправителей. Принцип № 2: Исходное основное приложение создает экземпляры сервиса Весь смысл использования Spring и других фреймворков внедрения зависимостей заключается в том, что вы можете внедрять новые реализации, игнорируя этот принцип и создавая классы внутри. Если заявитель следует этому шаблону, ему нужно будет добавить блок if. Кроме того, существует блок инструкций if, которые вызывают разные службы по-разному. Однако детали конфигурации каждой службы не являются предметом заботы MainApplication и должны быть перенесены в сами классы служб. Если следовать первоначальному подходу, то в MainApplication необходимо будет добавить новую информацию о конфигурации для JMS. Затем он использует различные механизмы для передачи конфигурации вниз по потоку различным службам. Исходное MainApplication хранит сведения о конфигурации служб внутри себя. Принцип № 3: Разделение проблем Выявил ли субъект проблему внедрения зависимостей и удалил создание служб из MainApplication? нет никакого способа протестировать класс изолированно. Это очень полезно для тестирования, где вы можете изолировать классы для тестирования. хитрый. классы, которые он будет использовать сам по себе. Основное приложение.внедрение зависимостей java Но, введя интерфейс отправителя и единый стандартный вызов метода, все они могут быть объединены в один вызов.

  • Определил ли субъект, что конфигурация не относится к основному приложению, и перенес ли конфигурацию в классы служб?

  • Указал ли субъект, что “операторы if” для каждого типа службы могут быть удалены с помощью интерфейса?

  • Удалял ли субъект зависимости в основном приложении от реализаций сервиса?

Принцип №4: Удаление Циклических Зависимостей

DatabaseSender.java , EmailSender.java , WebServiceSender.java

Исходные примеры имели классическую циклическую зависимость между основным классом приложения и сервисными классами Databasesender, EmailSender и WebServiceSender. Каждый из этих классов отправителей использует свой механизм для внедрения конфигурации. Вместо этого информация о конфигурации должна быть перемещена в эти классы отправителей.

  • Удалил ли субъект зависимость от основного приложения?

  • Переместил ли субъект поля конфигурации в классы отправителей?

Использование результатов

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

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

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

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

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

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

Оригинал: “https://dev.to/cheetah100/java-developer-litmus-test-solution-e66”