Phong trào 0deps: Phụ thuộc cục bộ và Hợp đồng bất biến

Các nhà phát triển phần mềm thường cài đặt hàng trăm thư viện bên ngoài. Các framework hiện đại dựa vào hàng ngàn phụ thuộc bắc cầu (transitive dependencies). Điều này có nghĩa là ứng dụng của bạn đang chạy mã nguồn từ những người lạ.

Điều này tạo ra rủi ro cho chuỗi cung ứng phần mềm.

Mỗi phụ thuộc đều làm tăng bề mặt tấn công (attack surface) của bạn. Nó có thể:

  • Gây ra các lỗ hổng bảo mật.
  • Trở thành mục tiêu của các cuộc tấn công chuỗi cung ứng.
  • Bị những người duy trì (maintainers) bỏ rơi.
  • Thay đổi API công khai.
  • Làm mất tính tương thích ngược.

Phong trào 0deps đặt ra một câu hỏi đơn giản: Chuyện gì sẽ xảy ra nếu ứng dụng của bạn chỉ dựa vào mã nguồn mà bạn kiểm soát?

Trong mô hình 0deps, bạn nhúng trực tiếp các phụ thuộc cần thiết vào kho lưu trữ (repository) dự án của mình. Bạn ngừng việc tải chúng một cách linh động trong quá trình build. Mọi thứ cần thiết để chạy ứng dụng đều nằm sẵn trong repo ngay từ đầu.

Cách tiếp cận này mang lại:

  • Khả năng build có thể tái lập (reproducible builds).
  • Giảm sự phụ thuộc vào các registry bên ngoài.
  • Kiểm tra bảo mật tập trung.
  • Khả năng dự đoán cao hơn.

Nguyên tắc cốt lõi không phải là giữ cho mã nguồn đứng yên. Các phần triển khai (implementations) và thuật toán phải tiến hóa để sửa lỗi và cải thiện bảo mật. Thứ duy nhất giữ được sự ổn định chính là hợp đồng công khai (public contract).

Mỗi thư viện cung cấp một giao diện (interface) được thiết kế cẩn thận. Các ví dụ bao gồm:

  • authenticate()
  • createSession()
  • verifyPasskey()

Các hàm này định nghĩa một hợp đồng. Hợp đồng này không bao giờ thay đổi. Bạn có thể viết lại mã nguồn đằng sau nó hoặc thay thế hoàn toàn thư viện đó. Phần còn lại của ứng dụng sẽ không nhận thấy sự thay đổi này.

Khi một lỗ hổng xuất hiện, bạn thường đối mặt với hai vấn đề:

  1. Sửa lỗi.
  2. Kiểm tra xem bản cập nhật có làm hỏng ứng dụng của bạn hay không.

Trong kiến trúc 0deps, vấn đề thứ hai sẽ biến mất. Bạn cập nhật phần triển khai nội bộ trong khi API công khai vẫn giữ nguyên. Ứng dụng của bạn tiếp tục hoạt động mà không cần thay đổi mã nguồn.

Bạn cô lập các tích hợp bên ngoài bằng cách sử dụng một bộ điều hợp (adapter) nội bộ: Application -> Public Interface -> Adapter -> Implementation

Nếu một thư viện biến mất vào ngày mai, bạn chỉ cần thay đổi bộ điều hợp. Không có phần nào khác trong ứng dụng của bạn bị hỏng.

0deps không làm cho phần mềm trở nên hoàn hảo. Nó giảm thiểu rủi ro chuỗi cung ứng. Nó ngăn chặn các vấn đề như các gói mã độc, sự xâm nhập registry và dependency confusion.

Các dự án tồn tại trong nhiều thập kỷ. Các thư viện và framework sẽ thay đổi. Với 0deps, ứng dụng của bạn tiếp tục sử dụng các hợp đồng ổn định tương tự bất kể hệ sinh thái tiến hóa như thế nào.

Nguồn: https://dev.to/fullagenticstack/movimento-0deps-dependencias-locais-contratos-imutaveis-e-seguranca-por-design-4coo