ทำไมจึงต้องใช้ระบบการสร้าง

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

ระบบบิลด์คืออะไร

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

ฉันใช้แค่คอมไพเลอร์ไม่ได้เหรอ

ความจำเป็นในการใช้ระบบบิลด์อาจไม่ชัดเจนในทันที วิศวกรส่วนใหญ่ไม่ได้ใช้ระบบบิลด์ขณะเรียนรู้การเขียนโค้ด โดยส่วนใหญ่จะเริ่มด้วยการเรียกใช้เครื่องมืออย่าง gcc หรือ javac จากบรรทัดคำสั่งโดยตรง หรือเทียบเท่าในสภาพแวดล้อมในการพัฒนาซอฟต์แวร์แบบบูรณาการ (IDE) ตราบใดที่ซอร์สโค้ดทั้งหมดอยู่ในไดเรกทอรีเดียวกัน คำสั่งเช่นนี้จะทำงานได้ดี

javac *.java

คำสั่งนี้จะสั่งให้คอมไพเลอร์ Java รับไฟล์ซอร์สโค้ด Java ทุกไฟล์ในไดเรกทอรีปัจจุบันและเปลี่ยนให้เป็นไฟล์คลาสไบนารี ในกรณีที่ง่ายที่สุด คุณเพียงแค่ทำเท่านี้

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

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

นอกจากนี้ คอมไพเลอร์ยังไม่รู้วิธีจัดการกับทรัพยากร Dependency ภายนอก เช่น ไฟล์ JAR ของบุคคลที่สามใน Java หากไม่มีระบบบิลด์ คุณสามารถจัดการได้โดยการดาวน์โหลดทรัพยากร Dependency จากอินเทอร์เน็ต ใส่ไว้ในโฟลเดอร์ lib ในฮาร์ดไดรฟ์ และกำหนดค่าคอมไพเลอร์ให้อ่านไลบรารีจากไดเรกทอรีนั้น เมื่อเวลาผ่านไป การดูแลรักษาการอัปเดต เวอร์ชัน และแหล่งที่มาของการพึ่งพาอาศัยกันภายนอกเหล่านี้จะทำได้ยาก

แล้วเชลล์สคริปต์ล่ะ

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

  • น่าเบื่อ เมื่อระบบของคุณซับซ้อนมากขึ้น คุณจะเริ่มใช้เวลาเกือบเท่าๆ กันในการทำงานกับสคริปต์บิลด์และโค้ดจริง การแก้ไขข้อบกพร่องของเชลล์สคริปต์เป็นเรื่องยาก โดยมีการเพิ่มแฮ็กมากขึ้นเรื่อยๆ

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

  • ข่าวดี: ถึงเวลาเผยแพร่แล้ว คุณควรไปดูอาร์กิวเมนต์ทั้งหมดที่ต้องส่งไปยังคำสั่ง jar เพื่อสร้างบิลด์สุดท้าย และจำวิธีอัปโหลดและพุชไปยังที่เก็บส่วนกลาง รวมถึงสร้างและพุชการอัปเดตเอกสารประกอบ และส่งการแจ้งเตือนไปยังผู้ใช้ อืม บางทีอาจต้องใช้สคริปต์อื่น...

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

  • แม้จะมีปัญหา แต่โปรเจ็กต์ของคุณก็ประสบความสำเร็จมากพอที่คุณจะเริ่มจ้างวิศวกรเพิ่มได้ ตอนนี้คุณตระหนักแล้วว่าไม่จำเป็นต้องเกิดหายนะ ปัญหาที่กล่าวมาก่อนหน้านี้ก็เกิดขึ้นได้ คุณต้องผ่านกระบวนการเริ่มต้นที่ยากลำบากแบบเดียวกันทุกครั้งที่นักพัฒนาซอฟต์แวร์ใหม่เข้าร่วมทีม และแม้ว่าคุณจะพยายามอย่างเต็มที่แล้ว แต่ระบบของแต่ละคนก็ยังมีความแตกต่างเล็กน้อย บ่อยครั้งสิ่งที่ทำงานในเครื่องของคนหนึ่งอาจไม่ทำงานในเครื่องของอีกคนหนึ่ง และแต่ละครั้งต้องใช้เวลา 2-3 ชั่วโมงในการแก้ไขข้อบกพร่องของเส้นทางเครื่องมือหรือเวอร์ชันไลบรารีเพื่อหาสาเหตุของความแตกต่าง

  • คุณตัดสินใจว่าต้องทำให้ระบบบิลด์เป็นไปโดยอัตโนมัติ ในทางทฤษฎีแล้ว วิธีนี้คล้ายกับการซื้อคอมพิวเตอร์เครื่องใหม่และตั้งค่าให้เรียกใช้สคริปต์บิลด์ทุกคืนโดยใช้ cron คุณยังคงต้องผ่านกระบวนการตั้งค่าที่ยากลำบาก แต่ตอนนี้คุณจะไม่มีสมองของมนุษย์ที่สามารถตรวจหาและแก้ไขปัญหาเล็กน้อยได้ ตอนนี้ทุกเช้าเมื่อคุณมาถึงที่ทำงาน คุณจะเห็นว่าบิลด์เมื่อคืนล้มเหลวเนื่องจากเมื่อวานนี้นักพัฒนาซอฟต์แวร์ทำการเปลี่ยนแปลงที่ทำงานในระบบของตนเอง แต่ไม่ทำงานในระบบบิลด์อัตโนมัติ แต่ละครั้งเป็นการแก้ไขง่ายๆ แต่เกิดขึ้นบ่อยมากจนคุณต้องใช้เวลามากในแต่ละวันในการค้นหาและใช้การแก้ไขง่ายๆ เหล่านี้

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

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