12 января 2012 г.

Подготовка к собеседованию на java-программиста (уровень Middle)

Продолжим тему собеседований. В этот раз рассмотрим что вы обязаны знать, если претендуете на должность middle (staff) java developer (описание для уровня junior смотри тут).
Отдельные части текста нагло взяты из википедии, необъятных просторов интернета и, что самое страшное, головы.


Что такое ORM
ORM (англ. Object-relational mapping, рус. Объектно-реляционное отображение) — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных».

Что такое JPA?
JPA – это технология, обеспечивающая объектно-реляционное отображение простых JAVA объектов и предоставляющая API для сохранения, получения и управления такими объектами.

JPA – это спецификация (документ, утвержденный как стандарт, описывающий все аспекты технологии), часть EJB3 спецификации.

Сам JPA не умеет ни сохранять, ни управлять объектами, JPA только определяет правила игры: как что-то будет действовать. JPA также определяет интерфейсы, которые должны будут быть реализованы провайдерами. Плюс к этому JPA определяет правила о том, как должны описываться метаданные отображения и о том, как должны работать провайдеры. Дальше, каждый провайдер, реализуя JPA определяет получение, сохранение и управление объектами. У каждого провайдера реализация разная.

Реализации JPA:

  • Hibernate
  • Oracle TopLink
  • Apache OpenJPA

JPA состоит из трех основных пунктов:

  1. API – интерфейсы в пакете javax.persistance. Набор интерфейсов, которые позволяют организовать взаимодействие с ORM провайдером.
  2. JPQL – объектный язык запросов. Очень похож на SQL, но запросы выполняются к объектам.
  3. Metadata – аннотации над объектами. Набор аннотаций, которыми мы описываем метаданные отображения. Тогда уже JPA знает какой объект в какую таблицу нужно сохранить. Метаданные можно описывать двумя способами: XML-файлом или через аннотации.


Паттерны GoF
За абревиатурой GoF кроются паттерны "банды четырех". Рассказать о них вкраце едва ли возможно, хотя и повторить на скорую руку тоже очень сложно. Могу разве что порекомендовать найти какой-либо cheat sheet, распечатать и периодически пробегаться глазами по основным паттернам.


Различие unit и integration тестинга
Модульное тестирование, или юнит-тестирование (англ. unit testing) — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы.
Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода. Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже оттестированных местах программы, а также облегчает обнаружение и устранение таких ошибок.

Интеграционное тестирование (англ. Integration testing, иногда называется англ. Integration and Testing, аббревиатура англ. I&T) — одна из фаз тестирования программного обеспечения, при котором отдельные программные модули объединяются и тестируются в группе. Обычно интеграционное тестирование проводится после модульного тестирования и предшествует системному тестированию.
Интеграционное тестирование в качестве входных данных использует модули, над которыми было проведено модульное тестирование, группирует их в более крупные множества, выполняет тесты, определённые в плане тестирования для этих множеств, и представляет их в качестве выходных данных и входных для последующего системного тестирования.
Целью интеграционного тестирования является проверка соответствия проектируемых единиц функциональным, приёмным и требованиям надежности. Тестирование этих проектируемых единиц — объединения, множества или группа модулей — выполняются через их интерфейс, используя тестирование «чёрного ящика».


TDD
Разработка через тестирование (test-driven development, TDD) — техника разработки программного обеспечения, которая основывается на повторении очень коротких циклов разработки: сначала пишется тест, покрывающий желаемое изменение, затем пишется код, который позволит пройти тест и под конец проводится рефакторинг нового кода к соответствующим стандартам.


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


SQL
Повторите SQL! Например хороший мануал по основам лежит тут 


Связанность и связность
Связанность модулей (coupling), часто называемую зацеплением, характеризует степень независимости модулей. При проектировании систем необходимо стремиться, чтобы модули имели минимальную зависимость друг от друга, т.е. были минимально «сцеплены» между собой (отсюда и термин «сцепление» или связанность). Это требование вытекает из одного из основных принципов системного подхода, требующего минимизации информационных потоков между подсистемами.

Связность (cohesion) характеризует целостность, «плотность» модуля, т.е. насколько модуль является простым с точки зрения его использования. В идеале модуль должен выполнять одну единственную функцию и иметь минимальное число «ручек управления». Примером модуля имеющего максимальную связность является модуль проверки орфографии. Если связанность является характеристикой системы, то связность характеризует отдельно взятый модуль.


SOLID
Вы должны знать что такое SOLID. Вкраце об этом тут.


SVN
Надеюсь что такое svn вы знаете. Не лишним было бы помнить такие основные комманды как:
svn checkout - создать рабочую копию, получив текущую ревизию с сервера.
svn update - обновить рабочую копию с сервера (получить изменения). Помним про автоматический мердж и конфликты.
svn diff - посмотреть внесённые изменения в вашу рабочую копию.
svn commit - отправить изменения на сервер, при этом будет создана новая ревизия.

svn add - добавить файл в рабочую копию. При commit файл будет отправлен на сервер.
svn rm - удалить файл из рабочей копии. При commit файл будет удалён из текущей ревизии на сервере.
svn mv - переместить файл внутри репозитория.
svn revert - откатить изменения в файле из рабочей копии.


Maven
Вы должны знать стандартные настройки мавена, основные плагины и принцип работы как таковой. Так же следует помнить про жизненный цикл сборки:
1. Валидация - проверяет корректность проекта
2. Компиляция - компилирует исходный код
3. Тест - тестирует полученый код используя доступный unit testing фреймворк. Эти тесты не должны требовать упаковки или деплоя.
4. Упаковка - создается архив (например, JAR или EAR)
5. Интеграционные тесты - если это необходимо приложение деплоится в окружение, где могут быть выполнено интеграционное тестирование
6. Верификация - выполняет проверки пакета на валидность и соответствие указаным требованиям
7. Инсталяция - копирует пакет с приложением в локальный репозиторий
8. Деплой - собственно деплой.



Serialization
Сериализация это процесс сохранения состояния объекта в последовательность байт; десериализация это процесс восстановления объекта, из этих байт. Java Serialization API предоставляет стандартный механизм для создания сериализуемых объектов.
Сохранение объекта:
FileOutputStream fos = new FileOutputStream("temp.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);

TestSerial ts = new TestSerial();

oos.writeObject(ts);

oos.flush();
oos.close();
Восстановление объекта:
FileInputStream fis = new FileInputStream("temp.out");
ObjectInputStream oin = new ObjectInputStream(fis);
TestSerial ts = (TestSerial) oin.readObject();


Dated, Numbers and Currency
Едва ли можно рассказать лучше, чем тут.


String Formatting
За форматирование строк отвечает метод String.format(). Его использование похоже на printf в старом добром С, например:
String s = String.format("Hello, %s", name);
String d = String.format("%10s %10.2f", name, value);
А еще, для работы с массивами, есть такая вот интересная конструкция:
String a[] = { "Wake up", "Neo", matrix.getName(), matrix.getAction() };
String f = String.format("%1$s, %2$s.\n%3$s %4$s", a);
Удачи!

3 комментария:

  1. Его использование похоже на printf в старом добром С.

    c 6й версии я так понимаю и в java появился метод printf

    ОтветитьУдалить
  2. Для Senior позиции примерный список можно посмотреть здесь http://combiq.ru/education

    ОтветитьУдалить
  3. все верно, еще расширю список вопросов «327 вопроса на собеседование Java Developer»
    http://becomejavasenior.com/blog/2015/07/01/327-interview-questions-java-developer/

    ОтветитьУдалить

Примечание. Отправлять комментарии могут только участники этого блога.