ความเดิมตอนที่แล้ว เริ่มต้นใช้ Git ตอนที่ 1 อารัมภกถา ผมทิ้งคำว่า Git มันเป็น Distribution SCM (SCM แบบกระจาย) ไว้ ผมมานั่งคิดว่าจะอธิบายไอ้คำๆนี้กับพวกท่านอย่างไรดี ได้ข้อตกลงในใจข้อหนึ่งว่า คงต้องเล่าเท้าความ ความเป็นมาเป็นไปของ SCM ให้ท่านฟัง ท่านน่าจะสรุปความได้ด้วยตัวเองว่า ไอ้กระจายเนี่ยมันกระจายยังไง
จะว่าไปแล้ว จะใช้ Git กันไปแบบงงๆก็ได้นะ โดยไม่ต้องทราบคำศัพท์บางศัพท์ แต่ก็อย่างว่า เวลาคุยกับคนอื่นมันจะได้รู้เรื่องไง ไม่ทำหน้าโง่ๆ ตอนสนทนา เข้าใจตรงกันกับที่คนอื่นพูด
เล่าความหลัง
ในอดีตเมื่อนานมาแล้ว โปรแกรมเมอร์ยุคก่อน เขาก็แบ็คอัพซอร์สโค้ดของเขา แบบโง่ๆ อย่างที่ใครบางคน บางบริษัททำกันในทุกวันนี้แหละ คือ ก้อปมันทั้งโฟลเดอร์แล้วก็ตั้งชื่อตามวันที่เอา ตั้งเป็นเวอร์ชั่นบ้างอะไรบ้าง ตามที่คิดว่ามันจะง่าย ตอนที่โค้ดปัจจุบันพัง แล้ว Roll back แต่จนแล้วจนรอด พอจะเอาของเก่ากลับมาใช้จริง มันก็ไม่สามารถเอากลับมาใช้ได้ เพราะอะไร ก็เพราะว่า ไอ้ของปัจจุบันมันมาไกลแล้ว ไอ้ของเก่า แม่ง…(ฝรั่งมันใช้คำว่า ฟัก ไม่บอกก็คงรู้)ไม่รู้มันเป็นไงแล้ว ลืม
ถ้าจะให้ดีนะ ไอ้คนเขียนโค้ดคนเก่ามันออกไป มันแบ็กอัพไฟล์ไว้ยังงั้น คนใหม่มันจะไปรู้ได้อย่างไร ว่าอะไรเป็นอะไร คอมเม้นท์หรือบันทึกอะไรสักอย่างก็ไม่มี สุดท้ายการทำแบ็กอัพแบบนั้นมันก็ไร้ประโยชน์ วันยังค่ำ
จนต่อมา มีคนคิดจะแก้ปัญหานี้ แล้วก็ได้คำตอบ
Local SCM
คำตอบที่ว่าคือ เขียนโปรแกรมขึ้นมาตัวหนึ่ง เพื่อให้มันคอยเก็บประวัติการแก้ไขโค้ด ที่อยู่ในเครื่องตัวเอง ใช้อยู่คนเดียวในเครื่องของตน เมื่อแก้ไขโค้ดตรงไหนไป ก็ให้โปรแกรมที่ว่า ช่วยรวบรวมความเปลี่ยนแปลง แล้วโปรแกรมเมอร์ก็เขียนบันทึกช่วยจำไว้ด้วยว่า แก้อะไรไป แบบว่าทำเซฟพ้อยต์ไว้ กลับมาไล่ดูย้อนหลังได้ว่าทำอะไรลงไปกับโค้ด ไม่เท่านั้นแถมเอาโค้ดย้อนหลังกลับมาได้ด้วย เขาจึงเรียกระบบนี้ว่า Local เพราะใช้อยู่คนเดียวในเครื่องเดียว
ทีนี้ปัญหามันก็ตามมาระรานอีก ฮาร์ดดิสก์เกิดเจ๊งขึ้นมาทั้งลูก เซฟพ้อยต์ที่เคยทำๆไว้หายหมด ต้องมาเริ่มกันใหม่ ตัวซอร์สโค้ดเองคงไม่เป็นไร อาจจะมีเก็บไว้ที่เครื่องเพื่อนร่วมทีม สามารถก้อปกลับมาได้ แต่อีเซฟพ้อยต์ที่เพื่อนเขียนไว้นี่สิ มันไม่ได้ตรงกับจริตของเรา อ่านแล้วงง บางคนไม่เขียนคอมเม้นท์อีก
มันก็เลยมีคนคิดต่อว่า เห้ย … งั้นเอางี้ ไปเก็บเซฟพ้อยต์ไว้ที่เครื่องอื่น เขียนโค้ดเครื่องนี้แต่ตอนเซฟพ้อยต์ ให้ส่งข้อมูลไปตามสายแลน เอาไปเก็บไว้ที่เครื่องอื่น
Centralize SCM
ทุกๆคนที่อยู่ในทีม ทำโปรเจ็กเดียวกัน ให้ส่งเซฟพ้อยต์ไปเก็บที่เดียวกัน ตรงกลาง ส่วนรวม เขาจึงเรียกว่ามันเป็น Centralize มันก็แก้ปัญหาเรื่องคอมเราพังไปได้ เปลี่ยนเครื่องใหม่แล้วไปดึงเอาเซฟพ้อยต์กลับมาจากเซ็นเตอร์ สบาย
แต่ก็นะโลกไม่เคยสวยงาม เครื่องเราพังได้ ทำไมไอ้เครื่องที่เก็บเซฟพ้อยมันจะพังไม่ได้ (ธรรมชาติให้ความเสมอภาคกันทุกเครื่อง) ชิบหายแล้ว ต้องมาเริ่มเซฟพ้อยต์กันใหม่ ประวัติที่เคยเก็บหายหมด มันก็เลยมีคนคิดต่อว่า เห้ย… งั้นเอางี้
Distributed SCM
เก็บเซฟพ้อยต์ แม่ง ทุกเครื่องเลย ซิงก์ให้มันเหมือนๆกันไปเลย เครื่องใดเครื่องหนึ่งพัง ก็เอาเซฟพ้อยต์จากเครื่องนั้นส่งขึ้นเครื่องกลาง แล้วทำงานกันต่อไป ถ้าเครื่องกลางพัง เปลี่ยนเครื่องเสร็จแล้ว เอาเซฟพ้อยต์จากเครื่องใดเครื่องหนึ่งส่งขึ้นไป ก็ทำงานกันต่อไป มันไม่พังพร้อมกันทีเดียวหมดหรอก ยกเว้นนิวเคลียร์ลง แต่ถ้านิวเคลียร์ลงจริง คงไม่ต้องมานั่งคิดเรื่องเซฟพ้อยต์แล้วล่ะ คิดเรื่องจะหนียังไงให้มีชีวิตรอดจากซอมบี้ที่เดินเพ่นพ่าน เต็มท้องถนน ดีกว่า (ออกเสียงแบบโฆษณาฮอลล์)
แต่ถ้ามีคำถามว่า อาจารย์ ผมเอาตัวจัดการซอร์สโค้ดแบบ Distribution (อาจารย์ชอบคำนี้ ออกเสียงแล้วมันได้รสชาติ ถึงมันเอาไปประกอบกับ SCM แล้วมันผิดไวยากรณ์ของหรั่ง ก็ตาม) ติดตั้งในเครื่องผมคนเดียว ผมเป็นทีงานโปรแกรมเมอร์คนเดียวในบริษัท (และว่างๆ ก็ไปเดินสายแลน ซ่อมคอม ดูเอ็กเซล ซ่อมพรินเตอร์ให้ลูกสาวเจ้านาย ด้วย) ถ้าคอมผมพังขึ้นมา ทุกอย่างมันก็หายหมดใช่มั้ยครับอาจารย์
มันก็หายหมดดิวะ ถามโง่ๆ เขาจึงมี github.com, bitbucket.com ให้บริการทำหน้าที่เป็นเครื่องทีมงานอีกคนหนึ่ง ทำไมไม่ใช้ (เขาให้ใช้ฟรีเลย แต่แบบมีเงื่อนไขนิดหน่อย ยอมรับได้น่า)
จากที่เล่ามาทั้งหมดนั่นแหละ สรุปเอาเองละกัน คำว่า Distribution SCM แบบกระจายๆ มันหมายความว่าอย่างไร
“ให้จินตนาการว่า bitbucket.com เป็นเครื่องทีมงาน ซิงก์กันสองคน” เก็บไว้อ่านส่วนตัว ปิ๊งขึ้นมาเมื่อกี้ ทำให้เข้าใจเส้นแดงๆในชาร์ตข้างบนอย่างทะลุปรุโปร่ง และเข้าใจโมเดล distribution อย่างบรรลุ
Leave a Reply