Là số lỗi trung bình trên mỗi loc giống nhau cho các ngôn ngữ lập trình khác nhau? [đóng cửa]


45

Tôi đã được thông báo rằng số lỗi / lỗi trung bình trên mỗi dòng mã là "không đổi" đối với các ngôn ngữ lập trình khác nhau. 10 KLOC của Ruby sẽ có cùng số lỗi với 10 KLOC của c ++. Đối số thường được sử dụng để thúc đẩy việc sử dụng các ngôn ngữ biểu cảm (nghĩ python / ruby ​​trên c ++ / assembly) vì số lượng dòng để mô tả cùng chức năng sẽ nhỏ hơn.

Có ai biết yêu cầu này đến từ đâu không? Liệu các ngôn ngữ cấp cao hơn dẫn đến ít lỗi hơn?


11
Có vẻ không hợp lý khi xem xét rằng một số ngôn ngữ khuyến khích một phong cách tập hợp nhiều câu lệnh vào một dòng hơn những ngôn ngữ khác.
Caleb

10
Bugs / LỘC là một số liệu rất sai cho tất cả mọi thứ. Nó phụ thuộc vào ngôn ngữ, nhưng nó phụ thuộc nhiều vào lập trình viên, viết nó. Vì vậy, lấy trung bình cho ngôn ngữ không có ý nghĩa gì, vì các dao động lớn nằm trong biến khác. Đây chỉ là IMO, ofc.
K.Steff

3
Tôi có thể nói với bạn rằng số lỗi / dòng tôi viết bằng Perl sẽ lớn hơn nhiều so với số tôi viết trong C. Một người bạn của tôi là một phù thủy Perl và đối với anh ta, số lỗi / dòng này lớn hơn nhiều so với Perl. Khó để thấy làm thế nào số liệu này có thể có thể hữu ích.
Caleb

4
Bạn có thực sự nghĩ rằng {1≥⍴⍵:⍵⋄e←⍵[?⍴⍵]⋄ (∇(⍵<e)/⍵) , ((⍵=e)/⍵) , ∇(⍵>e)/⍵}có khả năng chứa lỗi như int pivot = arr.Count / 2;không?
Svick

2
Tôi chỉ chạy qua câu hỏi này. Tôi không có sương mù tại sao nó bị đóng cửa; đây là một câu hỏi hoàn hảo cho trang web này Đối với một dự án lớn, lỗi trên mỗi KLOC không phải là thước đo mức độ tốt của các lập trình viên. Nó là thước đo mức độ tốt của tổ chức và quy trình.
David Hammen

Câu trả lời:


43

Trái ngược với trực giác, số lượng lỗi trên 1000 dòng dường như tương đối ổn định, bất chấp ngôn ngữ cụ thể liên quan. Steve McConnell , tác giả của Code CompleteƯớc tính phần mềm: Làm sáng tỏ nghệ thuật đen đi qua khu vực này một cách chi tiết.

Tôi không có sẵn các bản sao của mình - chúng đang ngồi trên giá sách của tôi tại nơi làm việc - nhưng Google nhanh chóng tìm thấy một trích dẫn có liên quan:

Trung bình ngành: "khoảng 15 - 50 lỗi trên 1000 dòng mã được gửi."
(Steve) tiếp tục nói rằng đây thường là đại diện của mã có một số cấp độ lập trình có cấu trúc đằng sau nó, nhưng có lẽ bao gồm một hỗn hợp các kỹ thuật mã hóa.

Trích dẫn từ Code Complete , được tìm thấy tại đây: http://mayerdan.com/ruby/2012/11/11/bugs-per-line-of-code-ratio/

Nếu bộ nhớ phục vụ chính xác, Steve sẽ thảo luận kỹ về điều này, cho thấy rằng các số liệu là không đổi giữa các ngôn ngữ (C, C ++, Java, hội, v.v.) và mặc dù gặp khó khăn (chẳng hạn như xác định "dòng mã" nghĩa là gì).

Quan trọng nhất là anh ta có rất nhiều trích dẫn cho các nguồn của mình - anh ta không đưa ra ý kiến ​​không có căn cứ, nhưng có các tài liệu tham khảo để sao lưu chúng.

Dường như hiểu rõ điều này: Số lượng khiếm khuyết trung bình trên mỗi kloc dường như là một đặc tính của thực tế là các nhà phát triển là con người dễ sai lầm hơn là những lợi thế hoặc bất lợi đặc biệt của một ngôn ngữ hoặc nền tảng cụ thể.

(Ngoài ra: Nếu bạn chưa có Code Complete, hãy mua cho mình một bản sao và đọc kỹ - thật đáng để đầu tư.)

Cập nhật : Có một yếu tố khác với một số câu trả lời ở đây - thống kê quy mô lớn rất hữu ích để đưa ra dự đoán chung nhưng không phải là cụ thể. Hãy xem xét, các bảng tỷ lệ tử vong dân số có thể dự đoán về số người sẽ thiệt mạng trong các vụ tai nạn giao thông trong năm nay nhưng không thể cho bạn biết người nào sẽ chết. Tương tự, các số liệu thống kê ngành cho thấy số lượng khuyết tật tương đối không đổi trên mỗi kloc không thể được sử dụng để dự đoán mức độ tốt - hoặc mức độ kém - một nhà phát triển cụ thể sẽ thực hiện hoặc điều gì sẽ xảy ra trên một dự án nhất định.


4
Không có bản sao Dự toán phần mềm, nhưng trong Mã hoàn thành McConnel trích dẫn báo cáo "Chất lượng chương trình và năng suất lập trình viên" của Capers Jones là nguồn gốc của một bảng lỗi trên mỗi LỘC cho mỗi kích thước dự án. Điểm mà McConnel cố gắng đưa ra là các lỗi tăng lên đáng kể khi quy mô của dự án tăng lên và lưu ý rằng dữ liệu chỉ là một "snapsot của ngành" và "các con số có thể giống với những dự án bạn đã làm ". Tôi thực sự không thấy bất cứ điều gì trong đó có liên quan đến câu hỏi này.
Roc Martí

Phiên bản Code Complete nào bạn có @ RocMartí? Tôi biết rằng phiên bản thứ hai là một bản cập nhật lớn. Sẽ phải đào nó ra và xem nó nói gì khi tôi đi làm vào thứ Hai.
Bevan

Tôi nghĩ rằng chỉnh sửa của bạn ( Cập nhật :) là cốt lõi của vấn đề. Hoặc, như Mark Twain đã nói, có ba loại dối trá: Lies, Damn Lies và Statistics.
GalacticCowboy

1
@ RocMartí "lỗi tăng đáng kể khi kích thước của dự án tăng lên" Có phải ông cũng chỉ ra rằng nước ướt? Tất nhiên có lỗi khi mọi thứ trở nên phức tạp hơn. Bởi vì mọi thay đổi mới phải ghi nhớ mọi phần có thể bị ảnh hưởng. Mà phát triển khi dự án phát triển.
Bắn Parthian

3
Các trích dẫn là sai hoặc lỗi thời. Trong phiên bản thứ hai, nó ở trang 521: "Kinh nghiệm trung bình của ngành là khoảng 1 - 25 lỗi trên 1000 dòng mã cho phần mềm được phân phối. Phần mềm thường được phát triển bằng cách sử dụng một loạt các kỹ thuật."
Aryeh Leib Taurog

18

Yêu cầu là - tốt nhất - ngây thơ.

SLOC không chính xác là một số liệu đáng tin cậy cho bất cứ điều gì hữu ích, ngoại trừ có thể so sánh quy mô của hai hoặc nhiều dự án. Hơn nữa, có hai loại SLOC riêng biệt, LỘC vật lý và LỘC logic và những loại này có thể khác nhau đáng kể. Hãy xem xét ví dụ này, từ Wikipedia :

for (i = 0; i < 100; i += 1) printf("hello"); 

Ở đây chúng ta có một LỘC vật lý, nhưng hai LỘC logic ( forprintfcâu lệnh). Nhưng tất nhiên chúng ta có thể viết ví dụ như:

for (i = 0; i < 100; i += 1) 
  printf("hello"); 

Điều này sẽ cho chúng ta hai LỘC và hai LỘC logic. Tôi nghĩ rõ ràng rằng bất kỳ phép đo "lỗi trên mỗi địa phương" nào phụ thuộc vào các LỘC vật lý sẽ bị phá hỏng bởi phong cách lập trình, do đó, phép đo của chúng tôi sẽ vô dụng.

Mặt khác, nếu chúng ta đã đi với các LỘC logic thì phép đo của chúng ta sẽ phụ thuộc rất nhiều vào các đặc điểm cú pháp của ngôn ngữ. Mặc dù số liệu kết quả thể hơi hữu ích khi so sánh các dự án được viết bằng cùng một ngôn ngữ, nhưng nó sẽ khá vô dụng đối với các dự án được viết bằng các ngôn ngữ khác nhau.

Một nguồn có thể cho khiếu nại là thất bại Phần mềm của Les Hatton - những kẻ theo dõi và ngụy biện :

Chúng ta có thể kết luận rằng sự lựa chọn ngôn ngữ lập trình ít nhất liên quan đến độ tin cậy.

Sau đó, bài báo đề cập đến mật độ khiếm khuyết tương tự cho C và C ++:

Trong một nghiên cứu gần đây so sánh hai hệ thống tương tự có kích thước tương tự nhau, (khoảng 50.000 dòng mỗi dòng), một trong C và một trong C ++ được thiết kế đối tượng, mật độ khiếm khuyết kết quả được hiển thị tương tự nhau ở mức 2,4 và 2,9 trên 1000 dòng.

Tuy nhiên, điều này không có nghĩa là "lỗi trên mỗi LỘC" là không đổi trên các ngôn ngữ lập trình, hoặc nó sẽ có ý nghĩa nếu có.


Nếu bạn cho rằng lỗi / câu lệnh là không đổi thì có sự khác biệt về ngôn ngữ. Ví dụ C thường có lỗi trong for () và printf () args. Nếu bạn phải mã hóa đầy đủ chức năng printf, bạn sẽ có nhiều lỗi tương ứng hơn và nếu bạn có ngôn ngữ cấp cao hơn với một lệnh gọi printRepeat () thì sẽ có ít cơ hội hơn để hiểu sai.
Martin Beckett

2
Tóm tắt: lỗi trên mỗi câu lệnh / điểm chức năng là không đổi, ngôn ngữ cấp thấp có nhiều mã được viết bởi người lập trình dễ đọc, ngôn ngữ cấp cao bạn nhập ít hơn - do đó ít lỗi hơn. Mặc dù lỗi thiết kế hoàn toàn không chính xác có lẽ giống nhau!
Martin Beckett

2
Nói một cách đơn giản rằng những gì cấu thành "một lỗi" là rất chủ quan và các lỗi đó khác nhau rất nhiều về mức độ nghiêm trọng, tác động và tầm quan trọng.
tdammers

@tdammers Và tầm quan trọng đó có thể là tiêu cực. Chúng tôi có một số lỗi mà khách hàng đã sử dụng / mong đợi / mong muốn, vì vậy chúng tôi không thể sửa chúng ...
Izkata

@Izkata: tùy thuộc vào định nghĩa của bạn về một lỗi ...
tdammers

12

Quan sát này rất lâu đời và đến từ một nguồn rất đáng kính, cụ thể là Fred Brooks trong cuốn sách "Tháng huyền thoại của người đàn ông". Ông là một người quản lý hàng đầu tại IBM và quản lý nhiều dự án lập trình bao gồm hệ điều hành hàng triệu hệ điều hành OS / 360. Trong thực tế, ông đã báo cáo rằng số lượng lỗi trong một chương trình không tỷ lệ thuận với độ dài của mã, nhưng là bậc hai ! Theo nghiên cứu của ông, số lượng lỗi tỷ lệ thuận với độ dài của chương trình với sức mạnh 1.5. Nói cách khác, một chương trình dài hơn mười lần có lỗi gấp 30 lần. Và ông đã báo cáo rằng điều này nắm giữ tất cả các ngôn ngữ lập trình và cấp độ ngôn ngữ lập trình.


6

Tôi không thấy lỗi trên mỗi LỘC là không đổi đối với một ngôn ngữ nhất định. Lỗi trên LỘC dường như là một số liệu mà một số Nhà quản lý sử dụng để xác định chất lượng của nhà phát triển khi nói đến thời gian xem xét.

Bây giờ bên ngoài đó, một số ngôn ngữ dễ bị lỗi hoặc khiếm khuyết hơn những ngôn ngữ khác. Thông thường, nhưng không phải lúc nào đây cũng là ngôn ngữ cấp thấp hơn ngôn ngữ cao hơn. Ví dụ, mã hóa bằng C so với C # (hoặc Java.) Tôi thường nói vì thực tế của nó và mấu chốt của câu trả lời mà bạn đang tìm kiếm liên quan đến chất lượng của nhà phát triển và thực tiễn mã hóa. Tôi đã thấy các nhà phát triển C rất giỏi với chất lượng mã cao hơn và số lượng lỗi thấp hơn so với các nhà phát triển Java / C # trung bình. Đây là một mục tách biệt một nhà phát triển cao cấp với một cơ sở. Không phải có bao nhiêu LỘC họ viết trong một khung thời gian nhất định, mà là chất lượng của mã ghi bất kể ngôn ngữ, LỘC hay khung thời gian.

Câu trả lời duy nhất tôi có thể đưa ra có thể liên quan là càng nhiều LỘC thì càng có nhiều khả năng tồn tại khuyết điểm và càng có nhiều khuyết điểm tồn tại.


Câu hỏi của tôi là về số lượng lỗi trung bình trên mỗi dòng mã độc lập với ngôn ngữ.
Kristian

4
@Kristian không có số đó. Nó thay đổi mỗi người liên quan đến công việc và chuyên môn của nhà phát triển và ngôn ngữ họ đang mã hóa. Tôi không nghĩ có một mức trung bình phổ quát.
Akira71

1
@ Akira71 "không có số đó" Chà, chắc chắn rồi. Nhưng có phân phối xác suất, từ đó bạn có thể trích xuất số. Cũng không có số lượng mưa bao nhiêu inch hàng năm trong rừng nhiệt đới Amazon, nhưng bạn có thể lấy trung bình.
Bắn Parthian

3

Lỗi trên mỗi dòng mã

Lỗi / LỘC chỉ liên quan đến một cá nhân. Đối với các doanh nghiệp triển khai các công cụ theo dõi lỗi liên kết với kho lưu trữ mã nguồn của họ. Người quản lý có thể tổ chức các vấn đề theo nhà phát triển, được sắp xếp theo các vấn đề trong quá khứ và thay đổi mã.

Lỗi có liên quan đến công việc của bạn

Một nhà phát triển phần mềm cao cấp, người có nhiều kinh nghiệm, có tay nghề cao, rất thông minh và có thể đảm nhận các công việc độc lập có nhiều khả năng có nhiều lỗi đăng nhập vào hệ thống theo dõi, sau đó là một nhà phát triển cơ sở có ít kinh nghiệm.

Làm thế nào là có thể?

Các nhà phát triển cao cấp thường tham gia vào các nhiệm vụ phát triển rủi ro cao hơn. Tái cấu trúc mã và xây dựng các hệ thống mới làm ví dụ. Các nhà phát triển trẻ thường được chỉ định để khắc phục các sự cố đã biết không xứng đáng với thời gian của nhà phát triển cấp cao.

Do đó, bằng cách phân công nhiệm vụ, một thiếu niên không giới thiệu các lỗi mà chỉ sửa chúng và một nhà phát triển cấp cao được phép mạo hiểm giới thiệu chúng, bởi vì lợi ích của những gì họ đang cố gắng lưu trữ là quan trọng hơn sau đó các vấn đề nhỏ được nêu ra hoàn thành những vấn đề đó nhiệm vụ.

Cú pháp ngôn ngữ là quan trọng

Lập luận rằng một ngôn ngữ giới thiệu ít lỗi hơn, bởi vì nó có thể đạt được nhiều hơn trong ít dòng mã hơn là một huyền thoại hoàn chỉnh. Các ngôn ngữ có cấu trúc cao như C ++ / C # / Java buộc nhà phát triển phải thể hiện rõ ràng bằng văn bản hướng dẫn mong muốn là gì, trong khi các ngôn ngữ như Python / PHP rất không có cấu trúc. Những ngôn ngữ này cho phép các biểu thức bằng văn bản không chỉ gây nhầm lẫn cho nhà phát triển mà còn cả trình phân tích ngôn ngữ.

Trình biên dịch làm giảm lỗi

Có bao nhiêu lỗi trong Python / PHP đã đưa nó vào các máy chủ sản xuất, vì không có trình biên dịch để cảnh báo nhà phát triển rằng có gì đó không đúng. Khi bạn đo lỗi trên mỗi LỘC là trước hoặc sau khi trình biên dịch đã xử lý mã nguồn?

Cập nhật 2019:

Trình biên dịch không tạo ra sự khác biệt về bản chất hoặc số lượng lỗi. Lỗi hoàn toàn liên quan đến người đã viết mã nguồn và bản thân các lỗi có thể rất chủ quan.


3
Trình biên dịch lại giảm lỗi: Cả Python và PHP về mặt kỹ thuật đều có trình biên dịch, chúng chỉ không thực hiện cùng một kiểm tra mà các ngôn ngữ gõ tĩnh làm. Tôi cũng không đồng ý rằng việc kiểm tra như vậy có ảnh hưởng đáng kể đến số lỗi kết thúc bởi vì hầu như tất cả các lỗi có thể bị bắt bởi trình biên dịch đều bị bắt với kiểm tra tối thiểu.
Winston Ewert

3
Đồng ý rằng các lỗi có thể bị trình biên dịch bắt gặp thường sẽ bị bắt với kiểm tra thủ công hoặc tự động hợp lý. Sự khác biệt là các ngôn ngữ được nhập tĩnh cung cấp cho bạn bài kiểm tra đầu tiên (a) miễn phí và (b) thực sự, thực sự nhanh chóng. Một bộ kiểm thử đơn vị Ruby tốt hơn trình biên dịch, nhưng bạn thường không thể chạy chúng nhanh như vậy, bạn không nhận được chúng miễn phí và chúng thường sẽ không chỉ gần với dòng mã đó là vấn đề.
Ken Smith

@KenSmith loại tĩnh không miễn phí. khóa học.cs.washington.edu / cifts / cse590n / 10au / từ
Hugo Wood

1

FWIW, theo kinh nghiệm của tôi

  1. Có hai loại lỗi: a) trong đó chương trình không đáp ứng được kỳ vọng và b) khi chương trình không thể đáp ứng bất kỳ kỳ vọng hợp lý nào, vì nó gặp sự cố / treo / không biên dịch.

  2. Bất kể ngôn ngữ nào, lỗi loại (b) là do sự dư thừa trong cấu trúc dữ liệu / lớp, trong đó việc thay đổi thứ gì đó trong một phần của cấu trúc dữ liệu sẽ đặt cấu trúc ở trạng thái không nhất quán / bị hỏng cho đến khi một hoặc nhiều thay đổi tương ứng được thực hiện ở các phần khác . Đóng góp cho điều này là sự dư thừa của mã nguồn, trong đó việc chỉnh sửa một dòng mã làm cho mã không chính xác cho đến khi một hoặc nhiều thay đổi được thực hiện ở các phần khác. Tất nhiên, hai loại dự phòng này có liên quan chặt chẽ với nhau, và vì các lập trình viên không phải là siêu nhân nên họ bị phân tâm, quên đồ và mắc lỗi, từ đó mắc lỗi.

Những điều này (một lần nữa, theo kinh nghiệm của tôi) không thực sự là một chức năng của ngôn ngữ, mà là về kỹ năng / sự trưởng thành của lập trình viên. Các chương trình ít bị lỗi hơn cũng có xu hướng nhỏ hơn nhiều, về mặt LỘC, cho một bộ chức năng nhất định.

Tôi đã thấy các hệ thống trong đó một số người viết chương trình, trong khi những người khác viết thư mục và trước đây có xu hướng "chỉ hoạt động" so với hệ thống sau.


1

Tôi hy vọng rằng một yếu tố chính trong lỗi mã hóa liên quan đến cái mà tôi gọi là "khoảng cách ngữ nghĩa" giữa một loại định nghĩa giải pháp cụ thể và mã để giải quyết nó - trong đó đây là những lỗi cải cách chặt chẽ sẽ rõ ràng hơn, trong đó mã rất rõ ràng khác nhau, nhiều lỗi có thể được dự kiến. Mô hình của một số ngôn ngữ nhất định phù hợp chặt chẽ với các miền vấn đề nhất định - bảng tính rất phù hợp với các tính toán kinh doanh hàng ngày, dẫn đến cả rất ít "mã" và "mã" rất gần với miền vấn đề. Mã dự kiến ​​là rất ngắn gọn (ít KLOC) và một vài lỗi. Ngược lại, sử dụng trình biên dịch sẽ yêu cầu nhiều KLOC và có khả năng tạo ra vô số lỗi.


Làm thế nào điều này được hạ cấp? SO đang trở nên đầy những chú hề
codyc4321

0

Thay vì nói về các dòng mã - thực sự là một số liệu vô dụng - tôi muốn giải quyết phần này trong câu hỏi của bạn:

Liệu các ngôn ngữ cấp cao hơn dẫn đến ít lỗi hơn?

Điều này khác với lỗi / LỘC, vì các ngôn ngữ cấp cao làm được nhiều hơn với ít mã hơn. Việc thực hiện một số yêu cầu tính năng có thể mất 500 dòng LISP so với 15000 dòng lắp ráp x86.

Vì vậy, ngay cả khi lỗi / LỘC không đổi giữa tất cả các ngôn ngữ, ngôn ngữ cấp cao hơn vẫn sẽ mang lại ít lỗi hơn.


2
Các dòng mã "số liệu vô dụng"? Không, đó là một xấp xỉ thô của độ phức tạp của chương trình. Nó có thể hữu ích vì nó dễ đo lường và cũng liên quan chặt chẽ đến thời gian phát triển.
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.