View on GitHub

java-interview

Вопросы для собеседования на разработчика Java

Вопросы для собеседования

Настройка окружения

Сравните ОС Windows и Linux

Linux — семейство Unix-подобных операционных систем на базе ядра Linux. Основные особенности:

Windows — проприетарная операционная система от Microsoft. Основные особенности:

Для разработки Java-приложений обе ОС подходят, однако Linux предпочтительнее для деплоя, так как большинство серверов работают именно на Linux.

к оглавлению

Что такой bash?

Bash (Bourne Again SHell) — это командная оболочка (shell) и язык командного сценария, являющийся стандартной оболочкой для большинства Linux-дистрибутивов и macOS (до версии Catalina).

Основные возможности:

к оглавлению

С помощью каких bash-команд посмотреть доступные ресурсы?

к оглавлению

Что такое Docker-контейнер?

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

Преимущества Docker-контейнеров:

Основные понятия:

к оглавлению

Как работает Ansible?

Ansible — это инструмент для управления конфигурациями и оркестрации, работающий по модели agentless (не требует установки агентов на управляемые узлы).

Принцип работы:

  1. Ansible подключается к управляемым узлам по SSH
  2. Отправляет Python-скрипты (модули) на узлы
  3. Выполняет их и получает результат
  4. После выполнения скрипты удаляются

Основные компоненты:

Преимущества Ansible:

к оглавлению

Что такое виртуальная машина?

Виртуальная машина (VM) — это эмулированный компьютер, который работает на основе аппаратных ресурсов физического компьютера и ведёт себя как самостоятельная система.

Основные компоненты:

Преимущества:

Недостатки:

к оглавлению

В чём разница между виртуальной машиной и Docker-контейнером?

Характеристика Виртуальная машина Docker-контейнер
Размер Гигабайты (полная ОС) Мегабайты (только зависимости)
Запуск Минуты Секунды
Ресурсы Тяжёлые (своя ОС) Лёгкие (общее ядро)
Изоляция Полная (аппаратная) Процессная (namespaces, cgroups)
Производительность Небольшой оверхед Практически нативная
Количество на сервере Единицы Сотни
ОС Каждая VM — своя ОС Все контейнеры — одна ОС

к оглавлению

Что такое переменные окружения?

Переменные окружения (environment variables) — это именованные значения, которые влияют на поведение процессов и программ в операционной системе.

Типичные примеры:

Использование в bash:

# Установка переменной
export MY_VAR="value"

# Чтение переменной
echo $MY_VAR

# Проверка существования
echo ${MY_VAR:-default}

к оглавлению

Как настроить переменные окружения в Linux?

Способы настройки:

  1. Временная настройка (действует до закрытия сессии):
    export JAVA_HOME=/usr/lib/jvm/java-11
    
  2. Для текущего пользователя (файл ~/.bashrc или ~/.bash_profile):
    echo 'export JAVA_HOME=/usr/lib/jvm/java-11' >> ~/.bashrc
    source ~/.bashrc
    
  3. Для всех пользователей (файл /etc/environment или /etc/profile.d/custom.sh):
    echo 'JAVA_HOME=/usr/lib/jvm/java-11' | sudo tee /etc/environment
    
  4. Через systemd-сервис (файл /etc/systemd/system/myapp.service):
    [Service]
    Environment=JAVA_HOME=/usr/lib/jvm/java-11
    

к оглавлению

Что такое .bashrc и .profile? В чём разница?

.bashrc — конфигурационный файл bash для интерактивных non-login оболочек.

.profile (или ~/.bash_profile) — конфигурационный файл для login оболочек.

Разница:

Рекомендуемая практика: в .profile загружать переменные окружения, а в .bashrc — алиасы и настройки. В .profile добавлять source ~/.bashrc для загрузки обоих файлов.

к оглавлению

Что такое systemd?

systemd — это системный и сервис-менеджер для Linux, который запускается с самым первым PID (1) и управляет всеми остальными процессами.

Основные возможности:

Основные команды:

# Управление службами
sudo systemctl start nginx      # запустить службу
sudo systemctl stop nginx       # остановить службу
sudo systemctl restart nginx    # перезапустить службу
sudo systemctl enable nginx     # включить автозапуск
sudo systemctl status nginx     # статус службы

# Просмотр логов
sudo journalctl -u nginx        # логи службы
sudo journalctl -f              # отслеживание логов в реальном времени

Файлы служб находятся в /etc/systemd/system/ или /lib/systemd/system/.

к оглавлению

Как посмотреть логи в Linux?

Основные способы:

  1. journalctl (для systemd-систем):
    sudo journalctl -u nginx        # логи службы nginx
    sudo journalctl -f              # отслеживание в реальном времени
    sudo journalctl --since today   # логи за сегодня
    sudo journalctl -p err          # только ошибки
    
  2. Файлы в /var/log/
    cat /var/log/syslog             # системный журнал (Debian/Ubuntu)
    cat /var/log/messages           # системный журнал (RHEL/CentOS)
    cat /var/log/auth.log           # логи аутентификации
    tail -f /var/log/syslog         # отслеживание в реальном времени
    
  3. dmesg — сообщения ядра:
    dmesg | tail                    # последние сообщения ядра
    dmesg -H                        # человекочитаемый формат
    
  4. lsof — открытые файлы:
    sudo lsof /var/log/syslog       # кто использует файл лога
    

к оглавлению

Что такое порт? Какие диапазоны портов существуют?

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

Диапазоны портов:

Просмотр портов:

sudo netstat -tlnp              # прослушиваемые порты (старый)
sudo ss -tlnp                   # прослушиваемые порты (новый)
lsof -i :80                     # процессы на порту 80

к оглавлению

Что такое SSH и как он работает?

SSH (Secure Shell) — криптографический сетевой протокол для безопасного удалённого администрирования и передачи файлов.

Принцип работы:

  1. Клиент подключается к серверу (по умолчанию порт 22)
  2. Сервер отправляет свой публичный ключ
  3. Клиент проверяет отпечаток ключа (first-time connection)
  4. Устанавливается защищённое соединение с использованием симметричного шифрования

Методы аутентификации:

Основные команды:

ssh user@host                   # подключение к серверу
ssh -p 2222 user@host           # подключение на нестандартный порт
ssh-keygen -t rsa -b 4096       # генерация SSH-ключа
scp file user@host:/path        # копирование файлов
rsync -avz local/ user@host:/remote/  # синхронизация

к оглавлению

Что такое chmod и как он работает?

chmod (change mode) — команда для изменения прав доступа к файлам и директориям в Linux.

Типы прав:

Способы изменения прав:

  1. Символьный способ:
    chmod u+x script.sh             # добавить право выполнения для владельца
    chmod go-w file.txt             # убрать право записи для группы и остальных
    chmod a+r file.txt              # добавить чтение для всех
    

    Где: u — владелец, g — группа, o — остальные, a — все

  2. Числовой способ:
    chmod 755 script.sh             # владелец: rwx, группа: r-x, остальные: r-x
    chmod 644 file.txt              # владелец: rw-, группа: r--, остальные: r--
    chmod 600 .ssh/id_rsa           # только владелец: rw-
    

Цифры: r=4, w=2, x=1. Сумма даёт нужный режим (7=rwx, 6=rw-, 5=r-x, 4=r–, 0=—).

к оглавлению

Как установить Java в Linux?

Способы установки Java:

  1. Через пакетный менеджер (Ubuntu/Debian):
    sudo apt update
    sudo apt install openjdk-17-jdk
    sudo apt install openjdk-17-jre
    
  2. Через пакетный менеджер (RHEL/CentOS/Fedora):
    sudo yum install java-17-openjdk-devel
    # или
    sudo dnf install java-17-openjdk-devel
    
  3. Ручная установка:
    # Скачивание JDK с сайта Oracle или Adoptium
    wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.8%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.8_7.tar.gz
    sudo tar -xzf jdk-*.tar.gz -C /opt/
    export JAVA_HOME=/opt/jdk-17
    export PATH=$JAVA_HOME/bin:$PATH
    
  4. Через update-alternatives (управление версиями):
    sudo update-alternatives --config java
    

Проверка установки:

java -version
javac -version
echo $JAVA_HOME

к оглавлению

Что такое PATH?

PATH — это переменная окружения, которая содержит список директорий, в которых операционная система ищет исполняемые файлы при вводе команд в терминале.

Просмотр и использование:

echo $PATH                    # показать текущий PATH
which java                    # показать путь к исполняемому файлу
type -a java                  # показать все найденные версии

Пример содержимого PATH:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Добавление своего пути:

export PATH=$PATH:/opt/myapp/bin
# или для постоянной настройки:
echo 'export PATH=$PATH:/opt/myapp/bin' >> ~/.bashrc

При поиске исполняемого файла система перебирает директории из PATH слева направо и использует первую найденную.

к оглавлению

Вопросы для собеседования