Các nghiên cứu về cách lập trình viên có thể hiểu mã bằng các ngôn ngữ xa lạ? [đóng cửa]


15

Có nghiên cứu nghiêm túc nào về việc một lập trình viên có kinh nghiệm biết ngôn ngữ X có thể hiểu mã được viết bởi một lập trình viên có thẩm quyền sử dụng ngôn ngữ Y như thế nào, cho một loạt các ngôn ngữ được sử dụng rộng rãi như X và Y không?

Tất nhiên thế giới thực không đơn giản vì các lập trình viên chỉ biết một ngôn ngữ. Những gì chúng tôi muốn biết là: nếu chúng tôi thực hiện dự án của mình, nói, C #, và một ngày nào đó một số nhà vật lý cũ chỉ biết Fortran và Algol nhìn vào nó, nó sẽ có ý nghĩa như thế nào đối với họ? Các phần toán học của nó có thể đọc tốt đối với họ, nếu họ bỏ qua những gì đối với họ là một số dấu chấm câu ngẫu nhiên. Hoặc, liệu một chuyên gia Python có thể tìm thấy lỗ hổng trong tập lệnh Ruby thông minh của tôi không?

Có thể có các vấn đề từ mức độ cú pháp hời hợt đến mức độ của các khái niệm lớn như các đối tượng, siêu lập trình mẫu, chức năng, v.v. Tôi không hy vọng một lập trình viên có thể hiểu đầy đủ mọi chi tiết cú pháp của mã trong một "ngôn ngữ nước ngoài" hoặc theo tôn giáo của một khái niệm lớn nào đó, nhưng tự hỏi đến mức nào họ sẽ có được dòng kiểm soát chính, hãy tìm vị trí trong đó một cái gì đó được vẽ trên màn hình và cái gì quyết định màu sắc hoặc kích thước của nó, hãy xác minh rằng một robot được lập trình để lái xe sẽ tắt động cơ khi nó hoàn thành, những thứ đó.

Một nghiên cứu chất lượng tốt sẽ bao gồm nghiên cứu học thuật được công bố, báo cáo chính thức từ một số nhóm ngành hoặc công ty phần mềm lớn, mặc dù tôi sẽ có những quan sát không thiên vị có hệ thống bởi các nhà lãnh đạo có kinh nghiệm của các hội thảo và các lớp học hoặc các nguồn khác. Không quan tâm đến các blog ngắn, ví dụ trường hợp đơn lẻ hoặc giai thoại. (Chà, có thể là một vài giai thoại nếu chúng làm cho việc đọc tốt.)


1
Tôi không biết có nghiên cứu nào không, nhưng từ kinh nghiệm cá nhân của tôi, tôi nói Có, tôi đã xoay sở để hiểu một chương trình mà không biết ngôn ngữ.
superM

2
Điều này phụ thuộc vào một cặp ngôn ngữ: chọn C # so với Java - và bạn sẽ có được sự quen thuộc gần như ngay lập tức; chọn Algol so với C - và bạn sẽ có được sự quen thuộc với một chiếc áo choàng đơn. Chúc may mắn khi chọn C so với Prolog hoặc Whitespace so với Ada - điều này sẽ gây nản lòng. Nhân tiện, ngôn ngữ không phải là thứ duy nhất hiểu được chương trình: một chuyên gia C chuyên về thiết kế nhúng cố gắng hiểu mã MFC được viết bằng C là một cảnh tượng khá tiếc (đây là trải nghiệm đầu tay).
dasblinkenlight

Làm thế nào dễ dàng cho một người hiểu Đại số cho họ để lấy Lượng giác so với ai đó hiểu Giải tích? Nó phụ thuộc vào ngôn ngữ và mô hình. Phát hiện và cô lập sự khác biệt giữa các ngôn ngữ là đủ khó, đặc biệt là khi các ngôn ngữ không ngừng phát triển. Tôi nghiêm túc nghi ngờ bất cứ ai có thể đánh giá sự hiểu biết với bất kỳ số lượng chính xác hợp lý.
Evan Plaice

Câu trả lời:


9

Nó rõ ràng phụ thuộc vào mức độ liên quan của các ngôn ngữ với nhau. Ví dụ: nếu bạn có nền tảng C hoặc C ++ và đã thực hiện một số chương trình C # hoặc Java, bạn sẽ dễ dàng đọc và hiểu ngôn ngữ kia của hai ngôn ngữ đó (Java hoặc C #). Nếu bạn biết rõ về Lisp, Scheme không phải là vấn đề lớn. Tôi đã từng gỡ lỗi một chương trình PHP mà không có bất kỳ kiến ​​thức nào về PHP, chỉ với kiến ​​thức của tôi từ C, C ++ và Perl. Tôi khá chắc chắn khi chương trình đó được viết bằng Haskell hoặc Smalltalk, điều đó sẽ trở nên khó khăn hơn rất nhiều đối với tôi.

Trên thực tế, tôi không nghĩ rằng một nghiên cứu học thuật về chủ đề này sẽ có ý nghĩa gì (ít nhất, không nghiêm trọng). Không có thứ gọi là "lập trình viên có kinh nghiệm tiêu chuẩn biết ngôn ngữ X", vì vậy bất kỳ nghiên cứu nào cũng sẽ bỏ lỡ dữ liệu cơ sở được đảm bảo. Mọi người có kiến ​​thức khác nhau, và ngay cả khi họ đã chạy qua cùng một trường, họ vẫn có tài năng và động lực khác nhau.

nhưng tự hỏi đến mức nào họ sẽ có được dòng kiểm soát chính, hãy tìm vị trí mà một thứ gì đó được vẽ trên màn hình

Điều đó có thể khó ngay cả khi bạn rất quen thuộc với ngôn ngữ, vì chất lượng mã quá thấp hoặc khung được sử dụng quá phức tạp hoặc cơ sở mã rất lớn.


6

Không chắc chắn về một tài liệu tham khảo nghiên cứu được tiến hành học thuật, tuy nhiên việc tự đặt tên cho các phương thức, lớp và chức năng trong các ngôn ngữ C # / C ++ / Java / Python hoặc vv sẽ giúp dễ hiểu cơ sở mã cũng như quy trình nghiệp vụ.

Quy ước đặt tên trong dự án và nói chung trong phát triển phần mềm là một khía cạnh rất quan trọng. Tuy nhiên,its importancevà sự liên quan để xây dựng phần mềm chất lượng thường bị bỏ qua hoặc bỏ qua tất cả cùng nhau.

Nguyên tắc đặt tên được sử dụng trong .NET Framework và Quy ước đặt tên chung được sử dụng trong .NET là các tài liệu tham khảo tốt để xem xét.


Các quy ước đặt tên và thiết kế API tốt giúp ích nhưng ngay cả các quy ước đặt tên dựa trên ngôn ngữ thường được 'ý kiến' theo cách chỉ áp dụng cho ngôn ngữ đó. Bên cạnh C # / Java (gần giống nhau), hầu hết các ngôn ngữ hoạt động theo các nguyên tắc khác nhau có quy trình công việc và cách triển khai duy nhất dành riêng cho ngôn ngữ đó. Chẳng hạn, trong các ngôn ngữ không tuân theo mô hình khung lõi nguyên khối khổng lồ, bạn thường sẽ tìm thấy một hệ sinh thái khổng lồ của các gói liên kết với nhau bằng trình quản lý gói chung.
Evan Plaice

3

Nó phụ thuộc rất nhiều vào từng lập trình viên và cách họ tiếp thu ngôn ngữ. Tôi hoàn toàn không gặp khó khăn gì khi làm việc trong hàng tá ngôn ngữ, trong khi tôi có một người bạn chỉ biết C ++. Anh ấy không kém về lập trình hơn tôi, anh ấy chỉ học một cách khác.

Cá nhân, tôi thấy một câu hỏi liên quan thú vị hơn: khi có một lỗi trong mã (tức là lập trình viên X nghĩ rằng anh ta đã viết someFunction(x, y)nhưng anh ta thực sự đã viết một cái gì đó khác), nhà phát triển thứ hai khó xác định lỗi như thế nào. Một lập trình viên giỏi X sẽ làm cho nó cực kỳ rõ ràng những gì anh ta muốn máy tính làm, và điều đó sẽ dễ đọc. Tuy nhiên, nếu anh ấy phạm sai lầm, nó có thể là một vấn đề lớn. Những thứ như lỗi C ++ sau đây:

int x = getCorrectValueForX();
if (x = 2)
   doSomethingWhenXIsTwo();

Có thể rất khó phát hiện trừ khi bạn biết ngôn ngữ.


1

Nó không chỉ phụ thuộc vào lập trình viên như những người khác đã nói, mà còn phụ thuộc vào sự tương đồng giữa các ngôn ngữ, cả về cú pháp, triết lý và cách thực hiện.

Nhiều ngôn ngữ khác nhau sử dụng cú pháp phái sinh C và do đó, theo luồng điều khiển sẽ dễ dàng hơn nếu bạn quen thuộc với loại cú pháp đó. Điều tương tự cũng xảy ra đối với các ngôn ngữ được gõ mạnh và lỏng lẻo, các ngôn ngữ có hỗ trợ chức năng bậc cao hơn, mức độ trừu tượng và triết lý lập trình. Nó không chỉ phụ thuộc vào việc bạn có thể đọc cú pháp mà còn quen thuộc với các khái niệm ngôn ngữ và triết lý.

Nếu bạn đã học C chẳng hạn, tôi nghĩ sẽ hợp lý khi hy vọng bạn có thể lấy được luồng điều khiển từ C #, Java hoặc C ++, v.v. Sẽ khó hơn một chút để giải mã VB vì sự khác biệt về cú pháp, hoặc JavaScript vì đóng cửa, gõ yếu và các hàm bậc cao hơn (Tôi biết bạn có thể làm điều này trong C nhưng nó hơi khó khăn). Tuy nhiên, tôi không mong đợi bạn có thể gỡ lỗi Lisp, F #, R hoặc, thần cấm, lắp ráp bởi vì chúng sử dụng một mô hình lập trình hoàn toàn khác.

TL; DR Không chỉ quan trọng để có thể nhận ra cú pháp, hầu hết thời gian bạn có thể giải mã một cuộc gọi khai báo hoặc phương thức mà còn có thể hiểu lý do đằng sau lý do tại sao một chương trình được viết theo một cách nhất định là mấu chốt của việc hiểu và đọc mã .

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.