Tại sao phầm mềm lại có lỗi?

Bài viết sau dịch từ nguồn: http://www.softwaretestinghelp.com/why-does-software-have-bugs/

Lỗi phần mềm là gì?

Lỗi phần mềm là một thất bại hoặc sai sót gây ra kết quả sai hoặc không mong muốn trong một chương trình. Đó là một lỗi khiến cho ứng dụng không thể vận hành như mong muốn.

Tại sao phần mềm lại có lỗi?

Có rất nhiều nguyên nhân dẫn đến lỗi phần mềm. Lý do thường gặp nhất đó là do sai sót của con người trong quá trình thiết kế và lập trình.
Khi đã biết được nguyên nhân dẫn đến những khiếm khuyết của phấn mềm, việc sửa chữa để giảm thiểu những khiếm khuyết đó sẽ trở nên dễ dàng hơn rất nhiều.

Top 20 nguyên nhân dẫn đến lỗi phần mềm

1. Hiểu lầm trong giao tiếp hoặc không có giao tiếp

Thành công của ứng dụng phần mềm nào cũng đều dựa vào sự giao tiếp giữa các bên liên quan, đội ngũ phát triển và đội ngũ kiểm thử. Những yêu cầu không rõ ràng và những hiểu lầm về các yêu cầu là hai lý do chính dẫn đến khiếm khuyết trong phần mềm. Ngoài ra, những khiếm khuyết phát sinh trong giai đoạn phát triển còn là do đội ngũ phát triển không được thông báo chính xác về các yêu cầu.

2. Sự phức tạp của phần mềm

Sự phức tạp của các ứng dụng phần mềm hiện hành có thể trở nên rất khó hiểu đối với bất kỳ ai không có kinh nghiệm trong lĩnh vực phát triển phần mềm hiện đại. Các giao diện loại Windows, cấu trúc máy khách-máy chủ và các ứng dụng phân tán, truyền thông dữ liệu, cơ sở dữ liệu quan hệ khổng lồ, và kích thước của các ứng dụng đã góp phần làm tăng thêm sự phức tạp của phần mềm / hệ thống. Và việc áp dụng những kỹ thuật hướng đối tượng có thể phức tạp hóa, thay vì đơn giản hóa, một dự án, trừ khi dự án đó được thiết kế tốt.

3. Lỗi lập trình

Các lập trình viên cũng là con người, nên việc họ mắc sai sót là điều bình thường. Không phải thành viên nào của đội phát triển cũng là chuyên gia về miền. Những lập trình viên thiếu kinh nghiệm hay không có kiến thức thích hợp về miền có thể mắc phải những lỗi rất đơn giản trong khi lập trình. Việc thiếu thực hành các thao tác lập trình đơn giản, kiểm thử đơn vị hay gỡ lỗi là một số nguyên nhân thường thấy dẫn đến các lỗi phát sinh trong quá trình phát triển.

4. Thay đổi yêu cầu

Khách hàng có thể không hiểu được ảnh hưởng mà những thay đổi đó gây ra, hoặc là họ hiểu nhưng vẫn yêu cầu thay đổi - thiết kế lại, thay đổi nhân sự, ảnh hưởng đến những dự án khác, những đầu việc đã hoàn thành có thể cần làm lại hoặc bỏ đi, những yêu cầu về phần cứng có thể bị ảnh hưởng, v.v...Khi thay đổi xảy ra, dù lớn hay nhỏ thì những mắt xích giữa các phần của dự án cũng rất có khả năng sẽ tương tác với nhau và gây ra vấn đề; và quá trình giám sát những thay đổi sẽ rất phức tạp và dễ dẫn đến lỗi. Qua đó, tinh thần làm việc của đội ngũ nhân sự cũng có thể bị ảnh hưởng.
Trong một vài môi trường kinh doanh hay thay đổi thì yêu cầu thay đổi liên tục có thể là một thực tế của cuộc sống. Trong trường hợp này, đội ngũ quản lý phải hiểu rõ được những nguy cơ sẽ xảy ra, và đội ngũ QA và kỹ sư kiểm thử phải thích ứng và lên kế hoạch cho việc kiểm thử rộng rãi và liên tục để đảm bảo là các lỗi không thể tránh khỏi sẽ không vượt khỏi tầm kiểm soát.

5. Áp lực thời gian

Việc lên lịch cho các dự án phần mềm là khó nhất, và thường đòi hỏi con người phải phỏng đoán rất nhiều. Khi hạn chót gần kề và khủng hoảng xuất hiện thì sai lầm là điều rất khó tránh khỏi. Lịch trình không thực tế, mặc dù không phổ biến, nhưng lại là mối quan tâm chính trong các dự án quy mô nhỏ / công ty và dễ dẫn đến lỗi phần mềm. Nếu không có đủ thời gian để thiết kế, coding và kiểm thử một cách hoàn chỉnh thì chắc chắn phần mềm sẽ có lỗi.

6. Người tự đại hoặc quá tự tin

Là người thường nói những câu như: ‘Không vấn đề’ ‘dễ như ăn bánh mà’ ‘chỉ cần vài tiếng là tôi có thể hoàn thành’ ‘nâng cấp đoạn code cũ đó cũng dễ ấy mà’ thay vì những câu như: ‘chuyện đó sẽ khiến tất cả phức tạp lên rất nhiều và có thể dẫn đến một loạt lỗi sai’ ‘chúng tôi không chắc là có thể làm được không, nhưng chúng tôi sẽ thử xem’ ‘chừng nào chưa xem xét kỹ thì tôi chưa thể ước lượng xem việc này sẽ mất bao lâu’
‘chúng tôi không thể tìm hiểu được là đoạn "code lẩu" (spaghetti code) đó ban đầu có tác dụng gì’ Nếu có quá nhiều câu “không vấn đề” không thực tế như vậy thì kết quả sẽ là một loạt các lỗi phần mềm.

7. Code được tài liệu hóa kém

Rất khó để duy trì và sửa đổi code được viết hoặc được ghi lại với chất lượng kém; và kết quả sẽ là lỗi phần mềm. Trong các tổ chức, phía quản lý thường không thể hiện sự khuyến khích để các lập trình tài liệu hóa code của họ hoặc viết những đoạn code rõ ràng, dễ hiểu. Thực tế còn chứng minh điều ngược lại: họ giành được nhiều điểm hơn khi viết code nhanh hơn, và nếu không có ai hiểu thì đã có cớ để bảo vệ việc làm của mình (‘nếu viết ra đã khó thì hiểu được còn khó hơn’) Bất kỳ lập trình viên nào mới làm việc với những đoạn code này cũng sẽ lúng túng bởi sự phức tạp của dự án và những đoạn code được tài liệu hóa kém. Và thường thì việc tạo ra những thay đổi nhỏ trong những code được tài liệu hóa kém đó sẽ mất thời gian hơn nhiều vì trước khi thay đổi bất cứ đoạn code nào, lập trình viên cũng sẽ phải học hỏi rất nhiều.

8. Các công cụ phát triển phần mềm

Các công cụ trực quan, các thư viện lớp, trình biên dịch, công cụ kịch bản, v.v...thường cũng có lỗi riêng hoặc được tài liệu hóa rất kém, dẫn đến việc sản sinh thêm lỗi. Các lập trình viên phần mềm thường dùng những công cụ phần mềm thay đổi liên tục, nhưng việc giữ bắt kịp với các phiên bản khác nhau và khả năng tương thích của chúng là một vấn đề rất lớn đang hiện hữu.

9. Tập lệnh tự động hóa lỗi thời

Việc viết tập lệnh tự động hóa mất rất nhiều thời gian, nhất là đối với những kịch bản phức tạp. Nếu đội ngũ tự động đã ghi lại hoặc viết một tập lệnh kiểm thử nào nhưng lại quên cập nhật nó trong một khoảng thời gian thì nó sẽ trở nên lỗi thời. Nếu việc kiểm thử tự động hóa không xác nhận kết quả đúng thì nó sẽ không thể nắm bắt được các khiếm khuyết.

10. Thiếu kiểm thử viên có kỹ năng

Các kiểm thử viên có kỹ năng và kiến thức miền chắc là nhân tố cực kỳ quan trọng đối với thành công của bất kỳ dự án nào; nhưng không phải công ty nào cũng có một đội ngũ kiểm thử viên có kinh nghiệm 100%. Kiến thức về miền và khả năng tìm ra lỗi của kiểm thử viên đóng vai trò rất lớn trong việc tạo nên một phần mềm chất lượng cao. Việc thiếu một trong hai nhân tố này đều có thể dẫn đến một phần mềm nhiều lỗi. Dưới đây là một vài nguyên nhân dẫn đến lỗi phần mềm nữa. Các nguyên nhân này chủ yếu được áp dụng cho chu kỳ kiểm thử phần mềm:

  1. Không thiết lập thử nghiệm thích hợp (môi trường thử nghiệm) để kiểm tra tất cả các yêu cầu.
  2. Viết code hoặc kiểm thử các trường hợp khi chưa hiểu rõ tất cả các yêu cầu.
  3. Thiết kế sai dẫn đến việc trong tất cả các giai đoạn của chu kỳ phát triển phần mềm đều có vấn đề.
  4. Thường xuyên phát hành các bản vá lỗi phần mềm trong khi chưa hoàn thành việc kiểm tra vòng đời của phần mềm.
  5. Không cung cấp những kiến thức hay tài nguyên liên quan đến những kỹ năng cần dùng trong việc phát triển và kiểm thử phần mềm một cách phù hợp.
  6. Dành ít thời gian hoặc bỏ qua hoàn toàn việc kiểm tra hồi quy.
  7. Không tự động hóa các trường hợp kiểm thử lặp lại và luôn phụ thuộc vào kiểm thử viên trong việc kiểm tra thủ công.
  8. Không ưu tiên thực hiện kiểm tra.
  9. Không theo dõi quá trình phát triển và kiểm thử một cách liền mạch. Những thay đổi vào phút cuối rất có thể sẽ dẫn đến lỗi.
  10. Những giả thiết sai trong giai đoạn mã hoá và thử nghiệm.