26 Jan, 2021
Vấn đề với phần mềm
Một sinh viên hỏi tôi: “Tại sao có nhiều vấn đề thế trong công nghiệp phần mềm? Sinh viên có thể học được cái gì để tránh những vấn đề này?”
Đáp: Trong trường, các giáo sư bao giờ cũng cho sinh viên các yêu cầu rõ ràng, xác định rõ để sinh viên làm việc được phân công. Sinh viên có đủ thời gian để hoàn thành công việc. Tuy nhiên, trong công nghiệp, phần lớn khách hàng hiếm khi cho người phát triển các yêu cầu rõ. Phần lớn các yêu cầu đều không rõ ràng, không đầy đủ, chung chung cao, không đủ chi tiết và đôi khi không kiểm thử được. Khách hàng thường cho tổ dự án lịch biểu không hiện thực để hoàn thành công việc. Vì khách hàng không biết phải mất bao nhiêu lâu để hoàn thành dự án cho nên họ chỉ đoán một ngày tháng tuỳ tiện. Nhiều người quản lí dự án không biết cách thương lượng với khách hàng để có lịch biểu tốt hơn và chính xác hơn. Nhiều người quản lí cũng không biết cách ước lượng thời gian được cần cho dự án, họ lấy lịch biểu của khách hàng và yêu cầu người phát triển tuân theo. Nếu nhiều công việc bị thúc ép trong một thời gian rất ngắn, vấn đề là không tránh khỏi. Để đáp ứng lịch biểu không hiện thực, người phát triển bỏ qua một số pha, vội vàng làm cho mã được hoàn thành, và thường không kiểm thử đủ cho nên có nhiều lỗi còn lại trong sản phẩm phần mềm. Không ai biết liệu phần mềm là tốt hay không cho tới khi khách hàng phàn nàn hay phần mềm sập. Trong toàn bộ việc phát triển phần mềm, khách hàng thường đổi ý, họ nghĩ các điều mới rồi yêu cầu tính năng mới cần được thêm vào sau khi dự án đã bắt đầu. Người quản lí dự án muốn làm cho khách hàng hài lòng cho nên họ chỉ yêu cầu người phát triển làm nhiều mà không có điều chỉnh nào về lịch biểu hay phân công. Điều đó đặt nhiều sức ép hơn lên người phát triển, nhiều người phải làm việc nhiều giờ hơn, thường không được trả tiền đủ, chỉ để cho công việc của họ được thực hiện. Trong trường hợp đó, lỗi là không tránh khỏi.
Trong trường, sinh viên thường làm việc ở chỗ cô lập vì làm việc tổ bị coi là gian lận. Sinh viên giỏi nhận được điểm tốt và thường được các giáo sư ca ngợi cho nên họ cảm thấy như “anh hùng”. Trong công nghiệp, người phát triển làm việc trong tổ và thường phải chia sẻ thông tin để làm cho công việc của họ được thực hiện. Tuy nhiên, một số người phát triển vẫn muốn là “anh hùng” cho nên họ không chia sẻ cái gì, họ tin tự bản thân họ có thể thành công. Thiếu làm việc tổ, thiếu cộng tác, và thiếu thông tin buộc người phát triển phải “giả định” những điều nào đó. Khi hoá ra là các giả định của họ là không đúng, vấn đề xảy ra. Nếu người phát triển không biết cái gì được cần và cái gì được mong đợi từ họ, hay có các giả định sai sót, vấn đề có thể được mong đợi là xảy ra.
Để giải quyết những vấn đề này, sinh viên phải học nhiều về kĩ nghệ yêu cầu để thu được các yêu cầu tốt hơn. Họ phải tuân theo qui trình để thu lấy, phân tích và thẩm tra các yêu cầu. Nếu họ có thể lấy được các yêu cầu rõ ràng, đầy đủ, chi tiết và kiểm thử được thì dự án ít nhất có hơn 50% cơ hội thành công. Nếu không, sinh viên phải học cách thương lượng với khách hàng về lịch biểu và nỗ lực, đây là kĩ năng mềm rất tốt mà sinh viên cần học. Sinh viên phải học nhiều hơn về quản lí dự án, đặc biệt về cách lập kế hoạch, cách chia yêu cầu lớn thành các nhiệm vụ nhỏ hơn và ước lượng thời gian được cần để hoàn thành những việc đó. Sinh viên phải học cách làm việc trong tổ. Họ phải trao đổi thường xuyên với nhau. Sinh viên nên học nhiều về kiểm điểm, giám định để giảm lỗi khi thích hợp.
Có lịch biểu hiện thực là rất quan trọng vì nó cho phép thời gian thích hợp cho thiết kế, kiểm thử, sửa lỗi, kiểm thử lại, thay đổi, và làm tài liệu. Sinh viên phải học cách lập kế hoạch kiểm thử bằng việc bắt đầu kiểm thử sớm, tái kiểm thử sau khi sửa hay thay đổi, lập kế hoạch về thời gian thích hợp cho kiểm thử và sửa lỗi. Một khi dự án bắt đầu, sinh viên phải học cách tránh thay đổi, nếu có thể. Bằng việc chuẩn bị để đề phòng chống lại những thay đổi thái quá và bổ sung sau khi dự án bắt đầu sẽ tránh được nhiều vấn đề. Nếu thay đổi là cần thiết, chúng nên được phản ánh thích hợp trong thay đổi lịch biểu. Nếu có thể, làm việc chặt chẽ với khách hàng để quản lí các mong đợi.
—-English version—-
Problem with Software
A student asked me: “Why there are so many problems in software industry? What can students learn to avoid these problems?”
Answer: In school, professors always give students clear, well-defined requirements for their assigned works. Students have enough time to complete the work. However, in the industry, most customers rarely give developers good requirements. Most requirements are unclear, incomplete, highly general, not enough details and sometime not testable. Customers often give project team an unrealistic schedule to complete the work. Since customers do not know how long it will take to complete the project so they just guest an arbitrary date. Many project managers do not know how to negotiate with customers for better and more accurate schedule. Many managers also do not know how to estimate the time needed for the project, they just take customer’s schedule and ask developers to follow. If a lot of works are being pushed into a very short time, problems are inevitable. In order to meet the unrealistic schedule, developers skip some phases, hurry to get the code done, and often do not test enough so there are many defects left in the software product. No one know whether the software is good or not until customers complain or software crash. Throughout the software development, customers often change their minds, they think of new things then request new features to be added after the project already started. Project managers do not want to make customers unhappy so they just ask developers to do more without any adjustment in schedule or assignment. That put more pressure on developers, many have to work longer hours, often not getting paid, just to get their works done. In that case, defects are inevitable.
In school, students often work in isolation since teamwork is considered cheating. Good students receive good grade and often being praised by professors so they feel like “heroes”. In the industry, developers work in team and often have to share information to get their works done. However, some developers still want to be “heroes” so they do not share anything, they believe they can succeed by themselves. The lack of teamwork, lack of collaboration, and lack of information, force developers to “assume” certain things. When it turn out that their assumptions are not correct, problems happen. If developers do not know what is needed and what is expected from them, or have erroneous assumptions, problems can be expected.
To solve these problems, students must learn more about requirements engineering to obtain better requirements. They must follow a process to solicit, analyze and verify requirements. If they can get a clear, complete, detailed, and testable requirements then the project is at least have more than 50% chance of success. If not students must learn how to negotiate with customers on schedule and efforts, this is a very good soft skill that students need to learn. Students must learn more about project management, especially how to plan, how to breakdown a large requirements into smaller tasks and estimate the time needed to complete those. Students must learn how to work in team. They should communicate often with each others. Students should learn more about review, inspections to reduce defects when appropriate.
Having a realistic schedules is very important as it allow adequate time for design, testing, defects fixing, re-testing, changes, and documentation. Students must learn how to plan testing by start testing early on, re-test after fixes or changes, plan for adequate time for testing and defect fixing. Once the project started, students must learn to avoid changes, if possible. By prepare to defend against excessive changes and additions after the project started will avoid many problems. If changes are necessary, they should be adequately reflected in schedule changes. If possible, work closely with customers to manage expectations.