Archive for the ‘Computing’ Category

“Generation Click”

Tuesday, December 15th, 2009

กลับบ้านคราวที่แล้ว นั่งคุยกับพ่อเรื่องน่าสนใจหลายเรื่อง เรื่องหนึ่งก็คือ เรื่องผู้ใช้คอมพิวเตอร์ ทั้งเป็นผู้ใช้แบบ user จริงๆ และนักคอมพิวเตอร์ นักเทคโนโลยีสารสนเทศและการสื่อสาร และโปรแกรมเมอร์ generation ใหม่ ที่พ่อผมเรียกว่า Generation Click

คุณพ่อบอกว่า “พวก Generation Click เนี่ย ไม่เจอ icon ไม่เจอเมนู ให้ click ได้ แล้วทำอะไรไม่เป็นเลย” แล้วอีกไม่นาน ก็ต่อด้วย “แบบนี้เขียนโปรแกรมใช้งานเองลำบากแย่เลย เพราะเขียนโปรแกรมจริงๆ ก็แค่เอาคำสั่งพวกนั้นมาต่อๆ กัน ไม่ใช่เหรอ?”

อืมมมมมม เห็นด้วยแฮะ

ก่อนจะพูดต่อไป ขอพูดถึงตัวเองหน่อย ….. ผมอาจจะโชคดีพอ ที่เกิดมาทันสมัย DOS (เครื่องแรกในชีวิต ที่ตั้งที่บ้าน ใช้งาน DOS 5.0 — ไม่มีเมาส์ด้วยซ้ำไป) ทำให้การทำงานกับ command line เป็นอะไรที่เป็นเรื่องปกติ รู้สึก at home กับมันมาก อยากจะให้มันทำอะไร ก็สั่งมันตรงๆ เป็นคำสั่งๆ ไป และแต่ละคำสั่งก็จะมี option อะไรก็ว่าไป ไม่พอ กว่าจะเล่นเกมได้แต่ละเกมๆ ก็ต้องแก้ config.sys, autoexec.bat กันวุ่นวาย ถึงขนาดต้องเขียน batch file เอาไว้เปลี่ยนสองไฟล์นี้เอง ด้วยความรำคาญ

พอชีวิตเริ่มเจอ GUI มากขึ้น ไม่ว่าจะเป็น Windows 3.x, Windows 95 ก็ได้ทุนไปเรียนญี่ปุ่น ก็พอเดินเข้าห้องคอมพิวเตอร์วันแรก ก็เจอ SGI IRIX เจอ GUI แบบไม่เคยเจอมาก่อน และต้องทำงานกับ Shell บน terminal emulator (ถ้าจำไม่ผิด รู้สึกว่าจะเป็น tcsh) ทำทุกอย่างบนนั้นหมด เหมือนกับเปลี่ยนโลกไปเยอะ จากนั้นเพื่อนๆ สนิทๆ กัน (Peter Suranyi, Janos Gyerik) ก็ยุให้เล่น Linux ก็เลยหามาลง ซึ่งก็กว่าจะหาทางทำให้ X-Windows มันทำงานได้ กว่าจะฯลฯ ได้ ก็แทบแย่

ประเด็นคือ การอยู่กับ terminal หรือ command prompt ทุกชนิดของผม ทำให้ผมมองการใช้งานคอมพิวเตอร์ เป็น “บทสนทนา” ระหว่างผมเอง กับคอมพิวเตอร์ ไม่ว่าผมจะใช้โปรแกรมอะไรก็ตามที่สามารถใช้งานในลักษณะ terminal ได้ จะเป็น MySQL, Octave, R หรือว่าโปรแกรมที่เป็น command line-based เช่น imagemagick ที่เอามาประกอบกับ shell scripting ได้ หรือว่า interactive programming environment ต่างๆ เช่น IRB, Python, Scheme, Haskell

กลับมาถึงบทสนทนาระหว่างผมกับคุณพ่อ

คุณพ่อผม เป็นนักปรับปรุงพันธ์พืช ที่ใช้ dBase 3 Plus ในการเก็บข้อมูล มานานมาก และเขียนโปรแกรมใช้งานเอง เริ่มจากใช้งานฐานข้อมูลนั้นๆ ทีละคำสั่งๆ แล้วก็เอาคำสั่งพวกนั้นมาต่อๆ กันเป็น routine/sub-routine และก็เริ่มซับซ้อนขึ้นเรื่อยๆ จนปัจจุบัน เป็นโปรแกรมที่มีความซับซ้อนมาก และทำงานได้ดี ช่วยงานได้เยอะมาก

สิ่งที่ท่านพบก็คือ นักปรับปรุงพันธ์รุ่นใหม่ ซึ่งใช้คอมพิวเตอร์ในการทำงานมากขึ้น ไม่ว่าจะในการวิเคราะห์ทางสถิติ หรือว่าการวิเคราะห์อื่นๆ กลับไม่ค่อยจะสามารถพัฒนากระบวนการคิดนั้นๆ ได้ และไม่สามารถที่จะมองความเชื่อมโยงระหว่าง process ระหว่างโปรแกรมได้เท่าไหร่ ไม่ต้องพูดถึงเรื่องเขียนโปรแกรมเลย ยิ่งกว่านั้น ในการทำงานทุกอย่าง จะมองหาแต่ icon ของคำสั่ง กระบวนการทำงานโดยทั่วไปคือ select & click และมองไม่ออกว่า จริงๆ สิ่งที่ทำๆ อยู่เนี่ยแหละ คือ “การสนทนา” ที่หากว่าบันทึกไว้ มันก็คือการเขียนโปรแกรมน่ะแหละ แต่พวกนี้กลับรักที่จะทำทุกอย่างแบบ manual แทน (เพราะว่าตัวเองได้เป็นคน click icon คำสั่งกระมัง)

มันเลยกลับมาถึงเรื่องที่ผมบ่นๆ ไว้บ่อยๆ เรื่องนักศึกษาในสาขาวิชาที่ต้องเรียนเขียนโปรแกรม ซึ่งพบว่า มีปัญหากับกระบวนการคิดค่อนข้างเยอะ และไม่สามารถคิดอะไรในลักษณะ “เอาคำสั่ง มาต่อกัน” หรือ chain ของ Input-Process-Output ได้เลย

ผมลองตั้งโจทย์คร่าวๆ ว่า “มีไฟล์อยู่หนึี่งไฟล์ ข้างในไฟล์มีคำอยู่เยอะ ซ้ำๆ กัน ผมอยากรู้ว่ามีคำไม่ซ้ำกันทั้งหมดกี่คำ?” (ทั้งนี้ คำทุกคำ เป็นตัวเล็กหมด และไม่มีอักขระแปลกๆ ตัวอย่างเนื้อความในไฟล์คือ this is a cat this is a bat this is a map this is a phone)

เชื่อหรือไม่ว่า ไม่มีนักศึกษาสามารถคิด logic ของโจทย์นี้ได้แบบเป็นขั้นเป็นตอน ชัดเจน ได้แม้แต่คนเดียว ใน class ที่ผมสอน! ทั้งๆ ที่ logic มันง่ายแสนจะง่าย ก็แค่

  • เปิดไฟล์ เอาเนื้อความ
  • เอาเนื้อความในไฟล์มา แยกเป็นคำๆ
  • เอาคำที่ได้ มากรองเอาคำซ้ำออก
  • นับคำที่เหลือ

จะเห็นว่า มันก็เป็น chain ของ I-P-O อยู่ชัดเจนนะ คือ สมมติว่ามันเป็นฟังคชัน f, g, h, i ตามลำดับ ก็จะได้ว่าคำตอบของมันก็คือ i(h(g(f(x)))) … เขียนให้มันง่ายๆ กว่านี้หน่อย สมมติว่าเป็นฟังคชันชื่อ readfile, splitwords, unique_element, count ตามลำดับ ก็เป็น count(unique_element(splitwords(readfile(”filename”)))) ใช่มั้่ย จากนั้นก็แค่เอาไปดูว่า แต่ละภาษาหรือ environment เนี่ย เอามาทำแบบนี้ยังไงดี มีฟังค์ชันมั้ย ต้องเขียนเองมั้ย ถ้าจะเขียนเองจะต้องเขียนยังไง ก็แค่คิด I-P-O แบบเดิม ลงไปให้ลึกขึ้น เท่านั้น

ถ้าเขียนใน bash shell ก็คงเป็น

cat filename.txt | tr " " "\n" | sort -u | wc -w

ถ้าเป็น ruby ก็เป็น

File.read("filename.txt").split(" ").uniq.count

ถ้าเป็น haskell ก็เป็น

content <- readFile "filename.txt"
length (List.nub (words content))

ซึ่งจะซับซ้อนกว่าตัวอื่นๆ นิดหน่อย เพราะว่ามีเรื่อง IO String กับ String มาเกี่ยวข้อง (purely functional ก็แบบนี้แหละ)

แถม … เป็น C++ ก็ยาวหน่อย (ไม่รวมพวกการ include library มาใช้นะ)

int main()
{
  ifstream fin("filename.txt");
  set<string> words;
  copy(istream_iterator<string>(fin), istream_iterator<string>(),
       inserter(words, words.begin()));
  cout << words.size() << endl;
  return 0;
}

จะเห็นว่า logic มันไม่ได้เปลี่ยนเลยสักกะนิด เพียงแต่ว่าอาจจะ verbose บ้าง รูปแบบต่างกันบ้าง คำสั่งต่างกันบ้าง

วันนั้นข้อสรุปของบทสนทนาระหว่างผมกับพ่อก็คือ Generation Click พบความลำบากมากกว่า ในการคิดสื่อสารกับคอมพิวเตอร์เป็นขั้นตอน ด้วย text ด้วยคำสั่งต่างๆ ดังนั้นอาจจะช่วยได้ หากทุกคำสั่งมันมี icon หมด และลากมาวางต่อๆ กันได้ เหมือนกับ automator.app ใน Mac OS X หรือบรรดา visual programming ทั้งหลาย

สมัยผมสอน OOP ผมเคยให้ นักศึกษาเล่นกับ Alice ซึ่งก็เป็น visual programming พอสมควร ก็พบว่าได้ผลในระดับหนึ่ง แต่ว่าพอถึงเวลาต้องไปเขียน code ซึ่งเป็น text ก็ยังพบปัญหาเดิมๆ อยู่ เทอมนี้ก็เลยขอหักดิบ ให้ใช้งาน shell มันซะเลย เผื่ออะไรๆ จะดีขึ้นมาบ้าง

ลงท้ายด้วยการเผา advisee หน่อยละกัน … เจอพวกที่แทนที่จะคิด logic ของระบบงาน กลับคิดแต่ว่าจะต้องใช้โปรแกรมอะไร ต้องเริ่ม click ที่ปุ่มไหน แล้วจะ click ปุ่มไหนต่อ งานถึงจะเสร็จ ….​ ฮา (ไม่ออก)

ปัญหา ความเคยชิน “ก๊อปโค๊ดมาแก้” #2

Monday, February 2nd, 2009

สืบเนื่องจาก entry ที่แล้ว

ทำไมรู้สึกว่านับวันยิ่งเจอกรณีที่ confirm ความรู้สึกแย่ๆ กับเรื่องนี้ก็ไม่รู้ … แล้วคนที่ทำให้เราต้องมาหงุดหงิดกับเรื่องแบบนี้ก็นะ ทำไมถึงไม่พัฒนาอะไรเลยก็ไม่รู้

แต่วันนี้หายหงุดหงิดแล้วล่ะ ปลงแทนดีกว่า ….. ว่าแล้วก็ไปถ่ายรูปเล่นดีกว่า ผ่อนคลาย คลายเครียดกันดีกว่า

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

แต่ว่าถ้าทำกลับกัน คือ ไปทำตามเทคนิคเฉพาะเรื่องก่อน แล้วค่อยพยายามแก้ไขพื้นฐานให้รองรับสิ่งที่ตัวเองต้องการทีหลัง มันจะยากกว่ากันมาก … แต่ว่ามันจะเหมือนกับว่า “ได้ผลเร็ว” เพราะว่าสิ่งที่ทำให้ได้ผลเฉพาะอย่าง และเห็นผลเฉพาะอย่างเนี่ย มันคือเรื่องเทคนิค

แต่นั่นก็เลยทำให้ทุกอย่างยากขึ้น และคุณต้องแก้ไข Model พื้่นฐานของระบบ ในลักษณะ Hack หรือ Workaround มากขึ้น และถึงจุดหนึ่งมันจะยิ่งทำให้ทุกอย่างมันซับซ้อนมากขึ้น และการนำเอาเทคนิคอื่นๆ เข้ามาเพื่อบรรลุวัตถุประสงค์อื่นๆ ในงาน มันจะยากขึ้น และพบปัญหามากขึ้น และจุดนี้เองที่น้องๆ มักจะเริ่มเจอปัญหาชัดๆ และมักบอกว่า

เอาไอ้นี่มาใช้แล้วมีปัญหาครับ/ค่ะ

ซึ่งจริงๆ ปัญหาที่แท้จริงคือ พวกน้องไม่ได้เริ่มจากพื้นฐานตั้งแต่แรกน่ะครับ คือ ไม่ได้วางหรือคิดระบบตั้งแต่พื้นฐาน พอจะทำอะไรก็เลยยากไปหมด และมีปัญหาโผล่มาได้ทุกที่ เพราะว่ามันเป็นการทำโปรเจคจาก “นอกเข้าใน” ไม่ใช่การพัฒนาจาก “แก่น” ของระบบเลย

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

ปัญหา ความเคยชิน “ก๊อปโค๊ดมาแก้”

Saturday, January 17th, 2009

ว่าจะไม่เขียนเรื่องนี้แล้ว แต่ว่าเขียนหน่อยก็ดี จากเด็ก ICT ที่ทำโปรเจคกับผมเอง ขอยก conversation มาทั้งหมดกันแล้ว

rp: ./configure: งานเป็นไงมั่งน้อง
IKE::: ก้อกำลังปั่นค่ะ
rp: ./configure: เหอๆ
IKE::: ได้ พี่คนหนึ่งช่วยสอน
rp: ./configure: ปั้นเหน่งป่ะ?
rp: ./configure: ใช่ @punneng ใน twitter หรือเปล่า
IKE::: ได้ข่าวว่ารู้จักกะอาจารย์ด้วย
IKE::: ช่ายคร๊าา
rp: ./configure: อ่อ
IKE::: พี่เค้าสอน แบบว่ายาวนานมาก
IKE::: วัน ละ 5hr ได้
IKE::: เอากาน แบบว่า รื้องานทำใหม่กานเลย
rp: ./configure: แล้วดีขึ้นมั้ย
IKE::: ไม่แงะcode เก่าแบบไม่เข้าใจ เร่ิมทำใหม่เลยน้อง ประมาณนั้น
IKE::: ดีขี้น มากมายอะคร่ะ
IKE::: เข้าใจ ตั้งแต่แรกเลย
rp: ./configure: ได้หมอนี่สอน ค่อยยังชั่วหน่อย
IKE::: รู้งี้ รู้จักพี่เค้า แต่แรกดีกว่า
rp: ./configure: เฮ้อ ก็พวกคุณมันเล่นไม่ทำความเข้าใจอะไรเลยนี่หว่า
IKE::: งานคงออกมาหรูกว่านี้เยอะ
rp: ./configure: ก็พวกคุณเล่นไม่พยายามทำความเข้าใจอะไรจริงๆ จังๆ นี่หว่า …. เล่นลอกโค้ดๆ แล้วก็มาพยายามแก้ๆ กันอย่างเดียว
IKE::: ช่ายๆๆ
IKE::: เปลี่ยนแนวคิดใหม่ด้วย
IKE::: พี่เค้า สอน ดีมากเลย สอน ให้คิดแบบที่ควรจะเป็น
rp: ./configure: ก็ดีแล้ว
rp: ./configure: ปัญหาของพวกคุณ (และเด็กทุกคนที่รู้จัก) คือ ไม่ทำความเข้าใจ ไม่พยายามทำความเข้าใจ และปฏิเสธที่จะทำความเข้าใจ ใน “แนวคิด” ใน “วิธีคิด” และใน “คอนเซปท์” ทุกคนพยายามลัดไปที่โค้ดหมด
rp: ./configure: ลอกโค้ด เอาโค้ด รันได้ แก้โน่นนี่ ปะๆๆ มันเข้าไป
rp: ./configure: อะไรแบบนั้น
rp: ./configure: ก็ดี ได้เริ่มคิดใหม่
IKE::: ค่ะ ยอมรับผิดแต่โดยดี
rp: ./configure: ดีกว่าไม่ได้เลย
IKE::: แต่พี่เค้าสอน ทุ่มเท มากอะค่ะ
IKE::: เดี๋ยววัน อาทิต นี้ ก้อ ไปให้เค้าสอน อีก
IKE::: พี่เค้าแบบว่า ไม่เน้น งานเสร็จ แต่ว่าเน้น เข้าใจในสิ่งที่ทำมากกว่า

อยากจะกราบขอบคุณ @punneng มากๆ เลย แต่คงไม่ได้เจอตัวจริงๆ กันซะที ก็เลยทำมันซะที่นี่น่ะแหละ แล้วก็อยากจะฝากสิ่งที่ผมคุยกับน้อง IKE ให้เป็นอุทาหรณ์กับน้องคนอื่นๆ ด้วยนะครับ

ว่า “อย่าลัดไปที่ coding” นะครับ มันไม่ค่อยจะช่วยอะไรคุณหรอก ถ้า paradigm ของความคิดมันเหมือนๆ เดิมที่คุณคุ้ยเคยมา ก็ดีไป แต่ว่าถ้ามันไม่ใช่แบบนั้น มันจะแย่เอาง่ายๆ และถ้ามันเป็นการแก้ไขง่ายๆ เล็กๆ น้อยๆ ก็อาจจะโอเค แต่ว่าถ้ามันเป็นเรื่องของการพัฒนาโปรแกรมขนาดใหญ่กว่านั้นขึ้นมาเมื่อไหร่เนี่ย ถ้าไม่กลับไปที่พื้นฐาน (back to basic) จะแย่เอาง่ายๆ เพราะว่ามันอาจจะทำให้อะไรหลายๆ อย่างแย่ในระยะยาวได้ง่ายๆ เลยทีเดียว

rp: ./configure: ปัญหาของพวกคุณ (และเด็กทุกคนที่รู้จัก) คือ ไม่ทำความเข้าใจ ไม่พยายามทำความเข้าใจ และปฏิเสธที่จะทำความเข้าใจ ใน “แนวคิด” ใน “วิธีคิด” และใน “คอนเซปท์” ทุกคนพยายามลัดไปที่โค้ดหมด
rp: ./configure: ลอกโค้ด เอาโค้ด รันได้ แก้โน่นนี่ ปะๆๆ มันเข้าไป

จริงอยู่นะครับ การเริ่มต้นแบบนั้นมันทำให้เรา “เหมือนจะ” สร้าง application ที่เป็นรูปเป็นร่างขึ้นมาได้รวดเร็วกว่า แต่ว่ามันจะทำร้ายเราในระยะยาวนะครับ เมื่อเวลาที่เราต้องเพิ่มโน่นเพิ่มนี่ แก้โน่นแก้นี่ ฯลฯ ซึ่งจะต้องทำมันอยู่แล้ว …

จริงๆ แล้วด้วยความสะดวกของเครื่องมือสมัยนี้ (ยกตัวอย่างเช่น bootstrapping method ต่างๆ ใน framework สมัยใหม่ ที่สร้างโครงของโปรแกรมพร้อมใช้งานให้เราเลย หรือว่าพวก migration tools และ version control ต่างๆ) มันช่วยให้เราทำงานขึ้น application ได้เร็วมากๆ อยู่แล้ว ดังนั้นเราควรใช้เวลากับการออกแบบดีไซน์ และคอนเซปท์มากขึ้นกว่าเดิม ไม่ว่าจะเป็นเรื่องของ entity relation ต่างๆ เรื่อง use cases ต่างๆ และเรื่องของ usability เป็นต้น และถึงเวลาที่จะต้องไปขึ้น application มันจะทำได้ง่ายและรวดเร็วมาก

สืบเนื่องเรื่องนี้นะครับ วิชา Object-Oriented Programming ที่ผมสอนเทอมนี้ ดู coding แล้ว “ห่วยบรม” ส่วนหนึ่งก็เพราะว่าผมยังไม่ได้สอนลง coding เลย ผมถือว่าผมจัดสอบส่วนของ Lab (ที่เป็น coding) เพื่อเก็บข้อมูลเบื้องต้นเท่านั้น ว่าพื้นๆ ฐานๆ ของน้องๆ ในเรื่องของการเขียน code (ที่ผมย้ำนักหนา .. ว่าเรียนคอนเซปท์ไปอย่างหนึ่งเนี่ย มันมากพอที่จะไปหัด coding เอง ซึ่งก็ดูเหมือนจะไม่ทำกันเลย) นั้นเป็นอย่างไรบ้าง

แต่ว่าเท่าที่ดูจากความเข้าใจ concept ก็ดูค่อนข้างจะดีพอสมควรแล้วล่ะครับ

Chrome: ยิ่งกว่า Browser War ครั้งใหม่

Thursday, September 11th, 2008

รู้สึกว่านานแล้วที่ไม่ได้ meta-blogging จาก OSNews เพราะว่าพักหลังๆ รู้สึกว่าคุณภาพของบทความมันตกๆ ลงไปจากเมื่อก่อนเยอะเหมือนกัน จนกระทั่งถึงวันนี้เจอเรื่องน่าสนใจมากจนอดไม่ได้ที่จะ blog มันหน่อย

There’s More Than a Browser War

ก็ตั้งแต่ Google ออก Chrome น่ะแหละครับ ที่หลายคนคิดว่าจะเป็นสงคราม browser ใหม่อีกครั้งหรือเปล่า หรือว่า Google ทำไปเพื่อวัตถุประสงค์อะไรกันแน่ จากมุมมองของธุรกิจและความอยู่รอด ตลอดจน Business Identity และ Organization Identity ของ Google เอง ว่าทำไม Chrome (จากมุมมองของผู้เขียนบทความนี้) จึงเป็นหมากตาสำคัญที่สุดหมากหนึ่งบนกระดาน ที่ Google ต้องเดินเพื่อ “ปกป้องตัวเอง”

เป็นบทความที่อ่านแล้วได้คิดดีเหมือนกัน เลยเอามาแชร์กันต่อ

Real World Haskell และ รักแรกพบ

Wednesday, August 20th, 2008

ไปเจอมา เอามา note ไว้สำหรับตัวเองและเพื่อนๆ พี่ๆ น้องๆ ทุกท่านที่สนใจ Haskell เป็นหนังสือที่ดีพอสมควรเลยทีเดียว ละเอียด ตัวอย่างเยอะ ค่อนข้างเป็นปัจจุบันมากๆ และมีประโยชน์กับ Real World จริงๆ (บ้างล่ะน่า) ไม่ใช่แบบหนังสือ Functional Programming ทั่วไปที่ยกว่า FP ดีอย่างนั้นอย่างนี้ แต่ว่าไม่ค่อยจะมีตัวอย่าง Real World ที่มัน convincing เท่าไหร่เลย ยกแต่ประโยชน์ที่ … ขอโทษนะ ต้องบอกว่า “ถ้าไม่ได้เขียน FP เป็นอยู่แล้ว ก็คงจะไม่ซึ้งกับมันเท่าไหร่ ว่ามันเจ๋งแค่ไหน” มากกว่า

แปะลิงค์ก่อน

Real World Haskell (beta) by Bryan O’Sullivan, Don Stewart, and John Goerzen

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

เรื่องของเรื่องมันมีอยู่ว่า วันนั้นนั่งเขียนโปรแกรมอะไรซักอย่างอยู่ในห้องคอมพิวเตอร์ที่มหาวิทยาลัย Tsukuba (ไม่ได้เขียนอะไรใหญ่โตหรอก รู้สึกจะหัดเขียนพวก data structures เล่นอยู่) แล้วเพื่อนสนิทมากที่สุดคนหนึ่ง ชื่อ Nao Hirokawa (จริงๆ แล้วเป็นรุ่นพี่) ก็เดินเข้ามา แล้วก็ชวนคุยเล่นกันโน่นนี่ พอเห็นที่เราเขียนเล่นอยู่ ก็ถามว่า “เฮ้ ทำไมไม่ใช้ Haskell?” เราก็เลยถามว่า มันคืออะไรหว่า Hirokawa ก็เลยถามว่า รู้จัก Quick Sort มั้ย แหม ใครจะไม่รู้จัก เค้าก็เขียน Quick Sort เป็น Haskell ให้ดู พร้อมกับที่เราอ้าปากค้างตาโต (โดนแหก — จริงๆ แล้วรู้สึกว่า Quick Sort นี่เป็นตัวอย่างตลาดของ Haskell เลยนะ .. คงไม่มีใครไม่ยกตัวอย่างอันนี้มาแหกตาชาวบ้านเวลาโชว์ Haskell) แล้วก็เล่น List Comprehension ให้ดูอีกนิดๆ หน่อยๆ

นั่นแหละ รักแรกพบครั้งแรกในชีวิต

10 คอมพิวเตอร์ที่สวยที่สุด

Monday, April 14th, 2008

เมื่อวันก่อนมีเรื่อง Computer ประหลาด 10 แบบ วันนี้มาเรื่องคอมพิวเตอร์สวยๆ บ้าง อ่านจาก OSNews ครับ

The Ten Most Beautiful Computers โดย Thom Holwerda

มีโดนใจหลายตัวครับ เคยใช้หลายตัวเหมือนกัน แต่ว่าหลายตัวก็ไม่เคยใช้

บทความนี้อ่านชื่อคนเขียนแล้วแทบจะบอกได้เลยว่า อันดับ 1 คืออะไร

แง …. อยากได้ G4 Cube T_T

Lambda และ Closures ใน C++0x

Thursday, April 10th, 2008

ในที่สุดสิ่งที่รอมานานกับภาษาแรกๆ ที่หัดเขียนโปรแกรมก็เป็นจริงซะที หลังจากที่มันพยายามทำตัวเป็น Functional language แบบห่วยๆ (ลูกผีลูกคนเกินไป) มานานแล้วตั้งแต่ STL ….

C++ and Lambda Function Tradeoff: Clutter vs. Expressiveness (จาก Beautiful Code)

ช่วงนี้ภาษาหลายภาษาเริ่ม propose การเอาความสามารถของภาษาตระกูล Functional (พวก Lisp, Haskell) เช่น Lambda expression เข้ามาเป็นส่วนหนึ่งของภาษามากขึ้น ซึ่งหลายภาษาทำแล้วก็ดูดีขึ้น เลยทำให้เรามีความคาดหวังสูงพอควรกับภาษา C++0x ล่ะมั้ง

แต่ว่าพออ่านจาก ISO C++ Standards Meeting report …. โอ้ว แม่เจ้า ทำไมมัน clutter ได้ขนาดนั้น แบบนี้ไม่ค่อยจะปลื้มเลยนะเนี่ย

ผมคิดมาตั้งนานแล้ว ว่าข้อเสียที่ใหญ่ที่สุดของ C++ มันคือสิ่งที่มันพยายามให้เป็นข้อดีที่สุดน่ะแหละ คือการเป็น multi-paradigm language โดยที่ไม่มี paradigm ไหน dominant เท่าไหร่

ผลที่ตามมาน่ะเหรอครับ? ทุกวันนี้หลายคนก็ยังเขียน C++ แบบ C/Pascal หลายคนก็ยังเขียน OOP กับ C++ ไม่เป็น OOP ฯลฯ ไม่พอ ตอนที่ STL เริ่มจะมีความสามารถแบบ Functional ตลอดจนการมี Function Object และฟีเจอร์อื่นๆ อีกมากมาย ทำให้มีผลอย่างหนึ่งคือ การเขียนโปรแกรมเพื่อทำงานอย่างหนึ่งใน C++ เนี่ย มันทำได้หลายแบบเกินไป…. ถ้าเป็นหลายแบบใน paradigm เดียวกันคงจะไม่เป็นไรเท่าไหร่ แต่ว่านี่มันหลายแบบในหลาย paradigm

แบบนี้สับสนตายชัก และนับวัน C++ ก็จะมี identity crisis มากขึ้นทั้งที่มันไม่ควรเป็นแบบนั้น

เสียดาย…​เสียดาย

เท่าที่ดูผ่านๆ จากตัวอย่าง ถ้าให้ผมเลือกระหว่างการใช้ Lambda expression ใน C++0x กับเลือกใช้ Function object ผมคงจะเลือกอย่างหลัง ….​ เพราะว่ามันยังอ่านง่ายกว่า code มันสวยกว่า (สะอาดกว่า) ทั้งๆ ที่ใจชอบ Lambda มากกว่า (ใช้มันทุกภาษา…. ถ้ามีให้ใช้ …​และแล้วก็คงจะเจอข้อยกเว้นจนได้ — ถ้าวันนั้นยังเขียน C++ อยู่นะ)

CountryData, CityData ใน Mathematica 6

Thursday, April 10th, 2008

ใช้ Mathematica มาตั้งหลายปี (ห้าปีได้แล้วมั้ง? ถ้าเป็นแฟนก็คงกำลังอยู่ในช่วงคบใกล้เลิกพอดี จากระยะเวลา ….) เพิ่งจะรู้ว่าเวอร์ชันนี้มันมีของเล่นใหม่เยอะตอนตามอ่าน Wolfram Blog น่ะแหละ ของเล่นอื้อซ่าเลย

วันนี้ลองเข้าไปอ่านๆ ดู เจอของดีน่ะ ว่ามันมี CountryData กับ CityData ให้ใช้ด้วยแฮะ พอเรียกใช้แล้วมันจะติดต่อกับ server ของทาง Wolfram แล้ว update ข้อมูลใหม่ให้เราเองตามที่เราต้องการ

เจ๋งดีอ่ะ

แต่ว่าช้านิดแฮะ อย่างว่า สงสัยไม่ Net เรามันไม่ค่อยจะเร็วเท่าไหร่ ก็ข้อมูลมันเยอะ นี่ลองทำตามตัวอย่างดูหน่อย

CountryData["France", "Shape"]

แล้วก็รอชาตินึง (ก็พวกเล่นลงข้อมูลทีเดียวทั้งโลกนี่หว่า) ก็ได้ผลเป็นรูปร่างของประเทศฝรั่งเศส นอกจากนั้นก็ยังมี attribute ให้เล่นอีกหลายตัว เช่น Population หรือว่าข้อมูล GDP แต่ละปี

เสร็จแล้วเราก็ลองของไทยดูบ้าง… อืมม สิบปากว่าไม่เท่าตาเห็น ลองดูเองดีกว่า

mathematica1.png

เจ๋งแฮะ ทำให้ชักอยากจะกลับมาลองเล่น Mathematica 6 จริงๆ จังๆ ซะแล้ว (ตอนที่ 5 ออกนะ ไม่ค่อยมีความรู้สึกว่ามันต่างจาก 4 เท่าไหร่ พวก WOW factor แบบนี้ต่ำพอควร หรือว่าผมคิดไปเองก็ไม่รู้)

GNUstep 1.6, 1.8 LiveCD

Thursday, April 10th, 2008

อ่านจาก OSnews เรื่องข่าว 1.6 LiveCD ไม่ทันไรก็มีข่าว 1.8 LiveCD อีก

รู้สึกว่าช่วงนี้จะ active มากหน่อยนะเนี่ย …. เคยชอบมากเลย project นี้ แต่ว่าพอเปลี่ยนจาก Linux มาเป็น OS X แล้วก็ไม่ค่อยได้เล่นเท่าไหร่ รู้สึกว่าครั้งสุดท้ายที่ลองเล่นนี่ชาตินึงแล้วมากๆ

รู้สึกดีจัง กับ project ที่เราเคยชอบมากๆ … แต่ว่าด้วยอะไรหลายๆ อย่างทำให้ต้องเลิกเล่นไป แล้้วก็ไม่ได้ contribute อะไรเลย (แม้แต่ code ซักบรรทัด — เคยคิดว่าจะทำ app ไปลง GNUstep เหมือนกัน …​แต่ว่าไม่ล่ะ ตอนนี้อยากลองเขียนลง iPhone มากกว่า)

วันนี้กลับออฟฟิชเมื่อไหร่ จะลองเล่นดูครับ

Smallest Turing Machine Found & Proved!

Friday, October 26th, 2007

Alex Smith นักศึกษาปริญญาตรีจากมหาวิทยาลัย Birmingham ได้พิสูจน์ว่า Turing Machine ที่มี 2 states และ 3 colors (symbols) เป็น Universal Turing Machine (UTM) ซึ่งเป็น UTM ที่เล็กที่สุดที่จะเป็นไปได้

การพิสูจน์นี้ทำให้ Alex ได้เงินรางวัล $25,000 จาก Wolfram Research Prize และเป็นการสิ้นสุดการหา UTM ที่เล็กที่สุดที่จะเป็นไปได้ (มีการค้นหากันมาครึ่งศตวรรษแล้ว) และมันเป็น fact ที่รู้กันว่า ไม่มี Turing Machine ที่มี 2 states, 2 symbols จะเป็น Universal ได้

ซึ่งการพิสูจน์นี้เป็น insight ที่อาจจะส่งผลให้มีการเปลี่ยนแปลงบางอย่างในโลกของ computing เช่นอาจจะนำไปสู่การสร้าง computing machine ที่ระดับโมเลกุล เป็นต้น ซึ่ง comment นี้สามารถอ่านได้จาก blog ของ Stephen Wolfram เอง

นอกเรื่องนะ…..

ผมรู้สึกเฉยๆ และค่อนไปทางไม่ค่อยจะชอบ Stephen Wolfram เท่าไหร่ เพราะว่าอะไรหลายๆ อย่าง ตอนแรกก็ admire นะ แต่ว่าพอหนังสือ A New Kind of Science (หนังสือ online full version จากเจ้าของเอง) ออกมานี่ค่อนข้างจะ negative เพราะว่า claim ผลงานชาวบ้านเป็นของตัวเองเยอะเหลือเกิน โดยเฉพาะการพิสูจน์ว่า Cellular Automata กฏ 110 ซึ่งเทียบเท่ากับ Turing Machine มี 2 states, 5 symbols ว่าเป็น UTM ที่ Wolfram claim ว่าเป็นของตัวเอง ทั้งที่จริงๆ คนที่พิสูจน์ได้จริงๆ คือ Matthew Cook ซึ่งทำงานเป็นผู้ช่วยวิจัยให้กับ Wolfram

เรื่อง Cook กับ Wolfram และการพิสูจน์กฏ 110 นี่ควรหาอ่านได้ยาวๆ จากหลายๆ ที่บน internet แต่ว่าเพราะ Wolfram ไล่ฟ้องชาวบ้านเค้าทั่วไปหมดที่พูดเรื่องนี้ทำให้อาจจะหาไม่ค่อยจะได้

อ่อ ลืมไป ใครคิดจะอ่าน A New Kind of Science นี่ พยายามลองหา review ของนักวิทยาศาสตร์ที่เป็น critiques มาลองอ่านดูก่อนก็ดีนะครับ เพราะว่ามันมีอะไรหลายๆ อย่างที่ อืมมมมม ไม่ค่อยจะดีเท่าไหร่ แต่ว่าคนที่ไม่รู้ deep technical หรือว่า deep theoretical understanding มาก่อนเลย อาจจะได้รับความรู้อะไรหลายอย่างผิดๆ ไปเยอะพอควร เช่น

  • review ของ Lawrence Gray อันนี้เจ๋งมาก
  • หรือของ Cosma Shalizi
  • หรือว่า ใน slashdot แต่ว่าเลือกเชื่อ comment/review ใน slashdot เอาเองนะ …

จริงๆ มีเยอะกว่านี้เยอะ แต่ว่าไม่ได้เก็บ link ไว้เลย ตอนนี้ขี้เกียจหา แต่คิดว่าหาไม่ยาก

อีกอย่าง หนังสือเล่มนั้น dismissed prior knowledge แทบจะทั้งหมดเลย ทั้งๆ ที่อะไรหลายๆ อย่างมีคนค้นพบมาก่อนแล้ว และเป็น known facts เสียด้วยซ้ำ โดยเฉพาะเรื่องที่ระบบที่มีกฏพื้นฐานที่เรียบง่าย สามารถมีพฤติกรรมที่ซับซ้อนยากยิ่งต่อความเข้าใจ และเรื่องอื่นๆ ฯลฯ อ่อ ใช่ หนังสือเล่มนั้น (edition ที่ผมมี) ไม่มี reference เลยนะครับ และ Wolfram พูดถึงทุกอย่างใน passive tone มาก

A New Kind of Science (NKS) ก็เป็น interesting read ครับ แต่ว่าอย่าไปเชื่อมันมากนัก เพราะว่าหลายๆ อย่างในนั้นก็ไม่ได้ significant ขนาดที่คนเขียนหนังสือพยายามจะให้มันเป็น

แต่ว่าการที่พิสูจน์ได้ว่า TM ขนาด 2 states, 3 symbols เป็น UTM นี่ significant ครับ โดยไม่เกี่ยวกับ Stephen Wolfram :-P และครั้งนี้ผมเห็นด้วยและยินดีที่ Wolfram ให้ credit ที่ถูกต้องกับคนที่ค้นพบความจริงข้อนี้ครับ

อ่าน PDF ของการพิสูจน์ ของ Alex Smith ครับ

[update 1]: เพิ่ม list ของ review หนังสือ A New Kind of Science