Tools & Workflow

Sửa Bug từ 80 phút xuống 15 phút: Kỷ Nguyên Debugging bằng AI

By Ginbok8 min read

Đó là một buổi sáng thứ Ba bình thường. Tôi đang nhâm nhi ly cà phê đầu ngày, bắt đầu hòa mình vào nhịp làm việc với ShopFlow—nền tảng thương mại điện tử B2B chủ lực của chúng tôi. ShopFlow là một hệ thống cực kỳ phức tạp; nó quản lý danh mục sản phẩm đồ sộ, các cấu trúc giá phân tầng và tích hợp sâu với hàng nghìn nhà cung cấp. Thế rồi, một tiếng "ping" quen thuộc vang lên trên Microsoft Teams.

"Này, một vài gói giá đang bị biến mất khỏi màn hình Quản lý giá," một đồng nghiệp từ đội hỗ trợ nhắn. "Dữ liệu chắc chắn có trong database—tôi đã kiểm tra các bảng SQL rồi. Bạn xem giúp tại sao UI không hiển thị chúng được không?"

Vào "thời xa xưa" (thực ra chỉ khoảng 18 tháng trước), điều này sẽ kích hoạt một quy trình rườm rà và mệt mỏi. Tôi sẽ phải mở SQL Server Management Studio (SSMS), dành 15 phút viết các câu lệnh truy vấn thăm dò, tìm kiếm (grep) trong toàn bộ mã nguồn C# khổng lồ, đọc qua hàng lớp trừu tượng, đoán già đoán non, gắn debugger, và lặp lại vòng lặp đó. Đó là một công việc tiêu tốn ít nhất 2 giờ đồng hồ, chủ yếu mất vào "thuế" chuyển đổi giữa các cửa sổ và ngữ cảnh tư duy.

Nhưng lần này, tôi có một bộ công cụ khác. Tôi hoàn toàn ở lại trong IDE của mình, tận dụng sức mạnh của Model Context Protocol (MCP) và một trợ lý lập trình AI. Kết quả? Lỗi được xác định, lập tài liệu, sửa chữa và xác minh chỉ trong đúng 15 phút.

Vũ Khí Của Lập Trình Viên Hiện Đại

Trước khi đi sâu vào chi tiết, hãy xem qua bộ công cụ (stack) đã giúp điều này khả thi. Phép màu không nằm ở bất kỳ công cụ đơn lẻ nào; nó nằm ở cách chúng kết hợp với nhau thành một quy trình liên tục với không một lần chuyển đổi ngữ cảnh.

Bước 1: Phân tích ngữ nghĩa và Tìm nguyên nhân gốc (3 phút)

Tôi không bắt đầu bằng cách tìm kiếm tên tệp tin. Tôi chỉ mô tả triệu chứng cho Cursor: "Người dùng báo cáo thiếu các gói giá trên màn hình quản lý. Hãy tìm mã nguồn backend thực hiện lấy dữ liệu này."

Trong vài giây, AI thực hiện tìm kiếm ngữ nghĩa trên toàn bộ repository và định vị đúng handler trong GetPricingPlansQuery.cs. Nó chỉ thẳng cho tôi câu lệnh LINQ này:

var plans = await _dbContext.PricingPlans
    .Where(p => p.StartDate <= now && p.EndDate >= now && p.IsActive)
    .OrderBy(p => p.DisplayOrder)
    .Select(p => new PlanDto { Id = p.Id, Name = p.Name })
    .ToListAsync(cancellationToken);

AI không chỉ tìm thấy code; nó lập tức cảnh báo một lỗ hổng logic: "Điều kiện p.EndDate >= now sẽ trả về false khi EndDateNULL. Trong SQL, bất kỳ phép so sánh nào với NULL đều trả về UNKNOWN, khiến dòng đó bị lọc bỏ. Nếu NULL đại diện cho một gói giá không bao giờ hết hạn, những bản ghi này đang bị ẩn sai cách."

Bước 2: Xác minh qua Database MCP (2 phút)

Tôi đã có giả thuyết, nhưng tôi cần dữ liệu thực tế. Thay vì Alt-Tab sang SSMS, tôi hỏi AI (thông qua Database MCP): "Kiểm tra bảng PricingPlans. Có gói giá nào đang hoạt động mà EndDate bị NULL không?"

AI tự tạo và thực thi truy vấn nội bộ:

SELECT Name, StartDate, EndDate, IsActive 
FROM PricingPlans 
WHERE IsActive = 1;

Kết quả trả về ngay lập tức trong khung chat:

Dữ liệu đã xác nhận: 75% các gói giá của chúng tôi không có ngày hết hạn (NULL), và code của chúng tôi đang coi chúng là "đã hết hạn".

Bước 3: Tự động hóa tài liệu (2 phút)

Làm kỹ thuật chuyên nghiệp cần có dấu vết (paper trail). Sử dụng Azure DevOps MCP, tôi ra lệnh cho AI: "Tạo một bug ticket trong backlog. Tiêu đề là 'Lỗi giá khi EndDate là NULL'. Giải thích nguyên nhân và cách khắc phục."

AI dự thảo một ticket đầy đủ bao gồm:

Tôi nhấn "Confirm", và work item đã xuất hiện trên Azure DevOps. Không cần mở trình duyệt, không cần đăng nhập.

Bước 4: Sửa lỗi trong "một nốt nhạc" (1 phút)

Việc sửa lỗi rất đơn giản, nhưng khả năng áp dụng nó một cách an toàn của AI mới là then chốt. Tôi chấp nhận thay đổi được đề xuất:

// Trước
.Where(p => p.StartDate <= now && p.EndDate >= now && p.IsActive)

// Sau
.Where(p => p.StartDate <= now && (p.EndDate == null || p.EndDate >= now) && p.IsActive)

Bước 5: Xử lý vấn đề phát sinh (5 phút)

Tôi cố gắng xác minh lỗi qua Swagger, nhưng gặp lỗi 403 Forbidden. User test của tôi không có quyền PRICING_PLAN:READ. Thông thường, tôi sẽ phải lục lọi các bảng AuthorizationScope một cách thủ công. Thay vào đó, tôi hỏi AI: "User ID của tôi là 'dev-user-01'. Tại sao tôi bị 403 ở endpoint này? Hãy truy vấn các bảng auth."

AI tìm hiểu mối quan hệ giữa Users, UserGroups, và AuthorizationScopes bằng MCP. Nó phát hiện ra quyền này chưa được gán cho nhóm của tôi và đưa ra câu lệnh SQL để xử lý:

INSERT INTO UserGroupAuthorizationScope (GroupId, Scope)
VALUES ('admin-group-id', 'PRICING_PLAN:READ');

Tôi thực thi lệnh này qua công cụ, và API lập tức trả về dữ liệu chính xác.

Bài toán kinh tế: 15 phút so với 80 phút

Hãy so sánh thời gian tiêu tốn giữa cách truyền thống và cách dùng AI:

Sự tăng tốc gấp 5 lần này không đến từ việc AI viết code giỏi hơn—việc sửa code vốn rất đơn giản. Nó đến từ việc loại bỏ Tải nhận thức (Cognitive Load). Mỗi khi bạn chuyển từ C# sang SQL, hoặc từ IDE sang trình duyệt, não bộ của bạn phải trả một khoản "thuế chuyển đổi ngữ cảnh". AI với tích hợp MCP giữ bạn luôn ở trong trạng thái tập trung cao độ (Flow State).

Góc nhìn chiến lược: Tại sao MCP là bước ngoặt

Nếu bạn là Tech Lead hoặc Architect, bài học ở đây không chỉ là "dùng AI đi". Đó là "tích hợp ngữ cảnh". Dưới đây là 3 điểm mấu chốt:

1. Ngữ cảnh là vua, Ngữ cảnh tích hợp là chúa tể

Một LLM chỉ nhìn thấy code giống như một đầu bếp bị bịt mắt. Nó biết công thức nhưng không thấy nguyên liệu. Bằng cách cho AI truy cập vào Schema (Database MCP) và Yêu cầu nghiệp vụ (Azure DevOps MCP), bạn cho nó "đôi mắt" để đưa ra giải pháp chính xác tuyệt đối.

2. Bảo mật ngay từ đầu

Khi triển khai các công cụ này, hãy dùng quyền Read-Only cho kết nối database của AI trên production, hoặc giới hạn nó ở môi trường local/staging. Trong trường hợp của tôi, việc dùng bridge tới local dev-db đảm bảo AI không vô tình xóa nhầm bảng production khi đang cố "sửa lỗi".

3. Sự kết thúc của kỷ nguyên "Grep"

Chúng ta đang chuyển từ tìm kiếm từ khóa (lexical search) sang tìm kiếm ý định ngữ nghĩa. AI hiểu rằng "thiếu gói giá" liên quan đến bảng PricingPlans, trạng thái Active, và khoảng ngày DateRanges, ngay cả khi những từ đó không xuất hiện trong báo cáo lỗi.

Kết luận

Tương lai của kỹ thuật phần mềm không phải là AI thay thế lập trình viên; mà là AI loại bỏ những rào cản giữa ý địnhthực thi. Việc sửa lỗi trong 15 phút mà tôi mô tả không phải là phép màu—đó là kết quả của một môi trường tích hợp hoàn hảo, nơi công cụ hiểu đồng thời mã nguồn, dữ liệu và quy trình làm việc.

Nếu bạn chưa khám phá Model Context Protocol (MCP), hãy bắt đầu ngay hôm nay. Dù là kết nối database, logs hay trình quản lý tác vụ, mỗi nhịp cầu bạn xây dựng sẽ rút ngắn khoảng cách từ lúc phát hiện lỗi đến khi làm hài lòng người dùng.

#ai#workflow#backend#automation#llm
← Back to Articles
Sửa Bug từ 80 phút xuống 15 phút: Kỷ Nguyên Debugging bằng AI - Ginbok