การพัฒนาโปรแกรมแบบเป็นส่วนๆ (Fragment Programming)

DinoQ Entrepreneur Platform 2016/01 ( info@dinoq.com )

เกริ่นหน่อย…แต่ไม่ขอลงรายละเอียดมาก นะครับ (ถ้าไม่รู้จักอันใหนก็ค้นหาจาก Google เพิ่มละกัน)

ปัจจุบันภาษาที่นิยมใช้พัฒนาโปรแกรมมีรูปแบบโครงสร้างภาษา 2 แบบคือ โปรแกรมแบบโครงสร้าง (Procederal Programming) และ โปรแกรมเชิงวัตถุ (Object Oriented Programming, OOP)

และการทำงานก็จะมี 2 แบบ คือ Compiler จะทำการเปลี่ยนโค้ดให้เป็นไบนารีก่อนทำงาน ยกตัวอย่าง เช่น C, C++,Swift, Java เป็นต้น และ Interpretor ทำงานกับโค้ดเลย เช่น Perl, Ruby, Python, JavaScrip เป็นต้น

ในการพัฒนาแอพลิเคชันใดๆก็ตาม ผมคิดว่าหลายๆท่านคงเคยวิเคราะห์โค้ดแอพลิเคชันนั้นๆของตัวเอง ซึ่งจะประกอบไปด้วยโค้ดหลายๆส่วนรวมกัน ในขณะที่โค้ดที่เป็นลอจิกของธุรกิจนั้นมีไม่มากแต่ไปเสียเวลากับอย่างอื่น เช่น โค้ดที่เกี่ยวกับความปลอดภัย (หน้าจอเข้าระบบ, จัดการผู้ใช้สิทธิ์การเข้าถึงระบบ, การตรวจสอบสิทธิ์การการใช้งาน), โค้ดที่เกี่ยวกับการบันทึกการทำงานของระบบ (Logging),โค้ดที่เกี่ยวกับการจัดการค่าตัวแปรต่างๆที่ใช้กำหนดการทำงานของระบบ(System property), โค้ดที่เกี่ยวกับการเชื่อมต่อไปยังระบบอื่นๆ และโค้ดอื่นๆอีกเยอะแยะขึ้นอยู่กับลักษณะของโครงการนั้นๆด้วย โดยงานเหล่านี้จะไม่ใช่ลอจิกของแอพลิเคชันโดยตรง แต่จะเป็นส่วนเสริมให้แอพลิเคชันทำงานได้สมบูรณ์ ซึ่งโดยมากทุกๆแอพลิเคชันจะมีเหมือนๆกัน เราจะเรียกโค้ดในส่วนนี้ว่า Cross-Cutting Concern

ในแอพลิเคชันขนาดเล็กๆ จะมีโค้ดที่เป็น Cross-Cutting Concern เยอะกว่าลอจิกของแอพลิเคชัน ซะอีก

จริงๆการแก้ปัญหาเรื่อง Cross-Cutting Concern ได้มีวิธีการหลายๆวิธีในปัจจุบัน เช่น การออกแบบ Framework โดยแยกส่วน Cross-Cutting Concern มารวมกันไว้ หรือแยกเป็น Library กลางเพื่อเรียกใช้, การใช้ Aspect-oriented Programming (AOP) framework หรือ การใช้ Spring framework เป็นต้น แต่ก็ช่วยได้ระดับนึงเนื้องานจริงๆก็ยังคงอยู่ เพียงเปลี่ยนรูปแบบไปเท่านั้นเอง (จากเขียนโปรแกรมโดยตรงเปลี่ยนไปใช้การปรับแต่งค่าพารามิเตอร์แทน)

สำหรับ การพัฒนาโปรแกรมแบบเป็นส่วนๆ (Fragment Programming)จะต่างออกไป โดยจะเป็นระดับที่สูงขึ้นมา โดยหลักการแล้ว จะมีการแยกส่วน หรือแยกชั้นของโปรแกรมด้วย ตัวทำงานรันไทม์ (Runtime Container) ซึ่งตัว Runtime Container จะจัดการแบ่งโค้ดเป็นหลายๆชั้น และแต่ละชั้นว่าจะทำอะไร เช่น ชั้นที่สามจะจัดการเกี่ยวกับการตรวจสอบความปลอดภัยซึ่ง Runtime Container จะจัดการให้, ชั้นที่สีจะทำการบันทึก (Logging) การทำงานซึ่ง Runtime Container จะจัดการให้, ชั้นที่ห้าจะเป็นลอจิกการทำงานซึ่งนักพัฒนาจะเขียนโค้ดเข้ามา และชั้นที่หกจะเป็นสคริ๊ฟท์ (Script) ฝั่งไคลเอนท์ (Client)ซึ่งนักพัฒนาจะเขียนโค้ดเข้ามา เป็นต้น

สรุปได้ว่าการพัฒนาโปรแกรมแบบเป็นส่วนๆ (Fragment Programming) จะทำให้ Runtime Container ต้องมีความสามารถที่จะแบ่งชั้นการทำงานเป็น 2 ส่วนใหญ่ๆคือ

1.ชั้นที่อยู่ภายใน ซึ่ง Runtime Container จะเป็นต้วจัดการให้ เช่น การตรวจสอบความปลอดภัย, การบันทึกการทำงาน เป็นต้น ซึ่งก็คือ Cross-Cutting Concern และโค้ดส่วนกลางประเภทอื่นๆ

2.และชั้นที่อยู่ภายนอก ซึ่งนักพัฒนาจะต้องเขียนโค้ดเอง เช่น ลอจิกการทำงานของระบบ, ส่วนติดต่อผู้ใช้ของระบบ(ในส่วนที่เกี่ยวกับลอจิกการทำงาน) เป็นต้น

ซึ่ง Runtime Container นี้จะช่วยลดงานของนักพัฒนาให้เหลือเฉพาะงานที่เป็นลอจิกของธุรกิจนั้นๆจริง

โดยตัว Runtime Container จะไม่ใช่แค่ Application Server / Web Server เช่น Tomcat, Jetty, JBoss, WebLogic, WebSphere หรือ Apache เท่านั้น แต่จะหมายถึง Application Server / Web Server บวกกับตัวจัดการสภาพแวดล้อม และตัวจัดการลอจิกของธุรกิจ ซึ่งจริงๆแล้ว Runtime Container ก็คือ PaaS (Platform as a Service) ประเภทหนึ่งนั่นเอง ยกตัวอย่างผลิตภัณฑ์ใรท้องตลาดเช่น Google App Engine, Azure WebApp เป็นต้น แต่ผลิตภัณฑ์ทั้งสองตัวนี้ยังไม่มีความสามารถของการพัฒนาโปรแกรมแบบเป็นส่วนๆ (Fragment Programming) อยู่ดีจะเป็นได้เพียงแค่เตรียมสภาพแวดล้อมไว้เท่านั้น

ถ้าดูดีๆแล้วการพัฒนาโปรแกรมแบบเป็นส่วนๆ (Fragment Programming) นั้นจะไปคล้ายๆกับความสามารถในการเขียนสคริ๊ปค์เพิ่มเติมของโปรแกรมประเภท CMS (Content Management System) หรือ WCM (Web Content Management) ที่สามารถเพิ่มเติมความสามารถของส่วนติดต่อผู้ใข้พื้นฐาน แต่ก็นั้นแหละ CMS / WCM มันไม่ใช่แพลตฟอร์มในการพัฒนาระบบโดยตรงทำให้การเขียนสคริ๊ปค์นี้มี้ข้อจำกัดเยอะ เขียนได้แค่บางงานเฉพาะเจอะจง (ซึ่งโดยมาก CMS / WCM จะนิยมไปออกแบบแฟลตฟอร์มสำหรับทำ Plug-in มากกว่า) ซึ่งรูปแบบของ CMS / WCM จะเป็นลักษณะของ SaaS (Software as a Service) แล้ว

ในมุมมองผม Runtime Container มีความใกล้เคียงกับ SaaS มากกว่า PaaS โดยที่จะเป็น SaaS ที่มีความสามารถในการคอมไพล์โค้ดได้ นั่นเอง (หรือจะใช้สคริ๊ปท์ที่เป็นแบบอินเตอร์พรีเตอร์ก็ไม่ว่ากัน ออกแบบตามสะดวก เผอิญกรณีผมเลือกที่จะใช้คอมไพล์เลอร์)

สรุปการพัฒนาโปรแกรมแบบเป็นส่วนๆ (Fragment Programming) จะต้องมีคุณสมบัติดังนี้

  • จะต้องทำงานบน Runtime Container ซึ่งตัว Runtime Container นี้จะเป็น Application ตัวนึงที่ทำงานบน Web Server หรือ Application Server
  • ที่ Runtime Container จะมีความสามารถในการจัดการ Cross-Cutting Concern และโค้ดส่วนกลางประเภทอื่นๆ เช่น การ debug, page statistic, service endpoint และอื่นๆ
  • มีรูปแบบของโค้ดแบบหลายๆ ส่วน และอาจมีช่องทางแก้ไขโค้ดได้หลายทาง รวมถึงผ่านทางเว็บบราวเซอร์
  • โค้ดจะมีสองส่วนหลักๆ คือ ลอจิกทางธุรกิจ และ ส่วนสนับสนุน
  • สามารถทำการคอมไพล์โค้ดได้ในกรณีโค้ดมีการเปลี่ยนแปลง (หรือจะใช้สคริ๊ปท์ที่เป็นแบบอินเตอร์พรีเตอร์)
  • มีตัวจัดการ deploy, un-deploy, import และ export แอพพลิเคชันได้
  • มีส่วนติดต่อผู้ใช้ในการบริหารจัดการทรัพยากรณ์ภายใน

หลังจากท่านใช้งาน การพัฒนาโปรแกรมแบบเป็นส่วนๆ (Fragment Programming) แล้วท่านจะได้

  • เริ่มต้อนโครงการได้เร็วขึ้น (อารมณ์เหมือนเข้าใช้งานระบบ CMS แต่ปรับแต่งได้มากกว่า)
  • พบว่าพัฒนาระบบได้เร็วชึ้น
  • พัฒนาแบบง่ายๆแต่ได้ความสามารถระดับระบบขนาดใหญ่ (จะได้ความสามารถเหล่านี้ไปโดยไม่รู้ตัว Auto scale, Load balancing, High availability(HA), Security firewall, Revers proxy เป็นต้น)
  • โค้ดสำหรับการทดลองตลาดของระบบ(Pilot project) กับโค้ดที่ใช้กับงานจริง(Production) เหมือนกันเลย (ลืม MVP(Minimal Viable Product) ของระบบลีน(Lean) ไปเลยดีมั้ยนี่)
  • เป็นรูปแบบ SaaS ซึ่งสะดวกสบายมาก ไม่ต้องทำอะไรมากมายเลย

หากมีข้อดีมากแบบนี ช้าอยู่ใยครับ

ดูบทความอื่นๆ กดลิ้งค์เลยครับ