บทความนี้ขอพูดแลกเปลี่ยนความคิดเห็นนะครับ แบบว่าขอพักสมองซักแป๊ปนะ ไม่มีโค้ดซักบรรทัดมากวนจิตกวนใจครับ พัฒนาการเกี่ยวกับคอมพิวเตอร์นั้นมีมานานมากแล้ว แต่ที่มีพัฒนาการอย่างชัดเช่นจะเริ่มตั้งแต่ประมาณยุค 80 ดังนั้นจะขอเริ่มกล่าวตั้งแต่จุดนี้กันตามรูปที่ 1 ครับ
|

|
รูปที่ 1 วิวัฒนาการของ Software |
ตั้งแต่ปี 1980 เป็นยุคของ Object-Oriented ช่วงนี้จะมีการพัฒนาทางด้านศาสตร์ของ OO กันอย่างจริงจัง ตอนนั้นเค้าใช้ภาษา C เป็นหลัก และต่อมาก็เป็น C ในปี 1985 ซึ่งเป็นปีเดียวกันกับที่ไมโครซอฟท์ออก Windows เวอร์ชั่น 1.0
ตั้งแต่ปี 1990 เป็นยุคของ Component-Oriented เป็นการทำ object หลายๆ ตัวมาทำงานร่วมกันเรียกว่า Component-Oriented (ในปีนี้ไมโครซอฟท์ออก Visual Basic เวอร์ชั่น 1 ครับ และด้วยความที่เขียนง่าย เขียนได้เร็ว ก็เลยมีการเรียกการพัฒนาโปรแกรมด้วย VB นี้ว่าเป็น Rapid Application Development (RAD)) และมีความสามารถในการคุยกันระหว่าง Application ได้ เพื่อให้มีการคุยกันระหว่าง Application ได้นั้น ทางฝั่ง Java ได้ใช้มาตรฐานของ Common Object Request Broker (CORBA) ทางด้าน IBM ได้ใช้มาตรฐาน System Object Model (SOM) ซึ่งเข้ากันได้กับ CORBA 1.1 ในขณะที่ไมโครซอฟท์ก็ได้ออกมาตรฐานของตัวเองช้ากว่าคนอื่นประมาณ 1-2 ปี และตั้งชื่อว่า Distributed Component Object Model (DCOM) ซึ่งไม่สามารถเข้ากันได้กับ CORBA 1.1 เหมือน SOM ของ IBM ()
ในช่วงปี 1998 มาตรฐานของ XML ก็ได้ถูกประกาศออกมาโดยหน่วยงาน W3C ซึ่งจะเป็นองค์ประกอบพื้นฐานของ Web Service ต่อไป
ตั้งแต่ปี 2000 ความฝันของเว็บเซอร์วิสก็ใกล้เคียงความเป็นจริงมากขึ้น เพราะมีการประกาศมาตรฐานของ Simple Object Access Protocol (SOAP) ซึ่งเป็นโปรโตคอลที่ถูกใช้ในเว็บเซอร์วิส และหลังจากนั้นแต่ละค่ายก็ต่างประกาศเทคโนโลยีที่ทำงานกับเว็บเซอร์วิสของตัวเองดังนี้ IBM Web Services, HP e-speak, Sun One และ Microsoft .NET
ในปี 2002 ไมโครซอฟท์ออก Visual Studio .NET 2002 ซึ่งเป็น Visual Studio .NET ตัวแรกสุด ตัวนี้มากับโปรเจ็คเว็บเซอร์วิสเลย ในปีเดียวกันทาง Java ก็ออก Web Services Developer Pack EA1 แต่จากที่อ่านมาจากการวิจารณ์ในเว็บ การพัฒนาเว็บเซอร์วิสของไมโครซอฟท์ผ่าน Visual Studio ทำได้ง่ายกว่าทาง Java พอสมควร ผมเคย demo การสร้างเว็บเซอร์วิสในคนที่เคยทำ Java ดู เค้าค่อนข้างทึ่งทีเดียวว่า โห ทำแค่นี้เองเหรอ (ทำง่ายมาก) ในปี 2003-2004 ไมโครซอฟท์ก็ซุ่มทำโครงการ The next generation of web service ซึ่งมีโค้ดเนมว่า Indigo และสุดท้ายในช่วงปลายปี 2004 ก็ได้ชื่ออย่างเป็นทางการว่า Windows Communication Foundataion หรือ WCF แต่ทางไมโครซอฟท์จะโดยวิจารณ์ในทางลบเหมือนกันว่า ได้นำเว็บเซอร์วิสที่เป็น Open standard ใน W3C แล้ว ไปพัฒนาต่อมาเป็น WCF ซึ่งทางไมโครซอฟท์ก็ได้ผูก WCF เข้ากับระบบปฏิบัติการของไมโครซอฟท์เองอย่างแน่นหนา ตรงนี้คงหมายถึงการที่ WCF มีความสามารถด้าน Transaction, MSMQ, .NET Remoting ที่ผู้เข้ากับระบบเฉพาะระบบปฏิบัติการของไมโครซอฟท์ ซึ่งแต่ละตัวล้วนแต่เป็นจุดแข็งของของไมโครซอฟท์เอง ตรงนี้ใครที่เคยใช้เทคโนโลยีเหล่านี้ของไมโคซอฟท์คงมองเป็นข้อดีครับ เพราะเราสามารถใช้เทคโนโลยี WCF ตัวเดียว แต่เราได้เทคโนโลยีระดับ Enterprise ตัวอื่นๆ หลายๆ ตัวพร้อมภายใต้สถาปัตยกรรมของ WCF ซึ่งถือว่าง่ายในการจัดการมาก
กล่าวถึงเว็บเซอร์วิส และการนำมันมาใช้งานกันซักหน่อย
ตรงนี้คงจะแล้วแต่องค์กรครับ บางองค์กรเพิ่งใช้งานเว็บเซอร์วิส บางที่อาจจะเพิ่งรันบนเซิร์ฟเวอร์จริงไม่ถึง 1 ปีด้วยซ้ำ เพราะเป็นเทคโนโลยีที่ค่อนข้างใหม่สำหรับบ้านเราถึงแม้ว่าที่ต่างประเทศเค้าทำใช้งานจริง และเป็นเชิงการค้ามามากกว่า 5 ปีแล้ว สำหรับใครที่เคยใช้เว็บเซอร์วิส จะพบว่าเว็บเซอร์วิสทำให้เราสามารถ integrate ระบบต่างๆ ที่อยู่คนละที่คนละทางเข้าไว้ด้วยกันได้ ไม่ว่าจะเป็นเซิร์ฟเวอร์ หรือไคลเอนต์แบบต่างๆ ไม่ว่าจะเป็น Mobile, PDA, Computer และอุปกรณ์สื่อสารอื่นๆ เพราะมีมาตรฐาน SOAP และ XML ที่แน่นอนทำหน้าที่เป็นตัวประสานให้เกิดการแลกเปลี่ยนข้อมูลระหว่างอุปกรณ์สื่อสารต่างๆ
ผมเองเคยทำโปรเจคเกี่ยวกับเว็บเซอร์วิสมาสองตัวครับ คือตัวแรกเป็นเว็บเซอร์วิสที่ให้บริการข้อมูล Mutual Fund ซึ่งจะให้บริการข้อมูลกับ Client ของรอยเตอร์ และอีกตัวเป็นเว็บเซอร์วิสที่ให้บริการการสอบแบบ Online ซึ่งเว็บเซอร์วิสทั้งสองตัวนี้จะคอยให้บริการข้อมูลกับ Windows Application บางครั้งอาจเรียกว่า Thick Client หรือถ้าจะให้ดูทันสมัยหน่อยก็เรียกว่า Smart Client ซึ่งมีข้อดีดังนี้
สรุปข้อดีของ Smart Client เมื่อเทียบกับเวอร์ชั่นก่อนที่เป็นเว็บ
1. ข้อมูลที่รับส่งระหว่าง Smart Client กับเว็บเซอร์วิสเป็นข้อความแบบ XML ซึ่งมีขนาดเล็กว่า โดยไม่ต้องโหลดข้อมูลทั้งหน้าเหมือนแบบเว็บ ทำให้ดาวน์โหลดข้อมูล และส่งข้อมูลได้เร็วกว่า
2. สามารถสร้างระบบ Preload ที่ดาวน์โหลดข้อมูลจากเว็บเซอร์วิสด้วย Background Process แบบ Asynchronous ที่ทำงานอยู่ด้านหลัง โดยที่ผู้ใช้ที่ใช้งานอยู่ จะไม่รู้สึกสะดุด หรือรอข้อมูลนาน
3. ตัดปัญหาเรื่องการกำหนดค่าการรับคุ๊กกี้ ทั้งในแบบที่เก็บในดิสก์ หรือหน่วยความจำเครื่อง และการเปิดใช้งานจาวาสคริปต์ในเบราเซอร์ ทำให้ทางทีมเซลล์ไม่ต้อง Support ลูกค้าในเรื่องนี้
3. ตัดปัญหาเรื่องข้อมูล Session ID หายระหว่างทาง ซึ่งอาจจะเกิดจากการทำงานที่ผิดพลาดของ Firewall หรือ Proxy
4. แก้ปัญหาผู้ใช้ทำการปิดโปรแกรมโดยไม่ตั้งใจจากการคลิกปุ่มกากบาทที่มุมบนขวา เพราะโปรแกรมสามารถถูกกำหนดให้ปิดได้ในกรณีเดียว หรือตามที่ผู้พัฒนาระบบต้องการ
5. มีระบบเตือนเมื่ออินเตอร์เน็ตหลุด และระบบสามารถทำงานแบบ Online ได้ทันทีหากอินเตอร์เน็ตถูกเชื่อมต่อ แต่ถ้าอินเตอร์เน็ตหลุดก็สามารถทำงานต่อแบบ Offline ได้
6. หากเกิดข้อผิดพลาด ผู้สอบสามารถเปิดโปรแกรม Smart Client ขึ้นมาทำงานต่อได้ทันที แต่ถ้าเป็นเว็บอาจจะมีปัญหาเรื่องการอนุญาตให้มีการการเขียนข้อมูลนี้ในคุกกี้แบบที่เก็บลงดิสก์ที่ไคลเอนต์
7. Smart Client ต้องการแบนวิดธ์ที่ต่ำกว่าแบบเว็บ ทำให้ทำงานได้เร็วแม้ไม่ได้ใช้ Hi-Speed Internet และยังสามารถรองรับจำนวนผู้ทำการสอบพร้อมๆ กันได้มากกว่า
8. Smart Client สามารถเก็บข้อมูลที่ดาวน์โหลดมาไว้ในฐานข้อมูลของตัวมันเอง เพื่อความรวดเร็วในการรันในครั้งถัดไป และสามารถรีเฟรซข้อมูลให้อัปเดตล่าสุดได้ตามต้องการ
9. Smart Client มี User Interface ที่ตอบสนองการใช้งานได้รวดเร็วกว่าแบบเว็บ และสามารถใช้งานคอนโทรลที่มีความซับซ้อน หรือคอนโทรลที่มีคุณสมบัติพิเศษได้ดีกว่า
10. ติดตั้งได้ง่ายผ่านเว็บด้วยเทคโนโลยี ClickOnce ที่สามารถติดตั้งโปรแกรมด้วยการคลิกเพียงครั้งเดียว
ข้อจำกัดของ Smart Client
1. ลูกค้าต้องทำการติดตั้งโปรแกรมที่เครื่องที่ใช้ทำสอบก่อน ซึ่งค่อนข้างใหญ่ อาจจะต้องใช้เวลาดาวน์โหลดนานหน่อย เพราะมักมีขนาดมากกว่า 10 MB เพราะอย่างน้อยๆ มันต้องรวมเอา .NET Framework 2.0 ไปด้วยสำหรับ Client ที่ไม่ได้ติดตั้งมันมาก่อน
2. ระบบปฏิบัติการที่สามารถลง Smart Client ได้จะต้องเป็น Windows XP ที่ลง Service Pack 2, Window 2000 ที่ลง Service Pack 4 หรือ Window 2003 ที่ลง Service Pack 1 แล้วเท่านั้น
ถึงเวลาย้ายจากเว็บเซอร์วิสมาใช้เทคโนโลยี WCF แล้วหรือยัง ?
คำถามนี้อาจจะต้องตอบในหลายๆ กรณีครับ ถ้าหากเป็นบริษัทที่กำลังใช้เว็บเซอร์วิสอยู่แล้ว และใช้งานได้ดีอยู่ก็อาจจะไม่จำเป็นครับ แต่ถ้าท่านใดกำลังคิดจะสร้างเว็บเซอร์วิส แนะนำให้หันมาเขียน WCF แทนเลยจะดีกว่าครับ เพราะ WCF นั้นเป็น Framework ที่ใช้สร้าง SOA ที่สมบรูณ์มากเพราะมันได้รวมเอา Product ตัวเก่งต่างๆ ที่ไมโครซอฟท์มีเข้าไปด้วยคือ Enterprise Service (COM ), MSMQ และ .NET Remoting นอกจากนี้ยังได้รวมมาตรฐาน WS-* ที่เป็นมาตรฐานกลางของ W3C เข้าไปอีก เรียกว่าเว็บเซอร์วิสนี่มีขนาดเล็กเท่ามดเลยเมื่อเทียบกับ WCF
|

|
รูปที่ 2 เทคโนโลยี WCF ที่ได้รวมหลายๆ เทคโนโลยีเข้าไว้ด้วยกัน |
สำหรับบางท่านอาจใช้งานเว็บเซอร์วิสอยู่ แต่อยากจะเปลี่ยนมาใช้งาน WCF ก็อาจจะใช้ทางเลือกที่สามคือ สร้าง WCF ขนานไปกับเว็บเซอร์วิสที่มีอยู่ ซึ่งเราสามารถสร้างให้ WCF มี Contract รวมถึงไฟล์ WSDL ที่เหมือนกันของเว็บเซอร์วิสได้ และ Client ที่เคยคุยกับเว็บเซอร์วิสก็สามารถหันมาคุยกับ WCF แทนโดยไม่ต้องเปลี่ยนแปลง Contract เลย เพียงแต่ทำการย้าย Address หรือ URL ให้ชี้ไปที่ WCF เท่านั้นเอง ซึ่ง WCF สามารถแปลงร่างเป็นเว็บเซอร์วิสได้โดยการกำหนดค่า Binding ให้เป็นแบบ Basic Http
ถึงตรงนี้บางท่านอาจจะเริ่มอยากหันมาใช้ WCF แล้วบ้าง เพื่อให้น่าสนใจขึ้นมาอีก ผมขอกล่างถึงความสามาถของ WCF ที่เหนือกว่าเว็บเซอร์วิสอีกซักสามข้อครับ ข้อแรก WCF สามารถส่งข้อมูลที่เป็น Binary ด้วยการไปกับ SOAP ได้เลยโดยไม่ต้องเสียเวลาแปลงมาเป็นตัวอักษรที่เป็น Base 64 Encoding หรือก่อนหน้านี้จะเรียกว่า MTOM (Message Transmission Optimization Mechanism) ที่เคยใช้มาตั้งแต่ WSE 3.0 ข้อสอง WCF สามารถเปิดให้บริการผ่าน End Point หลายๆ ตัวด้วยโปรโตคอลต่างๆ นอกเหนือจาก HTTP ที่พอร์ต 80 ที่เรามักใช้กับเว็บเซอร์วิส เช่น Peer to Peer, TCP, Name Pipe, MSMQ, WS HTTP และ WS Duplex HTTP (คุยกันได้พร้อมกันทั้งสองฝั่งเลย แต่จะช้ากว่าคนอื่นหน่อย) ซึ่งโปรโตคอลเหล่านี้จะไม่สามารถรันอยู่ใต้ IIS ได้ เพราะ IIS ให้บริการผ่านเฉพาะโปรโตคอล HTTP แต่เราอาจจะนำ WCF ไปรันอยู่ใต้ Host หลายๆ แบบได้อย่างค่อนข้างอิสระ เช่น รันใต้ Windows Application, Console Application หรือ Windows Service ซึ่งทั้งนี้และทั้งนั้น เราต้องคำนึงถึงความเสถียรของ Host ที่เราเลือกใช้งานด้วย ถ้าหากเราต้องการ Host ที่อนุญาตให้เรากำหนดค่าได้สะดวกเหมือนกับ IIS เราสามารถนำ WCF ไปรันอยู่ใต้ WAS (Windows Activation Service) ซึ่งมีอยู่ในเฉพาะวินโดว์ส Vista ได้ครับ ข้อสาม WCF ได้เปลี่ยนวิธีการ Serialize เพื่อแปลงอ็อปเจ็กต์ไปเป็นข้อมูล XML แบบใหม่ ซึ่งจะทำให้ WCF มีความเร็วในการส่งข้อมูลที่เพิ่มขึ้นประมาณ 30% เมื่อเทียบกับเว็บเซอร์วิส
ไหนๆ จะขายแล้วก็แถมไปอีกเลยซักสองข้อครับ ข้อแรก WCF มีความสามารถในการส่งข้อความแบบ Reliable Messaging (ใช้กับเฉพาะโปรโตคอล TCP) อีกด้วย ซึ่งการันตีข้อความที่จะส่งระหว่าง WCF Client และ WCF Server ว่าได้ส่งถึงปลายทางเรียบร้อยแล้ว และส่งไปถึงผู้รับโดยมีการเรียงลำดับก่อนหลังให้อีกด้วย หากสายเน็ตเวิร์คหลุดมันจะมีสร้าง Connection ใหม่ และทำการส่งไปใหม่ (Retry) ให้ ข้อสองมันมีความสามารถในการกำหนดค่าทรัพยากรที่จะใช้บริการได้ (Throttling) ง่ายๆ ผ่านไฟล์ configuration เช่น กำหนดจำนวน Connection ที่จะรองรับได้มากที่สุดเท่าไหร่ กำหนดจำนวน Session ที่เกิดกับ instance ของ WCF ได้มากที่สุดเท่าไหร่ หรือกำหนดจำนวน instance ของตัว WCF เองว่ามีมากที่สุดได้เท่าไหร่
ข้อดีของ WCF ยังมีอีกมากจริงๆ ครับ ผมเองคงเขียนไม่หมดแน่ๆ ใครคิดอะไรได้เพิ่มเติมก็บอกมานะครับ หรือผมเขียนอะไรผิดพลาดไปก็ขออภัยด้วยครับ เพราะมันเป็นเรื่องค่อนข้างใหม่ครับ จากที่ได้ลองเขียนดูก็พบสิ่งที่สุดยอดของ WCF อีกตัวหนึ่งครับ คือพบว่ามันมีลักษณะที่เป็น Attribute-Based Programming ครับ คือเราอยากได้อะไรก็แปะ Attribute (เครื่องหมายก้ามปู [ ] สำหรับ C# และ < > สำหรับ VB) ที่ตัวคลาสหรือเมธอดได้โดยตรง และมีให้เลือกใช้เยอะมากๆ แล้วตอนรัน WCF จะใช้ .NET Reflection เข้าไปอ่าน Metadata ที่เราได้แปะเอาไว้กับ Attribute เอง แล้วทำการ gen โค้ดที่ใช้รันอยู่เบื้องหลังในตอนรันให้ต่างกันตาม Attribute โดยอัตโนมัติครับ ดังนั้นหน้าที่ส่วนใหญ่ของเราก็เพียงแต่เรียนรู้วิธีการใช้การ Attribute ครับ ตัวอย่างเช่น เราแปะ Attribute สำหรับการ handle error เพื่อจัดการกับ error ที่เกิดกับ WCF ซึ่งเราสามารถเขียนคลาส Attribute ขึ้นมาเอง (คลาสที่ inherit คลาส System.Attribute) แล้วบอกวิธีการจัดการกับ error ที่เกิดขึ้นได้อย่างอิสระ ซึ่งเราจจะเขียน error ลงฐานข้อมูล หรือแหล่งเก็บข้อมูลอื่นๆ ได้