Giới thiệu
Trong bài thực hành này, chúng ta sẽ tìm hiểu về quy trình đóng góp một tính năng mới cho kho mã nguồn của một bạn học cùng lớp. Việc này không chỉ giúp chúng ta nâng cao kỹ năng lập trình mà còn cải thiện khả năng làm việc nhóm và hiểu biết về mã nguồn mở. Bài viết sẽ khám phá chi tiết từng bước mà tôi đã thực hiện khi đóng góp tính năng "Lọc thay đổi gần đây" cho kho lưu trữ của một bạn học khác.
Tóm tắt dự án
Kho lưu trữ mà tôi lựa chọn để làm việc là của một sinh viên khác trong lớp, người cũng đang sử dụng C++. Dự án này có tên là "Recent Changes Filter" và mục tiêu là giúp người dùng chỉ xem các tệp đã được sửa đổi trong 7 ngày qua, thay vì phải xử lý toàn bộ kho lưu trữ. Tôi đã mở một vấn đề trên GitHub để mô tả tính năng này trước khi bắt tay vào thực hiện.
Các thay đổi tôi đã thực hiện
Tôi đã thực hiện các thay đổi sau:
- Thêm hỗ trợ cho cờ dòng lệnh
--recenthoặc-r: Cờ này cho phép người dùng chỉ định muốn lọc các tệp gần đây. - Triển khai hàm trợ giúp
isRecentlyModified(): Hàm này được định nghĩa trongutils.cpp/utils.hppvà có nhiệm vụ kiểm tra thời gian sửa đổi của tệp thông quastd::filesystem::last_write_time. - Cập nhật logic duyệt tệp trong
fs_travel.cpp: Tôi đã thay đổi logic này để gọi hàmisRecentlyModified()mỗi khi cờ--recentđược kích hoạt. - Cập nhật đầu ra: Khi cờ được sử dụng, một phần "Recent Changes" sẽ được thêm vào văn bản được tạo ra.
Quy trình thực hiện pull request
Sau khi hoàn thành các thay đổi, tôi đã tạo một pull request. Đây là một bước quan trọng trong quy trình phát triển mã nguồn mở, giúp kết nối công việc của tôi với kho lưu trữ chính.
Thách thức đã gặp phải
Một trong những thách thức lớn nhất đối với tôi là thiết lập kho lưu trữ mà tôi đã fork. Người mà tôi làm việc cùng đã sử dụng libgit2, một thư viện rất ấn tượng nhưng cũng yêu cầu tôi phải cài đặt thêm một số phụ thuộc. Tôi chưa từng làm việc với libgit2 trước đây, vì vậy tôi đã phải mất một thời gian để tìm hiểu cách thiết lập môi trường làm việc của mình. May mắn thay, chủ sở hữu kho lưu trữ đã rất nhiệt tình hướng dẫn tôi qua từng bước và giải thích cách mà anh ấy đã cấu hình môi trường của mình.
Khó khăn kỹ thuật
Về mặt kỹ thuật, việc tìm hiểu cách kiểm tra thời gian sửa đổi của tệp trong C++ đã tốn khá nhiều thời gian nghiên cứu. Hàm std::filesystem::last_write_time() trả về một time point, nhưng bạn cần phải chuyển đổi nó thành một thứ có thể so sánh với đồng hồ hệ thống hiện tại. Điều này không đơn giản như trong các ngôn ngữ cấp cao khác, nơi bạn chỉ cần gọi một hàm như fs.stat().mtime. Tôi đã phải xử lý cẩn thận việc chuyển đổi và đảm bảo rằng sự khác biệt về thời gian được tính bằng ngày.
Những gì tôi đã học được
Tôi chưa bao giờ thực hiện một pull request trước đây, vì vậy tôi rất vui khi có cơ hội học hỏi quy trình này. Tôi đã có kinh nghiệm thực tế trong việc fork kho, tạo một nhánh mới cho tính năng của mình và thực hiện những commit nhỏ, rõ ràng mô tả từng bước công việc của mình. Tôi cũng đã học được cách tham chiếu một vấn đề trong pull request để GitHub tự động liên kết chúng, điều này rất tiện lợi cho việc theo dõi dự án.
Những gì tôi sẽ làm khác đi lần tới
Tôi nghĩ rằng điều này áp dụng cho cả bài Lab 2 và phiên bản 0.1: Tôi có thể sẽ không chọn C++ cho các bài thực hành trong tương lai. Ngôn ngữ này đòi hỏi bạn phải xây dựng quá nhiều thứ từ đầu mà các ngôn ngữ khác đã có sẵn thư viện. Ví dụ, bạn tôi đã sử dụng JavaScript và mô-đun gitInfo của cô ấy chỉ là một hàm gọi một thư viện. Trong khi đó, tôi phải nghiên cứu cách triển khai nó và tạo ra một mô-đun hoàn chỉnh xung quanh nó.
Thực hành tốt nhất
- Tài liệu hóa mã nguồn: Hãy chắc chắn rằng bạn luôn ghi chú và giải thích rõ ràng mã nguồn của mình. Điều này không chỉ giúp bạn mà còn giúp những người khác hiểu rõ hơn về công việc của bạn.
- Kiểm tra kỹ lưỡng: Trước khi gửi pull request, hãy chắc chắn rằng mã của bạn hoạt động như mong đợi và không gây ra lỗi.
- Giao tiếp với cộng đồng: Hãy luôn tương tác với các thành viên trong cộng đồng, từ việc đặt câu hỏi cho đến việc giúp đỡ người khác.
Các lỗi thường gặp
- Không kiểm tra mã trước khi gửi: Đây là một lỗi nghiêm trọng có thể dẫn đến việc bạn phải sửa chữa rất nhiều sau này.
- Thiếu tài liệu: Mã không có tài liệu sẽ khó khăn hơn cho người khác trong việc hiểu và sử dụng.
Mẹo tối ưu hiệu suất
- Sử dụng
std::filesystemhiệu quả: Thao tác trên tệp có thể tiêu tốn nhiều tài nguyên, vì vậy hãy tối ưu hóa cách bạn truy cập và xử lý chúng. - Kiểm tra thời gian một cách thông minh: Thay vì kiểm tra thời gian cho từng tệp, hãy nhóm chúng lại và thực hiện các phép toán một lần để tiết kiệm thời gian.
Kết luận
Việc đóng góp tính năng cho một kho mã nguồn mở không chỉ là một trải nghiệm học tập quý giá mà còn là cơ hội để chúng ta làm việc cùng nhau trong một môi trường tích cực. Tôi hy vọng rằng những chia sẻ trong bài viết này sẽ giúp ích cho bạn trong hành trình học tập và phát triển kỹ năng lập trình của mình. Nếu bạn có bất kỳ câu hỏi nào hoặc muốn thảo luận thêm về quy trình đóng góp mã nguồn mở, hãy để lại ý kiến của bạn dưới bài viết này!
FAQs
Làm thế nào để bắt đầu với mã nguồn mở?
Bạn có thể bắt đầu bằng cách tìm kiếm các kho lưu trữ trên GitHub mà bạn quan tâm và tham gia vào các vấn đề mở.
Tôi cần kỹ năng gì để đóng góp cho mã nguồn mở?
Kỹ năng lập trình cơ bản, khả năng đọc hiểu mã nguồn và kỹ năng giao tiếp là rất quan trọng.
Có cần phải có kiến thức chuyên sâu về C++ không?
Không nhất thiết, nhưng việc hiểu rõ các khái niệm cơ bản sẽ giúp bạn rất nhiều trong quá trình phát triển.