Menu
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Đang tải...

Bài 47 — Conflict Resolution — Tech Disagreements

Technical Leadership Bài 47/60

Mở đầu — vì sao bài này quan trọng

Nếu bạn hỏi mười tech lead rằng phần khó nhất của công việc là gì, ít người sẽ trả lời "viết code" hay "thiết kế hệ thống". Đa số sẽ nói về những cuộc tranh cãi kỹ thuật kéo dài không hồi kết, những buổi họp review kiến trúc mà hai kỹ sư giỏi nhất team ngồi công kích nhau bằng lời lẽ lịch sự nhưng cay nghiệt, hay tình huống một senior dev dọa nghỉ việc vì "không ai chịu nghe" ý kiến của mình về việc chọn database.

Xung đột (conflict) trong một đội kỹ thuật là điều không thể tránh khỏi. Và trớ trêu thay, những đội càng giỏi, càng có nhiều người thông minh với quan điểm mạnh mẽ, thì xung đột càng nhiều. Vấn đề không phải là loại bỏ xung đột — điều đó bất khả thi và thậm chí có hại. Vấn đề là bạn, với tư cách tech lead, có biết phân biệt loại xung đột nào lành mạnh cần được khuyến khích, loại nào độc hại cần được dập tắt, và có bộ công cụ để đưa một cuộc tranh cãi từ trạng thái bế tắc về trạng thái ra quyết định hay không.

Đây là kỹ năng phân biệt tech lead thực thụ với một senior engineer chỉ giỏi kỹ thuật. Một quyết định kỹ thuật sai có thể sửa được sau vài sprint. Nhưng một cuộc xung đột bị xử lý tệ có thể phá hủy niềm tin trong team trong nhiều tháng, khiến người giỏi ra đi, và biến những buổi thảo luận đáng lẽ sôi nổi thành sự im lặng đề phòng. Bài học này trang bị cho bạn khung tư duy và quy trình cụ thể để làm chủ những khoảnh khắc căng thẳng đó.

Khái niệm cốt lõi

Ba loại xung đột — và loại nào đáng giữ

Nghiên cứu kinh điển của Karen Jehn về xung đột nhóm chia làm ba loại, và mỗi loại đòi hỏi cách xử lý khác nhau.

Task conflict (xung đột về nội dung công việc) — bất đồng về cái gì hoặc làm thế nào: nên dùng PostgreSQL hay MongoDB, nên viết microservices hay monolith, nên refactor trước hay ship trước. Đây là loại xung đột lành mạnh và cần được khuyến khích. Một team không bao giờ có task conflict là một team hoặc đang che giấu ý kiến, hoặc không ai đủ quan tâm để phản biện. Khi ý kiến trái chiều được đưa lên bàn (surface), chất lượng quyết định tăng lên. Nhiệm vụ của tech lead là làm cho loại xung đột này an toàn để diễn ra.

Process conflict (xung đột về quy trình) — bất đồng về ai làm gì, khi nào, theo cách nào: ai được quyền merge, tại sao ticket này lại giao cho người kia, quy trình review đang quá chậm. Loại này ở mức vừa phải thì bình thường, nhưng nếu kéo dài thường là triệu chứng của việc trách nhiệm và quyền hạn chưa rõ ràng. Cách chữa không phải là tranh luận từng ca, mà là làm rõ ownership và định nghĩa quy trình.

Relationship conflict (xung đột quan hệ) — mâu thuẫn mang tính cá nhân: "tôi không ưa cách anh ta nói chuyện", "cô ấy luôn coi thường ý kiến người khác". Đây là loại độc hại, cần được phát hiện và dập tắt sớm. Gần như mọi nghiên cứu đều cho thấy relationship conflict làm giảm hiệu suất và sự hài lòng của nhóm. Điều nguy hiểm nhất là task conflict nếu xử lý tệ sẽ thoái hóa thành relationship conflict — một cuộc tranh luận về kiến trúc biến thành "anh này lúc nào cũng bảo thủ".

Nhiệm vụ trung tâm của tech lead: tách con người khỏi vấn đề

Nguyên tắc nền tảng từ cuốn Getting to Yes (Fisher & Ury): cứng rắn với vấn đề, mềm mỏng với con người. Khi hai kỹ sư tranh cãi về cách thiết kế API, bạn phải làm cho họ hiểu rằng họ đang cùng đứng một phía, nhìn về cùng một vấn đề, chứ không phải đối đầu nhau. Chuyển từ "quan điểm của anh vs quan điểm của tôi" sang "chúng ta đang giải bài toán gì".

Interests, không phải positions

Một công cụ mạnh khác: phân biệt position (lập trường được tuyên bố) và interest (lợi ích/nhu cầu thực sự đằng sau). Khi một dev khăng khăng "phải viết bằng Rust", position là "Rust", nhưng interest có thể là "tôi lo hệ thống không đủ nhanh" hoặc "tôi muốn học công nghệ mới để không bị tụt hậu". Khi bạn đào tới interest, bạn thường tìm ra giải pháp thỏa mãn cả hai bên mà không ai nghĩ tới ban đầu.

Disagree and commit

Có những xung đột không thể giải quyết bằng đồng thuận (consensus) vì đơn giản là không có câu trả lời khách quan đúng. Nguyên tắc disagree and commit (được Amazon và nhiều công ty áp dụng) nói rằng: sau khi mọi người đã được lắng nghe đầy đủ, một quyết định được đưa ra, và tất cả — kể cả người không đồng ý — cam kết thực hiện hết mình. Đây là van an toàn để tránh việc một team bị tê liệt vì cứ chờ tất cả cùng đồng ý.

Tình huống thực tế

Tình huống 1: Cuộc chiến monolith vs microservices ở một startup fintech Việt Nam

Tại một công ty fintech ở TP.HCM (khoảng 25 kỹ sư, đang gọi vốn vòng Series A), hai senior backend nổi tiếng của team — gọi là Tuấn và Minh — rơi vào bế tắc suốt ba tuần. Tuấn muốn tách hệ thống thanh toán hiện tại thành microservices để "scale cho 5 năm tới". Minh cho rằng team chỉ có 25 người, tách microservices lúc này là tự sát về vận hành. Mỗi buổi họp kiến trúc đều biến thành đấu khẩu, và các junior bắt đầu chọn phe. Vận tốc sprint giảm 30% chỉ vì team lưỡng lự không dám quyết.

Tech lead — chị Hương — nhận ra đây đã bắt đầu thoái hóa từ task conflict sang relationship conflict (Tuấn và Minh không còn nói chuyện ngoài giờ họp). Chị làm ba việc. Thứ nhất, chị gặp riêng từng người để đào interest: interest của Tuấn thật ra là nỗi sợ phải viết lại toàn bộ sau này khi công ty lớn; interest của Minh là lo team nhỏ không kham nổi vận hành phân tán. Cả hai interest đều hợp lý. Thứ hai, chị đưa cuộc tranh luận về dữ liệu thay vì ý kiến: yêu cầu cả hai cùng viết một tài liệu ước tính lượng transaction dự kiến 18 tháng tới và chi phí vận hành từng phương án. Con số cho thấy tải hiện tại chưa cần microservices, nhưng có một dịch vụ — reconciliation — thật sự nên tách ra. Thứ ba, chị áp dụng disagree and commit: quyết định giữ monolith, tách duy nhất reconciliation, và đặt một "trigger metric" (nếu vượt 500 transaction/giây thì xem lại). Tuấn không hoàn toàn đồng ý nhưng cam kết vì thấy có lộ trình rõ ràng.

Bài học: Khi tranh luận bế tắc vì ý kiến, hãy chuyển sang dữ liệu. Và một quyết định đi kèm điều kiện xem lại (trigger) giúp người "thua" cảm thấy quan điểm của mình không bị vứt bỏ mà chỉ tạm hoãn.

Tình huống 2: Code review biến thành công kích cá nhân tại một team ở Singapore

Một product team tại một scale-up ở Singapore có một senior tên Raj nổi tiếng review code cực kỹ. Vấn đề là comment của anh thường mang giọng điệu như "code này không ai viết thế cả" hay "bạn có đọc tài liệu không?". Một junior dev, Lan, sau ba tháng bị review kiểu này bắt đầu tránh giao code cho Raj, thậm chí nộp đơn cân nhắc chuyển team. Đây là relationship conflict thuần túy, ẩn dưới vỏ bọc "review kỹ thuật".

Engineering Manager không đứng về phe ai. Thay vào đó, anh dùng khung feedback tách bạch ý định và tác động (intent vs impact): gặp riêng Raj, thừa nhận ý định tốt (Raj thật sự muốn nâng chất lượng code), nhưng chỉ ra tác động thực tế (một đồng nghiệp đang muốn nghỉ). Anh cũng thiết lập lại chuẩn: mọi comment review phải nhắm vào code, không nhắm vào người, và phải kèm gợi ý cụ thể chứ không chỉ chê. Với Lan, anh giúp cô phân biệt phần feedback nào thật sự có giá trị kỹ thuật để không đánh mất bài học chỉ vì cách truyền đạt tệ.

Bài học: Xung đột quan hệ hiếm khi được giải quyết bằng cách phân xử "ai đúng ai sai". Nó được giải quyết bằng cách tách ý định khỏi tác động, và thiết lập lại chuẩn hành vi rõ ràng cho cả team chứ không chỉ nhắc một người.

Tình huống 3: Hai team bất đồng về việc "ai sở hữu cái shared library"

Tại một công ty e-commerce với hai team (Checkout và Catalog), một thư viện dùng chung liên tục gây tranh cãi: team Checkout muốn thay đổi nhanh, team Catalog sợ bị vỡ. Mỗi PR vào thư viện này là một trận chiến, và hai tech lead đổ lỗi cho nhau khi có sự cố. Đây là process conflict điển hình — gốc rễ là ownership không rõ.

Giải pháp không nằm ở tranh luận từng PR mà ở việc làm rõ cấu trúc. Hai tech lead cùng CTO ngồi lại và quyết định mô hình "steward + contribution": một team được chỉ định làm chủ (steward) thư viện, có quyền quyết định cuối cùng và trách nhiệm review; team kia đóng góp theo mô hình như open source nội bộ — gửi PR kèm test, steward review trong SLA 2 ngày. Xung đột biến mất không phải vì ai thắng, mà vì quyền và trách nhiệm đã được định nghĩa.

Bài học: Process conflict lặp đi lặp lại là triệu chứng, không phải bệnh. Đừng xử lý từng ca; hãy sửa cấu trúc ownership tạo ra nó.

Hướng dẫn từng bước

Khi bạn đối mặt với một xung đột kỹ thuật, đây là quy trình sáu bước để đi từ căng thẳng đến quyết định.

Bước 1 — Chẩn đoán loại xung đột. Trước khi làm gì, hãy xác định: đây là task, process hay relationship conflict? Câu hỏi kiểm tra: nếu cả hai bên đột nhiên hòa thuận, vấn đề kỹ thuật có tự biến mất không? Nếu có, đó là relationship conflict đội lốt. Chẩn đoán sai loại dẫn đến chữa sai bệnh.

Bước 2 — Hạ nhiệt nếu đang nóng. Đừng cố giải quyết một xung đột khi cảm xúc đang cao. "Chúng ta tạm dừng ở đây, mai sáng họp lại với dữ liệu cụ thể" là một câu nói cứu vãn được nhiều cuộc họp. Não người khi bị kích hoạt phản ứng phòng thủ thì không nghe lý lẽ.

Bước 3 — Đào interest, gạt bỏ position. Với mỗi bên, hỏi "điều gì khiến bạn lo ngại nhất nếu làm theo phương án kia?". Câu trả lời hé lộ interest thật. Ghi lại interest của cả hai bên lên bảng để mọi người thấy chúng thường không mâu thuẫn như position.

Bước 4 — Chuyển từ ý kiến sang bằng chứng. Đặt câu hỏi: dữ liệu nào sẽ giúp chúng ta quyết định? Nếu cần, làm một spike/prototype nhỏ, một benchmark, hoặc một tài liệu ước tính. Một cuộc tranh cãi kéo dài ba tuần thường có thể được giải quyết bằng một prototype ba ngày.

Bước 5 — Xác định người ra quyết định và ra quyết định. Không phải mọi thứ đều đồng thuận. Làm rõ ai là decision owner (thường là tech lead hoặc người sở hữu domain đó). Sau khi mọi người được lắng nghe, quyết định được đưa ra công khai, kèm lý do.

Bước 6 — Disagree and commit, kèm điều kiện xem lại. Ghi nhận công khai quan điểm của người không đồng ý, rồi yêu cầu cam kết. Nếu được, gắn một điều kiện xem lại (trigger metric hoặc mốc thời gian) để quyết định không mang tính chung thân. Điều này giúp người "thua" giữ được thể diện và động lực.

Lỗi thường gặp & mẹo

Lỗi 1 — Né tránh xung đột để giữ hòa khí. Tech lead sợ căng thẳng nên gạt task conflict xuống thảm. Kết quả: quyết định tồi được thông qua, và người bất đồng ôm cục ấm ức. Hòa khí giả tạo đắt hơn xung đột thật rất nhiều.

Lỗi 2 — Dùng thẩm quyền quá sớm. "Tôi là tech lead, cứ làm theo cách này." Đôi khi bạn phải dùng quyền, nhưng nếu dùng trước khi mọi người cảm thấy được lắng nghe, bạn giết chết động lực đóng góp ý kiến trong tương lai. Lần sau sẽ không ai buồn phản biện.

Lỗi 3 — Chẩn đoán nhầm relationship conflict thành task conflict. Bạn cứ tổ chức thêm buổi họp kỹ thuật để giải quyết, nhưng vấn đề thật là hai người không ưa nhau. Càng họp càng tệ.

Lỗi 4 — Để một người chi phối bằng âm lượng. Người nói to nhất không phải người đúng nhất. Chủ động mời ý kiến từ người im lặng, đặc biệt junior — họ thường thấy vấn đề mà người quá quen hệ thống bỏ qua.

Mẹo: Dùng kỹ thuật "steelmanning" — yêu cầu mỗi bên trình bày lại quan điểm của phía kia một cách mạnh nhất có thể, trước khi phản biện. Điều này ép mọi người thực sự hiểu đối phương và làm dịu căng thẳng ngay lập tức.

Mẹo: Với quyết định quan trọng và gây tranh cãi, hãy lưu vết bằng một tài liệu (như ADR hoặc RFC). Ghi lại các phương án, lý do chọn, và ai không đồng ý vì lý do gì. Sáu tháng sau khi có người hỏi "tại sao hồi đó lại chọn thế này", bạn có câu trả lời — và tránh mở lại cùng một trận chiến.

Bài tập thực hành

  • Chẩn đoán: Nhớ lại một xung đột gần đây trong team bạn. Viết ra một câu trả lời: đó là task, process hay relationship conflict? Nếu là task/process, có dấu hiệu nào cho thấy nó đang thoái hóa thành relationship conflict không?
  • Đào interest: Chọn một bất đồng kỹ thuật đang diễn ra. Viết ra position của mỗi bên, rồi cố gắng viết ít nhất hai interest thật sự đằng sau mỗi position. Bạn có tìm ra giải pháp thứ ba thỏa mãn cả hai không?
  • Kịch bản disagree and commit: Soạn một đoạn 4-5 câu bạn sẽ nói trong buổi họp khi đưa ra quyết định mà một senior không đồng ý — sao cho vẫn ghi nhận quan điểm của họ, nêu rõ quyết định, và mời họ cam kết. Đọc to lên và chỉnh cho tự nhiên.
  • Thiết kế trigger: Với một quyết định kiến trúc bạn vừa (hoặc sắp) đưa ra, hãy định nghĩa một "trigger metric" cụ thể — con số hoặc mốc thời gian mà khi đạt tới, team sẽ xem lại quyết định. Điều này biến quyết định thành có thể đảo ngược.

Tóm tắt

Xung đột kỹ thuật là điều không thể tránh, và ở những đội giỏi thì càng nhiều. Việc của tech lead không phải là dập tắt mọi xung đột mà là phân loại đúng và xử lý đúng cách. Task conflict là lành mạnh — hãy làm cho nó an toàn để diễn ra. Process conflict là triệu chứng của ownership mờ nhạt — hãy sửa cấu trúc. Relationship conflict là độc hại — hãy phát hiện sớm và tách ý định khỏi tác động.

Bộ công cụ cốt lõi gồm: tách con người khỏi vấn đề, đào interest thay vì tranh cãi position, chuyển từ ý kiến sang dữ liệu, và dùng disagree and commit kèm điều kiện xem lại để không làm team tê liệt. Ba tình huống — cuộc chiến microservices ở fintech Việt, review code độc hại ở Singapore, và tranh chấp shared library — cho thấy cùng một nguyên tắc áp dụng linh hoạt theo loại xung đột.

Cuối cùng, hãy nhớ: cách bạn xử lý một cuộc xung đột dạy cho cả team biết điều gì được phép. Nếu bạn xử lý công bằng, dựa trên dữ liệu và tôn trọng con người, bạn không chỉ giải quyết một tranh cãi — bạn xây dựng một văn hóa nơi bất đồng làm cho quyết định tốt hơn thay vì làm cho quan hệ tệ đi.