Tuy 1 số dự án đầu của tôi nhận được sự chú ý từ cộng đồng nhưng không có dự án nào có thể làm được như SwiftyStoreKit. Trước khi chia sẻ bí quyết của mình, tôi muốn chia sẻ vài điều:
- Tôi muốn code của mình có ảnh hưởng đến thế giới
- Tôi muốn code của mình tiết kiệm được thời gian của dev, giúp họ tập trung vào lập trình các ứng dụng hữu ích
- Nếu thành công, thời gian tôi bỏ ra sẽ bù đắp lại tất cả những lần fix bug, những câu hỏi thắc mắc và cả thời gian không được trả lương
Viết phần mềm nguồn mở đem lại động lực to lớn. Code của tôi có thể reach đến những người dùng cuối qua nhiều ứng dụng bằng cách hỗ trợ các dev khác làm việc năng suất hơn.
Động lực đó đáng giá bao nhiêu?
Theo Cocoapods Metrics API, SwiftyStoreKit đã có được 42302 lượt tải và được cài đặt trong 1194 ứng dụng (tính đến ngày 20/10/2016). Trong khi đó, AFNetworking (1 trong những dự án iOS hàng đầu) đã được tải về đến 21,659,973 lần và các dev đã cài đặt nó trong 413,742 ứng dụng.
Nhưng bạn làm điều này với mục đích gì?
- Làm chủ cuộc chơi của bạn
- Tự viết code và mở nguồn hoặc đóng góp vào những dự án hiện tại
- Bạn sẽ nâng cao tay nghề lập trình, có thể thực sự giúp đỡ cũng như nhận được sự giúp đỡ từ người khác
- Bổ sung vào CV, giúp bạn nổi bật hơn và nhận được nhiều công việc, nhiều khách hàng tốt hơn
Công thức của tôi
- Chọn đúng dự án
- Dự án phải dễ dùng
- Viết README hay nhất có thể
- Chia sẻ đúng nơi
- GitHub Trending
- Google Search
- Tiếp tục phát triển
Chọn đúng dự án
Trong trường hợp của tôi, tôi đang cần 1 framework in-app purchase (IAP) – 1 công cụ kiếm tiền quan trọng. Thật không may là rất khó làm việc với framework Store Kit của Apple:
- Bạn phải nghiên cứu nhiều native APIs, hầu hết được xây dựng từ thời Objective-C
- Có nhiều dạng in-app purchases khác nhau
- Vấn đề bảo mật
- Rất khó để testing dòng thanh toán (purchase flow) của bạn
Lúc này, thực sự rất cần 1 framework IAP nhỏ gọn và SwiftyStoreKit của tôi là lựa chọn phù hợp.
Dự án phải dễ dùng
Tuy đã từng thử vài thư viện IAP bên thứ 3 trong 1 số ứng dụng của mình, nhưng không có thư viện nào đơn giản như tôi mong muốn.
Tôi đã bắt đầu xây dựng SwiftyStoreKit khi Apple ra mắt Swift 3, tận dụng các tính năng closures, enumerations và xử lý lỗi của Swift để viết 1 API gọn gàng, dễ dùng.
Với SwiftyStoreKit, bạn không cần phải đăng kí 1 observer cho hoạt động thanh toán. Bạn chỉ cần gọi 1 method bất đồng bộ cho IAP và cập nhật trạng thái ứng dụng, cập nhật UI khi callback trả về.
Tôi đã vay mượn các ý tưởng và các code design từ các nguồn mở nổi tiếng và nghĩ ra ý tưởng mà tôi hài lòng.
Viết README hay nhất có thể
README của bạn sẽ là landing page cho dự án nên hãy dành nhiều thời gian cho nó.
Đầu tiên, README phải có giao diện đẹp! Nếu bạn đang xây dựng 1 UI Control, gồm gif, screenshots diễn hoạt hoặc đường link đến 1 prototype thì Swift Messages là phương án tốt.
README cũng nên sở hữu các badges để nhanh chóng thấy được trạng thái của dự án. Cụ thể, có rất nhiều dự án sử dụng shields.io.
README nên nhấn mạnh 1 số điểm sau:
- Bộ tính năng của dự án là gì và cách sử dụng dự án bằng document API
- Cách cài đặt. Lưu ý: Không chỉ hỗ trợ Cocoapods mà README còn hỗ trợ nhiều công cụ management dependency khác
- Các nền tảng được hỗ trợ
- Các ngôn ngữ được hỗ trợ, với các đường link đến branches hoặc tags phù hợp với nhiều phiên bản ngôn ngữ đa dạng
- Danh sách các vấn đề thường gặp(không bắt buộc) có thể được tổng hợp dưới dạng bản tóm lược các vấn đề gần đây (current issues) trong dự án
Ngoài ra, bạn có thể thêm phần FAQ, các tư liệu tham khảo đến từ các dự án liên quan, nguồn đọc, danh sách credits và giấy phép
Lưu ý: Nếu có nhiều yêu cầu liên quan đến việc làm rõ cách sử dụng, README sẽ không phải là lựa chọn lý tưởng. Hãy trực tiếp trả lời các câu hỏi và sau đó, cải tiến chất lượng dự án.
Ngoài ra, nên bổ sung 1 dự án mẫu để hỗ trợ các lập trình viên khác khi họ sử dụng dự án của bạn. Nếu dự án đã trở nên nổi tiếng, tab issues chắc chắn sẽ tràn ngập những câu hỏi. Sở hữu 1 README và dự án mẫu tuyệt vời sẽ giúp bạn kiểm soát số lượng các câu hỏi mở.
Chia sẻ đúng chỗ
Một vài users github duy trì danh sách các dự án nguồn mở nổi tiếng dựa trên nền tảng hoặc ngôn ngữ. Tôi vừa mới submit Pull Requests để đưa SwiftyStoreKit vào những danh sách này:
- iOS hay (https://github.com/vsouza/awesome-ios)
- Swift hay (https://github.com/matteocrippa/awesome-swift)
Tuy nhiên, đừng giới hạn bản thân trong Github:
- Tìm những websites tổng hợp các dự án nguồn mở và submit các dự án lên đó
- Đưa dự án lên các newsletters nổi tiếng trong cộng đồng ngôn ngữ hoặc cộng đồng nền tảng của bạn
- Chia sẻ trên các mạng xã hội có kết nối với các lập trình viên và các tài khoản có liên quan. Một số outlets tốt có thể tham khảo như: Product Hunt, Hacker News, Twitter, Reddit
GitHub Trending = Rất nhiều sao
Nếu có thể chen vào danh sách Github Trending, dự án của bạn ắt hẳn đang bước vào thời kì đỉnh cao!
Tôi đã rất ngạc nhiên khi điều đó xảy ra. Một đồng nghiệp đã nói với tôi rằng SwiftyStoreKit xuất hiện trên danh sách trending Swift hằng tuần. Từ đây, tôi đã nhận được đến 50 sao mỗi ngày.
Vậy làm thế nào để hiện diện trên GitHub Trending? Tham khảo tại đây: https://blog.cwrichardkim.com/how-to-get-hundreds-of-stars-on-your-github-project-345b065e20a2#.ndsxn9v7g%29
Lưu ý: Khi bạn đã có mức độ hiển thị cao, hãy chuẩn bị tinh thần vì đi kèm với nó là rất nhiều người quan tâm đến dự án.
Bonus: Google Search
Một nguồn cung cấp traffic tự nhiên khác nữa chính là Google Search.
Thực ra tôi chưa từng thực hiện research keyword nào để tăng xếp hạng SEO cho dự án của mình. Nhưng nếu có thể lên kế hoạch SEO cho dự án thì hiệu quả sẽ rất tốt.
Tăng trưởng
Một khi dự án của bạn đã nổi tiếng rồi, rất nhiều thứ thú vị sẽ xảy ra.
- Mọi người sẽ đặt rất nhiều câu hỏi
- Mọi người sẽ gửi pull requests đến dự án của bạn
Ở 1 vài thời điểm, 1 người đóng góp cá nhân (https://github.com/phimage) đã chuyển toàn bộ project của tôi sang macOS và bổ sung tính năng xác minh biên lai.
Hiện tại, tôi đang giữ 2 vai trò: lập trình viên chính và maintainer.
Để trở thành maintainer tốt, bạn cần phải có được khả năng đánh giá tốt:
- Đánh giá cẩn thận những requests tính năng, để giữ API sạch và tránh bị code bloat. Tương tự, SwiftyStoreKit của tôi cũng nhắm tới 1 framework gọn nhẹ
- Với bất kì pull requests nào muốn bổ sung thêm tính năng hữu ích, đừng ngần ngại yêu cầu những thay đổi nếu những requests đó thực sự giúp code và API sạch sẽ, thống nhất
- Bạn có thể từ chối các pull requests không nằm trong phạm vi dự án hoặc nếu dự án đã bao quát được toàn bộ phạm vi
- Luôn cư xử nhã nhặn với những người đóng góp và nếu bạn từ chối những thay đổi của họ, hãy lịch sự giải thích lý do
Những điều tôi đã học được
SwiftyStoreKit là dự án thành công lớn, giúp tôi lần đầu tiên trở thành 1 maintainer. Nó buộc tôi phải mở rộng kiến thức của mình về project domain chuyên biệt, đặc biệt là khi những người khác có những đóng góp cho project của mình.
Có 1 câu nói rất phù hợp trên cương vị quản lý như sau:
“Trên thực tế, thách thức lớn nhất đối với mở mã nguồn 1 dự án là khả năng tuân thủ kỹ năng quản lý khi làm việc với con người và những người này cần phải được quản lý đúng – đặc biệt là nếu 1 dự án đã gặt hái đủ sự nổi tiếng. Hầu hết các dự án đều chưa đủ lớn nên khả năng quản lý vẫn chưa là 1 gánh nặng” – Artsy Blog
Tôi nhận ra, có những thời điểm mình vẫn chưa thể trả lời các câu hỏi về dự án đúng lúc. Tôi hy vọng mình sẽ làm tốt hơn trong tương lai và cải tiến quy trình theo nhiều cách khác nhau:
- Tương tự như các dự án nguồn mở nổi tiếng, thêm 1 file CONTRIBUTING vạch rõ cách thức gợi mở vấn đề và pull requests
- Thêm 1 Code of Product
- Khi muốn bản thân tự tin hơn để thực hiện các thay đổi, tôi sẽ thêm unit test coverage. dù thực sự thì tôi đã làm điều này từ rất lâu rồi
- Thêm code linting
Ở thời điểm hiện tại, SwiftyStoreKit chưa quá lớn nên vẫn có thể quản lý được. Hy vọng rằng dự án này, cùng cả dự án khác sẽ tiếp tục phát triển và chào đón thêm những đóng góp từ cộng đồng.
Credits
Cách đây không lâu, tôi tìm được 1 câu chuyện khá hay của tác giả Richard Kim trên Medium: “How To Get Hundreds of Stars on Your Github Project”. Bài viết này đã mở rộng tầm mắt của tôi về những điểm nổi bật trong 1 dự án nguồn mở. Tôi đã làm theo lời khuyên của anh và cảm thấy chúng rất bổ ích. Cảm ơn anh vì insight này.
Kết luận
Viết phần mềm dự án mã nguồn mở sẽ là 1 trải nghiệm bổ ích giúp bạn trưởng thành hơn xuyên suốt các dự án. Với vai trò lập trình viên, tôi đã hỗ trợ các team ở nhiều công ty khác nhau trong 10 năm qua và sử dụng rất nhiều phần mềm nguồn mở suốt thời gian đó. Đối với tôi, viết code nguồn mở là cách để đóng góp lại cho cộng đồng nên tôi thực sự rất thích quy trình này.
Nguồn: IDE Academy via Medium