01 Jun, 2021
Chương trình kĩ nghệ phần mềm
Một người cha viết cho tôi: “Con tôi sắp vào đại học năm nay. Nó băn khoăn giữa Khoa học máy tính và Kĩ nghệ phần mềm và tôi không thể giải thích được sự khác biệt. Một cố vấn nhà trường bảo nó rằng chúng làn như nhau với cái tên khác nhau nhưng cố vấn khác bảo nó rằng chúng không như nhau. Vì có các đại học dạy Khoa học máy tính và đại học khác dạy Kĩ nghệ phần mềm, tôi cần quyết định về trường nào cho cháu theo học. Bạn tôi giới thiệu cho tôi về website của thầy nhưng tôi không chắc ngành nào sẽ là tốt hơn cho con trai tôi. Tôi cần giúp đỡ để chọn lĩnh vực đúng và trường đúng để cho con tôi vào học. Xin thầy giúp cho.”
Đáp: Có nhiều ý kiến về khác biệt giữa Khoa học máy tính và Kĩ nghệ phần mềm. Về căn bản đó là các từ khoá là “Khoa học” và “Kĩ nghệ” và nó có nghĩa là “Nhà khoa học nghiên cứu” và “Người kĩ sư xây dựng” cho nên định nghĩa chung là Khoa học máy tính là NGHIÊN CỨU về điều máy tính làm và mọi lí thuyết liên kết với hệ thống máy tính như cấu trúc dữ liệu, thuật toán v.v. Kĩ nghệ phần mềm là PHÁT TRIỂN sản phẩm phần mềm dựa trên các qui trình và kỉ luật liên kết với hệ thống phần mềm.
Để giúp bạn hiểu sự khác biệt, chúng ta phải quay lại lịch sử. Hệ thống máy tính điển hình bao gồm phần cứng và phần mềm nhưng chính phần mềm biểu thị cho mọi chức năng mà người dùng cần và khi nhu cầu thay đổi, phần mềm phải được cập nhật. Trong quá khứ, phần mềm là nhỏ và đơn giản cho nên viết phần mềm phần lớn dựa trên kĩ năng lập trình của nhà khoa học người hiểu vận hành của hệ thống máy tính. Khoa học máy tính được tạo ra để hội tụ vào các kĩ năng viết phần mềm dùng các ngôn ngữ lập trình (FORTRAN, COBOL, Pascal, C, C++ v.v.). Phần lớn đào tạo Khoa học máy tính đều dựa trên nhiều năm viết mã, học lí thuyết máy tính, hiểu cấu trúc dữ liệu, tạo ra thuật toán, dùng những công thức toán học nào đó và tổ chức cấu trúc dữ liệu v.v.
Khi phần mềm trở nên lớn hơn và phức tạp hơn, cách tiếp cận hội tụ chặt vào một mình viết mã là không đủ tốt. Khi nhiều dự án khoa học máy tính bị chậm trễ, tốn kém nhiều và khó bảo trì, một cách tiếp cận mới được cần tới để kiểm soát độ phức tạp và chất lượng của hệ thống phần mềm lớn và lĩnh vực Kĩ nghệ phần mềm được tạo ra. Mục đích của Kĩ nghệ phần mềm là phát triển phần mềm có chất lượng và có chi phi-hiệu quả mà dễ bảo trì và sử dụng.
Khoa học máy tính coi phần mềm như chương trình máy tính nhưng đây là cách nhìn rất hạn chế. Phần mềm không chỉ là chương trình mà còn là mọi tài liệu liên kết và dữ liệu cấu hình để làm cho những chương trình này vận hành một cách hiệu quả và đúng đắn. Kĩ nghệ phần mềm coi hệ thống phần mềm như một số các chương trình phần mềm tách rời (ứng dụng, điều hành, giao diện v.v.); các tệp cấu hình mà có thể được dùng để thiết lập các chương trình này; tài liệu hệ thống mô tả cấu trúc của hệ thống và cách chúng làm việc cùng nhau; tài liệu người dùng mô tả cách dùng hệ thống. Đào tạo Kĩ nghệ phần mềm do đó không chỉ hội tụ vào viết mã mà còn vào mọi hoạt động liên kết với phát triển hệ thống phần mềm. Sinh viên phải học về qui trình phần mềm hay tập các hoạt động được cần để xây dựng phần mềm chất lượng; kĩ nghệ về yêu cầu hệ thống phần mềm dựa trên nhu cầu người dùng; cách tiếp cận cấu trúc tới phát triển phần mềm bao gồm mô hình hoá, kí pháp, qui tắc, kiến trúc, thiết kế và hướng dẫn qui trình; cũng như các thuộc tính chất lượng như hiệu năng, tính đổi qui mô, tính bảo trì được, tính dùng được v.v.
Nói chung, kĩ sư phần mềm tuân theo cách tiếp cận hệ thống và có tổ chức cho công việc của họ vì đây là cách hiệu quả nhất để tạo ra phần mềm chất lượng. Vì phần mềm là phức tạp và lớn, họ bao giờ cũng làm việc trong tổ cho nên kĩ năng mềm cũng được dạy trong hầu hết các chương trình kĩ nghệ phần mềm.
—English version—
Software Engineering Program
A father wrote to me: “My son is going to college this year. He is confused between Computer Science and Software Engineering and I cannot explain the difference. A school advisor told him that they are the same with different names but another advisor told him that they are not. Since there are universities that teach Computer Science and others that teach Software Engineering, I need to make decision about which school for him to go to. My friend refers me to your website but I am not sure which one would be better for my son. I need help to select the right field and right school to send my son to. Please help.”
Answer: There are many opinions on the difference between Computer Science and Software Engineering. Basically the key words are “Science” and “Engineering” and it means “Scientists study” and “Engineers build” so the common definition is Computer Science is the STUDY of what computers do and all the theories associated with a computer system such as data structures, algorithms etc. Software Engineering is the DEVELOPMENT of software products based on the processes and disciplines associated a software system.
To help you to understand the differences, we must go back to history. A computer system typically consists of hardware and software but it is the software that represents all the functionalities that users need and as the needs change, software must be updated. In the past, software were small and simple so writing software is mostly based on the programming skills of the scientists who understand the functions of the computer system. Computer Science is created to focus on the skills to write software using programming languages (FORTRAN, COBOL, Pascal, C, C++ etc.). Most Computer Science trainings are based on several years of writing code, learning computer theories, understand data structures, create algorithms, using certain mathematics formulas and organize data structures etc.
As software is getting larger and more complex, the approach of focusing strictly on writing code alone is not good enough. As many computer science projects were late, cost more and difficult to maintain, a new approach was needed to control the complexity and quality of large software system and the field of Software Engineering was created. Software engineering’s goals are the development of quality and cost-effective software that is easy to maintain and use.
Computer Science considers software as computer programs but this is a very restrictive view. Software is not just a program but also all associated documentation and configuration data to make these programs operate efficiently and correctly. Software Engineering considers a software system as a number of separate software programs (applications, operating, interfaces etc.); configuration files which can be used to set up these programs; system documentation which describes the structure of system and how they work together; user documentation which describes how to use the system. The Software Engineering training therefore is not only focusing on writing code but also all activities associated with the development of a software system. Student must learn about software process or a set of activities needed to build quality software; the engineering of software system requirements based on users’ needs; the structured approach to software development including modeling, notations, rules, architecture, design, and process guidance; as well as the quality attributes such as performance, scalability, maintainability, usability etc.
In general, software engineers follow a systematic and organized approach to their work as this is the most effective way to produce quality software. Since the software is complex and large, they always work in teams so soft-skills are also taught in most software engineering programs.