ในแต่ละวัน ทุกช่วงเวลาในอาชีพวิศวกรของเรา เราเผชิญกับปัญหาต่างๆ มากมายที่มีความซับซ้อนต่างกัน และสถานการณ์ที่เราต้องตัดสินใจหรือเลื่อนการตัดสินใจออกไปเนื่องจากขาดข้อมูล ทุกครั้งที่เราสร้างบริการใหม่ สร้างโครงสร้างพื้นฐาน หรือแม้แต่สร้างกระบวนการพัฒนา เราจะต้องเผชิญกับความท้าทายต่างๆ มากมาย
เป็นเรื่องท้าทายและอาจเป็นไปไม่ได้เลยที่จะระบุปัญหาทั้งหมด คุณจะพบกับปัญหาเหล่านี้ได้ก็ต่อเมื่อคุณทำงานเฉพาะด้านเท่านั้น ในทางกลับกัน ยังมีอีกหลายปัญหาที่เราทุกคนต้องเข้าใจวิธีการแก้ไข เนื่องจากปัญหาเหล่านี้มีความสำคัญต่อการสร้างระบบไอที มีโอกาสสูงที่คุณจะพบเจอปัญหาเหล่านี้ในทุกโครงการ
ในบทความนี้ ฉันจะแบ่งปันประสบการณ์ของฉันเกี่ยวกับปัญหาบางประการที่ฉันพบขณะสร้างโปรแกรมซอฟต์แวร์
หากเราลองค้นหาใน Wikipedia เราจะพบคำจำกัดความดังต่อไปนี้
ในการพัฒนาซอฟต์แวร์ที่เน้นด้านต่างๆ ความกังวลที่เกี่ยวข้องกับหลายด้านคือด้านต่างๆ ของโปรแกรมที่ส่งผลต่อโมดูลหลายตัวโดยไม่สามารถรวมไว้ในโมดูลใดๆ ความกังวลเหล่านี้มักไม่สามารถแยกออกจากส่วนอื่นๆ ของระบบได้อย่างชัดเจนทั้งในการออกแบบและการใช้งาน และอาจส่งผลให้เกิดการกระจัดกระจาย (การซ้ำซ้อนของโค้ด) การพันกัน (การพึ่งพากันอย่างมีนัยสำคัญระหว่างระบบ) หรือทั้งสองอย่าง
มันอธิบายสิ่งที่มันเป็นได้อย่างชัดเจน แต่ฉันอยากขยายและทำให้มันง่ายขึ้นเล็กน้อย:
ข้อกังวลเชิงตัดขวาง คือแนวคิดหรือส่วนประกอบของระบบ/องค์กรที่ส่งผลกระทบ (หรือ 'ตัดขวาง') ส่วนอื่นๆ อีกมากมาย
ตัวอย่างที่ดีที่สุดของความกังวลดังกล่าว ได้แก่ สถาปัตยกรรมระบบ การบันทึก ความปลอดภัย การจัดการธุรกรรม การวัดระยะไกล การออกแบบฐานข้อมูล และอื่นๆ อีกมากมาย เราจะอธิบายรายละเอียดเพิ่มเติมในบทความนี้ในภายหลัง
ในระดับโค้ด ปัญหาที่เกี่ยวข้องกับการตัดขวางมักจะถูกนำมาใช้โดยใช้เทคนิคเช่น Aspect-Oriented Programming (AOP) ซึ่งปัญหาเหล่านี้จะถูกแบ่งส่วนเป็นส่วนประกอบแยกกันที่สามารถนำไปใช้ได้ทั่วทั้งแอปพลิเคชัน วิธีนี้จะช่วยแยกตรรกะทางธุรกิจออกจากปัญหาเหล่านี้ ทำให้โค้ดอ่านและบำรุงรักษาได้ง่ายขึ้น
มีหลายวิธีในการจัดหมวดหมู่ลักษณะต่างๆ โดยแบ่งตามคุณสมบัติต่างๆ เช่น ขอบเขต ขนาด ฟังก์ชัน ความสำคัญ เป้าหมาย และอื่นๆ แต่ในบทความนี้ ฉันจะใช้การจัดหมวดหมู่ขอบเขตแบบง่ายๆ ซึ่งหมายถึงว่าลักษณะเฉพาะนั้นมุ่งไปที่ใด ไม่ว่าจะเป็นองค์กรทั้งหมด ระบบใดระบบหนึ่ง หรือองค์ประกอบเฉพาะของระบบนั้น
ดังนั้นฉันจะแยกลักษณะออกเป็น มหภาค และ จุลภาค
โดยภาพ รวม ที่ผมหมายถึงคือส่วนที่เราพิจารณาสำหรับระบบทั้งหมด เช่น สถาปัตยกรรมระบบที่เลือกและการออกแบบ (แบบโมโนลิธิก แบบไมโครเซอร์วิส แบบเน้นบริการ) เทคโนโลยีสแต็ก โครงสร้างองค์กร ฯลฯ ส่วนภาพ รวม นั้นเกี่ยวข้องกับการตัดสินใจเชิงกลยุทธ์และระดับสูงเป็นหลัก
ในขณะเดียวกัน แง่มุมของ ไมโคร จะอยู่ใกล้กับระดับโค้ดและการพัฒนามากขึ้น ตัวอย่างเช่น เฟรมเวิร์กใดที่ใช้ในการโต้ตอบกับฐานข้อมูล โครงสร้างโปรเจ็กต์ของโฟลเดอร์และคลาส หรือแม้แต่รูปแบบการออกแบบอ็อบเจ็กต์เฉพาะ
แม้ว่าการจำแนกประเภทนี้อาจไม่เหมาะสม แต่ก็ช่วยสร้างโครงสร้างความเข้าใจเกี่ยวกับปัญหาที่อาจเกิดขึ้น และความสำคัญและผลกระทบของวิธีแก้ไขที่เราใช้กับปัญหาเหล่านั้น
ในบทความนี้ ฉันจะมุ่งเน้นไปที่ประเด็นมหภาคเป็นหลัก
ตอนที่ผมเพิ่งเริ่มเรียนรู้เกี่ยวกับสถาปัตยกรรมซอฟต์แวร์ ผมอ่านบทความที่น่าสนใจมากมายเกี่ยวกับกฎของคอนเวย์และผลกระทบต่อโครงสร้างองค์กร โดยเฉพาะ บทความนี้ กฎนี้ระบุว่า
องค์กรใดก็ตามที่ออกแบบระบบ (โดยกำหนดอย่างกว้างๆ) จะต้องผลิตการออกแบบที่มีโครงสร้างเป็นสำเนาของโครงสร้างการสื่อสารขององค์กร
ฉันเชื่อเสมอมาว่าแนวคิดนี้เป็นสากลมากและเป็นตัวแทนของกฎทอง
จากนั้น ฉันจึงเริ่มเรียนรู้แนวทาง Domain-Driven Design (DDD) ของ Eric Evans สำหรับการสร้างแบบจำลองระบบ Eric Evans เน้นย้ำถึงความสำคัญของการระบุบริบทที่มีขอบเขต แนวคิดนี้เกี่ยวข้องกับการแบ่งโมเดลโดเมนที่ซับซ้อนออกเป็นส่วนย่อยๆ ที่จัดการได้ง่ายกว่า โดยแต่ละส่วนจะมีชุดความรู้ที่จำกัดของตัวเอง แนวทางนี้ช่วยให้การสื่อสารในทีมมีประสิทธิภาพ เนื่องจากลดความจำเป็นในการมีความรู้ที่ครอบคลุมเกี่ยวกับโดเมนทั้งหมด และลดการสลับบริบทให้เหลือน้อยที่สุด ทำให้การสนทนามีประสิทธิภาพมากขึ้น การสลับบริบทเป็นสิ่งที่แย่ที่สุดและใช้ทรัพยากรมากที่สุดเท่าที่เคยมีมา แม้แต่คอมพิวเตอร์ก็ยังประสบปัญหาในการทำเช่นนี้ แม้ว่าจะไม่น่าจะทำให้ไม่มีการสลับบริบทโดยสมบูรณ์ แต่ฉันคิดว่านั่นคือสิ่งที่เราควรพยายามทำ
เมื่อกลับมาที่กฎของ Conway ฉันพบปัญหาหลายประการเกี่ยวกับเรื่องนี้
ปัญหาแรก ที่ฉันพบเจอเกี่ยวกับกฎของคอนเวย์ ซึ่งแนะนำว่าการออกแบบระบบสะท้อนโครงสร้างองค์กร คือ ศักยภาพในการสร้างบริบทที่มีขอบเขตซับซ้อนและครอบคลุม ความซับซ้อนนี้เกิดขึ้นเมื่อโครงสร้างองค์กรไม่ได้สอดคล้องกับขอบเขตโดเมน ทำให้เกิดบริบทที่มีขอบเขตซึ่งเชื่อมโยงกันอย่างมากและเต็มไปด้วยข้อมูล ทำให้ทีมพัฒนาต้องสลับบริบทบ่อยครั้ง
ปัญหาอีกประการหนึ่ง คือคำศัพท์ในองค์กรรั่วไหลไปถึงระดับโค้ด เมื่อโครงสร้างองค์กรเปลี่ยนแปลง จำเป็นต้องปรับเปลี่ยนฐานโค้ด ซึ่งต้องใช้ทรัพยากรที่มีค่า
ดังนั้น การปฏิบัติตาม Inverse Conway Maneuver จะช่วยสร้างระบบและองค์กรที่ส่งเสริมสถาปัตยกรรมซอฟต์แวร์ตามที่ต้องการ อย่างไรก็ตาม ควรสังเกตว่าแนวทางนี้จะไม่ค่อยได้ผลดีนักกับสถาปัตยกรรมและโครงสร้างที่สร้างขึ้นแล้ว เนื่องจากการเปลี่ยนแปลงในขั้นตอนนี้ใช้เวลานาน แต่ได้ผลดีอย่างยิ่งในบริษัทสตาร์ทอัพ เนื่องจากบริษัทเหล่านี้สามารถนำการเปลี่ยนแปลงใดๆ มาใช้ได้อย่างรวดเร็ว
รูปแบบหรือ “รูปแบบต่อต้าน” นี้ขับเคลื่อนการสร้างระบบที่ไม่มีสถาปัตยกรรมใดๆ ไม่มีกฎเกณฑ์ ไม่มีขอบเขต และไม่มีกลยุทธ์ในการควบคุมความซับซ้อนที่เพิ่มมากขึ้นอย่างหลีกเลี่ยงไม่ได้ ความซับซ้อนคือศัตรูที่น่ากลัวที่สุดในการสร้างระบบซอฟต์แวร์
เพื่อหลีกเลี่ยงการสร้างระบบประเภทดังกล่าว เราต้องปฏิบัติตามกฎและข้อจำกัดเฉพาะเจาะจง
สถาปัตยกรรมซอฟต์แวร์มีคำจำกัดความมากมาย ฉันชอบคำจำกัดความเหล่านี้มากเพราะครอบคลุมถึงแง่มุมต่างๆ ของสถาปัตยกรรมซอฟต์แวร์ อย่างไรก็ตาม เพื่อให้สามารถใช้เหตุผลเกี่ยวกับสถาปัตยกรรมได้ เราต้องสร้างคำจำกัดความเหล่านี้ขึ้นมาในใจโดยธรรมชาติ และควรสังเกตว่าคำจำกัดความนี้อาจมีการเปลี่ยนแปลงได้ ดังนั้น อย่างน้อยตอนนี้ ฉันมีคำอธิบายต่อไปนี้สำหรับตัวเอง
สถาปัตยกรรมซอฟต์แวร์ เป็นเรื่องของการตัดสินใจและการเลือกที่คุณทำทุกวันซึ่งมีผลกระทบต่อระบบที่สร้างขึ้น
ในการตัดสินใจ คุณต้องมีหลักการและรูปแบบใน "กระเป๋า" ของคุณเพื่อแก้ปัญหาที่เกิดขึ้น สิ่งสำคัญคือต้องระบุว่าการทำความเข้าใจข้อกำหนดเป็นกุญแจสำคัญในการสร้างสิ่งที่ธุรกิจต้องการ อย่างไรก็ตาม บางครั้งข้อกำหนดอาจไม่ชัดเจนหรือไม่ได้กำหนดไว้ชัดเจน ในกรณีนี้ ควรจะรอการชี้แจงเพิ่มเติมหรือใช้ประสบการณ์และเชื่อสัญชาตญาณของคุณดีกว่า แต่ถึงอย่างไร คุณจะไม่สามารถตัดสินใจได้อย่างถูกต้องหากไม่มีหลักการและรูปแบบที่จะพึ่งพาได้ นั่นคือที่มาของคำจำกัดความของ รูปแบบสถาปัตยกรรมซอฟต์แวร์
รูปแบบสถาปัตยกรรมซอฟต์แวร์ เป็นชุดหลักการและรูปแบบที่กำหนดวิธีการสร้างซอฟต์แวร์
มีรูปแบบสถาปัตยกรรมที่แตกต่างกันมากมายซึ่งมุ่งเน้นไปที่ด้านต่างๆ ของสถาปัตยกรรมที่วางแผนไว้ และการใช้หลายรูปแบบในคราวเดียวถือเป็นเรื่องปกติ
เช่นเช่น:
สถาปัตยกรรมแบบองค์รวม
การออกแบบตามโดเมน
แบบส่วนประกอบ
ไมโครเซอร์วิส
ท่อและไส้กรอง
ขับเคลื่อนด้วยเหตุการณ์
ไมโครเคอร์เนล
เน้นการบริการ
และอื่นๆอีกมากมาย…
แน่นอนว่าสถาปัตยกรรมเหล่านี้มีข้อดีข้อเสีย แต่สิ่งที่สำคัญที่สุดที่ฉันได้เรียนรู้ก็คือสถาปัตยกรรมจะค่อยๆ พัฒนาไปพร้อมๆ กับปัญหาที่เกิดขึ้นจริง การเริ่มต้นด้วยสถาปัตยกรรมโมโนลิธิกถือเป็นตัวเลือกที่ยอดเยี่ยมในการลดความซับซ้อนในการปฏิบัติงาน สถาปัตยกรรมนี้น่าจะตอบสนองความต้องการของคุณได้แม้หลังจากเข้าสู่ขั้นตอน Product-market Fit (PMI) ของการสร้างผลิตภัณฑ์แล้วก็ตาม ในระดับขนาดใหญ่ คุณอาจพิจารณาเปลี่ยนไปใช้แนวทางแบบอิงตามเหตุการณ์และไมโครเซอร์วิสเพื่อให้เกิดการปรับใช้แบบอิสระ สภาพแวดล้อมเทคสแต็กที่ไม่เป็นเนื้อเดียวกัน และสถาปัตยกรรมที่เชื่อมโยงกันน้อยลง (และโปร่งใสน้อยลงในระหว่างนี้เนื่องจากลักษณะของแนวทางแบบอิงตามเหตุการณ์และแบบ pub-sub หากนำแนวทางเหล่านี้มาใช้) ความเรียบง่ายและประสิทธิภาพนั้นมีความใกล้เคียงกันและส่งผลกระทบอย่างมากต่อกันและกัน โดยทั่วไป สถาปัตยกรรมที่ซับซ้อนจะส่งผลกระทบต่อความเร็วในการพัฒนาฟีเจอร์ใหม่ รองรับและรักษาฟีเจอร์ที่มีอยู่ และท้าทายวิวัฒนาการตามธรรมชาติของระบบ
อย่างไรก็ตาม ระบบที่ซับซ้อนมักจะต้องใช้สถาปัตยกรรมที่ซับซ้อนและครอบคลุม ซึ่งเป็นสิ่งที่หลีกเลี่ยงไม่ได้
จริงๆ แล้วนี่เป็นหัวข้อที่กว้างมาก และมีแนวคิดดีๆ มากมายเกี่ยวกับวิธีจัดโครงสร้างและสร้างระบบสำหรับวิวัฒนาการตามธรรมชาติ จากประสบการณ์ของฉัน ฉันได้คิดแนวทางต่อไปนี้:
นอกจากนี้ การทำความเข้าใจตัวเลขและเมตริกต่างๆ เช่น DAU (ผู้ใช้รายวัน), MAU (ผู้ใช้รายเดือน), RPC (คำขอต่อวินาที) และ TPC (ธุรกรรมต่อวินาที) ก็มีความจำเป็นเช่นกัน เนื่องจากข้อมูลเหล่านี้อาจช่วยให้คุณตัดสินใจเลือกได้ เนื่องจากสถาปัตยกรรมสำหรับผู้ใช้ 100 รายที่ใช้งานอยู่จริงและผู้ใช้ 100 ล้านรายที่ใช้งานอยู่จริงนั้นแตกต่างกัน
ในหมายเหตุสุดท้ายนี้ ฉันอยากจะบอกว่าสถาปัตยกรรมมีผลกระทบอย่างมากต่อความสำเร็จของผลิตภัณฑ์ สถาปัตยกรรมที่ออกแบบมาไม่ดีสำหรับผลิตภัณฑ์นั้นจำเป็นสำหรับการปรับขนาด ซึ่งอาจนำไปสู่ความล้มเหลวได้ เนื่องจากลูกค้าจะไม่รอขณะที่คุณปรับขนาดระบบ พวกเขาจะเลือกคู่แข่ง ดังนั้น เราต้องก้าวไปข้างหน้าก่อนที่จะปรับขนาด ได้ แม้ว่าฉันจะยอมรับว่าบางครั้งอาจไม่ใช่แนวทางแบบลีน แต่แนวคิดก็คือการมีระบบที่ปรับขนาดได้แต่ยังไม่ปรับขนาดได้ ในทางกลับกัน การมีระบบที่ซับซ้อนมากและปรับขนาดได้อยู่แล้วโดยไม่มีลูกค้าหรือแผนในการได้ลูกค้าจำนวนมากนั้น จะทำให้คุณเสียเงินไปกับธุรกิจของคุณโดยเปล่าประโยชน์
การเลือกกลุ่มเทคโนโลยีถือเป็นการตัดสินใจในระดับมหภาคเช่นกัน เนื่องจากมีอิทธิพลต่อการจ้างงาน มุมมองวิวัฒนาการตามธรรมชาติของระบบ ความสามารถในการปรับขนาด และประสิทธิภาพของระบบ
นี่คือรายการข้อควรพิจารณาพื้นฐานในการเลือกกลุ่มเทคโนโลยี:
การมีเทคโนโลยีหลายชุดจะส่งผลต่อการเติบโตทางธุรกิจได้อย่างไร
จากมุมมองหนึ่ง การเพิ่มสแต็กอีกชุดหนึ่งอาจช่วยปรับขนาดการจ้างงานของคุณได้ แต่ในอีกด้านหนึ่ง จะทำให้มีค่าใช้จ่ายในการบำรุงรักษาเพิ่มขึ้น เนื่องจากคุณต้องรองรับสแต็กทั้งสองชุด ดังนั้น ดังที่ฉันได้กล่าวไว้ก่อนหน้านี้ ในมุมมองของฉัน ความต้องการเพิ่มเติมเท่านั้นที่ควรเป็นเหตุผลในการรวมสแต็กเทคโนโลยีเพิ่มเติม
แต่หลักการในการเลือกเครื่องมือที่ดีที่สุดสำหรับปัญหาเฉพาะเจาะจงคืออะไร?
บางครั้งคุณไม่มีทางเลือกอื่นนอกจากการนำเครื่องมือใหม่ๆ มาใช้เพื่อแก้ไขปัญหาเฉพาะโดยอิงจากการพิจารณาเช่นเดียวกับที่กล่าวข้างต้น ในกรณีเช่นนี้ การเลือกโซลูชันที่ดีที่สุดจึงเป็นเรื่องสมเหตุสมผล
การสร้างระบบที่ไม่ต้องเชื่อมโยงกับเทคโนโลยีเฉพาะมากเกินไปอาจเป็นเรื่องท้าทาย อย่างไรก็ตาม การพยายามหาเงื่อนไขที่ระบบไม่เชื่อมโยงกับเทคโนโลยีอย่างแน่นหนาก็มีประโยชน์ และจะไม่ล้มเหลวหากกรอบงานหรือเครื่องมือเฉพาะนั้นเสี่ยงต่ออันตรายหรือล้าสมัยในวันพรุ่งนี้
ข้อควรพิจารณาที่สำคัญอีกประการหนึ่งเกี่ยวข้องกับการพึ่งพาซอฟต์แวร์โอเพ่นซอร์สและซอฟต์แวร์ที่เป็นกรรมสิทธิ์ ซอฟต์แวร์ที่เป็นกรรมสิทธิ์ทำให้คุณมีความยืดหยุ่นน้อยลงและสามารถปรับแต่งได้น้อยลง อย่างไรก็ตาม ปัจจัยที่อันตรายที่สุดคือการผูกขาดกับผู้จำหน่าย ซึ่งคุณจะต้องพึ่งพาผลิตภัณฑ์ ราคา เงื่อนไข และแผนงานของผู้จำหน่าย ซึ่งอาจมีความเสี่ยงหากผู้จำหน่ายเปลี่ยนทิศทาง เพิ่มราคา หรือเลิกผลิตผลิตภัณฑ์ ซอฟต์แวร์โอเพ่นซอร์สช่วยลดความเสี่ยงนี้ เนื่องจากไม่มีหน่วยงานเดียวที่ควบคุม การกำจัดจุดล้มเหลวเดียวในทุกระดับเป็นกุญแจสำคัญในการสร้างระบบที่เชื่อถือได้สำหรับการเติบโต
จุดล้มเหลวจุดเดียว (SPOF) หมายถึงส่วนใดส่วนหนึ่งของระบบที่หากล้มเหลว จะทำให้ระบบทั้งหมดหยุดทำงาน การกำจัด SPOF ในทุกระดับถือเป็นสิ่งสำคัญสำหรับระบบใดๆ ที่ต้องการความพร้อมใช้งานสูง ทุกอย่าง รวมถึงความรู้ บุคลากร ส่วนประกอบของระบบ ผู้ให้บริการระบบคลาวด์ และสายอินเทอร์เน็ต อาจล้มเหลวได้
มีเทคนิคพื้นฐานหลายประการที่เราสามารถนำไปใช้เพื่อขจัดจุดล้มเหลวเพียงจุดเดียว:
ในบทความนี้ เราได้กล่าวถึงประเด็นสำคัญหลายประการ ของมาโคร และวิธีที่เราสามารถจัดการกับความซับซ้อนของประเด็นเหล่านั้นได้
ขอบคุณที่เข้ามาอ่านนะคะ เจอกันใหม่คราวหน้าค่ะ!