วันเสาร์ที่ 26 กรกฎาคม พ.ศ. 2551

การพัฒนาโปรแกรมแบบเรียงลำดับกำลังจะตาย!

ที่มา http://searchdatacenter.techtarget.com/news/article/0,289142,sid80_gci1319113,00.html#

"การคำนวณแบบเรียงลำดับกำลังจะสูญพันธ์ และอนาคตก็คือการคำนวณแบบขนาน" วันนี้ผมขอเริ่มบทความด้วยคำกล่าวของ Dave PAtterson ซึ่งเป็นหัวหน้าห้องปฎิบัติการการคำนวณแบบขนานที่มหาวิทยาลัยแคลิฟอร์เนียที่เบิร์กเลย์ ซึ่งได้กล่าวไว้ในงานสัมมนาทางวิชาการที่ชื่อว่า Usenix Conference อ่านแล้วรู้สึกยังไงครับ ตกใจ แปลกใจ ไม่เห็นด้วย เฉย ๆ เห็นด้วย แน่นอนอยู่แล้ว ...

เอาละครับ เราลองมาดูรายละเอียดกันดูดีไหมครับว่าทำไมเขาจึงกล่าวเช่นนี้ ซึ่งจริง ๆ ความคิดของเขาก็มาจากการที่การพัฒนาของตัวหน่วยประมวลผลในปัจจุบันนี้ซึ่งเป็นแบบหลายแกน (multi cores) กันแล้วนั่นเอง ซึ่งแน่นอนครับว่าถ้าเราต้องการจะใช้ประโยชน์จากจุดนี้เราก็ต้องพัฒนาโปรแกรมในแบบขนาน อย่างไรก็ตามศาตราจารย์ Andrew S. Tanenbaum (รู้จักไหมครับ เจ้าพ่อด้านระบบปฏิบัติการคนหนึ่งที่พัฒนา Minix ขึ้นมาเพื่อใช้ในการสอนระบบปฏิบัติการ เป็นแรงบันดาลใจให้ Linus ไปพัฒนา Linux) ได้กล่าวติงว่าการพัฒนาโปรแกรมแบบเรียงลำดับนั้นก็ยากอยู่แล้ว การพัฒนาโปรแกรมแบบขนานยิ่งยากไปกว่านั้นอีก เขาเกรงว่าถ้าเราเขียนโปรแกรมให้ทำงานไปพร้อม ๆ กันบนแกนเหล่านี้ โปรแกรมที่พัฒนาขึ้นจะเลวร้ายลงไปอีก ซึ่ง Patterson ก็เห็นด้วยในเรื่องนี้ว่าเรายังขาดบุคลากรทางด้านนี้อยู่จริง ๆ

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

วันอาทิตย์ที่ 20 กรกฎาคม พ.ศ. 2551

ปริศนา Java 1

ต้องขอเกริ่นก่อนนะครับว่าต่อไปบล็อกนี้ผมจะเขียนเรื่องที่หนักไปทางวิทยาการคอมพิวเตอร์มากขึ้น เพราะเท่าที่ดูผู้อ่่านของผมในบล็อกนี้ก็คือศิษย์ปัจจุบันหรือศิษย์เก่า ส่วนถ้าใครยังติดใจเรื่องเล่าข่าวไอทีต่าง ๆ ก็ขอเชิญที่บล็อกของผมที่ bloggang นะครับ

หลังจากเอาวีดีโอขึ้นไปให้ดูกันจากบทความที่แล้ว ก็มีเสียงบ่นว่าวีดีโอยาวจัง ไม่มีเวลาดู ผมก็เลยคิดว่าจะหยิบยกปริศนาภาษา Java จากวีดีโอมาคุยให้ฟังแล้วกันนะครับ เริ่มจากปริศนาแรกเลยนะครับ

import java.util.*;
public class ShortSet {
public static void main(String[] args) {
Set s = new HashSet();
for (short i = 0; i < 100; i++) {
s.add(i);
s.remove(i-1);
}
System.out.println(s.size());
}
}

คำถามคือผลลัพธ์จากโปรแกรมนี้คืออะไร
a. 1
b. 100
c. Throw Exception
d. None of the above

ลองมาไล่โปรแกรมดูนะครับ ถ้าไล่โปรแกรมไปตามปกติจะเห็นว่าเป็นการนำเอาตัวเลข 0 ถึง 99 ใส่ลงใน Set แต่ในการใส่ในแต่ละครั้งจะมีการเอาตัวที่อยู่ก่อนหน้าออก ถ้าลองไล่ดูที่ i = 0, จะได้ set {0} และเมื่อพยายามจะ เอา (0-1 = -1 ) ออกจาก set จะพบว่าไม่มี -1 ดังนั้นจึงไม่มีการเอาอะไรออก ในรอบแรกนี้ set จะมีค่า {0} ในรอบที่ 2 i = 1 จะได้ set คือ {0,1} และเมื่อเอา (1-1 = 0) ออกจะได้ว่า set คือ {1} ดังนั้นถ้าทำอย่างนี้ไปเรื่อย ๆ ในรอบสุดท้ายเราจะได้ set คือ {99} ดังนั้นผลลัพธ์ของโปรแกรมที่สั่งพิมพ์คือขนาดของ Set ก็จะต้องเป็น 1 แต่ถ้าลอง run โปรแกรมดูจะได้ผลลัพธ์คือ 100 ซึ่งคือข้อ b.ครับ คำถามคือทำไม...
คำตอบคือตอนแรกควรจะมามาเข้าใจ interface Set กันก่อน ซึ่งมีหน้าตาดังนี้ครับ
Interface Set {
boolean add(E e);
boolean remove (Object o);
...
}

ให้สังเกตุนะครับว่าสำหรับ add จะรับพารามิเตอร์เป็นประเภทที่ระบุไว้ นั่นหมายความว่าเราไม่สามารถใส่ข้อมูลประเภทอื่น ๆ ที่ไม่ได้ระบุไว้ตั้งแต่ตอนสร้าง set ลงใน set ได้ แต่ remove พารามิเตอร์้เป็น Object ซึ่งหมายถึงจะเป็นประเภทข้อมูลอะไรก็ได้ ซึ่งก็ดูประหลาดนะครับ แต่เหตุผลหนึ่งของการทำอย่างนี้ก็คือในเรื่องของ backward compatability และเขาก็บอกว่าได้ลองคิดถึงการที่จะออกแบบให้ใช้ remove(E e) แล้วแต่ปรากฏว่ามันใช้ไม่ได้ในหลายกรณี เขายกตัวอย่างว่าสมมติว่าถ้าเราต้องการจะหา intersection ระหว่าง Set ของ Number กับ Set ของ Long ซึ่งในกรณีนี้เราจะต้องสามารถดึง object ของ Long ออกมาจาก Numberได้
เอาละครับคราวนี้ก็มาดูว่าอะไรทำให้ผลลัพธ์ไม่ได้ตามที่ต้องการ จากบรรทัด s.remove(i-1) จะเห็นว่าผลลัพธ์ของ i-1 จะเป็น int และจากคุณสมบัติ Autoboxing ก็จะทำให้ได้ผลลัพธ์เป็น object ของ Integer ให้สังเกตุว่าข้อมูลใน Set ที่เราใส่เข้าไปเป็น Short แต่เวลาจะเอาออกเราหา object ของ Integer ซึ่ง object ของ Integer และ Object ของ Short ไม่สามารถเทียบกันได้ดังนั้นการ remove แต่ละครั้ง จึงไม่มีการเอาอะไรออกจาก set
ถ้าจะให้โปรแกรมนี้ทำงานตามที่ต้องการ พอจะตอบได้ไหมครับว่าต้องแก้ตรงไหน ....

ใช่แล้วครับ ต้องแก้บรรทัด s.remove(i-1) เป็น s.remove((short) (i-1)) ซึ่งจะทำให้ได้ผลลัพธ์เป็น Short
สิ่งที่ได้จากปริศนา Java นี้ก็คือผลลัพธ์ของการคำนวณเกี่ยวกับจำนวนเต็มจะได้เป็น int หรือ long ดังนั้นให้หลีกเลี่ยงการใช้ short ในโปรแกรมนะครับ เขายกตัวอย่างว่ากรณีเดียวที่น่าจะใช้ short ก็คือการใช้ array ของ short เท่านั้น

หมายเหตุ : บทความนี้ผู้เขียนยินดีที่จะให้นำไปเผยแพร่ต่อได้ แต่ขอให้อ้างอิงที่มาว่ามาจากผู้เขียนด้วย

วันเสาร์ที่ 12 กรกฎาคม พ.ศ. 2551

มาทดสอบความรู้ Java กันดีกว่า

สำหรับวันนี้ผมจะขอนำเสนอวีด๊โอที่เกี่ยวกับการเขียนโปรแกรมภาษา Java มาให้ทดสอบความรู้กันนะครับ ผมเห็นว่าน่าสนใจดี ซึ่งผมว่าวีดีโอนี้ไม่เพียงแต่จะแสดงคุณลักษณะของภาษา Java เท่านั้น แต่ยังแสดงให้เห็นการออกแบบบางอย่างที่ไม่ดีของ
คลาสไลบรารีของภาษาอีกด้วย ซึ่งก็น่าจะเป็นตัวอย่างหรือเป็นข้อคิดสำหรับนักพัฒนาระบบบ้านเรานะครับ



อ้อไม่ต้องกังวลถ้าตอบผิดนะครับ ผมก็ตอบผิดครับ :(

วันจันทร์ที่ 30 มิถุนายน พ.ศ. 2551

ภาษาโปรแกรมสำหรับยุคต่อไป

หลังจากบทความที่ผ่าน ๆ มา เป็นการเล่าเรื่องทางไอทีที่น่าสนใจให้ฟัง บทความนี้ก็ขอเขียนเกี่ยวกับการพัฒนาโปรแกรมบ้างนะครับ ผมเคยได้รับคำถามจากนักศึกษาว่าเขาควรจะศึกษาภาษาอะไรดี ซึ่งผมก็ได้ตอบไปว่าให้เรียนภาษาที่สอนกันที่คณะ (Java) ให้เข้าใจแนวคิดการเขียนโปรแกรม แล้วจะสามารถนำไปประยุกต์กับภาษาอื่น ๆ ได้โดยไม่ยาก พอดีวันนี้ได้ไปอ่านบทความนี้ครับ http://www.infoworld.com/article/08/06/23/26NF-dynamic-scripting_1.html เห็นว่าน่าสนใจดี และเกี่ยวข้องกับที่นักศึกษาเคยถามก็เลยเอามาเล่าให้ฟัง ในบทความเขาบอกว่าภาษาสคริปต์จะเปิดยุคใหม่ของการเขียนโปรแกรมครับ ซึ่งเขาเรียกว่า programming to the masses ครับ ซึ่งผมก็ขอแปลว่าการโปรแกรมเพื่อมวลชนครับ :) ซึ่งผมเข้าใจว่าเขาจะเน้นว่าภาษาสคริปต์พวกนี้เขียนได้ง่าย ดังนั้นน่าจะมีผู้คนที่เขียนภาษาเหล่านี้เป็นกันมากขึ้น โดยภาษาสคริปต์ที่ใช้กันบนฝั่งไคลแอนต์ส่วนใหญ่ก็จะเป็น JavaScript ส่วนภาษาสคริปต์บนฝั่งเซอร์ฟเวอร์ก็จะเป็น PHP ซึ่งคงเห็นนะครับว่าก็ไม่ใช่ภาษาใหม่อะไรเลย แต่เป็นภาษาที่เรารู้จักกันมานานแล้ว ซึ่งเหตุผลหลัก ๆ ในความเห็นของผมเป็นดังนี้ครับ ประการแรกก็คือความแพร่หลายของการใช้เว็บเป็นแพลตฟอร์มในการพัฒนาระบบ ความแพร่หลายของเว็บเซอร์วิส ประสิทธิภาพที่เพิ่มขึ้นของคอมพิวเตอร์ และคุณลักษณะบางอย่างที่ทำให้ผู้พัฒนาโปรแกรมรู้สึกว่าการพัฒนาโปรแกรมทำได้ง่ายขึ้น เช่นการที่ตัวแปรเป็นแบบไดนามิก คือสามารถเปลี่ยนประเภทไปได้ตามประเภทข้อมูลที่ใช้ในขณะนั้น (แต่อันนี้ก็แล้วแต่คนชอบนะครับ บางคนอาจไม่ชอบคุณลักษณะที่เป็นไดนามิกแบบนี้ก็ได้) นอกจากสองภาษานี้แล้วก็ยังมีภาษาอื่น ๆ ที่น่าสนใจที่แนะนำในบทความครับเช่น python และ Ruby ถึงตรงนี้แล้วหลายคนก็อาจมีคำถามว่าถ้าอย่างนั้นภาษา Java ภาษา C ภาษา C++ นั้นไม่จำเป็นแล้วใช่หรือไม่ ซึ่งผมก็คงต้องตอบว่าไม่ใช่ ในความเห็นผมภาษาสคริปต์ต่าง ๆ เหล่านี้ เหมาะสมกับการทำงานในลักษณะที่จะเป็นตัวเชื่อม โดยเรียกใช้คอมโพเนนต์ต่าง ๆ ที่มีอยู่มาใช้งานร่วมกัน ส่วนคอมโพเนนต์ต่าง ๆ เหล่านี้ก็ยังคงจะต้องพัฒนาโดยใช้ภาษาหลัก ๆ อยู่ดี ซึ่งตามหลักการของการพัฒนาระบบแบบคอมโพเนนต์นั้น จะมีอยู่สองส่วนด้วยกันคือการพัฒนาเพื่อนำกลับมาใช้ใหม่ (development for resue) และการพัฒนาโดยนำสิ่งที่มีอยู่แล้วมาใช้ (development with reuse) ภาษาอย่าง C++ หรือ Java ก็จะใช้ในการพัฒนาส่วนแรก ส่วนภาษาสคริปต์เหล่านี้ก็จะอยู่ในส่วนที่สอง ในส่วนของบทความผมเห็นด้วยในส่วนที่ว่ามีความเป็นไปได้ที่ภาษาเหล่านี้โดยเฉพาะส่วนที่อยู่บนฝั่งไคลแอนต์ จะกลายมาเป็นภาษาหรับมวลชนจริง ๆ ลองสังเกตุจากพวก Social Web เช่นพวก Hi5 หรือ bloggang ของเราดูนะครับ ตอนนี้ผู้ใช้ทั่ว ๆ ไป เริ่มรู้จักการเขียนภาษา HTML แล้ว โดยอาจจะเริ่มต้นจากการคัดลอกจากเว็บอื่นมาใส่เว็บตัวเอง จากนั้นก็เริ่มศึกษาแล้วก็สามารถเขียนโค้ดของตัวเองได้ ซึ่งผมคิดว่าก็อาจจะเกิดขึ้นได้กับภาษาอย่าง JavaScript เช่นกัน

ดังนั้นก็ฝากไว้ครับว่า ต่อไปผู้ใช้ทั่ว ๆ ไปก็อาจจะเขียนโปรแกรมกันได้แล้ว ส่วนพวกที่เรียนกันมาทางสายคอมพิวเตอร์โดยตรงแล้วยังเขียนโปรแกรมไม่ได้นี่ก็... ลองเติมกันดูเองนะครับ

วันศุกร์ที่ 27 มิถุนายน พ.ศ. 2551

เราอาจจะได้จดชื่อโดเมนอินเตอร์เน็ตในชื่อของเรา

ห่างหายไปหลายวันอีกตามเคยครับ สงสัยช่วงนี้เขียนบล็อกได้แค่อาทิตย์ละวันครับ จริง ๆ มีเรื่องมากมายที่จะมาเล่าให้ฟัง แต่ยุ่งมากครับ
อย่าว่าแต่เขียนเลยแค่จะเข้ามาดูยังไม่มีเวลาเลยครับ ดังนั้นพวกเราทั้งหลายก็อย่าว่ากันนะครับถ้าผมไปเยี่ยมได้น้อยลง หรือเข้ามาตอบอะไรช้าไปบ้าง มาที่บทความดีกว่าครับ สำหรับที่มาก็ตามนี้เลยครับ http://www.iht.com/articles/2008/06/22/business/net23.php
ICANN ซึ่งเป็นองค์กรที่ดูแลชื่อโดเมนใน Internet (พวก .com. org นี่ละครับ) เกิดปิ๊งไอเดียใหม่ครับ คือเขาจะเพิ่มชื่อโดเมนระดับบนสุดขึ้นมาใหม่ โดยให้มีการส่งข้อเสนอเข้ามาครับ ตัวอย่างเช่น hotmail ก็อาจจะยื่นขอจดชื่อโดเมนเป็น .hotmail หรือเมืองใหญ่ ๆ ก็อาจขอยื่นจดชื่อโดเมนเป็นชื่อเมืองได้เช่น .bangkok เป็นต้น เป็นยังไงครับอ่านแล้วอยากจะส่งขอเสนอเข้าไปขอจดบ้างไหมครับ ถ้าอยากลองมาดูราคากันดีไหมครับ ราคาค่าขอยื่นจดนี่ก็ถูกมากครับอยู่ในช่วง 39,000 ถึง 390,000 เหรีญสหรัฐเท่านั้นเอง :) และในกรณีที่ใจตรงกันยื่นจดมาชื่อเดียวกันนี่ทาง ICANN ก็จะเปิดประมูลครับ ประมาณกันว่าถ้าทุกอย่างเรียบร้อยชื่อโดเมนใหม่นี้ก็จะใช้ได้ประมาณต้นปีหน้าครับ แต่ก็มีคนวิจารณ์แนวคิดนี้นะครับ เพราะเขาก็กลัวว่าจะเกิดปัญหาครับ คืออาจจะมีคนไปจดชื่อโดเมนเลียนแบบสินค้ายี่ห้อดัง ๆ และก็ยังมีประเด็นทางศาสนาหรือการเมืองด้วยนะครับ คือเขายกตัวอย่างว่าจะเกิดอะไรขึ้นถ้ามีคนไปจดชื่อโดเมน .jihad ซึ่งจริง ๆ ปัญหาต่าง ๆ เหล่านี้นี่เขาก็ถกกันมาได้ 3 ปี แล้วนะครับ สำหรับผมถ้าถามว่าจำเป็นไหมที่ประเทศเราจะต้องไปจดชื่อโดเมนแบบนี้ ผมว่าถ้ามันแพงนักก็ไม่จำเป็นนะครับ เอาเงินไปทำอย่างอื่นดีกว่า แต่ทางรัฐบาลเขาอาจจะคิดว่าคุ้มก็ได้เพราะถือว่าได้โปรโมตชื่อเมือง ชื่อประเทศไปในตัว และเงินระดับนี้ในระดับประเทศก็คงถือว่าน้อยมาก
ก็ถือว่ามาเป็นเรื่องเล่าสู่กันฟังแล้วกันนะครับ เผื่อปีหน้าใครเห็นชื่อโดเมนใหม่ ๆ มาจะได้ไม่ประหลาดใจ เรามารอดูกันนะครับว่าจะมีชื่อ .bangkok .puket หรือ .chiengmai มาให้พวกเราได้ใช้กันบ้างไหม