11 Jan, 2021
Khoa học máy tính và kỹ nghệ phần mềm
Bạn tôi, một giáo sư khoa học máy tính hỏi tôi: “Sao mọi người tạo ra cái tên mới cho “Khoa học máy tính” và gọi là “Kĩ nghệ phần mềm?” Tôi không thấy khác biệt giữa “Máy tính” và “Phần mềm.” Sinh viên của chúng tôi học tốt môn học Khoa học máy tính và không cần môn nào khác với cái tên mới cho nó.”
Tôi ngạc nhiên với câu hỏi này: “Có khác biệt giữa hai chương trình này chứ, nhưng trước hết ta hãy bắt đầu với máy tính. Tôi tin không phải tất cả máy tính đều như nhau bởi vì không ai nghĩ rằng anh có thể thiết kế máy tính cho máy bay theo cùng cách anh tiếp cận thiết kế máy tính cho trò chơi video, bởi vì không phải tất cả mọi máy tính đều như nhau. Từ quan điểm này, tôi có thể chỉ ra rằng chúng ta không thể tiếp cận tới phần mềm dường như chúng là như nhau. Nếu anh muốn sinh viên của mình là người lập trình và làm việc về xây dựng website, tạo ra những ứng dụng nhỏ dùng Java hay C++ thì khoa học máy tính là tốt như nó đang vậy. Tuy nhiên, ngày nay phần lớn các hệ thống máy tính ngày càng lớn hơn; phần lớn các ứng dụng phần mềm ngày một phức tạp hơn và yêu cầu hàng trăm hay đôi khi hàng nghìn người cùng làm việc mà cách tiếp cận lập trình nhỏ sẽ không còn có tác dụng.”
Bạn tôi không đồng ý: “Anh bao giờ cũng có thể chia dự án lớn thành nhiều phần nhỏ để cho người lập trình có thể làm việc trên nó. Dự án lớn có thể được chia thành hàng trăm mảnh nhỏ nơi từng mảnh có thể được trao cho người lập trình để họ sẽ tiếp tục lập trình theo cùng cách như họ xây dựng ứng dụng web. Tôi không hiểu tại sao chúng ta cần cách tiếp cận mới?”
Bởi vì bạn tôi xuất thân từ giới hàn lâm và chưa bao giờ làm việc trong công nghiệp, khó mà giải thích mọi điều tương quan và tương hỗ trong các cấu phần phần mềm. Tôi bảo anh ấy rằng không dễ dàng chia phần mềm lớn thành những phần nhỏ kiểu như chia bánh bằng nhau và đó là lí do tại sao chúng tôi cần những kĩ năng đặc biệt như người phân tích yêu cầu để làm việc với người dùng và khách hàng; người quản lí cấu hình để quản lí thay đổi trong hoạt động phát triển; người phân tích qui trình để xác định các hoạt động phát triển thành tập các qui trình mà người phát triển phải tuân theo và tất nhiên người lập trình phải thực hiện thiết kế này bằng việc dùng ngôn ngữ máy tính và người kĩ sư tích hợp đưa tất cả các phần này vào trong một hệ thống cố kết. Những kĩ năng đặc biệt này là các môn của người kĩ sư phần mềm mà phần lớn các chương trình khoa học máy tính không dạy.
Bạn tôi không đồng ý: “Tôi nghĩ với đào tạo thêm, người lập trình cũng có thể làm điều đó chứ. Tôi không thấy nhu cầu gì để gọi chúng theo các cái tên khác.”
Tôi giải thích: “Có thể người lập trình cần đào tạo thêm nhưng khoa học máy tính hiện thời đã dồn nhiều nỗ lực vào lí thuyết và kĩ thuật lập trình, phần lớn các sinh viên đều học hành vất vả để theo các môn lập trình cho nên thời gian đâu mà dành cho huấn luyện thêm? Anh không thể thêm nhiều thứ vào chương trình hiện thời mà không bỏ bớt đi vài môn học, vậy chúng ta sẽ bỏ môn nào? Chúng ta có nên giảm các lớp lập trình từ 4 xuống 2 năm không, chúng ta có nên giảm các môn lí thuyết máy tính không? Chúng ta có nên giảm số các môn toán xuống không? Chúng ta nên thêm môn gì? Chúng ta có cần các môn yêu cầu hay môn kiến trúc phần mềm không? Theo cách nhìn của tôi, khoa học máy tính hội tụ vào lí thuyết và phương pháp có chứa “máy tính” còn kĩ nghệ phần mềm lại quan tâm tới vấn đề thực tế của việc sản xuất ra “phần mềm.” Cả hai chương trình này đều có chung các môn nền tảng nhưng ứng dụng là khác nhau.
Đối thoại này hiện thời là tranh cãi chính giữa các trường đại học trên khắp thế giới. Mọi giáo sư đều có ý kiến về chương trình đào tạo và mọi đại học đều có quan điểm riêng về môn nào sinh viên phải học và tôi không nghĩ chúng ta có thể giải quyết việc này trong đối thoại thông thường giữa những người bạn. Quan điểm cá nhân của tôi là: Sinh viên cần kĩ năng để kiếm sống và đại học phải cung cấp cho họ tri thức đó để họ có thể tìm được việc trong công nghiệp. Để làm điều đó, đại học phải hiểu nhu cầu của công nghiệp, biết rằng nhu cầu bao giờ cũng thay đổi theo thời gian và thường xuyên điều chỉnh đào tạo để đáp ứng nhu cầu công nghiệp. Tuy nhiên, khó mà thay đổi chương trình hàn lâm bởi vì phần lớn các giáo sư đều bận tiến hành nghiên cứu, viết bài để xuất bản, hay dành thời gian cho các việc khác. Các môn đào tạp cập nhật có mức ưu tiên thấp nhất với nhiều người trong số họ và họ không được thưởng gì về điều đó cả. Nhiều người không thấy sự khẩn thiết hay nhu cầu thay đổi bởi vì thế giới hàn lâm là “môi trường an toàn” không có cạnh tranh nhưng công nghiệp phần mềm lại là môi trường cạnh tranh cao nơi mọi sự thay đổi với tốc độ của internet. Đó là lí do tại sao sinh viên bị mắc giữa nhịp độ chậm của hàn lâm và nhịp độ nhanh của công nghiệp khi họ tốt nghiệp. Nhiều người học tốt trong trường nhưng khi đối diện với thế giới thực, họ khổ sở không đáp ứng được. Họ chưa bao giờ được dạy điều phải làm, cách hành động, và kĩ năng nào họ cần, đôi khi họ phải học những thứ đã lạc hậu.
Để tôi cho bạn một ví dụ, ngày nay nhiều kĩ sư phần mềm đang làm việc trên các ứng dụng được chuyển giao qua web cho hàng trăm hay hàng nghìn khách hàng trên khắp thế giới có tên là Phần mềm như dịch vụ – Software as a Services (SaaS). Khái niệm mới này yêu cầu những kĩ năng đặc biệt để thích ứng với nhu cầu của khách hàng theo thời gian thực. Đây không thực là “mã” mà là “qui trình nghiệp vụ” kiểm soát cách nghiệp vụ của khách hàng đang thực hiện. Sinh viên chỉ biết cách viết mã sẽ không có khả năng thay đổi và điều chỉnh những ứng dụng “hướng qui trình” này bởi vì họ thậm chí không biết qui trình là gì. Tuy nhiên, những kĩ năng này mà công nghiệp phần mềm đang đòi hỏi và thuê đấy nhưng thế giới hàn lâm lại rất ngần ngại thích ứng với “đào tạo hướng theo qui trình” bởi vì phần lớn các giáo sư cũng không biết qui trình nghiệp vụ là gì.
Bạn tôi bảo tôi: “Mục đích của giáo dục là phát triển con người với tri thức chung chứ không phải là về việc làm. Sau khi có giáo dục họ có thể đi ra và tự kiếm việc.”
Đây là chỗ chúng ta không đồng ý vì tôi tin rằng “tri thức hàn lâm” phải được thay đổi để thích ứng với nhu cầu của xã hội. Tư duy rằng trường học chỉ chịu trách nhiệm về giáo dục chứ không gì khác làm cho tôi nghĩ về tương lai của nhiều sinh viên. Trong nhiều năm rồi, các trường liên tục đào tạo lập trình viên, người về bản chất không thể kiếm được việc tốt cho dù có nhiều cơ hội đang chờ đợi trên khắp thế giới. Thay vì thích ứng, nhiều chương trình Khoa học Máy tính vẫn hội tụ vào điều cộng đồng hàn lâm nghĩ đây là tri thức mà sinh viên phải có bất kể điều công nghiệp cần và không chuẩn bị cho sinh viên cạnh tranh với các sinh viên ở các nước khác. Nếu họ coi toán học là quan trọng thì họ thêm nhiều môn toán vào, nếu họ coi thuật toán là cần thiết, họ có thể thêm nhiều môn thuật toán máy tính vào chương trình. Sau rốt, các giáo sư cai quản đại học và họ có thể làm bất kì cái gì họ coi là đúng cho sinh viên vì sinh viên tới họ, cạnh tranh lẫn nhau để đăng tuyển vào trường của họ.
Điều khôn ngoan là biết rằng việc đăng tuyển vào các chương trình khoa học và công nghệ đã tăng lên ở nhiều nước châu Á bởi vì xu hướng khoán ngoài toàn cầu. Ngày nay hầu hết mọi nước đều hội tụ vào công việc này nơi Ấn Độ đang chi phối với xuất khẩu vượt quá USD $68 tỉ đô là một năm nhưng đối diện với sự thiếu hụt trầm trọng người phát triển phần mềm cho thị trường toàn cầu. Phần lớn những người quản trị đại học đều nhận biết về tình huống này và họ phản ứng bằng việc mở nhiều môn học hơn, đăng tuyển nhiều sinh viên mà không bận tâm về nhu cầu của công nghiệp. Cho nên lỗ hổng giữa tri thức hàn lâm và nhu cầu công nghiệp đang tiếp tục rộng thêm và nhiều sinh viên đã được đào tạo trong các chương trình này không được chuẩn bị để cạnh tranh toàn cầu. Tuy nhiên, tôi tin rằng với thị trường việc làm thay đổi nhanh chóng, mọi sự đã thay đổi rất nhanh và đại học không còn có thể chỉ đạo các chương trình đào tạo mà chính công nghiệp và chung cuộc sinh viên mới là người chỉ đạo, những người đòi hỏi các chương trình đào tạo nào đó. Sinh viên đầu tư thời gian, nỗ lực của họ và trả tiền học phí và họ phải được đối xử như “Khách hàng” và trong thế giới kinh doanh, chính khách hàng mới ra quyết định về việc họ muốn làm kinh doanh với ai.
—-English version—-
Computer Science and Software Engineering
My friend, a computer science professor asked me: “Why do people create new name for “Computer Science and called “Software Engineering”? I do not see the different between “Computer” and “Software”. Our students are doing fine with Computer Science course and do not need another course with new name to it”.
I was surprised at the question:” There are differences between the two programs but first let start with the computer. I believe not all computers are the same because no one would think that you could design computers for an airplane the same way you would approach the design of a computer for the videogames because not all computer hardwares are the same. From this view, I can point out that we can not approach software as if they were the same. If you want your students to be programmers and work on building websites, create small applications using Java or C++ than computer science is fine as it is. However, today most computer systems are getting larger; most software applications are getting more complex and require few hundreds or sometime thousand people to work together than the small programming approach will not work:
My friend did not agree: “You can always break down a large project into many small parts so programmers can work on it. A large project can be divided into hundred small pieces where each could be given to a programmer so they will continue to program it the same way as they build a web application. I do not understand why we need a new approach?”
Because my friend come from the academic world and never works in the industry, it is difficult to explain all interrelates and interdependencies among software components. I told him that it is not easy to divide a large software to smaller parts just like dividing a cake equally and that is why we need special skills such as requirements analysts to work with users and customers; configuration managers to manage changes during development activities; process analysts to define development activities into a set of processes that developers must follow and of course programmers to implement the design using computer language and integration engineers to put all these parts into a cohesive systems. These special skills are the disciplines of software engineer that most computer science programs do not teach.
My friend disagreed: “I think with additional trainings, programmers can also do that. I do not see the need of calling them by different names.”
I explained: “It is possible that programmers needs additional training but current computer science already put a lot of efforts on programming theories and techniques, most students are working hard to do so many programming courses so where are the time for additional training? You can not add things to current program without eliminate some courses so which course should we eliminate? Should we reduce programming classes from 4 to 2 years, should we reduce some computer theories courses? Should we reduce the number of mathematics courses? What courses should we add? Do we need more requirements courses or software architecture courses? From my perspective, computer science is focusing on the theories and methods involving the “computer” where software engineer is concerned with the practical problems of producing “software”. Both programs do share some fundamental courses but the application is different.
This conversation is currently a major debate among universities around the world. Every professor has an opinion about training program and every university has its own view of what subject students must learn and I do not think we can solve it in a casual conversation among friends. My personal view is: Students need skills to make a living and university must provide them with that knowledge so they can find works in the industry. In order to do that, university must understand the need of the industry, knowing that need always change with time and constantly adjust the trainings to meet industry demands. However, it is difficult to change the academic program because most professors are busy conducting researches, writing papers for publications, or spent time on other businesses. Update training courses is the lowest priority to many of them and they do not get reward for that. Many do not see the urgency or the need to change because academic world is a “safe environment “with no competition but the software industry is a highly competitive environment where things change at the speed of the internet. That is why students are caught between a slow pace of academic and the fast pace of industry when they graduate. Many are doing well in school but when facing the real world, they fail miserably. They never taught what to do, how to act, and what skills do they need, sometime what they have studied is already obsolete.
Let me give you an example, today many software engineers are working on applications that are delivered via the web to hundreds or thousands of customers all over the word called Software as a Services (SaaS). This new concept requires special skills to adapt to the demand of customers in real time. These are not really “code” but “business processes” that control the way customer business are executing. A students that only know how to code will not be able to modify and adjust these “process oriented” applications because they do not even know what a process is. However, these are skills that the software industry is demanding and hiring but the academic world is very reluctant to adapt “Process oriented training” because most professors also do not know what a business process is.
My friend told me:” The goal of education is develop people with general knowledge but not about jobs. After having an education they can go out and get jobs themselves”.
This is where we are not in agreement since I believe that the “academic knowledge” must be changed to adapt to the demand of society. The thinking that school is only responsible for educate but nothing else makes me wonder about the future of many students. For so many years, schools continue to train programmers who are essentially unable to get good jobs even there are so many opportunities waiting all over the world. Instead of adapting, many Computer Science programs are still focus on what the academic community thinks these are the knowledge that student must have regardless what industry need and fail to prepare students to compete with students in other countries. If they think mathematic is important then they add more math courses, if they think algorithms are necessary, they could add more computer algorithm courses to the program. After all, professors run the university and they can do whatever they think is right for the students since students come to them, compete with each others to enroll in their schools.
It’s widely known that enrollments in science and technology programs have increased in many Asian countries because the trend in global outsourcing. Today almost every country is focusing on this business where India is dominating with export exceeding USD $68 Billion a year but facing a critical shortage of software developers for the global market. Most university administrators are aware of the situation and they react by opening more courses, enroll more students without concern about the need of the industry. So the gap between academic knowledge and industry needs are continue to widening and many students who have been trained in these programs are not prepared to compete globally. However, I believe that with the fast changing job market, things already change very quickly and it is not the university who can dictate the training programs but it is the industry and ultimately the student, who demand certain training programs. Students invest their time, their efforts and pay the tuitions and they should be treated as “Customer” and in the business world, it is the customer that makes the decision on who they want to do business with.