WinUtils: Bộ công cụ dòng lệnh thời Windows 95 và bài học lập trình
WinUtils là dự án bắt đầu từ năm 1996, cung cấp các công cụ dòng lệnh cho Windows 95 bằng cách tận dụng Shell API để mang lại trải nghiệm giống Windows Explorer. Bài viết chia sẻ lại mã nguồn và hồi niệm về quá trình phát triển phần mềm trong kỷ nguyên "pre-AI", nơi sự vất vả chính là bài học quý giá nhất.

WinUtils bắt đầu vào năm 1996-1997 như một cách để tôi rèn luyện kỹ năng lập trình. Khi đó, tôi đang mày mò các API của Shell trong Windows 95 và phát hiện ra các hàm thao tác file. Tôi nghĩ rằng sẽ rất thú vị nếu có các công cụ dòng lệnh (CLI) gọi các hàm này thay vì thực hiện thao tác nhập/xuất (I/O) file thô.
Lợi ích thực tế mang lại là rất lớn: vì các thao tác này đi qua Shell, chúng tự động kế thừa các hộp thoại xác nhận, thanh tiến trình và hành vi của Thùng rác (Recycle Bin) giống như bạn đang sử dụng Windows Explorer.
Giao diện sao chép file của WinUtils
Điều thú vị nhất của dự án, ít nhất là đối với tôi vào thời điểm đó, là hầu như không có công việc nặng nhọc nào là của tôi. Shell đã biết cách sao chép, di chuyển, xóa và đổi tên file theo cách người dùng mong đợi. WinUtils về cơ bản chỉ là một giao diện dòng lệnh mỏng wrapping các lời gọi hàm đó:
Việc định tuyến qua SHFileOperation là điều mang lại cho các công cụ tính năng tốt nhất của chúng: Undo (Hoàn tác). Các tệp bị xóa bởi windel sẽ được đưa vào Thùng rác, và một lệnh winmove thực hiện nhầm có thể được hoàn tác từ Explorer giống như bất kỳ hành động Shell nào khác.
Giao diện xóa file của WinUtils
Mỗi tiện ích nhận các đối số nguồn/đích trước, sau đó là bất kỳ số lượng công tắc (switch) một chữ cái nào có tiền tố là /. Các công tắc này ánh xạ gần như trực tiếp đến các cờ của SHFileOperation, cộng với một vài tiện lợi cho phần trợ giúp và hộp thoại About.
windel bỏ qua /r vì không có đích để xung đột, và winren chỉ giữ lại các công tắc có ý nghĩa đối với việc đổi tên: /a, /h, /r và /u.
Giao diện di chuyển file của WinUtils
Vào thời điểm đó, việc đưa một biểu tượng tùy chỉnh vào tệp thực thi cảm giác như một thành tựu thực sự. Trong thực tế, tôi chủ yếu mượn các mảnh của các biểu tượng Windows có sẵn trong một trình chỉnh sửa biểu tượng và cắt ghép chúng lại với nhau cho đến khi mỗi tiện ích có một cái gì đó trông giống như của riêng nó. Không phải nghệ thuật gốc, nhưng nó đã mang lại cho mỗi công cụ một bản sắc riêng, và việc đặt tệp .ico cuối cùng vào EXE là lúc chương trình cảm thấy hoàn thành.
Giao diện đổi tên file của WinUtils
Công tắc /h sẽ mở winutils.hlp, và việc xây dựng tệp đó gần như là một dự án phụ riêng biệt. Windows Help vào thời đại đó không chỉ là một tệp văn bản bạn gửi đi. Bạn viết các chủ đề trong RTF, xác định một dự án trong tệp .HPJ, thiết lập tệp nội dung (.CNT), sau đó chạy Trình biên dịch Trợ giúp (HCW / HCRTF) để biến tất cả thành một tệp nhị phân .HLP duy nhất. Các tham chiếu chéo, định nghĩa bật lên và các bước nhảy được gắn thẻ bằng các mã chú thích bên trong RTF, điều này có nghĩa là hầu hết công việc diễn ra trong Word với một tập hợp các quy ước rất cụ thể.
Không có gì trong đó dễ dàng. Một chú thích sai hoặc một chuỗi ngữ cảnh không khớp sẽ âm thầm mở sai chủ đề, và đối với một bộ tiện ích nhỏ này, dự án trợ giúp là một trong những phần rắc rối nhất của toàn bộ bản phát hành.
Không có cửa hàng ứng dụng, không có GitHub Releases, không có npm publish. Phân phối có nghĩa là nén các tệp EXE và tệp trợ giúp, viết một mô tả ngắn và tải lên bất kỳ trang web shareware nào chấp nhận nó: Tucows, Download.com, WinSite, ZDNet, Simtel và một loạt các kho lưu trữ nhỏ hơn. Mỗi trang có biểu mẫu gửi riêng và tốc độ liệt kê tải lên riêng, đôi khi là vài ngày hoặc vài tuần sau đó.
Vòng lặp phản hồi là kiểm tra lại. Tôi sẽ quay số, nhấp qua từng danh sách và nhìn vào bộ đếm tải xuống. Chỉ là một con số tăng lên theo thời gian. Mỗi lần tăng là một niềm vui nhỏ nhoi: ai đó, ở đâu đó, đang thực sự chạy mã của tôi.
Gần đây, tôi thấy Coreutils cho Windows trên Hacker News và nó khiến tôi nhớ lại dự án cũ này. Tôi đã đi tìm xem mình còn giữ các tệp gốc không. Hóa ra là có, vì vậy tôi đã đẩy chúng lên GitHub và viết lại những dòng này.
Một LLM (Mô hình ngôn ngữ lớn) có thể thể hiện lại toàn bộ WinUtils trong vài phút ngày nay. Mã nguồn, các công tắc, tệp trợ giúp, biểu tượng, tất cả mọi thứ. Và điều đó là tốt. Nó hạ thấp rào cản để tạo ra một cái gì đó hoạt động.
Nhưng nỗi đau mới là điểm mấu chốt đối với tôi ngày xưa. Đọc tài liệu API Shell trên giấy, đoán các cờ, vật lộn với trình biên dịch trợ giúp, chỉnh sửa biểu tượng thủ công từng pixel một, và chờ đợi một bản dựng đầy đủ để xem có gì thay đổi không. Không có gì trong đó hiệu quả, nhưng mọi chút một đều dạy tôi điều gì đó mà tôi vẫn dựa vào cho đến ngày nay.



