Một file App.js trống rỗng và một con trỏ nhấp nháy mang lại cảm giác về một tiềm năng thuần khiết. Không có ràng buộc. Không có mã mẫu (boilerplate) nào bảo bạn phải làm gì. Nhưng tấm bảng trắng đó không phải là sự tự do. Nó là một lời mời gọi mở để tái xây dựng cả vũ trụ từ con số không.

Thuế của Màn hình Trống

Bắt đầu một dự án chỉ với một trình biên dịch và một trình soạn thảo văn bản. Ngày đầu tiên mang lại cảm giác đầy phấn khích. Bạn chọn cấu trúc thư mục, quy ước đặt tên, và cả sắc độ xám chính xác cho các nút bị vô hiệu hóa. Đến ngày thứ ba, sự phấn khích tan biến và công việc thực sự mới bắt đầu xuất hiện.

Bạn nhận ra rằng việc xây dựng một danh sách đơn giản không chỉ là viết một hàm map. Bạn phải quyết định bộ khung trông như thế nào trong khi dữ liệu đang tải, liệu nó sẽ nhấp nháy hay trượt, và độ trễ nên kéo dài bao lâu trước khi nó xuất hiện. Bạn phải quyết định điều gì sẽ xảy ra khi mạng bị lỗi giữa chừng khi đang cuộn. Nên thử lại tự động? Hiển thị một nút bấm? Hay lưu bộ nhớ đệm (cache) trang trước đó mãi mãi? Bạn phải quyết định cách hai bộ lọc đang hoạt động tương tác với nhau, và trạng thái trống trông như thế nào khi sự kết hợp đó trả về kết quả bằng không. Bạn thậm chí phải quyết định "không có kết quả" có ý nghĩa gì đối với người dùng của mình.

Đây là những vấn đề về sự chính thức hóa. Biến một khái niệm mơ hồ thành một hành vi cụ thể, nhất quán và có thể lặp lại là phần khó nhất trong việc xây dựng phần mềm. Bản thân mã nguồn chỉ là sự sao chép của những lựa chọn đó. Đó là lý do tại sao khả năng tùy biến vô hạn không phải là một tính năng. Nó là một loại thuế, và hóa đơn sẽ đến dưới dạng các quyết định vi mô tích tụ nhanh hơn bạn tưởng.

Những Quyết định Không ngừng Tiêu tốn

Hãy coi mỗi lựa chọn kiến trúc như một gói đăng ký (subscription). Bạn trả khoản trả góp đầu tiên khi viết phần triển khai ban đầu. Sau đó, bạn tiếp tục trả, tháng này qua tháng khác.

Bạn phải trả giá khi một kỹ sư mới gia nhập và hỏi tại sao bạn lại chọn logic thử lại (retry logic) tùy chỉnh thay vì một thư viện tiêu chuẩn, và chẳng ai còn nhớ nữa. Bạn phải trả giá khi một bản cập nhật trình duyệt làm hỏng trình xử lý cảm ứng tự viết vì không ai ghi chép lại tại sao ngưỡng đó lại được đặt là bốn mươi tám pixel. Bạn phải trả giá khi một bản vá bảo mật buộc bạn phải tái cấu trúc (refactor) luồng xác thực riêng biệt của mình vì nó chưa bao giờ tính đến việc xoay vòng mã làm mới (refresh token rotation).

Nếu không có gì được quyết định thay cho bạn, mọi thứ sẽ trở thành vấn đề của bạn. Sự tự do để xây dựng chính xác những gì bạn muốn không thể tách rời khỏi gánh nặng phải sở hữu nó mãi mãi. Bạn trở thành người duy nhất có thẩm quyền về các mô hình (patterns) mà ngành công nghiệp đã giải quyết từ nhiều năm trước. Bạn dành hàng giờ để duy trì nền móng thay vì xây dựng ngôi nhà.

AI, Cái bẫy Tốc độ

Trí tuệ nhân tạo khiến động lực này trở nên nguy hiểm hơn chứ không hề giảm bớt. Một mô hình ngôn ngữ lớn có thể tạo ra một module xác thực hoàn chỉnh trong ba mươi giây. Nó có thể dựng khung một lớp trạng thái (state layer), phác thảo một chiến lược lưu bộ nhớ đệm (caching strategy), và viết các trình bảo vệ điều hướng (navigation guards) trước khi ly cà phê của bạn kịp nguội.

Nhưng vấn đề nằm ở đây. AI làm giảm chi phí đưa ra quyết định trong khi vẫn giữ nguyên chi phí sở hữu chúng cao như bao giờ hết. Giờ đây, bạn có thể tạo ra nợ kỹ thuật (technical debt) nhanh hơn bất kỳ đội ngũ nào trong lịch sử. Mã nguồn hoạt động tốt vào ngày demo. Nó vượt qua các bài kiểm tra smoke test. Sáu tháng sau, khi nhà cung cấp OAuth ngừng hỗ trợ một endpoint hoặc logic xóa bộ nhớ đệm (cache invalidation) gặp lỗi tranh chấp (race condition) trong một kết nối chậm, bạn sẽ phải gỡ lỗi (debug) những quyết định mà bạn đã giao phó cho một cỗ máy.

Hóa đơn ẩn luôn đến hạn. Nó được thanh toán bằng giờ công kỹ thuật, việc chuyển đổi ngữ cảnh (context switching), và sự xói mòn dần dần của tốc độ phát triển (velocity).

Hãy Mua Sự Nhàm chán theo Thập kỷ

Một framework hoặc nền tảng tốt không phải là một chiếc lồng. Đó là một sự mua lại thời gian.

Hãy xem xét những gì là tiêu chuẩn trong hầu hết mọi ứng dụng hiện đại. Người dùng cần đăng nhập. Dữ liệu cần di chuyển giữa các màn hình. Thông tin từ xa cần được lưu trữ cục bộ để giao diện không bị đình trệ. Mọi người cần điều hướng mà không làm mất ngữ cảnh. Đây là những thứ mang tính hàng hóa, không phải là yếu tố tạo nên sự khác biệt.

Một framework trưởng thành sẽ chính thức hóa các mô hình này một lần duy nhất. Nó quyết định:

  • Trạng thái tải trông như thế nào và khi nào chúng xuất hiện
  • Cách các lỗi mạng truyền lên giao diện
  • Cách hai tham số điều hướng hoặc các bộ lọc đang hoạt động được giải quyết khi chúng xung đột
  • Điều gì xảy ra với dữ liệu cục bộ khi dịch vụ nền tảng được cập nhật

Sau đó, nó ghi chép lại hành vi, kiểm tra các trường hợp biên (edge cases) và đẩy các bản vá trong khi bạn đang ngủ. Bạn có thể dồn năng lượng của mình vào mười phần trăm cuối cùng thực sự thuộc về bạn. Sự tương tác mới lạ. Mô hình kinh doanh cụ thể