Dự án robot bắt đầu bằng vài tệp và sau sáu tháng có hàng chục gói, ba cấu hình phần cứng khác nhau, và không ai nhớ tham số nào dùng cho robot nào. Cấu trúc tốt từ đầu ngăn được điều đó.
Chia gói theo chức năng
Nguyên tắc. Mỗi gói làm một việc và có thể dùng lại độc lập.
Cấu trúc điển hình. Gói mô tả robot chứa mô hình và thông số vật lý. Gói điều khiển phần cứng nói chuyện với thiết bị. Gói nhận thức xử lý cảm biến. Gói điều hướng. Gói giao diện. Gói khởi chạy chứa cấu hình để chạy hệ thống.
Tách mô tả robot thành gói riêng. Quan trọng. Nó được dùng bởi mô phỏng, bởi hệ thống thật, bởi công cụ hiển thị. Nhúng nó vào một gói khác là gây phụ thuộc không cần thiết.
Tách gói giao tiếp với phần cứng. Đổi loại động cơ hoặc cảm biến thì chỉ sửa gói này, phần còn lại không đổi.
Gói khởi chạy riêng. Chứa cấu hình cho từng robot và từng nơi triển khai. Tách khỏi mã giúp cùng một mã chạy được nhiều cấu hình.
Tránh gói chung chung. Gói tên là tiện ích chứa mọi thứ không biết để đâu sẽ phình ra và trở thành phụ thuộc của mọi gói khác.
Quản lý cấu hình
Nguyên tắc quan trọng nhất. Mọi giá trị khác nhau giữa các robot hoặc các nơi triển khai phải nằm trong tệp cấu hình, không nằm trong mã.
Những gì thuộc cấu hình. Địa chỉ thiết bị, hệ số điều khiển, kích thước robot, vị trí cảm biến, ngưỡng, đường dẫn, tên bản đồ.
Phân lớp cấu hình. Giá trị mặc định chung, rồi cấu hình theo loại robot, rồi cấu hình theo từng robot cụ thể, rồi cấu hình theo nơi triển khai. Lớp sau ghi đè lớp trước.
Vì sao phân lớp. Đổi một giá trị cho tất cả robot thì sửa một chỗ. Đổi cho một robot thì thêm vào tệp riêng của nó.
Đưa cấu hình vào quản lý phiên bản. Trừ mật khẩu và khoá. Biết được ai đổi gì khi nào.
Ghi lại giá trị đang dùng. Khi khởi động, ghi toàn bộ cấu hình đang áp dụng vào nhật ký. Khi có sự cố, biết chính xác hệ thống chạy với tham số gì.
Kiểm tra hợp lệ. Cấu hình sai kiểu hoặc ngoài dải nên bị bắt lúc khởi động, không phải lúc chạy giữa chừng.
Quản lý phiên bản và nhánh
Mọi thứ vào kho mã. Mã, cấu hình, mô hình robot, tài liệu. Trừ tệp nhị phân lớn và dữ liệu.
Tệp lớn. Mô hình học máy, bản đồ, tệp ba chiều. Dùng cơ chế lưu trữ riêng cho tệp lớn thay vì đưa thẳng vào kho mã.
Nhánh chính luôn chạy được. Nguyên tắc cơ bản. Thay đổi lớn làm ở nhánh riêng rồi gộp vào.
Gắn thẻ phiên bản triển khai. Mỗi lần đưa lên robot thật, gắn thẻ. Khi có sự cố, biết chính xác mã nào đang chạy và quay lui được.
Ghi rõ trong thông điệp commit. Đổi gì và vì sao. Sáu tháng sau sẽ cần.
Đồng bộ phiên bản trên robot. Cách nào biết robot đang chạy phiên bản nào. Nên có lệnh hoặc giao diện báo phiên bản đang chạy.
Nhiều robot phiên bản khác nhau. Tình huống thường gặp và gây nhầm lẫn. Nên có bảng theo dõi robot nào đang ở phiên bản nào.
Kiểm thử
Kiểm thử đơn vị. Cho các hàm tính toán thuần tuý — hình học, chuyển đổi, xử lý dữ liệu. Nhanh, chạy được mọi lúc.
Kiểm thử tích hợp. Chạy vài thành phần cùng nhau với dữ liệu giả. Bắt được lỗi giao diện giữa chúng.
Kiểm thử trong mô phỏng. Chạy kịch bản đầy đủ. Chậm hơn nhưng bắt được vấn đề mức hệ thống.
Kiểm thử trên phần cứng. Không tự động hoá được hoàn toàn, nhưng nên có danh sách kiểm tra chuẩn chạy trước mỗi lần triển khai.
Kiểm thử hồi quy bằng dữ liệu ghi. Phát lại các phiên đã lưu qua mã mới, so kết quả với kết quả cũ. Cách hiệu quả nhất để đảm bảo không phá vỡ thứ đang chạy.
Chạy tự động. Mỗi lần đẩy mã lên, hệ thống tự dựng và chạy kiểm thử. Bắt lỗi sớm và rẻ.
Thực tế về mức độ. Dự án robot nhỏ không cần phủ kiểm thử đầy đủ. Nhưng ít nhất phải có kiểm thử cho phần tính toán dễ sai và kiểm thử hồi quy bằng dữ liệu thật.
Chuẩn bị cho việc bàn giao
Phần quyết định dự án sống được sau khi người viết rời đi.
Hướng dẫn dựng từ đầu. Từ máy trắng tới chạy được. Kiểm bằng cách nhờ người khác làm theo.
Tài liệu kiến trúc. Sơ đồ các thành phần và cách chúng nói chuyện. Một trang là đủ và nó tiết kiệm nhiều ngày cho người mới.
Ghi lại quyết định. Vì sao chọn cách này thay vì cách kia. Đây là thứ mất đi nhanh nhất và khó khôi phục nhất.
Danh sách vấn đề đã biết. Cái gì chưa hoàn thiện, chỗ nào có giải pháp tạm, cái gì hay hỏng.
Quy trình vận hành. Khởi động thế nào, dừng thế nào, cập nhật thế nào, xử lý sự cố thường gặp thế nào.
Thông tin liên hệ và tài khoản. Kho mã ở đâu, ai có quyền, nhà cung cấp nào liên hệ thế nào.
Và viết dần, đừng để cuối. Tài liệu viết vào tuần cuối trước khi rời dự án luôn thiếu và luôn sai. Viết ngay khi làm là cách duy nhất để nó đúng.
Câu hỏi thường gặp
Nguyên tắc quan trọng nhất trong quản lý cấu hình?
Mọi giá trị khác nhau giữa các robot hoặc các nơi triển khai phải nằm trong tệp cấu hình, không nằm trong mã. Và nên phân lớp để lớp sau ghi đè lớp trước.
Vì sao nên tách mô tả robot thành gói riêng?
Vì nó được dùng bởi mô phỏng, bởi hệ thống thật và bởi công cụ hiển thị. Nhúng vào một gói khác gây phụ thuộc không cần thiết.
Cách kiểm thử hiệu quả nhất cho dự án robot?
Kiểm thử hồi quy bằng dữ liệu đã ghi — phát lại các phiên đã lưu qua mã mới và so kết quả, để đảm bảo không phá vỡ thứ đang chạy.
Thứ gì mất đi nhanh nhất khi người viết rời dự án?
Lý do đằng sau các quyết định — vì sao chọn cách này thay vì cách kia. Cần ghi lại ngay khi làm, vì tài liệu viết vào tuần cuối luôn thiếu và sai.
Đọc thêm trong Bảo trì & phụ tùng và Thiết kế cơ khí.