“The Art of Unix Programming” (TAoUP) của Eric S. Raymond không phải là một cuốn sách hướng dẫn hay cẩm nang thực hành. Thay vào đó, đây là một tác phẩm đi sâu vào lịch sử và triết lý của Unix. Tuy nhiên, ít có cuốn sách nào lại có ảnh hưởng lớn đến cách tôi tiếp cận và sử dụng Linux/macOS hàng ngày hơn cuốn này. Dưới đây là một vài trong số những điều giá trị mà nó đã dạy tôi.
1. Unix: Lịch Sử Lâu Đời Hơn Bạn Tưởng
Bạn không cần phải biết toàn bộ lịch sử của Unix để sử dụng nó – hay Linux, hay macOS – ngày nay. Nhưng việc tìm hiểu một chút về nguồn gốc của Unix chắc chắn không hề thừa. Hiểu được bối cảnh ra đời của hệ điều hành này giúp bạn nắm bắt được màn hình mình đang nhìn, và lịch sử có thể giải đáp nhiều câu hỏi ban đầu, chẳng hạn như “Tại sao tên lệnh lại ngắn đến vậy?”.
Chương thứ hai – “History: A Tale of Two Cultures” – giải thích cách Unix ra đời vào năm 1969, trên những cỗ máy teletype trông giống như máy đánh chữ được nâng cấp. Thật đáng kinh ngạc khi nghĩ rằng những cỗ máy này vẫn có điểm chung với nhiều máy chủ đang vận hành cuộc sống trực tuyến của chúng ta ngày nay. Mặc dù hiện tại chúng ta có thể coi Linux như một bản sao của Unix, thì lịch sử đằng sau nó còn phong phú và lâu dài hơn nhiều. Tôi tự hào khi sử dụng một hệ thống có nguồn gốc từ năm mươi năm trước, ngay cả khi đối mặt với mọi tiến bộ công nghệ kể từ đó.
2. Mã Nguồn Mở Và Vai Trò Không Thể Thiếu Của Linux
TAoUP tiếp tục đề cập đến sự ra đời của Linux và cách tiếp cận của Linus Torvalds đã tạo ra một sự dung hòa giữa các hệ thống độc quyền, khóa chặt và sự tự do về tư tưởng mà phong trào mã nguồn mở đang phát triển mạnh mẽ theo đuổi.
Phong trào mã nguồn mở quá quan trọng đối với câu chuyện của Linux đến mức dễ dàng coi chúng là một. Tuy nhiên, việc tìm hiểu sâu hơn về lịch sử mã nguồn mở và cách nó so sánh với cách tiếp cận độc quyền hoặc giải pháp thay thế GNU (“phần mềm tự do”) lại vô cùng hấp dẫn. Ngay từ những năm 1950, các kỹ sư đã chia sẻ mã nguồn, đọc và sửa đổi nó. Nhưng chỉ đến những năm 1990, khi Linux xuất hiện, phần mềm mã nguồn mở mới bắt đầu được sử dụng rộng rãi. Điều này trùng hợp với sự phổ biến rộng rãi hơn của internet, một cơ chế phân phối đã giúp sự phát triển mã nguồn mở thực sự bùng nổ.
Các dây cáp Ethernet nhiều màu sắc tượng trưng cho hạ tầng Internet, đóng góp vào sự phát triển mã nguồn mở và Linux
3. Linux Đề Cao Sự Đơn Giản (Thật Sự!)
Mặc dù ban đầu có vẻ phức tạp, Linux được xây dựng dựa trên các nguyên tắc cơ bản đơn giản. Nếu có một bài học mà cuốn sách này dạy nhiều hơn bất kỳ điều gì khác, thì đó chính là điều này. Toàn bộ phần thiết kế (chương 4–13) giải thích lý do tại sao triết lý cơ bản của Unix lại có lợi đến vậy.
Raymond khám phá khái niệm này bằng cách chia nó thành một tập hợp các “quy tắc” mà “các bậc tiền bối” của Unix (những người như Rob Pike và Ken Thompson) đã từng tuyên bố một cách ít hình thức hơn. 17 quy tắc này bao gồm:
- Tính module (Modularity)
- Tính tổng hợp (Composition)
- Tính đơn giản (Simplicity)
- Tính minh bạch (Transparency)
- Tính im lặng (Silence)
Các quy tắc này về cơ bản gói gọn trong một nguyên tắc quen thuộc: KISS (Keep it simple, stupid!). Bằng cách khuyến khích các chương trình nhỏ, thực hiện các tác vụ cơ bản, cụ thể và giao tiếp bằng một giao thức văn bản đơn giản, triết lý Unix mang lại những công cụ có thể tái sử dụng và đáng tin cậy.
Giao diện dòng lệnh Bash của Unix/Linux với chữ màu xanh trên nền đen, minh họa cho triết lý đơn giản và hiệu quả trong lập trình Unix
4. Chương Trình Module, Chính Xác Giúp Mọi Thứ Hoạt Động Trơn Tru
Quy tắc đầu tiên của Raymond là “Modularity” (Tính module), được mô tả là “Viết các phần đơn giản được kết nối bằng các giao diện rõ ràng.” Giống như nhiều quy tắc khác, trọng tâm ở đây là kiểm soát sự phức tạp. Nhiều vấn đề trong việc sử dụng máy tính phát sinh từ các hệ thống phức tạp khó hiểu. Bằng cách đề cao sự đơn giản, quy tắc này nhằm mục đích giảm thiểu lỗi và cải thiện khả năng hiểu tổng thể.
Khi bạn lần đầu gặp các công cụ Linux như ls
hoặc grep
, có thể khó coi chúng là những chương trình hoàn chỉnh. Chúng làm ít hơn nhiều so với trình duyệt web hoặc trình xử lý văn bản của bạn, vì vậy chúng có vẻ tầm thường hoặc không quan trọng. Nhưng điều đó đã bỏ qua sức mạnh nội tại của tính module: kết hợp các chương trình nhỏ để đạt được nhiều hơn tổng các phần của chúng.
Một trong những ví dụ thực tế nhất về sức mạnh của tính module là pipe
(ống dẫn):
ls | grep "foo"
Đây là một ví dụ về một mẫu rất phổ biến mà tôi thường xuyên sử dụng:
du -sk * | sort -rn | head
Dòng lệnh này chạy ba chương trình: du
để báo cáo tổng kích thước của các tệp/thư mục phù hợp, sort
để sắp xếp chúng theo số, và head
để trả về mười kết quả đầu tiên. Kết quả là một tập hợp nhỏ các thư mục chiếm nhiều dung lượng nhất trên đĩa, mà tôi có thể tiếp tục xử lý để dọn dẹp.
Không có pipe
, cách thay thế sẽ là một chương trình duy nhất có tên gì đó như “get-biggest-ten-folders”. Một chương trình như vậy thậm chí có thể tiện lợi hơn, nhưng nó bị hạn chế hơn nhiều so với các công cụ tổng quát có sẵn ở đây. Bạn sẽ cần một số lượng lớn các chương trình có tên gọi khó hiểu để làm việc mà không cần pipe
, và sự phức tạp của chúng chắc chắn sẽ rất khó khăn khi làm việc.
5. Văn Bản (Text) Là Nền Tảng Của Mọi Thứ
Chương 5 của cuốn sách nói về tính văn bản, cả về định dạng tệp và cách các chương trình Unix giao tiếp. Đây là một trong những điều đã gây ấn tượng mạnh nhất với tôi về Unix, đặc biệt là khi nói đến cấu hình. Đến từ Windows, tôi đã quen với registry
, cơ sở dữ liệu khét tiếng, khó hiểu và đơn khối chứa các cài đặt chương trình.
Giao diện Registry Editor của Windows hiển thị giá trị chuỗi DhcpIPAdrdress, đối lập với cách quản lý cấu hình bằng văn bản của Unix/Linux
Ngược lại, các công cụ Linux có xu hướng có các tệp cấu hình dựa trên văn bản, nằm rải rác khắp hệ thống tệp của bạn (ở những vị trí tiêu chuẩn, nếu bạn muốn). Bạn có thể chỉnh sửa các tệp này bằng một trình soạn thảo văn bản tiêu chuẩn và truy vấn chúng bằng các công cụ dòng lệnh phổ biến. Điều này có nghĩa là không cần các công cụ GUI tùy chỉnh để thay đổi cài đặt, mặc dù chúng vẫn có thể được xây dựng dựa trên định dạng tệp văn bản truyền thống.
File cấu hình văn bản của Linux hiển thị các thiết lập với biến MANPATH, minh họa cho triết lý "mọi thứ là văn bản" của hệ điều hành Unix
Triết lý này cũng mở rộng đến cách các chương trình giao tiếp. Khi bạn sử dụng một pipe
, bạn đang truyền văn bản từ chương trình này sang chương trình khác. Tại bất kỳ thời điểm nào, bạn có thể ngắt pipe
để gỡ lỗi. Lấy ví dụ về pipe
này:
ls | grep "txt"
Bằng cách chèn lệnh tee
, bạn có thể nắm bắt đầu ra tại một điểm cụ thể và lưu nó vào một tệp để gỡ lỗi:
ls | tee debug-ls-output.txt | grep "txt"
Điều này gắn liền với Quy tắc Minh bạch của Raymond:
“Thiết kế để dễ nhìn thấy để việc kiểm tra và gỡ lỗi dễ dàng hơn”
Sử dụng văn bản làm định dạng giao tiếp và dữ liệu có nghĩa là các chương trình hoạt động một cách công khai, với ít phần ẩn hơn. Điều này giúp dễ dàng sửa chữa chương trình, học hỏi từ chúng và sử dụng chúng.
6. Linux Kiên Định Với Truyền Thống, Cả Ưu Và Nhược Điểm
Linux – và hơn thế nữa là Unix – thường bị coi là “lỗi thời”, một hệ thống được những “người già” và những người cuồng tín yêu thích. Mặc dù có thể có một phần sự thật trong đó, nhưng điều này đã bỏ qua một thực tế rằng các công nghệ trưởng thành, đã phát triển không nhất thiết là xấu.
Trong chương 14, Raymond thảo luận về việc sử dụng C, ngôn ngữ đã đóng vai trò quan trọng trong sự phát triển của Linux. Mặc dù tình hình đang thay đổi, nhiều công cụ dòng lệnh tiêu chuẩn vẫn được viết bằng C ngày nay. Cuốn sách lưu ý cách C đã phổ biến, một phần, nhờ vào sự hỗ trợ công cụ xuất sắc đã tồn tại qua thời gian.
Raymond không phải là người tuyệt đối; ông giải thích cách Python, một ngôn ngữ tương đối hiện đại, là một lựa chọn vượt trội cho các dự án mới. Nhưng ông cũng khám phá những lợi ích và hạn chế của lập trình shell và lập luận rằng lập trình hướng đối tượng không phải là hoàn hảo. Giống như nhiều phần của cuốn sách, phần này lập luận chống lại các giải pháp “một kích cỡ cho tất cả” và nhấn mạnh rằng bối cảnh luôn quan trọng.
Bìa sách The Art of Unix Programming của Eric S. Raymond, nguồn cảm hứng cho những bài học sâu sắc về triết lý và lịch sử hệ điều hành Unix
Kết Luận
“The Art of Unix Programming” không chỉ là một cuốn sách về lịch sử công nghệ mà còn là một kho tàng triết lý thiết kế phần mềm sâu sắc, vẫn còn nguyên giá trị cho đến ngày nay. Từ việc hiểu về lịch sử lâu đời của Unix, nhận ra tầm quan trọng của mã nguồn mở, đến việc thấm nhuần nguyên tắc đơn giản, sức mạnh của các module, vai trò nền tảng của văn bản và sự kiên định với truyền thống, mỗi bài học đều mang đến cái nhìn sâu sắc về cách các hệ thống mà chúng ta tin dùng hàng ngày được xây dựng và duy trì. Đối với bất kỳ ai muốn vượt ra khỏi việc sử dụng thông thường và thực sự hiểu “linh hồn” của Linux hay macOS, TAoUP là một tài liệu không thể bỏ qua.
Bạn đã đọc “The Art of Unix Programming” hay có bài học nào khác từ Unix/Linux muốn chia sẻ không? Hãy để lại bình luận và thảo luận cùng xalocongnghe.com nhé!