ตลอดหลายทศวรรษที่ผ่านมา Maxine พยายามอธิบายให้คนนอกสายงานเทคนิคเข้าใจว่าการรวมโค้ด (code merge) นั้นน่ากลัวเพียงใด คำอธิบายที่ดีที่สุดของเธอคือการนึกภาพคนเขียนบทหนังฮอลลีวูดห้าสิบคนทำงานพร้อมกัน โดยที่พวกเขายังไม่ได้ตกลงกันเลยว่าใครเป็นตัวเอก ตอนจบจะเป็นอย่างไร หรือจะเป็นหนังแนวสืบสวนสอบสวนที่ตึงเครียด หรือแนวสายลับจอมเปิ่นกับคู่หู

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

แน่นอนว่าความพยายามที่จะรวมบทเหล่านั้นเข้าด้วยกันคือหายนะ เพราะยังไม่มีการตกลงกันว่าใครคือตัวละครหลัก มีตัวละครส่วนเกินโผล่มาเป็นร้อย มีฉากที่ไม่ปะติดปะต่อกันเลย และยังมีช่องโหว่ขนาดใหญ่ในพล็อตเรื่อง... นั่นเป็นเพียงส่วนน้อยของปัญหาเท่านั้น

และนักเขียนส่วนใหญ่ก็ไม่ได้อ่านบันทึกจากผู้อำนวยการสร้างที่ระบุว่า พวกเขากำลังเปลี่ยนเรื่องให้เป็นหนังสยองขวัญที่มีสัตว์ประหลาดยักษ์ใต้ทะเลเนื่องจากรสนิยมของตลาดที่เปลี่ยนไป

การ merge โค้ดก็ยากลำบากไม่แพ้กัน การแก้ไขโค้ดไม่เหมือนการแก้ใน Google Docs ที่นักพัฒนาทุกคนสามารถเห็นการเปลี่ยนแปลงของกันและกันได้ทันที แต่เหมือนกับคนเขียนบทหนัง พวกเขาสร้างกิ่งก้าน (branches) ส่วนตัวของซอร์สโค้ดขึ้นมา เป็นสำเนาส่วนตัวของตัวเอง เหมือนนักเขียนเหล่านั้น นักพัฒนาอาจทำงานแยกกันเป็นสัปดาห์ หรือบางครั้งเป็นเดือน

ระบบควบคุมซอร์ส (source control systems) สมัยใหม่ทุกตัวมีเครื่องมือสำหรับทำกระบวนการ merge แบบอัตโนมัติ แต่เมื่อมีการเปลี่ยนแปลงจำนวนมาก ข้อจำกัดของมันก็จะปรากฏชัดเจนขึ้น ใครบางคนอาจพบว่าคนอื่นเขียนทับงานของเขา หรือพบว่ามีคนไปแก้หรือลบสิ่งที่คนอื่นต้องใช้พึ่งพา หรือมีคนหลายคนแก้ไขส่วนเดียวกันของโค้ดจนขัดแย้งกัน... นั่นเป็นเพียงตัวอย่างสิ่งที่อาจผิดพลาดได้

Maxine ชอบมากเวลาที่ทุกคน merge การเปลี่ยนแปลงของตัวเองเข้าสู่ ‘master branch’ บ่อยๆ เช่น วันละครั้ง วิธีนั้นจะทำให้ขนาดของการเปลี่ยนแปลงที่ถูกนำมารวมกันไม่ใหญ่จนเกินไป การทำขนาดชุดงานให้เล็ก (small batch sizes) เหมือนในการผลิต จะช่วยให้งานไหลลื่นโดยไม่มีการหยุดชะงักที่รุนแรงหรือเกิดหายนะ

ในทางกลับกัน สิ่งที่นักพัฒนา Phoenix ทำคือ—นักพัฒนาเป็นร้อยคนทำงานเป็นสัปดาห์โดยไม่มีการ merge เลย และจากที่ Purna บอก ปกติมันต้องใช้เวลาอย่างน้อยสามวันในการ merge Maxine คิดในใจว่า ใครจะอยากทำงานแบบนั้นกัน?

Maxine เดินไปกับ Kurt และ Purna กลับไปที่อาคาร 5 เพื่อไปยัง “ห้องวอร์รูมสำหรับการ merge” (merging war room) ซึ่งเธอคิดว่าเป็นชื่อที่เหมาะสมมาก ทันทีที่เธอก้าวเข้าไปในห้อง เธอถูกปะทะด้วยกำแพงอากาศที่ร้อนชื้นจากการที่มีคนแออัดกันอยู่ในห้องที่ร้อนและแคบจนเกินไป เธอมองไปรอบๆ และพูดกับ Kurt อย่างมั่นใจว่า “ฉันไม่สนหรอกว่า Kirsten จะพูดว่าอะไร ไม่มีทางที่เราจะได้ release branch ในวันนี้แน่นอน”

Purna เดินไปหน้าห้องและหยิบแล็ปท็อปออกมา ระหว่างทางเดินมา Maxine ได้รู้ว่า Purna คือผู้จัดการฝ่าย integration ที่รับผิดชอบในการทำให้ฟีเจอร์และการแก้ไข defect ทั้งหมดที่สัญญาไว้ถูกรวมเข้าไปใน release branch สำหรับ QA ทุกคนเรียกเธอด้วยความเอ็นดูว่า “หัวหน้าฝ่าย merge” (merge boss)

Maxine มองดูสเปรดชีตที่พิมพ์ออกมาซึ่ง Purna ส่งให้เธอ มี Ticket ของฝั่ง Dev ถึง 392 ใบที่ต้องรอการ merge แต่ละแถวมีเลข Ticket จากระบบจัดการงานของ Dev, คำอธิบายปัญหา, ช่องติ๊กถูกเพื่อแสดงว่ารวบรวมโค้ดเสร็จหรือยัง, ลิงก์ไปยังแผนการทดสอบของ QA, หมายเลข Ticket ของ QA และข้อมูลอื่นๆ อีกเพียบ...

Purna รับผิดชอบในการทำให้การเปลี่ยนแปลงทั้งหมดนี้ถูก merge เข้าด้วยกัน เพื่อให้ทีม QA สามารถทดสอบระบบในภาพรวมได้เสียที ค้นหาและรายงานปัญหาที่พบ และทำให้แน่ใจว่า defect ทั้งหมดได้รับการแก้ไขแล้ว มันเป็นงานที่ใหญ่โตและบ่อยครั้งก็เป็นงานที่ไม่มีใครเห็นหัว

Maxine หาที่นั่งที่ด้านหลังห้องกับ Kurt รอบโต๊ะประชุมมีนักพัฒนาและผู้จัดการประมาณยี่สิบห้าคนซึ่งเป็นตัวแทนจากแต่ละทีมที่มีงานต้อง merge พวกเขาเกาะกลุ่มกันกลุ่มละสองสามคน โดยมีแล็ปท็อปอย่างน้อยหนึ่งเครื่องวางอยู่ตรงหน้า โดยปกติจะมีคนหนึ่งกำลังพิมพ์งานอยู่ ส่วนคนอื่นๆ ก็คอยยืนชะโงกมองข้ามไหล่

มีเสียงพึมพำของการสนทนาที่เต็มไปด้วยความหงุดหงิดดังระงมไปทั่วห้อง “ฟังดูเหมือนเสียงตอนนักพัฒนากำลัง merge โค้ดกันเลยนะ” Tom กล่าวพลางดึงเก้าอี้นั่งลงข้างเธอ

“คุณรู้จักมุกตลกที่ว่า—พหูพจน์ของ ‘นักพัฒนา’ คืออะไรไหมคะ?” Maxine ถาม “คำตอบคือ ‘merge conflict’ ไงล่ะ”

Tom หัวเราะพลางเปิดแล็ปท็อป “ผมกะว่าจะ merge งานทั้งหมดของเราเข้า release branch เดี๋ยวนี้เลย ปกติผมไม่รีบทำทันทีหรอก เพราะจะรีบไปทำไมล่ะ? ผมหมายถึง ลองดูรอบๆ สิ... ปกติมันต้องใช้เวลาเป็นวันๆ กว่าทุกคนจะเอาโค้ดของตัวเองเข้าไปได้”

เขาเปิดแอปพลิเคชันจัดการซอร์สโค้ด (SCM) ลากและวางสองสามอย่าง คลิกตรงนั้นตรงนี้ แล้วก็พิมพ์บางอย่างลงไป เขาพูดว่า “เสร็จแล้ว!” แล้วก็ปิดแล็ปท็อป

“ปกติผมไม่อยู่รอดูหรอกครับ” เขากล่าว “พวกเราแทบไม่มีโค้ดที่ใช้ร่วมกับทีมอื่นๆ ใน Phoenix เลย ผมจำไม่ได้เลยว่าเคยมีปัญหาเรื่อง merge มาก่อนหรือเปล่า...”

Maxine พยักหน้า พลางคิดอีกครั้งว่ามันแปลกแค่ไหนที่ Data Hub ถูกนับเป็นส่วนหนึ่งของ Phoenix

“คุณคิดว่าคนพวกนี้จะ merge เสร็จภายในวันนี้ไหมคะ?” Maxine ถาม

Tom หัวเราะพลางชี้ไปที่ทีวีเครื่องใหญ่หน้าห้องที่เชื่อมต่อกับแล็ปท็อปของ Purna “เพิ่ง merge เสร็จไปแค่สี่รายการเองครับ ห้ารวมรายการที่เราเพิ่งทำไปเมื่อกี้ด้วย ยังเหลืออีกตั้ง 387 รายการที่ต้องทำ ในอัตราความเร็วเท่านี้ ผมว่ามันคงเป็นปาฏิหาริย์ถ้าพวกเขาจะทำเสร็จพรุ่งนี้ ผมเดาว่าอย่างน้อยน่าจะใช้เวลาสามวันครับ”

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

Maxine เห็นหัวหน้าทีม Dev คนหนึ่งพิมพ์คำว่า “git pull” ลงในหน้าต่างเทอร์มินัลบนแล็ปท็อป ทันใดนั้นข้อความแสดงข้อผิดพลาด (error message) ยาวเหยียดก็ปรากฏขึ้น โชว์ให้เห็นว่ามี merge conflicts ถึงสี่สิบสามจุด Maxine ถึงกับผงะออกจากหน้าจอด้วยความตกใจ เธอสงสัยว่าพวกเขาจะต้องใช้เวลานานแค่ไหนกว่าจะสะสางกองขยะนั้นได้

ต่อมา เมื่อเธอได้ยินอีกทีมหนึ่งคุยกันเรื่องการพิมพ์ซอร์สโค้ดออกมาเป็นกระดาษเพื่อให้ทุกคนมาช่วยกันไล่ดูและแก้ไขการเปลี่ยนแปลงด้วยมือ (manually) เธอถึงกับเกือบจะพ่นกาแฟออกมา

มีกลุ่มคนสิบคนยืนออกันอยู่ที่หน้าจอทีวีหน้าห้อง กำลังช่วยกันวิเคราะห์โค้ดที่แตกต่างกัน (code diff) จากการเปลี่ยนแปลงสี่ชุดที่แก้ส่วนเดียวกันในไฟล์เดียว

เมื่อเห็นสีหน้าของเธอ Kurt จึงถามว่า “เป็นอะไรไปเหรอครับ?”

เธอพูดไม่ออก ได้แต่ทำไม้ทำมือสื่อถึงความโกลาหลและความวุ่นวายรอบตัวเธอ “นักพัฒนาควรจะเอาเวลาไปแก้ปัญหาทางธุรกิจ... ไม่ใช่... มาทำอะไรแบบนี้... นี่มันบ้าไปแล้วค่ะ”

Kurt เพียงแค่หัวเราะ “แน่นอนครับ ผู้จัดการทีม Dev ทุกคนต่างก็บ่นว่าเรื่องนี้มันยุ่งยากแค่ไหน บางคนถึงขั้นพยายามผลักดันให้เรา merge กันให้น้อยลงกว่านี้อีก—แทนที่จะทำเดือนละครั้ง ก็อาจจะเปลี่ยนเป็นไตรมาสละครั้งแทน”

Maxine หน้าถอดสี “คุณล้อเล่นใช่ไหมคะ?”

“เปล่าครับ” Kurt ตอบพลางรู้สึกขบขันกับปฏิกิริยาของ Maxine จริงๆ “ถ้ามันเจ็บปวดนัก ก็แค่ทำมันให้น้อยลง นั่นแหละคือตรรกะของพวกเขาครับ”

“ไม่นะ ไม่ ไม่” Maxine กล่าวอย่างท้อใจ “พวกเขากำลังเข้าใจผิดไปหมดเลย มันเจ็บปวดก็เพราะขนาดของงานที่เอามา merge มันใหญ่เกินไปต่างหาก การจะทำให้มันเจ็บปวดน้อยลง พวกเขาต้องทำมันให้บ่อยขึ้น เพื่อให้การ merge แต่ละครั้งมีขนาดเล็กและเกิดความขัดแย้งน้อยลงค่ะ”

Kurt หัวเราะอีกครั้ง “ก็นั่นแหละครับ” เขากล่าวพลางยักไหล่และชี้มือไปรอบๆ ห้อง

Maxine ไม่หัวเราะ เพราะเธอไม่เห็นว่ามันตลกตรงไหน เธอหันไปมองนาฬิกา ตอนนี้เกือบสี่โมงครึ่งแล้ว เธอมองที่หน้าจอแล็ปท็อปของ Purna มีการ merge เสร็จไปเพียงสามสิบห้ารายการเท่านั้น ยังเหลืออีกตั้ง 359 รายการ พวกเขาเพิ่งทำเสร็จไปแค่สิบเปอร์เซ็นต์เอง

ในอัตราความเร็วเท่านี้ Maxine คิดว่าพวกเขาต้องใช้เวลาอีกอย่างน้อยสี่สิบชั่วโมง—หรืออีกหนึ่งสัปดาห์เต็มๆ เลยทีเดียว

วันถัดมา Maxine นั่งทรุดตัวอยู่บนเก้าอี้ในห้องอาหาร ท่ามกลางกองพิซซ่า มันเกือบจะสิ้นสุดวันที่สองของการ merge โค้ดแล้ว เธอมองจ้องไปที่ป้ายประกาศแผ่นใหญ่ที่มีอยู่ทุกที่ ซึ่งเตือนว่า “สำหรับทีม merge เท่านั้น”

Maxine ไม่รู้ว่าพวกเขาจะติดป้ายทำไม เพราะในช่วงวันครึ่งที่ผ่านมา เธอเดาว่านักพัฒนาทุกคนคงต้องเคยเข้ามาอยู่ในห้องวอร์รูมการ merge สักห้องหนึ่งอยู่แล้ว

“Maxine อยู่นี่เอง” Kurt กล่าวขัดจังหวะภวังค์ของเธอ “พระเจ้าช่วย เอิ่ม... สภาพคุณดูแย่มากเลยนะ ถ้าผมจะขอพูดตรงๆ”

Maxine เพียงแค่ยิ้มแบบเม้มปากให้ Kurt เธอไม่มีเรี่ยวแรงพอที่จะอธิบายสิ่งที่เธอเห็นและมันกวนใจเธอมากขนาดไหน

Maxine รู้ดีว่าการ merge โค้ดไม่เคยเป็นช่วงเวลาที่สนุกสำหรับใคร แต่เธอก็ไม่ได้เตรียมใจรับมือกับสิ่งที่เธอเห็นในช่วงสองวันที่ผ่านมาเลย

เธอเห็นผู้จัดการก๊อปปี้ไฟล์ซอร์สโค้ดจากคอมพิวเตอร์เครื่องหนึ่งไปยังอีกเครื่องหนึ่งผ่านแฟลชไดรฟ์ USB เพียงเพราะทีมของพวกเขาไม่อยากใช้ระบบควบคุมเวอร์ชัน (version control) แบบเดียวกับคนอื่น

เธอเห็นผู้คนพยายามแก้ไข merge conflicts ที่มีความยาวกว่าหนึ่งพันบรรทัด กระจัดกระจายอยู่ในไฟล์หลายสิบไฟล์

เธอเห็นผู้คนลืม merge การเปลี่ยนแปลงของตัวเองเข้าไป และเพิ่งมารู้ตัวตอนที่ Purna มาไล่เช็กสเปรดชีตของเธอ

เธอถึงขั้นเห็นสองทีมกำลังปล้ำอยู่กับปัญหาความขัดแย้งในการรวมโค้ดเชิงความหมาย (semantic merge conflict) ซึ่งหาดูได้ยาก และปกติจะเจอแต่ในเรื่องเล่าที่นักพัฒนาใช้ขู่กันเองเท่านั้น มันคือผลลัพธ์ของการ merge แบบอัตโนมัติที่คอมไพล์ผ่านอย่างถูกต้อง แต่กลับทำให้การทำงานของโปรแกรมเปลี่ยนไปอย่างสิ้นเชิง ส่วนที่แย่ที่สุดคือมันเกือบจะหลุดรอดไปได้แล้ว พวกเขาพบมันโดยบังเอิญตอนที่มีใครคนหนึ่งพูดขึ้นมาว่า “เอ๊ะ ตรงนี้มันดูไม่ค่อยถูกนะ” ไม่อย่างนั้นมันคงหลุดรอดเข้าสู่ production และสร้างความเสียหายอย่างประเมินค่าไม่ได้แน่นอน

เธอเอาแต่สงสัยว่าจะมีข้อผิดพลาดแบบเดียวกันนี้อีกกี่จุดที่ตรวจไม่พบ และตอนนี้มันกำลังรันอยู่ใน production รอเวลาที่จะระเบิดเหมือนระเบิดเวลาเมื่อโค้ดส่วนนั้นถูกเรียกใช้งานในที่สุด

เธอหันกลับไปหา Kurt แล้วพูดว่า “ฉันได้เห็นบางอย่างมาค่ะ บางอย่างที่อธิบายออกมาเป็นคำพูดไม่ได้เลย Kurt มันช่างเป็นการเสียเปล่าและความทุกข์ทรมานที่ไม่จำเป็นเอาซะเลย... ไม่ควรมีนักพัฒนาคนไหนต้องมาเจอ... อะไร... แบบนี้... มันบ้าบอที่สุด!” เธอกลับมาพูดไม่ออกอีกครั้ง

“อา...” Kurt กล่าวพลางมองด้วยความเป็นห่วง “ทิ้งพิซซ่านั่นซะ แล้วมาหาพวกเรากลุ่ม Rebellion เถอะครับ Shannon เพิ่งรายงานผลจากการที่เธอไปคุยกับทีม Dev ของ Phoenix มา และเธอมีไอเดียที่เจ๋งมากครับ”

Maxine ก้มลงมองมือตัวเองและเห็นว่าเธอกำลังถือพิซซ่าเย็นๆ ที่กินไปครึ่งเดียว ชีสแข็งตัวจนกลายเป็นแผ่นสีขาวเยิ้มๆ เธอจำไม่ได้เลยว่ากินมันเข้าไปตอนไหน

เธอโยนมันทิ้งแล้วเดินตาม Kurt ไปโดยไม่พูดอะไรสักคำ

Kurt พา Maxine ไปที่ห้องประชุมอีกห้องหนึ่ง ซึ่งอยู่ห่างไกลจากความบ้าคลั่งของการ merge ที่กำลังดำเนินอยู่ เธอเห็น Tom, Brent, Shannon และ Dwayne รวมตัวกันอยู่ที่โต๊ะ ทุกคนยิ้มและโบกมือให้เธอ Shannon จ้องมองเธอครู่หนึ่ง แต่ไม่เหมือน Kurt เธอเลือกที่จะไม่ทักเรื่องสภาพที่ดูอิดโรยของ Maxine อย่างมีมารยาท

“Maxine ฉันว่าคุณต้องชอบเรื่องนี้แน่ค่ะ” Shannon กล่าว “พวกเรากำลังคิดถึงเรื่องที่การเปลี่ยนแปลงทั้งหมดของ Data Hub ถูก merge เสร็จเรียบร้อยแล้ว แต่การจะทดสอบได้ เรากลับต้องรอให้คนอื่นๆ ทุกคน merge เสร็จก่อน”

“เรากำลังคิดว่าต้องทำยังไงถึงจะทำให้ Data Hub แยกตัวเป็นอิสระ (decoupled) จาก Phoenix เพื่อให้เราทดสอบแยกกันได้ค่ะ” Shannon กล่าวต่อ “ถ้าเราทำได้ เรามีทีม QA ที่พร้อมจะทดสอบโค้ดที่เราแก้ไปได้ทันทีเลยค่ะ”

Maxine ต้องใช้เวลาครู่หนึ่งกว่าจะเข้าใจสิ่งที่ Shannon เสนอ สมองของเธอยังคงมึนงงและอ่อนล้าจากการ merge โค้ดที่ผ่านมา แต่แล้วเธอก็คิดได้

“ใช่เลยค่ะ!” Maxine อุทาน “ใช่ นั่นเป็นไอเดียที่ยอดเยี่ยมมาก ตอนนี้เราอาจจะช่วยทีม Phoenix อื่นๆ ไม่ได้มากนัก แต่นั่นไม่ได้หมายความว่าเราต้องมานั่งทนทุกข์ทรมานไปพร้อมกับพวกเขาด้วยนี่นา”

Kurt กล่าวว่า “ผมคุยกับ Purna และ Kirsten แล้ว พวกเขาจัดคนสองคนมาช่วยเราทดสอบและรับรองความถูกต้อง (certify) ของ Data Hub ตราบใดที่การ merge ของ Phoenix ยังไม่เสร็จ สองคนนี้จะเป็นของเราครับ อันที่จริงผมพนันได้เลยว่าเราน่าจะทดสอบงานของเราเสร็จก่อนที่พวกนั้นจะ merge กันเสร็จซะอีก”

Maxine ขมวดคิ้วแล้วพูดว่า “แต่เรายังต้องการสภาพแวดล้อมการทดสอบ (test environment) สำหรับรัน Data Hub อยู่นะคะ” เธอหยุดคิดครู่หนึ่ง “ฉันสงสัยว่าเราจะสร้าง Data Hub test environment ขึ้นมาในคลัสเตอร์ของเราได้ไหม มันน่าจะเล็กและเรียบง่ายกว่า Phoenix environment เยอะเลย ด้วยวิธีนี้ ทีม QA จะสามารถใช้งานมันได้ตลอดเวลา แทนที่จะต้องไปแย่งชิง environment ที่มีอยู่อย่างจำกัดกับคนอื่น”

“ทีมจัดการ environment คงไม่แฮปปี้กับเรื่องนี้แน่ๆ ครับ” Kurt กล่าวพร้อมรอยยิ้ม “คุณต้องการอะไรบ้างครับ?”

เธอมองไปรอบๆ “ถ้าฉันได้ Brent กับ Adam มาช่วยสักสองสามวัน ฉันว่าเราน่าจะทำ environment แบบย่อส่วนให้รันได้ภายในวันจันทร์ค่ะ ฉันรู้ว่า Brent ต้องจดจ่ออยู่กับ Phoenix แต่ก็นะ ในทางเทคนิค Data Hub ก็ยังเป็นส่วนหนึ่งของ Phoenix อยู่ ใช่ไหมคะ?”

ทันใดนั้น Maxine ก็กลับมารู้สึกตื่นเต้นอีกครั้ง ความคิดที่จะปลดปล่อย Data Hub ออกจากบ่วงของโปรเจกต์ Phoenix นั้นช่างน่าตื่นเต้นเหลือเกิน

“อุดมคติข้อแรก (The First Ideal)” Brent พูดพลางยิ้ม

วันถัดมา Maxine, Brent และ Adam ทำงานกันอย่างบ้าคลั่งตลอดทั้งวันทั้งคืนเพื่อสร้าง environment แบบย่อส่วนสำหรับรันและทดสอบ Data Hub มันคือการแข่งกับเวลาในการ merge ของ Phoenix

Purna เห็นด้วยกับแผนนี้ Kirsten เองก็เช่นกัน เธอกล่าวว่า “พวกเราเป็นคนสร้างกฎพวกนี้ขึ้นมาเอง เราก็แหกกฎเองได้เหมือนกัน โดยเฉพาะถ้ามันจะช่วยกำจัดไอ้ dependencies เฮงซวยพวกนี้ไปได้ตลอดกาล ผู้จัดการโครงการคนไหนก็ต้องดีใจจนเนื้อเต้นทั้งนั้นแหละค่ะ” นั่นเพียงพอสำหรับ Kurt ที่จะบอกให้พวกเขาลุยได้เลย โดยไม่ต้องเสียเวลาไปขออนุมัติจากใครในลำดับชั้นที่สูงขึ้นไปอีก

“เดี๋ยวค่อยไปขอโทษทีหลังถ้าจำเป็นแล้วกันครับ” Kurt กล่าวพร้อมรอยยิ้ม

ในตอนนั้น Brent กำลังพยายามจำลอง (reproduce) การ build environment ที่ปัจจุบันรันได้แค่บนแล็ปท็อปของ Tom เท่านั้น ในขณะเดียวกัน Maxine ก็ทำงานร่วมกับ Adam พยายามทำให้ Data Hub release ล่าสุดสามารถรันบน Phoenix environment แบบย่อส่วนของพวกเขาได้

เธอดีใจที่พวกเขากำลังไขปริศนาการ build ได้อีกชิ้นหนึ่ง ซึ่งเป็นสิ่งที่กวนใจเธอมาตลอดตั้งแต่ถูกเนรเทศมาที่นี่ ทั้งคู่กำลังจ้องมองหน้าต่างเทอร์มินัลในขณะที่ Data Hub กำลังบูตระบบ (booting) โดยหวังว่าพวกเขาจะแก้ข้อผิดพลาดสุดท้ายได้สำเร็จ พวกเขายังคงเฝ้าดูข้อความในล็อก (log messages) เลื่อนผ่านไปตอนที่ได้ยินเสียงเอะอะมาจากห้องวอร์รูมการ merge

หนึ่งในผู้จัดการทีม Dev ตะโกนขึ้นมา “ขอให้ทุกคนสนใจทางนี้หน่อยครับ! เราเจอปัญหาในระบบ production เป็นพักๆ มาตลอดสองชั่วโมงที่ผ่านมาบนเว็บไซต์อีคอมเมิร์ซ มีบางอย่างใน Phoenix ทำให้ราคาโปรโมชั่นแสดงผลผิดพลาดหรือไม่ครบถ้วนเมื่อผู้ใช้เข้าสู่หน้าตะกร้าสินค้า มีใครรู้ไหมว่าเกิดอะไรขึ้น?”

“จังหวะระบบล่ม (outage) ได้ดีจริงๆ” Maxine คิดในใจขณะเดินกลับไปที่ห้องวอร์รูม ผู้จัดการทีม Dev เกือบทุกคนอยู่ที่นี่กันครบแล้ว ดังนั้นมันน่าจะง่ายมากในการหาว่าโค้ดส่วนไหนที่เป็นตัวปัญหา มันเหมือนกับการหัวใจวายในงานประชุมอายุรแพทย์โรคหัวใจ—มีหมอเก่งๆ เต็มไปหมด

ขณะที่เธอเฝ้าดู Maxine รู้สึกชื่นชมในวิธีการแก้ปัญหาที่เป็นระเบียบวินัยของพวกเขา พวกเขาทำงานกันอย่างมีประสิทธิภาพ มีตรรกะ และไม่มีการกล่าวโทษกันเลยแม้แต่นิดเดียวในขณะที่พยายามจำลองปัญหาบนแล็ปท็อปของตัวเองและคิดทบทวนอย่างเป็นระบบว่าอะไรน่าจะผิดพลาด

สิบนาทีต่อมา ผู้จัดการทีม Dev ฝั่ง middleware ก็ขึ้นมาเป็นผู้นำ เธอให้เหตุผลที่น่าเชื่อถือว่าปัญหาต้องอยู่ในส่วนของโค้ดที่เธอรับผิดชอบแน่ๆ ใช้เวลาเพียงสิบห้านาทีทีมของเธอก็สร้างวิธีแก้ปัญหา (fix) ได้สำเร็จ “มันเป็นการแก้ไขแค่บรรทัดเดียวค่ะ เราสามารถ push การเปลี่ยนแปลงนี้เข้า release branch ปัจจุบันได้เลย” เธอประกาศ “โอ้ ให้ตายเถอะ ทำไม่ได้นี่นา... มีแค่ผู้จัดการ SCM (Source Code Management) เท่านั้นที่ push เข้า release branch เก่านี้ได้ เราต้องการตัว Jared มีใครรู้ไหมว่าเขาอยู่ที่ไหน?”

“เดี๋ยวผมไปตามให้ครับ!” ใครบางคนตะโกนขึ้นมาแล้วรีบวิ่งออกจากห้องไป

“Jared คือใครเหรอคะ?” Maxine ถาม Kurt Kurt เอามือขยี้ตา พยายามกลั้นหัวเราะ

ผู้จัดการทีม Dev ฝั่ง middleware ที่อยู่ข้างๆ พวกเขาพูดด้วยน้ำเสียงเหนื่อยหน่ายว่า “Jared คือผู้จัดการซอร์สโค้ดค่ะ นักพัฒนาไม่ได้รับอนุญาตให้เข้าถึงระบบ production เวลาเดียวที่นักพัฒนาจะสามารถ push การเปลี่ยนแปลงเข้า release branch ได้คือเมื่อเกิดปัญหาความรุนแรงระดับ P1 เท่านั้น และนี่มันเป็นแค่ระดับ P3 ค่ะ” เธออธิบาย “ดังนั้น เราต้องไม่ขอให้ฝ่าย Ops เปลี่ยนระดับความรุนแรงเป็น P1 ซึ่งไม่มีทางเกิดขึ้นแน่ๆ หรือไม่ก็ต้องให้ Jared มอบสิทธิ์การเข้าถึงชั่วคราวให้ฉัน เพื่อที่ฉันจะได้เช็กอิน (check in) วิธีแก้ปัญหาของเราลงไปค่ะ”

“แล้วถ้า Jared อยู่ที่นี่ เขาจะทำอะไรคะ?” Maxine ถาม พลางเดาคำตอบไว้ในใจ

ผู้จัดการฝ่าย middleware กล่าวว่า “เขาก็จะเอา commit ID ของวิธีแก้ปัญหาของเรา ไปก๊อปปี้ลงใน release branch ด้วยมือ แล้วก็ส่งมันขึ้น (promote) production ค่ะ”

“แค่นั้นเหรอคะ?” Maxine ถาม

“ใช่ค่ะ” เธอตอบ

Maxine สบถเบาๆ เธอแปลกใจตัวเองที่รู้สึกโกรธขึ้นมาจริงๆ แบบว่าโกรธจัดเลยล่ะ

เมื่อไม่กี่นาทีก่อน เธอเพิ่งคิดว่าจังหวะการเกิด outage ครั้งนี้มันช่างโชคดีเสียเหลือเกิน ช่างเป็นคนไข้ที่โชคดีจริงๆ เธอเคยคิดแบบนั้น เพราะผู้เชี่ยวชาญด้านโรคหัวใจที่เก่งที่สุดที่สามารถวินิจฉัยปัญหาและให้การรักษาฉุกเฉินได้อย่างถูกต้องดันมาอยู่ในห้องนี้กันพร้อมหน้าพอดี

แต่ที่ Parts Unlimited แห่งนี้ หมอไม่ได้รับอนุญาตให้แตะต้องตัวคนไข้ ยกเว้นแต่ว่าจะมี Ticket ระดับ P1 เปิดอยู่ แต่ถ้าคนไข้ยังไม่ถึงขั้นใกล้ตายเหมือนตอนนี้ ดูเหมือนว่าจะมีแค่ Jared เท่านั้นที่แตะตัวคนไข้ได้ และ Jared ก็แค่ทำตามที่หมอบอก เพราะก็นั่นแหละ หมอแตะตัวคนไข้ไม่ได้ Jared ไม่ใช่หมอ เขาอาจจะเป็นแค่เจ้าหน้าที่ธุรการที่คอยเพิ่มหรือลบชื่อผู้ใช้ และคอยดูแลให้แน่ใจว่ามีการสำรองข้อมูลไว้เท่านั้นเอง

“ไม่มีใครหา Jared เจอเลยครับ ผมว่าเขาน่าจะยังกินมื้อเที่ยงไม่เสร็จ” ชายคนที่ไปตามหาเขากล่าว

“โธ่เอ๊ย ให้ตายสิ” Maxine พึมพำเบาๆ มันเกิดขึ้นอีกแล้ว เธอคิดพลางนึกถึงความรู้สึกแย่ๆ ในห้องอาหารเมื่อวานนี้

ทุกคนพยายามหาแผนสำรองเพราะไม่มีใครหา Jared เจอ ยี่สิบนาทีต่อมา Randy ปรากฏตัวขึ้นและประกาศว่าไม่มีอะไรทำได้ แต่เขายังคงพยายามหาตัว Jared ต่อไป

ทุกคนพยักหน้ารับและกลับไปทำงาน merge การเปลี่ยนแปลงของตัวเองต่อ

“เรื่องแบบนี้มันโอเคได้ยังไงกันคะ?!” Maxine พูดเสียงดังใส่ทุกคนในห้อง เธอทนดูอยู่เฉยๆ ไม่ได้อีกต่อไปแล้ว “ทำไมพวกนักพัฒนาถึงไม่สามารถ push การเปลี่ยนแปลงของตัวเองขึ้น production ได้ล่ะคะ? ทำไมเราต้องรอให้ Jared เป็นคน push ให้ด้วย? ฉันหมายถึง ฉันแน่ใจว่าเขาเก่งในสิ่งที่เขาทำนะคะ แต่ทำไมเราถึงทำเองไม่ได้?”

ห้องทั้งห้องเงียบกริบ ทุกคนจ้องมองมาที่เธอด้วยความตกใจ ราวกับว่าเธอเพิ่งจะเรอออกมาดังลั่นในงานแต่งงานหรืองานศพอย่างไรอย่างนั้น ในที่สุดก็มีใครบางคนพูดขึ้นว่า “Compliance (การปฏิบัติตามกฎระเบียบ) ไงครับ” และอีกคนก็เสริมว่า “และ Information Security (ความปลอดภัยข้อมูล) ด้วยครับ”

รอบๆ ห้อง เธอได้ยินคนอื่นพ่นเหตุผลอื่นๆ ออกมาอีก

“ITIL” “Change management” “SOX” “PCI” “หน่วยงานกำกับดูแล (Regulators)”

เธอมองไปรอบๆ ทุกคนในที่นี้ล้วนมีความสามารถและมีความรับผิดชอบกันทั้งนั้น แต่ทว่า... “ไม่เอาน่าทุกคน เหตุผลพวกนั้นมันฟังไม่ขึ้นเลย ฉันว่าฉันรู้เหตุผลจริงๆ ว่าทำไมเราถึงไม่ได้รับอนุญาตให้ push งานของตัวเอง... พวกเขาไม่ไว้ใจเราต่างหากล่ะคะ! เรื่องนี้ไม่กวนใจพวกคุณบ้างเลยเหรอ?! Jared จะไปรู้เรื่องการแก้ไขโค้ดดีกว่านักพัฒนาที่เป็นคนเขียนมันขึ้นมาได้ยังไงคะ?”

จากการกวาดสายตาไปรอบห้อง Maxine เห็นว่ามีคนเพียงแค่สิบคนเท่านั้นที่ดูจะสะทกสะท้านกับสิ่งที่เธอเพิ่งตาสว่างขึ้นมา

“พวกเขากลัวว่าเราจะจงใจวินาศกรรมงานตัวเองเหรอคะ? หรือคิดว่าคนที่ก๊อปปี้และวางโค้ดของเราจะทำงานได้ดีกว่าพวกเราที่เป็นคนเขียนมันขึ้นมาเอง?” Maxine รู้ตัวว่าเธอกำลังพูดในสิ่งที่อาจจะดูแรงไปหน่อย แต่เธอหยุดตัวเองไม่ได้แล้ว “พวกเราเกือบทุกคนในห้องนี้คือนักพัฒนา ไม่มีใครรู้สึกแย่บ้างเลยเหรอคะที่เราไม่ได้รับความไว้วางใจให้ push งานของตัวเองขึ้น production น่ะ?”

บางคนแค่ยักไหล่ บางคนจ้องมองเธอราวกับว่าเธอเป็นคนบ้าหรือไร้เดียงสาจนเกินเยียวยา

แต่กลับกลายเป็นว่ามีเพียงความเงียบงัน

พวกเราไม่ต้องการผู้คุมอีกต่อไปแล้วล่ะ พวกเราเสพติดการเป็นนักโทษมากจนคิดไปเองว่าลูกกรงมีไว้เพื่อปกป้องเราให้ปลอดภัย

เธอกำลังจะเดินออกจากห้องตอนที่ชายหนุ่มไว้ผมหางม้าพร้อมแล็ปท็อปใต้แขนเดินเข้ามาในห้องประชุม ตามหลังมาด้วยคนอีกสองคน

“โอ้ ไม่นะ” Maxine เผลอพูดออกมาดังๆ นี่คือ Jared เหรอนี่?

เขาดูเด็กกว่าเด็กฝึกงานที่ช่วยเธอในวันแรกที่มาที่นี่เสียอีก เธอไม่ได้มีอคติอะไรกับวิศวกรอายุน้อย ตรงกันข้าม ความหวังและความฝันสูงสุดของเธอฝากไว้ในมือของคนรุ่นใหม่ และเธอพร้อมจะทำทุกอย่างเพื่อช่วยให้พวกเขาบรรลุเป้าหมาย แต่ทว่า มันยากจริงๆ สำหรับ Maxine ที่จะยอมรับว่า Jared มีคุณสมบัติเหมาะสมที่จะแก้ปัญหา outage นี้มากกว่าทุกคนในห้องนี้ ถ้า Jared สามารถ deploy งานได้ พวกเราก็น่าจะทำได้เหมือนกัน เธอคิดในใจ

Maxine เฝ้าดูเขาตั้งค่าแล็ปท็อปเพื่อทำการ push โค้ด เขาใช้เวลาสิบนาทีกว่าจะล็อกอินสำเร็จ ได้ลิงก์ของโค้ดที่ต้องการจะ push และยืนยันกับทุกคนว่ามันคือโค้ดที่ถูกต้องจริงๆ... เหมือนกับในหนังเขียนโค้ดที่ Maxine เคยดูถูกไว้เป๊ะเลย มีกลุ่มคนยืนออกันอยู่ข้างหลัง Jared เฝ้ารออย่างใจจดใจจ่อขณะที่เขาทำงาน เมื่อเขาพูดออกมาในที่สุดว่า “เรียบร้อยครับ” ผู้คนต่างพากันตบหลังเขาด้วยความยินดี

Maxine กรอกตาด้วยความหงุดหงิด เธอดีใจที่ Jared ทำงานสำเร็จ แต่นี่มันอะไรกันล่ะ สิ่งที่เขาทำก็แค่ก๊อปปี้ วาง แล้วก็คลิกปุ่มแค่นั้นเอง

เมื่อ Maxine ถามผู้จัดการฝ่าย middleware ว่าปัญหาได้รับการแก้ไขหรือยัง ผู้จัดการตอบว่า “ยังค่ะ ตอนนี้ Jared แค่เอาโค้ดใส่ลงใน release branch ล่าสุดเท่านั้น ขั้นตอนต่อไปเขาต้องไปประสานงานกับคนฝั่ง Ops เพื่อให้มันถูก deploy ขึ้น production จริงๆ ค่ะ”

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

สี่ชั่วโมงหลังจากเดินตาม Jared ออกจากห้อง Maxine รู้สึกมึนงงและสับสน ความรู้สึกดีและความตื่นเต้นที่เธอมีจากการทำงานกับ Data Hub environment ได้หายวับไปจนหมดสิ้น และ Maxine ยังสูญเสียอย่างอื่นไปด้วย—เธอเริ่มไม่แน่ใจอีกต่อไปว่าอะไรคือสิ่งที่ดี อะไรคือสิ่งที่แย่ และกระบวนการที่ปกครองโลกของเธอมันคืออะไรกันแน่

เธอยังรู้สึกไม่สบายตัวอย่างเห็นได้ชัด ฉันกำลังจะเป็นไข้หรือเปล่านะ?

มันเริ่มขึ้นตอนที่เธอเดินตาม Jared ลงมาสองชั้นไปยังชั้นล่างสุดที่แผนก Operations ตั้งอยู่ ในห้องประชุมของฝ่าย Ops เธอจำ Wes และ Patty ได้ แต่แทบไม่รู้จักใครคนอื่นเลย ถึงแม้ว่าทุกคนจะดูคล้ายกันอย่างน่าประหลาด

ห้องประชุมดูเหมือนกับห้องวอร์รูมการ merge ชั้นบนเป๊ะเลย เฟอร์นิเจอร์แบบเดียวกัน ลำโพงโทรศัพท์บนโต๊ะแบบเดียวกัน โปรเจกเตอร์บนเพดานก็แบบเดียวกัน แต่คนที่นั่งอยู่รอบโต๊ะกลับเป็นคนละกลุ่มที่กำลังถกเถียงกันในหัวข้อเดียวกับชั้นบนเป๊ะ: จะ deploy การเปลี่ยนแปลงที่เร่งด่วนนี้ได้อย่างไร เพียงแต่พวกเขาถกเถียงกันเรื่องอุปสรรคที่ต่างไปเล็กน้อย: ห้ามเปลี่ยนแปลงนอกช่วงเวลาบำรุงรักษา (maintenance windows), ITIL, ความปลอดภัย, การจัดการการเปลี่ยนแปลง (Change Management), Compliance, ระบบ Ticket คนละตัวกัน แต่จำนวนฟิลด์ (fields) ที่ต้องกรอกกลับเท่ากัน และมี error ขึ้นแบบเดียวกันเวลาคุณกรอกไม่ครบ กระบวนการแจ้งเรื่องด่วน (escalation) ก็เหมือนกัน แค่เปลี่ยนตัวบุคคลเท่านั้นเอง

พวกเขาได้ส่งคำขอการเปลี่ยนแปลงฉุกเฉิน (emergency change request) ไปยัง Bill Palmer รองประธานฝ่าย Operations และ Maggie Lee ผู้อำนวยการอาวุโสฝ่ายการตลาดผลิตภัณฑ์ และก็เหมือนกับชั้นบน ทุกคนต่างยืนรอการอนุมัติอยู่เฉยๆ

ตอนห้าโมงเย็น มีคนสั่งพิซซ่า Maxine เดินตามทุกคนไปที่ห้องอาหาร ซึ่งถอดแบบมาจากชั้นบนไม่มีผิดเพี้ยน เมื่อเธอเห็นพิซซ่า เธอเกือบจะสะดุดล้ม—มันมาจากร้านเดียวกับพิซซ่าที่เอามาเลี้ยงตอนมื้อเที่ยงวัน merge เมื่อวานเลย

พิซซ่าแบบเดียวกัน ถูกกินโดยคนละกลุ่มคน บ่นเรื่องปัญหาเดียวกัน ตอนนั้นเองที่ Maxine เริ่มรู้สึกป่วยจริงๆ ห้องเริ่มหมุนคว้างเล็กน้อย บางทีฉันอาจจะแค่หิว? แต่พอเห็นหน้าตาพิซซ่าแล้วเธอก็รู้สึกคลื่นไส้ขึ้นมาทันที

Maxine รู้สึกเหมือนกำลังดูหนังฉากเดิมซ้ำที่เธอเพิ่งผ่านมันมาเมื่อหกชั่วโมงก่อน เหมือนหนังเรื่อง Groundhog Day เวอร์ชันสยองขวัญ เธอคิด เหมือนตัวละครของ Bill Murray ที่ถูกสาปให้ต้องใช้ชีวิตในวันเดิมซ้ำแล้วซ้ำเล่า แต่สำหรับ Maxine พวกเขาแค่เปลี่ยนตัวนักแสดงไปเรื่อยๆ ตอนแรกเป็นทีม Dev ต่อมาเป็นทีม QA และตามด้วยทีม Ops แต่ทุกอย่างมันก็เหมือนเดิมหมด

จนถึงตอนนี้ ลึกๆ แล้ว Maxine เคยสงสัยว่านักพัฒนากำลังถูกคุมขังโดยระบบราชการที่ไร้หัวใจและไม่แยแสโลก บางทีมันอาจจะรันโดยฝ่าย Operations หรือกลุ่มลับที่บ้าคลั่ง ITIL Change Management แต่หลังจากเดินตาม Jared เข้ามาถึงใจกลางของ Operations เธอก็เห็นว่าพวก Ops เองก็ถูกคุมขังโดยผู้คุมคนเดียวกับเหล่านักพัฒนาที่อยู่ชั้นบนนั่นแหละ

ใครได้ประโยชน์จากเรื่องนี้กันแน่? ใครกันที่ได้ประโยชน์จากการกดขี่ทุกคนในองค์กรเทคโนโลยี? Maxine สงสัยว่า Chris หรือ Bill จะเป็นผู้คุมคุกในทะเลแห่งคุกที่ไม่มีวันสิ้นสุดนี้หรือเปล่า ถ้าจะมีอะไรสักอย่าง พวกเขาก็เป็นนักโทษเหมือนกันนั่นแหละ

Maxine โยนพิซซ่าในมือทิ้งก่อนที่จะทันได้กัดสักคำ เมื่อกลับมาที่ห้องประชุม Wes ประกาศว่าการเปลี่ยนแปลงเร่งด่วนเพิ่งได้รับการอนุมัติ Maggie (คนที่มีอำนาจอนุมัติ) พลาดการติดต่อครั้งแรกเพราะเธอไปงานวันเกิดของตัวเอง แต่ตอนนี้เธอปลีกตัวออกมาเข้าร่วมประชุมสายแล้ว

ใช้เวลาสี่สิบนาทีในการ push การเปลี่ยนแปลงออกไป Maxine เฝ้าดูทีมงานค้นหาข้อมูลใน network shares, หน้า Wiki, ที่เก็บซอร์สโค้ด... จากนั้น Patty ก็ยืนยันว่าปัญหาได้รับการแก้ไขแล้ว

Wes ขอบคุณทุกคนที่อยู่ช่วยจนดึก และผู้คนก็เริ่มแยกย้ายกันไป ในไม่ช้า Maxine ก็เหลือตัวคนเดียวในห้องประชุม ไฟเริ่มดับลงเพราะเซ็นเซอร์ตรวจจับความเคลื่อนไหวไม่พบการขยับเขยื้อน ในความมืดนั้น Maxine สงสัยว่าระบบราชการที่กดขี่นี้มีอำนาจควบคุมมากมายขนาดนี้ได้อย่างไร

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

ในความมืดนั้น Maxine หยิบโทรศัพท์ขึ้นมาและส่งข้อความหา Kurt และกลุ่ม Rebellion ที่เหลือ: “มีใครยังอยู่ไหมคะ? ฉันต้องการความช่วยเหลือจริงๆ และต้องการเครื่องดื่มสักแก้วด้วย มีใครไปเจอกันที่ Dockside ได้บ้างไหมคะ?”