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

В октябре я увидел новость о том, что Oracle запускает новый экзамен 1z0-819 вместо прежних 1z0-815 и 1z0-816. Раньше для того, чтобы стать Oracle Certified Professional нужно было сдать два экзамена и потратить в общей сложности 300$. Теперь сумма сократилась вдвое. Кроме этого изменилось и количество вопросов, если раньше в каждом экзамене было по 80 вопросов и на это было отведено 150 минут, то теперь экзамен длится 90 минут и в нем 50 вопросов, покрывающие все темы из прошлых экзаменов. Большая часть вопросов может иметь несколько верных ответов.

Начнем с того какие цели я преследовал: так как у меня физическое образование и java я изучал сам, то, на мой взгляд, данная сертификация могла бы помочь структурировать свои знания по java, а также иметь некий документ, подтверждающий, что в программирование я могу.

Как зарегистрироваться? Регистрируетесь у партнера Oracle pearsonvue.com, привязываете учетку оракла, выбираете, как сдавать — в центре или из дома. В случае если выбран вариант из дома, то за вами через камеру и микрофон в течении всего экзамена будут следить, в помещении не должно быть никого, вы ни с кем не можете разговаривать и смотреть только на экран, интернет должен быть стабильным, без разрывов, иначе результат аннулируют. Я выбрал сдачу в специализированном центре, так спокойнее.

Какие материалы могут помочь при подготовке? Если у вас есть хоть какой-то опыт программирования, то рекомендую использовать книгу OCP Oracle Certified Professional Java SE 11 Programmer II Study Guide: Exam 1Z0-816 and Exam 1Z0-817 от Scott Selikoff, Jeanne Boyarsky Эта книга написана для экзамена 1z0-816 и она покрывает большую часть того, что будет на экзамене. У этих авторов есть также книга для подготовки к первой части прошлого экзамена 1z0-815, но она рассчитана на абсолютных новичков и читать ее откровенно скучно. Кроме этого в сети можно найти моки экзаменов, чтобы проверить усвоенные знания после прочтения книги.

Какие вопросы? Всего 50 вопросов, на которые дается 90 минут, то есть менее 2х минут на вопрос. Есть сложные, то есть иногда надо подумать и более 2х минут. В некоторых вопросах возможны несколько правильных ответов. Всего вариантов ответа может быть до 7 штук. Надо ответить правильно на 68% вопросов.

На что я бы хотел обратить внимание. Очень много вопросов на стримы, лямбды и функциональные интерфейсы.

Могут попасться такого рода задачи:

Нужно найти в какой строчке ошибка, если она вообще есть:

IntStream is = IntStream.of(1, 3, 5);
int x = is.filter(i->i%2 == 0).average(); //1
System.out.println(x);
        
int y = is.filter( i->i%2 != 0 ).sum();//2
System.out.println(y); 

is = IntStream.of(1, 3, 5, 9);
int z = is.filter( i->i%3 != 0 ).count();//3
System.out.println(z);

Так же задачи с использованием коллекторов. Что будет выведено на экран:

class Student {
    public static enum Grade {A, B, C, D, F}
    private String name;
    private Grade grade;
    public Student(String name, Grade grade) {
        this.name = name;
        this.grade = grade;
    }
    public String toString() {
        return name + ":" + grade;
    }
}
class TestClass {
    public static void main(String[] args) {

        var ls = Arrays.asList(new Student("S1", Student.Grade.A),
                new Student("S2", Student.Grade.A),
                new Student("S3", Student.Grade.B),
                new Student("S4", Student.Grade.C),
                new Student("S5", Student.Grade.F));

        var group = ls.stream()
                .filter(student -> student.getGrade() != Student.Grade.F)
                .collect(Collectors.groupingBy(Student::getGrade,
                        Collectors.mapping(Student::getName, Collectors.toList())));
        System.out.println(group);
    }
}

Собственно, эти вопросы переплетаются с вопросами про коллекции. Например, нужно ответить, что выведет на экран следующий код, если он вообще скомпилируется:

var collection = new HashSet<>();
collection.add(1);
var list1 = List.of(collection);
collection.add(2);
var list2 = List.copyOf(collection);
System.out.println(list1);
System.out.println(list2);

И как изменится результат, если вместо первой строчки мы напишем

var collection = Arrays.asList(1,2,3);

var может использоваться специально, чтобы запутать экзаменующегося:

class X {
        public void print(List<Integer> lst) {
            System.out.println("X list " + lst);
        }
    }

class Y extends X {
        public void print(List<Integer> lst) {
            System.out.println("Y list " + lst);
        }
    }
public class TestClass {
    public static void main(String[] args) {
        X x = new Y();
        Y y = new Y();
        var list = new ArrayList<>();
        list.add(1);
        x.print(list);
        y.print(list);
    }
 }

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

Надо понимать, что происходит при наследовании.

Допустим дан метод в классе со следующей сигнатурой:

public List<Integer> getCollection() {
		return new ArrayList<Integer>();
           }

Какие методы ниже могут быть в классе наследнике?

public List<? super Integer> getCollection() {
        return new ArrayList<Integer>();
    }
public List<? extends Integer> getCollection() {
        return new ArrayList<Integer>();
    }  
public ArrayList<Integer> getCollection() {
        return new ArrayList<Integer>();
    } 

Есть парочка вопросов на интерфейсы подобного типа:

interface Bird {
     default String fly() {
        return "fly";
    }
}

interface Parrot extends Bird {
     public String fly();
}

public class RainbowParrot implements Parrot {
    public static void main(String[] args) {
        Bird b = new RainbowParrot();
        System.out.println(b.fly());
    }
} 

Как отработает программа в данном случае?

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

Отдельно хочу упомянуть, так как для меня это стало открытием — мне попалось целых два вопроса на использование API doPrivileged, раньше вообще никогда не сталкивался с этим по работе. Так что отдельно эту тему стоит проработать, посмотреть можно тут.
Еще раз хочу обратить внимание на то что время серьезно ограничено, несмотря на то, что я пропустил два вопроса на тему doPrivileged, я еле уложился в отведенное время.

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

Сколько готовиться?

Если вы не преподаватель курсов для java-разработчиков и ходите на работу, то я бы рекомендовал заложить месяц на подготовку — выделяя на это часик-другой после работы. Но конечно же все зависит от вашего уровня.

Какие выводы можно сделать?

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

Сертификация может пригодиться для тех, кто работает на удаленке с зарубежными заказчиками — подтвердить свой уровень, а также будет плюсом на собеседованиях, как минимум позволит пропустить вопросы про java.