• ,

Уровень 28. Ответы на вопросы к собеседованию по теме уровня.

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

1 Какие приоритеты нитей бывают?
Каждый поток в системе имеет свой приоритет. Приоритет – это некоторое число в объекте потока от 1 до 10, более высокое значение которого означает больший приоритет. Система в первую очередь выполняет потоки с большим приоритетом, а потоки с меньшим приоритетом получают процессорное время только тогда, когда их более привилегированные собратья простаивают.

Работать с приоритетами потока можно с помощью двух функций:

void setPriority(int priority) //устанавливает приоритет потока.

Возможные значения priority — MIN_PRIORITY, NORM_PRIORITY и MAX_PRIORITY.

int getPriority() // получает приоритет потока.

Источник
Если приоритет не задан, то нить получает приоритет 5 — средний.

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

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

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

2 Можно ли остановить нить, снизив ее приоритет до 0?
Нет. Будет брошен IllegalArgumentException

3 Зачем нужен класс ThreadGroup?

Чтобы любая нить не могла останавливать и прерывать все нити подряд, было введено понятие «группы нитей». Нить может оказывать влияние только на другие нити, которые содержатся в той же группе, что и она. ThreadGroup – это класс, который управляет группами нитей. Такой подход позволяет защитить нити от нежелательного изменения.

Иногда приходится выполнять код, которому нельзя 100% доверять. Поэтому удобно поместить все его нити в отдельную группу и запретить им вмешиваться в работу основной группы нитей.

Иными словами для управления группами потоков

4 В какой группе нитей состоит main-thread?
main

5 Что такое паттерн ThreadPool
Паттерн ThreadPool общими словами — группа потоков, которые решают группы задач. Задачи организованы в очередь. Как только поток завершает работу над задачей, он запрашивает следующую задачу из очереди, до тех пор, пока все задачи в очереди не будут выполнены. После этого поток может завершиться, либо уснуть, до тех пор, пока в очереди не появятся новые задачи.

6 Зачем нужен класс ThreadPoolExecutor?
Для решения большого количества небольших задач группой потоков. Использование класса позволяет избегать расточительного использования ресурсов машины. Тк Создавать для каждой задачи свою нить бывает не очень рационально. Для каждой нити Java-машина выделяет довольно много ресурсов.
Другими словами – создание и уничтожение отработавшей нити может тратить больше ресурсов и времени, чем само выполняемое задание.
Java-разработчики придумали элегантное решение этой проблемы — ThreadPoolExecutor.
ThreadPoolExecutor – это класс, который имеет внутри две вещи:
А) Очередь задач, в которую можно добавлять задачи, по мере их появления в программе.
Б) Пул-нитей (группа нитей) – которые эти задачи исполняют.
При этом нити не уничтожаются после выполнения задания, а засыпают. Чтобы начать выполнять новое задание, как только оно появится.

7 Сколько способов создать нить вы знаете? (Thread, Runnable, Callable)
public class ThreadsTests {
    //Способ 1
    static class ThreadExampleRunnable implements Runnable{
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName());
        }
    }
    
    //Способ 2
    static class ThreadExampleFromThread extends Thread {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName());
        }
    }

    //Способ 3
    static class ThreadExampleFromCallable implements Callable{
        @Override
        public String call() throws Exception {
            return Thread.currentThread().getName();
        }
    }
    
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        new Thread(new ThreadExampleRunnable()).start(); //Способ 1
        new ThreadExampleFromThread().start(); //Способ 2

        //Способ 3
        ExecutorService service = Executors.newFixedThreadPool(5);
        Future<String> task = service.submit(new ThreadExampleFromCallable());
        System.out.println(task.get());

    }
}


8 Для чего используется класс Future?
Этот объект можно использовать, чтобы узнать, завершилось ли уже выполнение задачи, а также, чтобы получить результат ее выполнения.
boolean cancel(boolean mayInterrupt); // Останавливает задачу. 
boolean isCancelled(); //Возвращает true, если задача была остановлена.
boolean isDone(); //Возвращает true, если выполнение задачи завершено.
V get() throws InterruptedException, ExecutionException; //Возвращает результат вызова метода call или кидает исключение, если оно было.


9 В чем преимущества Callable над Runnable?
Используя Callable мы можем узнать завершилась ли задача, и узнать её результат, гораздо проще, чем при использовании Runnable

10 Можно ли отменить выполнение задачи, если использовать класс Future?
Можно, если задача лежит в очереди и ожидает своего исполнения, иначе не факт

Мои ответы на вопросы собеседований из 40 уровня

Собственно, такие вопросы были на этом уровне:
1. Что такое IP-адрес?
2. В чем отличие host и domain?
3. Какие методы в HTTP вы знаете
4. Чем отличаются методы GET, POST и HEAD?
5. Что такое REST?
6. Зачем нужен класс Calendar в Java?
7. Как преобразовать дату в Java к нужному формату?
8. В чем отличие URI и URL?
9. Что такое сокеты?
10. Отличие классов Socket и URL?

А вот мои ответы:
1. IP-адрес — это уникальный сетевой адрес узла в компьютерной сети, построенной на стеке протоколов TCP/IP. В сети Интернет требуется глобальная уникальность адреса; в случае работы в локальной сети требуется уникальность адреса в пределах сети. В версии протокола IPv4 IP-адрес имеет длину 4 байта, а в версии протокола IPv6 IP-адрес имеет длину 16 байт. Обычно IP-адрес в версии протокола IPv4 записывают в виде четырёх десятичных чисел со значениями от 0 до 255, разделённых точкой, например, 192.168.0.3.

2. Домен — это адрес сайта или определённая зона, которая имеет своё имя, не похожее ни на какое другое имя в системе доменных имён. Домены бывают первого уровня, второго уровня, третьего уровня и т.д. Обычно домен первого уровня не доступен обычным пользователям для регистрации (примеры доменов первого уровня — ".ru", ".com", ".net"). Обычно домены третьего и следующих уровней называют субдоменами.
Хост — это определённый компьютер или сервер, подключенный к локальной или глобальной сети. Хост обладает обладает уникальным адресом в среде сервисов TCP/IP (IP-адресом).

3.GET, POST, PUT, DELETE, OPTIONS, HEAD, PATCH, TRACE, LINK, UNLINK, CONNECT.

4.

                        GET	POST	HEAD
---------------------------------------------
Тело Запроса            Нет	Есть	Нет
Тело Ответа             Да	Да	Нет
Кеширование
результата Запроса      Да	Нет	Да, заголовки	
Идемпотентность         Да	Нет	Да


Метод GET используется для запроса содержимого указанного ресурса. Метод POST применяется для передачи пользовательских данных заданному ресурсу. Метод HEAD обычно применяется для извлечения метаданных, проверки наличия ресурса (валидация URL) и чтобы узнать, не изменился ли он с момента последнего обращения. Метод HEAD аналогичен методу GET, за исключением того, что в ответе сервера отсутствует тело. Метода GET считает упрощённой версией POST, потому как метод GET не предполагает полноценного запроса, только URL в качестве такового.

5. REST — это архитектурный стиль взаимодействия компонентов распределённого приложения в сети. Термин был введён Роем Филдингом в 2000 году. Также им были введены требования, которым должно удовлетворять распределённое приложение, чтобы соответствовать архитектуре REST (такие приложения ещё называют RESTful). Вот эти требования:
1) Модель «Клиент-Сервер» (означает, что сеть должна состоять из клиента и сервера; сервер — это тот, кто обладает ресурсами, клиент — тот, который их запрашивает))
2) Отсутствие состояния (означает, что ни клиент, ни сервер не отслеживают состояния друг друга)
3) Кеширование (клиенты и промежуточные узлы могут кешировать результаты запросов; сооответственно, ответы сервера должны иметь явное или неявное обозначение, что они кешируемые или некешируемые)
4) Единообразие интерфейса (означает, что между клиентами и серверами существует общий язык взаимодействия, который позволяет им быть заменяемыми или изменяемыми, без нарушения целостности системы):
а) Определение ресурса (означает, что каждый ресурс должны быть обозначен постоянным идентефикатором)
б) Управление ресурсами через представление (означает, что клиент хранит ресурс в виде его представления, и при желании изменения ресурса он отправляет серверу информацию о том, в каком виде он хотел бы видеть этот ресурс; сервер же рассматривает этот как запрос как предложение, и сам решает, что делать ему с хранимым ресурсом)
в) Самодостаточные сообщения (каждое сообщение содержит достаточно информации, чтобы понять, как его обрабатывать)
г) Гипермедиа (означает, что клиенты изменяют состояние системы только через действия, которые динамически определены в гипермедиа на сервер)
5) Система слоёв (означает, что в системе может быть больше двух слоёв (клиент и сервер), и при этом каждый такой слой знает только о своих соседних слоях, и не знает об остальных слоях, и взаимодействует только с соседними слоями)
6) Код по требованию (означает, что функциональность клиента может быть расширения за счёт загрузки кода с сервера в виде апплетов или сценариев)

Удовлетворение этим требованиям позволяет добиться следующего:
* Надёжность
* Производительность
* Масштабируемость
* Прозрачность взаимодействия
* Простота интерфейсов
* Портативность компонентов
* Лёгкость внесения изменений
* Способность эволюционировать, приспасабливаясь к новым требованиям

6. Он нужен для более удобной работы с датой и временем. Он позволяет работать с датой в рамках календаря, то есть позволяет прибавлять и отнимать дни от какой-то конкретной даты, причём будут учитывать и високосные года. Кроме того, он позволяет представить время миллисекундах в удобном виде — год, месяц, день, часы, минуты, секунды. Также есть много методов для установки и получения разных параметров даты и времени, например: день недели, день месяца, день в году, номер недели в месяце, номер недели в году.

7. Для этого существует удобный класс SimpleDateFormat. Экземпляру этого класс можно передать шаблон представления даты, и тогда он в таком виде будет возвращать дату (в формате строки String), либо считывать дату (из строки String). Выглядит это всё следющим образом:
Date date = new Date(); // получаем текущую дату
SimpleDateFormat formatter = new SimpleDateFormat(«d-MM-yy HH:mm:ss»); //создаём экземпляр класса SimpleDateFormat
//и передаём ему шаблон представления даты и времени
String dateAsString = formatter.format(date); //преобразуем дату в строку заданного формата

Date dateAfterConversion = formatter.parse(dateAsString); //преобразуем строку обратно в дату

8. URI расшифровывается как Uniform Resource Identifier и переводится как «унифицированный идентификатор ресурса». URI — это последовательность символов, идентифицирующая абстрактный или физический ресурс. URL расшифровывается как Uniform Resource Locator. То есть это некий унифицированный указатель на ресурс, однозначно определяющий его месторасположение. URL служит стандартизированным способом записи адреса ресурса в сети Интернет.
Их отличия в том, что URI — это некоторый идентификатор ресурса, который позволяет этот ресурс как-то идентифицировать, а URL — это указатель на ресурс, он даёт информацию о том, где находится ресурс. Таким образом URL — это URI, который помимо индетификации ресурса, даёт информацию о его местонахождении.

9. Сокеты — это связка IP-адрес + порт, позволяющая из внешней сети однозначно идентифицировать программу на компютере или сервере. В Java для работы с сокетами есть два класса Socket и ServerSocket. Экземпляры первого класса играют роль клиента, экземпляры второго — роль сервера. Клиент может отправлять и принимать сообщения через сокет. Сервер же постоянно отслеживает запросы пользователей и отвечает на них.
Для того, чтобы отправить данные через сокет, в классе Socket существует класс getOutnputStream(), возвращающий исходящий поток, с которым уже можно работать как обычно. Для приёма информациию нужно воспользоваться методом getInputStream(), который возвращает входящий поток. Дальше с этим потоком можно работать как с обычно потом ввода. Также стоит отметить, что при создании клиентского сокета (экземпляра класса Socket) в конструктор нужно передать ip-адрес сервера и порт, на котором он работает принимающая программа-сервер.
При создании серверного сокета (экземпляра класса ServerSocket) нужно указывать только порт, через который будет работать программа. После этого вызывается метод accept(). Этот метод ожидание подключение клиента, а после этого возвращает экземпляр класса Socket, необходимый для взаимодействия с этим клиентом. Дальше работать идёт с экземпляром класса Socket, как в первом случае (в случае клиента).

10. Главное отличие в том, что класс URL предназначен для работы с URL-строкой (парсинг URL-строки), а Socket используется для соединения с удалённым сервером и отправки информации на сервер и/или приёма информации от сервера (хотя, используя класс URL, можно получить доступ к ресурсу, на который указывает сам URL; но делается это не напрямую, а через объект класса URLConnection). Также, если смотреть в общем, то Socket используется для связи с сервером (другой программой), а URL — для доступа к ресурсу (например, к файлу). Кроме того, URL и URLConnection ориентированы в основном на работу с HTTP, тогда как Socket может работать с любыми протоколами.

Мои ответы на вопросы собеседований из 38 уровня

Здравсвтвуйте. Опять-таки, похоже нет ответов на вопросы из этого уровня. Поэтому, как обычно, выкладываю свои. Вдруг, кому помогут (или кто-то что-то дополнит или ответит лучше).
Итак, были такие вопросы:
1. Что такое Agile?
2. Что такое Scrum?
3. Какие роли Scrum вы знаете?
4. Что такое спринт? Расскажите с подробностями
5. Кто такие QA?
6. Кто такой product owner?
7. Расскажите об иерархии исключений
8. Что делать если JVM выкинула Error?
9. Какие нововведения в области исключений из Java 7 вы знаете?
10. Зачем нужны аннотации? Как ими пользоваться?

А теперь мои ответы:
1. Agile — это серия подходов к разработке программного обеспечения, ориентированных на использование итеративной разработки, динамическое формирование требований и обеспечение их реализации в результате взаимодействия внутри самооранизующихся рабочих групп, состоящих из специалистов разных профилией. Существует несколько методик, относящих к гибкой методологии разработки, в частности экстремальное программирование, DSDM, Scrum, FDD.

Основные концепции agile-методов:
* люди и взаимодействие важнее процессов и инструментов;
* работающий продукт важнее исчерпывающей документации;
* сотрудничество с заказчиком важнее согласование условий контракта;
* готовность к изменениям важнее следованию первоначального плана.

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

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

2. Scrum — это одна из методик гибкой разработки. Она делает акцент на качественном контроле процесса разработки. Основая особенность скрама — это разбиение процесса разработки на итерации имеющий чёткую протажённость по времени (обычно 2-6 недель; их называют «спринтами»).
В начале спринта проводится «планирование спринта» — совещание на 3-4 часа, где обсуждаются основные задачи, которые будут решаться на протяжении спринта. В конце спринта проводится «демо» — демонтрация результатов работы команды за этот спринт.
Перед самым первым спринтом заказчик (или его представитель) формирует список требований, предъявляемых к будущему продукту. Такие требования называются «user story», а самого заказчика называют «product owner». Также в этом списке заказчик (PO) указывает приоритет для каждой задачи. Сначала будут реализовываться задачи с более высоким приоритетом. Весь список называется «product backlog», или «резерв продукта».
Кроме product owner, среди участников ещё выделяют scrum-мастера: он проводит все совещания, следит за соблюдением всех принципов скрама, разрешает противоречения и защищает команду от отвлекающих факторов. Обычно в качестве скрам-мастера выступает кто-то из команды.
На первом совещании в начале спринта каждой задаче, кроме того, что назчается приоритет, даётся ещё приблизительная оценка в «абстрактных человеко-днях», которые ещё называют «story point». Затем команда решает, сколько она успеет выполнить задач за время спринта. Например, заказчик отобрал 7 задач, а команда сможет сделать только 5. Тогда остальные две задачи пойдут на следующий спринт. Если заказчику это не нравится, он может повысить их приоритет, но тогда другие задачи выпадут из спринта. Кроме того, скрам-мастер может разбить некоторые задачи на более мелкие и расставить им различные приоритеты, чтобы заказчик остался доволен.
Список отобраных задач на спринт называются «sprint backlog», или «резерв спринта». Для лучшей наглядности обычно составляется таблица, в которой указываются задачи, которые нужно реализовать, которые находятся в процессе реализации, и те которые уже выполнены. Также строится диаграмма «сгорания задач». Она графическ показывает, сколько ещё задач осталось выполнить. В идеале график сгорания задач к концу спринта должен опустится до нуля.
Также в течение спринта каждый день или через день проводятся небольшие совещания внутри команды на 5-15 минут, где каждый участник команды рассказывает, что сделал за этот день (или эти два дня), что ещё ему предстоит сделать, а также рассказывает о том, что ему мешает что-то сделать.
Когда спринт завершается, scrum-master проводит demo, на котором демонстрируется список всего, что полностью сделано. Затем проводится «разбор полетов» — совещание тоже на пару часов. На нем обычно пытаются выяснить, что было сделано хорошо, а что (и как) можно было сделать лучше.
Обычно за 2-3 спринта можно выявить основные проблемы, которые мешают команде работать эффективнее, и устранить их. Это приводит к большей продуктивности, не увеличивая нагрузку на команду. Такое было невозможным до эры гибких методологий.
Также в середине спринта, иногда еще проводят «вычесывание» — совещание посвященное планированию следующего спринта. На нем обычно уточняют приоритеты задач, а так же могут разбить некоторые задачи на части и/или добавить новые задачи в product backlog – резерв продукта.

3. В крам участников делят на «свиней» и «кур». «Свиньи» полностью задействованы в процессе, «куры» — только частично. К категории «свиней» относят следующие роли:
* Скрам-мастер (проводит совещания, следит за выполнением принципов скрама и пр.; это кто-то из команды, produst owner не может быть скрам-мастером);
* Владелей продукта (Product Owner) (представляет интересы конечных пользователей и других заинтересованных в продукте сторон);
* Команда разработки (Development Team) (кросс-функциональная команда, состоящая из специалистов разных профилей: разработчиков, тестировщиков, дизайнеров, архитекторов и т.д. Размер команды в идеале составляет от 3 до 9 человек. Команда является единственные полностью вовлечённым участником разработки и отвечает за результат как единое целое. Никто, кроме команды, не может вмешиваться в процесс разработки на протяжении спринта).

К «курам» относятся следующие роли:
* Пользователи (Users)
* Клиенты, продавцы (Stakeholders) (лица, которые инициируют проект и для кого проект будет приносить выгоду. Они вовлечены в скрам только во время обзорного совещания по спринту (Sprint Review));
* Управляющие (Managers) (люди, которые управляют персоналом);
* Эксперты-консультанты (Consulting Experts).

4. Спринт — это одна итерация цикла разработки программного обеспечения в Скраме. Обычно спринт жёстко фиксирован по времени. Продолжительность спринта выбирается на основании размера команды, специфики работы, требований, размера проекта. Чаще всего это подбирается опытным путём, на основании проб и ошибок. В среднем спринт может быть продолжительность от 2 недель до 4 (хотя в некоторых компания его продолжительность бывает равна и 6 неделям). Для оценка объёма работ в спринте может быть использована предварительная оценка, измеряемая в очках истории. Предварительная оценка фиксируется в беклоге проекта.

5. QA расшифровывается как Quality Assuarance (то есть «Гарантия качества», если перевести дословно). К этой категории относятся тестировщики. Это люди, которые выявляют в программе баги и ошибки. Для этого они используют разные средства, как ручные, так и автоматические. После выявления багов и ошибок они сообщают об этом разработчикам, и те исправляют эти ошибки.

6. Product Owner (владелец проекта) — это заказчик или представитель заказчика. Это либо кто-то со стороны клиента (сторонняя фирма или физ.лицо), либо какой-то другой сотрудник фирмы, определящий требования к конечному продукту и следяющий за их выполнений (например, бизнес-аналитик). Как уже было сказано, он определяет требования к продукту и задачи, которые дожна решить команда разработки, чтобы получить конечный продукт. Список требований (или задач) он оформляет в определённым порядке и с заданным приоритетом для каждого требования (задачи). Обычно он участвует в планировании спринта (перед началом спринта) и в демонтрации результатов спринта (после окончания спринта).

7. Во главе иерархии исключений в Java стоит класс Throwable. От не наследуются два класса: Error и Exception. Объекты первого класс выбрасываются, когда возникают какие-то серьёзные ошибки в работе программы и джава-машины в целом (а также в работе ОС и аппаратной части копьютера), так, что программа больше не может продолжать работать и закрывается. Это может быть недостаток памяти (OutOfMemoryError) или переполнение стека (StackOverflowError).
Экземпляры второго класса могут выбраться при самых различных исключительных ситуаций. Собственно от этого класса наследуется класс RuntimeException и все остальные классы. Первый класс так выделяют, потому что, во-первых, исключительные ситуации такого типа являются непроверяемые (unchecked), а, во-вторых, к данным исключительным ситуациям относятся ошибки выполнения программы. Обычно это возникает из-за несовершенства кода. Все остальные исключительные ситуации обычно являются следствием непредвиденного стечения обстоятельств, например, ошибки ввода-вывода.
Также исключения делятся на проверяемые (checked) и непроверяемые (unchecked). Первые необходимо либо отлавливать в блоке try-catch, либо указывать в качестве выбрасываемых в сигнатуре метода (используя слово throws). Непроверяемые этого не требуют, и выбор остаётся за программистом. К проверяемым относятся исключения типа Throwable (а также наследуемые от него) и типа Exception (и наследуемые от него, кроме исключений типа RuntimeException). К непроверяемым относятся исключения типа Error (а также наследуемые от него) и исключения типа Runtime (и наследуемые от него).

8. Ничего, программа просто закроется. Обычно это критические ошибки, не всегда возникшие по вине программиста (например, выход из строя жёсткого диска или сбой операционной системе). Правда, среди них есть две ошибки, которые могу следствием несовершенства кода — это StackOverflowError и OutOfMemoryError. Первый тип ошибок возник, при переполнении стека вызовов — то есть, когда вызывается слишком много методов и стек вызовов становится слишком больший (типичный пример — бесконечная рекурсия или рекурсия с большим количеством итераций). Вторая ошибка — OutOfMemoryError — возникает, когда переполняет память отведённая под объекты, то есть когда создаётся слишком много тяжеловесных объектов, и они все держатся в памяти (или когда сборщик мусора не успевает их уничтожать).

9. В Java 7 в плане исключение были введены три новых «вещи»:
* Multicatching. Это когда в одном catch-блоке сразу обрабатывается несколько исключений:
try {
} catch (Exception1|Exception2|Exception3|… | ExceptionN ex) {}
В таком случае параметр ex будет неявно иметь модификатор final. Кроме того, байт-код, сгенерированный компиляцией такого кода (с единым catch-блоком) будет короче, чем байт-код, сгенерированный компиляцией кода с несколькими catch-блоками.

* Try-with-resources. Эта контрукция позволяет после слова try в скобках указать открываемые ресурсы, которые сами закроются после окончания конструкции try () {} catch{}. В качестве ресурса в данной конструкции может быть использован любой объект, реализующий интерфейс AutoCloseable.
Во время закрытия ресурсов тоже может быть брошено исключение. В try-with-resources добавлена возможность хранения «подавленных» исключений, и брошенное try-блоком исключение имеет больший приоритет, чем исключения, получившиеся во время закрытия. Получить последние можно вызовом метода getSuppressed() от исключения, брошенного try-блоком.

* Rethrowing. Перебрасывание исключений с улучшенной проверкой соответствия типов.
Компилятор Java SE 7 тщательнее анализирует перебрасываемые исключения. Рассмотрим следующий пример:

static class FirstException extends Exception { }
static class SecondException extends Exception { }
public void rethrowException(String exceptionName) throws Exception {
try {
if («First».equals(exceptionName)) {
throw new FirstException();
} else {
throw new SecondException();
}
} catch (Exception ex) {
throw e;
}
}

В примере try-блок может бросить либо FirstException, либо SecondException. В версиях до Java SE 7 невозможно указать эти исключения в декларации метода, потому что catch-блок перебрасывает исключение ex, тип которого — Exception.

В Java SE 7 вы можете указать, что метод rethrowException бросает только FirstException и SecondException. Компилятор определит, что исключение Exception ex могло возникнуть только в try-блоке, в котором может быть брошено FirstException или SecondException. Даже если тип параметра catch — Exception, компилятор определит, что это экземпляр либо FirstException, либо SecondException:

public void rethrowException(String exceptionName) throws FirstException, SecondException {
try {
//…
} catch (Exception e) {
throw e;
}
}

Если FirstException и SecondException не являются наследниками Exception, то необходимо указать и Exception в объявлении метода.

10. Аннотации используются для размещения рядом с классом, полем, методом или переменой какой-то дополнительной, служебной информации (метаданных), относящейся к ней. Чтобы указать аннотацию, надо над заголовком класса или метода, либо надо объявлением поля или переменной, написать после @ название аннотации (класса аннотации), например так:

@Override
public void doSomeThing() {
}


Кроме того, у аннотации могут быть свойства, они указывают в скобках через запятую в виде пар «ключ=значение», где в качестве ключа выступает название свойства, а качестве значения — собственно, значение, которое должно принять это свойство. Выглядит это так:
@CatInfo(manager=Catmanager.class, unique=true)
class Cat {}
Если указывается указывает значение только для одного свойства, то имя свойства и знак равно можно не писать: @SuppressWarnings(«unchecked).
Также можно вообще не ставить скобки, если никаким свойствам не присваиваются никакие значения.
Чтобы создать свою аннотацию, надо указать модификатор доступа, потом после пробела ключевое слово „@interface“ и дальше опять после пробела имя аннотации (принять начинать его с большой буква). Дальше идёт тело аннотации в фигурных скобках. Внутри тела указываются свойства в виде объявлений методов (как в интерфейсах). Также у свойств можно указать значения по умолчанию (они их будут принимать, если при указании аннотации в нужном месте, этому свойству не будет присвоено какое-то значение). Всё вместе это выглядит так:
@interface CatManager
{
Class manager();
boolean unique();
String name() default „Unknown Cat“;
}

Аннотации выполняют следующие функции:
а) дают необходимую информацию для компилятора;
б) дают информацию различным инструментам для генерации другого кода, конфигураций и т. д.;
в) могут использоваться во время работы кода;
е) повышают читабельность кода и его понимание программистами.
На данный момент компилятором используют три аннотации: @Deprecated, @Override и @SuppressWarnings. Первой аннотацией помечаются устаревшие методы и классы, нерекомендованные к использованию (комплятор по их поводу показывает предупреждение). Вторая аннтоцая ставится над переопределёнными методами класса-наследника (это позволяет контролировать связь между исходным методом и переопределённым). Третья аннотация позволяет подавлять (не выводить) некоторые исключительные предупреждения, обычно выводимые компилятором в связи с данным методом или классом (например, что он уже устарел и нерекомендован к использованию).

Первая работа: почему так сложно найти?

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

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

Резюме


Представьте, что вы работодатель, который открыл набор людей в свою компанию. Заходите на Head Hunter. Там — десятки, а то и сотни объявлений от соискателей. У каждого есть как минимум одно резюме, у самых инициативных — больше. Еще столько же откликнулось на вашу вакансию. Читаем:

Java, HTML, ООП, Английский язык, C/C++, грамотная и поставленная речь, Android

Вы бы взяли такого человека? Я бы — никогда. Америку я не открою, сказав, что резюме — это самая важная часть в поиске работы. Еще раз — САМАЯ важная. Это 80% успеха. Это ваш билет на поезд. Может быть вы и не доедете куда хотели, но поездка не оставит вас без новых впечатлений.

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



Запрашиваемая зарплата не соответствует опыту? Программист-все-умею-и-могу? Но мы ищем Java специалиста и знаем, что человек с опытом работы 5 лет не может запрашивать 40 тысяч в Питере.

Итак, ваше резюме — это ваша валюта. Ее стоимость пропорциональна времени, в нее вложенному. Резюме сложное, продуманное, интересное — большой спрос.

В ключевые навыки пишем только то, что делаем лучше всего. Ищем работу Java-программистом — вписываем только Java и все, что к ней относится напрямую. C++ — это хорошо, но не в ключевых навыках, а в разделе «Дополнительная информация», с обязательным указанием, что имели некоторый опыт, знакомы с данной технологией, есть теоретическая подготовка в чем-либо.

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

Эффекта разорвавшейся атомной бомбы просмотров резюме можно достичь, указав ссылку на личный git аккаунт.
Даже если там тестовое задание с калькулятором для компании N. HR не понимает код, но ей сказали, что ссылка на репозиторий — это круто. Пожалуй, круче только опыт работы, но пока у нас его нет.

Самоучкам, на мой взгляд, сложнее. Да, часто слышно, что «вышка» необязательна. Но это не значит, что ее игнорируют. В теории, да и на практике, человек с профильным образованием имеет хотя бы теоретические знания, прошел курс математики. А это несомненный плюс перед самоучкой, знания которого хаотичны и неполны. Из личного опыта — не взяли на стажировку в Mail.ru, т.к. они обязаны были заключать договор с институтом. То есть даже без образования, являясь лишь студентом, вам могут быть открыты дороги туда, куда нет доступа самоучкам.

Отклики

Несмотря на то что вам ну очень хочется попасть на свою первую работу, не стоит откликаться на все подряд. Вам точно хочется работать в финансовой сфере? А в генетике? Интересен front или только back? Готовы отсидеть полгода в тестировании? Уверены, что не попросят больше? Хуже, чем быть безработным, только заниматься тем, что не нравится.

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

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

Собеседование

Самая неоднозначная часть в поисках. В разных компания проходит по-разному. Кто-то предпочитает скайп, кто-то личное присутствие. Первая встреча может быть только с HR. Бывает, что несмотря на хороший опыт работы, только по личному неприятию вас девушкой, просто «потому что», вы даже не дойдете до технических специалистов.

Вопросы тоже разные. На моем первом собеседовании были простейшие вопросы по Java SE. Методы Object класса, коллекции, базовое понимание ООП. На других — от «Как бы вы узнали, в случае больших задержек в работе приложения, что именно не оптимизировано?» до «Что такое Java EE, Spring, контейнер в нем же?» или просьб написать свой алгоритм StringBuilder.reverse(). Об этом написано много и это не самое главное.

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

Собеседование в компании, где я сейчас работаю, было достаточно простым, недолгим и очень приятным. За примерно 20 минут меня спросили о моем опыте программирования, проектах в которых участвовал, кто я в целом такой. Общие вопросы вширь. В конце сказали: «Вот вам тестовое задание. Залить на гит и описаться на почту в течение такого-то срока. Вам ответят тогда-то.». Позже я узнал, что вместе со мной пытались устроиться еще несколько студентов/выпускников. Кто-то некрасиво вел себя во время собеседования, а кто-то просил зарплату больше, чем я (40000р.), при этом выполнив задание не до конца или хуже. В итоге я попал в невероятно уютный коллектив с классным начальником и удобным ритмом работы.

После/до технической части у вас будет возможность задать вопросы о компании. Обязательно нужно спрашивать следующее:

  • На какой проект вас поставят
  • Версия Java и технологии проекта
  • Будете вы разработчиком или тестировщиком (первое время)
  • Ваши обязанности/характер работы (fullstack, back)
  • Зарплата (если в вакансии не было указано), льготы, бесплатные плюшки (от кофе до книг и курсов)
  • Когда будет дан ответ приняты вы или нет (добивайтесь точной даты)
  • Misc: График, митинги, обед, отпуск и больничный и их оплачиваемость etc.

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

Напоследок обширная и более подробная статья по теме от mail.ru.

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

Собеседование. Нужно ваше мнение

Всем привет! Вот и я уже дошла до 32 уровня JavaRush и решила закинуть удочку и поймать свою удачу на просторах вакансий Junior Java Developer.
Мне немного улыбнулась удача и мне прислали тестовое задание. Но перед ссылкой на его выполнение написали такое вот сообщение:
Добрый день! Спасибо, что заполнили нашу анкету!

Как и договорились, мы внесли Ваш профиль в список приглашенных к тестированию. Вот основные условия написания онлайн-теста:

Когда Вы начнете тест, Ваша попытка будет списана. Будьте внимательны и приступайте к тесту, когда будете готовы.
Время на написание теста: 30 минут.
Вопросы по Java приводятся на английском языке.
Структура теста: 10 вопросов J2SE, 4 вопроса J2EE. Рассчитайте Ваше время с учетом структуры теста.
По итогам анализа ответов теста, если Вы справитесь с 70-80% вопросов, мы пришлем Вам ссылку на следующее задание.
Мы просим Вас быть максимально внимательными, соблюдать регламент и быть предельно честными — для теста Вам необходимы только Ваши знания.

На JavaRush мы изучали JavaCore, а тут вопросы будут по J2SE + J2EE. Я не стала пока переходить по ссылке, т.к хочу понять стоит ли сейчас туда лезть с моими познаниями или стоит что-то дополнительно изучить.

Ребята, помогите понять.Кто знает J2SE + J2EE это тоже самое, что мы изучали или это что-то гораздо тяжелее? Если второе, то киньте ссылки на какие-нибудь источники, чтобы можно было дополнительно изучить J2SE и J2EE.

Здесь можно посмотреть тестовое задание, которое мне давали.

История одного собеседования: интересные вопросы

Недавно мне довелось посетить собеседование на позицию стажёра в одной из крупных IT-компаний.
Это было моё первое IT-собеседование и, на мой взгляд, оно выдалось интересным. В общей сложности меня “допрашивали” больше 3 часов (этому предшествовали ещё домашние задания и тест в офисе на компьютере).
Хочу отдать должное собеседующему, который не ставил крест, когда я отвечал на вопрос неверно, а с помощью своих наводящих вопросов заставлял меня вдумываться и приходить к верному ответу.

Ниже я представлю несколько “зарисовок” – на мой взгляд, достаточно интересных вопросов, некоторые из которых дали мне более глубокое понимание отдельных аспектов в Java. Возможно, кому-то эти вещи покажутся очевидными, но думаю, найдётся те, для кого это будет полезно.
  • ,

Тестовое задание: "Написать Интерпретатор на язык BrainFuck"

Привет всем!

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

Технические вопросы на собеседовании.

Привет всем, Джаварашовцы!

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

Так вот, собеседование проходило по такому плану
  1. JavaCore
  2. ООП
  3. REST
  4. Базы данных.
  5. Инструменты, которыми пользуешься.

JavaCore

  • Вначале меня попросили нарисовать иерархию интерфейсов у Коллекций.(Это было не сложно, там всего их несколько(Collection,List,Set,Queue,Map). )
  • В чем различие ArrayList и LinkedList(это один из замых заезженных вопросов и ответов в инетах просто тьма). Обсудили скорость выполнения запросов в них и какая разница между листами.
  • Вопрос про класс Object. какие у него методы, что они делают.
  • Рефлексия. что делает метод getClass(). Очень интересный вопрос, разберите его. Особенно про то, как получить всё про класс, пусть даже там приватные методы или переменные.
  • Спросили за многопоточность. Слабенько, как я считаю, так рассказать как ты понимаешь что такое многопоточность. Что нужно, чтоб запустить новый поток. Реально, если вы 20+ уровень, то эти вопросы для вас покажутся смешными.
  • Что можешь сказать про Stream. Это имеется в виду не про Java 8. Имеется в виду потоки ввода и вывода. Как базовые интерфейсы, какие они (символьные и байтовые). На понимание, никакой конкретики.
  • Исключения. Здесь опять-таки попросили нарисовать иерархию исключений, какие бывают, какие из них checked, а какие unchecked. Что нужно делать с Runtime исключениями. Назовите самое часто попадающее(NullPointerException)
  • Вопрос с тем, что нужно делать с checked исключениями(пробрасывать дальше или обработать — понятно и то и другое.)

ООП

  • Что такое ООП в двух словах?
  • Какие еще есть парадигмы программирования? В чем их различие от ООП
  • Какие основные принципы ООП?(наследование, полиморфизм и инкапсуляция) Рассказать про каждый из них. Пока всё абстракатно, не привязываясь к какому-то языку.
  • Задача на понимание проектирования систем: есть Лошадь и Птица. Нужно получить Пегаса. принцип «has a» и «is a»

REST

  • Что такое REST. В википедии об этом говориться очень круто. Реально статьи из википедии для ознакомления хватит
  • HTTP. Здесь тоже общие фразы. Его методы, для чего каждый из них.
  • Коды состояния HTTP. на какие пять частей делиться, расскажите про самые известные (200,204,404,500,501). Зачем они. Спросили еще про 401 и 403. Но я не знал их. Сказали они важные.

Базы данных

Здесь я рассказал, что знаю MySQL. Рассказал про три нормальные формы. Рассказал про Join'ы, какие бывают и нарисовал пересечение областей, в котором используются разные джоины. Рассказал про то, как я понимаю реляционную БД. Не забыл еще о про MongoDB — это NoSQL база данных. Через некоторе время я напишу и про это.

Другие Инструменты
Здесь мы прошлись по моем резюме. У меня было написано, что использую Maven/Gradle для сборки, использую JIRA для тасков, git, Docker, Swagger. Для Continuous Integration — Stash, Bamboo, Puppet. Для тестирования JUnit, Mockito, JMeter.


Я мог что-то забыть, поэтому если интересно — спрашивайте в комментариях постараюсь ответить.

Это была первая часть собеседования. Теперь жду результаты и если да, то будет вторая часть. Напишу о ней как только так сразу.
Всем кому статья понравилась и была полезна — ставьте "+". Пишите в комментариях.

См. также мои другие статьи:
Тестовое задание: «Написать Интерпретатор на язык BrainFuck»
Тестовое задание «Image Comparison»
Java — быстрее, сильнее и выше! Зарплаты украинских программистов.
История успеха спустя 1.5 года от начала обучения
Технические вопросы на собеседовании.
Как найти работу? Рассылка резюме
Профессиональное выгорание. Как устоять?
Английский для IT и для собеседования
Паттерн Command своими словами.
Паттерн Singleton своими словами.
Как создать исполняемый jar в Intellij IDEA / how to create jar in IDEA
Помогите, нужна мотивация!

Подписывайтесь на мой блог Паттерны Проектирования пишите в нем статьи!

Английский для IT и для собеседования.

Приветсвтую Вас, дамы и господа! =)


Так получилось, что я последнее время готовился к собеседованию и нужно было подготоовиться к английскому.
Тема эта так же важна, как и само программирование, т.к. вся документация на английском, всё самое свежее на английском, самые классные книги на английском.
Да, скажете вы, что есть же переводы книг на русский… Это правда, но и правда то, что большинство переводов никудышние и не передают суть вопроса. А иногда и вовсе вводят в заблуждение.

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

Реальность такая, что во многих компаниях собеседование проходит в три этапа:

  • Общение с HR. На этом этапе рассказывают про компанию, какие они классные, чем они занимаются и т.д. и попутно смотрят насколько адекватен, собеседник. Если он неадыкват, то дальше никакого общения не будет.
  • Собеседование на английском… Вот здесь как раз будут смотреть, насколько честно вы признались в резюме, какой у вас уровень. И реально, если вы будете молчать и ничего не отвечать, то на этом этапе собеседование для вас закончится… Здесь будет общение не на тему программирования, а так просто в вольной теме или зачастую «Tell me about yourself».
  • Если вы успешно прошли первые два этапа — поздравляю, вы сможете поговорить с техническим специалистом на тему вашей профессиональной граммотности.


Исходя из этого списка, я хочу рассказать о том, как я это делал, какие выводы и примеры.
На своей первое собеседование я шел и про тему английского как-то не подумал… цитата из моей статьи:
Поговорив с HR-ром, ко мне позвали преподавателя по английскому, с которым я «пообщался». К этому моменту я вовсе был не готов и вышло, что я больше слушал, чем говорил. И на тему расскажи о себе, я что-то промямлил, но ничего особенного.
И после этого я вынес важный урок, что к английскому нужно готовиться также чательно, как и к техническим вопросам.
Реально за короткий срок грамматику всю не повторишь и не изучишь, а вот сделать небольшую шпаргалку для себя — это можно. Пусть она будет состоять из простых предложений, пусть она будет не доскональной, но она Будет! и вам будет что сказать.

С такими мыслями я составил свой первый рассказ, который понятно я выучил, может не дословно, но приближенно к тексту:
Hello. my name is roman. I AM studiNG AT SomeUniversity. I have HAD an experiance in android development. Ive been working with freelansers team since January. I have strong communication skills and I am fast learning person.
I have many hobbies, for example i play guitar and love camping.
My grandfather father and I are bee-keepers. Really. I am not afraid when bees are stinging me. I know what need to do if you want to get some honey from bee-hive.
I like sport, thats why i go to the gym EVERY OTHER DAY day. I lIKE this.
Also i do not drink alkohol and smoke the cigarretes.
Небольшой, но уже какой-то. Там где выделено большими буквами — это мне редактировала моя жена, которая читала это. У нее с английским получше, чем у меня.

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

И вот я плавно подошел к тому, что готовился пару дней назад. За это время я несколько поднатаскался с английским(как я считаю) и получил вот такой шаблончик:
Hello!
My name is Roman. I live in SomeCity. I’m working as Java developer in IT company.
On this job, I’m developing microservices structure. For dependency injection, I’m using Guice(pronounced as juice). It’s lightweight framework from Google. Also, we’re using Jersey. As build tools, we are using Gradle. Gradle it’s the most powerful of all those tools. Because it has life circle as Maven and it has tasks as Ant. And all of this you can combine as you want on Groovy. it’s mean that you do all thing in groovy script. Also, I’m making different tests. I’m using JUnit 4, Mockito and JMeter. For database we use MongoDB where we store metadata for our application.

I love sports, that’s why 3 times per week I go to the gym. Also, I like to play volleyball, badminton and sometimes I can go to play soccer with my old friends, but it doesn’t mean that I’m good in it.
Also, I have many hobbies, for example, I play the guitar. Every summer I go to the forest near Chuguev on the Severskiy Donec beach. It’s place called “Figurovka”. Every night we seat around the bonfire and sing songs while I play the guitar. It’s about the night, as for day we usually play volleyball and badminton.
you know badminton is more difficult than volleyball because while you play volleyball you can rest instead of badminton when you need to move all the time if you want to win. When I speak about badminton I mean professional badminton when you have badminton court and rules.

Next, it is a hobby and a family business. My father and I are beekeepers. We know how to get honey :D.
we have about 40 colonies of bees. It’s normal for us. I love it because working with bees it’s very healthy for the body. They are very smart. of course, we sell honey. Bees produce many commodities. For example honey, beeswax, pollen, propolis and else. Also, we produce Medovucha. It’s lightweight alcohol beverage, which does not contain ethanol.
Also, we provide pollination services.

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

Английский для IT
И конечно хочу добавить несколько слов из своего опыта про то, как развивать свой английский в IT.
Это только лично мое мнение и оно никоим образом не претендует быть правдой в последней инстанции, но если кто-то вынесет для себя что-то интересное — я буду только рад.

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

Да, именно так, сейчас я читаю книгу «The Linux CommandLine» на английском и завел себе тетрадь, в которую вписываю неизвестные мне слова, которые они используют. И это реально работает, это помогает мне.

Вконце хочу пожелать всем Джаварашевцам удачи в прокачке своих скилов, успешном поиске работы и intermediate английского!

Всем, кому понравилась статья, ставте "+", пишите в комментариях, давайте вести диалог.

См. также мои другие статьи:
Тестовое задание: «Написать Интерпретатор на язык BrainFuck»
Тестовое задание «Image Comparison»
Java — быстрее, сильнее и выше! Зарплаты украинских программистов.
История успеха спустя 1.5 года от начала обучения
Технические вопросы на собеседовании.
Как найти работу? Рассылка резюме
Профессиональное выгорание. Как устоять?
Английский для IT и для собеседования
Паттерн Command своими словами.
Паттерн Singleton своими словами.
Как создать исполняемый jar в Intellij IDEA / how to create jar in IDEA
Помогите, нужна мотивация!

Подписывайтесь на мой блог Паттерны Проектирования пишите в нем статьи!
  • ,

Восемь вещей, которые мне помогли найти работу

Привет, войтишник! Решил поделиться своей историей. Начав обучение в конце 2014 и несколько раз забрасывая все куда подальше, 2 месяца назад я получил работу.

В этой статье я не буду рассказывать о том, как и что я писал в резюме, о чем говорил с HR и как я учил английский (об этом будет отдельный пост). Я не буду углубляться в то что я и где учил. Я просто поделюсь своими наблюдениями и размышлениями, возникавшими у меня по ходу обучения по поводу и без. Я поделюсь тем, что считаю хорошим и плохим в околовойтишной сфере. А так же перечислю 8 вещей, которые помогли мне стать программистом. Поехали!
  • ,

Ответы на вопросы к собеседованию Level28

1 Какие приоритеты нитей бывают?
Ответ на этот вопрос есть в лекциях JavaRush.
Для оптимизации параллельной работы нитей в Java имеется возможность устанавливать приоритеты нитей. Нити с большим приоритетом имеют преимущество в получении времени процессора перед нитями с более низким приоритетом.
Работа с приоритетами обеспечивается следующими методами класса Thread:
public final void setPriority(int newPriority)
Устанавливает приоритет нити.
public final int getPriority()
Позволяет узнать приоритет нити.
Значение параметра в методе setPriority не может произвольным. Оно должно находиться в пределах от MIN_PRIORITY до MAX_PRIORITY. При своем создании нить имеет приоритет NORM_PRIORITY.
MIN_PRIORITY = 1.
NORM_PRIORITY =5.
MAX_PRIORITY = 10.
2 Можно ли остановить нить, снизив ее приоритет до 0?
Ответ в статье: «Топ 50 вопросов на собеседовании. Тема: Многопоточность (Multithreading)»
На форуме нашел.
Есть вариант этой статьи на английском языке:
www.javacodegeeks.com/2014/07/top-50-java-thread-interview-questions-answers-for-freshers-experienced-programmers.html
Java предоставляет богатые API для всего, но, по иронии судьбы, не предоставляет удобных способов остановки нити. В JDK 1.0 было несколько управляющих методов, например stop(), suspend() и resume(), которые были помечены как deprecated в будущих релизах из-за потенциальных угроз взаимной блокировки, с тех пор разработчики Java API не предприняли попыток представить стойкий, ните-безопасный и элегантный способ остановки нитей. Программисты в основном полагаются на факт того, что нить останавливается сама, как только заканчивает выполнять методы run() или call(). Для остановки вручную, программисты пользуются преимуществом volatile boolean переменной и проверяют её значение в каждой итерации, если в методе run() есть циклы, или прерывают нити методом interrupt() для внезапной отмены заданий.
Конкретно по вопросу: Нигде не видел, чтобы кто — то приоритет выставлял в 0.
Если кто знает об этом что-нибудь, то напишите в комментариях.

3 Зачем нужен класс ThreadGroup?

ThreadGroup представляет собой набор нитей, которые так же могут содержать в себе другие группы потоков. Группа нитей образует дерево, в котором каждая другая группа нитей имеет родителя (кроме исходной). Поток имеет право доступа к данным из своей группы нитей, но не имеет такого доступа к другим группам или к родительской группе потоков.
4 В какой группе нитей состоит main-thread?
Нигде не нашел)) Подскажите где это есть))
5 Что такое паттерн ThreadPool?
На это есть выдержка из статьи на википедии:
In computer programming, the thread pool pattern (also replicated workers or worker-crew model) is where a number of threads are created to perform a number of tasks, which are usually organized in a queue. The results from the tasks being executed might also be placed in a queue, or the tasks might return no result (for example, if the task is for animation). Typically, there are many more tasks than threads. As soon as a thread completes its task, it will request the next task from the queue until all tasks have been completed. The thread can then terminate, or sleep until there are new tasks available.
The number of threads used is a parameter that can be tuned to provide the best performance. Additionally, the number of threads can be dynamic based on the number of waiting tasks. For example, a web server can add threads if numerous web page requests come in and can remove threads when those requests taper down. The cost of having a larger thread pool is increased resource usage. The algorithm used to determine when to create or destroy threads will have an impact on the overall performance:
— create too many threads, and resources are wasted and time also wasted creating any unused threads
— destroy too many threads and more time will be spent later creating them again
— creating threads too slowly might result in poor client performance (long wait times)
В компьютерном программировании есть модель пула потоков, где определенное число потоков создается для выполнения целого ряда задач, которые обычно организуются в очереди. Результаты от выполненных задач также могут быть помещены в очередь, либо задачи могут не возвращать никакого результата (например, если задача для анимации).
Как правило, существует гораздо больше задач, чем потоков. Как только поток завершит свою задачу, он будет запрашивать следующую задачу из очереди, пока все задачи не будут завершены. Поток может затем прерваться или заснуть. Количество используемых потоков, это параметр, который может быть настроен, для обеспечения наилучшей производительности. Кроме того, число потоков может быть динамическим на основе количества возникающих задач. Например, веб-сервер может добавлять потоки, если запросы многочисленных веб-страниц приходят и может удалить потоки, когда этих запросов становится меньше. С увеличением размера пула потоков увеличивается использование ресурсов компьютера. Алгоритм, используемый для определения того, когда создавать или уничтожать потоки, будет иметь влияние на общую производительность: — Создать слишком много потоков значит тратить ресурсы и время впустую.
— Уничтожить слишком много потоков и больше времени будет потрачено позже снова для их создания — Создание потоков слишком медленно, может привести к снижению производительности клиента.

6 Зачем нужен класс ThreadPoolExecutor?
public class ThreadPoolExecutor extends AbstractExecutorService
ExecutorService это выполняет каждую представленную задачу, используя один возможно из нескольких объединенных в пул потоков, обычно сконфигурированное использование Executors методы фабрики.
Пулы потоков рассматривают две различных проблемы: они обычно обеспечивают улучшенную производительность, выполняя большие количества асинхронных задач, из-за уменьшенных издержек вызова на задачу, и они обеспечивают средство ограничения и управления ресурсами, включая потоки, использованные, выполняя набор задач. Каждый ThreadPoolExecutor также поддерживает немного основной статистики, такой как число завершенных задач.
Чтобы быть полезным через широкий диапазон контекстов, этот класс обеспечивает много корректируемых параметров и рычагов расширяемости. Однако, программистов убеждают использовать более удобное Executors методы фабрики Executors.newCachedThreadPool() (неограниченный пул потоков, с автоматическим восстановлением потока), Executors.newFixedThreadPool(int) (пул потоков фиксированного размера) и Executors.newSingleThreadExecutor() (единственный фоновый поток), которые предварительно конфигурируют настройки для наиболее распространенных сценариев использования.

7 Сколько способов создать нить вы знаете?

На уровне языка есть два способа создания нити. Объект класса java.lang.Thread представляет собой нить, но ей требуется задача для исполнения, которая является объектом, реализующим интерфейс java.lang.Runnable. Так как класс Thread реализует интерфейс Runnable, вы можете переопределить метод run() унаследовав ваш класс от Thread или реализовав в нём интерфейс Runnable.

8 Для чего используется класс Future?

Future хранит результат асинхронного вычисления. Вы можете запустить вычисление, предоставив кому-либо объект Future, и забыть о нем. Владелец объекта Future может получить результат, когда он будет готов.
9 В чем преимущества Callable над Runnable?
Ссылка: www.ibm.com/developerworks/ru/library/l-java_universe_multithreading_tasks/index.html
Интерфейс Callable гораздо больше подходит для создания задач, предназначенных для параллельного выполнения, нежели интерфейс Runnable или тем более класс Thread. При этом стоит отметить, что возможность добавить подобный интерфейс появилась только начиная с версии Java 5, так как ключевая особенность интерфейса Callable – это использование параметризованных типов (generics), как показано в листинге.


Листинг Создание задачи с помощью интерфейса Callable
10	1 import java.util.concurrent.Callable;
11	2 public class CallableSample implements Callable<String>{
12	3     public String call() throws Exception {
13	4         if(какое-то условие) {
14	5             throw new IOException("error during task processing");
15	6         }
16	7         System.out.println("task is processing");
17	8         return "result ";
18	9     }
19	10 }


Сразу необходимо обратить внимание на строку 2, где указано, что интерфейс Callable является параметризованным, и его конкретная реализация – класс CallableSample, зависит от типа String. На строке 3 приведена сигнатура основного метода call в уже параметризованном варианте, так как в качестве типа возвращаемого значения также указан тип String. Фактически это означает, что была создана задача, результатом выполнения которой будет объект типа String (см. строку 8). Точно также можно создать задачу, в результате работы которой в методе call будет создаваться и возвращаться объект любого требуемого типа. Такое решение значительно удобнее по сравнению с методом run в интерфейсе Runnable, который не возвращает ничего (его возвращаемый тип –void) и поэтому приходится изобретать обходные пути, чтобы извлечь результат работы задачи.
Еще одно преимущество интерфейса Callable – это возможность «выбрасывать» исключительные ситуации, не оказывая влияния на другие выполняющиеся задачи. На строке 3 указано, что из метода может быть «выброшена» исключительная ситуация типа Exception, что фактически означает любую исключительную ситуацию, так как все исключения являются потомками java.lang.Exception. На строке 5 эта возможность используется для создания контролируемой (checked) исключительной ситуации типа IOException. Метод run интерфейса Runnable вообще не допускал выбрасывания контролируемых исключительных ситуаций, а выброс неконтролируемой (runtime) исключительной ситуации приводил к остановке потока и всего приложения.

10 Можно ли отменить выполнение задачи, если использовать класс Future?
Исходя из этой дискуссии, поднятой на хабре, выходит, что нельзя.
habrahabr.ru/post/133413/
У Future есть метод Future.cancel(boolean), который должен отменить выполнение задачи. Но если задача уже начала выполняться, вызов Future.cancel(true) на самом деле не остановит ее. В недрах реализацииFutureTask выполняется код:


if (mayInterruptIfRunning) {
Thread r = runner;
if (r != null)
r.interrupt(); }


Т.е. опять потоку, в котором выполняется задача, всего лишь рекомендуется прекратить выполнение. К тому же, мы не имеем даже возможности узнать выполняется ли задача в данный момент или нет. Есть, метод Future.isDone(), но опять мимо, он возвращает true не только когда задача завершила выполнение, а сразу после вызова Future.cancel(), даже если задача все еще выполняется (ведь Future.cancel(true) не останавливает задачу которая уже начала выполняться).

Хорошо, если мы сами пишем весь код, тогда можно в нужных местах аккуратно обрабатывать Thread.isInterrupted() и все будет ОК. Но если мы запускаем сторонний код? Если у нас есть сервер расширяемый с помощью плагинов? Какой-нибудь криво написанный плагин может запросто привести к неработоспособному состоянию весь сервер ведь мы не можем корректно прервать выполнение зависшего плагина.