0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Khi Dự Án Đơn Giản Biến Thành Cơn Ác Mộng Gỡ Lỗi

Đăng vào 1 tuần trước

• 6 phút đọc

Khi Dự Án Đơn Giản Biến Thành Cơn Ác Mộng Gỡ Lỗi

Xin chào, hôm nay tôi muốn chia sẻ với bạn về một trải nghiệm thú vị trong quá trình hoàn thành dự án đại học của mình - một từ điển đơn giản. 🎉

Giới thiệu

Ban đầu, dự án này không gặp nhiều khó khăn: tạo một menu, cho phép người dùng chọn các tùy chọn, nhập từ để dịch, gửi đến một API, nhận kết quả và xuất ra. Nghe có vẻ dễ dàng, đúng không? Tuy nhiên, khi tôi quyết định thêm các tùy chọn "lưu" và "lịch sử", giao diện dòng lệnh trở nên khá nhàm chán.

Khó khăn và ý tưởng mới

Tôi muốn có hình ảnh! Tôi muốn có hoạt ảnh dễ thương! Và đó là lý do tôi phát hiện ra ncurses. Cách tiếp cận này đã biến một chương trình thú vị - vừa phải thành một chương trình cực kỳ khó khăn mà tôi phải gỡ lỗi trong nhiều ngày.


Quy trình của tôi

1. Tìm kiếm từ điển

Tôi cần tìm một từ điển để dịch từ. Tôi có hai lựa chọn: ngoại tuyến và trực tuyến. Tôi muốn có kinh nghiệm với API trực tuyến, vì vậy tôi đã chọn phiên bản trực tuyến.

Khi tìm kiếm, tôi đã gặp một số vấn đề:

  • Các công cụ dịch trực tuyến (Google/Baidu) thường phải trả phí và nhiều trang web phương Tây không hoạt động tốt ở Trung Quốc. Dự án này được thực hiện cho các giáo sư của tôi, vì vậy tôi muốn họ có thể chạy mà không gặp vấn đề gì.
  • DeepSeek không có API công khai.

Cuối cùng, tôi tình cờ tìm thấy một API dịch AI của Trung Quốc: Youdao AI Translate (cảnh báo: hoàn toàn bằng tiếng Trung).

Tốt quá! Tôi vẫn có thể thực hiện dự án. Bước tiếp theo: viết code.


2. Lập trình nền tảng

Ý tưởng gốc khá đơn giản. Tôi nghĩ rằng tôi đã hoàn thành trong khoảng 3-4 ngày:

  • Menu: dịch với 2 chế độ: CN→ENEN→CN; lịch sử; từ đã lưu; thoát.
  • Cấu trúc dữ liệu: lưu trữ từ tiếng Anh, từ tiếng Trung, và isFavorite.
    • Ban đầu, tôi muốn thêm phiên âm/pinyin, nhưng điều đó đòi hỏi nhiều yêu cầu hơn… vì vậy tôi đã quyết định làm những điều cơ bản trước, có thể sau này sẽ thêm vào.
    • Sử dụng danh sách liên kết cho từ đã lưu/lịch sử.
  • Tạo yêu cầu API: thử thách nhưng tôi thích nó:
    • curl
    • uuid
    • openssl
    • cJSON (hoàn toàn khác với JavaScript).

Thực ra, tôi không muốn sử dụng curl ngay từ đầu: tôi đã thử gửi yêu cầu bằng cách sử dụng proxy… nhưng điều đó thêm quá nhiều độ phức tạp. Vào thời điểm đó, tôi chưa hiểu rõ loại chương trình này sẽ là gì, vì vậy tôi đã chọn curl. Proxy có thể đợi lần sau.

Ứng dụng đã sẵn sàng và hoạt động tốt.


3. Bước vào ncurses

Và đây là lúc mọi thứ bắt đầu trở nên khó khăn. Chương trình thú vị của tôi trở thành chương trình tôi ghét nhất – phải viết lại toàn bộ cấu trúc 2-3 lần.

Điều gì đã xảy ra?

  • Tôi muốn thêm nhân vật hoạt hình. Lưu trữ trong danh sách liên kết đôi.
  • Lặp qua danh sách đôi bằng con trỏ - thêm một lớp nữa cho tôi.
  • Vấn đề kết nối: Tôi sử dụng VPN ở Trung Quốc. Đôi khi nó gặp phải lỗi bất ngờ.
  • Hệ điều hành: ban đầu là chương trình Linux. Trên Windows (cám ơn WSL 🙏), vẫn có những hành vi bất ngờ thỉnh thoảng.
  • Phông chữ tiếng Trung: Unicode, không phải ASCII. Terminal ban đầu không hỗ trợ Unicode. Sau nhiều giờ, đôi khi tôi thấy ký tự; hôm sau, lại là rác.
  • Tổ chức lại cấu trúc thư mục: ban đầu ncurses trong một tệp, logic trong một tệp khác. Và đây là lúc mã spaghetti bắt đầu xuất hiện.
  • Cửa sổ ncurses: mỗi cửa sổ có tọa độ. Tôi phải theo dõi x, y một cách cẩn thận. Cảm ơn các lớp đại số tuyến tính!
  • Cơn ác mộng buffer: scanf để lại \n, cửa sổ ncurses cũng có buffer. Tôi phải xóa chúng mỗi lần.

Tất nhiên, tôi đã sử dụng ChatGPT để được giúp đỡ. Chỉ là hướng dẫn. Không phải sao chép hoàn toàn... Đôi khi:

  1. Tôi không hiểu một lỗi →
  2. Hỏi ChatGPT →
  3. Đọc giải thích cẩn thận →
  4. Thử mã/sao chép →
  5. Không hoạt động → lặp lại 5+ lần.

Cuối cùng, tôi không thể hiểu gì cả, vì vậy tôi đã viết lại mọi thứ trong một tệp mới. Thật khó chịu, nhưng hoàn toàn xứng đáng.


4. Suy nghĩ cuối cùng

Tôi đã hoàn thành dòng cuối cùng, chạy nó và nghĩ: TỐT RỒI, TÔI ĐÃ HOÀN THÀNH!
Sau đó, thời gian gỡ lỗi bắt đầu… Makefile đã giúp rất nhiều, nhưng hãy tưởng tượng tất cả các lỗi mà nó hiển thị: vấn đề malloc, thiếu header, thứ tự hàm sai. 😅


Tóm tắt

Mặc dù khó khăn hơn tôi dự đoán, tôi thực sự thích dự án này (dù vẫn còn lỗi). Tôi đã học được rất nhiều:

  • Sockets, SSL/TLS, OpenSSL, UUID: xử lý yêu cầu internet trong C và hiểu sự khác biệt giữa Windows và Linux. Cảm ơn Ed Harmoush (@PracticalNetworking) và Jacob Sorber (@JacobSorber)! Tôi đã học tất cả các chủ đề trên từ các video YouTube của họ, rất hữu ích cho dự án của tôi 😄
  • cJSON: phân tích cú pháp JSON trong C.
  • Xử lý lỗi – vấn đề malloc/con trỏ, buffer đầu vào, buffer ncurses (thật khó khăn).
  • ncurses – UI terminal và hoạt ảnh.
  • Danh sách liên kết, cấu trúc dữ liệu, buffer: hiểu biết sâu sắc hơn.
  • Makefile: lần đầu tiên học cách biên dịch tự động.
  • README: viết một trang GitHub sạch sẽ, sẵn sàng cho portfolio.

Dự án này đã dạy tôi sự kiên nhẫn, kỹ năng gỡ lỗi, và cách mang một chương trình dòng lệnh đến với cuộc sống. Và điều quan trọng nhất - tôi vẫn yêu nó ❤️

Nếu bạn đã đọc đến dòng này - wow, cảm ơn bạn đã dành thời gian! Tôi thật sự trân trọng điều đó 😅

Các thực tiễn tốt nhất

  • Luôn có kế hoạch rõ ràng trước khi bắt đầu lập trình.
  • Lập trình từng phần, kiểm tra từng phần để tránh lỗi lớn.
  • Sử dụng các công cụ gỡ lỗi hiệu quả như gdb hoặc Valgrind.

Những cạm bẫy thường gặp

  • Quá tải thông tin và thiếu tổ chức trong mã.
  • Không dành đủ thời gian cho bước gỡ lỗi.

Mẹo hiệu suất

  • Tối ưu hóa các yêu cầu API để giảm thiểu thời gian phản hồi.
  • Sử dụng caching để giảm tải cho server.

Giải quyết sự cố

  • Đối với lỗi kết nối, hãy kiểm tra cài đặt VPN và firewall của bạn.
  • Nếu gặp vấn đề với ncurses, hãy đảm bảo rằng terminal của bạn hỗ trợ Unicode.

Câu hỏi thường gặp

Dự án này sử dụng ngôn ngữ lập trình gì?

Ngôn ngữ lập trình sử dụng là C.

Tôi có thể sử dụng dự án này cho mục đích thương mại không?

Có, nhưng hãy chắc chắn rằng bạn tuân thủ các quy định và luật lệ liên quan đến bản quyền.

Có tài liệu nào để học thêm về ncurses không?

Có, bạn có thể tham khảo tài liệu chính thức của ncurses hoặc các khóa học trực tuyến.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào