055.2 Bài 1
Chứng chỉ: |
Open Source Essentials |
---|---|
Phiên bản: |
1.0 |
Chủ đề: |
055 Quản lý Dự án |
Mục tiêu: |
055.2 Quản lý Sản phẩm / Phát hành |
Bài học: |
1 trên 1 |
Giới thiệu
Theo thời gian, hầu hết các phần mềm đều sẽ phát triển theo nhiều cách khác nhau. Trên thực tế, đây là một trong những điều tuyệt vời về phần mềm: dễ dàng thay đổi và chỉ cần một phiên chuyển mạng để cập nhật cho tất cả những người dùng đang sử dụng sản phẩm. Chính vì vậy, các nhà phát triển luôn thêm vào các tính năng mới, sửa lỗi và lỗ hổng bảo mật, chuyển phần mềm sang phần cứng mới và thêm giao diện vào các chương trình và dịch vụ phổ biến. Khi phần mềm thay đổi, các phiên bản hoặc bản sửa đổi mới sẽ được phát hành.
Bài học này sẽ nói về các công việc hậu cần của việc lập kế hoạch và thực hiện thay đổi đối với phần mềm, cách các nhóm phát triển cùng lúc xử lý nhiều phiên bản, quy ước đặt tên cho các phiên bản và các khía cạnh tổ chức khác của quá trình phát triển — một phần của các hoạt động quản lý dự án. Các công việc hậu cần áp dụng đặc biệt cho việc cân chỉnh thời gian, đặt tên và kiểm soát các bản phát hành được gọi là quản lý phát hành.
Tính chất của các Bản phát hành
Các bản phát hành sẽ khác nhau về tính ổn định, khả năng tương thích ngược và hỗ trợ. Chúng ta sẽ cùng xem xét từng khái niệm đó trong các phần sau đây.
Bản phát hành ổn định và không ổn định
Ổn định là một tính chất trọng yếu mà người dùng mong đợi từ phần mềm. Câu hỏi đầu tiên mà đa số người dùng sẽ đặt ra về một bản phát hành mới là “Nó ổn định đến đâu?” Nói cách khác, nó có thể hoạt động tốt và đáng tin cậy hay sẽ bị sập, làm hỏng dữ liệu hoặc tạo ra các kết quả không chính xác?
Tính ổn định có thể được tính trên một phạm vi rộng, và nhiều người dùng vẫn sẽ vui vẻ sử dụng một phần mềm ngay cả khi nó có lỗi. Tuy nhiên, các nhóm phát triển có xu hướng giữ cho mọi thứ đơn giản và nói theo kiểu nhị phân về các bản phát hành ổn định và không ổn định.
Tính ổn định nói đến cả lỗi của phần mềm lẫn khả năng thay đổi của nó theo cách mà người ngoài có thể nhìn thấy được. Các nhà phát triển có thể coi bản phát hành của một thư viện phần mềm là không ổn định vì họ đã thay đổi các hàm mà lập trình viên gọi (tức là các lập trình viên có thể sẽ phải viết lại phần mềm của họ cho bản phát hành tiếp theo); hoặc phần mềm cũng có thể bị coi là không ổn định theo quan điểm của một người dùng vì các nhà phát triển đã xóa đi một tính năng nào đó.
Vậy có lý do nào cho việc phát hành một phiên bản không ổn định hay không? Có: chúng vẫn có giá trị vì chúng cho phép người dùng dùng thử các tính năng mới và kiểm thử lỗi ngay từ đầu dự án.
Hầu hết các dự án đều phát hành các bản sửa đổi rất sớm của phần mềm cho các khách hàng chủ chốt dùng thử; chúng được gọi là các bản phát hành alpha. Các bản phát hành này không nên được sử dụng cho các công việc thực sự — chúng chỉ nên dành cho việc thử nghiệm. Trên thực tế, kiểm thử viên nên chạy các bản phát hành alpha trên các máy tính đang không thực hiện bất kỳ một công việc quan trọng nào vì lỗi trong các bản phát hành đó thực sự có thể làm hỏng các dữ liệu được lưu trữ trên máy tính.
Khi phần mềm gần như đã được coi là ổn định, dự án thường sẽ phát hành một bản sửa đổi thử nghiệm khác được gọi là bản phát hành beta. Những bản phát hành này vẫn nên chỉ để thử nghiệm chứ không sử dụng cho các công việc sản xuất.
Đối với cả phiên bản alpha và beta, các nhà phát triển đều có một quy trình báo cáo lỗi và theo dõi tiến độ sửa lỗi.
Một số dự án sẽ có thêm một giai đoạn nữa nằm giữa bản beta và các bản phát hành ổn định khi các nhà phát triển đã sửa tất cả các lỗi mà họ có thể và cảm thấy rằng sản phẩm đã được hoàn thiện. Họ gọi phiên bản này là một ứng cử viên phát hành và sẽ trình diện nó cho khách hàng hoặc các bên liên quan chủ chốt để họ có thể lập kế hoạch sử dụng các tính năng mới.
Cuối cùng, một số dự án sẽ đưa vào các tính năng chưa quá ổn định vì có một số người dùng quan trọng yêu cầu. Các nhà phát triển muốn người dùng dùng thử các tính năng này và cho biết họ có thích chúng hay không trước khi các nhà phát triển hoàn thiện giao diện và đầu tư công sức để ổn định các tính năng.
Khả năng tương thích ngược
Hầu hết các dự án đều hướng đến tính năng tương thích ngược — nghĩa là họ cố gắng để không phải xóa các tính năng hoặc chức năng đã tồn tại trong các phiên bản cũ. Khả năng tương thích có thể tồn tại ở nhiều cấp độ. Ví dụ: nếu các nhà phát triển duy trì khả năng tương thích ngược cho giao diện lập trình ứng dụng (API) — tức là họ đang hứa hẹn rằng mã nguồn cũ vẫn có thể tiếp tục hoạt động nhưng có thể sẽ cần phải biên dịch lại. Nếu các nhà cung cấp phần cứng hoặc nhà phát triển hệ điều hành duy trì khả năng tương thích ngược cho giao diện ứng dụng nhị phân (ABI) — họ đang hứa hẹn thêm rằng các tệp thực thi cũ vẫn có thể chạy trên các phiên bản phần cứng mới.
Chúng ta sẽ xem xét ở cácphần sau cách các dự án xử lý tình trạng thiếu khả năng tương thích ngược khi họ quyết định rằng giao diện cũ thực sự không phù hợp với các tính năng hoặc môi trường mới mà họ cần hỗ trợ.
Hỗ trợ và Kết thúc vòng đời (EOL)
Phần mềm sẽ ngày càng tốt và hoàn thiện hơn khi các nhà phát triển khám phá ra các vấn đề và khắc phục chúng. Theo thời gian, nhiều tính năng có thể sẽ ngừng hoạt động do những thay đổi trong môi trường của phần mềm. Ngoài ra, có nhiều lỗi mới bị ẩn trước đây cũng sẽ được phát hiện.
Các phiên bản mới thường kết hợp bảo mật và sửa lỗi với các tính năng mới. Có thể một số người dùng sẽ không cần các tính năng mới (trên thực tế, chúng ta có thể sẽ thích một số các tính năng cũ mà các nhà phát triển đã xóa để nhường chỗ cho các tính năng mới hơn), nhưng mọi người vẫn thường nâng cấp lên phiên bản mới để có được các bản sửa lỗi bảo mật giúp bảo vệ họ khỏi các cuộc tấn công độc hại.
Một số người thực sự vẫn sẽ sử dụng các phiên bản phần mềm cũ và từ chối nâng cấp. Điều này thường là do phiên bản mới làm hỏng thứ gì đó đang hoạt động tốt trong môi trường của họ. Khi các công ty tính phí nâng cấp, một số khách hàng có thể từ chối nâng cấp vì họ không muốn trả thêm tiền. Trên thực tế, việc trả tiền nâng cấp rất hiếm khi xảy ra trong mã nguồn mở.
Các nhà phát triển sẽ hỗ trợ người dùng các phiên bản cũ bằng cách sửa lỗi trong các phiên bản cũ mà không thêm các tính năng làm hỏng phần mềm nếu có thể. Tất nhiên, các nhà phát triển không thể làm điều này mãi mãi vì nó làm tiêu tốn thời gian và năng lượng dành cho công việc mới; sẽ đến lúc họ phải từ chối sửa chữa phiên bản cũ và yêu cầu người dùng nâng cấp hoặc tự sửa lỗi.
Việc sửa lỗi và các lỗ hổng bảo mật được gọi là hỗ trợ cho phần mềm. Điều này khác với việc hỗ trợ do bộ phận trợ giúp và những người khác — những người hướng dẫn người dùng để hiểu về phần mềm — cung cấp. Về mặt quản lý phát hành, một bản phát hành được hỗ trợ là một bản phát hành mà các nhà phát triển đồng ý hỗ trợ sửa lỗi, trong khi một bản phát hành không được hỗ trợ là một bản phát hành mà nhà phát triển từ chối việc sửa chữa.
Hãy lưu ý rằng khái niệm “hỗ trợ” chủ yếu được áp dụng cho phần mềm do các công ty hoặc tổ chức lớn tạo ra. Các dự án mã nguồn mở nhỏ hơn và phụ thuộc nhiều vào các tình nguyện viên thường chỉ có thể hứa hẹn sẽ cố gắng nhất có thể để sửa lỗi và đưa ra các phiên bản mới. Họ không thực sự cảm thấy cần phải sửa các phiên bản cũ. Bởi mã là mã nguồn mở, người dùng không muốn nâng cấp có thể trả tiền cho một người nào đó để họ sửa một phiên bản cũ.
Khi công tác hỗ trợ được triển khai, các nhà phát triển sẽ công bố một lịch trình cho biết họ sẽ hỗ trợ từng phiên bản trong bao lâu. Ngày kết thúc hỗ trợ được gọi là thời hạn kết thúc vòng đời (End of Life - EOL) của phần mềm. Người dùng có thể giữ phiên bản cũ cho đến EOL mà vẫn có thể nhận được sự hỗ trợ về các lỗi; nhưng sau EOL, họ sẽ buộc phải nâng cấp hoặc chấp nhận rủi ro.
Các dự án lớn (chẳng hạn như bản phân phối Debian của GNU/Linux) cung cấp các phiên bản hỗ trợ dài hạn (Long Term Support - LTS). Điều này đơn giản có nghĩa là các nhà phát triển sẽ tiếp tục sửa lỗi trong một số năm nhất định. Những khách hàng coi trọng tính ổn định có thể sẽ cảm thấy lo lắng khi cài đặt các phiên bản phần mềm có nhiều thay đổi trong trường hợp các thay đổi đó làm hỏng các quy trình mà họ tin tưởng. Những khách hàng như vậy, đặc biệt là các tổ chức lớn, thường rất yêu thích tính bảo mật của các phiên bản LTS.
Các Phiên bản của Phần mềm: Bản Chính, Bản Phụ và Bản vá
Chúng ta đã thấy được rằng việc lập phiên bản rất phức tạp: một số phiên bản sẽ sửa lỗi, trong khi những phiên bản khác lại bổ sung các tính năng; thêm vào đó, các phiên bản cũng có thể sẽ khác nhau về mức độ ổn định. Các nhà phát triển luôn cố gắng nói rõ về mức độ thay đổi trong từng phiên bản của phần mềm thông qua nhãn của phần mềm. Các quy ước được hầu hết các dự án áp dụng để gắn nhãn phiên bản được gọi là phân phiên bản ngữ nghĩa.
Hãy lấy câu chuyện về thời kỳ ban đầu của nhân Linux làm ví dụ. Linus Torvalds đã dán nhãn bản phát hành ổn định đầu tiên là 1.0. Sau khi cải thiện hạt nhân, ông đã dán nhãn các phiên bản tiếp theo là 1.1, 1.2, v.v. Số 1 ban đầu là phiên bản chính và các số sau dấu chấm biểu thị phiên bản phụ. Chúng ta có thể coi như phiên bản 1.2 có nhiều tính năng hơn và cung cấp nhiều giá trị hơn so với phiên bản 1.1.
Tuy nhiên, cũng có vô số các bản phát hành nhỏ đôi khi chỉ để sửa một vài lỗi. Để chứng minh rằng những thay đổi có tác động rất nhỏ đến việc sử dụng hạt nhân, Torvalds đã đưa vào một số thứ ba đại diện cho cái gọi là bản vá (patch). Từ đó, 1.0 đã được nâng cấp lên 1.0.1, sau đó là 1.0.2, v.v.
Số bản vá sẽ bắt đầu lại từ 0 khi một phiên bản phụ mới được phát hành và số phiên bản phụ sẽ bắt đầu lại từ 0 khi một phiên bản chính mới được phát hành.
Các nhà phát triển sẽ gộp các phiên bản lại với nhau bằng cách sử dụng một ký tự “x” để chỉ ra rằng họ đang nói về nhiều phiên bản (chẳng hạn như 1.x cho tất cả các phiên bản nằm trong phiên bản chính 1).
Vậy sự khác biệt giữa một thay đổi dẫn đến một phiên bản phụ mới và một thay đổi đủ lớn để dẫn đến một phiên bản chính mới là gì? Thông thường, phải sau nhiều năm trôi quá thì một phiên bản chính mới mới được phát hành và nó sẽ phải cho thấy một sự nâng cấp đáng kể.
Nhìn chung, các nhà phát triển sẽ cố gắng duy trì khả năng tương thích ngược khi các phiên bản thay đổi. Nếu không thể duy trì khả năng tương thích ngược, các nhà phát triển sẽ nâng cấp phiên bản chính.
Đôi khi chúng ta thấy số phiên bản nhỏ hơn không, thường là 0.9. Số không đứng đầu cho biết phiên bản phần mềm ban đầu không được ổn định và chưa sẵn sàng để được sử dụng trong sản xuất. Khả năng tương thích ngược không thể được đảm bảo cho đến khi các nhà phát triển phát hành phiên bản bắt đầu bằng số 1.
Các phiên bản alpha thường được chỉ định bằng cách thêm ký tự “a” hoặc “alpha” đằng sau số phát hành (chẳng hạn như 3.6alpha). Tương tự, phiên bản beta sẽ được thêm ký tự “b” hoặc “beta” sau số phát hành.
Vòng đời Sản phẩm của Phần mềm
Công việc của một nhà phát triển chưa bao giờ là dễ dàng; mọi người luôn muốn một cái gì đó từ họ. Có thể là người này muốn lỗi trong bố cục màn hình được sửa ngay lập tức, hoặc lại có một người khác cho rằng lỗi trong tên tệp cần phải được ưu tiên hơn. Người dùng luôn đòi hỏi các tính năng mới và khi các nhà phát triển khác nhau cùng lúc phát triển các tính năng khác nhau, họ sẽ gặp phải tình trạng những thay đổi của nhóm phát triển này làm hỏng những thay đổi của một nhóm phát triển khác.
Quản lý dự án và các nhiệm vụ phụ được gọi là quản lý phát hành sẽ giải quyết các vấn đề này. Thông thường, một thành viên dự án cấp cao sẽ chịu trách nhiệm cho công việc quản lý này.
Giống như con người, các phiên bản phần mềm cũng sẽ trải qua một vòng đời. Mỗi phiên bản đều sẽ bắt đầu bằng một cuộc thảo luận về các tính năng mới và các thay đổi khác cần thiết, trải qua các giai đoạn phát triển và thử nghiệm để cuối cùng được triển khai một cách có kế hoạch.
Kế hoạch và Lộ trình
Các nhà phát triển luôn cố gắng đề ra thật sớm những thay đổi mà họ muốn thực hiện đối với một sản phẩm. Trong các công ty thương mại, họ sẽ trao đổi với những người thực hiện công việc tiếp thị để lọc và tóm tắt những gì khách hàng mong muốn. Các dự án mã nguồn mở phụ thuộc nhiều hơn vào các ý tưởng do các nhà phát triển và người dùng gửi; những ý tưởng này được lưu lại trong một cơ sở dữ liệu được gọi là trình theo dõi vấn đề (issue tracker). Nếu cần sửa lỗi hoặc muốn có một tính năng mới, chúng ta sẽ phải điền một bản báo cáo vấn đề (issue). Sau đó, các nhà phát triển sẽ ưu tiên các thay đổi và quyết định xem ai sẽ xử lý thay đổi nào.
Vậy những thay đổi sẽ được lựa chọn và ưu tiên như thế nào? Đây có thể là một quá trình tương đối lộn xộn. Những người quản lý dự án giỏi trong các dự án mã nguồn mở luôn khuyến khích sự đóng góp rộng rãi, song song với đó vẫn đảm bảo sẽ đưa ra các quyết định chính xác. Một số dự án thậm chí còn tổ chức các hội nghị nơi những người tham gia sẽ thảo luận về các ưu tiên.
Một lộ trình (roadmap) được công bố sẽ nêu ra các kế hoạch cải tiến và thay đổi. Nó có thể trải dài suốt nhiều bản phát hành và nhiều năm trong tương lai. Mỗi bước sẽ được gọi là một mốc thời gian; mốc thời gian có thể có hoặc không liên quan đến ngày đích.
Lịch trình Phát hành
Có hai cách cơ bản để lập lịch trình phát hành: theo thời gian và theo tính năng. Một dự án có thể hẹn lịch phát hành theo các khoảng thời gian đều đặn — ví dụ như sáu tháng một lần — và phát hành bất kỳ những gì đã được hoàn thành tại thời điểm đó. Theo cách thứ hai, dự án có thể cam kết một số tính năng nhất định sẽ xuất hiện trong bản phát hành và để các nhà phát triển hoàn thành các tính năng đó trong thời gian mà họ cần.
Khi thời điểm phát hành đến gần, quản lý phát hành sẽ xác định ngày phát hành các bản alpha, beta và bản ổn định. Các thành viên trong nhóm phát triển luôn thường xuyên xem xét các báo cáo lỗi và cố gắng sắp xếp kế hoạch công việc của họ để đạt được các mốc thời gian đó.
Để hoàn thành một bản phát hành, một dự án phải ngừng tiếp nhận ý tưởng về các tính năng mới và tập trung vào việc làm cho các tính năng hiện có hoạt động tốt. Thời điểm này được gọi là phiên đóng băng tính năng (feature freeze).
Tài liệu dành cho các Phiên bản Sản phẩm
Lộ trình, như đã đề cập tới ở trên, sẽ giải thích các tính năng mà nhà phát triển dự định đưa vào mỗi bản phát hành. Bản phát hành sẽ được đi kèm với một danh sách các thay đổi được gọi là nhật ký thay đổi (changelog). Nhìn chung, nhật ký thay đổi sẽ liệt kê các tính năng mới, các thay đổi đối với các tính năng hiện có, các tính năng đã bị xóa, các tính năng mà nhà phát triển dự định sẽ xóa trong tương lai (được gọi là các tính năng lỗi thời) và các bản sửa lỗi.
Do đó, nhật ký thay đổi có thể sẽ khá dài và chi tiết. Người dùng cần đặc biệt chú ý đến các tính năng đã bị xóa hoặc không còn được sử dụng nữa vì có thể họ sẽ phải thay đổi chương trình hoặc cách sử dụng sản phẩm của mình. Đương nhiên là các nhà phát triển sẽ cố gắng chỉ xóa những tính năng không ai cần tới nữa.
Mỗi bản phát hành đều sẽ thay đổi tài liệu sản phẩm để phù hợp với những thay đổi trong sản phẩm. Nhiệm vụ này có thể sẽ tốn khá nhiều thời gian và các nhà phát triển rất dễ bỏ lỡ một thay đổi nào đó hoặc chậm trễ trong quá trình tạo tài liệu.
Bài tập Hướng dẫn
-
Điều gì có thể giúp chúng ta phân biệt giữa một bản phát hành ổn định và một bản phát hành không ổn định?
-
Chúng ta có nên kỳ vọng rằng sẽ có sự thay đổi về tính năng giữa bản phát hành 2.6.14 và bản phát hành 2.6.15 không?
-
Chúng ta có nên kỳ vọng rằng sẽ có sự thay đổi về tính năng giữa bản phát hành 2.6.0beta và bản phát hành 2.6.0 không?
-
Tại sao chúng ta lại có thể biết rằng bản phát hành 1.0 sẽ không tương thích ngược với bản phát hành 0.9?
-
Nếu phát hiện ra một lỗi bảo mật trong một phiên bản sau một phiên đóng băng tính năng và trước thời điểm phát hành, bạn có thể sửa lỗi đó được không?
Bài tập Mở rộng
-
Giả sử bạn muốn tiếp tục sử dụng một phiên bản phần mềm mã nguồn mở sau EOL vì nó có một tính năng mà bạn cần. Bạn có thể làm gì để giữ cho nó vẫn có thể tiếp tục sử dụng được?
-
Một số tiêu chí cho phép một bản sửa lỗi hoặc một yêu cầu tính năng được chọn trong số những yêu cầu khác là gì?
Tóm tắt
Bài học này đã mô tả các đặc điểm chính để phân biệt các bản phát hành: tính ổn định, khả năng tương thích ngược và khả năng hỗ trợ. Chúng ta đã thảo luận về ý nghĩa của tên và số phiên bản và các khía cạnh chính của nhiệm vụ quản lý bản phát hành (bao gồm cả tài liệu).
Đáp án Bài tập Hướng dẫn
-
Điều gì có thể giúp chúng ta phân biệt giữa một bản phát hành ổn định và một bản phát hành không ổn định?
Có hai cách để xác định các bản phát hành được coi là ổn định: một là chúng hoạt động tốt mà không bị sập hoặc tạo ra kết quả không chính xác, và hai là giao diện được trình bày cho người dùng hoặc lập trình viên được dự kiến có thể tương thích ngược với các phiên bản trước đó.
-
Chúng ta có nên kỳ vọng rằng sẽ có sự thay đổi về tính năng giữa bản phát hành 2.6.14 và bản phát hành 2.6.15 không?
Không. Số thứ ba trong quy tắc phân phiên bản ngữ nghĩa đã chỉ ra rằng nó là một bản vá được tạo ra để sửa lỗi hoặc thực hiện một số tác vụ nhỏ khác như tái định dạng. Một thay đổi về tính năng sẽ dẫn đến một bản phát hành phụ hoặc chính.
-
Chúng ta có nên kỳ vọng rằng sẽ có sự thay đổi về tính năng giữa bản phát hành 2.6.0beta và bản phát hành 2.6.0 không?
Không. Phiên bản beta là một phiên bản thử nghiệm có chứa tất cả các tính năng sẽ có trong bản phát hành cuối cùng.
-
Tại sao chúng ta lại có thể biết rằng bản phát hành 1.0 sẽ không tương thích ngược với bản phát hành 0.9?
Số phiên bản 0.9 đã cảnh báo rõ ràng với các người dùng tiềm năng rằng phần mềm vẫn đang được thiết kế và rất có thể sẽ có giao diện khác khi được hoàn thiện ổn định thành phiên bản 1.0.
-
Nếu phát hiện ra một lỗi bảo mật trong một phiên bản sau một phiên đóng băng tính năng và trước thời điểm phát hành, bạn có thể sửa lỗi đó được không?
Chắc chắn là có thể. Khoảng thời gian giữa một phiên đóng băng tính năng và lúc phát hành được coi là khoảng thời gian để phát hiện và sửa lỗi (bao gồm cả lỗi bảo mật).
Đáp án Bài tập Mở rộng
-
Giả sử bạn muốn tiếp tục sử dụng một phiên bản phần mềm mã nguồn mở sau EOL vì nó có một tính năng mà bạn cần. Bạn có thể làm gì để giữ cho nó vẫn có thể tiếp tục sử dụng được?
Sau EOL, các nhà phát triển dự án không có còn bất cứ cam kết nào liên quan đến vấn đề sửa lỗi (bao gồm cả các lỗi bảo mật). Do đó, bạn nên theo dõi trình theo dõi lỗi và danh sách gửi thư của dự án một cách thường xuyên để biết được lỗi nào vừa xuất hiện. Vì mã đã có sẵn nên bạn có thể và nên sửa lỗi có trong phiên bản của mình. Về lý thuyết, bạn thậm chí có thể kết hợp các tính năng mới vào phiên bản của mình. Điều này thực sự sẽ biến phiên bản của bạn thành một nhánh của bản gốc.
-
Một số tiêu chí cho phép một bản sửa lỗi hoặc một yêu cầu tính năng được chọn trong số những yêu cầu khác là gì?
Đối với các bản sửa lỗi, tiêu chí sẽ bao gồm mức độ nghiêm trọng (được gán cho lỗi sau khi lỗi đó được đưa vào trình theo dõi lỗi) và số lượng người dùng bị ảnh hưởng. Đối với một tính năng, tiêu chí sẽ bao gồm số lượng người dùng mong muốn tính năng đó, mức độ khó khi mã hóa và tác động tiềm tàng của tính năng đó đối với các phần khác của chương trình.