ทำไมทำ PHP Framework เองหล่ะ ? คำถามโดนใจ และอยากตอบยาว ๆ

พอดีว่าเมื่อวาน เพื่อนฟิวส์ถามว่า

"ทำไมทำ PHP Framework เองหล่ะ"

วันนี้เลยมาตอบแบบยาว ๆ เสียหน่อย

คือในตอนแรกเริ่มเดิมทีเนี่ย ผมก็เขียน Class ต่าง ๆ ใช้งานเองอยู่มากมาย ทั้ง Class สำหรับ Query ฐานข้อมูล MySQL หรือ Class วันที่อย่าง thai_datetime ที่รองรับวันที่ภาษาไทย และปี พ.ศ. โดยรวมก็รู้สึกว่าทำงานกับพวกนี้สะดวกขึ้นมาก โยน Object ไปๆ มาๆ ง่ายและง่ายเสร็จเร็ว

แต่พอมาระยะหลัง ๆ งานที่ได้รับมันเป็นงานที่เกี่ยวกับข้อมูลจำนวนมาก ๆ การทำแบบนั้นสิ้นเปลื้องทรัพยากรอย่างมาก และบางครั้งเกิดความซ้ำซ้อน และโค้ดโปรแกรมรกอย่างเห็นได้ชัด รวมไปถึงการที่ผมเริ่มเขียน PHP แบบรวมไฟล์เดียว คือ process ทุกอย่างจะทำงานภายใต้ index ไฟล์ ทำให้การลาก if-else ของหน้าต่าง ๆ มันยาว และยุ่งยาก เลยนั่งคิดว่าจะทำยังไงดี

คราวนี้คิดออกว่าเราทำไม ไม่ทำการอ้างอิงหน้าแบบ Class ไป Method เสียเลยหล่ะ (ในตอนต่อไปขอเรียก Class ว่า Model) คือเมื่อ เขียนโปรแกรมต้องการข้อมูลเกี่ยวกับอะไรก็เรียก Model และตามด้วย Method ที่ต้องการ

ตัวอย่างเช่น

ต้องการอ่านข่าว id ที่ 1234 ระบบก็ไปเรียก Model "News" และ Method "Show" โดยส่ง id "1234" เข้าไปใน Method แล้วเมื่อได้ข้อมูลแล้วก็แสดงผลออกมา

ตอนแรกก็กะทำแค่นั้น แต่ไป ๆ มา ๆ มันเข้าเค้า MVC เว้ย เลยศึกษา RoR อยู่พักนึง เลยเข้าใจเลยว่าไอ้ที่จะทำเนี่ยมันคล้าย ๆ กัน เลยจัดการดัดแปลงแนวคิดใหม่ จากการที่จะเรียก Model ตรง ๆ เป็น ไปเรียก Method ของ Controller (Controller-Method) แทน แล้ว Controller-Method จะไปเรียกใช้ Model และ Method ที่เกี่ยวข้องทั้ง ๆ มาใช้งาน ซึ่งคราวนี้ Model มีอิสระต่อการเรียกใช้ข้อมูลของฐานข้อมูลมากขึ้น สามารถปรับแต่งและแก้ไขคำสั่ง SQL ได้ตามต้องการ โดยการจัดการข้อมูลในฐานข้อมูลต้องสอดคล้องกับความหมายของ Model นั้น ๆ เมื่อ Controller-Method สั่งให้ Model ทำงานเสร็จแล้ว Model จะทำการบันทึกสถานะที่จำเป็นในการแสดงผลใส่ลง Observer-Data (ตัวตรวจจับข้อมูลที่ต้องการ) ไปยัง View ให้ View จัดการแสดงผลข้อมูลตามที่ Controller-Method สั่งมาอีกที แล้วเจ้า View เนี่ยจะเอาข้อมูลใน Observer-Data มาใช้งานตามแต่ View จะใช้

ตัวอย่างเดิมแต่เปลี่ยนแนวคิดใหม่

ต้องการอ่านข่าว id ที่ 1234 ระบบก็ไปเรียก Controller "News" และ Controller-Method "Show" เสร็จแล้ว Controller-Method มีการทำงานอะไร ต่าง ๆ มากมาย เช่นมีการใช้ Model พื้นฐานอย่าง News และอาจจะมี Model "ความดิดเห็น" และ "ข่าวที่เกี่ยวข้อง" อื่น ๆ อีก เพื่อเอาไปแสดงผล โดยส่ง id "1234" เข้าไปใน Controller-Method ด้วย เพื่อเอาข่าวที่ 1234 ออกมา เมื่อได้ข้อมูลครบแล้ว ก็เข้าไปใส่ใน Observer-Data ซึ่งเมื่อได้ข้อมูลแล้วก็แสดงผลออกมาโดยเอาไปจัดการรูปแบบต่าง ๆ ให้สวยงานในส่วนของ View ชื่อ "ShowNews" โดยส่วนของ View จะถูกครอบอีกชั้นด้วย Theme หลักของระบบอีกที

ซึ่งระบบจะประมาณนี้ แต่สุดท้ายก็มีการแยกส่วนหลัก ๆ เป็น Core, Add-on, Warrper Class, Page และ Apps ซึ่งอาจจะมีอะไรมากกว่านี้อีกหน่อย แต่คงไม่ต่างจากข้างบนมากนัก

จากสิ่งเหล่านี้ ทำให้ผมได้แนวคิดมากมาย และการทำแบบนี้มันทำให้รู้ว่า "กูก็ทำได้วะ" เอาแนวคิดที่เราเคยทำอะไรมามากมายใส่มันลงไป

อีกอย่างคือ Framework หลาย ๆ ตัวของเมืองนอกมักเขียนคำสั่ง SQL เพียว ๆ ไม่ค่อยได้ และมักจะทำให้เราเสร็จ ซึ่งผมไม่ชอบเท่าไหร่ เพราะมันควบคุมและย่อคำสั่ง SQL ลำบากมาก หรือทำไม่ได้เลย ซึ่งทำให้ประสิทธิภาพตกไป ใน Framework ผมเลยไม่มีการจัดการ SQL สำเร็จรูปมากมาย อาจมีคำสั่งพื้นๆ เช่นนับจำนวน Record ในตาราง หรือตัวช่วยแบ่งหน้า อะไรพวกนี้ นิดหน่อยซึ่งเป็นงานที่ทำซ้ำ ๆ และใช้กันเยอะอยู่แล้ว เอามาใส่เป็นแบบสำเร็จรูป ส่วนคำสั่ง insert, update, delete อาจจะทำส่วนง่าย ๆ ไว้ในกรณีที่ต้องการลบข้อมูลที่ใช้ primary key อ้างอิงเป็นหลัก แต่ถ้าใช้ตัวอื่น ๆ ด้วย ก็สามารถใช้ SQL Query ทั่วไปแทนได้เลย

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

การพัฒนา Framework ตัวนี้พยายามให้มันอยู่บนพื้นฐานของ Add-on มากกว่า Core คือไม่อยากใช้อะไรก็เอา add-on ออก พยายามไม่ให้ตัวที่เป็น Core ผูกติดกับ Add-on แต่ให้ Add-on มันมาผูกกับ Core เอง เพราะเวลาเอา Add-on ออกมันจะได้ไม่มีปัญหา ซึ่งมันต่างกับ Framework บางตัวที่มีอะไรให้ใช้มากมาย แต่บางครั้งมันมากเกินไปหนัก Framework แล้วมันเอาออกไม่ได้ ซึ่งมันทำให้ประสิทธิภาพตกไปเลย ซึ่งพยายามไม่ให้เกิดกับตัวนี้ (หวังไว้นะ)

อีกอย่างที่ำอยากทำคือทำให้ได้อย่าง RoR กะว่าจะทำ Bat File แล้วเขียนให้มันสร้าง Model, View และ Controller ด้วยคำสั่งเดียว -_-‘ แต่คงยากหว่ะ เอาแค่นี้ก่อนดีกว่า ฮ่า …..  ทำคนเดียวไม่ได้ทำหลายคน ค่อยเป็นค่อยไปแล้วกัน

[update] ความคืบหน้าของ PHP Framework

ตอนนี้ปรับแต่งและแก้ไขไปแล้วโดยตอนนี้อยู่ที่ version 0.1a (alpha test) revision ที่ 46 แล้ว ปรับแต่งระบบภายในหลายส่วน แต่หลัก ๆ คือแยกส่วนของ Page และภาษาสำหรับการแสดงผลของ Core ออกจาก Apps ซึ่งตอนแรกรวมกันอยู่

โดยเหตุผลหลักๆ มาจากว่า Core จะมี Page และภาษาสำหรับแสดงผลพื้นฐานของมันเอง เอาไว้ให้ Module, Warpper Class, Function, CSStyle และ Add-on มาอ้างอิง ซึ่งจะได้ง่ายต่อการใช้พัฒนา Core ในภายหลัง และสามารถเอาไปปรับแต่งให้รองรับกับภาษาอื่น ๆ ได้โดยแค่แปลี่ยนแปลง ที่ Core เท่านั้น และการแยกครั้งนี้ช่วยให้ลดความซ้ำซ้อนลงไปได้เยอะ

ส่วน Apps ที่เขียนขึ้นมา ก็เข้าไปใช้และปรับแต่งแยกจากกัน จะได้ไม่สับสน แล้วง่ายต่อการ Upgrade ตัว Framework ในอนาคตต่อไป ไม่งั้นตอน upgrade นี่มึนแน่ ๆ

คาดว่าถ้าการพัฒนาระบบที่ทำอยู่ไม่มีอะไรผิดพลาดและเกิด bug ขึ้นระหว่างการพัฒนาระบบที่ทดสอบอยู่จะประกาศตัว 0.1a revision 46 เป็น 0.1b ทันที แต่คาดว่าคงมีจุดรั่วหลายส่วนตัวเลข revision คาดจะทะลุ 50 แน่ ๆ ซึ่งตอนนี้ Architecture Diagram ไม่นิ่งอย่างแรง และเริ่มอ่านลำบาก เดี่ยวเขียนใหม่อีกรอบท่าจะดี

ส่วน Module และ Add-on บางส่วนอาจจำเป็นต้องปรับแต่งเพิ่มอีกนิดหน่อยให้มีความยิดหยุ่นต่อการปรับแปลี่ยนในครั้งนี้ครับ

ส่วนชื่อของ Framework ตัวนี้อย่างไม่เป็นทางการ แต่ของเป็น codename ไว้ก่อนคือ Hoffman ครับ (ชื่อ Notebook Thinkpad ตัวนี่แหละ -_-‘)

[Update 1, 13:28] ด้านล่างนี้คือโครงสร้างของ Directory ของ Framework นี้

อ้ากกกกก !!! ข้อมูลหาย !!! คราวเคราะห์ส่งท้ายปีเก่า

อยากจะบ้าตาย ข้อมูลใน Hard Drive ที่เครื่อง HoffmanServer ที่อยู่ใน Partition D ที่มีขนาด 27GB และเป็น Hard Drive 40GB ตัวเก่าอายุ 5 ปีดันมีปัญหาอันเกิดจากการ Merge Partition ทำให้ข้อมูลภายในหายหมดเลย T_T ต้องมานั่งกู้ข้อมูลกันใหม่หมด แถม Structure File/Directory ดันเสียไปด้วย ทำให้ต้องกู้แบบ RAW Mode ทำให้ไฟล์มันกระจายอย่างมาก ต้องมานั่งไล่ใส่ Folder ใหม่หมดเลย T_T อ้ากกกกกกกก แทนที่จะได้ทำการทำงาน ต้องมานั่งกู้ข้อมูลอีก

ซึ่งด้านในมีข้อมูลส่วนใหญ่จะเป็นเพลงเก่า ๆ และรูปภาพที่ท่านแม่ถ่ายไว้ นอกนั้นก็ไม่มีอะไรเป็นพิเศษ เพราะส่วนใหญ่จะเขียนใส่แผ่น DVD+R ไปหมด หรือไม่ก็ใส่ใน Partition อื่น ๆ ใน Hard Drive ตัวใหม่ ขนาด 160GB แทน ตอนนี้เลยนั่งรอมัน Scan และผู้รอดชีวิตมาเกือบชั่วโมงแล้ว ท่าทางจะรอดชีวิตกันเยอะ

เฮ้อ …… เศร้า T_T

ใช้อีเมลกันไม่เป็นแล้วหรือไง

ผมเป็นคนที่มักจะเปิด online ให้กับ IM (Instant Messenger, ระบบการส่งข้อความทันที) ตัวหลักของผมอย่าง Windows Live Messenger ซึ่งส่วนใหญ่ผมจะ Away หรือ Busy ด้วยเหตุผลที่ว่า บางครั้งไม่อยู่ หรือกำลังทำงานก็จะไม่ตอบเลย ซึ่งเป็นวิธีที่น่าจะเข้าใจได้ง่าย และสื่อในความหมายอยู่แล้ว ซึ่งบางคนที่สนิท ๆ มาทักก็จะตอบกลับทุกคนแล้วยกเว้นว่า "ไม่อยู่หน้าเครื่อง" ซึ่งก็คงไม่อาจตอบได้อยู่แล้ว ฮ่า …

ซึ่งบ่อยครั้งมากที่มีรุ่นน้องหรือเพื่อน  ๆ พี่ ๆ เราต้องการขอความช่วยเหลือหรือมีการติดต่องานต่าง ๆ  ทั้งสำคัญ และไม่สำคัญแล้วมักจะเข้ามาทักหรือลากเข้าไปคุยในห้อง chat ซึ่งส่วนใหญ่มักจะอยู่ในช่วงไม่อยู่ หรือปิด Alert ไป ซึ่งทำติดต่อกันไม่ได้ ซึ่งทางออกของเรื่องนี้ที่ดีที่สุดน่าจะเป็นการส่งอีเมลมา เพื่อให้ข้อมูลต่าง ๆ รวมไปถึงเรื่องเร่ง ๆ การส่งอีเมลน่าจะทำให้อะไร ๆ นั้นถึงปลายทางได้ดีกว่า IM มาก แต่เดี่ยวนี้กลับไม่ทำกัน ซึ่งเจอบ่อยจนชินไปแล้ว แถมบางคนทักแล้วผมไม่ตอบ ก็ดันด่าเราเสียอีก ซึ่งทางออกของเรื่องนี้คือ "การส่งอีเมล" น่าจะดีที่สุด แต่การที่ IM มันเข้ามามีอิทธิพลต่อชีวิตคน IT มากขึ้นทุกวัน ทำให้เกิดความเคยชิน จนลดความอดทนที่จะรอคำตอบ

โดยเรื่องที่เป็นทางการไม่มาก อาจใช้ IM คงไม่มีปัญหา แต่ถ้า IM มันติดต่อไม่ได้การใช้อีเมลนั้นก็น่าจะทำให้ข้อมูลส่งถึงผู้รับได้แน่นอน เพราะบางครั้ง IM ที่คนผู้นั้นใช้งานอยู่อาจจะไม่ใช่เครื่องของตนเอง ทำให้การตรวจสอบบันทึกการคุยใน IM นั้นไม่ได้ ทำให้อ่านย้อนหลังหรือลำดับเรื่องได้ลำบาก ซึ่งอีเมลเป็นทางออกของเรื่องนี้ได้ดีมาก จากการใช้ Reply/Forward โดยมันจะทำให้เราสามารถไล่อ่านลำดับเหตุการณ์ต่าง ๆ ได้้ง่าย และช่วยให้การติดต่อราบรื่นกว่าเยอะ แต่ก็ยกเว้นกว่า กล่องอีเมลมันไม่เต็มไปเสียก่อน ซึ่งปัญหานี้แก้ไขได้โดยใช้หาพื้นที่อีเมลเยอะ ๆ รวมไปถึงใช้ อีเมลโปรโตคอลแบบ POP3 หรือ IMAP แล้วใช้โปรแกรม Client ไปดึงอีเมลมาอ่านในเครื่องเราได้ แล้วเก็บอีเมลในเครื่องเราไว้เลย จะได้ไม่ต้องเสียเวลานั่งสำรองข้อมูลหลายรอบ แล้วทำให้พื้นที่ในกล่องอีเมลเราไม่เต็มด้วย แต่วิธีนี้ก็มักจะไม่เหมาะกับคนที่ไม่มีเครื่องเป็นของตนเอง การมี Web-based e-mail น่าจะเป็นคำตอบได้ดี แต่คงต้องหาที่เยอะ ๆ เข้าไว้ตามที่ได้แนะนำไว้ข้างต้น เพื่อใช้สำหรับติดต่องาน อย่างเช่น Gmail, Yahoo หรือ Windows Live Mail (Hotmail, Live Mail) นั้นเอง

ผมมองว่าการติดต่องานผ่าน IM นั้นถือว่าเป็นเรื่องที่ดี รวดเร็วลดค่าใช้จ่ายได้มาก แต่มันก็มีปัญหาในเรื่องของการบันทึกข้อความการคุยกัน ถึงแม้จะมีบันทึกการคุยกันแล้วก็ตาม แต่มันก็เพียงพอ เพราะว่ามันถูกจัดเก็บไว้ในเครื่องต่าง ๆ ไม่ได้นำมารวมศูนย์ที่เดียวกัน ซึ่งยากต่อการลำดับเหตุการณ์ในการคุยกันในอนาคตได้ แต่ป้ญหานี้ถูกแก้ไขด้วยการใช้ Gmail และ GTalk ของ Google โดยการสนธนากันไปมาใน GTalk จะถูกบันทึกในอีเมลของ Gmail ทั้งหมดทำให้ง่ายต่อการจัดเก็บและลำดับการสนธนาได้ง่ายประหนึ่งใช้อีเมล Reply คุยกันแบบ Real-Time เลยทีเดียวซึ่งน่าจะช่วยได้มาก แต่ปัญหาคือ ……. มันไม่มีคนใช้มากมายขนาดเอามาเป็น IM หลักได้นี่ดิ (เซง…) อาจจะเพราะลูกเล่นมันน้อยด้วยมั้ง เพราะมันมีแต่สิ่งที่จำเป็นเท่านั้น ซึ่งผมก็ชอบมันในเรื่องนี้ เบาบางแต่ได้คุณค่าของมันเอง

หลังจากเขียน blog วันนี้หวังว่าจะมีการใช้อีเมลโต้ตอบ ไปมา บ้าง ถ้าใน IM ไม่ตอบหรือติดต่อกันไม่ได้ เพราะผมมองว่า IM และ อีเมลมันน่าจะช่วยลบจุดเสียของกันและกันได้ดีกว่าการเอาระบบใด ๆ สักตัวเป็นหลัก และไม่ใช่รอบบย่อยเลย เพราะไม่งั้นปัญหามันจะเกิดขึ้นมากถ้าข้อมูลหรือข่าวสารต่าง ๆ ที่จำเป็นมันไม่ถึงคนปลายทางอย่างแน่นอน ซึ่งผมมองว่าอีเมลมันมีความเสถียรภาพในการส่งข้อมูลมากกว่า IM มาก ถึงแม้บางครั้งมันจะส่งไม่ถึงปลายด้วยเหตุผลด้านกล่องอีเมลเต็ม หรือเครื่อง Server ล่ม และปัญหานานับประการ สรุป ….. โทรศัพท์มาคุยกันไปเลยดีกว่าไหมเนี่ย หมดเรื่อง -_-‘ (แล้วจะบ่นซะยาวทำไมหล่ะเนี่ย o_O)

ขี้เกียจอย่างหนัก

ช่วงนี้ไม่รู้เป็นอะไรขี้เกียจอย่างหนัก นอนก็ซัดซะตะวันลืมตา ตื่นทีตะวันก็จะนอน เฮ้อ …….. งานการทำบ้าง แต่มันรู้สึกว่าไม่อยากทำยังไงไม่รู้ รู้สึกว่าช่วงนี้แปลก ๆ อาจจะเพราะสถาพแวดล้อมมันไม่ค่อยดีเท่าไหร่ หลาย ๆ อย่างมันเลยทำให้เราเฉื่อย ๆ ไป หรือว่าเพราะเราขยันจัดในช่วง 6-7 เดือนที่ผ่านมา ทำให้ในรอบ 2-3 อาทิตย์นี้พลังมันหมด มันเลยเฉื่อย ๆ ไม่ค่อยอยากทำอะไร นั่งอ่านแต่ entry ใน blog ต่าง ๆ หรือนั่งอ่าน comment และกระทู้ในเว็บบอร์ดต่าง ๆ ทั้งวัน รวมไปถึงกำลังบ้า อ่านหนังสือต่าง ๆ  อย่างเช่น อ่านซึบาสะ (Tsubasa Reservoir Chronicle) อย่างมาก นั่งอ่านรวดเดี่ยว 6 เล่ม (ของ VBK) หมดใน 2 ชั่วโมง หรืออื่น ๆ

อ้าววว แล้วงี้เรียกว่าขี้เกียจ หรือว่าเรานอกเรื่องจากการทำงานหว่า -_-‘ (ฮ่า …. )