← Назад к вопросам

Что решил поменять?

1.3 Junior🔥 162 комментариев
#Опыт и карьера

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Резюме моих изменений в подходе к разработке

За 10+ лет работы с PHP и backend-разработкой моя философия и практика существенно эволюционировали. Если ранние годы были посвящены освоению синтаксиса и базовых паттернов, то сейчас я сосредоточен на архитектуре, качестве кода и инструментах разработки, которые повышают надежность и эффективность проектов.

1. Переход от Procedural к Современной Объектно-Ориентированной и Функциональной Архитектуре

На ранних этапах я часто писал в смешанном стиле, где классы были просто "контейнерами" для функций. Сегодня я строго разделяю:

  • Слои приложения (Domain, Application, Infrastructure)
  • Чистые объекты предметной области (Domain Entities) с инкапсулированной бизнес-логикой
  • Сервисы как координаторы, не содержащие состояния

Пример старого стиля (которого я избегаю):

class UserHelper {
    public static function createUser($name, $email) {
        // ... валидация, сохранение в DB, отправка email — всё в одном методе
    }
}

Пример текущего, более декомпозированного стиля:

// Domain Entity с бизнес-правилами
class User {
    private string $name;
    private Email $email;

    public function __construct(string $name, Email $email) {
        // Валидация внутри объекта или Value Object Email
        $this->name = $name;
        $this->email = $email;
    }
}

// Сервис уровня приложения (Application Service)
class UserRegistrationService {
    private UserRepository $repository;
    private EventDispatcher $dispatcher;

    public function register(User $user): void {
        $this->repository->save($user);
        $this->dispatcher->dispatch(new UserRegisteredEvent($user));
    }
}

2. Принятие принципов SOLID, DDD (Domain-Driven Design) и Clean Architecture

Я осознал, что сложность проекта управляется через:

  • Инверсию зависимостей (Dependency Inversion) — зависимости направлены на абстракции.
  • Явное разделение ответственности — один класс, одна причина для изменения.
  • Фокусировку на Core Domain — вместо попыток сделать "идеальный универсальный код".

Это выражается в использовании:

  • Интерфейсов (Contracts) для определения поведения.
  • Внедрения зависимостей (DI) через контейнер (например, Symfony DI или Laravel Service Container).
  • Value Objects для описания сложных атрибутов (Email, Money, Address).
// Интерфейс репозитория в Domain слое
interface UserRepositoryInterface {
    public function save(User $user): void;
    public function findByEmail(Email $email): ?User;
}

// Реализация в Infrastructure слое (Adapter)
class DoctrineUserRepository implements UserRepositoryInterface {
    // ... реализация с использованием Doctrine ORM
}

3. Сдвиг от "Работает" к "Надежно и тестируемо"

Тестирование стало не дополнительной задачей, а интегрированной частью процесса разработки. Я поменял подход:

  • TDD (Test-Driven Development) для критической бизнес-логики.
  • Многоуровневое тестирование: Unit (бизнес-правила), Integration (репозитории, внешние сервисы), Functional (API endpoints).
  • Автоматизация через CI/CD (GitHub Actions, GitLab CI).
// Пример Unit-теста для Domain Entity
class UserTest extends TestCase {
    public function test_email_must_be_valid(): void {
        $this->expectException(InvalidArgumentException::class);
        new User('John', 'invalid-email');
    }

    public function test_user_can_change_name(): void {
        $user = new User('OldName', new Email('test@example.com'));
        $user->changeName('NewName');
        $this->assertEquals('NewName', $user->getName());
    }
}

4. Уход от "Монолитного" мышления к осознанному использованию Микросервисов и Event-Driven Architecture

Для сложных систем я теперь предпочитаю:

  • Асинхронную коммуникацию через события (Events) и сообщения (Messages).
  • Отдельные сервисы для независимых бизнес-контекстов (Bounded Contexts).
  • Инструменты вроде Symfony Messenger, RabbitMQ, или асинхронных обработчиков в Laravel.
// Вместо прямого вызова сервиса в другом модуле
$paymentService->process($order); // Старый, синхронный, тесный coupling

// Новый подход: публикация события
$this->eventBus->dispatch(new OrderPlacedEvent($order));
// Сервис оплаты слушает это событие независимо

5. Увеличение внимания к Производительности, Безопасности и Observability

  • Производительность: анализ через профилировщики (Blackfire, Tideways), оптимизация запросов, стратегическое кэширование.
  • Безопасность: автоматический аудит зависимостей (sensiolabs/security-checker), валидация входных данных на всех уровнях, принцип наименьших привилегий.
  • Observability: централизованное логирование (Monolog + ELK/ Grafana Loki), трассировка (OpenTelemetry), метрики (Prometheus).

6. Эволюция инструментов и процессов

  • Раньше: SVN, FTP-деплой, ручные тесты.
  • Сейчас: Git с четкой стратегией ветвления (GitFlow или Trunk-Based), автоматизированные пайплайны деплоя, строгие стандарты кода через PHP_CodeSniffer и PHPStan (до уровня 8), статический анализ для предотвращения багов.

Итог: Мои изменения направлены на создание поддерживаемых, адаптируемых и безопасных систем, где код является не просто набором инструкций, а точным отражением бизнес-процессов и надежной основой для развития продукта. Я перешел от решения непосредственных задач к построению архитектуры, которая минимизирует долгосрочные затраты и риски.

Что решил поменять? | PrepBro