Cập nhật lần cuối vào 20/10/2023 bởi Phạm Mạnh Cường
- Pair Programming là gì?
- Các vai trò trong Pair Programming
- Cách triển khai Pair Programming
- Lợi ích của Pair programming
- FAQ
- 2 người làm 1 việc liệu có lãng phí?
- Làm thế nào để cảm thấy thoải mái khi cặp cùng người khác?
- Giao tiếp như nào khi triển khai Pair Programming để không bị xung đột?
- Làm sao để triển khai Pair Programming khi 2 bên không cùng trình độ?
- Liệu tôi có thể tập trung khi luôn có người ở bên cạnh nói?
- Nên làm gì khi team bị lẻ ra 1 người?
- Nếu team quá ít thành viên, có nên triển khai Pair Programming?
- Quá tập trung vào công việc nên thường xuyên quên đảo cặp, làm sao để chuyển cặp thường xuyên?
- Chúng tôi có phải lập trình cặp mọi lúc không?
- Khi nào không nên Pair ?
Pair Programming là gì?
Pair Programming là kỹ thuật Agile mà 2 lập trình viên sẽ ngồi chung một chỗ, dùng chung một máy tính, một người chịu trách nhiệm viết code (còn gọi là driver), một người chịu trách nhiệm đánh giá và phản hồi từng dòng code (còn gọi là navigator).
Hai người sẽ không cố định vai trò mà là hoán đổi liên tục với nhau. Điều này sẽ mang lại rất nhiều lợi ích so với cách làm việc truyền thống.
Các vai trò trong Pair Programming
Driver
Driver là người trực tiếp sử dụng bàn phím và chuột để viết ra từng dòng code.
Driver tập trung vào việc triển khai công việc, các mục tiêu nhỏ thay vì là tập trung vào các vấn đề vĩ mô.
Driver nên liên tục nói về lý do đưa ra dòng code này trong suốt quá trình triển khai Pair Programming.
Ví dụ khi Driver thực hiện công việc của mình, thì những gì họ phải thực hiện là:
- Trích xuất các biến
- Trích xuất các private method
- Đặt tên biến, method và class
- Tái cấu trúc và cải tiến cục bộ khác.
- Logic cấp độ phương pháp
- Viết code
- Chạy thử nghiệm
Navigator
Navigator là người quan sát Driver triển khai công việc, họ là người sẽ đánh giá từng dòng code ngay lập tức, đưa ra chỉ dẫn và chia sẻ các quan điểm của mình.
Navigator tập trung vào chiến lược, hướng tới việc các code được phù hợp với thiết kế chung. Tìm ra các lỗi lớn, các trở ngại và đưa ra bước tiếp theo.
Các công việc của Navigator có thể là:
- Giữ một danh sách các nhiệm vụ sẽ được thực hiện
- Ưu tiên danh sách đó
- Thêm công việc tiếp tuyến được phát hiện vào danh sách nhiệm vụ
- Đảm bảo cặp đôi không đi chệch quá nhiều so với nhiệm vụ hiện tại
- Suy nghĩ chiến lược về thiết kế
- Xác định vấn đề của mã hoặc vấn đề của thiết kế
- Điều chỉnh kế hoạch
Cách triển khai Pair Programming
Bước 1: Chọn cặp
Các cặp tự tổ chức thông qua việc chọn thành viên phù hợp nhất với tác vụ hiện thời.
Khi bạn bắt đầu làm một việc, hãy đề nghị một lập trình viên khác tham gia cùng. Nếu có ai đó đề nghị, hãy thoải mái đồng ý lập cặp cùng.
Đừng bao giờ phân chia cố định các cặp, hãy lập cặp một cách tự nhiên, linh hoạt và luân chuyển các cặp trong ngày.
Qua thời gian, một người sẽ lập trình cặp với tất cả mọi người trong đội. Điều này sẽ giúp cả đội gắn bó hơn và tất cả mọi người đều được chia sẻ kiến thức và các kĩ năng thiết kế.
Bước 2: Triển khai
Khi ngồi theo cặp, hãy chắc chắn rằng bạn cảm thấy thoải mái, không bị mỏi. Đặt ghế cạnh nhau, đảm bảo mỗi người có đủ khoảng trống, và có thể nhìn rõ màn hình. Khi làm Driver, hãy đặt bàn phím trước mặt bạn.
Chú ý: mọi người khi lập trình theo cặp thường có xu hướng với tay đến bàn phím và chuột chứ không kéo chúng về gần (trước mặt) mình.
Những người lập trình cặp làm việc thông qua đối thoại. Dù bạn là Driver hay Navigator, hãy nói tất cả những điều bạn nghĩ ra. Hãy làm từng bước thiết kế nhỏ, liên tục, tốt nhất là làm theo phát triển hướng kiểm thử và nói về những giả định của bạn, mục tiêu ngắn hạn, hướng phát triển chung, và bất kì vấn đề gì của tính năng đang cài đặt hoặc của toàn bộ dự án.
Hãy hỏi khi bạn thấy mơ hồ về vấn đề gì đó. Việc thảo luận thường giúp cả bạn và người cùng cặp hiểu rõ vấn đề đó hơn.
Khi bạn điều hướng và thấy rằng cần bảo Driver phải bấm phím nào đó, hãy tự mình bấm luôn phím đó. Nếu khi Driver cần nghỉ ngơi một chút, hãy đưa bàn phím cho Navigator.
Khi ghép cặp, hãy thường xuyên chuyển đổi vai trò cho nhau ít nhất sau mỗi 30 phút, có thể là sau vài phút.
Bước 3: Chuyển cặp
Khi bạn cần một không khí tươi mới hoặc khi bế tắc chán nản, hãy chuyển cặp. Tuy nhiên luôn phải giữ lại một người đã theo phần việc từ đầu để có thể giúp người mới vào cặp nhanh chóng nắm bắt được vấn đề.
Có nhiều lúc, chỉ cần giải thích vấn đề là gì cho người khác cũng giúp bạn giải quyết được vấn đề đó.
Trong lập trình cặp, dù bạn không thấy nản hay bế tắc, đổi cặp vài lần một ngày cũng tốt. Điều này sẽ giúp thông tin trong đội được thông suốt và mọi người sẽ làm việc hiệu quả hơn.
Lời khuyên dành cho bạn nên chuyển cặp mỗi 4 tiếng.
Lợi ích của Pair programming
Chia sẻ kiến thức
Việc có hai người làm việc trên một đoạn mã sẽ giúp nhóm truyền bá kiến thức về công nghệ và miền hàng ngày, đồng thời ngăn ngừa tình trạng thiếu kiến thức.
Tips: Đừng ngại thực hiện các nhiệm vụ khi bạn không biết gì về công nghệ liên quan hoặc miền. Nếu bạn tiếp tục làm việc trong lĩnh vực mà bạn cảm thấy thoải mái nhất, bạn sẽ bỏ lỡ cơ hội học hỏi những điều mới và cuối cùng là truyền bá kiến thức trong nhóm của mình.
Ý tưởng tốt hơn
Lập trình cặp buộc chúng ta phải thảo luận về các cách tiếp cận và giải pháp, thay vì chỉ nghĩ trong đầu. Việc nói và giải thích một cách thành tiếng sẽ thúc đẩy chúng ta suy ngẫm xem liệu chúng ta có thực sự hiểu đúng hay không, hoặc liệu chúng ta có thực sự có một giải pháp tốt hay không.
Tips: Dành thời gian cho các buổi họp 1:1 và phản hồi thường xuyên sẽ giúp đôi bên xây dựng mối quan hệ, sự tin tưởng để có thể thoải mái hơn trong quá trình đặt câu hỏi và cởi mở hơn về những kiến thức bạn chưa hiểu.
Giữ tập trung
Sẽ dễ dàng hơn rất nhiều để có một cách tiếp cận có cấu trúc khi có hai bạn: Mỗi người trong số các bạn phải truyền đạt rõ ràng lý do tại sao bạn đang làm điều gì đó và bạn đang hướng tới đâu.
Khi làm việc một mình, bạn có thể dễ bị phân tâm hơn rất nhiều, chẳng hạn như bằng cách “chỉ nhanh chóng” thử một cách tiếp cận khác mà không suy nghĩ kỹ, rồi quay lại thoát ra khỏi hang thỏ vài giờ sau đó.
Tips: Cùng nhau lên kế hoạch! Thảo luận về nhiệm vụ hiện tại của bạn và suy nghĩ về những bước bạn cần thực hiện để đạt được mục tiêu của mình. Hãy ghi từng bước vào ghi chú dán, sắp xếp chúng theo thứ tự và thực hiện từng bước một.
Đánh giá code ngay khi viết
Khi chúng ta ghép nối, chúng ta có 4 con mắt để ý đến những điều nhỏ nhặt và lớn hơn khi chúng ta thực hiện, sẽ có nhiều lỗi xảy ra hơn thay vì sau khi chúng ta hoàn thành.
Việc tái cấu trúc mã luôn là một phần của mã hóa và do đó là lập trình cặp. Việc cải thiện mã sẽ dễ dàng hơn khi bạn có ai đó bên cạnh vì bạn có thể thảo luận về các cách tiếp cận hoặc cách đặt tên cho mọi thứ chẳng hạn.
Tips: Hãy hỏi nhau những câu hỏi! Câu hỏi là công cụ mạnh mẽ nhất để hiểu bạn đang làm gì và tìm ra giải pháp tốt hơn. Nếu mã không dễ đọc và dễ hiểu đối với một trong các bạn, hãy thử cách khác dễ hiểu hơn.
Kết hợp tư duy
Như đã đề cập khi chúng tôi mô tả kiểu trình điều khiển/điều hướng cổ điển trước đó, việc ghép nối cho phép bạn có những góc nhìn khác nhau về mã.
Bộ não của Driver xe thường ở chế độ “chiến thuật” nhiều hơn, suy nghĩ về các chi tiết, dòng mã hiện tại. Trong khi đó, bộ não của Navigator có thể suy nghĩ một cách chiến lược hơn, xem xét bức tranh tổng thể, đưa ra các bước tiếp theo và ý tưởng trên các tờ ghi chú.
Tips: Hãy nhớ chuyển đổi bàn phím và vai trò thường xuyên. Điều này giúp bạn sảng khoái, không buồn chán và rèn luyện cả hai cách suy nghĩ.
Quyền sở hữu mã tập thể
Quyền sở hữu mã tập thể từ bỏ mọi khái niệm về quyền sở hữu cá nhân đối với các mô-đun. Cơ sở mã được sở hữu bởi toàn bộ nhóm và bất kỳ ai cũng có thể thực hiện thay đổi ở bất kỳ đâu.
Tips: Chỉ lập trình cặp không đảm bảo bạn đạt được quyền sở hữu mã chung. Bạn cần đảm bảo rằng bạn cũng luân chuyển mọi người qua các cặp và khu vực khác nhau của mã để ngăn chặn tình trạng thiếu kiến thức.
Giữ WIP ở mức thấp
Lập trình theo cặp giới hạn số lượng công việc mà một nhóm có thể làm song song và do đó làm tăng sự tập trung tổng thể. Điều này sẽ đảm bảo rằng công việc được thực hiện liên tục và các yếu tố cản trở sẽ được giải quyết ngay lập tức.
Nhanh chóng hoà hợp thành viên mới
Vì việc ghép nối tạo điều kiện thuận lợi cho việc chia sẻ kiến thức nên nó có thể giúp ích cho việc hòa nhập của các thành viên mới trong nhóm. Những người mới tham gia có thể tìm hiểu về dự án, doanh nghiệp và tổ chức với sự trợ giúp của cặp đôi của họ.
Tips: Sẽ là chưa đủ nếu chỉ xếp những người mới tham gia vào một cặp, sau đó họ được đưa vào và đưa vào một cách “kỳ diệu”. Đảm bảo cung cấp bức tranh toàn cảnh và bối cảnh rộng hơn trước phiên ghép nối đầu tiên của họ và dành thêm thời gian cho quá trình làm quen. Điều này sẽ giúp họ dễ dàng theo dõi và đóng góp hơn trong quá trình ghép đôi cũng như tận dụng tối đa lợi ích của nó.
FAQ
2 người làm 1 việc liệu có lãng phí?
“Một nghiên cứu cho thấy rằng lập trình cặp tốn công sức hơn 15% so với lập trình một mình, nhưng nhhọo thành sản phẩm hơn và ít lỗi hơn 15% [Cockburn & Williams].
Trong lập trình theo cặp, một người sẽ lập trình còn người kia nghĩ về những thứ xa hơn, về những vấn đề có thể phát hiện sớm, và chiến lược.
Làm thế nào để cảm thấy thoải mái khi cặp cùng người khác?
Lập trình theo cặp ban đầu có thể không được thoải mái, bởi cách làm việc này yêu cầu bạn phải có tinh thần hợp tác nhiều hơn cách mà bạn quen làm. Điều này là tự nhiên và thường sẽ mất đi sau một hoặc hai tháng, nhưng bạn phải đối mặt với một vài thử thách.
Không gian: Khi bạn ngồi xuống làm việc, điều chỉnh vị trí và thiết bị sao cho bạn cảm thấy thoải mái. Dọn rác trên bàn làm việc và hãy chắc chắn có đủ không gian cho chân và đầu gối của bạn. Một vài người (như tôi) cần rất nhiều không gian riêng. Những người khác lại thích ngồi gần hơn. Khi bạn bắt đầu ghép cặp, hãy thảo luận về nhu cầu không gian cá nhân của bạn và đối tác của bạn.
Vệ sinh cá nhân: Tương tự như vậy, không thể không nhắc tới vấn đề vệ sinh cá nhân. Nhớ rằng những hương vị mạnh như cà phê, tỏi, hành, thức ăn cay có thể dẫn tới hơi thở hôi. Để tránh xảy ra rắc rối, hãy cùng nhau quyết định cách góp ý về những thói quen cá nhân một cách tôn trọng.
Giao tiếp như nào khi triển khai Pair Programming để không bị xung đột?
Những Driver mới thỉnh thoảng gặp khó khăn trong giao tiếp với người Navigator, họ có thể chiếm bàn phím tự gõ mã theo ý họ và làm mất đi sự giao tiếp trong cặp.
Ping-Pong Pairing: Để thực hành giao tiếp và chuyển đổi vai trò trong lập trình cặp, hãy thử lập trình cặp kiểu bóng bàn (ping-pong pairing). Khi lập trình cặp kiểu bóng bàn, một người A viết một kiểm thử. Người B sẽ viết mã để vượt qua kiểm thử rồi viết một kiểm thử mới cho người A . Người A viết mã để vượt kiểm thử rồi lại viết một kiểm thử mới. Quá trình như vậy được lặp đi lặp lại như khi chơi bóng bàn.
Những lời phê bình thẳng thắn về mã nguồn và thiết kế là rất quí báu, nhưng ban đầu ta sẽ khó mà chấp nhận được chúng. Mỗi người có một độ nhạy cảm khác nhau, vì vậy hãy chú ý tới cách đối tác của bạn tiếp nhận những lời nhận xét của bạn như thế nào.
Hãy cố chuyển những câu khẳng định (ví dụ: “Phương thức này quá dài”) thành câu hỏi hay lời gợi ý (“Chúng ta có thể làm phương thức này ngắn hơn không?” hoặc “Chúng ta có nên đẩy khối mã này ra thành một phương thức mới hay không?”).
Hãy giữ một thái độ hợp tác để cùng giải quyết vấn đề.
Làm sao để triển khai Pair Programming khi 2 bên không cùng trình độ?
Lập trình theo cặp thường là sự hợp tác giữa những người có trình độ tương đương nhau, nhưng thỉnh thoảng một lập trình viên cao cấp, nhiều kinh nghiệm sẽ cặp với một người ở trình độ thấp hơn.
Thay vì xem mối quan hệ này như sinh viên giáo viên, hãy lấy lại sự cân bằng ngang hàng bằng cách tạo ra cơ hội cho cả hai người để học tập.
Có gì lưu ý đối với Driver ?
Khi mới bắt đầu, bạn sẽ cảm thấy vụng về khi làm Driver. Bạn cũng có thể cảm thấy người Navigator nhìn nhận ra những ý tưởng và vấn đề nhanh hơn bạn rất nhiều. Quả thật như vậy, Navigator có nhiều thời gian để nghĩ hơn Driver. Tình thế sẽ được đảo ngược khi bạn đổi vai trò, trở thành Navigator. Dần dần việc làm cặp sẽ trở nên tự nhiên.
Có gì lưu ý đối với Navigator ?
Khi điều hướng, bạn sẽ cảm thấy như muốn nhảy vào dành lấy bàn phím từ người cùng cặp. Hãy thư giãn, Driver của bạn sẽ thường đưa ra ý kiến bằng cả lời nói và mã nguồn.
Người đó sẽ mắc những lỗi gõ sai hay những lỗi nhỏ, nhưng hãy cho họ chút thời gian để tự sửa lại.
Hãy dùng trí lực của bạn để nghĩ về bức tranh lớn hơn. Những kiểm thử nào khác bạn cần phải viết? Làm thế nào để đoạn mã phù hợp với phần còn lại của hệ thống? Có sự trùng lặp nào cần loại bỏ không? Mã có thể rõ ràng hơn được không? Thiết kế tổng thể có thể được tốt hơn không?
Tương tự như vậy, khi một câu hỏi phát sinh, hãy dành một chút thời gian để tìm kiếm câu trả lời trong khi Driver đang làm việc. Một số nhóm dùng thêm máy tính xách tay cho mục đích này. Nếu bạn cần nhiều hơn một vài phút, hãy cùng Driver tìm kiếm giải pháp. Đôi khi cách tốt nhất để làm là tách riêng ra, tìm kiếm song song với nhau và thường xuyên chia sẻ với nhau những gì học được.
Liệu tôi có thể tập trung khi luôn có người ở bên cạnh nói?
Khi điều hướng, nếu bạn gặp khó khăn để hiểu các bước tiếp theo Driver định làm, hãy yêu cầu Driver nói ra suy nghĩ của họ.
Là Driver, đôi khi bạn có thể thấy rằng mình đang mất tập trung. Hãy để Navigator biết, họ có thể đưa ra gợi ý giúp bạn giải quyết vấn đề. Cũng có thể, bạn chỉ cần một vài khoảnh khắc yên tĩnh để tập trung lại.
“Nếu bạn khó tập trung, hãy thử thực hiện các bước nhỏ hơn.”
Nếu bị mất tập trung liên tục, bạn có thể đã làm theo các bước quá lớn. Hãy sử dụng TDD (Test-Driven Development) và làm theo các bước rất nhỏ (baby step).
Dựa vào Navigator của bạn để theo dõi những gì bạn cần làm (nói với cô ấy nếu bạn có một ý tưởng, cô ấy sẽ viết nó ra) và chỉ tập trung vào vài dòng mã cần phải làm để vượt qua kiểm thử.
Nếu bạn đang làm việc với một kĩ thuật mà bạn không hoàn toàn hiểu, dành vài phút để làm việc với một khung giải pháp. Bạn và người cùng cặp của bạn có thể cùng làm hoặc làm riêng.
Nên làm gì khi team bị lẻ ra 1 người?
Người lập trình viên bị lẻ ra đó có thể làm những công việc khác không liên quan đến mã nguồn sản phẩm.
Họ có thể nghiên cứu kỹ thuật mới, hoặc nghiên cứu sâu hơn về công nghệ mà nhóm đang dùng.
Hoặc họ có thể bắt cặp cùng với một khách hàng hoặc kiểm thử viên để xem xét chương trình, “đánh bóng” chương trình hoặc làm kiểm thử khám phá.
Hoặc họ cũng có thể làm batman của nhóm (trong một nhóm XP, batman là người xử lý những yêu cầu trợ giúp hoặc yêu cầu đột xuất của khách hàng, thuyết phục họ dời yêu cầu đột xuất đó sang phân đoạn sau).
Thường thì lập trình viên bị lẻ ra dùng thời gian để xem lại thiết kế tổng thể để hiểu rõ hơn nó hoặc nghĩ cách cải thiện những phần chưa ổn. Nếu có nhiều việc tái cấu trúc cần làm, người lập trình viên lẻ có thể đảm nhận việc này.
Nếu team quá ít thành viên, có nên triển khai Pair Programming?
Thậm chí một ông thánh cũng có thể làm bạn phát cáu nếu bạn cứ phải cặp với ông ta ngày này qua ngày khác. Bạn phải tự mình quyết định khi nào thì lập trình cặp và khi nào bạn cần thời gian làm việc một mình. Nếu bạn thấy ổn nhưng cặp của bạn lộn xộn dần, đừng cố quá, hãy nghỉ ngơi một chút.
Tôi đã từng lập trình cặp với một người trong 3 tháng liền làm một dự án hai người. Tôi nghĩ việc chúng tôi có một văn phòng rộng và một cái bàn to rất hữu ích: nó giúp chúng tôi không gian để di chuyển vòng vòng xả căng thẳng. Chúng tôi còn có một cái tủ lạnh mini với đầy đồ ăn ở trong. Thậm chí khi có những điều kiện thoải mái như vậy, tôi vẫn có những lần phải phát cáu lên.
Có lẽ điều quan trọng giúp tôi có thể lập trình cặp với cùng một người lâu như vậy là nhờ người cùng cặp với tôi là người rất dễ tính và không để tâm đến những lần tôi phát cáu đó.
Quá tập trung vào công việc nên thường xuyên quên đảo cặp, làm sao để chuyển cặp thường xuyên?
Thực tế, thời điểm tốt nhất để đổi cặp và có được không khí làm việc tươi mới là khi bạn cảm thấy bế tắc hoặc “ngán”.
Một vài đội dùng đồng hồ báo giờ để chuyển cặp sau một khoảng thời gian định trước. Báo cáo của Belshee cho thấy rằng chuyển cặp sau mỗi 90 phút đem lại hiệu quả tốt. Mặc dù việc tạo thói quen chuyển cặp là rất tốt, nhưng hãy chắc chắn là tất cả mọi người đều muốn vậy (Có thể có ai đó không muốn chuyển cặp mà muốn tiếp tục làm việc cặp với người cũ để giải quyết nốt vấn đề sắp xong chẳng hạn).
Chúng tôi có phải lập trình cặp mọi lúc không?
Đây là điều mà cả nhóm của bạn nên cùng quyết định. Trước khi quyết định, hãy thử làm việc theo cặp trong tất cả các mã nguồn sản phẩm (mọi thứ bạn cần phải bảo trì) trong một tháng. Ban có thể sẽ thấy thú vị hơn mong đợi.
Bất chấp những quy định, bạn vẫn sẽ làm ra những đoạn mã mà bạn không phải bảo trì (Khung giải pháp là một ví dụ). Những cái này có thể được hưởng lợi từ nghiên cứu cá nhân.
Nếu bạn thấy chán khi lập trình cặp, hãy xem bạn có thể làm cho thiết kế ít lặp lại hơn không.
Một vài tác vụ cứ lặp đi lặp lại đến nỗi mà không cần thiết phải động não thêm.
Tuy nhiên, trước khi từ bỏ lập trình cặp, hãy xem tại sao thiết kế của bạn lại yêu cầu quá nhiều sự lặp lại. Nó có thể là dấu hiệu của một lỗ hổng thiết kế. Navigator nên sử dụng thêm thời gian để nghĩ về việc cải tiến thiết kế và thảo luận nó với cả nhóm.
Khi nào không nên Pair ?
Lập trình cặp yêu cầu một môi trường làm việc thoải mái. (tham khảo các thiết kế “Sit Together” ở chương 6). Nếu không gian làm việc của bạn không cho phép các cặp ngồi cạnh nhau một cách thoải mái, hoặc là thay đổi không gian làm việc hoặc là đừng lập trình cặp nữa.
Tương tự như vậy, nếu đội của bạn không ngồi cùng nhau, lập trình cặp có thể mất tác dụng. Việc lập trình cặp từ xa thì không thể bằng được khi ngồi cùng nhau.
Một lý do khác để không lập trình cặp khi lập trình viên không thích ứng được. Lập trình cặp là một sự thay đổi lớn về phong cách lập trình và bạn có thể gặp phải vấn đề không tương thích.
Tôi thường giải quyết vấn đề này bằng cách yêu cầu mọi người cố gắng thử lập trình cặp trong một hoặc hai tháng trước khi đưa ra quyết định cuối cùng. Nếu họ vẫn không thể thích ứng được, tốt nhất là không nên áp dụng lập trình cặp nữa thay vì cố gắng ép buộc.