08/10/2026 · VietTechies · Biên tập

Lập trình viên ngày nay thường coi một khả năng là chuyện hiển nhiên: tạo một kiểu dữ liệu mới, công khai những thao tác mà bên ngoài được phép dùng và che giấu cách dữ liệu được biểu diễn ở bên trong. Một hàng đợi vẫn có thể được dùng như “hàng đợi” mà phần còn lại của chương trình không cần biết nó đang dùng mảng, danh sách liên kết hay một cấu trúc khác.
Đầu thập niên 1970, ranh giới đó chưa phải tính năng quen thuộc của các ngôn ngữ lập trình. Hàm và thủ tục có thể giấu một phép tính, nhưng việc bảo vệ biểu diễn nội bộ của dữ liệu và buộc mã bên ngoài chỉ đi qua một giao diện được xác định rõ vẫn chưa có cơ chế hệ thống như hiện nay.
Barbara Liskov và nhóm tại MIT biến ý tưởng ấy thành cơ chế của chính ngôn ngữ. Kết quả là CLU, đáng nhớ không vì còn nhiều người dùng mà vì nhiều ý tưởng từng mới của nó nay đã thành quen thuộc.
Bài toán phần mềm cũng là bài toán của ngôn ngữ
Chương trình lớn trở nên khó quản lý không chỉ vì có nhiều dòng mã. Nó khó vì quá nhiều thành phần biết quá nhiều về nhau. Nếu nhiều module cùng phụ thuộc vào cách một cấu trúc dữ liệu được sắp xếp bên trong, chỉ một thay đổi nhỏ ở cấu trúc đó cũng có thể kéo theo sửa đổi ở hàng loạt nơi. Khi ấy lập trình viên không còn bảo trì một thành phần, mà phải bảo trì cả mạng lưới giả định.
Công trình của Liskov về phương pháp lập trình tập trung vào việc cắt đứt mạng lưới phụ thuộc ấy. Trừu tượng hóa dữ liệu coi một khái niệm hữu ích là một đơn vị có hành vi công khai và biểu diễn riêng tư. Mã bên ngoài cần biết có những thao tác nào và ý nghĩa của chúng ra sao, nhưng không nên phụ thuộc vào dữ liệu được lưu như thế nào ở bên trong.
Ngày nay ý tưởng này xuất hiện trong module, class, interface, package, kiểu dữ liệu trừu tượng và API. Khi đó, câu hỏi là liệu chính ngôn ngữ có thể thực thi ranh giới thay vì chỉ dựa vào kỷ luật của lập trình viên và các comment.
CLU biến ranh giới thành một phần của ngôn ngữ
Trong thập niên 1970, Liskov dẫn dắt việc thiết kế và triển khai CLU tại MIT. Trong tài liệu lịch sử về dự án sau này, bà mô tả CLU là ngôn ngữ được triển khai đầu tiên cung cấp hỗ trợ trực tiếp ở cấp ngôn ngữ cho trừu tượng hóa dữ liệu.
CLU tổ chức một kiểu dữ liệu trừu tượng trong cấu trúc gọi là cluster. Cluster định nghĩa những thao tác mà mã bên ngoài có thể gọi, trong khi cách biểu diễn dữ liệu vẫn nằm dưới quyền kiểm soát của phần triển khai. Mã bên ngoài có thể dùng abstraction mà không xuyên qua interface để phụ thuộc vào chi tiết riêng tư.
Sự tách biệt này tạo ra lợi ích thực tế. Nhóm phát triển có thể thay cách triển khai mà vẫn giữ nguyên hành vi đã hứa với phần còn lại của chương trình. Kiến trúc cũng dễ suy luận hơn: có thể thảo luận “hợp đồng” của một thành phần tách biệt với cấu trúc dữ liệu và thuật toán nằm phía trong nó.
CLU còn thử nghiệm nhiều tính năng sau này trở nên phổ biến ở các ngôn ngữ khác, như iterator, xử lý exception có cấu trúc, kiểu tham số hóa và kiểm tra kiểu tại thời điểm biên dịch giữa các đơn vị chương trình phát triển riêng biệt. ACM khi trao giải thành tựu ngôn ngữ lập trình cho Liskov đã nhấn mạnh ảnh hưởng của những ý tưởng này tới Ada, Modula-3, C++ và Java.
Che giấu biểu diễn là cách kiểm soát chi phí thay đổi
Bài học sâu hơn của trừu tượng hóa dữ liệu là information hiding không nhằm “giấu” cho kín. Nó giúp giới hạn tác động của thay đổi. Nếu mười module có thể đọc trực tiếp từng trường của một cấu trúc, thay đổi cách biểu diễn có thể chạm tới cả mười. Nếu tất cả chỉ biết một tập thao tác ổn định, thay đổi thường có thể nằm gọn bên trong một ranh giới.
Điều này đặc biệt quan trọng khi phần mềm chuyển từ chương trình nhỏ do một người viết sang hệ thống do cả nhóm xây dựng và bảo trì nhiều năm. Thách thức không còn chỉ là tính toán đúng, mà là giữ cho một khối mã lớn vẫn dễ hiểu khi yêu cầu, phần cứng và cách triển khai thay đổi.
Liskov và John Guttag sau đó phát triển những ý tưởng này trong Abstraction and Specification in Program Development, nhấn mạnh cách chia chương trình lớn thành module cho các nhóm độc lập xây dựng rồi ghép lại. Ta vẫn nhận ra ý tưởng ấy trong ranh giới giữa các service và interface của thư viện ngày nay, ngay cả khi cú pháp đã hoàn toàn khác.
Ảnh hưởng không dừng ở CLU
CLU không phải tổ tiên trực tiếp của mọi ngôn ngữ hiện đại, và trừu tượng hóa dữ liệu cũng không đồng nghĩa với lập trình hướng đối tượng. Điểm lịch sử chính xác hơn là CLU chứng minh abstraction, encapsulation và parameterization có thể trở thành cơ chế thực tế của ngôn ngữ, thay vì chỉ là lời khuyên thiết kế.
Các nghiên cứu sau này của Liskov về behavioral subtyping hỏi một kiểu phải bảo đảm điều gì để thay thế kiểu khác mà không phá vỡ kỳ vọng của mã sử dụng nó. Hướng này gắn với Nguyên lý thay thế Liskov và giúp thiết kế phần mềm chuyển từ việc chỉ khớp tên method sang bảo toàn kỳ vọng về hành vi. Sau đó bà mở rộng nghiên cứu sang hệ thống phân tán và khả năng chịu lỗi. Chủ đề xuyên suốt vẫn là độ tin cậy nhờ ranh giới rõ ràng: xác định thành phần hứa điều gì, nêu rõ lời hứa đó và ngăn mã không liên quan phụ thuộc vào các chi tiết cần được tự do thay đổi.
Tính năng ngôn ngữ cũng có thể trở thành cách tư duy
Ảnh hưởng của CLU dễ thấy ở chỗ nhiều ý tưởng nay gần như không cần giải thích: module che giấu state, generic abstraction làm việc với nhiều kiểu, exception có đường xử lý có cấu trúc và iterator cho phép duyệt dữ liệu mà không phơi bày cách lưu trữ. Những kỳ vọng ấy không tự nhiên mà có. Chúng là kết quả của nhiều thập kỷ nghiên cứu ngôn ngữ, trong đó những người như Barbara Liskov coi cấu trúc phần mềm là một bài toán xứng đáng có cơ chế riêng để giải quyết.
Bài học vẫn rất thực tế: khi một codebase khó thay đổi, vấn đề chưa chắc nằm ở từng hàm quá phức tạp. Có thể các ranh giới đang để lộ quá nhiều chi tiết. Abstraction tốt không xóa complexity; nó quyết định complexity được phép nằm ở đâu.
Đọc bằng ngôn ngữ khác: English · Español · Deutsch · Français · Português (Brasil) · Tiếng Việt
Nguồn
- MIT CSAIL — Barbara Liskov
- MIT News — Barbara Liskov wins Turing Award
- Barbara Liskov — A History of CLU
- ACM SIGPLAN — Programming Languages Achievement Award
- MIT Press — Abstraction and Specification in Program Development
- Ảnh đại diện — Barbara Liskov, Kenneth C. Zirkel, CC BY-SA 3.0 qua Wikimedia Commons
