Xử lý ngoại lệ thực tế bắt đầu từ ví dụ thật. Tìm hiểu cách thu thập phê duyệt trễ, dữ liệu thiếu và các trường hợp đặc biệt trước khi viết logic ứng dụng.

Một sơ đồ luồng sạch trông ổn vì nó giả định mọi người làm mọi thứ theo đúng trình tự, với dữ liệu đúng, vào thời điểm phù hợp. Công việc thực tế hiếm khi như vậy. Ai đó gửi biểu mẫu muộn, quản lý nghỉ ốm, khách hàng bỏ sót chi tiết quan trọng, hoặc một khoản thanh toán cần phê duyệt đặc biệt mà ban đầu không ai nhắc tới.
Đó là lý do phiên bản đầu tiên của một ứng dụng có thể trông hoàn chỉnh trong demo nhưng bắt đầu hỏng ngay khi người thật dùng nó. Con đường lý tưởng hoạt động. Công việc hàng ngày thì không ở trên con đường lý tưởng lâu.
Điểm khởi đầu an toàn nhất là giả định phiên bản gọn gàng chưa đầy đủ. Một yêu cầu đơn giản có thể thay đổi nhanh khi một chi tiết nhỏ sai lệch. Một trường thiếu, một khách hàng không bình thường, hoặc một phê duyệt bị chậm có thể dừng toàn bộ quy trình và khiến mọi người đoán phải làm gì tiếp theo.
Các lỗi phổ biến thường đơn giản:
Đó không chỉ là chuyện phiền toái nhỏ. Một trường hợp lạ có thể chặn mọi thứ phía sau nó. Nhân viên bắt đầu dùng cách tạm thời qua chat, bảng tính hoặc email, và ứng dụng ngừng là nơi duy nhất làm việc.
Mục tiêu tốt hơn là đơn giản: thu thập ngoại lệ trước khi bạn viết quy tắc. Hỏi chuyện gì xảy ra khi dữ liệu thiếu, khi thời điểm sai, và khi một yêu cầu không phù hợp con đường tiêu chuẩn. Những ví dụ lộn xộn đó không phải chi tiết phụ. Chúng quyết định ứng dụng của bạn có hoạt động trong thực tế hay không.
Vấn đề đầu tiên cần nắm không phải là các trường hợp hiếm. Là những sự kiện lộn xộn xảy ra hàng tuần và âm thầm phá vỡ luồng công việc gọn gàng. Nếu bạn muốn phiên bản đầu mạnh hơn, hãy tìm nơi công việc bị chậm, bị chặn hoặc phải giao cho người xử lý vì hệ thống không thể quyết.
Phê duyệt trễ thường đứng đầu danh sách. Một quản lý phê duyệt yêu cầu sau thời hạn, sau khi kỳ trả lương đóng, hoặc sau khi hàng đã được đặt lại. Ứng dụng cần có quy tắc cho khoảnh khắc đó. Nó nên mở lại yêu cầu, tạo yêu cầu mới, thông báo cho tài chính, hay gửi sang xem xét thay vì giả vờ rằng phê duyệt đến đúng hạn?
Dữ liệu thiếu là một rào cản phổ biến khác. Biểu mẫu có thể được gửi mà không có mã số thuế, hóa đơn, ngày giao hàng, hoặc thông tin liên hệ khách hàng. Nếu bước tiếp theo phụ thuộc vào trường đó, luồng không nên lỗi với một thông báo mơ hồ. Nó nên tạm dừng, hiển thị cái gì đang thiếu và làm cho việc sửa lỗi trở nên dễ dàng.
Các trường hợp đặc biệt quan trọng vì chúng phơi bày giới hạn của con đường bình thường. Có thể hầu hết hoàn trả đơn giản, nhưng các khoản hoàn trả trên mức nhất định cần bằng chứng thêm. Có thể một phòng ban tuân theo quy tắc phê duyệt khác. Những trường hợp này không cần một ứng dụng hoàn toàn mới, nhưng cần có phân nhánh rõ ràng.
Một bước hữu ích ban đầu là tìm bốn mẫu sau: phê duyệt đến quá muộn để theo lộ trình ban đầu, chi tiết thiếu chặn bước tiếp theo, yêu cầu bất thường cần quy tắc khác, và những lúc hệ thống nên dừng và hỏi con người.
Xem xét của con người không phải là thất bại. Nó thường là lựa chọn an toàn nhất khi ứng dụng gặp dữ liệu mâu thuẫn, ngoại lệ chính sách hoặc hành động có chi phí cao. Hàng đợi xem xét tạm dừng thường tốt hơn một lỗi im lặng.
Nếu bạn tìm những ngoại lệ này sớm, phiên bản đầu tiên sẽ thực tế hơn và ít mong manh hơn.
Cách nhanh nhất để bỏ sót một ngoại lệ xấu là chỉ hỏi quản lý đã thiết kế quy trình. Vấn đề thực sự thường nằm ở những người làm việc mỗi ngày. Họ biết bước nào bị bỏ qua, trường nào thường rỗng, và phê duyệt nào đến muộn, lệch thứ tự hoặc ngoài hệ thống.
Bắt đầu bằng các cuộc trò chuyện ngắn. Yêu cầu mọi người mô tả một trường hợp bình thường, rồi hỏi điều gì đã khác lần cuối khi mọi thứ rối. Đừng hỏi ý kiến chung về quy trình. Hỏi những câu chuyện thật: đã xảy ra gì, điều gì thiếu, ai sửa, và họ phải làm gì thủ công.
Công việc cũ là nguồn tốt khác. Email trước đó, vé hỗ trợ, tin nhắn chat và ghi chú bàn giao thường cho thấy chính xác lúc nào một luồng sạch bị phá vỡ. Những bản ghi này hữu ích vì chúng nắm ngôn ngữ mọi người dùng khi có sự cố, không phải phiên bản chỉnh chu từ tài liệu quy trình.
Cũng kiểm tra các công cụ bên lề mà mọi người dùng. Nếu ai đó giữ một bảng tính, danh sách giấy dán, hoặc tài liệu cá nhân để theo dõi ngoại lệ, đó là dấu hiệu mạnh. Các cách xử lý tạm thời tồn tại vì lý do. Chúng thường tiết lộ các quy tắc mà ứng dụng của bạn cần ngay từ ngày đầu.
Nguồn tốt nhất để xem xét thường là hệ thống bóng như bảng tính và danh sách cá nhân, chuỗi email nơi người ta hỏi thiếu thông tin hoặc phê duyệt thủ công, hội thoại chat về sửa gấp, vé hỗ trợ đề cập đến chậm trễ hoặc mục bị từ chối, và vài trường hợp gần nhất đã sai kèm theo dòng thời gian đầy đủ.
Nguồn cuối cùng quan trọng hơn vẻ bề ngoài. Các ca thất bại gần đây thường tốt hơn các bản tóm tắt cũ vì chúng cho thấy chuỗi sự kiện chính xác. Bạn có thể tìm ra các mẫu như phê duyệt đến sau hạn chót, khách hàng không gửi tệp bắt buộc, hoặc ai đó dùng quy tắc đặc biệt mà không ai ghi lại.
Nếu bạn đang phác thảo phiên bản đầu trong công cụ dựng dựa trên chat, hãy thu thập các ví dụ này trước khi tạo logic. Xây luồng an toàn hơn dễ hơn khi các trường hợp lộn xộn được nhìn thấy sớm.
Bắt đầu với một trường hợp thực, không phải lý thuyết. Viết nó như cách một người giải thích cho đồng đội: họ định làm gì, điều gì sai, ai can thiệp, và kết quả ra sao.
Một câu chuyện lộn xộn như "yêu cầu bị kẹt vì quản lý đang nghỉ, rồi tài chính phê duyệt sau đó với một trường bị thiếu" hữu ích hơn sơ đồ gọn gàng. Nó cho thấy điểm mà ứng dụng thường bị vấp.
Với mỗi trường hợp, rút ra bốn thông tin: đã xảy ra gì, ai quyết định, vì sao họ quyết, và ứng dụng nên làm gì tiếp theo.
Cách này giữ trọng tâm vào hành vi, không chỉ màn hình. Mục tiêu không phải bao phủ mọi trường hợp lạ trong ngày đầu. Mục tiêu là phát hiện các mẫu lặp lại.
Khi có vài câu chuyện, nhóm những câu cảm thấy giống nhau. Các nhóm đơn giản thường tự xuất hiện: phê duyệt trễ, thông tin thiếu, hỏi sai người, yêu cầu trùng lặp, hoặc cần phê duyệt đặc biệt vượt mức.
Rồi biến mỗi nhóm thành quy tắc nhẹ nhất có hiệu quả. Quy tắc đó không luôn cần tự động hóa đầy đủ. Đôi khi quy tắc tốt nhất là cảnh báo, tạm dừng hoặc bước xem xét thủ công.
Ví dụ, nếu phê duyệt trễ vì người phê duyệt vắng mặt, ứng dụng có thể gửi nhắc sau 24 giờ, chuyển giao sau 48 giờ, hoặc yêu cầu người phê duyệt dự phòng xem xét. Nếu một trường quan trọng thiếu, lựa chọn tốt nhất có thể là lưu nháp và quay lại thay vì dừng cứng. Điều đó giữ cho quy trình tiếp tục mà không che giấu vấn đề.
Nếu bạn xây trong công cụ dạng chat như Koder.ai, các trường hợp bằng ngôn ngữ tự nhiên rất hữu ích. Chúng cung cấp cho hệ thống thứ gì đó cụ thể để làm việc, nên luồng đầu tiên dựa trên quyết định thực thay vì giả định gọn nhưng không thực tế.
Trước khi khóa logic, chạy hai hoặc ba câu chuyện thực qua nó. Hỏi vài câu cơ bản. Luồng có đến cùng kết quả như trường hợp thực không? Nó có dừng an toàn khi thiếu thông tin không? Nó có biết khi nào nên tạm dừng và hỏi con người không?
Nếu câu trả lời là không, đừng thêm phức tạp ngay. Viết lại quy tắc bằng lời đơn giản trước. Quy tắc rõ ràng thường dẫn đến luồng tốt hơn so với quy tắc tinh vi mà không ai giải thích được.
Bắt đầu với phiên bản gọn. Nhân viên gửi yêu cầu taxi $42 sau khi gặp khách hàng. Họ thêm ngày, số tiền, mã dự án và hóa đơn. Quản lý phê duyệt trước hạn chốt lương, và tài chính tính vào đợt hoàn trả tiếp theo.
Con đường đó dễ mô phỏng, nhưng không phải toàn bộ công việc.
Bây giờ thêm ngoại lệ đầu tiên. Nhân viên gửi đúng hạn, nhưng quản lý phê duyệt một ngày sau khi kỳ trả lương đóng. Ứng dụng không nên âm thầm đẩy qua như thể không có gì xảy ra, và cũng không nên từ chối yêu cầu.
Phản ứng tốt hơn là chuyển yêu cầu sang một trạng thái rõ như "đã phê duyệt sau hạn chốt." Từ đó, ứng dụng có thể giữ khoản thanh toán cho chu kỳ trả lương tiếp theo, thông báo cho nhân viên về ngày thanh toán mới, và chuyển hồ sơ sang tài chính chỉ khi chính sách công ty cho phép thanh toán ngoài chu kỳ.
Điều đó nghĩa là ứng dụng cần lưu nhiều hơn một ngày. Nó nên theo dõi khi chi phí được gửi, khi được phê duyệt, và kỳ chốt nào bị lỡ.
Giờ thêm ngoại lệ thứ hai. Nhân viên quên hóa đơn, nên quản lý phê duyệt dựa trên giải thích. Hai ngày sau, hóa đơn được gửi đến.
Nếu ứng dụng được xây tốt, hồ sơ không biến mất hay khởi động lại từ đầu. Nó chuyển sang trạng thái "chờ hóa đơn", gửi nhắc, và giữ mở. Khi hóa đơn được tải lên sau đó, ứng dụng mở lại hồ sơ và chỉ gửi tới bước còn thiếu hành động.
Một luồng như vậy có thể đi qua vài trạng thái đơn giản: đã gửi, chờ phê duyệt quản lý, đã phê duyệt sau hạn chốt, tạm giữ vì thiếu hóa đơn, và mở lại cho kiểm toán/tài chính.
Đó là cách xử lý ngoại lệ thực tế trong thực hành. Ứng dụng không chỉ quyết yes hoặc no. Nó quyết giữ, chuyển hướng, hoặc mở lại hồ sơ mà không mất ngữ cảnh, ngày tháng hay trách nhiệm.
Thiếu thông tin là điều bình thường, không phải trường hợp hiếm. Nếu ứng dụng của bạn giả định mọi biểu mẫu hoàn chỉnh từ lần gửi đầu, luồng sẽ tắc ngay khi người dùng gặp thiếu sót. Quy tắc tốt hơn là đơn giản: chỉ yêu cầu những gì cần cho bước tiếp theo.
Lên kế hoạch từng bước. Hỏi ứng dụng cần biết gì ngay bây giờ, và điều gì có thể chờ. Một yêu cầu chi phí có thể cần số tiền và tên nhân viên trước khi gửi, nhưng hóa đơn cuối cùng chỉ cần trước khi thanh toán. Điều đó giữ công việc tiếp tục mà không làm giảm kiểm soát.
Người dùng nên có khả năng lưu tiến độ ngay cả khi một vài chi tiết thiếu. Một bản nháp có thể mở lại tốt hơn nhiều so với biểu mẫu bắt người ta làm lại từ đầu. Điều này càng quan trọng khi thông tin thiếu phụ thuộc người khác, như quản lý, nhà cung cấp hoặc nhóm tài chính.
Trạng thái rõ ràng giúp mọi người hiểu chuyện gì đang xảy ra. Giữ chúng ngắn và dễ quét: chờ thông tin, bị chặn do thiếu tài liệu, cần xem xét, sẵn sàng phê duyệt, trả lại để cập nhật.
Những nhãn này đảm nhiệm hai việc cùng lúc. Chúng cho thấy trạng thái hiện tại và nói với người dùng loại vấn đề cần chú ý.
Mỗi mục thiếu cũng cần có chủ sở hữu. Nếu thiếu mã số thuế, ai thêm nó? Nếu hóa đơn mờ, ai thay thế? Nếu ghi chú phê duyệt vắng, ai có thể cung cấp? Khi không ai chịu trách nhiệm sửa, bản ghi nằm im.
Một ví dụ đơn giản làm rõ điều này. Giả sử nhân viên gửi chi phí đi công tác mà chưa có hóa đơn vì khách sạn chưa gửi. Ứng dụng nên cho phép họ lưu và gửi yêu cầu với trạng thái như "chờ hóa đơn." Tài chính có thể xem phần còn lại, nhân viên biết cái gì thiếu, và yêu cầu không biến mất vào lỗi im lặng.
Tự động hóa hiệu quả nhất khi cùng một đầu vào gần như luôn dẫn đến cùng một kết quả. Nếu một yêu cầu theo mẫu rõ ràng, hãy tạo quy tắc. Nếu câu trả lời phụ thuộc ngữ cảnh thiếu, thời điểm bất thường hoặc phán đoán, gửi cho người xử lý.
Sự phân tách này rất quan trọng. Ứng dụng tốt nên chạy nhanh cho các trường hợp bình thường và chậm lại cho những trường hợp không rõ ràng. Một quyết định tự động sai có thể tạo nhiều việc hơn một lần xem xét thủ công ngắn.
Một bài kiểm tra đơn giản: hai thành viên khác nhau trong đội có cùng lựa chọn từ cùng dữ liệu không? Nếu có, tự động. Nếu không, giữ người trong vòng lặp.
Ứng viên tốt cho tự động là biểu mẫu hoàn chỉnh với mọi trường bắt buộc, yêu cầu phù hợp giới hạn chính sách, hành động lặp lại với thời hạn rõ, và phê duyệt luôn theo cùng một đường.
Một số tình huống không nên đoán mò: chi tiết chính thiếu, yêu cầu phá vỡ mẫu, hai quy tắc mâu thuẫn, chi phí hoặc rủi ro cao, hoặc ai đó cần giải thích ngoại lệ.
Hãy tưởng tượng một yêu cầu đi công tác không có điểm đến, ngày gấp, và chi phí vượt mức thông thường. Ứng dụng không nên cố thông minh. Nó nên đánh dấu, tạm dừng luồng và chuyển tới người đúng.
Cũng quan trọng là giữ lý do của mỗi ngoại lệ hiển thị. Hiển thị vì sao ứng dụng dừng, quy tắc nào được kích hoạt và thông tin nào thiếu. Điều đó giúp việc xem xét nhanh hơn và giúp nhóm cải thiện luồng sau này.
Nhiều dự án ứng dụng sai ngay từ trước khi ai đó viết logic. Nhóm phác con đường sạch, giả định mọi người theo nó, và bỏ qua các trường hợp lạ xảy ra hàng tuần. Đó là cách các luồng đơn giản biến thành vé hỗ trợ, sửa bằng tay và người dùng bối rối.
Sai lầm đầu tiên là thiết kế chỉ trên giả định. Nếu bạn đoán cách phê duyệt, trường thiếu hoặc ngoại lệ thường hoạt động, bạn sẽ bỏ sót những trường hợp quan trọng nhất. Một quản lý phê duyệt trễ, hồ sơ khách hàng nửa vời, hoặc khoản thanh toán cần xem xét thêm vì số tiền bất thường.
Sai lầm khác là giấu nhiều tình huống khác nhau trong một quy tắc mơ hồ. Một quy tắc như "gửi cho admin nếu có gì đó sai" nghe có vẻ linh hoạt, nhưng tạo ra vấn đề mới. Ai là admin? Cái gì được coi là sai? Nếu không ai trả lời trong hai ngày thì sao?
Nó cũng tổn hại người dùng khi ứng dụng bắt phải làm lại từ đầu. Nếu một tài liệu thiếu hoặc một người phê duyệt từ chối, người ta không nên nhập lại mọi thứ từ đầu. Một luồng tốt lưu tiến độ, gắn cờ vấn đề rõ ràng và chỉ cho phép người dùng sửa phần bị chặn.
Những vấn đề khác dễ bỏ qua vì nghe có vẻ phụ: thời điểm, sở hữu và lịch sử. Chúng không phụ. Nếu phê duyệt đến sau hạn, ứng dụng cần biết chấp nhận, leo thang hay mở lại yêu cầu. Nếu một trường bị chặn, ai đó cần chịu trách nhiệm hành động tiếp theo. Nếu trạng thái thay đổi, mọi người cần thấy ai thay đổi và vì sao.
Lịch sử kiểm toán quan trọng vì lý do đơn giản. Mọi người cần biết ai thay giá trị, ai phê duyệt ngoại lệ và khi nào trạng thái chuyển.
Trước khi biến một luồng thành quy tắc, dừng lại và kiểm tra liệu đầu vào của bạn có đúng với công việc thực không. Sơ đồ sạch thường bỏ qua các trường hợp lạ gây chậm trễ, nhầm lẫn hoặc sửa tay sau này.
Một rà soát nhanh giúp:
Một ca thử đơn giản thường đủ để lộ logic yếu. Hãy tưởng tượng một yêu cầu mua hàng nộp mà không có tên nhà cung cấp, rồi được phê duyệt muộn bởi trưởng bộ phận. Người yêu cầu có thể sửa trường thiếu không? Ứng dụng biết phải mở lại yêu cầu, tiếp tục hay chuyển cho tài chính xem xét?
Đó là mức chi tiết bạn cần trước khi tạo logic. Các câu chuyện ngắn, thực tế dẫn đến phiên bản đầu an toàn hơn và ít bất ngờ hơn khi mọi người bắt đầu dùng ứng dụng.
Bắt đầu nhỏ. Chọn một luồng, không phải cả doanh nghiệp. Rồi thu thập năm trường hợp ngoại lệ thực từ những người làm việc hàng ngày, như phê duyệt trễ, hóa đơn thiếu, quản lý nghỉ, yêu cầu trùng lặp hoặc ca cần tài chính can thiệp.
Xây phiên bản đầu quanh luồng hẹp đó và năm trường hợp ấy. Giữ quy tắc dễ đọc. Nếu yêu cầu không hoàn chỉnh, hiển thị đang thiếu gì. Nếu phê duyệt trễ, quyết khi nào nhắc, khi nào leo thang và khi nào tạm dừng. Nếu ca không khớp đường bình thường, làm rõ ai cần xem xét.
Rồi thử với những người liên quan: người gửi yêu cầu, người phê duyệt đầu tiên, người sửa ngoại lệ, quản lý nhận leo thang, và bất kỳ ai thấy kết quả cuối cùng.
Quan sát nơi họ dừng lại, đoán hoặc hỏi giúp. Những khoảnh khắc đó quan trọng hơn phần đã chạy trơn. Nếu ba người mắc kẹt ở cùng bước, quy tắc hoặc màn hình cần thay đổi.
Một ứng dụng chi phí có thể chạy ổn cho đến khi ai đó gửi hóa đơn taxi không có mã dự án hoặc sau hạn chốt hàng tháng. Phiên bản đầu của bạn không cần giải quyết mọi trường hợp hiếm. Nó cần bắt các ngoại lệ phổ biến, giải thích bước tiếp theo và để lại đường rõ cho xem xét bằng tay.
Rồi điều chỉnh quy tắc theo từng vòng nhỏ. Loại bỏ bước gây nhầm lẫn. Thêm trường chỉ khi nó ngăn lặp lại vấn đề. Thay đổi thời gian phê duyệt nếu lời nhắc quá sớm hoặc quá muộn. Sửa nhỏ sau thử nghiệm thực tế thường tốt hơn thêm logic đặc biệt phức tạp quá sớm.
Nếu bạn muốn tạo mẫu nhanh, công cụ dạng chat như Koder.ai có thể giúp biến các ví dụ thực thành ứng dụng hoạt động từng bước. Chìa khóa vẫn là: bắt đầu với các câu chuyện lộn xộn trước, rồi xây quy tắc xung quanh chúng.
The best way to understand the power of Koder is to see it for yourself.