ใครไม่ Commit ด้วย Pattern นี้ผมจะตีมือ

Thanawat Masileerungsri
6 min readSep 5, 2020

--

:: Pattern ในการ Commit Git ::

https://git-scm.com/downloads/logos

เห็นทีว่า Git เป็น source control ที่ตอนนี้น่าจะเนื้อหอมที่สุดแล้วในวงการ Version Control Software Tools แล้ว หรือที่เข้าใจกันง่ายๆก็คือ Repo นั่นเอง

จุดเริ่มต้น จากผมคนหนึ่ง ที่เป็น Novice ประสบการณ์เท่ากับ 0 ผ่านช่วงเวลาที่สับสน ร้อนหนาว หลายเรื่องราว มาอย่างโชกโชน หลายต่อหลายมรสุม Projects จนเกิดการเรียนรู้ ที่เรียกได้ว่าเจ็บแล้วจำ เพราะ Commit Merge กันแล้ว Code หาย จากการ merge code แบบเถื่อนๆ ตอนนี้ได้เลื่อน Level Job สาย Git เป็น Super Novice แล้ว

จากประสบการณ์ อันวุ่นวายในตอนที่ยังเป็น Novice ทำให้ผมรู้ว่า มันมีอุปสรรคบางอย่างที่คั่นกลางความยากง่ายในการ Develop ซึ่งตัวผมได้พูดคุยกับเพื่อนๆที่ทำงานอยู่เขียงค้าง เอ่ย เคียงข้างด้วยกันทุกวัน ว่ามีเรื่องปมในใจ เกี่ยวกับ Git ยังไงบ้าง ขมวดจนได้ใจความว่ามีอยู่เรื่องนึง ในทุก Project เรื่อยไป ไม่ใช่ว่างานจะไม่เสร็จ แต่กลายเป็นเมื่อทำ feature เสร็จแล้วอยากจะ commit ต้อง Commit ด้วย message format ไหนดี และเขียนอะไรบ้าง

รู้หรือไม่ว่า Version Control ไม่ได้มีแค่ Git กันนะ จริงแล้วยังมี พวก Subversion, Visual SourceSafe, Monotone >>>(Wiki ก่อนแล้วกัน)

จบแล้วการรอคอยที่แสนนาน ♫♪♪

มีหลายครั้งเลยแหละที่ผมงง บางทีถึงขั้นติด stun ให้กับ commit message ของเพื่อนๆร่วม Project ที่เขียน commit message เข้ามา แบบว่า สั้นกุด หรือ ใจความไม่สมบูรณ์ ไหนจะ commit เข้ามาทีเป็นกองโค้ด >> อันนี้อยากตีมือ 5555 ช่วยทยอย commit ทีละเรื่องได้ไหม (เรื่องรองจากการตั้งชื่อตัวแปร ก็ชื่อ commit นี่แหละ ยากที่สุดใน developer) ทำไมไม่มีสไตล์ในทำนองเดียวกัน เวลามานั่งย้อน commit ก็จะระลึกไม่ได้ต้องดู change อีกที

บางทีก็อยากให้มี Ai แบบ diff code แล้วคิด commit message ให้หน่อย ใครก็ได้เขียนให้ที มีโจทย์ให้แล้ว

ก็เลยอยากจะจัด Format commit message ให้เหมือนเราทำงานด้วย Protocol เดียวกันให้ แนวคิดนี้คล้ายกับการจัด Folder บน Desktop ผมเริ่มด้วยการลงมือจีบทุกคนด้วยการเข้าไปนั่งข้างๆ แล้วกระซิบเบาๆว่า ลองไหม ลอง commit message แบบนี้ดูมันช่วยให้อ่านรู้เรื่องขึ้นเยอะเลยนะ

สำหรับ Git : Branch เดียว

รุมกันที่ develop/master หรือชื่ออะไรก็ตาม เราอาจจะไม่ได้ใช้ วิธี Git-Flow แบบแตก feature รวม commit หรือเราแยก branch ออกมาเพื่อทำ group ของ หลายๆ feature

ชื่อ Feature — Details

สิ่งดีๆที่เกิดขึ้นจากการตั้งชื่อ Commit แบบนี้คือ เราจะได้เห็น story การทำงานของเราเป็น chain หากเราอยากรู้ว่า Commit

แต่ก็แล้วแต่ละทีมนะครับ Style อาจจะขึ้นอยู่กับ Project ด้วยครับ ถ้าไม่เป็นเรื่องที่เสียหาย หรือทำแล้วมีแต่ดีขึ้น ก็อยากเชียร์ให้ทุกคน มา Sync กันนะครับ

สำหรับ Git : แยก Branch แยก Feature แล้ว Merge กันที่ branch เดียวนั้น

ก็อยากให้คงคติแบบเดียวกันคือ Commit Pattern ตามที่ได้บอกไว้
คือแบบ ชื่อ Feature — Details เหมือนเดิมครับ

สำหรับ Git : แบบอื่นที่ผมไม่ได้กล่าวไว้

อันนี้ผมก็อยากฝากเป็น Pattern เดียวกันคือ ชื่อ Feature — Details ไว้ไปในอ้อมใจด้วยครับ

ละแมะ อยากให้เป็นแบบอื่นๆเลย เพราะอยากให้มันเป็น standard pattern ที่ apply กันทั้ง Thailand Software Development Industry (Show me your brave heart)

ฮ่าๆ ผมอยากบอกให้รู้ว่า ผม Commit Message Git ด้วย Pattern นี้มาโดยตลอด และอยากให้แลดูเป็น standard ของ Thai Industry ʕ•́ᴥ•̀ʔっ♡

ตัวอย่าง Requirement

ทีนี้การที่จะเข้าใจเรื่องนี้แบบง่าย มันต้องมีตัวอย่างถึงจะเห็นภาพ สมมติว่าเราทำ Project เกมส์ Rov อยู่แล้วจะ Dev ตัวละครใหม่เพิ่มขึ้นมาอีกตัวนึง ทีนี้มีงานที่ต้องทำตามนี้

  • Character core concept (base code, category character ที่ link กับ details, description, dance, skin, config) *** ทำเสร็จเรียบร้อย
  • Character details (Skill effect ต่างๆ ในเกม รวมทั้ง Sound ตัวละครด้วย)
  • Character dance (Dance effect ท่าเต้นของตัวละคร)
  • Character skin (Skin ของ character แบบ default และ แบบต่างๆ พร้อม option เสริมแยก ดาบเปลี่ยนสี ฯลฯ)
  • Character description (Info เนื้อเรื่อง, คำอธิบายสกิล)
  • Character config (ค่าพื้นฐาน เลือด มานา ตอน level 1 และ ตอน level เพิ่มขึ้น 2,3,…, 15 และพวก artwork ต่างๆ ในหน้าซื้อ-ขายตัวละคร)
    เพียงเท่านี้เราก็แยกออกมาหยาบๆเป็น 5 tasks ใหญ่ที่ต้องทำต่อ 1 ตัวละคร

มาดูตอน commit กัน (ตรงนี้ จั้มพ์ ไปที่ จัมพ์ Point#1 ได้ครับ)

สมมติ ผมกำลังสร้างตัวละครใหม่ชื่อ Gandalf ซึ่งมีจะมี Concept เป็นจอมเวทย์ที่เป็นหัตถ์ซ้ายของพระเจ้า(อสูรรับใช้ของยาย 0 สนิท) มี active และ passive skill ที่ไม่ธรรมดา เพราะสามารถเลือกได้ 3 ธาตุพื้นฐาน และ 1 สายเวทย์ขั้นสูงเป็นจอมเวทย์ทั้ง 7 ธาตุพื้นฐาน และ 12 สายเวทย์ขั้นสูง ซึ่งตัวละครนี้สามารถเล่นได้ 16 skills ใช้ skill ให้ครบนะครับ

ธาตุพื้นฐาน ได้แก่ ธาตุดิน, ธาตุน้ำ, ธาตุลม, ธาตุไฟ, ธาตุสายฟ้า, ธาตุแสง, ธาตุน้ำแข็ง ***แต่ละธาตุมี 4 skills
สายเวทย์ขั้นสูง
ได้แก่ สายภาวนา, สายทำลายล้าง, สายรักษา, สายพืช, สายพิษ, สายเงา, สายเสียง, สายพลังจิต, สายสัตว์เลี้ยง, สายอัญเชิญปีศาจ, สายมิติเวลา ***แต่ละสายเวทย์ 4 skills

Passive skill: ตอนเกิดจะมีธาตุติดตัวอยู่ 1 ธาตุ ซึ่งจะปล่อย aura ออกมาส่งผลต่อฮีโร่เท่านั้น โดยขึ้นกับ ธาตุและเลเวล จะมีผลของ effect ตั้งแต่ 0.1% ถึง 1.5% ตามเลเวลของตัวละคร ในระยะ 1 ใน 3 จากรัศมีรอบตัวที่มองเห็น หรือ 250 Aoe ได้แก่
ธาตุน้ำแข็งจะมี aura สีน้ำเงินทะเล ทำให้ฝั่งตรงข้ามเคลื่ยนที่ช้าลง
ธาตุลมจะมี aura สีเขียว ทำให้เคลื่ยนที่เร็วขึ้น
ธาตุไฟจะมี aura สีแดงส้ม ทำให้เพิ่มพลังโจมตี
ธาตุสายฟ้าจะมี aura สีม่วง ทำให้เพิ่มความเร็วโจมตี
ธาตุแสงจะมี aura สีเหลืองขาว ทำให้เพิ่มวิสัยทัศน์ออกไปอีกนิดนึง
ธาตุน้ำจะมี aura สีฟ้าคราม ทำให้มานา regen ไวขึ้น
ธาตุดินจะมี aura สีน้ำตาล ทำให้เลือด regen ไวขึ้น
และเมื่อเลเวลเต็มจะเพิ่ม skill play สุดท้ายของ สายเวทย์ขั้นสูง จะ unlock ออกมา

Active skill:
ช่อง Skill ที่ 1, 2, 3 เป็นช่อง effect skill ของธาตุที่ 1, 2, 3
ช่อง Skill ที่ 4 เป็นช่อง effect skill ของสายเวทย์ขั้นสูง

ส่วน skill play อิงตามนี้เลยครับ >>> วาร์ป ตาราง skill play มีตามนี้ Novice/Mid/High/Super Tier ซึ่งจะ unlock ตามลำดับของการเพิ่ม level skill play **เว้น Super Tier ของ สายเวทย์ขั้นสูง จะ auto-unlock เมื่อเลเวลเต็ม

credit: https://static.tvmaze.com/uploads/images/medium_portrait/128/320881.jpg

ปล. ตัวละครนี้อินสปายเรชันมาจาก เซียนจอมเวทย์ เต็มพิกัด เลยนะครับ เรื่องนี้เป็นเรื่องที่มันส์มาก เชียร์ให้ลองติดตามดูครับ

จัมพ์ Point#1 ที่นี้เรามาเขาเรื่องเลยดีกว่า

แปะรูปไว้เลย จะได้ไม่ต้อง scroll up

อารัมภบทมาเยอะ จะมีคนเข้าใจไหมหว่า OTL มาเข้า content ละ จาก 5 งานหลักหลังจากที่ทำ Feature: Character core concept จะต้องทำที่เหลือต่อ ขอสมมติว่าเรามาแตก branch ของ New character — Gandalf ออกมาแล้ว ทีนี้ทุกคนต้องรุมกันทำที่นี่เท่านั้น มาดูตัวอย่าง commit ในแต่ละแบบกัน
นาย A ทำ Character dance และ Character details
นาย B ทำ Character skin และ Character details
นาย C ทำ Character config และ Character description

โดยมี Timeline การ commit เป็นแบบนี้

เอาหละมาดู ภาพตอนที่ Commit ของทุกคน ในโปรเจคกัน

จะเห็นว่า commit แต่ละคน ถ้าอ่านด้วยตัวคนที่ลงมือทำเองจะเข้าใจได้ แต่เมื่อเราอ่าน commit ของคนอื่น เราคงไม่เข้าใจ เพราะทุกคนก็มี Pattern message ของตัวเอง และเมื่อเริ่มรังสรรค์งานพร้อมๆกัน ก็เป็นเรื่องที่หลีกเลี่ยงไม่ได้เลยว่า เราจะไม่มีทิศทาง message เดียวกัน ดังนั้นเราควรจะมีกฏ หรือ Practice ที่กลั่นออกมาเพื่อให้ทุกคนทำตามเป็นธรรมเนียมเดียวกัน นั่นก็คือ Convention Commit เพราะถ้าต่างคน ต่างมีแนวทางของตัวเอง เราก็คงไม่สามารถ ใช้ศักยภาพของ Message Commit ได้อย่างเต็มที่

ทีนี้ทุกคนร่วมแรงร่วมใจกันทำตามสัญญา Convention Commit

มาดู ภาพตอนที่ Commit ของทุกคน ในโปรเจคกัน

ตัดต่อเนียนสุดๆๆละ 555

เห็นแนวนอนเลขแปดไหมครับ ข้อดีของมัน > < (Don’t leave me! Don’t leave me! Don’t leave me!) ก็ ถ้าเราย้อนมาระลึกสมบัติที่เราสร้างทิ้งไว้ มันแฝงความมีอารยใน Code ของเรากลายๆ ถึงแม้ Code จะมีบัคเวลามาไล่ดู ก็ไม่ mess up ทำให้ใจเราเย็นลงได้นิดนึง ชีวจิตเราจะได้แจ่มใส

หากเราย้อนเวลาได้ ก็อยากกลับไปแก้ไขสิ่งที่ผ่านมาแล้วในอดีต แต่มันคงไม่มีประโยชน์ เมื่อร่างกายเราไม่ได้ย้อนอดีตไปด้วย เราย้อนได้แต่ความคิด แต่การกระทำมันคือสิ่งที่ทำไปแล้ว พร้อมกับการ stamp เวลา (ไม่นับการทำแบบ ทา-นอส นะ rm -rf เลย *** อย่าหาทำ)

Commit ที่ผ่านมาแล้วชั่งมัน
Commit ใหม่ๆ เรามาเขียนแบบ Convention นี้ Feature - Details กัน

มีคนกระซิบบอกว่า จริงๆมันมี standard ที่ชาวโลก define กันไว้ได้นะ https://www.conventionalcommits.org/en/v1.0.0/
ขอขอบคุณ คุณตุล ใน กลุ่มสมาคมโปรแกรมเมอร์ไทยด้วยครับ

จบแล้วปิ้ง
อ่านมาถึงจุดนี้ หวายในมือ ก็เปลี่ยนเป็นอมยิ้มแล้ว > .. < ลองเอาไปใช้ดูนะครับ
มี End credit Blog ต่อติดตามเด็กที่ถูกเลือกตอนโตด้วยนะ

Blog นี้เขียนขึ้นหลังจากดูหนังในโรงเรื่อง Digimon Adventure: Last Evolution Kizuna ขอแบ่งความรู้สึกเก็บไว้กับ blog นี้เลยนะครับ

credit : https://f.ptcdn.info/351/068/000/q6h3f6nn3O2WJ9j2yDg-o.jpg

Feeling: ที่ได้คือมัน Fulfill สิ่งที่ติดตามสิ่งที่โตและผูกพันมาแต่เด็ก แค่เพลงขึ้นท่อนแรกก็ลึกซึ้ง ตื้นตันใจอย่างบอกไม่ถูก ขอบคุณที่ทำให้รู้จักและสนุกไปกับการผจญภัยของเด็กๆที่ถูกเลือกนะครับ ตอนเด็กๆยังคิดตามเลยอยากเป็นเด็กที่ถูกเลือกบ้าง แล้วก็พยายามเข้าใจความหมายของ Tag สัญลักษณ์แต่ละคน ไม่ว่าจะเป็น ความกล้าหาญ มิตรภาพ ความรัก ความรู้ ความบริสุทธิ์ ความซื่อสัตย์ ความหวัง และแสงสว่าง ซึ่งแต่ละอย่างมันคือสิ่งที่หลอมรวมกันเป็นแต่ละด้านของแต่ละคนเลย

ไม่รู้ว่าต่อจากนี้จะมีการ์ตูน หรือ ซีรี่ย์ที่จะมาเติมเต็มหัวใจให้มีความฝันแบบในวัยเด็กแบบนี้อีกมั้ย แต่เชื่อว่าตราบใดที่เรายังหายใจอยู่ ความฝันแม้จะสำเร็จ ไม่สำเร็จบ้าง มันก็คือส่วนนึงของการเดินทางของชีวิตเรา จงโตไปตามทางที่ใจตั้งไว้

แปะ Reference ไว้เผื่อแก้ Blog

การ Commit Code แบบ pattern ผม Feature — Details

นาย A
10:02 Dance — add beatbox & 3-cha style
10:05 Dance — put on Gandalf
11:45 Dance — try on Aura’s Gandalf
11:48 Skin — combine with dance styles

นาย B
10:26 Details — add sound when Gandalf was killed
10:59 Details — add all Gandalf left sounds
11:38 Skin — add skin1 skill effect
11:48 Skin — add skin1 wrap home effect

นาย C
09:45 Config — init grow-up basis stat
10:28 Config — add ARTWORK1 & ARTWORK2
11:32 Description — add character story and description
13:31 Config — revise grow-up basis stat

การ ​Commit Code แบบต่างคน ต่าง pattern

นาย A
10:02 dance beatbox & 3-cha style
10:05 bind dance with character
11:45 toggle aura with dance
11:48 add dance beatbox -> skin1

นาย B
10:26 the sound when Gandalf was killed
10:59 init Gandalf left sounds
11:38 perform skin1: left effect
11:48 perform skin1: wrap home style

นาย C
09:45 character grow-up basis stat
10:28 ARTWORK1 & ARTWORK2
11:32 character description and story
13:31 revise grow-up basis stat

--

--

No responses yet