วิธีวาดไดอะแกรมสถาปัตยกรรมซอฟต์แวร์ (2022)
(terrastruct.com)- ไดอะแกรมสถาปัตยกรรมที่ดีช่วยให้การสื่อสารไอเดียและการทำงานร่วมกันคงอยู่ได้นาน ไม่ใช่ด้วยการตกแต่ง แต่ด้วย ระดับของการนามธรรมที่เหมาะสม, ความเป็นปัจจุบัน และการขจัดความกำกวม
- พื้นฐานคือ การลดระยะห่างระหว่างเพื่อนบ้านให้ต่ำที่สุด โดยวางองค์ประกอบที่เชื่อมต่อกันไว้ใกล้กัน และยิ่งไดอะแกรมมีขนาดใหญ่ ก็ยิ่งต้องลบและวาดใหม่ซ้ำไปมา
- ความสมมาตร ไม่ได้แค่สร้างความประทับใจที่ดูดี แต่ยังช่วยเสริมการสื่อความหมาย เช่น การวางอินพุตไว้คนละด้านกับเอาต์พุต
- หากรักษา การจัดกึ่งกลางของรูปทรง ไว้ได้ แม้แนวคิดที่ซับซ้อนก็ดูซับซ้อนน้อยลง และเมื่อเพิ่มองค์ประกอบใหม่ การจัดวางโดยรวมก็จะไม่เสียทรง
- กลุ่มคอนเทนเนอร์ ที่มีป้ายกำกับช่วยให้เห็นได้ในพริบตาเดียวถึงการแยกสภาพแวดล้อมอย่าง AWS และ Azure, การนามธรรมอย่าง implementation ของ ReaderWriter, และการจัดกลุ่มออบเจ็กต์ที่เกี่ยวข้องกันอย่าง Cores
เงื่อนไขของไดอะแกรมที่ใช้งานได้ยาวนาน
- ไดอะแกรมที่ดีจะไม่ถูกลบทิ้งหลังการประชุมจบลง แต่ยังคงถูกใช้ต่อเป็นจุดอ้างอิงสำหรับการอภิปรายและคำถามในภายหลัง
- ไดอะแกรมที่ใช้งานได้ยาวนานมีเงื่อนไขร่วมกันอยู่หลายข้อ
- องค์ประกอบต้องอยู่ใน ระดับของการนามธรรม ที่เหมาะสม
- ต้องรักษาให้เป็นปัจจุบันอยู่เสมอ
- ต้องไม่มีความกำกวม
- แม้จะเป็นเอนทิตีและความสัมพันธ์เดียวกัน ก็สามารถวาดได้หลายแบบ แต่บางเลย์เอาต์ช่วยให้ทีมทำงานร่วมกันตลอดช่วงโครงการ ขณะที่บางแบบก็หายไปพร้อมกับการประชุม
- ความงามที่พูดถึงในที่นี้ไม่ใช่การตกแต่งอย่างเงาหรือมุมโค้ง แต่คือ ความงามเชิงหน้าที่ ที่ช่วยถ่ายทอดความคิดได้อย่างมีประสิทธิภาพ
หลักการสร้างเลย์เอาต์ที่อ่านง่าย
-
การลดระยะห่างระหว่างเพื่อนบ้านให้ต่ำที่สุด
- หลักพื้นฐานคือวาดโหนดที่เชื่อมต่อกันให้อยู่ใกล้กัน
- ในไดอะแกรมขนาดเล็กอาจทำได้ง่าย แต่เมื่อไดอะแกรมใหญ่ขึ้นและมีการเพิ่มการเชื่อมต่อใหม่ คุณสมบัตินี้ก็พังได้ง่าย
- เหมือนเวลาพบ edge case ในโค้ดแล้วแก้ส่วนที่เกี่ยวข้อง หรือพบว่ามีรายการตกหล่นในเอกสารแล้วแก้ประโยค ไดอะแกรมสำหรับเอกสารก็ต้องพร้อมลบและวาดใหม่เมื่อจำเป็น
- ในสถานการณ์สัมภาษณ์ ต้นทุนของการวาดใหม่อาจเป็นภาระ แต่ถ้าเป็นเอกสารที่หลายคนหรือหลายทีมจะใช้ การปรับแก้ซ้ำ ๆ จะนำไปสู่ไดอะแกรมที่ดีกว่า
-
การมองหาความสมมาตร
- ความสมมาตร มีส่วนอย่างมากต่อความสวยงามของไดอะแกรม และสมองของมนุษย์มีแนวโน้มชอบความสมมาตรทางสายตาเหมือนกับใบหน้า
- ต่อให้ทุกโหนดอยู่ใกล้เพื่อนบ้านมากที่สุด หากขาดความสมมาตร ก็อาจดูเหมือนภาพที่เอียงนิด ๆ
- แม้ระยะห่างจากเพื่อนบ้านของบางโหนดจะเพิ่มขึ้นเล็กน้อย เวอร์ชันที่สมมาตรกว่าอาจยังดูดีกว่า
- วิธีวางอินพุตไว้ด้านหนึ่ง และเอาต์พุตไว้อีกด้านหนึ่ง ช่วยเสริมทั้งความสมมาตรและความหมายของไดอะแกรม
-
การจัดกึ่งกลาง
- การจัดแนว เป็นองค์ประกอบสำคัญที่ทำให้ไดอะแกรมดูเป็นระเบียบ
- ไดอะแกรมที่เป็นระเบียบทำให้แนวคิดชัดเจนขึ้น ส่วนไดอะแกรมที่รกทำให้แนวคิดดูซับซ้อนขึ้น
- หากเริ่มจากการวางรูปทรงแบบสุ่มลงบนแคนวาสว่างเปล่า เลย์เอาต์ในภายหลังก็มักจะมีแนวโน้มสุ่มตามไปด้วย
- การจัดแนวมีความหมายก็ต่อเมื่อมีรูปทรงตั้งแต่สองรูปขึ้นไป ดังนั้นถ้ารักษาการจัดแนวไว้ทุกครั้งที่เพิ่มองค์ประกอบใหม่ ไดอะแกรมก็จะค่อย ๆ ดูเรียบร้อยขึ้นเองตามธรรมชาติ
- หลายครั้งการจัดแนวเกิดขึ้นจากความสมมาตร แต่ก็ไม่เสมอไป
-
การใช้กลุ่มคอนเทนเนอร์
- การแบ่งไดอะแกรมออกเป็นหลายพื้นที่พร้อมป้ายกำกับ ช่วยให้ผู้อ่านเข้าใจโครงสร้างได้ง่ายขึ้น
- คอนเทนเนอร์สามารถเพิ่มข้อมูลต่อไปนี้ให้กับไดอะแกรมได้
- เพิ่ม บริบท เช่น “บริการเหล่านี้อยู่บน AWS และบริการเหล่านี้อยู่บน Azure”
- แสดง การนามธรรม เช่น “ทั้งหมดนี้คือ implementation ของ ReaderWriter”
- จัดกลุ่มออบเจ็กต์ที่เกี่ยวข้องกัน เช่น การรวม core 1, 2, 3, 4 ไว้ในคอนเทนเนอร์ “Cores”
หัวข้อที่จะต่อในตอนถัดไป
- Part 2 จะพูดต่อในหัวข้อต่อไปนี้
- การวาดเส้นทางของ edge
- ขนาดและตำแหน่งของป้ายกำกับ
- สี
- ไอคอน
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ผมชอบใช้ D2 ทำไดอะแกรมอยู่ คล้ายกับ mermaid.js แต่มีตัวเลือกการจัดรูปแบบมากกว่า และโดยส่วนตัวคิดว่าไวยากรณ์ก็ดีกว่า
เคยเขียนบทความสั้น ๆ เกี่ยวกับเรื่องนี้ไว้ด้วย: https://victorbjorklund.com/build-diagrams-as-code-with-d2-d...
เข้าใจว่าไดอะแกรมซอฟต์แวร์ที่หน้าตาไม่สวยอาจดูไม่เพลิน แต่การตกแต่งก็คล้ายกับการใส่เส้นโค้งลงในกราฟเส้น ถึงจะดูดีขึ้นทางสายตา แต่ไปรบกวนข้อมูลที่ต้องการสื่อ
เรนเดอร์ตัวอย่างแรก
x -> yเป็น SVG แล้วเปิดเฉพาะ SVG ในเบราว์เซอร์ และลองค้นหาทั้งเอกสารว่าจะจัดแนวเอาต์พุตอย่างไร แต่หาไม่เจอเพราะเอกสารแนะนำกับผลลัพธ์จริงไม่ตรงกัน เลยเลิกใช้ ค้นด้วย
"d2lang connection left to right"แล้วไปถึง https://d2lang.com/tour/layouts/ ซึ่งดูเหมือนไม่ได้ลิงก์จากเอกสารภาพรวม ถ้าเพิ่มไว้ก็น่าจะช่วยผู้เข้าชมได้ถ้าจำกัดเฉพาะโฟลว์ชาร์ต ผมมองว่าเป็นหนึ่งในเครื่องมือไดอะแกรมแบบข้อความที่ง่ายและเร็วที่สุดเท่าที่เคยใช้มา
เมื่อระบบเริ่มเปลี่ยน ไดอะแกรมสวย ๆ จะดูแลรักษายากมาก ลองนึกภาพว่าต้องเพิ่มกล่องใหม่กลางไดอะแกรมที่ซับซ้อนอยู่แล้ว อาจต้องใช้เวลาหนึ่งชั่วโมงเพื่อจัดทุกอย่างใหม่
เวลาของนักพัฒนาในยุค 2020s น่าจะเอาไปใช้กับการจัดการไดอะแกรมแบบโค้ดดีกว่า: https://www.ilograph.com/blog/posts/its-time-to-drop-drag-an...
แต่เอาเข้าจริงเหมือนจะไม่ใช่มุกแล้ว
ที่แย่กว่านั้นคือพอเพิ่มกล่องใหม่ โดยปกติต้องจัดลูกศรใหม่ทั้งหมด ผลคือไดอะแกรมไม่สามารถคงสภาพอัปเดตล่าสุดได้อย่างต่อเนื่อง
สำหรับ sequence diagram ตอนใช้ plantML ดีกว่า งานเองทำง่ายกว่า ผลลัพธ์จากอินเทอร์พรีเตอร์โดยทั่วไปก็ใช้งานได้โดยแทบไม่ต้องปรับเอง
คล้ายกับ UI ที่หน้าตาไม่สวย ต่อให้ไม่สวย ผู้ใช้ก็ชินไปแล้ว ทันทีที่ไป “จัดระเบียบ” ก็เท่ากับทำลาย เมนทัลโมเดล ของพวกเขาและบังคับให้เรียนรู้ใหม่
บางครั้งก็เป็นแค่สเก็ตช์เพื่อจัดระเบียบความคิด แล้วทิ้งในอีก 20 นาที
แต่ถ้าเป็นเอกสารอ้างอิงสำหรับ onboarding หรืออธิบายระบบให้ทีมอื่นฟัง เวลาอีกหนึ่งชั่วโมงที่ใช้ทำให้เข้าใจง่ายขึ้นก็อาจคุ้มค่าเต็มที่
เวลาเขียนอะไรแบบนี้ใช้ yEd ต่อให้ทำกล่องกับลูกศรเละเทะ แค่คลิกในเมนูไม่กี่ครั้งก็จัดให้เองได้
แต่ก็ต้องยอมประนีประนอมบ้าง กล่องซ้อนในกล่องไม่ได้จบสวยเสมอไป ถึงอย่างนั้นก็ทำเอกสารได้เร็วขึ้นมาก และพอลองทำไปไม่กี่ครั้งก็จะพอรู้ว่าอะไรเวิร์กไม่เวิร์ก สำหรับผมจึงเป็นทางสายกลางที่รับได้
แค่ดึงความสัมพันธ์ออกมาเป็น TGF แล้วนำเข้า จากนั้นใช้เลย์เอาต์แบบลำดับชั้นก็พอ
รูปแบบ
from, to, relationก็เพียงพอแล้วเรื่องนี้มีความคล้ายคลึงอย่างมากกับแผนผังไฟฟ้า ไดอะแกรมวงจร และแบบวิศวกรรมอื่น ๆ ไม่มีวิธีที่ “ถูกต้อง” เพียงหนึ่งเดียว
เช่นเดียวกับโค้ด ความสามารถในการเลือก ระดับนามธรรมและวิธีนำเสนอ ที่ดี คือสิ่งที่แบ่งแยกระหว่างไอเดียที่เข้าใจได้กับความยุ่งเหยิงชวนเสียใจ ไม่ใช่เรื่องของความงามหรือสุนทรียศาสตร์ แต่เป็นเครื่องมือที่ต้องอาศัยความคิดและความพยายามเชิงรุกในการออกแบบ
อยากมีเครื่องมือที่ซูมเข้าไปในไดอะแกรมได้ง่าย ๆ เหมือนแอนิเมชันซูมไม่รู้จบ
เร็ว ๆ นี้จะเปิดตัว https://VisualFlows.io v1.0
สามารถสร้างแผนที่ “สถาปัตยกรรม” แบบแอนิเมชันของ SaaS บริษัทแม่ได้ในไม่กี่นาที: https://app.visualsitemaps.com/user_flows/share/e64da8ed-2ef...
ฟีเจอร์หลักได้แก่ Smart Sections, Smart Edges, Smart Node Deletion, โหมดมืด/สว่าง, การ embed, ลากแล้ววางรูปภาพ/SVG/GIF, ไอคอน AWS/Windows/Google และ Markdown ที่มีกำหนดมาในสัปดาห์หน้า เป็นต้น
ดู Smart Sections: https://support.visualsitemaps.com/en/articles/6477269-how-t...
บทความนี้ดีมากจริง ๆ เวลาวาดไดอะแกรมสถาปัตยกรรม หรือเขียนเอกสาร·โค้ด หรือทำอะไรสักอย่างในงาน ผมพยายามใช้เวลาสักพักทำให้มัน “ดูดี”
อธิบายยากว่าทำไม แต่รู้ว่าพอได้เห็นแล้วจะชอบมันมากขึ้น
เคยกังวลนิดหน่อยว่านั่นอาจไม่ใช่วิธีใช้เวลาที่ดีที่สุด แต่ก็ไม่เคยมีใครบอกว่าอย่าทำ
เหตุผลที่บทความนี้ดีคือมันอธิบายสิ่งที่เคยทำตามสัญชาตญาณออกมาเป็น วิธีปฏิบัติจริง ในการทำให้อะไรสักอย่างสวยขึ้น
เวลาเห็นเพื่อนร่วมทีมที่ดูเหมือนไม่มีเซนส์ด้านภาพของโค้ดแล้วผมรู้สึกงง เช่น ไม่เว้นบรรทัดว่างระหว่างท้ายฟังก์ชันกับการประกาศฟังก์ชันถัดไป หรือเขียนพารามิเตอร์ใน function signature แบบบรรทัดละตัวบ้าง หลายตัวต่อบรรทัดบ้างสลับไปมา มันสะดุดตามากสำหรับผม แต่พวกเขาดูไม่สนใจ
บางครั้งก็ใช้เวลา แต่มีความรู้สึกเหมือนบางอย่างได้รับการเติมเต็ม รู้ตัวว่ามีพรสวรรค์ด้านศิลปะเชิงเทคนิคอยู่พอสมควร และตอนมัธยมปลายเคยอยากเป็นช่างเขียนแบบ
นี่คือเป้าหมายของการทำ visualization โดยแท้
D2 เหมาะกับงานแบบนี้ ในบทบาทก่อนหน้านี้ผมเขียนโปรแกรมที่ parse ไฟล์
serverless.ymlทั้งหมดแล้วสร้างไดอะแกรม D2 ขนาดใหญ่โดยอัตโนมัติตอนนั้นทำ microservices บน AWS และมันดีตรงที่อัปเดตอัตโนมัติเมื่อระบบโตขึ้น ผมทำให้สามารถแยกเป็นไดอะแกรมย่อยเล็ก ๆ ตามแต่ละ subsystem ได้ เช่น แบ่งตาม SNS topic
ผมไม่เข้าใจตัวอย่างแรก ผู้เขียนพูดถึง node ที่ไม่ได้วางแผนไว้ แล้วตั้งชื่อจริง ๆ ว่า “I was unplanned” จากนั้นก็บอกว่า “ถ้าวางแผนไว้ล่วงหน้า”
ในบริบทของไดอะแกรม ผมไม่รู้ว่าจะวางแผน สิ่งที่ไม่ได้วางแผน ล่วงหน้าได้อย่างไร สงสัยว่าหมายถึงควรเว้นพื้นที่ว่างรอบ ๆ ทุก node ให้พอหรือเปล่า
นอกจากนี้ ข้อเสนอปรับปรุงที่ให้มาทำให้ดูเหมือนว่า “something” กับ “I was unplanned” ใช้ช่องทางหรือกลไกเดียวกันในการโต้ตอบกับ “engine”
ใช้ Miro อยู่ สำหรับเนื้อหาระดับสูงหรือการระดมไอเดีย เครื่องมือ post-it ก็ค่อนข้างดี แต่ไม่ได้ไปไกลเกินระดับกลาง
หลังจากกำหนด component และ system แล้ว ก็มีเครื่องมือที่เหมาะกับงานนั้นมากกว่า
ถ้าเอกสารโปรเจกต์เป็น Markdown ก็ไม่ต้องใช้ไบนารีแยกต่างหาก แค่ใส่บล็อก ```plantuml เพื่อแทรกไดอะแกรมได้เลย
ใน GitLab เวลาเปิดดูไฟล์
.mdด้วยเบราว์เซอร์ จะ render ออกมาสวยงาม GitHub ยังไม่มีฟีเจอร์นั้นhttps://docs.github.com/en/get-started/writing-on-github/wor...
https://pikchr.org/home/doc/trunk/doc/usepikchr.md