Số liệu khách quan cho chất lượng phần mềm [đã đóng]


12

Có nhiều loại chất lượng khác nhau có thể được đo lường trong các sản phẩm phần mềm, ví dụ như thể dục cho mục đích (ví dụ: sử dụng cuối), khả năng duy trì, hiệu quả. Một số trong số này hơi chủ quan hoặc cụ thể theo miền (ví dụ: các nguyên tắc thiết kế GUI tốt có thể khác nhau giữa các nền văn hóa hoặc phụ thuộc vào bối cảnh sử dụng, hãy nghĩ rằng quân đội so với sử dụng của người tiêu dùng).

Điều tôi quan tâm là một dạng chất lượng sâu hơn liên quan đến mạng (hoặc biểu đồ) của các loại và mối liên quan của chúng, nghĩa là, mỗi loại tham chiếu đến loại nào, có các cụm liên kết có thể xác định rõ ràng liên quan đến một cách đúng đắn kiến trúc theo tầng, hoặc ngược lại là có một 'quả bóng' lớn của các tham chiếu loại (mã 'nguyên khối'). Ngoài ra, kích thước của từng loại và / hoặc phương thức (ví dụ: được đo bằng số lượng mã byte Java hoặc .Net IL) sẽ đưa ra một số dấu hiệu về nơi các thuật toán phức tạp lớn đã được triển khai dưới dạng các khối mã nguyên khối thay vì được phân tách thành dễ quản lý / bảo trì hơn miếng, mảnh nhỏ.

Một phân tích dựa trên những ý tưởng như vậy có thể có thể tính toán các số liệu ít nhất là một proxy cho chất lượng. Ngưỡng chính xác / điểm quyết định giữa chất lượng cao và thấp tôi nghi ngờ là chủ quan, ví dụ như bởi tính bảo trì, chúng tôi có nghĩa là khả năng duy trì của các lập trình viên con người và do đó phân rã chức năng phải tương thích với cách thức hoạt động của tâm trí con người. Như vậy, tôi tự hỏi liệu có bao giờ có một định nghĩa thuần túy về mặt toán học về chất lượng phần mềm vượt qua tất cả các phần mềm có thể trong tất cả các tình huống có thể.

Tôi cũng tự hỏi liệu đây có phải là một ý tưởng nguy hiểm không, nếu các proxy khách quan về chất lượng trở nên phổ biến thì áp lực kinh doanh sẽ khiến các nhà phát triển theo đuổi các số liệu này với chi phí của chất lượng tổng thể (các khía cạnh chất lượng không được đo lường bởi các proxy).

Một cách nghĩ khác về chất lượng là từ quan điểm của entropy. Entropy là xu hướng của các hệ thống hoàn nguyên từ các trạng thái bị rối loạn. Bất cứ ai đã từng làm việc trong một thế giới thực, dự án phần mềm quy mô vừa và lớn sẽ đánh giá cao mức độ mà chất lượng của cơ sở mã có xu hướng suy giảm theo thời gian. Áp lực kinh doanh nói chung dẫn đến những thay đổi tập trung vào chức năng mới (ngoại trừ chính chất lượng là điểm bán hàng chính, ví dụ như trong phần mềm điện tử hàng không) và làm xói mòn chất lượng thông qua các vấn đề hồi quy và chức năng 'ghê gớm' khi nó không phù hợp một quan điểm chất lượng và bảo trì. Vì vậy, chúng ta có thể đo entropy của phần mềm? Và nếu vậy thì thế nào?


Tôi đồng ý với S. Lott. Trong cuộc sống thường có sự khác biệt giữa "nó phải như thế nào" và "nó như thế nào". Cậu bé ước gì nhiều người trên hành tinh này đã vượt qua 'ý định tốt' của họ và nhìn chăm chú vào 'nó như thế nào'. Ngoài các ưu đãi sai, sẽ có một cảm giác an toàn sai lầm nguy hiểm. Kết hợp điều đó với những người đang cố gắng chơi trò chơi hệ thống (điều này chỉ là tự nhiên vì họ LUÔN cố gắng cải thiện điều kiện của họ (dù là tiền tệ hay khác)), và bạn sẽ gặp phải một tình huống tồi tệ. Không có gì ngạc nhiên khi các vụ tai nạn thị trường "một lần trong một thiên niên kỷ" xảy ra cứ sau 2 thập kỷ.
Công việc

Câu trả lời:


20

Đây là một ý tưởng nguy hiểm. Proxy "khách quan" cho chất lượng dẫn trực tiếp đến phần thưởng quản lý và nhà phát triển sẽ theo đuổi các số liệu này với chi phí chất lượng thực tế.

Đây là luật của hậu quả không lường trước được.

Chất lượng - trong khi quan trọng - chỉ là một khía cạnh nhỏ của phần mềm. Chức năng và giá trị được tạo ra bởi phần mềm là rất xa, quan trọng hơn nhiều so với chất lượng.

Tất cả các số liệu dẫn đến hoạt động để tối ưu hóa số liệu. Điều đó, đến lượt nó, có những hậu quả mà bạn có thể không thực sự thích.

Phần mềm rất phức tạp. Thật khó để hiểu nó thực sự phức tạp như thế nào.

Ngay cả những điều "rõ ràng" như bảo hiểm mã kiểm tra đơn vị có thể lãng phí thời gian. Để đạt 100% có thể yêu cầu tạo các thử nghiệm thực sự phức tạp hơn mã tầm thường đang được thử nghiệm. Nhận bảo hiểm 100% có thể liên quan đến một chi phí không thể chấp nhận. [Thay thế cho mã tầm thường, nhỏ, hiếm khi được sử dụng là kiểm tra bằng cách kiểm tra. Nhưng điều đó không phù hợp với trò chơi số liệu 100%.]

Một ví dụ khác là độ phức tạp Cyclomatic. Đây là một trong những biện pháp tốt nhất về chất lượng mã. Nhưng nó có thể được chơi bằng cách tạo ra nhiều chức năng nhỏ có thể khó đọc hơn (và khó bảo trì hơn) so với một chức năng lớn hơn. Bạn kết thúc các bài đánh giá mã nơi bạn đồng ý rằng nó có thể không dễ đọc nhưng nó đáp ứng ngưỡng phức tạp.


3
"Tất cả các số liệu dẫn đến hoạt động để tối ưu hóa số liệu." Tôi nghĩ rằng điều đó là quá thường xuyên. Tuy nhiên, nó không nên. Các số liệu nên, như tôi đã đề cập trong đoạn cuối của tôi, hướng dẫn quản lý. Tuy nhiên, quá thường xuyên, các quyết định được đưa ra độc quyền bởi vì và đối với các con số, mà không hiểu ý nghĩa của các con số và rủi ro và sự đánh đổi liên quan đến quyết định.
Thomas Owens

3
"Tuy nhiên, nó không nên." Giải thích một số cách mà mọi người có thể được yêu cầu không tối ưu hóa phần thưởng của họ. Tìm một ví dụ duy nhất về hành vi của con người trong đó phần thưởng văn hóa (dựa trên tất cả các loại cấu trúc xã hội điên rồ) không phải là chính, tối quan trọng và là điều quan trọng nhất mà mọi người sẽ theo đuổi. Bất cứ điều gì liên quan đến "nên" hoặc "không nên" phải được đánh giá dựa trên những gì mọi người thực sự làm. Họ thực sự tối ưu hóa phần thưởng của họ. Nếu số liệu là một phần của phần thưởng, mọi người sẽ tối ưu hóa số liệu. Vui lòng không sử dụng "nên" để mô tả hành vi của mọi người.
S.Lott

2
@Thomas Owens: "Đơn giản là bạn không có bất kỳ phần thưởng nào để tối ưu hóa dựa trên số liệu". Điều đó thật buồn cười. Làm thế nào bạn sẽ giữ chúng bí mật như vậy? Khi tôi phát hiện ra rằng mã của bạn được chấp nhận sớm hơn mã của tôi, tôi sẽ muốn biết cách quản lý quyết định rằng mô-đun của bạn đã được thực hiện và mã của tôi đã không được thực hiện. Khi tôi tìm thấy số liệu "hướng dẫn" quyết định đó, tôi sẽ hoàn toàn chơi các số liệu để hoàn thành sớm nhất là bạn. Nếu không có số liệu nào tôi có thể chơi trò chơi, thì tôi sẽ thấy rằng quyết định đó là tùy tiện, quản lý thích bạn hơn tôi và tôi sẽ bỏ việc vì không có tiêu chuẩn hiệu suất nào tôi có thể nhận thấy.
S.Lott

2
@Thomas Owens: "Tôi chưa bao giờ thấy số liệu dẫn đến phần thưởng". Khuyến khích văn hóa tồn tại trong tất cả các tình huống mà hai hoặc nhiều người làm việc cùng nhau. "Các cá nhân được công nhận cho hiệu suất của họ". Một số liệu cho độ phức tạp chu kỳ trở thành một mục tiêu. Nếu bạn đáp ứng mục tiêu phức tạp theo chu kỳ của bạn nhanh hơn tôi, thì có những phần thưởng văn hóa: bạn "năng suất" hơn tôi. Tôi cần chơi trò chơi số liệu phức tạp của mình để xuất hiện "hiệu quả" như bạn.
S.Lott

2
@Thomas Owens: "Đó là vấn đề của niềm tự hào cá nhân". Đó là một ví dụ tuyệt vời của một hệ thống khen thưởng văn hóa. Số liệu có thể sai lệch điều này vì những hậu quả không lường trước được khi có thể tạo ra một số liệu đẹp mắt không phù hợp với mã tốt. Bạn đã cung cấp một ví dụ tuyệt vời về phần thưởng văn hóa có thể bị sai lệch bởi các số liệu.
S.Lott

4

Tôi cũng tự hỏi liệu đây có phải là một ý tưởng nguy hiểm không, nếu các proxy khách quan về chất lượng trở nên phổ biến thì áp lực kinh doanh sẽ khiến các nhà phát triển theo đuổi các số liệu này với chi phí của chất lượng tổng thể (các khía cạnh chất lượng không được đo lường bởi các proxy).

Bingo, và không "nếu" về nó. Đây được gọi là "Rối loạn đo lường" và đã được quan sát và viết về nhiều lần Joel viết một bài báo về nó vào năm 2002 khi đề cập đến một cuốn sách của một giáo sư Harvard.

Điều đó không có nghĩa là các số liệu như vậy là vô ích, chỉ là người ta không bao giờ nên dựa trên các khuyến khích hoặc chính sách rõ ràng về các phép đo proxy như vậy. Nếu bạn muốn cải thiện chất lượng, một số liệu proxy có giá trị rất xấu có lẽ là một điểm tốt để bắt đầu. Nhưng bạn không thể kết luận rằng chất lượng là tốt chỉ vì tất cả các số liệu của bạn có giá trị lớn.


3

Điều tôi quan tâm là một dạng chất lượng sâu hơn liên quan đến mạng (hoặc biểu đồ) của các loại và mối liên quan của chúng, nghĩa là, mỗi loại tham chiếu đến loại nào, có các cụm liên kết có thể xác định rõ ràng liên quan đến một cách đúng đắn kiến trúc theo tầng, hoặc ngược lại là có một 'quả bóng' lớn của các tham chiếu loại (mã 'nguyên khối').

Điều này nghe giống như fan-in và fan-out. Fan-in đếm số lượng mô-đun gọi một mô-đun nhất định và quạt ra đếm số lượng mô-đun được gọi bởi một mô-đun nhất định. Một dấu hiệu cảnh báo sẽ sử dụng là các mô-đun có một quạt lớn và một quạt lớn, vì điều này có thể cho thấy thiết kế kém và là mục tiêu chính để tái cấu trúc hoặc thiết kế lại.

Ngoài ra, kích thước của từng loại và / hoặc phương thức (ví dụ: được đo bằng số lượng mã byte Java hoặc .Net IL) sẽ đưa ra một số dấu hiệu về nơi các thuật toán phức tạp lớn đã được triển khai dưới dạng các khối mã nguyên khối thay vì được phân tách thành dễ quản lý / bảo trì hơn miếng, mảnh nhỏ.

Một phép đo đơn giản sẽ là các dòng mã. Bạn có thể chia nó thành tổng số dòng mã trên toàn bộ dự án và dòng mã cho mỗi mô-đun (có thể sử dụng các mô-đun kích thước khác nhau). Bạn có thể sử dụng điều này như một chỉ báo cảnh báo cho biết rằng bạn nên xem lại các mô-đun cụ thể. Một cuốn sách về các phép đo và số liệu chất lượng phần mềm thảo luận về một số công việc chỉ ra rằng mối quan hệ giữa tỷ lệ lỗi và kích thước mô-đun là độ cong, trong đó khuyết tật trung bình trên mỗi KSLOC đi kèm với các mô-đun có kích thước từ 175 đến 350 SLOC.

Một cái gì đó phức tạp hơn một chút sẽ là độ phức tạp theo chu kỳ, được thiết kế để chỉ ra khả năng kiểm tra, tính dễ hiểu và khả năng bảo trì của một hệ thống. Độ phức tạp theo chu kỳ đếm số lượng đường dẫn độc lập thông qua một ứng dụng hoặc mô-đun. Số lượng thử nghiệm, và do đó nỗ lực cần thiết để sản xuất và thực hiện các thử nghiệm, có liên quan mạnh mẽ đến độ phức tạp chu kỳ.

Ngưỡng chính xác / điểm quyết định giữa chất lượng cao và thấp tôi nghi ngờ là chủ quan, ví dụ như bởi tính bảo trì, chúng tôi có nghĩa là khả năng duy trì của các lập trình viên con người và do đó phân rã chức năng phải tương thích với cách thức hoạt động của tâm trí con người.

Tôi không chắc đó là trường hợp.

Ví dụ, đã có nghiên cứu cho thấy rằng bộ nhớ làm việc của con người chỉ có thể chứa 7 cộng / trừ 2 đối tượng . Điều này có thể được quan tâm để đo lường quạt vào và ra - nếu tôi làm việc trong một mô-đun và nó được kết nối với hơn 7 mô-đun khác, tôi có thể sẽ không thể theo dõi chính xác những gì các mô-đun khác trong đầu tôi.

Cũng đã có nghiên cứu về các khiếm khuyết liên quan đến các số liệu như độ phức tạp chu kỳ. Vì bạn muốn giảm thiểu các khiếm khuyết trong hệ thống của mình, bạn có thể xác định các điểm cần thử nghiệm hoặc tái cấu trúc nhiều hơn, như được xác định bởi độ phức tạp chu kỳ cao.

Tôi cũng tự hỏi liệu đây có phải là một ý tưởng nguy hiểm không, nếu các proxy khách quan về chất lượng trở nên phổ biến thì áp lực kinh doanh sẽ khiến các nhà phát triển theo đuổi các số liệu này với chi phí của chất lượng tổng thể (các khía cạnh chất lượng không được đo lường bởi các proxy).

Đây là trường hợp với bất kỳ phép đo hoặc số liệu. Chúng cần được sử dụng để hiểu hệ thống và đưa ra quyết định sáng suốt. Cụm từ "bạn không thể quản lý những gì bạn không thể đo lường" xuất hiện trong tâm trí. Nếu bạn muốn phần mềm chất lượng cao, bạn cần một số phép đo và số liệu để đánh giá chất lượng đó. Tuy nhiên, có một mặt trái của điều này. Bạn không thể quản lý độc quyền bằng những con số. Bạn có thể sử dụng các con số để đưa ra quyết định sáng suốt, nhưng bạn không thể đưa ra quyết định chỉ vì các con số nói như vậy.


Điều thú vị với fan-in / out là nó cung cấp hai số cho mỗi mô-đun / lớp (hoặc bất cứ điều gì) và do đó bỏ qua một số cấu trúc tổ chức sâu hơn về cách các mô-đun được kết nối. Ví dụ: bạn có thể có một cụm nhỏ các mô-đun được kết nối cao liên quan đến tầng logic và bạn sẽ mong đợi các kết nối giữa các tầng là tối thiểu (so sánh), thể hiện giao diện / hợp đồng được xác định rõ giữa các tầng. Tôi cho rằng chúng tôi rất vui khi một số mô-đun được kết nối nhiều (ví dụ: các phương thức / lớp trợ giúp thường được sử dụng), nhưng tùy thuộc vào 'cấu trúc' của kết nối (đó là giả thuyết của tôi).
redcalx

.... các lớp bên ngoài gói của tôi hoặc các lớp Z trong gói cụ thể này. Nếu bạn thấy quạt giữa các mô-đun trong mô hình dữ liệu và các mô-đun trong Giao diện người dùng của bạn, đó có thể là một chỉ báo của một vấn đề. Bạn cần phải đào sâu hơn một chút so với chỉ các số nguyên.
Thomas Owens

3

Có các số liệu hoặc proxy cho nhiều phẩm chất bạn quan tâm:

  1. Dòng mã
  2. Quạt vào, quạt ra
  3. Tỷ lệ lỗi trên 1000 dòng mã
  4. Phức tạp cyclomatic
  5. Mã số bảo hiểm
  6. Bảo hiểm điểm quyết định
  7. Tỷ lệ lỗi được sửa / giới thiệu bởi các hoạt động bảo trì
  8. Phân tích điểm chức năng

Có một số vấn đề với tất cả các mục này:

  1. Công việc đang được thực hiện để tối ưu hóa số liệu - một xu hướng phổ quát; ồ ạt làm trầm trọng thêm nếu bất kỳ số liệu nào được sử dụng làm cơ sở để đánh giá hoặc khen thưởng cho các đội hoặc cá nhân.
  2. Tôi không biết bất kỳ số liệu nào là bối cảnh miễn phí. Điều này ngụ ý rằng không thể so sánh giữa các cửa hàng - chỉ trong các cửa hàng, theo thời gian. Các số liệu phát sinh từ các so sánh như vậy vẫn có giá trị - "chúng tôi đang sản xuất mã chính xác hơn so với một năm trước".

Hiệu quả tổng thể của những vấn đề này là các số liệu như chúng chỉ có giá trị trong một nền văn hóa rộng hơn - chẳng hạn như TQM, đảm bảo chất lượng (không kiểm soát), cải tiến liên tục, kaizan, v.v. Cần xác định các yếu tố của cả hai nền văn hóa và làm thế nào nó cần thay đổi. Nếu bạn có định nghĩa về những điều này, thì các số liệu như chúng sẽ trở thành các công cụ thiết yếu giúp cải thiện chất lượng mã, thực hành làm việc, năng suất, v.v. Nếu không có bối cảnh rộng hơn này, các số liệu sẽ tạo ra công việc để tối ưu hóa số liệu; sẽ trở thành công cụ của máy đếm đậu để tăng năng suất và giảm chi phí; và sẽ trở thành một trở ngại để được các nhân viên phát triển đánh cược.


2

Bạn có thể bị ám ảnh bởi các số liệu, hoặc bạn có thể bị ám ảnh bởi những người giỏi nhất, công cụ, thực hành cho kỹ thuật và QA mà bạn có thể chi trả. Tôi sẽ hạnh phúc hơn nhiều khi có một vài thiên tài QA hoang tưởng đã đọc 'Fooled by Randomness' và những người thích tự động hóa hơn một loạt các báo cáo được định dạng độc đáo với các con số.


+1 để tham khảo sách Nassim Taleb. Lý luận / nhận thức luận thiếu sót nằm trong chuỗi quan hệ nhân quả cho chất lượng thấp.
redcalx

@locster, bình luận của bạn làm tôi nghĩ đến toán tử đường ống F # :). Bạn bắt đầu với 'Tham chiếu sách Nassim Taleb' nhưng kết thúc bằng 'chuỗi nhân quả cho chất lượng thấp' (thay vì 'chuỗi nhân quả chất lượng thấp'). Cũng giống như trong tiếng Anh, đôi khi chúng ta muốn có hai cách nói, chúng ta cũng có thể thích ngôn ngữ lập trình đó.
Công việc

1

Có vấn đề cơ bản với số liệu này.

Gần như tất cả các số liệu được đề xuất đã được hiển thị, trong thế giới thực trên mã thực, có mối tương quan mạnh mẽ hoặc rất mạnh với SLOC thô (các dòng mã nguồn).

Đây là những gì đã giết chết số liệu của Halstead, vào những năm 1970. (Tình cờ một ngày, khoảng năm 1978, tôi đã nói chuyện với một tiến sĩ mới về số liệu của Halstead, trong đó ông đã chỉ ra điều này.)

Gần đây, độ phức tạp theo chu kỳ của McCabe đã được chứng minh là có mối tương quan rất mạnh với SLOC thô, đến mức anh chàng nghiên cứu đã tự hỏi to lên nếu số liệu của McCabe nói với chúng tôi bất cứ điều gì hữu ích.

Chúng tôi đã biết trong nhiều thập kỷ rằng các chương trình lớn có nhiều khả năng có vấn đề hơn các chương trình nhỏ. Trong nhiều thập kỷ, chúng ta đã biết rằng các chương trình con lớn thường có lỗi hơn các lỗi nhỏ. Tại sao chúng ta cần số liệu phức tạp để nói với chúng ta điều này, khi nhìn vào bốn trang máy in trải rộng trên một bảng sẽ đủ thuyết phục?


Để có thể duy trì, chúng ta cần mã nằm trong khối của con người, do đó, một số liệu SLOC trông khá tốt từ quan điểm đó. Tuy nhiên, đối với một kích thước nhất định, bạn có thể có số lượng đường dẫn duy nhất khác nhau (theo độ phức tạp theo chu kỳ) và tôi sẽ lập luận rằng nhiều đường dẫn hơn là một proxy cho dễ hiểu hơn. Do đó, tôi cho rằng CC có thể bổ sung / một số / giá trị bổ sung cho SLOC, miễn là bạn cho phép một số tính linh hoạt, ngoại lệ cho quy tắc, v.v. Nghĩa là, không thực thi nghiêm ngặt CC.limits / mục tiêu.
redcalx

1
@locster: Với hai mô-đun 100 SLOC, một mô-đun có CC là 47 có thể có nhiều vấn đề hơn so với một mô-đun là 3. TUY NHIÊN, đối với mã trong thế giới thực, với số lượng lớn, người ta thấy rằng các mô-đun ngắn có xu hướng thấp CC và các mô-đun dài có xu hướng có CC cao, đến mức biết rằng SLOC cung cấp cho bạn một dự đoán rất tốt về CC, và ngược lại. Đây là những gì có nghĩa là "tương quan rất mạnh." NHƯ VẬY, trên mã thực, bất kỳ lợi ích nào bạn nhận được từ việc nhận thấy CC = 47 là DỄ DÀNG HƠN từ việc nhận thấy SLOC = 1500. (Các số được rút ngẫu nhiên, nguyên tắc là như nhau.)
John R. Strohm 5/213

Có, tôi đồng ý rằng họ sẽ có xu hướng tương quan mạnh mẽ, mặc dù mối quan hệ nói chung là phi tuyến tính. ví dụ: Điểm CC gần bằng LỘC được nâng lên thành một số sức mạnh. Vì vậy, từ quan điểm tâm lý, điểm CC có thể được nhìn thấy trở nên rất lớn rất nhanh, trong khi điểm SLOC liên quan có vẻ như 'chỉ cao hơn một chút'. Có tôi biết tôi đang bám vào ống hút ở đây :)
redcalx

@locster: Tôi đã làm điều này trong hơn 30 năm. Những ngày này, tôi thường xuyên thấy các thói quen chạy theo dòng ý thức, cứ lặp đi lặp lại trong vài trăm SLOC, không có lý do. Trong tất cả những năm đó, tôi đã thấy chính xác một (1) thói quen thực sự CẦN phải là nhiều hơn một trang mã máy in (khoảng 60 dòng). Tất cả những thứ còn lại có thể đã được cân nhắc khá có lợi, và khả năng đọc và độ tin cậy tăng lên đáng kể. (Điều đó không tính các máy trạng thái lớn. Chúng có thể là một vấn đề trong lĩnh vực này, nhưng chúng là RARE.)
John R. Strohm

-2

Đưa ra tất cả các câu trả lời khác ở đây, tôi cảm thấy ngớ ngẩn với câu trả lời nhỏ này. Hãy xem Crap4j , công ty cố gắng xếp hạng các phương thức trong java bằng cách chúng bốc mùi. (Dự án có vẻ bị bỏ hoang.)

Nó sử dụng kết hợp độ phức tạp chu kỳ và phạm vi kiểm tra. Giống như mọi số liệu khác, nó có thể chơi được.

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.