ไม่กี่วันก่อนนึกขึ้นมาได้ว่าเรามี Voucher สอบ JAVA certificate ฟรี ที่ได้มาจาก Sun ตอนไปแข่ง Open Jive นี่หว่า ว่าแล้วก็ลาก @iMuping กับ @toffeetoffee มาคุยกันว่าจะเอายังไง เพราะ voucher มันจะหมดอายุสิ้นปีนี้แล้ว ก็ตกลงกันว่าไปสอบวันที่ 24 (วันนี้) เพราะเป็นวันที่ทุกคนว่างตรงกัน (วันอื่นๆ แต่ละคนก็ติดสอบกลางภาคกันหมด)

หลังตกลงกันได้ก็เข้าไปสมัครในเว็บ http://www.prometric.com/ ก็กรอกข้อมูลต่างๆ ไป พอถึงตอนกดยืนยันถึงได้รู้ว่า voucher ที่ถืออยู่ในมือนี่มูลค่า 9569 บาทเลยทีเดียว! (แพงจังวุ้ย)

เอาล่ะ สมัครเสร็จก็ต้องเตรียมตัวสอบสินะ แต่ว่าปัญหาคือ ผมกำลังอยู่ช่วงสอบกลางภาคนี่สิ 😕
แล้วจะหาเวลาไหนอ่านล่ะเนี่ย สรุปแล้วก็เหลือแค่เวลาเดียว คือคืนก่อนไปสอบ! คุณพระ! ปกติเค้าเตรียมตัวกันไม่รู้กี่เดือน กว่าจะไปสอบ ไอ้นี่อาจหาญมาจากไหน เตรียมตัวคืนเดียว เช้าไปสอบ

คืนก่อนสอบ (23 ธ.ค.) ผมกับ @imuping และ @toffeetoffee ก็นั่งสุมหัวกันตั้งแต่หนึ่งทุ่ม จ้องหน้าจอโน้ตบุ๊คที่กำลังเปิด e-book เตรียมสอบ JAVA cert. ความยาว 700-800 หน้าเห็นจะได้ นั่งอ่านกันไปแบบผ่านๆ แว้บไปกินข้าวแป๊บนึงก็มาอ่านต่อ กว่าจะจบก็ปาเข้าไปห้าทุ่ม หลังจากนั้นก็เปิดหาตัวอย่างคำถามตามอินเตอร์เน็ต ก็ตอบได้บ้างไม่ได้บ้าง ใจหนึ่งก็เผื่อไว้แล้วล่ะว่า พรุ่งนี้เจ๊งแน่ๆ (เพิ่มเติม…)

หลังจากเรียนวิชา Object-oriented and design pattern มาได้ครึ่งเทอม ก็ถึงเวลานำสิ่งที่ได้เรียนมามาใช้สักที ถึงจะเป็นแค่การเอามาใช้ทำการบ้านก็เถอะ เพราะการบ้านที่อาจารย์ให้ทำมันไม่ได้ง่ายอย่างที่คิดเลย ไหนๆ ก็นั่งทำความเข้าใจเรื่องที่เรียนซะตั้งนาน (ไม่งั้นทำการบ้านไม่ได้) ก็ขอเอามาเขียนลงบล็อกซะหน่อยนะครับ (ฮา)

ตอนแรกกะว่าจะเขียนทีเดียวทั้ง Mediator และ Observer ซึ่งเป็น pattern สองตัวหลักๆ ที่ต้องใช้ในการทำการบ้านนี้ แต่ว่าดูท่าจะยาวเกินไป ก็เลยขอตัดเรื่อง Observer ไปเขียนเป็นเรื่องใหม่ดีกว่า 🙂

หลักการของ Mediator pattern พอสรุปได้ว่ามันคือรูปแบบการสร้างคลาสและออบเจ็กต์ โดยให้มีคลาสหนึ่งเป็นตัวกลาง (Mediator) ในการติดต่อคลาสอื่นๆ ในโปรแกรม

mediator1
จากตัวอย่าง สมมติว่าเป็นโปรแกรมระบบข้อมูลสักอย่าง ซึ่งข้อมูลถูกเก็บอยู่ใน DataEntity (ไม่ใช่ database นะ) แล้ว user จะทำการแก้ไขข้อมูลที่เก็บไว้ใน DataEntity ผ่านทาง GUI ที่สร้างขึ้นใน UserInterface

จากแผนภาพจะเห็นได้ว่าตัวที่ทำการ implement พวก Listener มาใช้ หรือก็คือตัวที่ตอบสนองต่อเหตุการณ์ต่างๆ ที่เกิดจากผู้ใช้ก็คือคลาส Mediator ไม่ใช่ UserInterface

คลาส UserInterface เป็นเพียงตัวสร้าง component ต่างๆ เช่น drop-down list หรือปุ่มกดต่างๆ

เมื่อ Mediator รับรู้ถึงเหตุการณ์ที่เกิดจาก user (ซึ่งก็คือผู้ใช้กรอกข้อมูลเพื่อแก้ไขข้อมูลเดิมใน DataEntity) Mediator ก็จะไปทำการแก้ไขข้อมูลใน DataEntity

จะเห็นได้ว่า Mediator จะทำหน้าที่เป็นตัวกลางในการตอบสนองต่อเหตุการณ์ต่างๆ ที่เกิดขึ้น นอกจากนี้ยังใช้เป็นตัวกลางเพื่อให้ออบเจ็กต์ต่างๆ ทำงานร่วมกันได้ด้วย เช่น
mediator2
ในตัวอย่าง(ส่วนหนึ่งของการบ้านที่ต้องทำเลยนะเนี่ย) คลาส PostOffice ให้บริการระบบธนาณัติ โดยจะมีการสร้างออบเจ็กต์ของไปรษณีย์แต่ละสาขา แล้วก็สร้างออบเจ็กต์ของธนาณัติแต่ละใบเก็บไว้ใน list ของออบเจ็กต์ไปรษณีย์สาขาต่างๆ ซึ่งจากแผนภาพจะเห็นว่ามีออบเจ็กต์ของ PostOffice สามออบเจกต์ แล้วก็มีออบเจ็กต์ของ MoneyTransfer อีกสามออบเจ็กต์ ทั้งหมดทำงานร่วมกันได้ผ่านทาง Mediator นั่นคือ หากมีการส่งธนาณัติจากไปรษณีย์สาขาหนึ่งไปอีกสาขาหนึ่ง Mediator ก็จะรับหน้าที่ย้ายออบเจ็กต์ธนาณัติจากออบเจ็กต์ไปรษณีย์สาขาหนึ่งไปยังอีกสาขาหนึ่ง หรือก็คือ Mediator ทำหน้าที่ mapping ออบเจ็กต์ทุกตัวในระบบนั่นเอง

สามารถศึกษาข้อมูลเพิ่มเติมได้จาก http://en.wikipedia.org/wiki/Mediator_pattern (มีตัวอย่างโค้ดด้วย :D)

วันก่อนมีเพื่อนขอให้ช่วยดูคอมฯ ให้หน่อย มันบู๊ตวินโดวส์ไม่ได้ ขึ้น BSOD (Blue Screen of Death) ตลอด พอกดเปิดเครื่อง พยายามบู๊ตวินโดวส์อยู่พักหนึ่ง มันก็ขึ้นมาจริงๆ ก็รีบจดรหัสมันไว้ นั่นคือ 0x0000007B

หลังจากเอาไปค้นหาใน google ได้พักหนึ่ง ก็พบว่าโค้ดนี่หมายถึงปัญหาเกี่ยวกับฮาร์ดดิสก์ คือมันไม่สามารถบู๊ตวินโดวส์จากพาร์ติชันในฮาร์ดดิสก์ได้ เอาล่ะสิ… ทำไงดีเนี่ย บู๊ตยังไงก็ไม่ขึ้น เข้า safe mode ก็เจ๊งอยู่ดี (ก็มันอ่านฮาร์ดดิสก์ไม่ได้นี่) เข้าไบออสก็ไม่มีอะไรให้แก้เลย (ไบออส Phoenix นี่มันหวงจริงๆ แทบไม่ให้เราปรับอะไรเลย) ทำไงดีๆๆ

ถามไปถามมา ปรากฎว่าเหตุการณ์นี้เกิดขึ้นเพราะเพื่อนผมอยากลงวินโดวส์ใหม่ (ของลิขสิทธิ์นะ ได้มาจาก MSDN ของคณะ) แล้วลงไม่ได้เพราะฮาร์ดดิสก์เป็น SATA ก็เลยยกไปให้เพื่อนอีกคนแก้ ซึ่งเพื่อนคนนั้นก็จัดการแก้โดยการเปิด Device Manager ไปที่ฮาร์ดดิสก์ คลิกขวา แล้วก็กด Disable!!! ใช่แล้วพี่น้อง เพื่อนผมกด disable ฮาร์ดดิสก์ แล้วก็รีสตาร์ทปั๊บ เท่านั้นแหละ เรียบร้อยฮะ บู๊ตไม่ขึ้น เจอ BSOD (ก็มันไม่เห็นฮาร์ดดิสก์แล้วนี่)

เอาแผ่นวินโดวส์ยัดเข้าไปให้มันบู๊ต มันก็บู๊ตเข้า Windows setup แล้วมันจะลงได้มั้ย ในเมื่อไม่เห็นฮาร์ดดิสก์

ทุกปัญหาย่อมมีทางออก และแล้วผมก็หาวิธีแก้ได้ เมื่อสั่งบู๊ตเครื่องแล้วเข้าเมนู Boot option ซึ่งมันก็มีให้เลือก Safe mode, Safe mode with nerworking, Start Windows normally, etc. แต่ตัวที่ผมเกิดเอะใจอยากลองกดขึ้นมาคือ Last known configuration

กด enter ปั้ง เท่านั้นแหละ บู๊ตเข้าวินโดวส์ได้เหมือนเดิม เรียบร้อยโรงเรียน @WasuKarnlakorn ฮ่าๆๆ เกือบได้ยกโน้ตบุ๊คไปร้านแล้วนะคุณเพื่อน LOL

สรุปว่าวินโดวส์นี่มันกู้ configuration ง่ายดีแฮะ 😀 แต่สงสัยอะไรอย่างหนึ่ง ทำไมมันต้องทำ BSOD เป็นโค้ดอ่านยากๆ ด้วยฟะ 0x0000007B ตูจะรู้จักมั้ยเนี่ย ถ้าโลกนี้ไม่มี search engine ถามว่าผมจะรู้มั้ยว่าโค้ดนี่มันจะสื่ออะไร ทำไม้ทำไมไม่ทำมาให้ end-user อ่านรู้เรื่องง่ายๆ หน่อยฟะ แบบนี้เค้าเรียกว่า interface ไม่เป็นมิตรกับ end-user นะฮะ 😦

ปล. ไหนเรียนมา อาจารย์บอกว่าการออกแบบ interface เป็นสิ่งสำคัญ ต้องให้ user เข้าใจง่าย ใช้งานง่าย ฯลฯ แล้วไหงระบบปฏิบัติการระดับโลกถึงเป็นแบบนี้ล่ะ…

วันนี้อยู่ดีๆ ก็นึกครึ้มอกครึ้มใจระหว่างนั่งเรียน Object-Oriented Programming ว่าทุกวันนี้ CPU มันเป็น multi-core แทบจะหมดแล้วนี่หว่า แล้วก็คุ้นๆ ว่าเคยอ่านบทความว่าซอฟต์แวร์ที่ผลิตออกมาส่วนใหญ่มันยังใช้งาน multi-core ได้ไม่เต็มที่ เพราะว่าโปรแกรมที่เขียนมามันก็เป็น single thread กันเกือบหมด
ว่าแล้วก็ค้นๆๆ จนไปเจอบทความใน blognone.com ที่เคยอ่านเมื่อนานมาแล้ว (แล้วก็เกือบลืมไปแล้ว – -“) เค้าพูดถึงโครงการฝึกอบรมการใช้เทคโนโลยีมัลติคอร์ ของ Intel ที่เค้าสอนการเขียนโปรแกรมเบื้องต้น แล้วก็หลักการเปลี่ยนโปรแกรมเก่าให้ทำงานแบบเชิงขนาน ซึ่งก็มีเครื่องมือมาให้ใช้อย่าง OpenMP, Intel (R) Software Development Products และ Windows Thread (Win32 API)
ประเด็นก็ไม่มีอะไรมากหรอก แค่รู้สึกว่า ในเมื่อเป็นแบบนี้แล้ว แนวโน้มการเขียนโปรแกรมในอนาคตก็คงต้องเป็นพวก multi-thread มากขึ้นเรื่อยๆ สินะ แล้วทีเรากำลังเรียนอยู่นี่มันจะเป็นไปตามแนวโน้มนั้นหรือเปล่าเนี่ย – -”
นึกๆ ดูแล้ว เราก็เรียนพวก thread, concurrency ใน JAVA Programming มาแล้วนี่หว่า ปัญหาคือ เวลาเขียนโปรแกรมเราก็ต้องคิด algorithm ให้มันเป็น multi-thread ด้วยสินะ…

source: รีวิว Intel Multi-core Programming Workshop by KaewGB

อย่างที่รู้กันว่า ทุกวันนี้มหาวิทยาลัยในไทยหลายแห่งพากันเปิดสอนวิชาเกี่ยวกับคอมพิวเตอร์เยอะแยะมากมาย (เรียกว่าเกลื่อนกลาดก็อาจจะได้)
มีทั้ง Computer science, Information Tecnology, Software Engineering, Computer Engineering คำถามคือ แล้วแต่ละอย่างมันต่างกันยังไง เรียนแล้วไปทำอะไร
คำตอบคือ ทุกวันนี้เรียนอะไรมาส่วนใหญ่ก็จบไปเป็น programmer กันหมด ไม่ได้ต่างกันเท่าไหร่เลย อยู่ที่ว่าใครฝึกทักษะอะไรมาบ้างตอนที่ยังเรียนอยู่
อ้าว แล้วถ้าอย่างนั้นจะแบ่งหลักสูตรมาหา***อะไรล่ะ
คำตอบคือ ในทางทฤษฎี (หรือเรียกว่าในอุดมคติดีล่ะ) แต่ละหลักสูตรมันเรียนมาเพื่อไปทำงานในสายอาชีพที่ต่างกัน พอสรุปได้ตามนี้
1. Computer science
สายนี้จะเน้นเรียน programming เป็นหลัก (ไม่ได้เรียนใช้ word, excel, photoshop, etc. นะ มีบางคนเข้าใจแบบนี้ด้วย) เรียนการพัฒนาโปรแกรมด้วยภาษาใดภาษาหนึ่ง (อย่างที่ SIT-KMUTT นี่ก็เรียน JAVA เป็นหลัก) แล้วก็เรียนหลักการของ Syntax เพื่อจะได้เข้าใจภาษาอื่นๆ ง่ายขึ้น(เหรอ)
แล้วก็ยังเรียนพวก algorithm, operating system และอื่นๆ อีกมากมายก่ายหน้าผากกอง
คราวนี้จบมาทำอะไร ตามหลักแล้ว… เด็ก CS ต้องไปเขียนโปรแกรมแบบ hardcore ให้ตายกันไปข้าง เช่นไปเขียนระบบปฏิบัติการซะ (ตายมั้ยล่ะ) หรืออาจจะสร้างภาษาใหม่ขึ้นมาซะเลย (ตอนปีสองทำมาแล้ว ชื่อภาษา CStroke 😀 เป็นอะไรที่กากมาก)
ก็เป็นไปตามชื่อหลักสูตรเลยว่า Com-sci ซึ่งก็คือผู้คิดค้นทฤษฎีใหม่ๆ ด้านคอมพิวเตอร์ ฉะนั้นแล้ว ถ้า Com-sci สร้างอะไรใหม่ๆ ขึ้นมา แล้วเกิดข้อผิดพลาด คนที่เอาสิ่งนั้นไปประยุกต์ใช้ก็เจ๊งกันหมด (งานเข้าล่ะทีนี้)
2. Information technology
สายนี้ก็จะเรียนคล้ายๆ กับ com-sci (เท่าที่รู้) แต่จะไม่เน้นหนักเท่า แล้วก็จะมีพวก Management of Information Technology เพิ่มเข้ามาด้วย เรียนจบก็ไปทำงานด้าน IT เป็นคนที่สามารถนำเทคโนโลยี IT ต่างๆ มาปรับใช้ภายในองค์กรได้ เช่น IT support, Network admin อะไรประมาณนั้น
3. Software engineering
สายนี้เน้นเรียนด้านการพัฒนาซอฟต์แวร์ล้วนๆ เลย ก็จะเรียนเขียนโปรแกรม เรียนการวางแผน, ทำเอกสาร, จัดการสารพัดอย่าง เพื่อเริ่มต้นโปรเจคท์พัฒนาโปรแกรมหนึ่งตัว เรียกว่ากว่าจะได้โปรแกรมใช้งานสักตัว ไม่ใช่ว่าเขียนๆๆ แล้วก็ทดสอบ แล้วก็จบ แต่มันต้องมีขั้นตอนกระบวนการก่อนหน้านั้นเยอะแยะมากมาย (มิน่าล่ะ ทำไมพวก photoshop, flash, acrobat ถึงได้แพงนัก LOL)
จึงสรุปได้ว่า เรียนจบสายนี้มาก็ไปเป็นผู้พัฒนาโปรแกรมหรือ programmer แน่นอน
4. Computer engineering
เป็นสายวิชาที่ฮิตเรียนกันซะเหลือเกิน (เราก็เกือบไปเรียนเหมือนกัน) สายนี้ก็ตามชื่อเลยว่าวิศวกรรม จึงเน้นเรียนพวกฮาร์ดแวร์ซะมากกว่า เช่นระบบดิจิตอล วงจรไฟฟ้า ฯลฯ (นี่แหละเหตุผลที่ไม่ไปเรียน หนูเกลียดวิชาไฟฟ้า แต่ชอบฟิสิกส์นะ :P)
ฉะนั้นแล้ว จบมาก็จะไปทำงานด้านฮาร์ดแวร์คอมพิวเตอร์ เช่นพวกโรงงาน cpu, harddisk อะไรประมาณนั้น
ที่เขียนมาทั้งหมดมันก็เป็นเพียงสายงานในอุดมคติล่ะนะ ยังไงซะ จบออกมาจริงๆ ก็แย่งงานกันทำหมด LOL ไม่เห็นจะแบ่งตรงไหนเลย ประกาศรับสมัครงานก็เขียนแค่ว่า “จบการศึกษาสาขาที่เกี่ยวข้องกับคอมพิวเตอร์”
ทั้งหมดนี่เขียนมาได้เพราะการคุยกับอาจารย์ที่ปรึกษาท่านหนึ่งแท้ๆ เลยนะเนี่ย ขอบคุณอาจารย์ที่ชี้แนะนะครับ

ปล. ไหนว่าเขียนยาวๆ ไม่ค่อยเป็นไง ถนัดแต่ Twitter ไหงเขียนมายืดได้ขนาดนี้ฟะ – -“