
Tương lai của việc kiểm soát phiên bản
The Future of Version Control
Một dự án mới mang tên Manyana đang mở ra một hướng đi mới cho việc quản lý phiên bản (version control), đặc biệt là ứng dụng của CRDTs (Conflict-Free Replicated Data Types). Khác với các hệ thống VCS truyền thống, CRDTs giúp cho việc merge luôn thành công, thay vì đưa ra những xung đột khó hiểu, nó sẽ hiển thị các "conflict markers" cung cấp thông tin chi tiết về *thay đổi gì* và *ai* đã thực hiện, thay vì những "opaque blobs" khó giải quyết. Cách tiếp cận này mang lại nhiều lợi ích: thứ tự dòng vĩnh viễn, các xung đột không làm gián đoạn công việc nhưng vẫn cung cấp thông tin đầy đủ, và lịch sử thay đổi được lưu trữ trực tiếp trong cấu trúc "weave" của tệp tin. Điều này giúp cho việc merge trở nên đơn giản hơn và tạo nền tảng vững chắc hơn cho các quy trình phát triển phức tạp như rebasing mà không sợ làm mất lịch sử. Các developer nên chú ý đến proof-of-concept này, nó đang cho thấy một cơ chế giải quyết xung đột trực quan và mạnh mẽ hơn.
Tôi đang phát hành Manyana, một dự án mà tôi tin rằng sẽ thể hiện một tầm nhìn mạch lạc về tương lai của việc kiểm soát phiên bản — và một trường hợp thuyết phục để xây dựng dự án đó. Dự án này dựa trên cách tiếp cận cơ bản hợp lý về việc sử dụng...
Tôi sắp phát hành Manyana, một dự án mà tôi tin rằng sẽ thể hiện một tầm nhìn mạch lạc về tương lai của việc kiểm soát phiên bản — và một trường hợp thuyết phục để xây dựng nó.
Nó dựa trên cách tiếp cận cơ bản về việc sử dụng CRDT để kiểm soát phiên bản, vốn đã quá hạn từ lâu nhưng vẫn chưa xảy ra do các vấn đề UX tinh vi. Việc hợp nhất CRDT luôn thành công theo định nghĩa, do đó không có xung đột theo nghĩa truyền thống — điểm mấu chốt là các thay đổi phải được gắn cờ là xung đột khi chúng chạm vào nhau, cung cấp cho bạn bản trình bày xung đột đầy thông tin trên hệ thống không bao giờ thực sự thất bại. Dự án này đã giải quyết được điều đó.
Một lợi ích trước mắt là có nhiều dấu hiệu xung đột mang tính thông tin hơn. Hai người phân nhánh từ một tệp chứa hàm. Một xóa chức năng. Cái kia thêm một dòng ở giữa nó. VCS truyền thống cung cấp cho bạn điều này:
<<<<<<< left
=======
tính toán chắc chắn (x):
a = x * 2
logger.debug(f"a={a}")
b = a + 1
trở lại b
>>>>>>> đúngHai đốm màu mờ đục. Bạn phải tái hiện lại trong đầu những gì đã thực sự xảy ra.
Manyana đưa cho bạn cái này:
<<<<<<< bắt đầu xóa bên trái
tính toán chắc chắn (x):
a = x * 2
======= bắt đầu thêm ngay
logger.debug(f"a={a}")
======= bắt đầu xóa trái
b = a + 1
trở lại b
>>>>>>> chấm dứt xung độtMỗi phần sẽ cho bạn biết chuyện gì đã xảy ra và ai đã làm việc đó. Còn lại đã xóa chức năng. Right đã thêm một dòng ở giữa. Bạn có thể nhìn thấy cấu trúc của cuộc xung đột thay vì nhìn chằm chằm vào hai đốm màu cố gắng tìm ra nó.
CRDT (Loại dữ liệu được sao chép không xung đột) mang lại cho bạn tính nhất quán cuối cùng: việc hợp nhất không bao giờ thất bại và kết quả luôn giống nhau cho dù các nhánh được hợp nhất theo thứ tự nào — bao gồm nhiều nhánh được kết hợp với nhau bởi nhiều người làm việc độc lập. Thuộc tính đó hóa ra lại có ý nghĩa sâu sắc đối với mọi khía cạnh của thiết kế kiểm soát phiên bản.
Thứ tự dòng trở thành vĩnh viễn. Khi hai nhánh chèn mã vào cùng một điểm, CRDT chọn một thứ tự và nó sẽ được giữ nguyên. Điều này ngăn ngừa sự cố khi các phần xung đột đều được giữ lại nhưng được giải quyết theo thứ tự khác nhau trên các nhánh khác nhau.
Xung đột mang tính thông tin chứ không phải chặn. Việc hợp nhất luôn tạo ra kết quả. Xung đột được đưa ra để xem xét khi các chỉnh sửa đồng thời xảy ra “quá gần” nhau nhưng chúng không bao giờ chặn chính việc hợp nhất. Và bởi vì thuật toán theo dõi những gì mỗi bên đã làm thay vì chỉ hiển thị hai kết quả, nên việc trình bày xung đột thực sự hữu ích.
Lịch sử tồn tại trong cấu trúc. Trạng thái là một dệt — một cấu trúc duy nhất chứa mọi dòng đã từng tồn tại trong tệp, cùng với siêu dữ liệu về thời điểm nó được thêm và xóa. Điều này có nghĩa là việc hợp nhất không cần tìm tổ tiên chung hoặc duyệt qua DAG. Hai trạng thái tham gia, một trạng thái xuất hiện và trạng thái đó luôn đúng.
Một ý tưởng mà tôi đặc biệt hào hứng: rebase không nhất thiết phải phá hủy lịch sử. Việc rebase thông thường tạo ra một lịch sử hư cấu trong đó các cam kết của bạn diễn ra dựa trên nội dung chính mới nhất. Trong hệ thống CRDT, bạn có thể nhận được hiệu ứng tương tự - phát lại lần lượt các cam kết trên cơ sở mới - trong khi vẫn giữ toàn bộ lịch sử. Sự bổ sung duy nhất cần thiết là chú thích “tổ tiên chính” trong DAG.
Điều này quan trọng vì quá trình nổi loạn tích cực nhanh chóng tạo ra các cấu trúc liên kết hợp nhất không có tổ tiên chung duy nhất, đây chính xác là nơi hợp nhất 3 chiều truyền thống không còn hoạt động. CRDT không quan tâm — lịch sử đang được dệt nên chứ không phải được xây dựng lại từ DAG.
Manyana là bản demo, không phải là hệ thống kiểm soát phiên bản hoàn chỉnh. Có khoảng 470 dòng Python hoạt động trên các tệp riêng lẻ. Tính năng chọn ưu tiên và hoàn tác cục bộ vẫn chưa được triển khai, mặc dù README đưa ra tầm nhìn về cách có thể thực hiện tốt những việc đó.
Nó là gì là bằng chứng cho thấy việc kiểm soát phiên bản dựa trên CRDT có thể xử lý các vấn đề khó khăn về trải nghiệm người dùng và đưa ra câu trả lời tốt hơn so với các công cụ mà tất cả chúng ta đang sử dụng ngày nay — đồng thời là một thiết kế mạch lạc để xây dựng sản phẩm thực.
Mã này thuộc phạm vi công cộng. Tài liệu thiết kế đầy đủ nằm trong README.
Không có bài đăng nào
Tác giả: c17r