Kĩ nghệ phần mềm và Khoa học máy tính

Một sinh viên hỏi tôi: “Tại sao tôi cần học Kĩ nghệ phần mềm thay vì Khoa học máy tính? Sau rốt, chúng là như nhau và sau khi tốt nghiệp đằng nào chúng tôi cũng sẽ làm việc trong công nghiệp phần mềm?”

Trả lời: “Kĩ sư phần mềm và khoa học máy tính là KHÔNG như nhau. Từng lĩnh vực hội tụ vào các khía cạnh khác nhau của công nghệ tính toán và dẫn tới các nghề nghiệp khác nhau trong công nghiệp phần mềm. Trong quá khứ, phần lớn phần mềm đều nhỏ và đơn giản, cho nên hội tụ là vào “khoa học về phát triển thuật toán” hay mã hiệu quả để chạy trên máy tính. Chẳng hạn, lưu giữ thông tin hay tự động tính công thức toán học hay qui trình. Đó là lí do tại sao phần lớn các chương trình khoa học máy tính yêu cầu nhiều năm học về toán và vài ngôn ngữ lập trình. Ngày nay, phần mềm là lớn và phức tạp hơn, cho nên hội tụ là vào “kĩ nghệ quản lí qui trình” hay phát triển phần mềm hiệu quả để giải quyết vấn đề phức tạp. Chẳng hạn, một trong các nguyên lí của độ phức tạp phần mềm là: “Cứ mỗi mười phần trăm tăng lên trong độ phức tạp của vấn đề, có việc tăng một trăm phần trăm trong độ phức tạp của giải pháp phần mềm. Vấn đề càng phức tạp, giải pháp sẽ càng phức tạp hơn nhiều so với được nghĩ trước đó. Đó là lí do tại sao bạn cần “kĩ sư qui trình” để giải quyết vấn đề thay vì dựa trên “khoa học về thuật toán” để tạo ra mã hiệu quả.

Bởi vì hội tụ là vào toàn bộ qui trình phát triển, người kĩ sư phần mềm sẽ tuân theo tập các qui tắc và nguyên lí thay vì nhảy vào trong giải pháp (viết mã) nhanh chóng. Chẳng hạn một trong những nguyên nhân thông thường nhất làm cho thất bại dự án là yêu cầu không ổn định. Người kĩ sư phần mềm học về “kĩ nghệ yêu cầu” sẽ biết cách kiểm điểm, kiểm nghiệm, rồi ưu tiên hoá các yêu cầu này để đảm bảo rằng chúng được xác định tốt và đủ ổn định trước khi chuyển sang pha tiếp của thiết kế. Khi chuyển từ yêu cầu sang thiết kế, người kĩ sư phần mềm tốt đã học về “kiến trúc và thiết kế” sẽ biết rằng bên cạnh các yêu cầu được xác định, có nhiều “yêu cầu suy dẫn”. Thực ra, sẽ có nhiều “yêu cầu suy dẫn” hơn là yêu cầu nguyên thuỷ và đó là lí do tại sao pha thiết kế thường lâu hơn để đảm bảo mọi thứ được tính tới trước khi chuyển vào trong pha thực hiện.

Người kĩ sư phần mềm hiếm khi làm việc cô lập mà phần lớn trong tổ vì phát triển phần mềm bao giờ cũng là nỗ lực tổ. Tri thức và kĩ năng của từng thành viên là cốt yếu cho thành công của dự án. (Làm việc tổ bao giờ cũng được dạy trong chương trình kĩ nghệ phần mềm nhưng không được dạy trong khoa học máy tính). Bởi vì yếu tố quan trọng nhất trong giải quyết vấn đề phức tạp KHÔNG phải là công cụ, KHÔNG phải là thuật toán, KHÔNG phải là kĩ thuật mà là kĩ năng của bản thân người phát triển. Người phát triển có kĩ năng cao có thể có năng suất cao hơn (tới 30 lần tốt hơn) người phát triển thường.

Chương trình khoa học máy tính hội tụ nhiều vào viết mã hiệu quả (thuật toán) cho nên chất lượng hầu hết là về khiếm khuyết phần mềm. Tuy nhiên, chương trình kĩ nghệ phần mềm xác định chất lượng theo cách khác. Chất lượng là vấn đề thiết kế tốt chứ không chỉ là viết mã tốt. Nếu dự án yêu cầu chất lượng cao thì điều đó phải được xem xét sớm trong vòng đời phát triển phần mềm. Chất lượng là tuyển tập các thuộc tính như hiệu năng, tính dùng được, tính khả chuyển, tính tin cậy, tính hiệu quả, tính kiểm thử được, tính hiểu được và tính sửa đổi được. Kĩ nghệ phần mềm cũng tin rằng chất lượng không cùng những điều như thoả mãn của người dùng, đáp ứng yêu cầu hay đáp ứng các mục tiêu chi phí và lịch biểu mà chúng là tất cả có liên quan. Thực tại, thoả mãn của người dùng = sản phẩm chất lượng + đáp ứng yêu cầu + được chuyển giao khi cần + chi phí thích hợp.

Chương trình khoa học máy tính hội tụ vào phát hiện và loại bỏ khiếm khuyết. (Phần lớn những người phát triển dành đại thể 40 phần trăm thời gian của họ cho kiểm thử). Lập trình và kiểm thử là yếu tố quan trọng trong chương trình khoa học máy tính. Chương trình kĩ nghệ phần mềm hội tụ nhiều vào chất lượng của qui trình phát triển bởi vì họ tin rằng chất lượng của sản phẩm phần mềm tuỳ thuộc vào qui trình phát triển tạo ra sản phẩm đó. Bằng việc hội tụ nhiều vào từng pha, loại bỏ khiếm khuyết ở từng pha thì đến cuối bạn sẽ có ít khiếm khuyết phải giải quyết. Thay vì mất nhiều thời gian cho kiểm thử, kĩ sư phần mềm hội tụ nhiều vào giám định, kiểm điểm ở từng pha. (Thực ra, không có chỉ một cách tiếp cận tốt nhất tới loại bỏ khiếm khuyết phần mềm. Tổ hợp của nhiều cách tiếp cận, như giám định, kiểm điểm, và kiểm thử là cần thiết).

Mặc dầu với cả hai chương trình sinh viên tốt nghiệp sẽ bắt đầu trong nghiệp phần mềm ở những vị trí tương tự như người lập trình, người kiểm thử, và lãnh đạo kĩ thuật. Qua thời gian, phần lớn sinh viên tốt nghiệp khoa học máy tính sẽ làm việc nhiều về phía kĩ thuật hội tụ vào các thuật toán phức tạp, phương pháp khoa học, phương pháp hình thức v.v.. Phần lớn sinh viên tốt nghiệp kĩ nghệ phần mềm sẽ làm việc ở phía quản lí hội tụ vào quản lí dự án, kiến trúc hệ thông, quản lí nhóm dự án, và cải tiến qui trình.

English version: Software Engineering and Computer Science

A student asked me: “Why do I need to study Software Engineering instead of Computer Science? Afterall, they are the same and after graduate, we will work in the software industry anyway?”

Tác phẩm, tác giả, nguồn

  • Tác phẩm: Kĩ nghệ phần mềm
  • Nguồn: Blog của giáo sư John Vu, Carnegie Mellon University.
  • Wiki hóa: https://kipkis.com