11 Jan, 2021
Công nghiệp phần mềm
Toàn cầu hoá đòi hỏi các công ti phần mềm phải có sản phẩm chất lượng với chi phí thấp và xu hướng này tạo ra nhiều cạnh tranh trong các công ti.
Theo nghiên cứu gần đây, quãng 75% thị trường phần mềm bị chi phối bởi bốn công ti: Microsoft, Oracle, IBM và SAP. Để sống còn, công ti phải hội tụ vào năng lực của mình để tăng tính hiệu quả, đưa ra sản phẩm trong thời gian ngắn hơn, và giảm chi phí mà không hi sinh chất lượng. Có nhiều cách để làm điều đó, một số công ti khoán ngoài phát triển phần mềm cho các nước chi phí thấp nơi công nhân sẵn lòng làm việc nhiều giờ với lương thấp. Điều này có thể hạ thấp chi phí của họ nhưng không đảm bảo chất lượng. Cách hạ thấp chi phí khác là tái kĩ nghệ các qui trình của họ, khử bỏ các hoạt động không cần thiết, dùng công cụ tốt hơn và thuê những kĩ sư phần mềm giỏi nhất để làm việc cho họ.
Vài năm trước, Watts Humphrey, một nhà khoa học tại Đại học Carnegie Mellon University đã thấy rằng sinh viên được đào tạo về kĩ nghệ phần mềm có thể thực hiện ít nhất 10 lần tốt hơn sinh viên được đào tạo trong khoa học máy tính hay đào tạo lập trình. Quan sát này dẫn tới nỗ lực của ông ấy để hiểu rõ hơn sự khác biệt giữa hai chương trình đào tạo này và cuối cùng đã phát triển thành một mô hình có tên là Mô hình trưởng thành năng lực phần mềm – Software Capability Maturity Model (SW-CMM). Mô hình này được dùng để đo năng lực của tổ chức phần mềm cũng như các thực hành mà người làm phần mềm phải tuân theo để phát triển phần mềm có chất lượng. Có nhiều nghiên cứu xác nhận ích lợi của mô hình này và áp dụng của qui trình kĩ nghệ phần mềm, điều có thể tạo ra kết quả lớn. Vậy mà nhiều công ti phần mềm vẫn bỏ qua mô hình này và nhiều đại học tiếp tục hội tụ vào việc dạy lập trình thay vì các môn kĩ nghệ phần mềm. Có “thái độ tiêu cực” hướng tới việc tuân theo qui trình phần mềm bởi hầu hết những người lập trình được huấn luyện trong Khoa học máy tính. Nhiều người phàn nàn về chi phí và chậm trễ liên kết với việc tuân theo qui trình và những giới hạn nó đặt lên tính sáng tạo cá nhân. Nhiều người lập trình Khoa học máy tính coi bản thân mình là “nghệ sĩ” có tự do sáng tạo phần mềm theo cách họ muốn và phần mềm là “nghệ thuật” chứ không phải là “khoa học.” Người kĩ sư phần mềm chỉ ra việc cải tiến trong năng suất và chất lượng được thấy từ việc tuân theo qui trình được xác định tốt và coi phần mềm là “khoa học’ chứ không phải là “nghệ thuật.” Với việc nhận ra ích lợi kinh doanh, nhiều kĩ sư phần mềm bằng cách nào đó bị người khác chê cười do quan niệm rằng việc tuân theo qui trình được xác định làm chậm việc phát triển phần mềm hay giới hạn tính sáng tạo. Họ chỉ ra các công ti đã thành công đạt tới SW-CMM mức cao báo cáo việc thu hồi vốn đầu tư tốt (ROI) điều nảy sinh trong việc giảm lãng phí, cho phép các kĩ sư của họ dành nhiều thời gian hơn cho việc phát triển sản phẩm chất lượng cao. Chẳng hạn, kết quả từ các kĩ sư phần mềm trên tầu con thoi khớp sát với kết quả có ý nghĩa của Boeing và nhiều công ti khác. Vâng, nhiều người lập trình vẫn còn không bị động chạm bởi những kết quả này và nhiều đại học cũng bỏ qua sự kiện rằng có nhu cầu cao về kĩ năng kĩ nghệ phần mềm trong công nghiệp phần mềm. Ngày nay tranh cãi giữa hai quan điểm: Kĩ nghệ phần mềm và Khoa học máy tính vẫn còn diễn ra trên các phòng chat internet, và bên trong cộng đồng hàn lâm.
Sau hơn 30 năm làm việc trong công nghiệp phần mềm, tôi thấy rằng mối quan hệ giữa công ti và khách hàng của nó là nhân tố chính đóng góp cho sự khác biệt giữa hai cách nhìn này. Trong các công ti phần mềm truyền thống, người lập trình được để tách rời khỏi người dùng bằng nhiều tầng những người quản lí, bán hàng và tiếp thị ở giữa. Lí do then chốt là mối bận tâm về cấp quản lí mất quyền điều khiển và nhu cầu giữ người lập trình hội tụ vào mỗi việc viết mã. (Đào tạo khoa học máy tính hội tụ hầu hết vào viết mã mà ít đào tạo về quan hệ khách hàng hay qui trình kinh doanh nghiệp vụ). Tuy nhiên, nhiều công ti phần mềm tiên tiến hiểu tầm quan trọng của sự hài lòng của khách hàng và muốn kĩ sư phần mềm của họ được tích hợp đầy đủ với người dùng để hiểu các yêu cầu của họ. Theo cách nhìn của họ, công nghệ có thể làm giảm thời gian, giảm chi phí và bằng việc có nhiều người ở giữa có thể làm chậm mọi thứ lại. (Người kĩ sư phần mềm được đào tạo trong kĩ nghệ yêu cầu và quan hệ khách hàng cho nên điều tự nhiên với họ là hoàn thành vai trò này). Khi công nghệ tăng trưởng về độ phức tạp, thách thức của việc làm việc chặt chẽ với khách hàng và người dùng tăng tầm quan trọng của nó và những công ti phần mềm tiên tiến nhất bây giờ đang thuê kĩ sư phần mềm thay vì người tốt nghiệp khoa học máy tính. Nhiều công ti phần mềm truyền thống vẫn tin rằng khách hàng không biết mấy về công nghệ, việc hiểu yêu cầu sản phẩm bằng cách cho phép người lập trình gặp họ có thể tạo ra vấn đề và làm mất số bán cho nên có những lí do để duy trì khoảng cách giữa người lập trình và khách hàng. Các công ti tiên tiến chỉ ra cùng điều này nhưng khẳng định rằng điều này chứng tỏ nhu cầu cần được tích hợp đầy đủ vào qui trình khách hàng để đảm bảo hài lòng cao trong tương lai. Họ thúc đẩy việc dùng nhiều phương pháp agile trong phát triển phần mềm và đầu tư vào quan hệ khách hàng. Họ tin cậy vào việc dùng các qui trình được xác định của kĩ sư phần mềm để giữ các hoạt động phát triển trong kiểm soát. Ngày nay, tranh cãi giữa hai quan điểm này vẫn còn diễn ra chưa thấy chấm dứt.
Vừa là giáo sư đại học và nhà chuyên nghiệp phần mềm, tôi tin rằng phần mềm là “khoa học,” không phải là “nghệ thuật.” Việc dùng các phương pháp khoa học, toán học, quản lí rủi ro, kiến trúc, các bài học rút ra, và việc áp dụng qui trình là sự khác biệt then chốt giữa chương trình đào tạo kĩ nghệ phần mềm và khoa học máy tính. Kĩ sư phần mềm được đào tạo để chia việc lớn thành nhiều nhiệm vụ nhỏ và các nỗ lực. Nỗ lực và nhiệm vụ có thể được phân lớp hoặc, “Chúng ta đã làm điều này,” hoặc “Điều này là việc mới.” Với kỉ luật kĩ nghệ cho việc sử dụng qui trình và dữ liệu, người kĩ sư phần mềm có thể thúc bẩy công việc của người khác cũng như kinh nghiệm riêng của họ để xây dựng nền tảng của “cấu phần dùng lại được.” Với những kĩ năng về kiến trúc và tích hợp hệ thống, họ có thể lắp ráp các cấu phần dùng lại thành sản phẩm mới nhanh hơn, tốt hơn và rẻ hơn. Khi họ phạm sai lầm hay khi kết quả khác với trông đợi, họ để thời gian để hiểu căn nguyên và tuân theo qui trình để làm giảm xác suất các vấn đề tương tự trong tương lai. Những bài học được rút ra này giúp người khác không phạm cùng sai lầm và cải tiến chất lượng sản phẩm phần mềm một cách có ý nghĩa. Bằng việc tuân theo qui trình dựa trên phương pháp thống kê, người kĩ sư phần mềm có thể khử bỏ nhiều lỗi bằng việc hiểu sự khác biệt giữa các nguyên nhân thông thường so với đặc biệt và cải tiến cơ hội thiết kế, xây dựng sản phẩm chất lượng cao. Điều không may là nhiều người lập trình không được đào tạo về phương pháp kĩ nghệ, kiến trúc, tích hợp, quản lí rủi ro, kiểm soát qui trình thống kê, cách đo và phân tích căn nguyên. Người lập trình có xu hướng nhằm vào việc tăng độ phức tạo như nhân tố đóng góp cho chất lượng kém của sản phẩm và phàn nàn rằng với các dự án lớn, nhiều sức ép bị đặt lên công việc của họ, yêu cầu họ làm nhiều giờ hơn.
Không có tri thức về toàn cầu hoá và đòi hỏi về tốc độ, các công ti phần mềm truyền thống có xu hướng tạo ra cấu trúc tổ chức cứng nhắc để đảm bảo công việc được thực hiện. Có những tuyến thẩm quyền và kiểm soát rõ rệt để đảm bảo không ai làm việc trên những thứ khác hơn điều hiện thời đã được phân công. Người quản lí sẽ hội tụ vào lập kế hoạch, lên lịch biểu, ngân sách, và chỉ đạo mọi người; người lập trình sẽ hội tụ vào viết mã, kiểm thử và làm tài liệu. Không may là nhiều người quản lí không được huấn luyện về khía cạnh quản lí dự án phần mềm. Một số là người lập trình giỏi được đề bạt lên quản lí. Một số bắt nguồn từ các trường kinh doanh và tài chính mà không có tri thức về phần mềm. Không được đào tạo thêm về phần mềm, nhiều người sẽ phải vật lộn với gánh nặng ước lượng, điều phối và đáp ứng đòi hỏi của khách hàng và những sức ép này sẽ đưa nhiều dự án tới thất bại. Các công ti phần mềm tiên tiến biết cách xây dựng lực lượng lao động của họ bằng những kĩ sư phần mềm được đào tạo tốt và có phẩm chất tốt. Họ tuyển lựa các kĩ sư từ các đại học nổi tiếng và cộng tác với các đại học theo nhu cầu của họ. Bằng việc có các kĩ sư có kĩ năng duy nhất bổ sung cho nhau, các công ti này thường có các tổ công tác tự quản, có khách hàng tham gia và nhỏ. Họ thúc bẩy các công nghệ và công cụ hiện đại, nhưng điều quan trọng nhất là họ thúc bẩy các hoạt động tổ để tất cả cùng làm điều đó. Họ nghĩ rằng việc tích hợp như vậy của các tổ nhỏ đưa tới kết quả nhanh hơn với sản phẩm đáp ứng nhu cầu khách hàng. Bằng việc áp dụng các phương pháp khoa học như phân tích căn nguyên, kiểm soát qui trình thống kê, họ có thể giảm sai lầm bởi vì nguyên nhân của lỗi đã được khử bỏ ra ngoài hệ thống. Đây là lí do tại sao phương pháp agile đi đôi với kiểm soát qui trình thống kê có thể có ích lợi cho cả công ti cũng như khách hàng của họ.
—-English version—-
Software Industry
Globalization demands software companies to have quality products at lower costs and this trend create more competition among companies. According to recent studies, about 75% of software market is dominated by four companies: Microsoft, Oracle, IBM and SAP. To survive, company must focus on their ability to increase efficiency, release products in a shorter time, and reduce costs without sacrificing quality. There are several ways to do that, some companies outsource software development to lower cost countries where workers willing to work long hours at lower pay. This may lower their costs but do not guarantee the quality. Other lower their costs by re-engineering their processes, eliminating unnecessary activities, obtaining better tools, and hire the best software engineers to do works for them.
Several years ago, Watts Humphrey, a scientist at CarnegieMellonUniversity found that students trained software engineering can perform at least 10 times better than students trained in computer science or programming trainings. This observation led to his effort to better understand the differences between the two training programs and eventually developed a model called the Software Capability Maturity Model (SW-CMM). This model is used to measure the capability of software organization as well as practices that software people must follow to develop quality software. There are many studies confirming the benefits of this model and the application of a software engineering process that can produce great results. Yet many software companies still ignore this model and many universities continue to focus on teaching programming rather on software engineering disciplines. There is a “negative attitude” toward following a software process by most programmers trained in Computer Science. Many complain about the costs and the delays associated with following a process and the limits it places on their individual creativity. Many Computer Science programmers consider themselves “artists” with a freedom to create softwares the way they want and software is an “art” not a “science”. Software engineers point out the improvements in productivity and quality found in following a well defined process and consider software is a “science” not an “art”. By realizing the business benefits, many software engineers are somewhat amused by the notions that following a defined process slowdown software development or limits creativity. They point to companies that have successfully achieved high SW-CMM levels report good returns on their investments (ROI) which resulted in reducing waste, allowing their engineers to spend more time developing high quality products. For example, the results from the shuttle on-board software engineers align nicely with the significant results from Boeing and numerous other companies. Yet, many programmers remain untouched by these results and many universities also ignore the fact that there is a high demand of software engineering skills in the software industry. Today the debate between two views: Software engineering and Computer Science is still going on in internet chat rooms, and within academic community.
After working more than 30 years in the software industry, I found that the relationship between a company and its customers is a major factor that contributed to the difference between these two views. In traditional software companies, programmers are kept away from the users with many levels of managers, sales and marketing people in between. The key reason is a concern about management losing control and the need to keep programmers focused on writing code. (Computer Science training is focusing mostly on coding with limit training in customer relationship or business processes). However, more advanced software companies understand the important of customer satisfaction and want their software engineers fully integrated with the users to understand their requirements. From their view, technology can decrease time, reduce costs and by having many people in between can slow things down. (Software engineer are trained in requirements engineering and customer relationship so it is natural for them to fulfill this role). As technology grows in complexity, the challenge of working closely with customers and users grows in its importance and most advanced software companies are now hiring software engineers rather than computer science graduates. Many traditional software companies still believe that customers do not know much about technology, understand product requirements by allowing programmer to meet with them could create problems and lose a sale so there are reasons to maintain the distance between programmers and customers. Advanced companies point to the same things but assert that this demonstrates the need to be fully integrated into their customer process to ensure higher satisfaction in the future. They promote the use of more agile methods in software development and invest in customer relationships. They trust their software engineers’ use of defined process to keep development activities under control. Today, the debate between two views is still going on with no end in sight.
As both a university professor and software professional, I believe that software is a “science”, not an “art”. The use of scientific methods, mathematics, risk management, architecture, lessons learned, and the application of process are the key difference between software engineering training and computer science program. Software engineers are trained to breakdown large work into tasks and efforts. Effort and task can be classified as either, “We have already done this,” or “This is new work.” With engineering discipline for employing process and data, software engineer can leverage the work of others as well as their own experiences to build a foundation of “Reusable components”. With skills in architecture and system integration, they can assemble these reuse components into new product faster, better and cheaper. When they make mistakes or when results differ from expectations, they take time to understand the root cause and follow a process to reduce the probability of similar problems in the future. This lessons learned help others from not making the same mistake and improve the quality of software products significantly. By following process based on statistical methods, software engineers can eliminate many defects by understand the different between common vs. special causes and improve the chance of design, build a highly quality product. Unfortunately, many programmers are not trained in engineering methods, architecture, integration, risk management, statistical process control, metrics and root cause analysis. Programmer have a tendency to point to the increase of complexity as a factor that contribute to the poor quality of products and complain that with large size projects, more pressure are putting on their works, require them to work longer hours.
Without knowledge about globalization and the demand for speed, traditional software companies tend toward creating rigid organizational structures to ensure the work gets done. There are clear lines of authority and control in order to ensure no one is working on things other than what is currently assigned. Managers will focus on planning, scheduling, budgeting, and directing people; Programmers will focus on coding, testing and documenting. Unfortunately, many managers are not trained in the managing aspect of software project. Some are good programmers that getting promoted into management. Some come from business and finance schools with no knowledge of software. Without additional software training, many will struggle with the burden of estimating, monitoring and meeting customers’ demand and these pressures will drive many projects to failure. Advanced software companies know how to build their work force with well-trained and well qualified software engineers. They recruit engineers from well known universities and collaborate with universities on their needs. By having engineers with unique skill that complements others, these companies usually have small, customer-involved, self-directed work teams. They leverage modern technologies and tools, but most importantly they leverage the teamwork activities to do it all. They think that such integration of small teams leads to faster results with products that meet customers’ needs. By applying scientific methods such as root cause analysis, statistical process control, they can reduce mistakes because the cause for errors has been eliminated out of the system. This is the reason that why agile method coupled with the use of statistical process control can benefit both the company as well as their customers.