0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Nợ kỹ thuật: Công cụ hay hỗn loạn?

Đăng vào 3 tuần trước

• 10 phút đọc

Giới thiệu: Nợ không phải là thất bại, mà là công cụ

Trong những năm đầu sự nghiệp, tôi từng xem nợ kỹ thuật như một dấu hiệu của sự thất bại. Một bí mật bẩn thỉu phản ánh tiêu cực tiêu chuẩn kỹ thuật của đội ngũ. Nhưng sau gần 14 năm xây dựng phần mềm, tôi hiểu rằng nó thực sự là một công cụ kinh doanh.

Hãy nghĩ về nó như một khoản vay. Bạn vay để mang lại giá trị nhanh chóng và đưa một tính năng quan trọng ra thị trường, biết rằng bạn sẽ phải trả lãi sau này bằng việc tái cấu trúc hoặc tăng thêm độ phức tạp. Vấn đề không phải là khoản vay; vấn đề là việc bỏ qua các khoản thanh toán lãi suất cho đến khi nó làm phá sản dự án của bạn.

Bài viết này không nhằm tẩy chay nợ. Nó tập trung vào việc phân biệt giữa nợ có thể quản lý và một hình thức nguy hiểm hơn: hỗn loạn kỹ thuật.

Trong suốt những năm qua, tôi đã phát triển một khuôn khổ thực tiễn để quản lý nợ nhằm tránh hỗn loạn. Điều này không phải là viết mã hoàn hảo từ ngày đầu tiên, mà là đưa ra những quyết định chiến lược có ý thức giúp dự án của bạn phát triển khỏe mạnh và đội ngũ tiến lên phía trước.

Giải phẫu của Nợ Kỹ Thuật: Không phải tất cả nợ đều giống nhau

Giống như nợ tài chính, nợ kỹ thuật cũng có nhiều hình thức, mỗi hình thức đều có những hệ quả riêng. Hiểu rõ những khác biệt này là rất quan trọng để đưa ra quyết định thông minh và giao tiếp hiệu quả với đội ngũ và các bên liên quan. Trong nhiều năm, tôi đã tìm thấy một mô hình đơn giản, lấy cảm hứng từ công việc của Martin Fowler, rất hữu ích để phân loại nợ mà chúng ta tích lũy:

Nợ có chủ ý và thận trọng (Loại chiến lược): Đây là nợ mà chúng ta chủ động chọn để có được lợi thế kinh doanh cụ thể. Ví dụ, "Chúng tôi biết rằng cách làm này không lý tưởng, nhưng nó cho phép chúng tôi xác nhận một giả thuyết kinh doanh quan trọng trong tháng này thay vì quý sau. Chúng tôi đã ghi chép lại và tạo một vé để tái cấu trúc." Loại nợ này thường là dấu hiệu của các đội ngũ hoạt động hiệu quả, hiểu được sự cân bằng giữa tốc độ và khả năng bảo trì lâu dài.

Nợ vô tình và thận trọng (Loại tiến hóa): Loại nợ này phát sinh từ quá trình học tập và phát triển của chúng ta với tư cách là nhà phát triển. "Cách đây một năm, đây là giải pháp tốt nhất mà chúng tôi biết cách thực hiện. Hôm nay, với sự hiểu biết sâu sắc hơn về lĩnh vực và các mẫu kiến trúc tốt hơn, chúng tôi nhận ra một cách tiếp cận thanh lịch hơn." Đây không phải là thất bại; đó là một sản phẩm tự nhiên của sự cải tiến liên tục và yêu cầu đang tiến hóa.

Nợ không thận trọng và có chủ ý (Loại nguy hiểm): Đây là loại nợ mà chúng ta cần cảnh giác. "Không có thời gian để suy nghĩ, chỉ cần làm cho nó hoạt động! Sao chép và dán mã đó! Chúng ta sẽ sửa sau (spoiler: thường thì không)." Cách tiếp cận này, thường bị thúc đẩy bởi áp lực không bền vững hoặc thiếu tầm nhìn, thực sự là nguyên nhân gây ra hỗn loạn kỹ thuật và dẫn đến đau khổ lâu dài.

Nhận biết loại nợ mà bạn đang phải đối mặt là bước đầu tiên để quản lý nó một cách hiệu quả. Nợ chiến lược và tiến hóa có thể chấp nhận được, thậm chí có lợi, nếu được xử lý đúng cách. Chính loại nợ không thận trọng mà chúng ta phải tích cực chiến đấu để giảm thiểu.

Từ rối loạn đến hỗn loạn: Khi nào thì ranh giới bị vượt qua

Nợ kỹ thuật là một rò rỉ chậm; hỗn loạn kỹ thuật là một cơn lũ. Vậy làm thế nào bạn biết khi nào bạn đã vượt qua ranh giới từ một vấn đề có thể quản lý đến một tình trạng khẩn cấp? Các triệu chứng thường mang tính văn hóa nhiều hơn là kỹ thuật, và chúng rất dễ nhận thấy khi bạn biết cách phát hiện.

Dưới đây là những cờ đỏ mà tôi đã học để theo dõi:

Nỗi sợ hãi khi triển khai: Đội ngũ nín thở mỗi khi mã được hợp nhất vào nhánh chính. Việc triển khai vào cuối tuần gần như bị cấm một cách không chính thức, không phải vì chính sách, mà do một cảm giác lo lắng chung. Hệ thống đã trở nên quá mong manh và khó đoán, khiến mỗi lần phát hành trở thành một canh bạc.

Hiệu ứng cánh bướm: Bạn thực hiện một thay đổi dường như nhỏ đối với mô-đun xác thực người dùng, và bỗng nhiên, hệ thống hóa đơn bị hỏng. Khi các thành phần quá chặt chẽ với nhau, thật khó để dự đoán tác động lan tỏa của bất kỳ thay đổi nào. Mã nguồn của bạn đã trở thành một ngôi nhà thẻ bài.

Việc onboarding vô tận: Một nhà phát triển tài năng mới gia nhập đội ngũ, nhưng họ mất nhiều tháng để trở nên hiệu quả. Logic quá phức tạp và không được tài liệu hóa khiến họ không thể thực hiện những thay đổi đơn giản mà không cần hỗ trợ nhiều. Độ phức tạp của hệ thống đã trở thành một rào cản to lớn.

Lý thuyết cửa sổ vỡ: Mã nguồn bị lộn xộn với mã đã được chú thích, biến số được đặt tên kém và định dạng không nhất quán. Điều này gửi một thông điệp rõ ràng: chất lượng không phải là ưu tiên ở đây. Khi những vấn đề nhỏ không được giải quyết, chúng tạo ra một môi trường mà việc thêm nhiều rối ren trở nên chấp nhận được, dẫn đến sự suy giảm nhanh chóng về sức khỏe mã.

Nếu những triệu chứng này cảm thấy quá quen thuộc, điều đó có nghĩa là nợ của bạn đã tích lũy thành hỗn loạn. Nhưng tin tốt là, luôn có một con đường trở lại trật tự. Điều này đòi hỏi một cách tiếp cận có chủ ý và có cấu trúc, mà chúng ta sẽ đi sâu vào phần tiếp theo.

Khung của tôi để kiểm soát nợ (Cách tiếp cận 3 bước)

Khi bạn bị bao quanh bởi hỗn loạn, thật dễ để tìm kiếm một giải pháp thần kỳ hoặc lên kế hoạch cho một nỗ lực tái cấu trúc lớn, đa sprint mà sẽ không bao giờ được phê duyệt. Sự thật là, con đường trở lại sự tỉnh táo là thông qua một quy trình bình tĩnh, có hệ thống và liên tục. Đây là khung 3 bước mà tôi thường sử dụng để kéo các dự án ra khỏi bờ vực.

Bước 1: Hình dung và ghi lại
Bạn không thể quản lý những gì bạn không thể nhìn thấy. Bước đầu tiên là biến nợ kỹ thuật của bạn thành hiện thực.

Tạo một Sổ Đăng Ký Nợ: Điều này không cần phải phức tạp. Nó có thể là một loại vé cụ thể trong Jira, một bảng Trello, hoặc thậm chí là một tệp DEBT.md đơn giản trong kho lưu trữ của bạn. Mục tiêu là có một nguồn thông tin chung, duy nhất.

Những gì cần ghi lại: Đối với mỗi mục, hãy ghi lại ba điều:

Bước 2: Ưu tiên và "bán" giải pháp
Với một danh sách rõ ràng, bạn có thể ưu tiên. Một ma trận Tác động so với Nỗ lực là một điểm khởi đầu tuyệt vời - giải quyết các mục có tác động cao và nỗ lực thấp trước để tạo động lực.

Nhưng đây là thách thức thực sự: nhận được sự đồng thuận từ một khách hàng hoặc Product Owner chỉ muốn các tính năng mới. Trong nhiều năm, tôi đã học được rằng việc trình bày tái cấu trúc như một nhiệm vụ chỉ thuộc về kỹ thuật là một cuộc chiến thất bại. Thay vào đó, tôi sử dụng các chiến thuật đàm phán:

Chiến thuật #1: "Combo Tính năng". Đây là chiến lược mà tôi thường sử dụng. Thay vì yêu cầu thời gian để tái cấu trúc, tôi kết hợp việc trả nợ với một tính năng mà khách hàng muốn trong cùng khu vực mã. Lời đề nghị của tôi nghe như sau: "Có, chúng tôi có thể thêm chức năng xuất PDF đó. Để xây dựng nó một cách chắc chắn và đảm bảo rằng các thay đổi báo cáo trong tương lai diễn ra nhanh chóng, trước tiên chúng tôi cần hiện đại hóa nền tảng của mô-đun này. Combo hoàn chỉnh sẽ mất 5 ngày. Nếu chúng tôi chỉ thêm tính năng, nó sẽ mất 3 ngày nhưng sẽ rất mong manh, và mỗi tính năng tiếp theo trong khu vực này sẽ tốn gấp đôi." Bạn không yêu cầu họ hy sinh một tính năng; bạn đang yêu cầu họ đầu tư thêm một chút để nâng cao nó và bảo vệ tương lai.

Chiến thuật #2: Biểu tượng "Nhà máy Tính năng". Tôi thường mô tả khả năng phát triển của chúng tôi như một "nhà máy tính năng." Tôi giải thích cho các bên liên quan: "Chúng tôi có thể vận hành máy móc của mình ở 100% công suất để sản xuất liên tục, nhưng nếu chúng tôi không dành 15% thời gian cho việc bảo trì (trả nợ), chúng sẽ bị gỉ sét và hỏng, và sản lượng tổng thể của chúng tôi sẽ giảm sút. 15% đó không phải là thời gian bị mất; đó là sự đầu tư đảm bảo rằng nhà máy hoạt động ở công suất tối đa trong 85% thời gian còn lại." Điều này định hình lại cuộc trò chuyện từ một vấn đề kỹ thuật thành một vấn đề về hiệu quả hoạt động và rủi ro.

Chiến thuật #3: Định lượng Chi phí của Việc Không Hành Động. Khi nợ đã gây ra đau đớn rõ ràng, tôi sử dụng dữ liệu từ sổ đăng ký của chúng tôi. Tôi trình bày các số liệu cụ thể: "Quý trước, chúng tôi đã dành 40 giờ phát triển để sửa lỗi liên quan đến mô-đun thanh toán. Đó là một tuần làm việc mà không tạo ra giá trị mới. Tôi đề xuất chúng tôi đầu tư 25 giờ trong sprint này để sửa nguyên nhân gốc. Điều này không chỉ cải thiện sự ổn định mà còn giải phóng 40 giờ đó cho phát triển mới trong quý tiếp theo."

Bước 3: Trả nợ theo cách có hệ thống
Cuối cùng, hãy tích hợp việc trả nợ vào quy trình làm việc thường nhật của bạn. Đây là một cuộc chạy marathon, không phải một cuộc chạy nước rút.

Quy tắc của Boy Scout: Hãy ủng hộ quy tắc này trong đội ngũ của bạn: "Luôn để lại mã sạch hơn một chút so với khi bạn tìm thấy nó." Mỗi lần nhà phát triển chạm vào một tệp, họ nên thực hiện một cải tiến nhỏ - đổi tên biến, trích xuất một phương thức, cải thiện một chú thích. Những thay đổi nhỏ, dần dần này sẽ tích lũy sức mạnh theo thời gian.

Phân bổ một ngân sách cố định cho sprint: Hãy biến điều này thành một thói quen. Một cách chính thức, dành một phần trăm khả năng của sprint (ví dụ: 15-20%) để làm việc trên các mục từ Sổ Đăng Ký Nợ của bạn. Điều này ngăn nợ trở thành thứ mà bạn chỉ giải quyết trong thời kỳ khủng hoảng.

Kết luận: Nợ được quản lý tốt là dấu hiệu của sự trưởng thành

Trong nhiều năm, cộng đồng phát triển phần mềm đã nói về nợ kỹ thuật với một cảm giác xấu hổ. Tôi tin rằng đã đến lúc chúng ta phải định hình lại cuộc trò chuyện đó.

Một dự án không có nợ kỹ thuật có thể là một dự án không đủ nhanh để đáp ứng nhu cầu kinh doanh. Một dự án chìm trong hỗn loạn thì đã chìm.

Nhưng một dự án có một sổ đăng ký nợ rõ ràng, có thứ tự và được quản lý tích cực? Đó là dấu hiệu của một đội ngũ kỹ thuật khỏe mạnh và trưởng thành. Nó thể hiện sự hiểu biết về các sự đánh đổi, cam kết với chất lượng lâu dài và khả năng giao tiếp chiến lược. Đó không phải là một bí mật bẩn thỉu cần phải giấu diếm; đó là một sổ cái chiến lược cho thấy đội ngũ đang kiểm soát.

Vì vậy, lần tới khi bạn thảo luận về nợ kỹ thuật, đừng nghĩ về nó như một thất bại. Hãy xem nó như một phép đo khả năng của đội ngũ bạn trong việc cân bằng giữa các thời hạn hôm nay và tính bền vững của ngày mai.

Tôi rất muốn nghe ý kiến của bạn trong phần bình luận.

Món nợ kỹ thuật "đắt đỏ" nhất mà bạn từng phải trả là gì? Và những chiến lược nào bạn thấy hiệu quả nhất trong việc giữ hỗn loạn ở xa?

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào