В чем архитектурная разница между «толстым» (fat) и «тонким» (thin) клиентом?

«В чем архитектурная разница между «толстым» (fat) и «тонким» (thin) клиентом?» — вопрос из категории Архитектура, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Характеристика Толстый клиент (Fat / Rich Client) Тонкий клиент (Thin Client)
Логика приложения Основная бизнес-логика и логика представления данных выполняются на стороне клиента. Клиент отвечает только за отображение (Presentation Layer). Вся бизнес-логика и обработка данных — на сервере.
Зависимость от сервера Низкая. Может работать автономно или обмениваться с сервером только данными. Полная. Клиент — это, по сути, «терминал» для отображения UI, получаемого с сервера.
Примеры Десктопные приложения (Adobe Photoshop, игры), традиционные клиент-серверные системы (1С), некоторые нативные мобильные приложения. Классические веб-приложения (сайты, где рендеринг HTML происходит на сервере — SSR), терминальные службы (Citrix, RDP).
Сетевое взаимодействие Периодическое, часто для синхронизации данных. Меньше запросов, но с большими объемами данных. Постоянное. Много запросов (HTTP) к серверу для любого действия. Данные передаются в структурированном виде (JSON/XML).
Требования к клиенту Высокие: требуется установка, обновления, достаточные вычислительные ресурсы (CPU, RAM). Низкие: достаточно современного браузера. Нет необходимости в установке.

Пример кода:

// ТОНКИЙ КЛИЕНТ: Браузер лишь отображает данные и отправляет запросы.
// Вся логика (аутентификация, расчеты) — на сервере.
async function submitOrder(orderData) {
  // Клиент только отправляет сырые данные
  const response = await fetch('/api/orders', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(orderData) // Данные для обработки на сервере
  });
  const result = await response.json(); // Получение готового результата
  displayOrderConfirmation(result);
}
// ТОЛСТИЙ КЛИЕНТ: Десктоп-приложение (упрощенный пример).
// Большая часть логики (проверка, форматирование, расчет) выполняется локально.
public class OrderProcessor {
    public Order calculateTotal(Order order) {
        // Локальный расчет скидок и налогов
        double discount = applyCustomerDiscount(order.getCustomerId(), order.getSubtotal());
        double tax = calculateLocalTax(order.getSubtotal() - discount);
        order.setTotal(order.getSubtotal() - discount + tax);
        // Только затем отправка итога на сервер для сохранения
        apiClient.sendOrder(order);
        return order;
    }
    // ... локальные методы расчета ...
}

Современный контекст: Понятие «умный клиент» (Smart Client) или SPA (Single Page Application) находится посередине: клиент (браузер) выполняет сложную логику UI и роутинга, но бизнес-логика и хранение данных остаются на сервере (Backend as a Service / API).