Triết lý Unix đã bị bỏ rơi trong thiết kế ứng dụng web? [đóng cửa]


8

Triết lý Unix khuyến khích sử dụng các chương trình hợp tác nhỏ, có thể tái sử dụng chung, cộng tác với các hình thức giao tiếp giữa các quá trình như ống, fifos, ổ cắm, trái ngược với không gian bộ nhớ và liên kết chung. Các chương trình MH và uzbl thường được đưa ra làm ví dụ về các ứng dụng thể hiện triết lý Unix trong thiết kế của chúng.

Nếu đây là trường hợp, không phải sự thật rằng Triết lý Unix đã hoàn toàn bị bỏ rơi trong thiết kế các ứng dụng web? Hầu như tất cả các ứng dụng web xử lý yêu cầu hiện được xây dựng dưới dạng các quy trình chạy dài nguyên khối lớn duy nhất xử lý toàn bộ chu trình yêu cầu / phản hồi (ngoài các cuộc gọi đến chương trình cơ sở dữ liệu bên ngoài) không chỉ cho một tài nguyên, mà tất cả các tài nguyên trên toàn bộ miền.

Đây có phải là chủ yếu bởi vì việc đưa ra một bộ các chương trình bên ngoài để xây dựng một phản ứng động đối với một yêu cầu web có quá nhiều quá trình thời gian khởi động? Tôi có thể thấy trường hợp này như thế nào nếu bạn muốn chuyển sang các tập lệnh Ruby hoặc Python, nhưng có lẽ nếu bạn sử dụng một ngôn ngữ như Haskell mà bạn có thể biên dịch, có bất kỳ trở ngại thực sự nào để tuân theo Triết lý Unix trong việc xây dựng các ứng dụng web không?


Câu hỏi này thực sự không có câu trả lời cụ thể và từ những gì tôi hiểu câu hỏi thảo luận không có câu trả lời cụ thể thường được đóng lại.
mdpc

Câu trả lời:


4

Tôi nghĩ nó phụ thuộc khá nhiều vào việc bạn vẽ ranh giới giữa các ứng dụng (nghĩa là định nghĩa của bạn về ứng dụng là gì) và trường hợp sử dụng nào bạn xem xét.

Mặc dù bạn có thể triển khai trình duyệt web dưới dạng hợp nhất của wget/ curl, trình phân tích cú pháp HTML / XML sẽ gọi ứng dụng đơn giản cho mỗi nút tài liệu, một công cụ JavaScript độc lập sẽ tương tác với tất cả điều này và trình hiển thị "đơn giản" sẽ "chỉ" đặt đầu ra của phần trên lên màn hình (và đưa đầu vào trở lại một số quy trình phối hợp cốt lõi), nó thậm chí còn lộn xộn hơn (có thể là bất kỳ) trình duyệt ngày nay khác.

Đối với đường ống dữ liệu đến một quy trình bên ngoài - đó là cách nó thực sự bắt đầu . Nếu bạn lo ngại về kích thước của mã ứng dụng web trung bình, vâng, chúng thường lớn (và thường vì chúng là một lớp nằm trên một nền tảng được viết bằng ngôn ngữ lập trình được giải thích thay vì ứng dụng "đơn giản"), nhưng hãy so sánh nó tương đương của họ. Email khách hàng, bộ văn phòng ... bạn đặt tên cho nó. Tất cả những thứ này khá phức tạp và có quá nhiều chức năng được triển khai như một vài quy trình giao tiếp qua các đường ống. Đối với các tác vụ bạn đang sử dụng các ứng dụng này thường rất phức tạp. Không có giải pháp đơn giản tốt cho các vấn đề phức tạp.

Có lẽ đã đến lúc phải nhìn xa hơn một chút động lực đằng sau phương châm UNIX "các ứng dụng làm được một chút nhưng rất tốt". Thay thế "ứng dụng" bằng "đơn vị mô-đun chung" và bạn đến một trong những thực tiễn lập trình tốt cơ bản: thực hiện mọi thứ theo mô-đun, để các bộ phận có thể được tái sử dụng và phát triển riêng . Đó là điều thực sự quan trọng, IMHO (và sự lựa chọn ngôn ngữ lập trình có rất ít liên quan đến nó).

ps (theo nhận xét) : Theo nghĩa chặt chẽ nhất, bạn hầu như đúng - các ứng dụng web không tuân theo triết lý UNIX (được chia thành nhiều chương trình độc lập nhỏ hơn). Tuy nhiên, toàn bộ khái niệm về những gì một ứng dụng có vẻ khá u ám - sedcó thể được coi là một ứng dụng trong một số tình huống , trong khi nó thường hoạt động như một bộ lọc.

Do đó, nó phụ thuộc vào cách bạn muốn dùng nó theo nghĩa đen. Nếu bạn sử dụng định nghĩa thông thường của một quy trình - một cái gì đó đang chạy như một quy trình đơn lẻ (theo nghĩa hạt nhân nhìn thấy nó), thì ví dụ, một ứng dụng web PHP được mô tả trong httpd bởi một mô-đun là hoàn toàn ngược lại. Các thư viện chia sẻ được tải vẫn nằm trong phạm vi của một quy trình (vì chúng sử dụng cùng một không gian địa chỉ) hoặc chúng đã tách biệt hơn (không thể thay đổi từ điểm của lập trình viên, hoàn toàn có thể sử dụng lại và giao tiếp thông qua API được xác định rõ)?

Mặt khác, hầu hết các ứng dụng web ngày nay được chia thành các phần máy khách và máy chủ, đang chạy dưới dạng các quy trình riêng biệt - thường là trên các hệ thống khác nhau (và thậm chí cả phần cứng được phân tách vật lý). Hai phần này giao tiếp với nhau thông qua giao diện được xác định rõ (thường là văn bản) (XML / HTML / JSON qua HTTP). Thông thường (ít nhất là trong trình duyệt) có một số luồng đang xử lý phía máy khách của ứng dụng (JavaScript / DOM, đầu vào / đầu ra ...), đôi khi thậm chí là một quy trình riêng biệt chạy plugin (Java, Flash, ... ). Nghe có vẻ giống hệt triết lý UNIX gốc, đặc biệt là trên Linux, nơi các luồng các quá trình bằng (gần như) bất kỳ tài khoản nào.

Ngoài ra, các bộ phận máy chủ luôn được chia thành nhiều phần riêng biệt - công cụ cơ sở dữ liệu riêng biệt thực hiện các hoạt động được yêu cầu trên dữ liệu có cấu trúc (hoặc không có cấu trúc) là một ví dụ điển hình. Việc tích hợp cơ sở dữ liệu vào máy chủ web sẽ không có ý nghĩa gì nhiều. Tuy nhiên, việc phân chia cơ sở dữ liệu thành nhiều quy trình chỉ chuyên phân tích các yêu cầu, tìm nạp dữ liệu từ lưu trữ dữ liệu, lọc dữ liệu .... Người ta phải cân bằng giữa việc tạo ra một chế độ toàn năng và một một nhóm công nhân gần như vô dụng dành phần lớn thời gian để nói chuyện với nhau.

Đối với giao diện văn bản : lưu ý rằng những gì đúng với dữ liệu được xử lý 40 năm trước không nhất thiết phải đúng ngày hôm nay - các định dạng nhị phân rẻ hơn cả về không gian và năng lượng cần thiết cho việc khử / tuần tự hóa, và lượng dữ liệu lớn hơn rất nhiều.

Một câu hỏi quan trọng khác là, điều gì thực sự là mục tiêu của triết lý UNIX? Tôi không nghĩ mô phỏng số, hệ thống ngân hàng hoặc phòng trưng bày ảnh / mạng xã hội có thể truy cập công khai đã từng có. Bảo trì các hệ thống chạy các dịch vụ này tuy nhiên chắc chắn đã và có thể sẽ có trong tương lai.


Cảm ơn bạn. Nếu bạn nhìn vào Nghệ thuật lập trình Unix, Ch 7, tính mô đun trong một chương trình thực sự không được xem là một biểu hiện của triết lý công cụ nhỏ Unix, mà chỉ là một bổ sung cho nó. Xem 4 đoạn đầu tiên tại đây: faqs.org/docs/artu/multiprogramch CHƯƠNG.html
dan

2

Tôi không chắc Unix Triết học đã từng có mặt trong thiết kế ứng dụng web - tuy nhiên, trong khi có thể đúng là nhiều ứng dụng web hoạt động theo cách bạn đã mô tả, người ta có thể cho rằng các ứng dụng web ngày nay có nhiều khả năng là người tiêu dùng dữ liệu (đưa ra phương pháp sản xuất dữ liệu ngày càng theo hướng api / dịch vụ web để tiêu thụ web).
Đến lượt điều này có thể được nhìn thấy để khuyến khích việc sử dụng các thành phần nhỏ, có thể tái sử dụng (dưới dạng các hàm JavaScript) cộng tác với nhau, do đó có thể tồn tại song song nhỏ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.