Tôi nghĩ thật khó để đạt được cả ba. Hai tôi nghĩ có thể khả thi. Ví dụ, tôi nghĩ rằng có thể đạt được hiệu quả và khả năng đọc trong một số trường hợp, nhưng khả năng bảo trì có thể khó với mã điều chỉnh vi mô. Mã hiệu quả nhất trên hành tinh nói chung sẽ thiếu cả khả năng bảo trì và khả năng đọc vì có lẽ là điều hiển nhiên đối với hầu hết, trừ khi bạn là loại có thể hiểu được mã SIMD đa luồng, đa luồng mà Intel viết bằng cách lắp ráp nội tuyến hoặc cắt nhiều nhất thuật toán -edge được sử dụng trong ngành công nghiệp với các bài báo toán học dài 40 trang chỉ được xuất bản 2 tháng trước và 12 thư viện có giá trị mã cho một cấu trúc dữ liệu cực kỳ phức tạp.
Hiệu quả vi mô
Một điều tôi muốn đề xuất có thể trái với ý kiến phổ biến là mã thuật toán thông minh nhất thường khó bảo trì hơn thuật toán đơn giản được điều chỉnh vi mô nhất. Ý tưởng này cho thấy các cải tiến về khả năng mở rộng mang lại nhiều lợi ích hơn cho mã vi điều chỉnh (ví dụ: các mẫu truy cập thân thiện với bộ đệm, đa luồng, SIMD, v.v.) là điều tôi thách thức, ít nhất là đã làm việc trong một ngành công nghiệp đầy phức tạp cấu trúc dữ liệu và thuật toán (ngành công nghiệp FX trực quan), đặc biệt là trong các lĩnh vực như xử lý lưới, bởi vì tiếng nổ có thể rất lớn nhưng rất tốn kém khi bạn giới thiệu các thuật toán và cấu trúc dữ liệu mới mà chưa ai từng nghe thấy trước đây vì chúng là thương hiệu Mới. Tôi thêm nữa'
Vì vậy, ý tưởng này cho rằng tối ưu hóa thuật toán luôn luôn át chủ bài, tối ưu hóa liên quan đến các mẫu truy cập bộ nhớ luôn là điều tôi không hoàn toàn đồng ý. Tất nhiên, nếu bạn đang sử dụng một loại bong bóng, không có lượng tối ưu hóa vi mô nào có thể giúp bạn ở đó ... nhưng trong lý do, tôi không nghĩ rằng nó luôn luôn rõ ràng như vậy. Và tối ưu hóa thuật toán được cho là khó bảo trì hơn tối ưu hóa vi mô. Tôi thấy việc bảo trì dễ dàng hơn nhiều, giả sử, Embree của Intel sử dụng thuật toán BVH cổ điển và đơn giản và chỉ điều chỉnh các crap ra khỏi nó so với mã OpenVDB của Dreamwork để cải tiến thuật toán mô phỏng chất lỏng tiên tiến. Vì vậy, trong ngành của tôi ít nhất, tôi muốn thấy nhiều người quen thuộc hơn với kiến trúc máy tính tối ưu hóa vi mô hơn, như Intel có khi họ bước vào hiện trường, trái ngược với việc đưa ra hàng ngàn và hàng ngàn thuật toán và cấu trúc dữ liệu mới. Với tối ưu hóa vi mô hiệu quả, mọi người có thể tìm thấy ngày càng ít lý do để phát minh ra các thuật toán mới.
Tôi đã làm việc trong một cơ sở mã di sản trước đây khi mà hầu hết mọi thao tác của người dùng đều có cấu trúc dữ liệu và thuật toán riêng biệt đằng sau nó (thêm tới hàng trăm cấu trúc dữ liệu kỳ lạ). Và hầu hết trong số họ có đặc điểm hiệu suất rất sai lệch, được áp dụng rất hẹp. Sẽ dễ dàng hơn nhiều nếu hệ thống có thể xoay quanh vài chục cấu trúc dữ liệu được áp dụng rộng rãi hơn và tôi nghĩ đó có thể là trường hợp nếu chúng được tối ưu hóa vi mô tốt hơn nhiều. Tôi đề cập đến trường hợp này bởi vì tối ưu hóa vi mô có khả năng cải thiện khả năng bảo trì rất lớn trong trường hợp như vậy nếu điều đó có nghĩa là sự khác biệt giữa hàng trăm cấu trúc dữ liệu vi mô hóa thậm chí không thể được sử dụng một cách an toàn cho các mục đích chỉ đọc nghiêm ngặt liên quan đến lỗi bộ nhớ cache và đúng so với
Ngôn ngữ chức năng
Trong khi đó, một số mã có thể bảo trì nhất mà tôi từng gặp là hiệu quả hợp lý nhưng cực kỳ khó đọc, vì chúng được viết bằng các ngôn ngữ chức năng. Nói chung, khả năng đọc và khả năng duy trì uber là những ý tưởng mâu thuẫn trong quan điểm của tôi.
Thật sự rất khó để làm cho mã có thể đọc được, có thể duy trì và hiệu quả cùng một lúc. Thông thường, bạn phải thỏa hiệp một chút trong một trong ba điều đó, nếu không phải là hai, như thỏa hiệp khả năng đọc để duy trì hoặc thỏa hiệp khả năng duy trì để đạt hiệu quả. Đó thường là khả năng duy trì mà bạn phải chịu đựng khi bạn tìm kiếm nhiều thứ khác.
Khả năng đọc so với khả năng bảo trì
Bây giờ như đã nói, tôi tin rằng khả năng đọc và bảo trì không phải là khái niệm hài hòa. Xét cho cùng, mã dễ đọc nhất đối với hầu hết mọi người trong chúng ta ánh xạ rất trực quan đến các kiểu suy nghĩ của con người và các kiểu suy nghĩ của con người vốn dễ bị lỗi: " Nếu điều này xảy ra, hãy làm điều này. Nếu điều đó xảy ra, hãy làm điều đó. , Tôi đã quên một cái gì đó! Nếu các hệ thống này tương tác với nhau, điều này sẽ xảy ra để hệ thống này có thể làm điều này ... oh chờ đã, còn hệ thống đó khi sự kiện này được kích hoạt thì sao?"Tôi đã quên câu trích dẫn chính xác nhưng ai đó đã từng nói rằng nếu Rome được xây dựng giống như phần mềm, nó sẽ chỉ lấy một con chim đậu trên tường để hạ nó xuống. Đó là trường hợp của hầu hết các phần mềm. Nó dễ vỡ hơn chúng ta thường quan tâm Một vài dòng mã dường như vô hại ở đây và có thể khiến nó dừng lại ở điểm khiến chúng ta phải xem xét lại toàn bộ thiết kế, và các ngôn ngữ cấp cao nhằm mục đích dễ đọc nhất có thể không phải là ngoại lệ đối với các lỗi thiết kế của con người như vậy .
Các ngôn ngữ chức năng thuần túy gần như không thể bị ảnh hưởng bởi điều này mà người ta có thể có được một cách khả thi (thậm chí không gần với bất khả xâm phạm, nhưng tương đối gần hơn nhiều so với hầu hết). Và đó là một phần vì họ không lập bản đồ trực giác với suy nghĩ của con người. Chúng không thể đọc được. Họ ép buộc các kiểu suy nghĩ theo chúng ta, điều khiến chúng ta phải giải quyết các vấn đề với càng ít trường hợp đặc biệt càng tốt bằng cách sử dụng lượng kiến thức tối thiểu có thể và không gây ra bất kỳ tác dụng phụ nào. Chúng cực kỳ trực giao, chúng cho phép mã thường được thay đổi và thay đổi mà không gây ngạc nhiên đến mức chúng ta phải suy nghĩ lại về thiết kế trên bảng vẽ, thậm chí đến mức thay đổi suy nghĩ về thiết kế tổng thể, mà không cần viết lại mọi thứ. Nó dường như không dễ bảo trì hơn thế ... nhưng mã vẫn rất khó đọc,