Có một mối tương quan giữa quy mô của dự án và sự nghiêm ngặt của ngôn ngữ?


72

Giải thích sự khác biệt giữa sự nghiêm ngặt của ngôn ngữ và mô thức đối với một đồng nghiệp của tôi, cuối cùng tôi đã khẳng định rằng:

  • Các ngôn ngữ khoan dung, như ngôn ngữ động và thông dịch, được sử dụng tốt nhất cho các nguyên mẫu và các dự án nhỏ hoặc các ứng dụng web cỡ trung bình. Khi chọn các ngôn ngữ động thanh lịch như Python hoặc JavaScript với Node.js, các lợi ích là:

    1. Phát triển nhanh,

    2. Giảm mã nồi hơi,

    3. Có khả năng thu hút các lập trình viên trẻ, sáng tạo, những người chạy trốn ngôn ngữ của công ty,   giống như Java.

  • Các ngôn ngữ được nhập / biên dịch tĩnh là tốt nhất cho các ứng dụng yêu cầu độ nghiêm ngặt cao hơn, chẳng hạn như các ứng dụng quan trọng trong kinh doanh hoặc ứng dụng cho các ứng dụng cỡ trung bình đến lớn.

    1. Các mô hình và mô hình nổi tiếng được phát triển trong nhiều thập kỷ,

    2. Dễ kiểm tra tĩnh,

    3. Có khả năng tìm thấy nhiều nhà phát triển chuyên nghiệp với nhiều thập kỷ kinh nghiệm.

  • Các ngôn ngữ nghiêm ngặt như Haskell, Ada hoặc các kỹ thuật như Hợp đồng mã trong C # sẽ tốt hơn cho các hệ thống thiên về an toàn hơn tính linh hoạt (ngay cả khi Haskell có thể cực kỳ linh hoạt), chẳng hạn như các hệ thống và hệ thống quan trọng được dự kiến ​​sẽ cực kỳ ổn định. Những lợi ích là:

    1. Khả năng bắt được càng nhiều lỗi càng tốt tại thời điểm biên dịch,

    2. Dễ kiểm tra tĩnh,

    3. Dễ chứng minh chính thức.

Tuy nhiên, bằng cách xem xét các ngôn ngữ và công nghệ được sử dụng cho các dự án quy mô lớn của các tập đoàn lớn, có vẻ như khẳng định của tôi là sai . Ví dụ: Python được sử dụng thành công cho các hệ thống lớn như YouTube hoặc các ứng dụng khác của Google đòi hỏi mức độ nghiêm ngặt quan trọng.

Có còn mối tương quan giữa quy mô của dự án và mức độ nghiêm ngặt của ngôn ngữ / mô hình nên được sử dụng?

Có yếu tố thứ ba mà tôi quên mất trong tài khoản không?

Tôi sai ở đâu


12
Kiểm tra loại nghiêm ngặt và kiểm tra loại tĩnh không giống nhau. Python được gõ động, nhưng nghiêm ngặt hơn C. Ưu điểm của kiểm tra kiểu tĩnh không nghiêm ngặt theo từng se nhưng các loại đó được kiểm tra tại thời điểm xây dựng, không phải thời gian chạy. Tôi đã xử lý nhiều vấn đề về C / C ++ trong sự nghiệp của mình vì việc truyền hình ngầm.
Gort Robot

5
Có lẽ có điều gì đó để nói về vòng đời: phần mềm bắt đầu trong danh mục đầu tiên của bạn có thể phát triển thành các phần mềm khác, "kéo" ngôn ngữ với nó.
Mat

11
Điều duy nhất tao nhã về javascript là nó chạy trong hầu hết các trình duyệt.
JeffO

1
@StevenBurnap: Tôi không thể đồng ý nhiều hơn về sự khác biệt giữa tĩnh và nghiêm ngặt. Java là một điểm khác trên phổ, tĩnh và quá nghiêm ngặt. Các nhà phát triển thường kiểm duyệt gõ tĩnh bằng cách sử dụng Java làm ví dụ, nhưng phần lớn những lời chỉ trích đó thực sự nên được hướng vào trình biên dịch quá nghiêm ngặt của Java , chứ không phải nói chung là gõ tĩnh. Chỉ cần nhìn vào Scala trên cùng một JVM, được gõ tĩnh, nhưng có mã dài hơn nhiều do khả năng suy luận kiểu của trình biên dịch tuyệt vời.
Cornel Masson

2
"Python được sử dụng thành công cho các hệ thống lớn" - định nghĩa của "thành công" ở đây là gì? Rằng nó chủ yếu chạy và tạo ra một số kết quả? Là số lượng thử nghiệm và lực lượng lao động cần thiết bao gồm? Còn khả năng bảo trì thì sao?
Den

Câu trả lời:


39

Một nghiên cứu trường hợp thú vị về các vấn đề của các dự án nhân rộng sử dụng ngôn ngữ động và diễn giải có thể được tìm thấy trong Beginning Scala của David Pollak.

Tôi bắt đầu tìm kiếm một cách để thể hiện mã trong não theo cách đơn giản hơn, trực tiếp hơn. Tôi tìm thấy Ruby và Rails. Tôi cảm thấy được giải thoát. Ruby cho phép tôi thể hiện các khái niệm trong ít dòng mã hơn. Rails dễ sử dụng hơn rất nhiều so với Spring MVC, Hibernate và các khung web Java Java được sắp xếp hợp lý khác. Với Ruby và Rails, tôi đã thể hiện nhiều hơn những gì trong đầu mình trong một khoảng thời gian ngắn hơn. Nó tương tự như sự giải phóng mà tôi cảm thấy khi tôi chuyển từ C ++ sang Java ...

Khi các dự án Ruby và Rails của tôi phát triển vượt quá vài nghìn dòng mã và khi tôi thêm các thành viên trong nhóm vào các dự án của mình, những thách thức của ngôn ngữ động trở nên rõ ràng.

Chúng tôi đã dành hơn một nửa thời gian viết mã để kiểm tra và phần lớn năng suất mà chúng tôi thấy đã bị mất khi viết bài kiểm tra . Hầu hết các thử nghiệm sẽ không cần thiết trong Java vì hầu hết các thử nghiệm đều hướng đến việc đảm bảo rằng chúng tôi đã cập nhật người gọi khi chúng tôi tái cấu trúc mã bằng cách thay đổi tên phương thức hoặc số tham số. Ngoài ra, tôi thấy rằng làm việc trong các đội có sự kết hợp giữa hai đến bốn thành viên trong nhóm, mọi thứ đã diễn ra tốt đẹp trong Ruby, nhưng khi chúng tôi cố gắng đưa các thành viên mới vào đội, các kết nối tinh thần rất khó truyền tải cho các thành viên mới của nhóm .

Tôi đã đi tìm một ngôn ngữ mới và môi trường phát triển. Tôi đang tìm kiếm một ngôn ngữ có tính biểu cảm như Ruby nhưng an toàn và hiệu suất cao như Java ...

Như bạn có thể thấy, những thách thức lớn trong việc mở rộng dự án cho tác giả hóa ra là trong quá trình phát triển thử nghiệm và chuyển giao kiến ​​thức.

Cụ thể, tác giả đi sâu vào chi tiết hơn trong việc giải thích sự khác biệt trong cách viết kiểm tra giữa các ngôn ngữ được gõ động và tĩnh trong Chương 7. Trong phần "Poignantly Killing Bunnies: Dwemthy's Stairs" thảo luận về cổng Scala của một ví dụ Ruby cụ thể:

Tại sao Lucky Stiff ... giới thiệu một số khái niệm siêu lập trình của Ruby trong Dwemthy Array trong đó một con thỏ chiến đấu với một loạt các sinh vật. N8han14 đã cập nhật ví dụ để làm việc trong Scala ...

So với mã Ruby, các phần thư viện của mã Scala phức tạp hơn. Chúng tôi đã phải làm rất nhiều công việc để đảm bảo các loại của chúng tôi là chính xác. Chúng tôi đã phải viết lại các thuộc tính của Creature theo cách thủ công trong các lớp DupMonster và CreatureCons. Đây là công việc nhiều hơn method_missing. Chúng tôi cũng đã phải làm một số lượng công việc khá lớn để hỗ trợ tính bất biến trong Sinh vật và Vũ khí của chúng tôi.

Mặt khác, kết quả mạnh hơn nhiều so với phiên bản Ruby. Nếu chúng tôi phải viết các bài kiểm tra cho mã Ruby của chúng tôi để kiểm tra trình biên dịch Scala đảm bảo cho chúng tôi, chúng tôi sẽ cần nhiều dòng mã hơn. Ví dụ, chúng ta có thể chắc chắn rằng Thỏ của chúng ta không thể sử dụng Rìu. Để có được sự đảm bảo này trong Ruby, chúng tôi phải viết một bài kiểm tra để đảm bảo rằng việc gọi |^thỏ không thành công. Phiên bản Scala của chúng tôi đảm bảo rằng chỉ các Vũ khí được xác định cho một Sinh vật nhất định mới có thể được sử dụng bởi Sinh vật đó, thứ gì đó đòi hỏi rất nhiều phản xạ thời gian chạy trong Ruby ...


Đọc ở trên có thể khiến người ta nghĩ rằng khi các dự án ngày càng lớn hơn, việc viết bài kiểm tra có thể trở nên cồng kềnh. Lý do này sẽ sai, bằng chứng là các ví dụ về các dự án rất lớn thành công được đề cập trong chính câu hỏi này ("Python được sử dụng thành công cho ... YouTube").

Điều quan trọng là, nhân rộng các dự án không thực sự đơn giản. Các dự án lớn, có tuổi thọ cao có thể "đủ khả năng" cho quá trình phát triển thử nghiệm khác nhau, với các bộ thử nghiệm chất lượng sản xuất, các nhóm phát triển thử nghiệm chuyên nghiệp và các công cụ nặng khác.

Các bộ thử nghiệm Youtube hoặc Bộ tương thích Java chắc chắn có một cuộc sống khác so với các thử nghiệm trong một dự án hướng dẫn nhỏ như Dwemthy Array .



24

Khẳng định của bạn không sai. Bạn chỉ cần đào sâu hơn một chút.

Nói một cách đơn giản, các hệ thống lớn sử dụng nhiều ngôn ngữ, không chỉ một ngôn ngữ. Có thể có những phần được xây dựng bằng ngôn ngữ "nghiêm ngặt" và có thể có những phần được xây dựng bằng ngôn ngữ động.

Đối với ví dụ về Google và YouTube của bạn, tôi nghe nói rằng họ sử dụng Python chủ yếu làm "keo" giữa các hệ thống khác nhau. Chỉ Google mới biết những hệ thống đó được xây dựng với cái gì, nhưng tôi cá rằng nhiều hệ thống quan trọng của Google được xây dựng bằng các ngôn ngữ "công ty" nghiêm ngặt như C ++ hoặc Java hoặc có thể là thứ mà chúng tự tạo ra như Go.

Không phải là bạn không thể sử dụng các ngôn ngữ khoan dung cho các hệ thống quy mô lớn. Nhiều người nói rằng Facebook sử dụng PHP, nhưng họ quên đề cập rằng Facebook phải tạo ra các hướng dẫn lập trình cực kỳ nghiêm ngặt để sử dụng nó hiệu quả ở quy mô này.

Vì vậy, có, một số mức độ nghiêm ngặt là cần thiết cho các dự án quy mô lớn. Điều này có thể đến từ sự nghiêm ngặt của ngôn ngữ hoặc khuôn khổ, hoặc từ các hướng dẫn lập trình và quy ước mã. Bạn không thể lấy một vài sinh viên tốt nghiệp đại học, đưa cho họ Python / Ruby / JavaScript và mong họ viết phần mềm có quy mô trên hàng triệu người dùng.


"Bạn không thể lấy vài sinh viên tốt nghiệp đại học" ... "và mong họ viết phần mềm có quy mô trên hàng triệu người dùng." có lẽ đã là đủ
dyesdyes

Đáng chú ý ở đây là như với Google và Python, việc sử dụng PHP của Facebook chủ yếu là keo dán ... Tôi hiểu là đối với hầu hết các chức năng, PHP chủ yếu chỉ được sử dụng như một ứng dụng khách tương đối đơn giản trên một hệ thống máy chủ phức tạp hơn thường được triển khai trong một ngôn ngữ "nặng ký" truyền thống hơn, chẳng hạn như Java, C ++, Haskell, OCaML, v.v.
Jules

"Chỉ Google biết những hệ thống đó được xây dựng với cái gì" .. Tôi thậm chí còn có một số nghi ngờ về điều đó :) Theo kinh nghiệm của tôi, không một thực thể nào (người nào khác) có thể liệt kê tất cả các phần của một hệ thống rất lớn. Trong nhiều trường hợp, chôn trong bát của một số máy chủ là một đoạn bị lãng quên từ lâu của tập lệnh Perl, Fortran hoặc KSH thực hiện 'Magic'.
mattnz

3

Có hai loại lỗi cần kiểm tra: lỗi loại (nối một số nguyên + danh sách số float) và lỗi logic nghiệp vụ (chuyển tiền vào tài khoản ngân hàng, kiểm tra xem tài khoản nguồn có tiền không).

Phần "động" của ngôn ngữ lập trình động chỉ là nơi diễn ra kiểm tra kiểu. Trong ngôn ngữ lập trình "gõ động", kiểm tra kiểu được thực hiện trong khi thực hiện từng câu lệnh, trong khi kiểm tra kiểu "ngôn ngữ gõ tĩnh" được thực hiện tại thời điểm biên dịch. Và bạn có thể viết một trình thông dịch cho ngôn ngữ lập trình tĩnh (giống như emscriptem ) và bạn cũng có thể viết một trình biên dịch tĩnh cho ngôn ngữ lập trình động (như gcc-python hoặc shed-skin hiện).

Trong ngôn ngữ lập trình động như Python và Javascript, bạn cần viết các bài kiểm tra đơn vị không chỉ cho logic nghiệp vụ của chương trình mà còn để kiểm tra xem chương trình của bạn không có bất kỳ lỗi cú pháp hoặc kiểu nào. Ví dụ: nếu bạn thêm "+" một số nguyên vào danh sách số float (không có ý nghĩa và sẽ gây ra lỗi), trong ngôn ngữ động, lỗi sẽ được đưa ra khi chạy trong khi thử thực thi câu lệnh. Trong một ngôn ngữ lập trình tĩnh như C ++, Haskell và Java, loại lỗi này sẽ được trình biên dịch bắt gặp.

Một cơ sở mã nhỏ trong ngôn ngữ lập trình được kiểm tra động sẽ dễ dàng tìm kiếm các lỗi loại hơn vì dễ có phạm vi bao phủ 100% của mã nguồn. Thế là xong, bạn thực thi mã bằng tay một vài lần với các giá trị khác nhau và bạn đã hoàn thành. Có phạm vi bảo hiểm 100% của mã nguồn cung cấp cho bạn một gợi ý công bằng rằng chương trình của bạn có thể không có lỗi loại .

Với một cơ sở mã lớn trong ngôn ngữ lập trình được kiểm tra động, sẽ khó kiểm tra mọi câu lệnh với mọi kết hợp loại có thể, đặc biệt nếu bạn bất cẩn và viết một hàm có thể trả về một chuỗi, danh sách hoặc đối tượng tùy chỉnh tùy theo đối số của nó.

Trong ngôn ngữ lập trình được kiểm tra tĩnh, trình biên dịch sẽ bắt được hầu hết các lỗi loại tại thời gian biên dịch. Tôi nói hầu hết bởi vì một phép chia cho lỗi không, hoặc một lỗi ngoài giới hạn cũng là lỗi loại.

Thường xuyên hơn không phải là cuộc thảo luận thực sự không phải là về ngôn ngữ lập trình mà là về những người sử dụng các ngôn ngữ đó. Và điều này đúng bởi vì, ví dụ, ngôn ngữ hợp ngữ cũng mạnh mẽ như bất kỳ ngôn ngữ lập trình nào khác, nhưng chúng tôi đang viết mã trên JavaScript. Tại sao? Bởi vì chúng ta là con người. Đầu tiên, tất cả chúng ta đều mắc lỗi và dễ sử dụng một công cụ chuyên dụng cho một nhiệm vụ cụ thể và dễ dàng hơn. Thứ hai, có một hạn chế về nguồn lực. Thời gian của chúng tôi bị hạn chế và việc viết các trang web về lắp ráp sẽ mất nhiều thời gian để hoàn thành.


3

Kinh nghiệm của tôi với các hệ thống lớn là chúng đứng hay ngã không phải do lựa chọn ngôn ngữ, mà bởi các vấn đề về thiết kế / kiến ​​trúc hoặc phạm vi kiểm tra . Tôi muốn có một nhóm Python tài năng trong dự án doanh nghiệp lớn của tôi, hơn là một nhóm Java tầm thường.

Phải nói rằng, bất kỳ ngôn ngữ nào cho phép bạn viết mã ít hơn đáng kể , đều phải đáng xem (ví dụ: Python vs Java). Có lẽ tương lai là các ngôn ngữ thông minh, được gõ tĩnh với suy luận kiểu nâng cao (ví dụ trong khuôn Scala). Hoặc lai, chẳng hạn như C # đang cố gắng với dynamicvòng loại của nó ...?

Và đừng quên lợi ích gõ tĩnh "khác": hoàn thành mã / intellisense mã IDE phù hợp, theo quan điểm của tôi là một tính năng thiết yếu, không phải là một tính năng hay.


1
"Hoàn thành mã / intellisense" - tái cấu trúc tự động cũng khá quan trọng.
Den

@Den Hoàn toàn. Có thể các ngôn ngữ động giúp bạn viết các phiên bản ban đầu rất nhanh (dễ viết hơn, ít viết mã hơn), nhưng bị sa lầy sau đó, vì việc đánh giá tác động của thay đổi hoặc tái cấu trúc (không có công cụ tái cấu trúc tự động) ngày càng khó khăn hơn?
Cornel Masson

0

Một xem xét khác là những người đằng sau viết các ứng dụng quy mô lớn. Tôi đã làm việc ở nhiều nơi muốn sử dụng Ruby hoặc Python trong một số dự án kiểu doanh nghiệp lớn, nhưng luôn bị các nhà quản lý CNTT và các nhóm bảo mật của công ty "bắn hạ" chính xác vì tính chất nguồn mở của các dự án.

Tôi đã được thông báo: "Chúng tôi không thể sử dụng Ruby on Rails vì đây là nguồn mở và ai đó có thể đưa các bản hack vào đó để đánh cắp thông tin quan trọng hoặc được bảo vệ." Tôi xin lỗi, nhưng một khi ai đó có suy nghĩ đó là nguồn mở == ác, thì gần như không thể thay đổi nó. Dòng suy nghĩ đó là một căn bệnh của công ty.

C # và Java được tin cậy ngôn ngữ với tin cậy nền tảng. Ruby và Python không phải là ngôn ngữ đáng tin cậy.


2
Tôi không đồng ý với dòng cuối cùng. Java là một trong những điểm tin cậy thấp nhất từ ​​trước đến nay. C # được coi là thận trọng bởi toàn bộ cộng đồng nguồn mở. Ruby được coi là rắn nhưng chậm (mặc dù nó không còn nữa) và Python là đứa con quyến rũ đáng tin cậy của toàn bộ ngành công nghiệp (học máy và khoa học dữ liệu có ai không?).
CodeBeard

1
Các ngôn ngữ động có hại cho bảo mật, nhưng "nguồn mở" không phải là lý do chính đáng. Có lẽ họ có nghĩa là "rất dễ ảnh hưởng đến một phần mã từ phần hoàn toàn khác của mã". Xem lập trình
viên.stackexchange.com/questions / 206558 / từ

1
Lưu ý rằng thực sự, "tính chua mở" là một trong những khía cạnh của sự lựa chọn ngôn ngữ. Đó là ví dụ một trong ba lý do được đưa ra bởi Jeff Atwood để giải thích lý do tại sao Discference sử dụng Ruby.
Arseni Mourzenko

C # bây giờ hoàn toàn là nguồn mở, nhưng nó vẫn được quản lý, lên kế hoạch và phát triển bởi các nhà phát triển chuyên nghiệp, điều này thật tuyệt vời. Chúng ta hãy hy vọng loại "Python 3 vs 2" sẽ không xảy ra ở đây.
Den

Lỗi và lỗ hổng bảo mật được giới thiệu bởi các lập trình viên chứ không phải bởi ngôn ngữ và trong hồ sơ tôi đã đóng góp một số bản sửa lỗi bảo mật cho các dự án nguồn mở. Tôi đã giúp bao nhiêu dự án kín ??? số không!
Phản ứng
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.