Trình soạn thảo văn bản
- Chúng ta dùng trình soạn thảo văn bản mỗi ngày, nhưng có thực sự biết nó hoạt động như thế nào không? Hãy bắt đầu từ việc triển khai các chức năng cơ bản.
- Thách thức lớn nhất là lưu trữ tài liệu văn bản trong bộ nhớ như thế nào. Dùng mảng sẽ gây vấn đề hiệu năng, nên cần học nhiều cấu trúc dữ liệu khác nhau để giải quyết.
- Tìm hiểu cách con trỏ văn bản hoạt động; sau khi triển khai trình soạn thảo cơ bản, hãy thử thêm chức năng undo/redo và tự động xuống dòng theo từ.
Trò chơi 2D - Space Invaders
- Ngay cả một trò chơi đơn giản cũng cần những cấu trúc dữ liệu và mẫu thiết kế riêng. Thay vì tập trung vào thiết kế game hay đồ họa, hãy tập trung vào việc triển khai tổng thể trò chơi.
- Học cách vẽ màn hình, xây dựng vòng lặp game, xử lý đầu vào người dùng, tạo và quản lý đối tượng động, áp dụng logic game, v.v.
- Sau khi hoàn thành phiên bản cơ bản, có thể mở rộng bằng menu màn hình tiêu đề, màn hình game over, duy trì cùng tốc độ trên nhiều máy tính khác nhau, áp dụng AI, v.v.
Trình biên dịch - Tiny BASIC
- Triển khai trình biên dịch là một dự án đòi hỏi hiểu biết sâu về lập trình. Hãy bắt đầu viết trình biên dịch với một ngôn ngữ đơn giản như Tiny BASIC.
- Học các bước như token hóa mã (lexical analysis), parsing (kiểm tra cấu trúc và tạo cây), phân tích ngữ nghĩa, sinh mã, v.v.
- Sau khi hoàn thành trình biên dịch cơ bản, có thể mở rộng bằng cách thêm thư viện chuẩn, thêm giai đoạn tối ưu hóa, cải thiện thông báo lỗi, v.v.
Hệ điều hành mini
- Các khái niệm cơ bản của hệ điều hành có thể áp dụng cho nhiều lĩnh vực. Việc tự triển khai hệ điều hành giúp tăng hiểu biết về phần cứng.
- Dù có đường cong học tập phụ thuộc nhiều vào phần cứng, nếu làm theo sách hoặc tutorial thì vẫn có thể tạo ra một OS có thể khởi động.
Bảng tính
- Ứng dụng bảng tính kết hợp những thách thức của trình soạn thảo văn bản và trình biên dịch. Bạn sẽ học cách biểu diễn nội dung ô trong bộ nhớ và triển khai một trình thông dịch ngôn ngữ lập trình cho công thức.
Trình giả lập máy chơi game
- Viết trình giả lập là sự kết hợp những thách thức của trình biên dịch, hệ điều hành và việc viết trình biên dịch vào trong một. Chơi game thật trên trình giả lập do chính mình tạo ra là một trải nghiệm rất đáng giá.
- Giả lập một máy chơi game thực tế có nghĩa là viết một máy ảo hoạt động giống như CPU và các thành phần phần cứng khác của hệ máy đó.
Ý kiến của GN⁺
- Để xây dựng nền tảng lập trình vững chắc, việc tự làm trình soạn thảo văn bản hoặc một trò chơi đơn giản thực sự rất hữu ích để hiểu nguyên lý hoạt động bên trong của phần mềm mà ta sử dụng hằng ngày.
- Những dự án phức tạp như trình biên dịch hay hệ điều hành đòi hỏi hiểu biết sâu về ngôn ngữ lập trình và kiến trúc máy tính, và đây là yếu tố thiết yếu để phát triển kỹ năng kỹ thuật phần mềm ở mức cao.
- Những dự án này mang lại trải nghiệm thú vị và đầy thử thách cho lập trình viên khi học ngôn ngữ hoặc framework mới, hoặc khi đào sâu kiến thức sẵn có.
1 bình luận
Ý kiến trên Hacker News
Thực hiện các dự án như trình soạn thảo văn bản, trình biên dịch, hệ điều hành hay ray tracer có thể giúp cải thiện kỹ năng lập trình, nhưng không nhất thiết cải thiện năng lực kỹ thuật phần mềm. Trên thực tế, các dự án kiểu này hàm chứa nguyên tắc tai hại "Not Invented Here", nên có thể phản tác dụng đối với kỹ thuật phần mềm.
Với các dự án UI/web, có thể khuyến nghị những thứ sau:
fetchcó tồn tại, nhưng hiểu cách gửi và đọc HTTP request từ đầu sẽ hữu ích khi debug các vấn đề như CORS, OPTIONS request, v.v.)Ý kiến tích cực về một hệ điều hành mini. Với tư cách là lập trình viên ứng dụng, chúng ta dựa vào các chức năng của hệ điều hành (quản lý bộ nhớ, file system, v.v.), và tự nhiên sẽ tò mò về cách những thứ đó vận hành phía sau. Dùng xv6 để học và triển khai nhiều thuật toán lập lịch tiến trình khác nhau trong thời gian rảnh là một trải nghiệm rất bổ ích và thú vị.
Mong muốn được chạm tay vào những thứ vật lý, chẳng hạn robot, drone có autopilot, hoặc mô phỏng chính xác động lực học bay của tàu vũ trụ với các tham số GNC có thể lập trình. Có cuốn sách "Fundamentals of Astrodynamics" và muốn tận dụng nó trong kỳ nghỉ này. Muốn tìm nguồn thông tin tốt về GNC (guidance, navigation and control).
Điều này phụ thuộc vào sở thích cá nhân và hoàn cảnh, nhưng nếu đang tìm ý tưởng thì đây có thể là một danh sách khởi đầu tốt. Đã từng dùng Sinclair ZX Spectrum để làm trình biên tập khuông nhạc và tracker, game 2D (Space Invaders), v.v. Với máy tính đầu tiên (386), đã làm bộ nén Huffman, chỉ mục B-Tree, trình tạo form OOP, trình kiểm tra email cho dial-up, parser viết tay, v.v.
Thảo luận về trình soạn thảo văn bản: thách thức lớn nhất là lưu tài liệu trong bộ nhớ như thế nào. Dùng mảng là ý tưởng đầu tiên, nhưng hiệu năng rất tệ khi chèn văn bản ở vị trí không phải cuối tài liệu. Tuy vậy, khi dùng chuỗi JavaScript và sử dụng trình soạn thảo hơn 2 năm thì không gặp vấn đề hiệu năng nào. Tất nhiên vẫn có nhiều vấn đề khác, ví dụ render các đường ngang rất dài trở thành vấn đề vì cách tiếp cận tối ưu hóa đã giả định rằng việc render một dòng đơn lẻ là rẻ.
Thử một ray tracer đồ chơi đơn giản cũng là ý hay. Làm một ray tracer tạo hình cầu bằng đồ họa bitmap và xử lý phản xạ khuếch tán lẫn phản xạ gương có thể là một dự án tương đối gọn, miễn là không làm nó trở nên quá phức tạp.
Nếu bạn nghĩ rằng cần "factory pattern" để viết Space Invaders thì có vấn đề ở đó. Khó có thể tin rằng game gốc đã dùng những khái niệm thiết kế như vậy.
Ý kiến về trình soạn thảo văn bản dùng mảng làm cấu trúc dữ liệu. Khi gõ phím thì cần tốc độ cao, và chỉ một dòng bị thay đổi. Khi nhập dòng mới, độ trễ thêm cần thiết để tái cấu trúc mảng sau khi nhấn Enter là không đáng замет ngay cả với hàng triệu dòng. Phần thách thức hơn của trình soạn thảo văn bản là bảo đảm chỉ render những gì người dùng đang nhìn thấy.