Có phải sự đơn giản luôn cải thiện khả năng đọc?
Tôi có thể nói, có thể với một chút tranh cãi, hoàn toàn không .
Bạn có thể đưa cho tôi một lớp học với 200 chức năng thành viên trong giao diện công cộng của nó và nó có thể là giao diện công cộng dễ đọc nhất ở ngoài kia. Nó có thể là một niềm vui chỉ tình cờ đọc qua mã như vậy và tài liệu của nó. Tuy nhiên, tôi sẽ không gọi nó là "đơn giản", vì mặc dù dễ đọc, tôi sẽ phải quan tâm đến việc tất cả các chức năng này tương tác với nhau như thế nào, và có khả năng coi chừng các trường hợp khó khăn do sử dụng sai.
Tôi thích một lớp có 20 hàm thành viên không dễ đọc đến 200, vì "khả năng đọc" không phải là ưu tiên hàng đầu đối với tôi trong việc ngăn ngừa lỗi của con người và cải thiện khả năng duy trì mã (dễ dàng trong đó chúng ta có thể thay đổi nó, tức là).
Tuy nhiên, đây là tất cả sẽ xoay quanh định nghĩa cá nhân của chúng tôi về "sự đơn giản". "Độ khó" thường không thay đổi đó một cách hoang dại giữa chúng ta, trừ khi ai đó đã mua rất nhiều kinh nghiệm và thành thạo mà họ xem xét regex là rất "dễ đọc", ví dụ như, quên phần còn lại của chúng tôi chỉ mortals.
Sự đơn giản
Có một thời gian, từ lâu, nơi tôi nghĩ "đơn giản" có nghĩa là "dễ đọc nhất có thể". Vì vậy, tôi sẽ viết mã C với rất nhiều chức năng tiện lợi, cố gắng cải thiện cú pháp và làm cho mọi thứ dễ đọc và viết nhất có thể.
Kết quả là tôi đã thiết kế các thư viện cấp cao, phong phú, rất phong phú, cố gắng mô hình hóa một chức năng cho mọi suy nghĩ tự nhiên của con người: người trợ giúp khi người trợ giúp, tất cả để định hình mã khách hàng thành cú pháp dễ đọc hơn. Mã tôi đã viết lại sau đó có thể là "dễ đọc" nhất, nhưng nó cũng là "không thể nhầm lẫn" và "phức tạp" nhất.
Lisp
Tuy nhiên, tôi đã có một niềm đam mê ngắn với LISP vào khoảng giữa những năm 90 (latecomer). Nó thay đổi toàn bộ ý tưởng của tôi về "sự đơn giản".
LISP không phải là ngôn ngữ dễ đọc nhất. Hy vọng rằng không ai nghĩ rằng trích xuất CDR và CAR trong khi gọi hàm đệ quy với một khối dấu ngoặc đơn lồng nhau là rất "dễ đọc".
Tuy nhiên, sau khi vật lộn để khiến bộ não của tôi xoay quanh cú pháp kỳ quặc của ngôn ngữ và cách thức hoàn toàn đệ quy, nó đã thay đổi vĩnh viễn ý tưởng về sự đơn giản của tôi.
Điều tôi tìm thấy với mã tôi đã viết trong LISP là tôi không còn mắc lỗi tinh vi nữa, mặc dù sự khó khăn trong suy nghĩ theo cách đó đã khiến tôi mắc nhiều lỗi trắng trợn hơn (nhưng chúng rất dễ phát hiện và sửa chữa). Tôi đã không hiểu những gì một chức năng đang làm và bỏ lỡ một tác dụng phụ tinh tế, không lường trước được. Tôi chỉ có một thời gian dễ dàng hơn trong việc thay đổi và viết chương trình chính xác.
Sau LISP, sự đơn giản đối với tôi trở thành về sự tối giản, tính đối xứng, tính linh hoạt, ít tác dụng phụ hơn, ít chức năng hơn nhưng linh hoạt hơn kết hợp với nhau theo nhiều cách khác nhau.
Tôi đã đánh giá cao suy nghĩ rằng mã đáng tin cậy nhất là mã không tồn tại. Mặc dù nó chỉ là một số liệu thô, tôi có xu hướng thấy tiềm năng không đáng tin cậy của mã dựa trên số lượng của nó. Tìm kiếm sự thuận tiện cú pháp tối đa và khả năng đọc có xu hướng tăng số lượng đó bằng một yếu tố lớn.
Chủ nghĩa tối giản
Với tư duy LISP được nhúng trong tôi, tôi đã thích các API tối giản hơn. Tôi thích một thư viện có ít chức năng hơn nhưng đáng tin cậy hơn, linh hoạt hơn, ít tiện lợi hơn và tiềm năng khó đọc hơn thư viện cung cấp một lượng lớn người trợ giúp "thuận tiện" và điều đó có thể giúp mã dễ "đọc" nhưng có khả năng bị vấp nhiều vấn đề hơn với sự không đáng tin cậy và bất ngờ xuất phát từ việc hiểu sai những gì một trong số hàng ngàn chức năng này làm.
An toàn
Một điều khác về LISP là sự an toàn. Nó phát huy tác dụng phụ tối thiểu và các chức năng thuần túy, và đó là nơi tôi không còn thấy mình mắc lỗi tinh vi, mặc dù khó đọc và viết bằng ngôn ngữ đã tăng thêm những lỗi trắng trợn hơn tôi có thể nhận ra 10 giây sau.
Các hàm thuần túy và trạng thái bất biến trở nên thích hợp hơn với tôi bất cứ khi nào tôi có thể mua được, ngay cả khi cú pháp của:
sword = sharpen(sword)
... Là một chút ít đơn giản và tách rời khỏi suy nghĩ của con người hơn:
sharpen(sword)
Khả năng đọc VS. Sự đơn giản
Một lần nữa, LISP không phải là ngôn ngữ "dễ đọc" nhất. Nó có thể gói rất nhiều logic vào một phần nhỏ của mã (có thể nhiều hơn một suy nghĩ của con người trên mỗi dòng). Tôi có xu hướng lý tưởng thích một suy nghĩ của con người trên mỗi dòng cho "khả năng đọc", nhưng nó không nhất thiết là "đơn giản".
Với định nghĩa "đơn giản" này, đôi khi "đơn giản" thực sự có thể phần nào cạnh tranh với "có thể đọc được". Điều này đang xem xét mọi thứ nhiều hơn từ quan điểm thiết kế giao diện.
Một giao diện đơn giản có nghĩa là bạn cần học ít thứ hơn để sử dụng nó, và có khả năng có độ tin cậy cao hơn và ít vấn đề hơn do sự tối giản của nó. Một tài liệu toàn diện về chủ đề này có thể phù hợp với một cuốn sách nhỏ hơn là một khối lượng sách khổng lồ. Tuy nhiên, nó có thể yêu cầu một số công việc nặng nề hơn và mang lại mã ít đọc hơn.
"Đơn giản" đối với tôi cải thiện khả năng hiểu chức năng trong hệ thống của chúng tôi ở mức độ rộng. "Có thể đọc được" đối với tôi cải thiện khả năng kết nối từng dòng mã nhỏ với ngôn ngữ tự nhiên và suy nghĩ và có thể tăng tốc độ hiểu biết của chúng tôi về một dòng mã, đặc biệt là nếu chúng tôi không thông thạo ngôn ngữ.
Regex là một ví dụ về những gì tôi cho là "cực kỳ đơn giản". Đó là "quá đơn giản và quá khó đọc" cho sở thích cá nhân của tôi. Có một hành động cân bằng giữa tôi giữa các thái cực này, nhưng regex có chất lượng đơn giản giống như LISP như tôi định nghĩa: tối giản, đối xứng, linh hoạt đáng tin cậy, đáng tin cậy, v.v. Vấn đề đối với tôi với regex là nó quá đơn giản đã trở nên khó đọc đến mức tôi không nghĩ mình sẽ trở nên thông thạo nó (bộ não của tôi không hoạt động theo cách đó và tôi ghen tị với những người có thể viết mã regex trôi chảy).
Vì vậy, dù sao, đó là định nghĩa của tôi về "đơn giản", và nó hoàn toàn độc lập với "khả năng đọc" và đôi khi thậm chí có thể can thiệp vào cái khác, dẫn đến một hành động cân bằng giữa một thư viện "thuận tiện hơn về mặt cú pháp" và dễ đọc hơn hoặc "về mặt cú pháp" bất tiện ", thư viện ít đọc hơn nhưng nhỏ hơn. Tôi luôn luôn tìm thấy các ưu tiên "tiện lợi của sự hiểu biết" và "khả năng duy trì" thực sự để phù hợp với điều kiện sau, với sự ưu tiên mạnh mẽ đối với chủ nghĩa tối giản thậm chí với một số chi phí dễ đọc và cú pháp tự nhiên hơn (nhưng không đến mức regex) . YMMV.