Architecture/Common Structure

หลังจากที่ได้สั่งสมประสบการณ์ จากการทำงานมา 10 ปีกว่าๆ แล้วนั้น ผมได้ค้นพบอย่างนึงเกี่ยวกับ การพัฒนา Application หรือ Software ที่ไม่ว่าจะเป็น การพัฒนาบน Platform ใดก็ตามคือ เกือบทุก Apps ทุก Software จะมี Common Architecture/Common Structure คล้ายๆกัน


นานมาแล้ว ที่การพัฒนา Software หรือ Program ได้ถูกพัฒนาขึ้นโดยทฤษฎีแรกที่ถูกคิดค้นขึ้นมาเกิดจาก คุณ Alan Turing ในปี 1935 หรือเมื่อประมาณ 83 ปีที่แล้ว โดยว่าด้วยเรื่องของ Computable Numbers, with an Application to the Entscheidungsproblem


The first theory about software — prior to creation of computers as we know them today — was proposed by Alan Turing in his 1935 essay On Computable Numbers, with an Application to the Entscheidungsproblem (decision problem).


เคยเป็นกันบ้างไหม

ทุกครั้งที่เริ่ม Project ด้วย ภาษา Programming แบบใหม่ Platform ใหม่ๆ แล้วไม่รู้จะเริ่มยังไง ประติดประต่อยังไง ทำไมเราถึงได้เป็ดแบบนี้ รวมทั้งมีความกลัวเกิดขึ้นในใจ หรือ ได้รับ Code มรดกมา อ่านโค้ดแล้วก็อยากจะนิพพานไปเลย


ผมเชื่อว่าทุกๆคน น่าจะได้เจอจุดนี้กันมาแล้ว สำหรับน้องใหม่วันหนึ่ง ก็อาจจะเจอก็ได้นะครับ ผมคิดว่าคงไม่รอด หรอก :D และยิ่งถ้าเป็น Developer Level Novice แถบจะต้องมโน ว่า Code ตรงส่วนนี้ ส่วนนั้น มันน่าจะต้องทำงานแบบนี้ แบบโน้นนะ ด้วยแล้วละก็ เตรียมเข้าวัดไปทำบุญให้จิตสงบกันได้เลย แต่ถ้าคุณผ่านโปรเจคมาเยอะแล้ว ก็อาจจะเห็น Practical บางอย่างของ Project ที่ผ่านๆมา


ซึ่งหากจะไปเริ่ม Project ใหม่ จะมี 8 อย่าง ที่แต่ละ Project ทำเหมือนๆกัน นั่นก็คือ

1. จุดเริ่มต้นของ Program

หากเราสามารถเข้าใจได้ว่า จุดเริ่มต้นของ Program ซึ่งมันมีจุดที่เริ่ม จุด Start ตรงไหน คุณก็จะสามารถ unlock ความเข้าใจของ Platform นั้นๆ เช่น หากเราเป็นคนที่เขียน Java จุดเริ่มต้นของ Program ก็คือ method public static void main(String... args) ของ class นั้นๆ หรือในภาษา C++ รันใน function int main() เป็นต้น


หากคุณไม่เข้าใจว่าแต่ละภาษาคืออะไร แล้วทำงานยังไง ขอให้นึกเป็น ภาษา ที่เราคุ้นชินที่เราเขียนอยู่ (ขอเป็น Programming นะไม่เอา พวก SQL นะ)

2. Program มี Config ของมันเอง

เชื่อไหมว่าแทบจะทุก Program มี Config หรือ Resource เป็นของตัวเอง โดยเฉพาะอย่างยิ่ง Config ของตัว Start การทำงานแทบจะขาดไปไม่ได้เลย เช่นใน Application บน ​Andriod หากใครเคยเขียนก็จะทราบดีว่าทุก App บน Android ต้องมี AndroidManifest.xml ซึ่งเป็นไฟล์ Config ประกอบอยู่ใน Project เพื่อให้สามารถอ้างอิงของที่อยู่ใน Application กับ Android OS ให้สื่อสารกันได้นั่นเอง หรือ อีกตัวอย่างนึงใน โปรเจคของ SpringBoot ก็จะมีส่วนที่เรียกว่า Application config เพื่อเอาไว้ Config App หรือ ใน Application อื่นๆ พวก WebFrame MVC อื่นๆ ก็มีคล้ายๆกัน เช่น zk framework


ฉะนั้น หากเรารู้ว่ามี config อยู่ที่ไหนบ้าง ซึ่งมันก็เป็นเหมือนขุมทรัพย์บนแผนที่ ที่จะช่วยชี้หนทางสว่างให้ในบางที

3.การจัดเก็บข้อมูล

หลายๆ Program จำเป็นต้องมีการจัดการ จัดเก็บข้อมูล เพื่อนำข้อมูลเหล่านั้นมาใช้งาน ทั้งใช้ในปัจจุบัน หรือใช้ในอนาคต ฉะนั้นหากเราเข้าไว้ว่า แต่ละ Program มีการจัดเก็บด้วยวิธีการใดบ้าง และทำอย่างไรนั้น ก็จะเป็นประโยชน์อย่างยิ่งและที่สำคัญ ข้อมูลที่จัดเก็บนั้น ควรจะเป็นข้อมูลที่เป็นประโยชน์ เพราะการจัดเก็บข้อมูล จำเป็นต้องแลกมากับพื้นที่ความจำ และอะไรหลายๆอย่าง

4. การเชื่อมต่อ Network

Program ที่เราเขียนนั้นมีการต่อ Network ไหม ถ้ามีต้องทำอย่างไร และจัดการกับ Request Response นั้นๆ อย่างไร และ Request เหล่านั้นทำแบบ Synchronous หรือ Asynchronous หรือเปล่า หากมีปัญหาเกิดขึ้น เราจะได้ Clear cut จาก Problem นั้นๆ ได้ครบทุก Flow


สิ่งนี้ก็พลาดไม่ได้เช่นกัน หากมีการใช้งาน Third Party Library ก็ต้องนึกดีๆ หากเกิดปัญหาขึ้นมี Community เพียงพอที่จะสามารถช่วยเหลือได้หรือเปล่า

5. เรื่องของความปลอดภัย Security

เรื่องนี้เป็นเรื่องสำคัญอย่างมาก จริงๆน่าจะเป็น อันดับแรกๆ ด้วยซ้ำไป เพราะว่า ระบบจะมีความน่าเชื่อถือ ก็ขึ้นอยู่กับหัวข้อนี้ เพราะมีหลายๆเคสที่เกิดขึ้น เมื่อช่วงไม่นานมานี้ทำให้ความเชื่อมั่นของ User ลดน้อยลงไป อีกทั้งในปัจจุบัน มีกฎหมายที่เกี่ยวกับ คอมพิวเตอร์ เรื่องความปลอดภัยของผู้รับบริการอยู่มากมาย ฉะนั้น การพัฒนาต้องคำนึงถึง ความปลอดภัยข้อมูลของลูกค้า และเรื่อง Policy ในการให้บริการด้วย หากยังไม่เคยศึกษา แนะนำให้อ่านเรื่อง CIA สามเหลี่ยมพื้นฐานความปลอดภัยครับ

6. การ Debug และ การ Log ข้อมูลของโปรแกรม

พื้นฐานของความเข้าใจ โปรแกรมที่เราสร้างขึ้นมา คือ control flow ( logic ของ code ที่เราเขียน ) ซึ่งหากโปรแกรมเราทำงานปกติ Flow ต่างๆก็ควรจะถูก แล้วอะไรหละ ที่จะช่วยให้เราเห็นภาพการทำงานของ Program ขณะ เราทำงานอย่างอื่นที่ไม่ได้สนใจมันอยู่ หากเราต้องการบันทึกประวัติการทำงาน ประวัติการใช้งาน เพื่อนำมาทำอะไรหลายๆอย่างเช่น การวิเคราะห์การใช้งาน การจัดเก็บธุรกรรมของผู้ใช้งาน การตรวจสอบการทำงานของโปแกรม ฯลฯ


หากคุณ มีความต้องการเกี่ยวกับสิ่งเหล่านี้เมื่อไหร่ ให้นึกถึงสิ่งที่เรียกว่า LOG เพราะ การ Log จะทำให้ได้ข้อมูลเหล่านี้มา ซึ่งการ Log มีสิ่งที่น่าสนใจอีก 1 เรื่อง คือ Level ในการ Log ผมขออุ๊ปไว้ก่อน สงสัยต้องแตกไลน์เป็นอีก Blog นึงดีกว่า



ถัดมาหาก Log ก็ Log ไปแล้วแต่ทำไมโค้ดยังพัง ยังทำงานไม่ถูก มีเครื่องนึงที่คอยช่วยคุณ นั่นก็คือคุณ Debugger ที่จะคอยช่วยอธิบาย Status ของ สิ่งที่เราสนใจอยู่ ซึ่ง การ Debug มีเรื่องที่น่าสนใจคือ การทำงานของ Debugger รวมถึง Step การ Debug

7. Test Framework

ปัจจุบัน developer คนไหนที่ไม่ได้เขียนเทส เขาว่ากันว่า เชยมากๆเลยหล่ะ เพราะหากเราไม่เขียน Test ไว้ เวลาที่เราแก้โค้ดต่อ แล้วเราจะมั่นใจได้อย่างไรว่าโค้ดที่แก้ไป มันไม่มีบัคนะ แล้วคุณจะสามารถเทสได้เหมือนวันที่คุณทำช่วงนั้นได้หรือเปล่า


แล้วทีนี้พอเราทำโปรเจคใหม่ อาจจะต้องเรียนรู้ Test Framework ตัวใหม่ๆ ซึ่งหากถามว่า เสียเวลาในการทำความเข้าใจนานไหม ผมขอตอบเลยว่า ไม่นานครับ แต่มันขึ้นอยู่กับการเขียนโค้ดของเรา มันง่ายต่อการเขียนเทส หรือเปล่า

8. การ Deploy หรือ Distribution App

สุดท้าย แต่ไม่ท้ายสุด เพราะยังมีสรุปอีก 😁😁 ทีนี้เมื่อเราทำ 8 ข้อมาหมดแล้ว


เราก็มาสู่ขั้นตอน สุดท้าย คือ การปลูกถ่าย Program หากใครทำด้านเว็บ ก็เอาเว็บ Deploy หากใครทำแอพก็ Submit App ขึ้น Store หากใครทำ Desktop App ก็ปล่อยเข้า Store Management หรือ Website หากใครทำ KIOSK ก็ปล่อย Image ขึ้น cloud ไป หรือหากใครทำเป็น jar file ก็ distribute jar file ผ่าน Maven repo ไปเป็นต้น ซึ่งจะเห็นว่า Code ทุกบรรทัด ของเรานั้นจะถูกส่งมอบให้กับคนอื่นได้ ด้วยวิธีหลักๆ 2 วิธี คือ Distribute โดยตรง กับ Distribute โดยผ่านตัวกลาง ทั้ง 2 วิธี ไม่ใช่วิธีใหม่แต่อย่างใด แต่ละแบบก็มี ลักษณะเฉพาะของตัวเอง ที่มีข้อดี ข้อเสียที่ต่างกัน


หากเราสามารถปล่อยให้โปรแกรมที่เราสร้างขึ้นมานั้น มีชีวิตอยู่บน โลกล่าได้ ก็จะเป็น สิ่งที่น่าภาคภูมิใจ อย่างนึงเลยหละ ที่เราจะมีชิ้นงานของเรา ที่ตั้งใจทำอย่างดี หรือทุลักทุเล 555 Just kidding ya ได้มีชีวิตอยู่ด้วยตัวของมันเองได้


ทุกครั้งที่เรามองย้อนกลับ จะทำให้เรารู้สึกว่า เจ้า Program เหล่านั้นเปรียบเสมือน ลูกๆของเราคนหนึ่งเลยหละ ^o^

สรุป

โดยรวมแล้ว แถบทุกๆ Project หากเราอยากรู้จักหรือทำโปรเจคอะไร ก็จำเป็นต้องเข้าใจถึง Common ของ Software ซึ่งหากจะให้เปรียบเปรยละก็ ลองนึกถึงการร้องเพลง มั่วๆไม่รู้เนื้อแบบถั่วงาๆ ตามเนื้อเพลง หากเราได้เข้าใจถึงตรงนี้ ทุกโปรเจค จะไม่มีกำแพงด้าน การทำความเข้าใจเลยครับ

0
146