Перейти к основному содержимому

1.19. Установка, изменение и обновление

Всем

Установка, изменение и обновление

Изменение и модификация

Программы не всегда постоянны, они регулярно изменяются и улучшаются. Каждое изменение порождает новую программу по схеме:

Программа + изменение = Изменённая программа.

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

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

Изменение может быть нескольких видов:

  • функциональное - добавили кнопку «скачать»;
  • исправление ошибки (багфиксы);
  • оптимизация - ускорили загрузку;
  • рефакторинг - переписали код для лучшей читаемости;
  • косметическое - изменение внешнего интерфейса;
  • удаление функций.

Любое изменение программы фиксируется, классифицируется и документируется. Это позволяет отслеживать эволюцию, оценивать риски и управлять релизами.

1. Функциональное изменение

Добавление новой возможности, расширяющей поведение программы.

Примеры:

  • Добавлена кнопка «Скачать как PDF» в интерфейсе отчётов,
  • Реализована поддержка двухфакторной аутентификации через TOTP,
  • Добавлен экспорт данных в формате CSV.

Особенности:

  • Требует проектирования, тестирования, документирования,
  • Может влиять на интерфейс API или пользовательский интерфейс,
  • Часто сопровождается новыми зависимостями (библиотеками),
  • Фиксируется как MINOR-версия в SemVer (например, 1.2.01.3.0).

2. Исправление ошибки (багфикс)

Устранение некорректного поведения при сохранении внешнего контракта.

Примеры:

  • Исправлена ошибка округления при расчёте итоговой суммы заказа,
  • Устранено падение приложения при вводе кириллицы в поле «Логин»,
  • Починена утечка памяти в цикле обработки входящих сообщений.

Особенности:

  • Не добавляет новые функции, не удаляет старые,
  • Цель — восстановить заявленное поведение,
  • Часто сопровождается добавлением тестов, чтобы ошибка не вернулась,
  • Фиксируется как PATCH-версия (например, 2.1.32.1.4).

3. Оптимизация

Улучшение производительности, потребления ресурсов или масштабируемости без изменения функциональности.

Примеры:

  • Ускорена загрузка главной страницы с 3.2 с до 0.8 с за счёт кэширования данных,
  • Снижено потребление памяти на 40% при обработке больших файлов,
  • Увеличена пропускная способность API с 500 до 3000 запросов/сек.

Особенности:

  • Внешнее поведение не меняется — те же входы → те же выходы,
  • Может потребовать изменения архитектуры (переход на асинхронность, пул соединений),
  • Требует замеров до/после (бенчмаркинг),
  • Может быть PATCH или MINOR — в зависимости от глубины изменений.

4. Рефакторинг

Перестройка внутренней структуры кода для улучшения читаемости, поддерживаемости и расширяемости.

Примеры:

  • Замена 200-строчного метода processOrder() на 5 маленьких функций с говорящими именами,
  • Выделение работы с базой данных в отдельный класс UserRepository,
  • Внедрение зависимостей вместо прямого создания объектов (new Database()inject(db)).

Особенности:

  • Поведение программы не должно измениться — все тесты проходят как раньше,
  • Цель — уменьшить технический долг,
  • Часто предшествует крупным изменениям («расчистка места»),
  • Обычно не влияет на номер версии (фиксируется в changelog как «internal»).

5. Косметическое изменение

Модификация внешнего вида без влияния на логику.

Примеры:

  • Изменение цветовой схемы с синей на тёмно-серую,
  • Замена иконки «Корзина» на более современную,
  • Выравнивание полей формы по сетке.

Особенности:

  • Может требовать согласования с дизайнерами и юзер-тестов,
  • Нередко сопровождается изменением CSS, SVG, шрифтов,
  • Редко влияет на функциональные тесты, но требует визуального контроля (visual regression testing),
  • Обычно не ведёт к повышению версии, но может быть частью MINOR-релиза.

6. Удаление функций

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

Примеры:

  • Удалён устаревший API-метод /v1/old-login, оставлен только /v2/auth,
  • Убрана поддержка Internet Explorer 11,
  • Отключена экспериментальная функция «Авто-перевод», не набравшая популярности.

Особенности:

  • Требует предупреждения пользователей (deprecation notice),
  • Часто сопровождается миграционными скриптами или адаптерами,
  • Является ломающим изменением — фиксируется как MAJOR-версия (например, 3.9.24.0.0),
  • Документируется в changelog с указанием альтернатив.

Каждый тип изменения имеет свою роль в жизненном цикле программы. Грамотное управление ими — основа зрелой разработки.


Версионность

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

Версия — это уникальный идентификатор состояния программы на определённый момент времени. Пример - v1.0.0.

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

Самый распространённый стандарт — семантическое версионирование (SemVer, Semantic Versioning).

Формат:

MAJOR.MINOR.PATCH
  • MAJOR (мажор) - основная версия, при несовместимых изменениях (ломающие обновления);
  • MINOR (минор) - дополнительная функциональность, при обратно совместимых улучшениях;
  • PATCH - поправки, при исправлениях ошибок, без новых фич.

К примеру, 2.0.0 — полностью переписали интерфейс, старые плагины больше не работают. Но часто в современности можно встретить, что мажорные версии меняют для маркетинговых целей, чтобы показать «масштабность» обновления.

Чтобы управлять изменениями, используются системы контроля версий — например, Git. Мы ещё о них много будем говорить. Такая система хранит все версии кода, позволяет сравнивать изменения, поддерживать работу нескольких разработчиков, позволяет откатиться к любой версии и вести историю изменений - когда, кто и что изменил.

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

  • Добавление - что-то новое;
  • Изменение - модификация существующего;
  • Удаление - убираем существующее;
  • Переименование или рефакторинг - изменение структуры;
  • Исправление - устранение ошибок.

Каждое из этих действий фиксируется как коммит в системе контроля версий и вносит вклад в следующую версию.


Патч и обновление

Патч – маленькое обновление, которое может относиться как к модификации, так и к обновлению.

Обновление – термин близкий к модификации, но отличается, в основном, масштабом и самим процессом. К примеру, процесс обновления ПО может включать в себя изменение существующей версии ПО путем установки поверх неё модифицированной версии. Пример – обновление Windows, Chrome – когда разработчики подготовили изменения, выгрузили в виде пакета (патча), а мы загружаем и устанавливаем новую версию программы поверх предыдущей.

Особенности патча:

  • Малый объём: может содержать изменения всего в нескольких строках кода или конфигурации,
  • Высокая специфичность: исправляет одну уязвимость, один баг или одну неточность,
  • Срочность выпуска: патчи безопасности (security patches) часто выпускаются в течение часов после обнаружения угрозы,
  • Минимальное тестирование: проверяется только затронутый сценарий, чтобы ускорить доставку,
  • Формат доставки:
    .diff / .patch — текстовый файл с инструкциями diff (+ и -),
    — бинарный дельта-патч — разница между двумя версиями исполняемого файла (экономия трафика),
    — hotfix-сборка — отдельный мини-релиз (например, v2.1.3-hotfix1).

Примеры патчей:

  • Уязвимость Log4Shell (CVE-2021-44228): патч отключил интерпретацию JNDI в строках логирования. Обновление log4j-core с 2.14.12.15.0 состояло из нескольких строк кода, но предотвратило удалённое выполнение кода.
  • Исправление времени в Excel 1900 года: патч сохранил ошибку совместимости (1900 високосный), но документировал её — чтобы формулы не ломались.
  • Hotfix для игры: патч исправил краш при запуске миссии «Склад-7», не затрагивая остальной баланс.

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

Особенности обновления:

  • Сборка из множества изменений: включает багфиксы, оптимизации, новые функции, рефакторинги,
  • Планируемый цикл: регулярные релизы — еженедельные (микрообновления), ежеквартальные (minor), ежегодные (major),
  • Полный тестовый цикл: регрессионное тестирование, нагрузочные пробы, юзер-тесты,
  • Сопровождающая документация:
    CHANGELOG.md — список изменений,
    UPGRADE.md — инструкции по миграции,
    — release notes — описание для конечных пользователей.

Виды обновлений:

ТипЦельПример
ИнкрементальноеМелкие улучшения без нарушения совместимостиv1.2.4v1.2.5 (только багфиксы)
Фича-обновлениеДобавление функций в рамках текущей архитектурыv2.1.0v2.2.0 (добавлен dark mode)
Мажорное обновлениеКардинальные изменения: API, архитектура, форматыv3.9.2v4.0.0 (переход с REST на GraphQL)
ПринудительноеТребуется для продолжения работы (часто — безопасность)Обновление TLS-библиотеки до версии с поддержкой TLS 1.3
ОпциональноеНовые возможности, не критичные для базовой работыДобавление поддержки нового формата файлов

Механизмы доставки обновлений:

  • Автоматическое фоновое — браузеры (Chrome), мессенджеры (Telegram), ОС (Windows Update),
  • По запросу — пользователь нажимает «Обновить» в интерфейсе,
  • Ручное — скачивание установщика с сайта и запуск,
  • Корпоративное — развёртывание через групповые политики (GPO), MDM, Ansible.

Особые случаи:

  • Роллбэк — откат к предыдущей версии при обнаружении критического бага в новом релизе,
  • Канареечное развёртывание — обновление сначала 1% пользователей, затем 5%, затем 100%,
  • Feature flags — новые функции уже в коде, но скрыты за флагами; включаются без нового обновления.

Установка

Установка – процесс копирования файлов на жёсткий диск, добавления настроек в реестр и создания ярлыков – словом, всех действий, требуемых для обеспечения запуска. Часто установка происходит автоматически, через специальную программу – установщик, которая производит и копирование, и настройку согласно своему алгоритму.

Установка преобразует программу из поставляемого артефакта (архив, образ, пакет) в рабочее состояние.

Этапы установки:

ЭтапДействияПримеры
1. Проверка требованийАнализ ОС, версии, архитектуры, свободного места, зависимостейУстановщик проверяет: Windows 10+, x64, 4 ГБ RAM, .NET Runtime 6.0
2. Распаковка файловКопирование исполняемых файлов, библиотек, ресурсов.exe, .dll, icons/, lang/ru.jsonC:\Program Files\App\
3. Настройка окруженияСоздание ярлыков, запись в PATH, регистрация типов файловЯрлык на рабочем столе; assoc .xyz=MyApp в Windows
4. Работа с реестром / конфигамиСохранение путей, лицензий, настроек по умолчаниюВетка HKEY_LOCAL_MACHINE\SOFTWARE\MyApp; файл config.defaults.json
5. Установка зависимостейЗагрузка и развёртывание runtime’ов, библиотекУстановка Visual C++ Redistributable, JRE, .NET Desktop Runtime
6. Регистрация службНастройка автозапуска фоновых компонентовsc create MyAppService binPath=... → служба в services.msc
7. Первичная инициализацияГенерация ключей, создание БД, настройка правCREATE DATABASE app_db; mkdir %APPDATA%\MyApp\cache
8. Финальная проверкаЗапуск self-test, проверка целостностиХеш-суммы файлов; app.exe --self-test

Типы установщиков:

ТипОписаниеПлюсы / Минусы
Инсталляторы «всё в одном» (Inno Setup, NSIS, WiX)Самораспаковывающийся .exe, содержит все файлы и логику+ Полный контроль, + Работает без интернета – Большой размер, – Сложность поддержки
Пакетные менеджеры ОС (apt, dnf, winget, choco)Установка через команду: apt install firefox+ Зависимости разрешаются автоматически + Обновления централизованы – Требует прав администратора, – Версии могут отставать
Портативные приложения (PortableApps)Распаковка архива → запуск .exe без установки+ Нет следов в системе, + Можно носить на флешке – Нет интеграции (ярлыки, ассоциации), – Ручное обновление
Веб-инсталляторыМаленький загрузчик → скачивает основное тело онлайн+ Быстрый старт, + Всегда актуальная версия – Требует интернета, – Риск MITM-атак без подписи
Контейнеры (Docker)docker run -p 8080:80 nginx — мгновенный запуск изолированного образа+ Полная изоляция, + Идемпотентность – Требует Docker, – Сложнее для новичков

Особенности установки на разных платформах:

  • Windows:
    — Централизованное хранение в Program Files,
    — Реестр как единое хранилище настроек,
    — UAC — контроль учётных записей для защиты от вредоносных действий,
    — MSI — стандарт корпоративного развёртывания (тихая установка, откат, аудит).

  • Linux:
    — Файлы распределяются по ФС: /bin, /lib, /etc, /var/log,
    — Зависимости строго контролируются (dpkg -l, rpm -qa),
    — Flatpak / Snap — sandbox’ы для изоляции приложений от системы,
    — AppImage — portable-аналог для Linux.

  • macOS:
    — Приложения — это папки .app, перетаскиваемые в /Applications,
    — Gatekeeper — проверка подписи разработчика,
    — Notarization — дополнительная проверка Apple,
    — Homebrew — популярный менеджер пакетов для разработчиков.

Проблемы при установке и их решения:

ПроблемаПричинаРешение
«Требуется более новая версия Windows»Проверка манифеста исполняемого файлаОбновление ОС или запуск в режиме совместимости
«Отсутствует VCRUNTIME140.dll»Не установлен Visual C++ RedistributableСкачать и установить с сайта Microsoft
«Доступ запрещён»Антивирус или политикой блокируется записьДобавить исключение или запустить от имени администратора
«Повреждённый установочный файл»Обрыв загрузки, битый архивПроверить хеш (sha256sum), перекачать
«Конфликт с уже установленной версией»Старые файлы мешают новымУдалить старую версию через «Программы и компоненты»

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


Написание кода

Так, программирование — это процесс создания программы, написания кода. Как же пишут код?

Код пишут по определённому порядку, и в зависимости от особенностей подхода, различают виды программирования:

  • Императивное (шаг за шагом) – C, Python – программист даёт чёткие команды – «Сделай раз, сделай два»;
  • Функциональное (через функции) – набор формул (функций), можно к ним отнести чистые вычисления, арифметику и тому подобное. Здесь нет циклов, а функции не меняют внешние данные. Используется в математике и является наиболее сложным.
  • ООП (объекты и классы) – Java, C# - современное программирование, когда всё представлено в виде объектов со свойствами и действиями. ООП мы посвятим отдельную главу и очень много будем о нём говорить – это важнейшая часть.

Функциональное программирование – стиль программирования, где программа строится из функций, не изменяющих исходные данные, а возвращающих новые. Представим, что программа – конвейер, где функции – станки, которые берут входные данные (сырье) и выдают результат (продукт), но при этом сырьё не испортится (исходные данные не изменяются, так как работа велась с их копиями). ФП применяется в обработке данных (анализ логов, Big Data), фронтенде (React, Redux), бэкенде (Elixir, Haskell), и в научных вычислениях, математических моделях. В повседневности примеры чистых функций – в Excel, формулы вроде =СУММ(A1:A10) – не меняют данные, но дают результат.

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

Но программирование не всегда связано с компьютером в классическом понимании. Все электронные устройства программируются, в том числе – стиральные машины, микроволновки, роутеры, медицинские приборы. Оно может происходить через встроенное ПО (Firmware), вшитое в устройство, либо через внутрисхемное программирование (ISP), когда программа загружается в микросхему прямо в устройстве через специальные контакты. Для таких процедур используется специальное оборудование – программатор и отладочная плата. Именно так подключают устройство к микроконтроллеру и загружают прошивку через специальное ПО. Но погружаться в это мы не будем, фактически, это уже глубокая техническая инженерия, а не «айти» в том понимании, в котором мы к нему идём.

В некоторых ситуациях программа должна работать автоматически, сама запускать определённые процедуры, в соответствии с алгоритмом или расписанием – это бот. Ботом называют виртуального робота или искусственный интеллект, который функционирует на основе специальных алгоритмов. Это помогает автоматизировать рутинные, однообразные и повторяемые задачи, избежав ручного труда, а зачастую и применимы для ситуаций, когда требуется более быстрая реакция (игровые боты, аукционные боты). Бот – тот же робот, а робот не всегда «механическое устройство», ботом является именно программа или функция программы.