Monday, June 2, 2014

Agile Software Development - Phát Triển Phần Mềm Linh Hoạt



1. Thực trạng

Các Công Ty outsource ở việt nam khách hàng chủ yếu là Nhật bản, xu thế các dự án ngắn hạn, thời gian triển khai dự án gấp rút, khách hàng thực hiện việc thiết kế và code đồng thời dẫn đến việc spec luôn thay đổi.

Làm oursource có lẽ  Coder luôn bị ám ảnh về việc Spec thay đổi, là Coder bản thân tôi cũng thường đau đầu với việc khách hàng thay đổi spec nhưng ngược tiến độ lại không được co dãn, có khi vừa hoàn thành xong thì khách hàng bỏ đi, thêm mới, thay đổi CSDL ... bla bla, tất cả điều này đều làm ảnh hưởng tới tâm lý của Coder, Teamleader. Lãnh đạo thì không kịp trở tay để update plan theo những thay đổi mới, nếu quản lý thay đổi không tốt dự án có NGUY CƠ bị failure là điều hoàn toàn có thể xảy ra.

2. Đối mặt

Để đối mặt với thực trạng nêu trên thì  Agile software development  là lựa chọn hoàn hảo để đề xuất vào lúc này.

Thuật ngữ "Agile" chính thức được sử dụng rộng rãi theo cách thống nhất kể từ khi “Tuyên ngôn Agile” được giới thiệu ra công chúng năm 2001. Nhờ tính linh hoạt, đa dạng và hiệu quả cao, các phương pháp Agile ngày càng trở thành sự lựa chọn hàng đầu của các khách hàng, nhà phát triển, các công ty phát triển phần mềm. Theo khảo sát của hãng nghiên cứu thị trường Forrester, mức độ phổ biến của Agile hiện đang ở mức cao nhất nhờ việc đem lại hiệu quả cao gấp nhiều lần so với các phương phán truyền thống.

Tuyên ngôn của Agile




Cá nhân và tương tác hơn là Quy trình và công cụ.

Phần mềm chạy tốt hơn là Tài Liệu đầy đủ.

Cộng tác với khách hàng hơn là Đàm phán hợp đồng.

Phản hồi với thay đổi hơn là Bám sát kế hoạch.


A. Giới thiệu -  Agile software development
 
Agile software development is a group of software development methods based on iterative and incremental development, in which requirements and solutions evolve through collaboration between self-organizing, cross-functional teams. It promotes adaptive planning, evolutionary development and delivery, a time-boxed iterative approach, and encourages rapid and flexible response to change. It is a conceptual framework that promotes foreseen tight iterations throughout the development cycle.  http://en.wikipedia.org/wiki/Agile_software_development

Về cơ bản thì phát triển phần mềm Linh Hoạt dựa trên nguyên lý Tiến Hóa và Lặp, luôn thay đổi để tốt hơn, công việc chia theo chu kỳ, mỗi chu kỳ cho ra một sản phẩm hoàn chỉnh, chu kỳ sau cho ra sản phẩm tốt hơn, hoàn chỉnh hơn chu kỳ trước đó, khuyến khích sự phản ứng nhanh, thay đổi kế hoạch linh hoạt để đáp ứng thay đổi và các chu kỳ vẫn cứ được lặp đi lặp lại, cứ tiến hóa cho đến khi kết thúc dự án.
B. Đặc trưng Agile

Tính lặp (Iterative)

Dự án sẽ được thực hiện trong các phân đoạn lặp đi lặp lại. Các phân đoạn (được gọi là Iteration hoặc Sprint) này thường có khung thời gian ngắn (từ một đến bốn tuần). Trong mỗi phân đoạn này, nhóm phát triển thực hiện đầy đủ các công việc cần thiết như lập kế hoạch, phân tích yêu cầu, thiết kế, triển khai, kiểm thử (với các mức độ khác nhau) để cho ra các phần nhỏ của sản phẩm. Các phương pháp agile thường phân rã mục tiêu thành các phần nhỏ với quá trình lập kế hoạch đơn giản và gọn nhẹ nhất có thể, và không thực hiện việc lập kế hoạch dài hạn. 



Tính tiệm tiến (Incremental) và tiến hóa (Evolutionary)

Cuối các phân đoạn, nhóm phát triển thường cho ra các phần nhỏ của sản phẩm cuối cùng. Các phần nhỏ này thường là đầy đủ, có khả năng chạy tốt, được kiểm thử cẩn thận và có thể sử dụng ngay (gọi là potentially shippable product increment of functionality). Theo thời gian, phân đoạn này tiếp nối phân đoạn kia, các phần chạy được này sẽ được tích lũy, lớn dần lên cho tới khi toàn bộ yêu cầu của khách hàng được thỏa mãn.

Xem việc thay đổi Spec chỉ là tất yếu (thích nghi – adaptive)

Do các phân đoạn chỉ kéo dài trong một khoảng thời gian ngắn, và việc lập kế hoạch cũng được điều chỉnh liên tục, nên các thay đổi trong quá trình phát triển (yêu cầu thay đổi, thay đổi công nghệ, thay đổi định hướng về mục tiêu v.v.) đều có thể được đáp ứng theo cách thích hợp . Ví dụ, trong Scrum – phương pháp phổ biến nhất hiện nay – trong khi nhóm phát triển sản xuất ra các gói phần mềm, khách hàng có thể đưa thêm các yêu cầu mới, chủ sản phẩm (Product Owner) có thể đánh giá các yêu cầu này và có thể đưa vào làm việc trong phân đoạn (được gọi là Sprint trong Scrum) tiếp theo. Theo đó, các quy trình agile thường thích ứng rất tốt với các thay đổi.

Nhóm tự tổ chức và liên chức năng

Cấu trúc nhóm agile thường là liên chức năng(cross-functionality) và tự tổ chức(self-organizing). Theo đó, các nhóm này tự thực hiện lấy việc phân công công việc mà không dựa trên các mô tả cứng về chức danh (title) hay làm việc dựa trên một sự phân cấp rõ ràng trong tổ chức. Các nhóm này cộng tác với nhau để ra quyết định, theo dõi tiến độ, giải quyết các vấn đề mà không chờ mệnh lệnh của các cấp quản lý. Họ không làm việc theo cơ chế “mệnh lệnh và kiểm soát” (command and control). Nhóm tự tổ chức có nghĩa là nó đã đủ các kĩ năng (competency) cần thiết cho việc phát triển phần mềm, do vậy nó có thể được trao quyền để tự ra quyết định, tự quản lí và tổ chức lấy công việc của chính mình để đạt được hiệu quả cao nhất.
3. Kinh nghiệm bản thân
Công nghệ Agile cung cấp rất nhiều phương pháp luận, quy trình và các thực nghiệm để cho việc phát triển phần mềm trở nên nhanh chóng và dễ dàng. Hiện nay tại Việt Nam, quy trình này đang được thử nghiệm tại các đội phát triển phần mềm của một số công ty lớn. 


Có nhiều phương pháp Agile, nhưng phổ biến nhất là Scrum cho hiệu quả cao nếu áp dụng đúng, điều mà mình thấy tâm đắc nhất ở đây đó là kế hoạch, Linh Hoạt nhưng vẫn đảm bảo rõ ràng.

Hàng ngày mỗi nhóm sẽ có một buổi họp nhanh khoảng 15 phút và mọi người sẽ trả lời 3 câu hỏi:
Hôm qua bạn làm gì?
Hôm này bạn sẽ làm gì?
Bạn gặp trở ngại gì?

Nhóm trưởng ghi và cập nhật vào bản kế hoạch để theo dõi tiến độ công việc của đội và chia sẻ kế hoạch đó cho toàn đội.

Việc quản lý nhóm + kết hợp lập trình cặp + clearn code sẽ cho kết quả cao, đẩy nhanh tiến độ và chất lượng sản phẩm được cải thiện rõ.

Mình xin chia sẻ thêm một số kinh nghiệm mình note lại trong quá trình làm việc xin chia sẻ và rất mong nhận được sự đóng góp chia sẻ ý kiến của mọi người để cùng nhau phát triển.

Hỏi ngay nếu tồn tại vấn đề bạn chưa rõ, còn băn khoăn.
Tái cấu trúc lại mã bẩn ngay khi có thể.
Lập trình cặp, bug đơn giản bạn tìm không ra nhưng đồng nghiệp của bạn thì có.
Tối ưu sự tương tác trong nhóm.
Thực hiện đúng chuẩn viết mã.
Mỗi lần commit code cần tìm thứ gì đó để thay đổi, tìm ra một tên biến đặt sai chuẩn, xắp xếp lại các logic cho gọn gàng, xóa các dòng code vô ích hoặc căn chỉnh lại format code trước khi commit sẽ giúp code của bạn tinh gọn hơn.

source: sưu tầm, tổng hợp, kinh nghiệm bản thân .

No comments:

Post a Comment