หน้านี้จะอธิบายว่าระบบบิลด์คืออะไร ระบบบิลด์ทำอะไรได้บ้าง เหตุใดคุณจึงควรใช้ระบบบิลด์ และเหตุใดคอมไพเลอร์และสคริปต์บิลด์จึงไม่ใช่ตัวเลือกที่ดีที่สุดเมื่อองค์กรของคุณเริ่มขยายขนาด โดยมีไว้สำหรับนักพัฒนาซอฟต์แวร์ที่ไม่มีประสบการณ์ในการใช้ระบบบิลด์มากนัก
ระบบบิลด์คืออะไร
โดยพื้นฐานแล้ว ระบบบิลด์ทั้งหมดมีวัตถุประสงค์ที่ตรงไปตรงมา นั่นคือการแปลงซอร์สโค้ดที่เขียนโดยวิศวกรให้เป็นไบนารีที่ดำเนินการได้ซึ่งเครื่องอ่านได้ ระบบบิลด์ไม่ได้มีไว้สำหรับโค้ดที่เขียนโดยมนุษย์เท่านั้น แต่ยังช่วยให้เครื่องสร้างบิลด์ได้โดยอัตโนมัติ ไม่ว่าจะเป็นสำหรับการทดสอบหรือสำหรับการเผยแพร่ไปยังเวอร์ชันที่ใช้งานจริง ในองค์กรที่มีวิศวกรหลายพันคน บิลด์ส่วนใหญ่จะถูกทริกเกอร์โดยอัตโนมัติแทนที่จะเป็นวิศวกรโดยตรง
ฉันใช้คอมไพเลอร์อย่างเดียวไม่ได้เหรอ
ความจำเป็นในการใช้ระบบบิลด์อาจไม่ชัดเจนในทันที วิศวกรส่วนใหญ่ไม่ได้ใช้ระบบบิลด์ขณะเรียนรู้การเขียนโค้ด โดยส่วนใหญ่จะเริ่มด้วยการเรียกใช้เครื่องมือต่างๆ เช่น gcc หรือ javac จากบรรทัดคำสั่งโดยตรง หรือเทียบเท่าในสภาพแวดล้อมการพัฒนาแบบบูรณาการ (IDE) ตราบใดที่ซอร์สโค้ดทั้งหมดอยู่ในไดเรกทอรีเดียวกัน คำสั่งเช่นนี้จะทำงานได้ดี
javac *.javaคำสั่งนี้จะสั่งให้คอมไพเลอร์ Java รับไฟล์ซอร์สโค้ด Java ทุกไฟล์ในไดเรกทอรีปัจจุบันและเปลี่ยนให้เป็นไฟล์คลาสไบนารี ในกรณีที่ง่ายที่สุด คุณเพียงแค่ทำเท่านี้
อย่างไรก็ตาม ทันทีที่โค้ดขยายออกไป ความซับซ้อนก็จะเริ่มขึ้น javac ฉลาดพอที่จะค้นหาโค้ดที่จะนำเข้าในไดเรกทอรีย่อยของไดเรกทอรีปัจจุบัน แต่ไม่มีวิธีค้นหาโค้ดที่จัดเก็บไว้ใน ส่วนอื่นๆ ของระบบไฟล์ (เช่น ไลบรารีที่แชร์โดยหลายโปรเจ็กต์) นอกจากนี้ยังทราบวิธีสร้างโค้ด Java เท่านั้น ระบบขนาดใหญ่มักเกี่ยวข้องกับส่วนต่างๆ ที่เขียนด้วยภาษาโปรแกรมที่หลากหลายพร้อมกับเว็บการพึ่งพาอาศัยกันระหว่างส่วนต่างๆ ซึ่งหมายความว่าไม่มีคอมไพเลอร์สำหรับภาษาเดียวที่จะสร้างระบบทั้งหมดได้
เมื่อคุณจัดการกับโค้ดจากหลายภาษาหรือหน่วยการคอมไพล์หลายหน่วย การสร้างโค้ดจะไม่ใช่กระบวนการขั้นตอนเดียวอีกต่อไป ตอนนี้คุณต้องประเมินสิ่งที่โค้ดของคุณขึ้นอยู่กับและสร้างส่วนเหล่านั้นตามลำดับที่เหมาะสม โดยอาจใช้ชุดเครื่องมือที่แตกต่างกันสำหรับแต่ละส่วน หากมีการเปลี่ยนแปลงการพึ่งพาอาศัยกัน คุณต้องทำกระบวนการนี้ซ้ำเพื่อหลีกเลี่ยงการพึ่งพาอาศัยกันในไบนารีที่ล้าสมัย สำหรับฐานโค้ดที่มีขนาดปานกลาง กระบวนการนี้จะกลายเป็นเรื่องน่าเบื่อและมีข้อผิดพลาดได้ง่ายอย่างรวดเร็ว
นอกจากนี้ คอมไพเลอร์ยังไม่ทราบวิธีจัดการการพึ่งพาอาศัยกันภายนอก เช่น ไฟล์ JAR ของบุคคลที่สามใน Java หากไม่มีระบบบิลด์ คุณสามารถจัดการได้โดยการดาวน์โหลดการพึ่งพาอาศัยกันจากอินเทอร์เน็ต ใส่ไว้ในโฟลเดอร์ lib ในฮาร์ดไดรฟ์ และกำหนดค่าคอมไพเลอร์ให้อ่านไลบรารีจากไดเรกทอรีนั้น เมื่อเวลาผ่านไป การดูแลรักษาการอัปเดต เวอร์ชัน และแหล่งที่มาของการพึ่งพาอาศัยกันภายนอกเหล่านี้จะทำได้ยาก
แล้วสคริปต์เชลล์ล่ะ
สมมติว่าโปรเจ็กต์งานอดิเรกของคุณเริ่มต้นด้วยความเรียบง่ายพอที่คุณจะสร้างได้โดยใช้คอมไพเลอร์เพียงอย่างเดียว แต่คุณเริ่มพบปัญหาบางอย่างที่อธิบายไว้ก่อนหน้านี้ บางทีคุณอาจยังไม่คิดว่าจำเป็นต้องใช้ระบบบิลด์และสามารถทำให้ส่วนที่น่าเบื่อเป็นไปโดยอัตโนมัติได้โดยใช้สคริปต์เชลล์อย่างง่ายที่ดูแลการสร้างสิ่งต่างๆ ตามลำดับที่ถูกต้อง วิธีนี้ช่วยได้สักพัก แต่ในไม่ช้าคุณก็จะเริ่มพบปัญหามากขึ้น ดังนี้
น่าเบื่อ เมื่อระบบของคุณซับซ้อนมากขึ้น คุณจะเริ่มใช้เวลาเกือบเท่าๆ กันในการทำงานกับสคริปต์บิลด์และโค้ดจริง การแก้ไขข้อบกพร่องของสคริปต์เชลล์เป็นเรื่องยาก โดยมีการเพิ่มแฮ็กมากขึ้นเรื่อยๆ
ช้า เพื่อให้แน่ใจว่าคุณไม่ได้พึ่งพาอาศัยกันในไลบรารีที่ล้าสมัยโดยไม่ได้ตั้งใจ คุณจึงให้สคริปต์บิลด์สร้างการพึ่งพาอาศัยกันทั้งหมดตามลำดับทุกครั้งที่คุณเรียกใช้ คุณคิดที่จะเพิ่มตรรกะบางอย่างเพื่อตรวจหาว่าส่วนใดบ้างที่ต้องสร้างใหม่ แต่ฟังดูซับซ้อนและมีข้อผิดพลาดได้ง่ายสำหรับสคริปต์ หรือคุณคิดที่จะระบุส่วนที่ต้องสร้างใหม่แต่ละครั้ง แต่แล้วคุณก็จะกลับไปที่จุดเริ่มต้น
ข่าวดี: ถึงเวลาเผยแพร่แล้ว คุณควรไปดูอาร์กิวเมนต์ทั้งหมดที่คุณต้องส่งไปยังคำสั่ง jar เพื่อสร้างบิลด์สุดท้าย และจำวิธีอัปโหลดและพุชไปยังที่เก็บส่วนกลาง รวมถึงสร้างและพุชการอัปเดตเอกสารประกอบ และส่งการแจ้งเตือนไปยังผู้ใช้ อืม บางทีอาจต้องใช้สคริปต์อื่น
หายนะ ฮาร์ดไดรฟ์ขัดข้อง และตอนนี้คุณต้องสร้างระบบทั้งหมดขึ้นมาใหม่ คุณฉลาดพอที่จะเก็บไฟล์ซอร์สทั้งหมดไว้ในการควบคุมเวอร์ชัน แต่ไลบรารีที่คุณดาวน์โหลดล่ะ คุณจะค้นหาไลบรารีทั้งหมดอีกครั้งและตรวจสอบว่าไลบรารีเหล่านั้นเป็นเวอร์ชันเดียวกับตอนที่คุณดาวน์โหลดครั้งแรกได้ไหม สคริปต์ของคุณอาจขึ้นอยู่กับเครื่องมือบางอย่างที่ติดตั้งไว้ในตำแหน่งที่เฉพาะเจาะจง คุณจะกู้คืนสภาพแวดล้อมเดียวกันเพื่อให้สคริปต์ทำงานได้อีกครั้งไหม แล้วตัวแปรสภาพแวดล้อมทั้งหมดที่คุณตั้งค่าไว้เมื่อนานมาแล้วเพื่อให้คอมไพเลอร์ทำงานได้อย่างถูกต้องและลืมไปแล้วล่ะ
แม้จะมีปัญหา แต่โปรเจ็กต์ของคุณก็ประสบความสำเร็จมากพอที่คุณจะเริ่มจ้างวิศวกรเพิ่มได้ ตอนนี้คุณตระหนักแล้วว่าปัญหาที่กล่าวถึงก่อนหน้านี้ไม่ได้เกิดขึ้นเฉพาะตอนเกิดหายนะเท่านั้น แต่คุณต้องผ่านกระบวนการเริ่มต้นที่ยากลำบากแบบเดียวกันทุกครั้งที่นักพัฒนาซอฟต์แวร์ใหม่เข้าร่วมทีม และแม้ว่าคุณจะพยายามอย่างเต็มที่แล้ว แต่ระบบของแต่ละคนก็ยังมีความแตกต่างเล็กน้อย บ่อยครั้งสิ่งที่ทำงานในเครื่องของคนหนึ่งอาจไม่ทำงานในเครื่องของอีกคนหนึ่ง และแต่ละครั้งต้องใช้เวลา 2-3 ชั่วโมงในการแก้ไขข้อบกพร่องของเส้นทางเครื่องมือหรือเวอร์ชันไลบรารีเพื่อหาสาเหตุของความแตกต่าง
คุณตัดสินใจว่าต้องทำให้ระบบบิลด์เป็นไปโดยอัตโนมัติ ในทางทฤษฎีแล้ว วิธีนี้คล้ายกับการซื้อคอมพิวเตอร์เครื่องใหม่และตั้งค่าให้เรียกใช้สคริปต์บิลด์ทุกคืนโดยใช้ cron คุณยังคงต้องผ่านกระบวนการตั้งค่าที่ยากลำบาก แต่ตอนนี้คุณไม่มีสมองของมนุษย์ที่สามารถตรวจหาและแก้ไขปัญหาเล็กน้อยได้ ตอนนี้ทุกเช้าเมื่อคุณมาถึงที่ทำงาน คุณจะเห็นว่าบิลด์เมื่อคืนล้มเหลวเนื่องจากเมื่อวานนี้นักพัฒนาซอฟต์แวร์ทำการเปลี่ยนแปลงที่ทำงานในระบบของตนเอง แต่ไม่ทำงานในระบบบิลด์อัตโนมัติ แต่ละครั้งเป็นการแก้ไขที่ง่าย แต่เกิดขึ้นบ่อยมากจนคุณต้องใช้เวลามากในแต่ละวันในการค้นหาและใช้การแก้ไขง่ายๆ เหล่านี้
บิลด์จะช้าลงเรื่อยๆ เมื่อโปรเจ็กต์ขยายใหญ่ขึ้น วันหนึ่งขณะรอให้บิลด์เสร็จสมบูรณ์ คุณมองเดสก์ท็อปที่ไม่ได้ใช้งานของเพื่อนร่วมงานที่กำลังพักร้อนด้วยความเศร้าใจ และต้องการหาวิธีใช้ประโยชน์จากพลังการประมวลผลที่สูญเปล่าทั้งหมดนั้น
คุณพบปัญหาคลาสสิกของการขยายขนาด สำหรับนักพัฒนาซอฟต์แวร์คนเดียวที่ทำงานกับโค้ดไม่เกิน 200 บรรทัดเป็นเวลาไม่เกิน 1-2 สัปดาห์ (ซึ่งอาจเป็นประสบการณ์ทั้งหมดของนักพัฒนาซอฟต์แวร์ระดับจูเนียร์ที่เพิ่งจบการศึกษาจากมหาวิทยาลัย) คุณเพียงแค่ต้องใช้คอมไพเลอร์ สคริปต์อาจช่วยคุณได้อีกเล็กน้อย แต่ทันทีที่คุณต้องประสานงานกับนักพัฒนาซอฟต์แวร์หลายคนและเครื่องของพวกเขา แม้แต่สคริปต์บิลด์ที่สมบูรณ์แบบก็ไม่เพียงพอ เพราะการคำนึงถึงความแตกต่างเล็กน้อยในเครื่องเหล่านั้นจะกลายเป็นเรื่องยากมาก ณ จุดนี้ วิธีการง่ายๆ นี้จะใช้ไม่ได้อีกต่อไป และถึงเวลาลงทุนในระบบบิลด์จริงแล้ว