Tuần trước tôi ngừng viết bot — để con bot tiếp theo chỉ cần khai báo
Tuần trước tôi quyết định một việc nghe rất ngược: tôi ngừng viết bot.
Nghe vô lý với một người sống bằng nghề build bot. Nhưng tôi vừa nhận ra mình đang làm sai cách. Mỗi lần có loại bot mới — spa, tư vấn bán hàng, rồi bot tour du lịch — tôi lại mở code lên và viết thêm. Thêm một nhánh if. Thêm một file. Thêm một chỗ "loại này thì làm kiểu này".
Đến con bot thứ ba thì tôi nhìn vào đống code và thấy một sự thật khó chịu: tôi không đang xây hệ thống. Tôi đang sao chép chính mình, mỗi lần một chút khác.
Khi bạn thấy mình gõ lại cùng một thứ
Có một khoảnh khắc rất cụ thể. Tôi đang thêm con bot tour, và tay tôi tự động đi tìm chỗ đã viết cho bot spa để copy. Cùng một khâu lắp ráp: dựng persona cho nó, gắn vài công cụ cho nó, nối vào trang quản trị để chủ shop nhập dữ liệu.
Tôi đã làm đúng động tác đó ba lần. Lần nào cũng phải sờ vào lõi — cái phần đáng lẽ không bao giờ nên biết "spa" hay "tour" là gì.
Đó là lúc tôi dừng tay. Vấn đề không phải con bot tour. Vấn đề là cái lõi của tôi biết quá nhiều thứ nó không nên biết. Mỗi lần thêm bot, tôi lại nhét thêm một mẩu kiến thức về một loại business cụ thể vào nơi đáng ra phải trung lập tuyệt đối.
Một hệ thống mà phải sửa lõi mỗi lần thêm tính năng thì không phải hệ thống. Nó là một đống gạch xếp khéo.
Tách "đường nối" thay vì viết thêm
Thứ tôi làm tuần trước không phải viết con bot thứ tư. Tôi đi tìm những chỗ mà mỗi loại bot KHÁC nhau, và biến mỗi chỗ đó thành một "đường nối" độc lập — một ranh giới rõ ràng.
Hóa ra chỉ có vài chỗ thật sự khác nhau giữa các loại bot. Bot này dùng cách trả lời nào. Nó có những công cụ gì. Tính cách nó ra sao. Trang quản trị của nó cho chủ shop nhập những trường dữ liệu gì — spa nhập "dịch vụ, thời lượng", tour nhập "combo, số ngày, điểm đến".
Tôi tách từng cái đó ra thành một bản khai báo. Thay vì lõi đi hỏi "đây là bot loại gì rồi rẽ nhánh", giờ mỗi loại bot tự khai báo mình là ai trong một bản manifest. Cái hàm trung tâm — chỗ trước đây đầy if loại này / elif loại kia — giờ sạch trơn. Nó chỉ đọc bản khai báo và lắp ráp.
Hệ quả nghe nhỏ nhưng thay đổi tất cả: thêm một loại bot mới giờ không còn là viết code. Nó là điền vào một tờ khai. Loại bot tiếp theo — bot bất động sản, bot phòng khám — tôi không mở lõi ra nữa. Tôi viết một bản khai báo: persona đây, công cụ đây, trang quản trị cần những trường này. Xong.
Tôi đổi từ "viết một con bot" sang "khai báo một con bot".
Cú đánh đổi thật: bỏ công lớn để mua tốc độ
Đây không phải bữa trưa miễn phí. Tách những đường nối đó tốn công thật — phải gỡ cái lõi đang chạy ra, phải chạy lại toàn bộ test để chắc ba con bot đang sống vẫn trả lời đúng sau khi ruột bên dưới thay đổi hoàn toàn.
Tôi bỏ ra mấy ngày mà người dùng cuối không thấy thêm gì mới. Không tính năng mới. Không doanh thu mới. Nhìn từ ngoài, mấy ngày đó là số không.
Nhưng tôi không mua tính năng. Tôi mua tốc độ cho mọi con bot tương lai. Cái giá mấy ngày này trả một lần. Còn cái lợi — bot tiếp theo chỉ cần khai báo — thu về mỗi lần có khách mới, mãi mãi về sau.
Đó là kiểu đầu tư mà người làm một mình hay né, vì nó không có phần thưởng tức thì. Nhưng nó chính là khác biệt giữa người ship được con bot thứ mười nhẹ nhàng, và người vẫn còng lưng copy-paste ở con bot thứ tư.
Vì sao tôi đợi đến tận bây giờ
Đây mới là phần quan trọng nhất, và là chỗ dễ làm sai nhất.
Tôi không làm cú tách này từ đầu. Nếu ngày đầu tiên tôi đã ngồi thiết kế "nền tảng đa loại bot", tôi đã ngồi vẽ kiến trúc thêm hai tuần trước khi viết dòng code đầu — và con bot đầu tiên có lẽ không bao giờ được ship.
Tách quá sớm là một cái bẫy khác, ngược dấu. Bạn dựng những đường nối cho các trường hợp chưa từng tồn tại. Bạn trừu tượng hóa dựa trên tưởng tượng. Và gần như chắc chắn bạn đoán sai chỗ nào sẽ khác nhau — vì bạn mới có một con bot, làm sao biết được loại thứ hai sẽ khác ở đâu.
Tôi chỉ tách khi đã có đủ bot để nhìn thấy cái lặp lại. Phải đến con bot thứ ba, cái khuôn mới hiện ra rõ ràng: à, mỗi lần thì đúng những chỗ này khác nhau, đúng những chỗ kia giống nhau. Lúc đó tách không còn là đoán mò. Nó là rút ra từ thực tế đã ba lần lặp.
Quy tắc tôi tự rút cho mình: đừng xây nền cho con bot thứ hai. Xây nền khi con bot thứ ba cho thấy con thứ tư sẽ giống hệt. Sớm hơn là vẽ vời. Muộn hơn là trả nợ bằng máu.
Bài học mang đi
Có hai cách hỏng đối xứng nhau. Một là không bao giờ xây nền — cứ copy-paste mãi đến khi đống code sập dưới sức nặng của chính nó. Hai là xây nền quá sớm — dựng cả một sân khấu hoành tráng cho vở kịch chưa ai viết.
Đường giữa không nằm ở chỗ thông minh hơn. Nó nằm ở chỗ để thực tế lên tiếng trước. Ship con bot đầu bằng kiến trúc đủ-để-chạy. Ship con thứ hai. Đến con thứ ba, khi cái khuôn đã tự lộ ra, mới dừng lại và xây nền — không phải vì sách dạy thế, mà vì chính tay bạn đã gõ lại cùng một thứ đủ nhiều lần để biết chắc nó là khuôn, không phải trùng hợp.
Người mới hay hỏi tôi "build sao cho scale". Câu trả lời thật là: lúc đầu đừng. Lúc đầu chỉ cần chạy. Khả năng scale là phần thưởng bạn được quyền mua sau khi thực tế đã chỉ cho bạn nên mua cái gì.
👉 Muốn tự tay build con bot đầu tiên — không cần nghĩ tới nền tảng, chỉ cần một thứ chạy thật để bắt đầu học từ chính nó? Bắt đầu với mini-course miễn phí: Bot AI đầu tiên của bạn — làm xong trong một buổi tối, và con bot đó sẽ tự dạy bạn khi nào thì đến lúc xây nền.