
จากบทความเรื่อง AI Engineering Skills Map ที่ผ่านมา ของ DeepLearning.AI
ได้เพิ่ม skill ย่อยที่จำเป็นในส่วนของ Software Engineering Fundamentals เข้ามา
ประกอบไปด้วย
- Building full-stack applications
- Managing data
- Designing system architectures
- Making systems secure and reliable
- Scaling and operating in production
มาดูรายละเอียดกันหน่อย
เรื่องแรกคือ Building full-stack applications
ถ้าเรามีความรู้และเข้าใจ ขั้นตอนการทำงานแบบ full stack
ตั้งแต่ frontend, backend และ data
เข้าใจเรื่องของ UI component, page rendering, caching และ statement management
เข้าใจเรื่องการออกแบบและเลือกใช้ API
เข้าใจเรื่องของ authentication and authorization
เข้าใจการทำงานแบบ sync และ async
เข้าใจการจัดเก็บข้อมูล รวมทั้ง data modeling
จนถึงการ testing ทั้ง functional และ non-functional
จะเป็นความรู้พื้นฐานที่ดี ที่จะนำไปใช้ใน AI นั่นเอง
ว่าอะไรควรทำ ไม่ควรทำ หรือ เอาไว้พิจารณา trade-off ต่าง ๆ ต่อไป
เรื่องที่สองคือ Managing data หรือ Data Architecture
การจัดการข้อมูลเป็นหัวใจหลักของระบบงานเลย
จำเป็นต้องรู้และเข้าใจการจัดการข้อมูล
ตั้งแต่การออกแบบโครงสร้างข้อมูล
รูปแบบของการเข้าใช้งานข้อมูล ทั้งการ read และ write
ข้อมูลต้องทำการจัดเก็บไว้นานเท่าไร
แยกกันระหว่างการจัดเก็บกับการใช้งาน
รวมทั้งเรื่องของการ migrate ข้อมูลอีกด้วย
ยกตัวอย่างเช่น เราจะเลือก RDBMS หรือ NoSQL
เช่น key-value, documentation, time-serie เป็นต้น

อีกเรื่องที่สำคัญคือ การจัดการ transaction, concurrency และ consistency
รวมทั้งเรื่องของความปลอดภัยของข้อมูลส่วนบุคคล
ตามกฏหมายของแต่ละประเทศอีกด้วย
เรื่องที่สามคือ Designing system architectures
การออกแบบ Software Architecture ของระบบ
มันคือกรอบการทำงานของทั้งสองข้อที่ผ่านมา
มันคือเรื่องของ tradeoff ทั้งหมดของระบบงาน
เพื่อให้แต่ละส่วนทั้ง frontend, backend และ data
ทำงานร่วมกัน ให้ได้ตามความต้องการที่คาดหวังไว้
ทั้ง functional และ non-functional
ดังนั้นก่อนจะออกแบบได้ก็ต้องเข้าใจความต้องการก่อน เช่น
- จำนวนคนใช้งานพร้อม ๆ กัน
- ค่าใช้จ่าย
- Latency/response time
- ความปลอดภัย
เพื่อจะได้ออกแบบ และ มีทางเลือกที่เหมาะสมกับความต้องการ
เช่น monolith, modular, SOA, microservice, serverless เป็นต้น
รวมทั้งการเลือก technology ต่าง ๆ ที่จะใช้ในการพัฒนา
หรืออาจจะต้องทำการทดลองใช้งานก่อน ก่อนที่จะนำมาใช้งานจริงอีกก็ได้
ดังนั้นการเลือก architecture ให้เหมาะสมกับงานจึงจำเป็นมาก ๆ
“the architecture to make better tradeoffs”
เรื่องที่สี่คือ Making systems secure and reliable
การสร้างระบบงานให้ปลอดภัยและมีความน่าเชื่อถือ
เป็นอีกเรื่องที่สำคัญมาก ๆ และมักจะเจอปัญหาเหล่านี้ประจำ
ทั้งทำงานไม่ถูกต้อง และ โดนเจาะระบบได้ง่าย ๆ
ดังนั้นเพื่อให้ระบบมีความน่าเชื่อถือมากขึ้น
ควรต้องรู้ว่าจะวางแผนและออกแบบ test strategy อย่างไรบ้าง
เพื่อใช้ในการตรวจสอบความถูกต้องการทำงานของระบบ
ทั้ง unit test, integration test และ end-to-end test เป็นต้น
ต้องเข้าใจว่า architecture ที่เราออกแบบมานั้น
มีจุดอ่อน หรือ จุดที่เปราะบางตรงไหนบ้าง ที่อาจจะเกิดปัญหาได้
ให้ทำการออกแบบการรับมือ หรือ แก้ไขไว้ (design for failure) เสมอ
เช่น อาจจะมีการเรียกใช้งานเยอะเกินไป ต้องมี rate limit ไว้หรือไม่
ในส่วนของเรื่องความปลอดภัย แทนที่จะทำการทดสอบในช่วงท้าย ๆ ของการพัฒนา
น่าจะเริ่มให้มีการทดสอบตั้งแต่ช่วงแรก ๆ
ทั้งการออกแบบ พัฒนา และ ทดสอบ
เช่น scan code, dependency check เป็นต้น
รวมทั้งการทดสอบแบบ dynamic
จะทำให้เรารู้ปัญหาได้รวดเร็วยิ่งขึ้น
ยิ่งถ้าใช้ AI ด้วยแล้ว สิ่งต่าง ๆ เหล่านี้
จะเป็น feedback และ signal ได้อย่างดี
และจะกลายเป็นความรู้ที่ทั้งคนและ AI เรียนรู้ไปพร้อม ๆ กัน
เรื่องที่ห้าคือ Scaling and operating in production
สุดท้ายแล้ว ระบบงานที่สร้างมานั้น ต้อง deploy ของ production
เพื่อเปิดให้ผู้ใช้งานจริง ๆ เข้ามาใช้งาน
ดังนั้นจำเป็นต้องรู้ว่า process ในการ deploy ระบบงานเป็นอย่างไร
ตั้งแต่ building -> testing -> configuration -> provisioning -> deployment strategy
และสร้าง pipeline ขึ้นมา ตามแนวคิดของ CI/CD เป็นต้น
จะเห็นได้ว่า ไม่ใช่เรื่องใหม่ใด ๆ เลย
อีกทั้งเรื่องของ operation หลังการ deploy แล้ว
เช่นการ monitoring และ observability ของระบบงาน
ทั้ง logging, metric, tracing, alert ต่าง ๆ
และ incident management เมื่อมีปัญหาบน production จะจัดการอย่างไร
เมื่อมีผู้ใช้งานมากขึ้น ระบบจะทำการ scaling อย่างไร
เมื่อมี traffic เข้ามามากขึ้น เราจะกระจาย traffic เหล่านั้นไปยัง server ต่าง ๆ อย่างไร
การจัดการข้อมูลที่มากขึ้น จะทำอย่างไร ทั้ง partitioning, sharding และ house keeping เป็นต้น
การจัดการข้อมูลต่าง ๆ ของระบบงานความอยู่ภายใต้ version control system
มีการดูแลและจัดการ dependency ต่าง ๆ อย่างสม่ำเสมอ
มีการจัดการเรื่องของ technical debt อย่างสม่ำเสมอ
มีการปรับเปลี่ยน architecture ให้เหมาะสมกับการเปลี่ยนแปลงต่าง ๆ
ถ้าเรามีความรู้ความเข้าใจเหล่านี้แล้ว
น่าจะช่วยให้เราเข้าใจว่า software ของเราควรทำงานอย่างไร
และแน่นอนสิ่งต่าง ๆ เหล่านี้ มันคือ context ที่เราสามารถใส่เข้าไปใน AI นั่นเอง
เพื่อกำหนดกรอบการทำงานให้ชัดเจนมากยิ่งขึ้น
ไม่ใช่การสร้างแบบเดาสุ่มอีกต่อไป
ลองนำไปประยุกต์ใช้งานกันดูครับ