แนวปฏิบัติด้านความถูกต้องของระบบที่ Amazon Web Services
(cacm.acm.org)- AWS ยึดความถูกต้องของระบบเป็นรากฐานสำคัญเพื่อรักษา ความปลอดภัย·ความทนทาน·ความสมบูรณ์·ความพร้อมใช้งาน และได้ขยายขอบเขตการใช้งานจากจุดเริ่มต้นอย่าง TLA+ ไปสู่ model checking, fuzzing, property-based testing, runtime verification และ formal proof
- TLA+ ช่วยกำจัดบั๊กที่การทดสอบแบบดั้งเดิมจับได้ยากตั้งแต่ช่วงต้น และทำให้มั่นใจในการปรับแต่งประสิทธิภาพ แต่เพื่อให้เข้าถึงได้ง่ายขึ้นสำหรับนักพัฒนา จึงมีการนำเครื่องมืออย่าง ภาษาโปรแกรม P และ PObserve มาใช้ร่วมกัน
- Property-based testing ของ S3 ShardStore, deterministic simulation และ SQL fuzzing ของ Aurora Limitless Database เป็นตัวอย่างที่ดึง formal methods ให้เข้าใกล้การพัฒนาและการทดสอบ integration ในชีวิตประจำวันมากขึ้น
- Fault Injection Service ฉีดความขัดข้อง เช่น ข้อผิดพลาดของ API, การหยุด I/O ชั่วคราว และ instance failure เพื่อยืนยันกลไก resilience โดย Amazon.com ได้รันการทดลองบน FIS 733 รายการในกระบวนการเตรียม Prime Day 2024
- ในพื้นที่ที่ขอบเขตความปลอดภัยและการปรับแต่งประสิทธิภาพมีความสำคัญ เช่น Cedar, Firecracker และการปรับแต่ง RSA บน Graviton 2 มีการใช้ formal proof ขณะที่ learning curve ที่สูงและการเข้าถึงเครื่องมือยังคงเป็นข้อจำกัดต่อการนำไปใช้
วิธีที่ AWS จัดการกับความถูกต้องของระบบ
- AWS ต้องรักษามาตรฐานสูงด้าน ความปลอดภัย, ความทนทาน, ความสมบูรณ์, ความพร้อมใช้งาน เพื่อให้บริการที่ลูกค้าไว้วางใจได้ และความถูกต้องของระบบคือสิ่งที่รองรับเรื่องนี้
- บทความ “How Amazon Web Services Uses Formal Methods” ใน CACM ปี 2015 แนะนำแนวทางเพื่อรับประกันความถูกต้องของบริการหลักของ AWS และหลังจากนั้นบริการเหล่านี้ก็ถูกใช้อย่างแพร่หลายในหมู่ลูกค้า AWS
- เครื่องมือหลักในช่วงแรกคือภาษา formal specification TLA+ ที่พัฒนาโดย Leslie Lamport
- ช่วยค้นพบและกำจัดบั๊กละเอียดอ่อนที่การทดสอบแบบดั้งเดิมอาจพลาด ตั้งแต่ช่วงต้นของการพัฒนา
- ให้ความมั่นใจว่าสามารถทำ performance optimization เชิงรุกได้โดยยังคงรักษาความถูกต้องของระบบ
- เมื่อ 15 ปีก่อน แนวปฏิบัติด้านการทดสอบของ AWS พึ่งพา unit test ณ เวลา build เป็นหลัก และ integration test ณ เวลา deploy ที่มีขอบเขตจำกัด
- หลังจากนั้น AWS ได้ผนวก formal methods และ semi-formal methods เข้ากับกระบวนการพัฒนา
- theorem proving, deductive verification, model checking
- property-based testing, fuzzing, runtime monitoring
ภาษาโปรแกรม P และ PObserve
- เมื่อ AWS ขยาย formal methods ออกไปนอกทีมแรก ๆ ในช่วงต้นทศวรรษ 2010 ก็พบว่าวิศวกรจำนวนมากประสบความยากลำบากในการ เรียนรู้ TLA+ และทำให้ใช้งานได้อย่างมีประสิทธิผล
- จุดแข็งของ TLA+ คือเป็นภาษานามธรรมระดับสูงที่ใกล้เคียงคณิตศาสตร์ แต่ก็กลายเป็นกำแพงในการเข้าถึงสำหรับนักพัฒนาที่คุ้นเคยกับภาษา imperative
- ภาษา P ซึ่งเป็นภาษาแบบ state machine สำหรับการทำแบบจำลองและวิเคราะห์ระบบกระจาย ช่วยลดช่องว่างนี้
- นักพัฒนาทำแบบจำลองการออกแบบระบบเป็น state machine ที่สื่อสารกัน
- mental model นี้คุ้นเคยกับนักพัฒนา Amazon ที่ทำงานกับ microservices และ service-oriented architecture (SOA) เป็นจำนวนมาก
- P ได้รับการพัฒนาที่ AWS ตั้งแต่ปี 2019 และยังคงดูแลในฐานะโปรเจกต์โอเพนซอร์สเชิงกลยุทธ์
- ทีมผลิตภัณฑ์หลักหลายทีมของ AWS ใช้ P เพื่อตรวจสอบความถูกต้องของการออกแบบระบบ
- สตอเรจ: Amazon S3, EBS
- ฐานข้อมูล: Amazon DynamoDB, MemoryDB, Aurora
- คอมพิวต์: EC2, IoT
- S3 ใช้ P ในกระบวนการย้ายจาก eventual consistency ไปสู่ strong read-after-write consistency
- ระบบย่อยดัชนีของ S3 เป็นที่เก็บ metadata ของออบเจ็กต์ที่ช่วยให้ค้นคืนข้อมูลได้อย่างรวดเร็ว
- เพื่อให้ได้ consistency ที่แข็งแกร่ง จำเป็นต้องปรับเปลี่ยนหลายส่วนที่ไม่ใช่เรื่องง่ายใน protocol stack ของดัชนี S3
- P ช่วยทำ formal modeling และ verification ของการออกแบบโปรโตคอล เพื่อกำจัดบั๊กระดับการออกแบบตั้งแต่ต้น และช่วยยืนยัน optimization ที่มีความเสี่ยงด้วย model checking
- ในปี 2023 ทีม AWS P ได้สร้าง PObserve
- ใช้ structured logs จากการรันของระบบกระจาย
- ตรวจสอบย้อนหลังว่า log สอดคล้องกับพฤติกรรมที่ formal P specification ของระบบอนุญาตหรือไม่
- ลดช่องว่างระหว่าง implementation ระดับ production ที่เขียนด้วยภาษาอย่าง Rust หรือ Java กับ P specification ณ เวลาออกแบบ
- เชื่อม verification ณ เวลาออกแบบเข้ากับ runtime monitoring ของ implementation เพื่อเพิ่มคุณค่าของการลงทุนใน formal specification
วิธีผูก formal methods แบบเบาเข้ากับ flow การพัฒนา
- AWS นำ lightweight formal methods มาใช้เพื่อดึง formal methods ให้เข้าใกล้ flow การพัฒนาและทดสอบของทีมวิศวกรมากขึ้น
-
Property-based testing
- ShardStore ของ Amazon S3 ใช้ property-based testing เพื่อทดสอบความถูกต้องและเพิ่มความเร็วการพัฒนาตลอดวงจรการพัฒนา
- ใช้หลายเทคนิคร่วมกันเพื่อให้มนุษย์ระบุพฤติกรรมที่คาดหวัง และให้การทดสอบอัตโนมัติสำรวจ input และเงื่อนไข failure ได้มากขึ้น
- specification ด้านความถูกต้องที่นักพัฒนาจัดเตรียม
- coverage-guided fuzzing ที่ใช้ตัวชี้วัด code coverage เพื่อชี้นำการกระจายของ input
- fault injection ที่จำลองความล้มเหลวของฮาร์ดแวร์และระบบอื่น ๆ ระหว่างการทดสอบ
- minimization ที่ย่อตัวอย่างโต้แย้งโดยอัตโนมัติเพื่อให้มนุษย์ debug ได้ง่ายขึ้น
-
Deterministic simulation
- deterministic simulation testing รันระบบกระจายใน single-threaded simulator และควบคุมแหล่งที่มาของความสุ่มทั้งหมด
- thread scheduling
- timing
- ลำดับการส่งมอบข้อความ
- นักพัฒนาสามารถเขียน scenario ของ failure หรือ success เฉพาะ เช่น สถานการณ์ที่ participant ล้มเหลวในขั้นตอนหนึ่งของ distributed protocol
- เนื่องจาก testing framework ควบคุม nondeterminism จึงสามารถระบุลำดับการรันที่น่าสนใจ เช่น ลำดับที่เคยทำให้เกิดบั๊กในอดีตได้
- scheduler สามารถขยายไปสู่ order fuzzing หรือการสำรวจลำดับที่เป็นไปได้ทั้งหมด
- ย้ายการทดสอบคุณสมบัติของระบบในสถานการณ์ delay และ failure ให้เข้าใกล้ เวลา build มากกว่า integration test ทำให้การพัฒนาเร็วขึ้นและขยาย behavior coverage
- งานบางส่วนของ AWS เกี่ยวกับการทดสอบลำดับ thread และ system failure ณ เวลา build ถูกโอเพนซอร์สเป็นโปรเจกต์ shuttle และ turmoil
- deterministic simulation testing รันระบบกระจายใน single-threaded simulator และควบคุมแหล่งที่มาของความสุ่มทั้งหมด
-
Continuous fuzzing และการสร้าง input ทดสอบแบบสุ่ม
- continuous fuzzing โดยเฉพาะการสร้าง input ทดสอบที่ขยายขนาดได้แบบ coverage-guided มีประสิทธิภาพสำหรับการทดสอบความถูกต้องของระบบ ณ เวลา integration
- ในการพัฒนา Aurora Limitless Database ซึ่งเป็นฟีเจอร์ data sharding ของ Amazon Aurora มีการใช้ fuzzing อย่างกว้างขวางเพื่อตรวจสอบคุณสมบัติหลักสองประการ
- fuzz SQL query และ transaction ทั้งหมด เพื่อตรวจสอบว่าการแบ่งตรรกะการรัน SQL ข้าม shard ถูกต้องหรือไม่
- สังเคราะห์ SQL schema, dataset และ query แบบสุ่มจำนวนมากเพื่อรันบน engine ที่กำลังทดสอบ แล้วเปรียบเทียบผลกับ oracle ที่อิง engine แบบไม่ทำ sharding
- ใช้วิธี verification อื่น ๆ ร่วมด้วย เช่น แนวทางที่ SQLancer บุกเบิก
- การผสาน fuzzing กับ fault injection testing มีประโยชน์ต่อมิติความถูกต้องของฐานข้อมูล เช่น atomicity, consistency, isolation
- สร้าง transaction อัตโนมัติ
- กำหนดพฤติกรรมที่ถูกต้องด้วย correctness oracle ที่ระบุแบบ formal
- รัน interleaving ที่เป็นไปได้ของ transaction และ statement ภายใน transaction บนระบบที่ทดสอบ
- ตรวจสอบคุณสมบัติย้อนหลัง เช่น isolation ตามแนวทางอย่าง Elle
Fault Injection Service และการตรวจสอบสถานการณ์ความขัดข้อง
- AWS เปิดตัว Fault Injection Service(FIS) เมื่อต้นปี 2021 เพื่อให้ลูกค้า AWS หลากหลายกลุ่มใช้การทดสอบแบบ fault injection ได้
- FIS สามารถฉีดความขัดข้องจำลองเข้าไปในการ deploy ระดับทดสอบหรือ production ของโครงสร้างพื้นฐาน AWS ได้
- ข้อผิดพลาดของ API
- การหยุด I/O ชั่วคราว
- instance ที่ล้มเหลว
- Fault injection ช่วยตรวจสอบว่ากลไก resilience ที่สร้างไว้ในสถาปัตยกรรมช่วยปรับปรุง availability ได้จริง และไม่สร้างปัญหาความถูกต้องใหม่
- failover
- health check
- การทดสอบ fault injection บน FIS ถูกใช้อย่างแพร่หลายทั้งโดยลูกค้า AWS และภายใน Amazon
- Amazon.com รันการทดลอง fault injection บน FIS 733 รายการในกระบวนการเตรียม Prime Day 2024
- ในปี 2014 Yuan และคณะวิเคราะห์ว่าความขัดข้องร้ายแรง 92% ของระบบกระจายที่ทดสอบ ถูกกระตุ้นจากการจัดการข้อผิดพลาดที่ไม่ร้ายแรงอย่างไม่ถูกต้อง
- เหตุผลที่ความขัดข้องร้ายแรงบน normal path พบได้น้อย คือ normal path ถูกใช้งานบ่อยกว่า ถูกทดสอบดีกว่า และเรียบง่ายกว่า error path มาก
- Fault injection testing และ FIS ทำให้ทดสอบพฤติกรรมของระบบในสถานการณ์ fault และ failure ได้ง่ายขึ้น จึงลดช่องว่างความหนาแน่นของบั๊กระหว่าง normal path กับ error path
- ตัว fault injection เองไม่ถือเป็น formal method แต่สามารถผสานกับ formal specification ได้
- กำหนดพฤติกรรมที่คาดหวังด้วย formal specification
- เปรียบเทียบผลลัพธ์ระหว่างและหลัง fault injection กับพฤติกรรมที่ระบุไว้
- สามารถจับบั๊กได้มากกว่าวิธีที่ตรวจเฉพาะ metric กับ log error หรือให้มนุษย์ตัดสินด้วยสายตา
Metastability และพฤติกรรมระบบแบบ emergent
- ในช่วง 10 ปีที่ผ่านมา ความสนใจต่อความล้มเหลวของระบบบางประเภทอย่าง metastable failures เพิ่มขึ้น
- metastable failure คือความล้มเหลวที่ trigger เช่น overload หรือการล้าง cache ผลักระบบกระจายเข้าสู่สถานะที่ไม่สามารถฟื้นตัวได้หากไม่มีการแทรกแซง
- ตัวอย่างการแทรกแซงคือการลดโหลดให้ต่ำกว่าระดับปกติ
- ความล้มเหลวประเภทนี้เป็นหนึ่งในปัจจัยสำคัญที่ทำให้ระบบคลาวด์ไม่พร้อมใช้งาน
- ในพฤติกรรม metastable ทั่วไป เมื่อโหลดเพิ่มขึ้น goodput จะเพิ่มขึ้นในช่วงแรก จากนั้นอิ่มตัว ผ่าน congestion และ goodput ลดลงเป็น 0 หรือใกล้ 0
- หลังจากนั้น ระบบไม่สามารถกลับสู่สถานะสุขภาพดีได้ด้วยการลดโหลดเพียงเล็กน้อย แต่ต้องลดโหลดลงอย่างมากจึงจะฟื้นตัวได้
- พฤติกรรมนี้อาจเกิดขึ้นได้แม้ในระบบเรียบง่าย และในระบบส่วนใหญ่ก็อาจถูกกระตุ้นได้จาก logic ฝั่ง client แบบ retry หลัง timeout
- formal modeling ของระบบกระจายแบบดั้งเดิมมักเน้น safety และ liveness แต่ metastable failure แสดงให้เห็นว่ามีพฤติกรรมที่ไม่เข้ากับการจัดประเภทนี้อย่างเรียบร้อย
- AWS ใช้ discrete-event simulation มากขึ้นเพื่อทำความเข้าใจพฤติกรรมระบบแบบ emergent
- ลงทุนใน custom system simulation
- ลงทุนในเครื่องมือที่ทำให้สามารถนำ model ระบบเดิมที่สร้างด้วยภาษาอย่าง TLA+ และ P ไปใช้กับ simulation ได้
- หากขยาย exhaustive model checker อย่าง TLC ของ TLA+ ด้วย stochastic simulation ก็สามารถสร้างผลลัพธ์เชิงสถิติ เช่น distribution ของ latency ภายหลังได้
- การขยายเหล่านี้ทำให้สามารถใช้ model checking กับงานอย่างการทำความเข้าใจความเป็นไปได้ในการบรรลุ SLA ด้าน latency
ขอบเขตความปลอดภัยที่ต้องใช้ formal proof
- ในขอบเขตความปลอดภัยที่สำคัญ เช่น authorization และ virtualization formal methods ที่กล่าวมาก่อนหน้าอาจไม่เพียงพอ และ correctness proof มีคุณค่าน่าลงทุนสูง
-
ภาษา policy authorization Cedar
- AWS เปิดตัวภาษา policy authorization Cedar ในปี 2023 สำหรับการเขียน policy ที่ระบุสิทธิ์แบบละเอียด
- Cedar ออกแบบโดยคำนึงถึง automated reasoning และ formal proof
- implementation สร้างด้วยภาษาโปรแกรม Dafny ที่เป็นมิตรต่อ verification
- ผ่าน Dafny จึงพิสูจน์ได้ว่า implementation ตอบสนองคุณสมบัติด้านความปลอดภัยหลายประการ
- proof นี้เป็น proof ในความหมายทางคณิตศาสตร์ที่ไปไกลกว่าการทดสอบ
- ทีมยังใช้ differential testing โดยใช้โค้ด Dafny เป็น correctness oracle เพื่อตรวจสอบความถูกต้องของ implementation ภาษา Rust ที่พร้อมสำหรับ production
- AWS เปิดซอร์สโค้ด Dafny และขั้นตอนการทดสอบควบคู่กับ implementation ของ Cedar เพื่อให้ผู้ใช้ตรวจสอบงานด้านความถูกต้องได้
-
Firecracker VMM
- virtual machine monitor Firecracker ใช้โปรโตคอลระดับต่ำชื่อ virtio เพื่อเปิดเผยอุปกรณ์ฮาร์ดแวร์จำลอง เช่น network card หรือ SSD ให้กับ guest kernel ภายใน VM
- อุปกรณ์จำลองนี้เป็นปฏิสัมพันธ์ที่ซับซ้อนที่สุดระหว่าง guest ที่ไม่น่าเชื่อถือกับ host ที่เชื่อถือได้ จึงเป็นขอบเขตความปลอดภัยที่สำคัญ
- ทีม Firecracker ใช้ Kani ซึ่งสามารถ reason โค้ด Rust แบบ formal เพื่อพิสูจน์คุณสมบัติหลักของขอบเขตความปลอดภัยนี้
- proof นี้รับประกันว่าไม่ว่า guest จะพยายามทำอะไร คุณสมบัติสำคัญของขอบเขตดังกล่าวจะยังคงอยู่
- AWS สนับสนุนการพัฒนาเครื่องมือพื้นฐาน เช่น Kani, Dafny, Lean และ SMT solver ที่ขับเคลื่อนเครื่องมือเหล่านี้
- formal model และ specification ถูกนำกลับมาใช้ซ้ำหลายรูปแบบ
- model checking ณ เวลาออกแบบ
- ทำหน้าที่เป็น correctness oracle ใน runtime monitoring
- simulation ของพฤติกรรมระบบแบบ emergent
- การสร้าง proof ของคุณสมบัติหลัก
ผลด้านประสิทธิภาพและต้นทุนที่เกินกว่าความถูกต้อง
- formal methods ยังสำคัญต่อการปรับปรุงประสิทธิภาพของระบบคลาวด์อย่างปลอดภัย
- จากการทำแบบจำลอง core commit protocol ของ Aurora relational database engine ด้วย P และ TLA+ พบโอกาสลดต้นทุน distributed commit จาก 2 network round trips เหลือ 1.5 network round trips โดยไม่แลกกับคุณสมบัติด้าน safety
- ผลลัพธ์เช่นนี้พบได้บ่อยในทีมที่นำ formal methods มาใช้
- กระบวนการคิดอย่างลึกซึ้งและเขียน distributed protocol แบบ formal บังคับให้เกิดการคิดอย่างมีโครงสร้าง
- ให้ insight ที่ลึกขึ้นเกี่ยวกับโครงสร้างของ protocol และปัญหาที่ต้องแก้
- หากสามารถตรวจสอบหรือพิสูจน์แบบ formal ได้ว่า design optimization ที่เสนอถูกต้อง วิศวกรระบบกระจายก็สามารถเลือก design ที่กล้าขึ้นได้โดยไม่เพิ่มความเสี่ยง
- ประสิทธิภาพการผลิตและผลด้านต้นทุนไม่ได้จำกัดอยู่แค่ design optimization ระดับสูง
- ทีม AWS สามารถค้นพบการปรับแต่ง implementation ของ RSA public-key cryptography บนโปรเซสเซอร์ Graviton 2 ที่ใช้ ARM ซึ่งช่วยปรับปรุง throughput ได้สูงสุด 94%
- ใช้ interactive theorem prover HOL Light เพื่อพิสูจน์ความถูกต้องของ optimization นี้
- เนื่องจาก CPU cycle ของคลาวด์ในสัดส่วนสูงถูกใช้กับการเข้ารหัส optimization เช่นนี้จึงช่วยลดต้นทุนโครงสร้างพื้นฐาน สนับสนุนความยั่งยืน และปรับปรุงประสิทธิภาพที่ลูกค้ารับรู้ได้
โจทย์ที่ยังเหลือและโอกาสในอนาคต
- ตลอด 15 ปีที่ผ่านมา AWS ประสบความสำเร็จในการขยายวิธีทดสอบแบบ formal และ semi-formal แต่การนำไปใช้ในอุตสาหกรรมยังมีโจทย์อยู่
- อุปสรรคหลักของเครื่องมือ formal methods คือ learning curve ที่ชัน และความต้องการความรู้เฉพาะโดเมน
- เครื่องมือจำนวนมากยังมีลักษณะเชิงวิชาการและขาด interface ที่เป็นมิตรกับผู้ใช้
- แม้แนวทาง semi-formal ที่ตั้งหลักได้ดีแล้วก็ยังมีอุปสรรคต่อการนำไปใช้
- deterministic simulation เป็นเทคนิคทดสอบระบบกระจายหลักที่ใช้สำเร็จใน AWS และโปรเจกต์อย่าง FoundationDB แต่บางครั้งยังไม่คุ้นเคยแม้กับนักพัฒนาระบบกระจายที่มีประสบการณ์ซึ่งเข้าร่วม AWS
- ช่องว่างคล้ายกันมีอยู่ใน methodology ที่พิสูจน์แล้ว เช่น fault injection testing, property-based testing และ fuzzing
- จำเป็นต้องให้ความรู้แก่นักพัฒนาระบบกระจายเกี่ยวกับวิธีและเครื่องมือทดสอบเหล่านี้ และสอนวิธีคิดที่ rigor
- ช่องว่างด้านการศึกษาเริ่มตั้งแต่ระดับวิชาการ
- แม้แต่แนวทาง formal reasoning ขั้นพื้นฐานก็ยังไม่ค่อยถูกสอน
- ผู้สำเร็จการศึกษาจากสถาบันชั้นนำก็ยังนำเครื่องมือเหล่านี้ไปใช้ได้ยาก
- formal methods และ automated reasoning สำคัญต่อการประยุกต์ใช้ในอุตสาหกรรม แต่ยังถูกมองว่าเป็นสาขาเฉพาะทาง
- metastability และคุณสมบัติ emergent อื่น ๆ ของระบบขนาดใหญ่ก็เป็นพื้นที่วิจัยสำคัญที่มีโจทย์ด้านการรับรู้คล้ายกัน
- แนวปฏิบัติที่อาจก่อให้เกิดพฤติกรรมระบบแบบ metastable เช่น “retry N ครั้งเมื่อ timeout” ยังคงถูกแนะนำอย่างแพร่หลายแม้จะเป็นปัญหาที่ทราบกันแล้ว
- เครื่องมือและเทคนิคปัจจุบันสำหรับทำความเข้าใจพฤติกรรมระบบแบบ emergent ยังอยู่ในช่วงเริ่มต้น
- การทำ modeling ความเสถียรของระบบมีต้นทุนสูงและซับซ้อน
- AWS มองว่า large language model และ AI assistant จะช่วยบรรเทาปัญหาการนำ formal methods ไปใช้ในทางปฏิบัติได้มาก
- เช่นเดียวกับ AI-assisted unit testing ที่ได้รับความนิยม สิ่งเหล่านี้อาจช่วยนักพัฒนาสร้าง formal model และ specification
- เทคนิคขั้นสูงอาจเข้าถึงได้สำหรับชุมชนนักพัฒนาที่กว้างขึ้น
กรอบความถูกต้องที่ AWS ลงทุนต่อเนื่อง
- การสร้างซอฟต์แวร์ที่เชื่อถือได้และปลอดภัยต้องอาศัยแนวทางหลากหลายในการ reason เกี่ยวกับความถูกต้องของระบบ
- AWS นำหลายเทคนิคมาใช้ควบคู่กับการทดสอบมาตรฐานอุตสาหกรรม เช่น unit test และ integration test
- model checking
- fuzzing
- property-based testing
- fault injection testing
- deterministic simulation
- event-based simulation
- runtime verification ของ execution trace
- formal specification มีบทบาทสำคัญในฐานะ test oracle ที่ให้คำตอบที่ถูกต้องสำหรับแนวปฏิบัติด้านการทดสอบหลายอย่างของ AWS
- correctness testing และ formal methods ยังคงเป็นพื้นที่ลงทุนหลักของ AWS โดยอิงจากผลตอบแทนจากการลงทุนที่ได้รับแล้ว
ยังไม่มีความคิดเห็น