Việc xây dựng phần mềm có thể mang lại cảm giác như một buổi trình diễn trước công chúng. Internet luôn ưu ái những màn ra mắt, những ảnh chụp màn hình và những gạch đầu dòng trong nhật ký thay đổi (changelog). Vì vậy, khi một lập trình viên dành cả một buổi làm việc cho một dự án mà không có gì hiển hiện để trình diễn, bản năng sẽ khiến họ coi ngày hôm đó là lãng phí. Nhật ký phát triển (dev log) mới nhất từ Nền tảng Blog Ẩm thực đã chứng minh điều ngược lại. Không có công thức nấu ăn mới nào được hiển thị, không có thẻ (card) nào được thiết kế lại, cũng không có thêm nút bấm nào cho người dùng nhấn vào. Chỉ có những dòng mã được mổ xẻ, xem xét và lắp ráp lại tốt hơn trước.
Đây chính là công việc vô hình giúp các dự án dài hạn duy trì sự sống.
Tính năng mang lại hào quang; Tái cấu trúc giúp duy trì sự vận hành
Khi bạn duy trì một nền tảng blog ẩm thực, bề ngoài trông có vẻ đơn giản. Người dùng đăng công thức, tải ảnh lên và duyệt theo danh mục. Tuy nhiên, bên dưới, bạn đang phải xoay xở với các quy trình xử lý hình ảnh (image pipelines), các mối quan hệ trong cơ sở dữ liệu giữa nguyên liệu và hướng dẫn, các chỉ mục tìm kiếm (search indexes) và các lớp bộ nhớ đệm (caching layers). Theo thời gian, các bản sửa lỗi tạm thời tích tụ lại. Một hàm bổ trợ (helper function) được sao chép vào ba tệp khác nhau. Một truy vấn cơ sở dữ liệu vốn hợp lý khi chỉ có mười bài viết nhưng lại chạy chậm rì khi đạt đến con số một nghìn. CSS vốn được tổ chức ngăn nắp cho đến khi năm bản vá khẩn cấp biến nó thành một mê cung.
Tái cấu trúc (Refactoring) có nghĩa là đối mặt trực diện với sự lộn xộn đó. Nó có thể là việc hợp nhất các logic trùng lặp để biểu mẫu chỉnh sửa công thức và bảng điều khiển quản trị cùng sử dụng một lớp xác thực (validation layer) thay vì duy trì các phiên bản song song. Nó có thể là việc đơn giản hóa cách xử lý hình ảnh để quy trình nén chỉ chạy một lần thay vì mỗi khi trang được tải lại. Hoặc nó có thể bao gồm việc tái cấu trúc mã nguồn để việc thêm một loại nội dung mới sau này không đòi hỏi phải tìm kiếm qua sáu thư mục không liên quan.
Không có điều nào trong số này hiển thị trên giao diện người dùng. Một khách truy cập vào trang web sẽ không thấy biểu ngữ nào ghi "đã tối ưu hóa truy vấn" hay "đã tách rời các thành phần (component decoupled)". Nhưng họ sẽ cảm nhận được khi trang web tải nhanh hơn. Họ sẽ nhận ra khi một tính năng mới xuất hiện sau ba ngày kể từ khi được yêu cầu thay vì ba tuần. Lập trình viên không thêm các khả năng mới vào ngày hôm nay. Họ chỉ đang dọn đường để các khả năng đó có thể được thêm vào mà không phải vật lộn với mã nguồn.
Mã sạch là khoản đầu tư chống lại những thất bại trong tương lai
Mọi dự án kéo dài hơn một tháng đều tích tụ những trở ngại. Bạn xây dựng một bản mẫu (prototype) nhanh chóng để thử nghiệm một ý tưởng. Sau đó, người dùng thực sự xuất hiện. Rồi bạn cần một lớp xác thực, sau đó là một hàng đợi kiểm duyệt, và rồi là một bố cục cho thiết bị di động. Mỗi sự bổ sung đó đều được gắn thêm vào bất kỳ cấu trúc nào đã tồn tại. Nếu không có sự bảo trì thường xuyên, kiến trúc sẽ bắt đầu giống như một ngôi nhà mà mỗi phòng mới được thiết kế bởi một người khác nhau, những người chưa bao giờ nhìn thấy sơ đồ mặt bằng tổng thể.
Nợ kỹ thuật (Technical debt) không phải là sự thất bại về kỷ luật. Nó là một sản phẩm phụ tự nhiên của việc thực hiện các sự đánh đổi để ra mắt một sản phẩm thực tế. Nguy hiểm không nằm ở chỗ mã của bạn không hoàn hảo. Nguy hiểm nằm ở việc để nó không hoàn hảo trong quá trình quá lâu, đến mức việc thay đổi một biến số có thể làm hỏng ba tính năng không liên quan. Bạn thấy mình sợ chạm vào thanh tìm kiếm vì lần trước khi thử, hệ thống thẻ (tag system) đã bị hỏng. Bạn trì hoãn việc thêm tiện ích lập kế hoạch bữa ăn vì biết rằng lược đồ cơ sở dữ liệu (database schema) đã trở thành một mớ bòng bong mà phải mất hàng giờ mới gỡ ra được.
Dành một ngày để tái cấu trúc giống như việc trả bớt khoản nợ đó trước khi lãi suất vượt quá khả năng kiểm soát của bạn. Nó ngăn chặn các vấn đề nhỏ biến thành những vấn đề lớn. Khi Nền tảng Blog Ẩm thực cuối cùng cũng thêm tính năng lớn tiếp theo, lập trình viên sẽ không phải nhảy múa xung quanh những dòng mã mong manh. Họ sẽ viết logic mới, cắm nó vào một giao diện sạch sẽ và tiếp tục công việc. Đó chính là tỷ suất hoàn vốn (ROI).
Những bước đi nhỏ, sự học hỏi thực thụ
Có một quan niệm sai lầm xung quanh việc phát triển phần mềm rằng tiến độ phải trông giống như những đột phá thiên tài và những phiên lập trình marathon viết lại mọi thứ chỉ sau một đêm. Hầu hết các lập trình viên đang làm việc sẽ nói với bạn rằng đó là một ảo tưởng. Tiến độ thực sự trông giống như một bản diff vào một chiều thứ Ba, nơi ba hàm trở nên ngắn hơn, một phụ thuộc (dependency) dư thừa được loại bỏ, và một tên biến gây khó hiểu được thay đổi để người đọc tiếp theo thực sự hiểu nó làm gì.
Nhật ký phát triển của Nền tảng Blog Ẩm thực đã ghi lại nhịp điệu này một cách hoàn hảo. Xây dựng phần mềm là về những cải tiến nhỏ và nhất quán. Bạn học hỏi từ mọi thử thách. Có thể hôm nay thử thách là hiểu tại sao một module cụ thể lại phụ thuộc quá nhiều vào một module khác. Có thể là nhận ra rằng một lối tắt được thực hiện hai tuần trước đã bắt đầu tiêu tốn nhiều thời gian hơn cả thời gian nó tiết kiệm được. Mỗi lần commit đều giúp dự án tốt hơn, ngay cả khi lần commit đó xóa bỏ nhiều hơn là tạo ra.
Cách tiếp cận này cũng giúp duy trì động lực của bạn. Việc viết lại mã nguồn quy mô lớn rất tốn sức và đầy rủi ro. Chúng tạo ra những lỗi mới trong khi đang giải quyết các lỗi cũ. Tái cấu trúc từng bước, đã hoàn tất
