Là ngôn ngữ năng động bất lợi cho sự phát triển nhanh?


12

Từ những gì tôi đã đọc phát triển nhanh thường liên quan đến tái cấu trúc hoặc đảo ngược mã kỹ thuật thành sơ đồ. Tất nhiên có nhiều hơn thế, nhưng nếu chúng ta xem xét các thực tiễn dựa trên hai phương pháp này, liệu các ngôn ngữ được gõ động có bất lợi?

Có vẻ như các ngôn ngữ được gõ tĩnh sẽ giúp việc tái cấu trúc và đảo ngược kỹ thuật dễ dàng hơn nhiều.

Là tái cấu trúc hoặc (tự động) kỹ thuật đảo ngược khó khăn nếu không phải là không thể trong các ngôn ngữ gõ động? Các dự án trong thế giới thực nói gì về việc sử dụng các ngôn ngữ được gõ động cho phương pháp nhanh?


5
Đảo ngược mã kỹ thuật thành sơ đồ? Tại sao bạn sẽ làm điều đó trong Agile?
CaffGeek

7
Agile không có nghĩa là "mã trước, tài liệu sau".
Gort Robot

@CaffGeek: Một số sách thường được đề xuất nên vẽ sơ đồ trên bảng trắng, sau đó viết mã và cuối cùng đảo ngược mã kỹ sư thành sơ đồ cho cuộc họp tiếp theo.
Gerenuk

1
Tôi nghĩ rằng nên gõ mạnh vào thẻ và văn bản của câu hỏi này. Câu hỏi dường như là về tĩnh vs động không mạnh so với yếu.
Winston Ewert

@WinstonEwert - Cuộc gọi tốt, tôi đã thay đổi các thẻ thành dynamic-typingstatic-typing
Carson63000

Câu trả lời:


11

Về mặt lý thuyết, các ngôn ngữ động đều bất lợi, bởi vì chúng chỉ định ít hơn về cách thức hoạt động của mã (các ràng buộc là gì) và do đó, việc tái cấu trúc có thể được thực hiện tự động ít hơn và các vấn đề phát sinh cũng không thể được phát hiện tự động .

Nhưng tất cả những thứ khác không bằng nhau. Các ngôn ngữ động phổ biến nhất cho phép mã rất nhỏ gọn nhưng dễ hiểu, thường làm cho sự phát triển trong chúng nhanh hơn và làm cho logic (có thể thay đổi trong tái cấu trúc) dễ dàng phát hiện hơn. Vì vậy, mặc dù bạn có thể mất một số lợi thế tương đối khi làm việc bằng ngôn ngữ động, bạn vẫn có thể đi ra phía trước, đặc biệt nếu bạn dự định thực hiện tái cấu trúc bằng tay.

Mặt khác, tồn tại các ngôn ngữ được gõ tĩnh với các ưu điểm cơ bản giống như các ngôn ngữ động (nghĩa là nhỏ gọn và dễ hiểu - với các loại chủ yếu được suy luận, nhưng rất nhiều ở đó): Haskell có lẽ là ví dụ hàng đầu, nhưng OCaML / F #, Scala, và những người khác cũng nằm trong danh mục này. Thật không may, vì chúng ít được sử dụng nhiều hơn các ngôn ngữ gõ tĩnh phổ biến nhất, nên chúng không có nhiều bộ công cụ cho chúng (ví dụ: để tái cấu trúc).

Vì vậy, như một điểm mấu chốt, tôi nghĩ bạn sẽ làm đầy đủ với các phương pháp nhanh nhẹn trong hầu hết các ngôn ngữ; Tôi sẽ không nói rằng có một người chiến thắng rõ ràng ngay bây giờ vì thực tế chưa bắt kịp với lý thuyết.


Tôi nghĩ rằng câu trả lời này giải quyết các điểm chính của câu hỏi tốt nhất :) Bạn cũng có thể giải thích về tầm quan trọng của tái cấu trúc an toàn và kỹ thuật đảo ngược để phát triển nhanh? Tôi đã cho rằng nó đóng một vai trò rất quan trọng? Có lẽ nó ít hơn tôi nghĩ và các công cụ cho ngôn ngữ động lực là đủ tốt.
Gerenuk

1
@Gerenuk - Tôi không có đủ kinh nghiệm về phát triển nhanh (đặc biệt là các ngôn ngữ động) để đưa ra câu trả lời có thẩm quyền - là khía cạnh tái cấu trúc được nhấn mạnh, còn lại, v.v.? Hãy nhớ rằng các khía cạnh phổ biến khác của quy trình - ví dụ: phát triển dựa trên thử nghiệm - có thể giúp xác định vị trí tái cấu trúc của bạn bị sai lệch và nếu bạn nỗ lực hơn một chút, giả sử, giai đoạn thiết kế, bạn có thể không cần để tái cấu trúc càng nhiều. Tôi không nghĩ một kỹ thuật cụ thể nào là chìa khóa - nó luôn có sẵn một bộ công cụ đầy đủ, được triển khai thường xuyên và hợp tác.
Rex Kerr

13

Tái cấu trúc tự động được phát minh trong Smalltalk, một ngôn ngữ được gõ động. Vì vậy, không, không thể tái cấu trúc tự động trong một ngôn ngữ được gõ động. Làm thế nào nó là khó khăn phụ thuộc nhiều hơn vào các yếu tố khác bên cạnh kỷ luật đánh máy. C ++ và Java đều được gõ tĩnh, nhưng các công cụ tái cấu trúc chỉ thực sự tồn tại cho Java. Smalltalk với nội tâm và cú pháp đơn giản của nó là một ứng cử viên thực sự tốt cho các công cụ tái cấu trúc.

Trong một số cách, gõ động thực sự làm cho việc tái cấu trúc dễ dàng hơn. Nếu bạn có một bộ thử nghiệm tốt, bạn có thể chắc chắn rằng các phép tái cấu trúc của bạn không bị hỏng bất kỳ thứ gì. Một cơ sở mã được gõ động thường nhỏ hơn. Ngoài ra, tái cấu trúc có xu hướng ảnh hưởng đến ít mã hơn. Hoàn toàn nỗ lực liên quan đến việc tái cấu trúc thủ công một cơ sở mã động ít hơn so với cơ sở mã tĩnh.


1
Thế còn kỹ thuật đảo ngược thì sao? Smalltalk có khác với Python liên quan đến việc gõ không? Có vẻ như một vấn đề khó khăn để suy luận tất cả các loại trong Python và do đó xác định phương thức nào thực sự giống hệt nhau và không chỉ cùng tên.
Gerenuk

1
Smalltalk không phải là rằng nhiều khác biệt so với Python liên quan đến gõ. Đó , tuy nhiên, đáng kể khác nhau liên quan đến dụng cụ . Các công cụ và IDE mà có sẵn cho Smalltalk là cách tốt hơn so với những người có sẵn cho Python hay thậm chí là C #, C ++ và Java. Lý do tại sao IDE cho Python xấu không phải vì Python được gõ động, bởi vì, tốt, IDE cho Python rất tệ. Chúng ta đừng quên rằng IDE mà chúng ta biết bây giờ là Eclipse từng được gọi là VisualAge cho Smalltalk. Cộng đồng Smalltalk có 40 năm kinh nghiệm xây dựng IDE và họ áp dụng điều đó cho Java.
Jörg W Mittag

@Gerenuk, cách gõ của Smalltalk không khác gì python. Theo những cách khác, chẳng hạn như hướng nội, Smalltalk cung cấp một tính năng thân thiện hơn để tái cấu trúc. Gõ suy luận trong python sẽ yêu cầu công việc, nhưng đã được thực hiện, xem dự án PyPy.
Winston Ewert

1
@WinstonEwert "nhưng bạn có thể cấu trúc lại thủ công và các ngôn ngữ động thực sự làm cho điều đó khá dễ dàng" - Không, tái cấu trúc thủ công không mở rộng quy mô. Công cụ hỗ trợ tái cấu trúc thay đổi mọi thứ ngay cả khi tái cấu trúc không tự động 100% (xem đoạn trích nghiên cứu trường hợp bên dưới - lập trình
viên.stackexchange.com/a/166594/4334

1
Hầu như mọi điểm trong "lập trình động của bạn thực sự làm cho việc tái cấu trúc trở nên dễ dàng hơn" là không rõ ràng hoặc không phải là trình tự. Lập trình động không có nghĩa là bạn có một bộ kiểm tra toàn diện hơn, chỉ là một bộ lớn hơn (bởi vì một số thứ cần kiểm tra mà nếu không thì sẽ bị bắt tĩnh). Bạn không cung cấp bất kỳ sự hỗ trợ nào cho "tái cấu trúc có xu hướng ảnh hưởng đến ít mã hơn" (vì dù sao thì "dự án cũng nhỏ hơn", điều này có thể đúng với các ngôn ngữ động hiện tại). Và "nỗ lực liên quan đến tái cấu trúc thủ công" có vẻ sai trừ khi bạn có nghĩa là bạn thậm chí sẽ không để trình biên dịch của mình giúp bạn!
Rex Kerr

8

Tái cấu trúc được phát minh trong các ngôn ngữ động. Công cụ tái cấu trúc tự động được phát minh bằng các ngôn ngữ động. IDE được phát minh bằng các ngôn ngữ động. Một số phương pháp Agile được phát minh bằng các ngôn ngữ động.

Tôi thực sự không thấy bất kỳ vấn đề.


"Smalltalk không khác nhiều so với Python liên quan đến việc gõ. Tuy nhiên, nó khác biệt đáng kể về công cụ." - Có lẽ điều đó đang bắt đầu thay đổi, hãy xem jetbrains.com/pycharm/features/index.html
igouy

3

Chúng ta quên mất, cách làm việc "Agile" được gọi là Lập trình cực đoan (XP) đã được tạo ra trong một dự án Smalltalk (và Smalltalk chắc chắn được coi là một ngôn ngữ "động").

Đây là một trường hợp nghiên cứu về sử dụng công nghiệp một công cụ tái cấu trúc được cung cấp với một ngôn ngữ được gõ động:

Một ứng dụng Smalltalk rất lớn đã được phát triển tại Cargill để hỗ trợ hoạt động của thang máy hạt và các hoạt động giao dịch hàng hóa liên quan. Ứng dụng khách Smalltalk có 385 cửa sổ và hơn 5.000 lớp. Khoảng 2.000 lớp trong ứng dụng này đã tương tác với khung truy cập dữ liệu sớm (khoảng năm 1993). Khung công tác tự động thực hiện ánh xạ các thuộc tính đối tượng vào các cột của bảng dữ liệu.

Phân tích cho thấy mặc dù việc tra cứu động đã tiêu tốn 40% thời gian thực hiện của máy khách, nhưng điều đó là không cần thiết.

Một giao diện lớp dữ liệu mới được phát triển yêu cầu lớp nghiệp vụ cung cấp thuộc tính đối tượng để ánh xạ cột trong một phương thức được mã hóa rõ ràng. Thử nghiệm cho thấy giao diện này là đơn đặt hàng có cường độ nhanh hơn. Vấn đề là làm thế nào để thay đổi 2.100 người dùng lớp doanh nghiệp của lớp dữ liệu.

Một ứng dụng lớn đang được phát triển không thể đóng băng mã trong khi chuyển đổi giao diện được xây dựng và thử nghiệm. Chúng tôi đã phải xây dựng và kiểm tra các phép biến đổi trong một nhánh song song của kho lưu trữ mã từ luồng phát triển chính. Khi phép chuyển đổi được kiểm tra đầy đủ, thì nó được áp dụng cho luồng mã chính trong một thao tác.

Ít hơn 35 lỗi được tìm thấy trong 17.100 thay đổi. Tất cả các lỗi đã nhanh chóng được giải quyết trong khoảng thời gian ba tuần.

Nếu các thay đổi được thực hiện thủ công, chúng tôi ước tính rằng sẽ mất 8.500 giờ, so với 235 giờ để phát triển các quy tắc chuyển đổi.

Nhiệm vụ đã được hoàn thành trong 3% thời gian dự kiến ​​bằng cách sử dụng Quy tắc viết lại. Đây là một cải tiến theo hệ số 36.

từ chuyển đổi của một lớp dữ liệu ứng dụng, Will Will Loew-Blosser OOPSLA 2002

Ngoài ra - "Công cụ để thực hiện các thay đổi không thể - trải nghiệm với một công cụ để chuyển đổi các chương trình Smalltalk lớn"


1

Nguyên tắc của bạn nghĩ âm thanh cho tôi chính xác .

Các ngôn ngữ được gõ mạnh như C # là ứng cử viên tốt cho cơ sở mã liên tục cần bao thanh toán lại. Về cơ bản hầu hết các công cụ bao thanh toán lại (như Resharper, JustCode, v.v.) trên thị trường đều rất hiệu quả trong các ngôn ngữ lập trình được gõ tĩnh.

Các dự án trong thế giới thực nói gì về việc sử dụng các ngôn ngữ được gõ động cho phương pháp nhanh?

Đối với nhóm phát triển thực hành phương pháp Agile / Scrum, rất hữu ích (thậm chí quan trọng) để có bộ công cụ tái bao thanh toán tốt dưới lớp giáp. Mặt khác, tất cả những thay đổi đột ngột trong lần chạy nước rút sắp tới có thể là một cơn ác mộng phải sửa đổi hoặc thiết kế lại.

Do đó, phương pháp nhanh không cung cấp lợi thế cho các ngôn ngữ được nhập tĩnh hoặc động một lần. Những gì nó cung cấp là một cách tiếp cận lặp đi lặp lại để xây dựng một ứng dụng vững chắc.


4
Các ngôn ngữ động đã có Công cụ tái cấu trúc tự động từ lâu trước khi C # tồn tại và khi Notepad vẫn là IDE Java mạnh nhất.
Jörg W Mittag

4
Câu trả lời này hoàn toàn không được hỗ trợ bởi kinh nghiệm của tôi. Ngôn ngữ động thường nhanh hơn để làm những việc trong hơn những tĩnh đánh máy thông thường hơn (Tôi đã để học Haskell hoặc ML hoặc một cái gì đó giống như lúc nào đó). Chúng cũng nhanh hơn rất nhiều để sửa đổi nếu cần đột ngột, dẫn đến kết luận của tôi rằng Common Lisp là ngôn ngữ tốt nhất khi bạn không thực sự biết những gì bạn đang làm. Hơn nữa, bạn nghĩ tái cấu trúc bắt đầu từ đâu?
David Thornley

1
tại sao bạn lại nghĩ như vậy, ví dụ javascript là một ngôn ngữ động, nhưng Re-sharper không thực hiện công việc bóng bẩy như với C #. Thứ hai, tôi KHÔNG nói rằng "các ngôn ngữ động làm việc chậm hơn".
Yusubov

Từ những người đã mang đến cho bạn IntelliJ IDEA - PyCharm - "Đổi tên tái cấu trúc cho phép thực hiện thay đổi mã toàn cầu một cách an toàn và ngay lập tức. Thay đổi cục bộ trong một tệp được thực hiện tại chỗ. Tái cấu trúc hoạt động trong các dự án Python và Django đơn giản. Trường / Hằng số và Nội tuyến cục bộ để cải thiện cấu trúc mã trong một phương thức, Phương thức trích xuất để chia nhỏ các phương thức dài hơn, Trích xuất siêu lớp, Đẩy lên, kéo xuống và di chuyển để di chuyển các phương thức và lớp. " jetbrains.com/pycharm/features/index.html
igouy

@igouy, tôi đang đề cập đến Resharper và JustCode trong câu trả lời của tôi. Vì vậy, nó đúng với bối cảnh mà nó được đề cập.
Yusubov
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.