Tiếng Việt :: English
Phần mềm và Cuộc sống của Chúng ta (17.11.2008)

 

 
Kiểm thử không là không đủ!
Một người bạn có lần hỏi tôi rằng nếu cuộc sống của tôi tùy thuộc vào một phần mềm nào đó thì là một Kỹ sư Phần mềm, tôi sẽ muốn biết điều gì về phần mềm đó. Tôi nghĩ là câu trả lời của tôi đã làm anh ta ngạc nhiên.
 
Câu trả lời của tôi là tôi muốn biết những người phát triển phần mềm đó có giỏi không và có tham vọng làm cho phần mềm đó hoạt động được như đã định trước hay không. Những thứ khác thì không quan trọng.
 
Bạn tôi hỏi: “Tại sao anh chỉ tập trung vào con người mà không phải là phương pháp, công cụ hay phần mềm đó được kiểm thử đến mức độ nào?”
 
Câu trả lời của tôi là nếu bạn không thiết kế phần mềm có chất lượng cao ngay từ đầu, thì tôi không nghĩ là kiểm thử nhiều đến bao nhiêu đi nữa có thể giúp đưa chất lượng sản phẩm phần mềm lên được như mong muốn. Vì thế tôi khẩn thiết yêu cầu các bạn sinh viên phải học Công nghệ Phần mềm một cách nghiêm túc vì một ngày nào đó cuộc sống của các bạn có thể phụ thuộc vào chất lượng phần mềm do chính các bạn phát triển ra. Nếu ai đó đi bằng máy bay thì họ có lẽ sẽ hiểu được chất lượng phần mềm quan trọng như thế nào với máy bay. Vì thế, tôi tin là người ta phải đưa chất lượng vào phần mềm bằng cách theo sát một quy trình chặt chẽ vì chẳng bao giờ bạn có thể kiểm thử chay để đưa chất lượng vào phần mềm. Tôi nghĩ là kiểm thử không bao giờ có thể thay thế được việc phát triển phần mềm có chất lượng của những người làm phần mềm có kỹ năng cao, biết đóng góp hết sức lực để đảm bảo phần mềm của họ sẽ hoạt động đúng như yêu cầu.
 
Hãy để tôi nhấn mạnh cụm từ “có kỹ năng cao” ở đây vì kỹ năng không phải là cái gì bạn có thể có được chỉ bằng cách học rồi làm một số bài thi mà phải là qua rất nhiều rèn luyện và thực hành. Cũng như với môn Toán, bạn phải làm đi làm lại nhiều lần cho đến lúc giỏi. Học xong một môn học chỉ có nghĩa là bạn đã đạt được mức cơ bản mà nhà trường yêu cầu đối với sinh viên, điều đó không có nghĩa là bạn đã có kỹ năng thuần thục. Phần mềm cũng giống như Toán học vì nó đòi hỏi rất nhiều rèn luyện. Dĩ nhiên, không phải ai học Toán cũng giỏi ngay nhưng kỹ năng Toán học có thể được xây dựng, phát triển, mở rộng, và rèn luyện không ngừng để đạt đến những mức khác nhau. Tôi nghĩ điều này cũng đúng cho dân làm phần mềm thượng hạng, nghĩa là, với huấn luyện và thực hành chu đáo, nhà trường có thể đào tạo ra được những Kỹ sư Phần mềm có khả năng làm việc có chất lượng.
 
Trong Toán học, bạn phải hiểu rõ khái niệm trước khi có thể giải các bài toán. Toán học đòi hỏi phải học qua nhiều năm, từ đại số căn bản, lượng giác học đến giải tích trừu tượng và các phương trình vi phân cho đến lúc bạn có thể trở thành một nhà toán học có năng lực cao. Điều này cũng tương tự trong ngành phần mềm vì việc huấn luyện Công nghệ Phần mềm đòi hỏi việc học tập trong nhiều năm từ những lớp lập trình cơ bản đến các thiết kế, kiến trúc, quy trình, phương pháp, và công cụ trừu tượng hơn cho đến lúc bạn trở thành một Kỹ sư Phần mềm có năng lực cao.
 
Không may là ngày nay các chương trình Khoa học Máy tính chỉ giảng dạy sinh viên về các ngôn ngữ lập trình mà không dạy bao nhiêu về những mảng khác nhau của phần mềm. Sinh viên mất ba hay bốn năm học lập trình chỉ qua việc “gõ code và chữ lỗi” và không có gì khác. Cách huấn luyện này có thể đào tạo ra những lập trình viên giỏi, những lập trình viên có thể code cho đủ các yêu cầu khác nhau. Nhưng họ không được dạy về các vấn đề chất lượng, quy trình, phương pháp, công cụ hay hiểu được ảnh hưởng việc làm của họ đối với cuộc sống của người khác. Họ không được dạy các làm việc nhóm; họ không được dạy làm thế nào để trở nên chuyên nghiệp hơn; họ không được dạy về các quy tắc đạo đức và làm thế nào để làm một công dân có trách nhiệm với xã hội. Nếu họ không biết được phần mềm có những tác động gì và có trách nhiệm với việc làm của mình thì ngành phần mềm sẽ có rất nhiều lập trình viên biết code nhưng không thể làm gì khác. Một số khác có thể tham gia vào cả những hoạt động phi đạo đức như tạo virus hay worm hay hack máy tính. Nếu người lập trình viên không thể tập trung vào quy trình thiết kế một cách tỉ mỉ để có thể phát hiện ra những lỗi kỳ quặt xảy ra khi chạy chương trình, thì bất kỳ những gì các lập trình viên này phát triển ra sẽ không bao giờ đạt được mức chất lượng cần thiết cho những ứng dụng đòi hỏi tính ổn định cao, cho dù họ có kiểm thử các phần mềm đó như thế nào đi nữa.
 
Dĩ nhiên, tôi vẫn mong là mọi người sẽ kiểm tra lại các chương trình họ đã code ra, không phải là một hay hai lần mà là càng nhiều (lần) càng tốt để có thể phát hiện tất cả mọi lỗi; nhưng kiểm thử không thì chẳng bao giờ đủ vì không ai có đủ thông minh hay đủ giỏi để gỡ TẤT CẢ mọi lỗi trong code của họ hay của người khác. Không cách nào một lập trình viên có thể loại trừ mọi lỗi chỉ sau vài lần kiểm thử hay có cách nào dự đoán được mọi hình thức hư hỏng và rồi phát triển các chương trình xử lý tất cả những lỗi hay hư hỏng đó. Vì chúng ta chỉ là người, và vì chúng ta không thể hiểu được ngọn ngành các chương trình được code ra sao, hơn là một người đánh cờ hoài công dự đoán kết quả của ván cờ chỉ qua sau vài nước đi đầu tiên.
 
Vì vậy, chúng ta cần phải đưa “chất lượng” vào từ đầu qua thiết kế và kiến trúc phần mềm và qua việc tuân thủ những quy trình đã được định rõ để có thể dự đoán được lỗi cũng như qua cách thiết kế phần mềm sao cho tránh được tình trạng lỗi phá chương trình. Để làm được điều đó, chúng ta phải hiểu được toàn bộ quy trình phát triển vì chất lượng của sản phẩm phần mềm tùy thuộc vào quy trình tạo ra các sản phẩm đó. Khi phát triển phần mềm, lập trình chỉ là một bước nhỏ, chỉ chiếm chưa đến 20% cả quy trình, thế nhưng nhiều chương trình đào tạo Khoa học Máy tính vẫn chỉ tập trung sinh viên vào việc lập trình. Tôi cũng phát hiện thấy có những chương trình đào tạo “đi tắt”, chỉ giảng dạy cho sinh viên các “chiêu và thủ thuật” cùng một số công cụ, vốn lại chỉ là một phần nhỏ trong bước lập trình. Sinh viên tốt nghiệp từ những chương trình này ra sẽ không thể nào làm việc trong bất kỳ dự án phần mềm nào hay có thể nào phát triển được các phần mềm có chất lượng vì họ đã không được dạy những kỹ năng và kiến thức cần thiết để có thể thành công trong ngành phần mềm.
 
Theo ý kiến cá nhân tôi, “đưa chất lượng vào ngay từ đầu” nghĩa là biết tư duy thiết kế và phát triển phần mềm từ đầu sao cho phần mềm sẽ hoạt động được như yêu cầu. Bạn cần phải tập trung chi li vào cả quy trình về xây dựng kiến trúc, thiết kế, và triển khai phần mềm để đảm bảo bạn hiểu được phần mềm đó có thể hoạt động ra sao. Bạn đồng thời phải nghĩ về cách người dùng tương tác ra sao với phần mềm. Bạn phải có khả năng dự đoán ngay từ đầu những thay đổi có thể có đối với phần mềm. Tôi sẽ cho các bạn một ví dụ đơn giản ở đây: Tại sao các Kỹ sư Phần mềm hay dùng hằng số độc lập (gói trong biến số) trong khi hầu hết các lập trình viên lại “hard-code” giá trị hằng số vào cấu trúc chương trình của họ? Vì các Kỹ sư Phần mềm có đủ khả năng nhìn nhận về tương lai để thấy rằng những giá trị ban đầu tưởng như là hằng số có thể sẽ thay đổi về lâu dài. Họ thấy trước được khả năng những gì có thể sẽ thay đổi, và hình thành một cấu trúc lập trình có thể dễ dàng hỗ trợ cho các loại thay đổi đã được dự đoán trước.
 
Dĩ nhiên, người Kỹ sư Phần mềm không thể dự đoán trước mọi thứ, và họ không thể thấy trước được tất cả những gì có thể xảy ra trong quá trình phát triển sản phẩm của họ. Vì thế, người Kỹ sư Phần mềm (luôn) sử dụng nhiều kỹ thuật và quy trình có tính kỹ luật để có thể xác định lỗi và gỡ bỏ chúng đi. Kiểm thử phần mềm là một trong những kỹ thuật mà tôi hiểu rất rõ và thường xuyên làm. Kiểm thử, đặc biệt với một cấu trúc lập trình rõ ràng, thường tốt hơn nhiều so với kiểm thử chay chỉ với hy vọng là chương trình sẽ chạy như đã định. Cố gắng dùng kiểm thử để đưa chất lượng vào những phần mềm viết cẩu thả và đã không được thử lại thì chẳng khác nào cố gắng lắng nghe từng nốt nhạc khi ngồi giữa phố đông xe cộ. Ngược lại, kiểm thử một cấu trúc phần mềm đã có đủ các mức chất lượng và cấu trúc thiết kế hoàn chỉnh thì sẽ giống như lắng nghe cũng những nốt nhạc đó trong một buổi hòa tấu nhạc giao hưởng. Chất lượng của những gì đang diễn ra sẽ giúp càng dễ dàng hơn, chứ không phải là càng khó hơn, cho bạn dự đoán ra được những vấn đề không thấy trước thực sự là gì.
 
Vì vậy: Tôi là người luôn tin rằng bạn không thể đưa chất lượng vào những phần code đã làm xong. Những Kỹ sư Phần mềm giỏi phải biết xác lập kiến trúc, thiết kế, xây dựng và thường xuyên kiểm tra lại những gì họ đã làm “trong suốt quá trình (phát triển)” nhằm “kiến tạo chất lượng” đến những mức độ cao nhất có thể. Tôi cũng là người tin chắc rằng để xây dựng được các sản phẩm phần mềm có chất lượng cao nhất thì đòi hỏi phải có chất lượng đào tạo cao nhất và các chương trình đào tạo Công nghệ Phần mềm sẽ giúp ích cho bất kỳ sinh viên nào muốn theo đuổi nghề nghiệp này.
2
Các tin tức đã đăng:
   Chia Sẻ Kinh Nghiệm của Giáo sư Vũ (08.11.2008)
   Hội Thảo “Tính Ưu Việt của Chương Trình IT của đại học Carnegie Mellon” tại Duy Tân (20.10.2008)
   Khác Biệt giữa Kỹ Sư Phần Mềm và Lập Trình Viên (19.10.2008)
   Chia sẻ của Giảng viên Duy Tân về CMU (16.10.2008)
Đại học Carnegie Mellon
Đại học Duy Tân
Đại học Văn Lang
DTT Corp.
Đại học Cần Thơ

Các Giảng Viên DTU