Merging или Rebasing?

Команда git rebase имеет репутацию магической команды Git, от которой начинающие должны держаться подальше, но в действительности она может сделать жизнь намного легче для команды разработчиков, когда используется с осторожностью. В этой статье, мы сравним git rebase с родственной командой git merge и определим все потенциальные возможности для использования перемещения (rebasing) в типичном рабочем процессе работы с Git.

Концептуальный обзор

Первую вещь, которую нужно понять о команде git rebase заключается в том, что она решает ту же самую проблему, что и git merge. Обе эти команды предназначены для внесения изменений из одной ветки в другую – правда они выполняют это абсолютно разными способами.
Продолжить чтение “Merging или Rebasing?”

Объяснение архитектуры JVM

Каждый разработчик Java знает, что байткод выполняется при помощи JRE (Java Runtime Environment). Но многие не знают того факта, что JRE это имплементация виртуальной машины Java (JVM), которая анализирует, интерпретирует и исполняет байткод. Для разработчика очень важно знать архитектуру виртуальной машины Java, т.к. это позволяет нам писать код более эффективно. В данной статье мы изучим глубины архитектуры JVM и различные компоненты виртуальной машины.

Что такое JVM?

Виртуальная машина — это программная имплементация реальной машины. При разработке Java использовалась концепция WORA (Write Once Run Anywere) – пиши однажды, запускай везде, которая используется в виртуальной машине. Компилятор компилирует файлы Java в файлы .class, затем данные файлы являются входом для виртуальной машины JVM, которая загружает и исполняет .class файл. Ниже вы можете видеть архитектуру виртуальной машины JVM.

Диаграмма архитектуры JVM

Продолжить чтение “Объяснение архитектуры JVM”

Выразительный код с Java Optionals

Каждый из нас, кто программировал на языках, которые позволяют ссылаться на null, знает, что произойдет, когда вы попытаетесь получить значение подобной переменной. Независимо от того, будет ли это segfault или появление NullPointerException, это всегда является ошибкой. Tony Hoare описал это поведение как ошибку на один миллиард долларов (https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare). Обычно проблема появляется тогда, когда функция возвращает ссылку на null клиенту, в то время как это совсем не ожидалось разработчиком клиента. Скажем, в коде подобном такому:

User user = userRepository.find("Alice");

Сообразительный программист сразу подумает о том, что должно произойти, когда мы не найдем пользователя с именем «Alice», однако в самой сигнатуре метода find() так ничего и не будет говорить, что подобное поведение возможно. Типичное решение в мире Java в прошлом заключалось бы в том, что метод выбрасывал бы проверяемое исключение, например UserNotFoundException, которое определённо бы говорило разработчику клиента, что подобное поведение возможно, однако никаким образом не улучшало бы выразительность кода. Отлов исключений в коде мешает его пониманию. Также следует заметить, что работа с проверяемыми исключениями больше не в почёте, и люди больше не стремятся писать код, который бы выбрасывал их.
Продолжить чтение “Выразительный код с Java Optionals”