อยากจะ Contribute ให้กับ Open Source Library บน GitHub ต้องทำยังไงบ้างนะ?

สำหรับคนที่ใช้ Open Source Library ที่อยู่บน GitHub แล้วอยากจะช่วยแก้บั๊กหรือเพิ่มฟีเจอร์เข้าไป แต่ไม่รู้ว่าต้องทำยังไงบ้าง

ผมก็เป็นคนหนึ่งที่ใช้ Library เวลาเขียนโค้ดอยู่บ่อย ๆ เพื่อลดโค้ดที่ไม่จำเป็นต้องเขียนเอง และ Library ที่ผมใช้ก็จะเป็น Open Source Library และอยู่บน GitHub เกือบทั้งหมด

และทุกคนก็น่าจะมีโมเมนต์ที่คล้ายกับผมอยู่เหมือนกัน นั่นก็คืออยากจะแก้บั๊กหรือเพิ่มฟีเจอร์เข้าไปใน Library ตัวนั้น ๆ แต่ไม่รู้ว่าจะทำยังไงดี สุดท้ายก็เลย Fork เป็น Repository ของตัวเองเพื่อทำทุกอย่างไว้ในนั้น แล้วก็จบด้วยการเปลี่ยนให้โปรเจคของเราไปเรียก Library จาก Repository ของเราแทน

ตราบใดที่ไม่ขัดกับ License ของ Library และ Library Owner ไม่ได้พัฒนาต่อแล้ว การใช้วิธีแบบนี้ก็ไม่ใช่เรื่องผิดอะไร

แต่สำหรับ Library ที่มี Contributor คอยดูแลอยู่ตลอดเวลา การสร้าง Pull Request เพื่อส่งโค้ดของเราเข้าไปใน Repository ของ Library นั้น ๆ ก็เป็นทางเลือกที่ดีกว่า เมื่อเทียบกับการ Fork ออกมาแล้วเราต้องดูแลโค้ดเหล่านั้นด้วยตัวเองทั้งหมด

เพราะโค้ดที่เขียนขึ้นมาเพื่อใช้แค่เพียงคนเดียว ยังไงก็ไม่คุ้มค่าเท่ากับโค้ดนั้นถูกเขียนเพื่อให้ทุกคนได้นำไปใช้งาน

แล้วต้องทำยังไงบ้าง?

จริง ๆ แล้วการ Contribute ให้กับ Open Source Library ก็จะมีรูปแบบคล้าย ๆ กับการทำงานของทีมพัฒนาซอฟต์แวร์ขนาดใหญ่​ ที่แต่ละคนไม่สามารถเข้าไปยุ่งกับโค้ดที่อยู่ใน Original Repository ได้โดยตรง แต่จะใช้วิธีสร้าง Pull Request เพื่อส่งโค้ดของแต่ละโค้ดเข้าไปแทน

ดังนั้นสำหรับ Open Source Library ก็จะมีขั้นตอนที่คล้าย ๆ กัน

  • อ่านรายละเอียดของ Code of Conduct (ถ้ามี)
  • อ่านรายละเอียดในการ Contributing (ถ้ามี)
  • Fork Repository และ Clone
  • สร้าง Feature Branch
  • เขียนโค้ดจนกว่าจะเสร็จ
  • สร้าง Pull Request
  • รอ Code Review จาก Library Owner
  • รอจนกว่า Library จะปล่อยเวอร์ชันใหม่

อ่านรายละเอียดของ Code of Conduct (ถ้ามี)

สำหรับ Library ที่มี Contributor หลายคน ก็เหมือนทีมพัฒนาซอฟต์แวร์จากทั่วโลกที่ทำงานร่วมกัน ดังนั้นในบาง Library จึงมี Code of Conduct ให้กับนักพัฒนาที่จะเข้ามาเป็น Contributor เพื่อเป็นแนวทางในการทำงานร่วมกัน

ตัวอย่าง Code of Conduct ของ WordPress for Android

โดย Code of Conduct ของ Repository บน GitHub จะอยู่ในไฟล์ที่ชื่อว่า CODE_OF_CONDUCT.md

อ่านรายละเอียดในการ Contribute (ถ้ามี)

ใน Library ที่มีขนาดเล็ก ก็อาจจะไม่ได้มี Development Process ใด ๆ มากำหนดไว้ แต่สำหรับ Library ขนาดใหญ่จะมีการกำหนด Development Process ไว้อยู่เสมอ เพื่อให้คนที่จะเข้ามาช่วย Contribute สามารถทำตามขั้นตอนได้อย่างถูกต้อง จึงต้องมีการเขียนรายละเอียดเหล่านั้นไว้ในหัวข้อที่เรียกกันว่า “Contributing”

ตัวอย่าง Contributing ของ Google Auth Library for Python

โดย Contributing ของ Repository ใน GitHub จะอยู่ในไฟล์ที่ชื่อว่า CONTRIBUTING.md

Fork Repository และ Clone

บน GitHub สามารถ Fork Repository ได้ง่าย ๆ ด้วยการเปิด Repository ของ Library ที่ต้องการ Contribute แล้วกดปุ่ม “Fork” ที่อยู่ขวาบนได้เลย

กดที่คำว่า “Fork” นะ ไม่ใช่ตัวเลขที่อยู่ต่อท้าย

จากนั้นก็เลือกว่าจะให้สร้างเป็น Repository บน Personal Account หรือ Organization แล้วรอซักครู่ ก็เป็นอันเสร็จเรียบร้อย

จากนั้นก็ Clone ลงในเครื่องของเราให้เรียบร้อยซะ

git clone <remote>/<repository>

สร้าง Feature Branch

เพราะในการ Contribute จะไม่ได้แก้ไขโค้ดที่อยู่ใน Primary Branch อย่าง main, master หรือ develop โดยตรง แต่จะสร้าง Feature Branch ขึ้นมาตามรูปแบบของ Git Flow แทน

git checkout -b feature/<branch_name>

เขียนโค้ดจนกว่าจะเสร็จ

ในระหว่างนี้ก็ให้เขียนโค้ดใน Library ตามที่เราต้องการและทดสอบให้เรียบร้อย และแน่นอนว่าตอนที่สร้าง Commit แต่ละตัวก็ไม่ควรสร้าง Commit ขึ้นมาแบบสะเปะสะปะ เพราะว่าใน Library บางตัวซีเรียสเรื่องการสร้าง Commit และการใส่ Commit Message มาก ๆ ดังนั้นอย่าลืมทำตามที่เค้าบอกไว้ใน Contributing ด้วยล่ะ

สร้าง Pull Request

หลังจากที่เขียนโค้ดและ Push Commit ทั้งหมดใน Feature Branch ขึ้น Repository ของเราเสร็จเรียบร้อย ก็ให้เปิด Forked Repository ของเราบน GitHub ขึ้นมาเพื่อสร้าง Pull Request ได้เลย

โดยบน GitHub จะแสดงหน้าต่างที่มีปุ่ม “Compare & pull request” ให้ทันทีเมื่อมีการ Push Commit ขึ้น Forked Repository เพื่อให้เรากดปุ่มแล้วสร้าง Pull Request จาก Branch นั้น ๆ ได้เลย

หรือถ้าไม่ขึ้นหน้าต่างดังกล่าว ก็สามารถเข้าไปที่เมนู “Pull requests” แล้วกดที่ปุ่ม “New pull request” ก็ได้เช่นกัน

โดยจะต้องกำหนด Destination Branch และ Source Branch ให้ถูกต้อง ​โดยที่ Source Branch คือ Feature Branch ที่เราทำการแก้ไขโค้ดนั่นเอง

ส่วน Destination Branch คือ Branch ปลายทางที่เราต้องการเพิ่มโค้ดของเราเข้าไปนั่นเอง โดยส่วนใหญ่จะเป็น master หรือ main แต่ทั้งนี้ก็ขึ้นอยู่กับว่า Library นั้น ๆ มี Development Branch เป็น Branch ไหนด้วย

การกำหนด Branch ใน Pull Request จะเป็น Destination Branch (ซ้าย) < Source Branch (ขวา)

จากนั้นก็ให้ทำการใส่หัวข้อและรายละเอียดของ Pull Request นั้น ๆ ว่าจุดประสงค์ของโค้ดชุดนี้คืออะไร มีผลกระทบอะไรกับ Library บ้าง ซึ่งตรงจุดนี้ Library บางตัวอาจจะมี Template ให้อยู่แล้ว ก็ให้ใส่รายละเอียดตาม Template ที่เค้ากำหนดไว้ได้เลย

เมื่อใส่รายละเอียดครบทั้งหมดแล้ว ตรวจสอบโค้ดอีกครั้งเพื่อความมั่นใจ จากนั้นก็กดปุ่ม “Create pull request” ได้เลย

รอ Code Review จาก Library Owner

ในขั้นตอนนี้เราทำได้แต่รอ และรอเท่านั้น รอจนกว่า Library Owner จะเข้ามารีวิวโค้ดของเรา อาจจะมี Comment บ้างในระหว่างนี้ แต่สุดท้ายแล้วถ้า Pull Request ของเราผ่านก็จะถูก Merge เข้าไปใน Original Repository (ใน Branch ที่กำหนดไว้)

และแน่นอนว่าถ้า Pull Request ของเราไม่ผ่านก็อาจจะถูก Reject ได้เช่นกัน

รอจนกว่า Library จะปล่อยเวอร์ชันใหม่

แต่ละ Library จะมี Release Process ที่ไม่เหมือนกัน โดยในบาง Library อาจจะมีการกำหนด Milestone ไว้ชัดเจนว่าจะปล่อยของอะไรออกไปในแต่ละเวอร์ชันบ้าง และมีรอบในการ Release เมื่อไร

ในกรณีเราต้องการรีบใช้งานโค้ดดังกล่าว ก็อาจจะใช้โค้ดจาก Forked Repository ของเราไปก่อนก็ได้ หรือถ้าถูก Merge เข้าไปใน Original Repository แล้ว แต่ยังไม่ถึงรอบ Release ก็อาจจะใช้เป็น Snapshot ไปก่อนก็ได้เช่นกัน

การ Contribute ให้กับ Open Source Library ให้อะไรมากกว่าที่คุณคิด

จะเห็นว่าขั้นตอนในการ Contribute ให้กับ Library นั้นไม่ใช่เรื่องยากแต่อย่างใด ถึงแม้ว่าจะมีขั้นตอนที่เยอะขึ้นนิดหน่อย แต่นั้นก็เป็นวิธีสากลที่ใช้กันทั่วโลก Open Source อยู่แล้ว

และนอกจากจะได้ Library ที่เราสามารถใช้งานได้ตามต้องการแล้ว ยังช่วยพัฒนาความสามารถในการเป็น Software Engineer ที่ดีได้อีกด้วย เพราะโค้ดที่เราเขียนเพิ่มเข้าไปใน Library จะต้องถูกรีวิวทุกครั้ง และในบาง Library ก็มีการกำหนดให้เขียนเทสด้วย จึงเป็นโอกาสที่ดีที่เราจะได้ฝึกเขียนโค้ดที่ดีที่มีเทสไปในตัว

จึงทำให้เวลาที่เราจะเริ่มเขียนโค้ดใด ๆ เราก็จะต้องคิดให้ครอบคลุมมากขึ้น คิดเผื่อให้เยอะมากขึ้น เพราะเราไม่ได้เขียนโค้ดเพื่อเราแค่คนเดียว แต่เพื่อนักพัฒนาคนอื่น ๆ ที่เอา Library ตัวนั้นไปใช้งานด้วย

ถึงแม้ว่าโค้ดคุณจะเป็นโค้ดเล็ก ๆ ที่ไม่ได้มี Impact อะไรมากนัก แต่นั่นก็เป็นส่วนหนึ่งที่ช่วยขับเคลื่อนโลก Open Source มาจนถึงทุกวันนี้นะ 😉

Lovely android developer who enjoys learning in android technology, habitual article writer about Android development for Android community in Thailand.

Lovely android developer who enjoys learning in android technology, habitual article writer about Android development for Android community in Thailand.