อะไรจะดีกว่ากัน?


วันนี้ผมบังเอิญไปอ่านพบข้อถกเถียงบางอย่างในเว็บขณะที่กำลังหาข้อมูลสำหรับมาทำงาน ประเด็นที่ถกเถียงกันนั้นเป็นประเด็นที่เร่าร้อนในนั้นพอสมควร แต่มีเรื่องหนึ่งที่สะดุดตาเข้า และเห็นว่าน่าสนใจดีก็คือเรื่องของ algorithm ครับ ลองดูตัวอย่างโค้ดการบวกเลขตั้งแต่ 1 ไปจนถึง 100
แบบที่ 1
c# VB
int result = 0; Dim result As Integer = 0
for (int i = 1; i <= 100; i++) { For (i As Integer = 1 To 100)
    result += i;     result += i
} Next
Console.WriteLine(result); Console.WriteLine(result)
 
แบบที่ 2
int result = ((100 + 1) * (100 / 2)); Dim result As Integer = ((100 + 1) * (100 / 2))
Console.WriteLine(result); Console.WriteLine(result)
หรืออาจจะเขียนรวบรัดตัดความได้เป็น
Console.WriteLine((100 + 1) * (100 / 2)); Console.WriteLine((100 + 1) * (100 / 2))
 
ทั้งสองแบบคำนวณได้ผลลัพธ์เท่ากัน คือ 5050 แต่วิธีการต่างกันอย่างสิ้นเชิง
 
แบบแรกก็เกรียนเลยครับ ตรงๆ ทื่อๆ เอาแรงเข้าว่า บวกเลขร้อยรอบ ตรูก็วนบวกมันร้อยรอบละฟระ ส่วนแบบที่สองใช้สูตรทางคณิตศาสตร์มาช่วยคำนวณ
 
ความแตกต่างที่เห็นได้อย่างชัดเจนคือ ความเรียบง่ายและความซับซ้อนของโค้ด แบบแรกใครๆมองเผินๆก็เดาได้ครับว่า บวกตัวเลขตั้งแต่ 1 ถึงร้อย โค้ดอ่านง่ายมาก แต่แบบที่ 2 นี่ถ้าไม่ใช่นักพัฒนาโปรแกรมมือฉมังหรือนักคณิตศาสตร์ตัวเอ้ มาอ่านแล้วงงหน่อย ตกลงมานจะทำอะไรฟระนี่ ???
 
สิ่งที่แตกต่างกันอย่างที่สองคือ ประสิทธิภาพครับ แบบแรกเนี่ย ประสิทธิภาพต่ำแน่นอน เพราะมันลูปตั้งร้อยรอบ ส่วนแบบที่ 2 นั้นมันทำงานภายในคำสั่งเดียวประมาณ 5-6 รอบสัญญาณนาฬิกาเท่านั้น (1. Move 100 To A, 2 increment A, 3 blah blah blah…. อันนี้ผมกะๆเอา เวลาที่คอมไพล์ออกมาได้ แบบคร่าวๆนะครับ ไม่อยากอ้างอิงวิชาการมากนัก เดี๋ยวจะหลงประเด็นกันไป)
 
แต่สำหรับเราๆท่านๆ การวนลูปร้อยรอบ กับการประมวลผลคำสั่งเดียวในแบบที่สองนั้น ผลลัพธ์มันมาถึงเราภายในวินาทีเท่านั้น ความรู้สึกไม่ต่างกันมากนัก สำหรับผู้ใช้ทั่วๆไปก็เช่นกัน และด้วยความรู้สึกเช่นนี้ทำให้นักเขียนโปรแกรม "บางคน" ละเลยการใช้สูตรคำนวณทางคณิตศาสตร์ที่ยุ่งยากซับซ้อนและหันมาเขียนด้วยวิธีง่ายๆ เพื่อที่จะอ้างว่า "มันก็ทำงานได้นี่" หรือ "ยูสเซอร์เค้าไม่สนหรอกว่าคุณเขียนโปรแกรมยังไง ดีเลวแค่ไหน เค้าสนว่างานออกมาหรือไม่ต่างหาก"
 
ครับ… ก็ว่ากันไป… ทีนี้ลองมาคิดอีกที ถ้ามันไม่แค่ร้อยรอบล่ะ? สมมติสักร้อยล้านรอบดีไหมครับ ความแตกต่างเรื่องประสิทธิภาพมันอยู่ที่นี่แหละครับ เพราะแบบแรกมันต้องทำร้อยล้านครั้ง แบบหลังทำครั้งเดียวเหมือนเดิม
 
 
ถ้าอย่างนั้นก็แสดงว่าวิธีที่สองดีกว่าใช่ไหม? ทุกครั้งที่พัฒนาระบบงานต้องหาสูตรอะไรมาใช้ให้เหมือนวิธีที่สองใช่หรือไม่?
 
สำหรับประเด็นคำถามนี้ผมคงไม่ขอตอบดีกว่า เพราะไม่ใช่กูรูทางคอมพิวเตอร์ที่จะสามารถฟันธงไปได้ แต่แนวความคิดของผมก็คือ "ถ้าทำได้"จะทำแบบที่สองครับ สำหรับความยากง่ายของการอ่านโค้ดเราแก้ได้ด้วยการ "เขียนคอมเม้นต์" หรือ "เขียนคำอธิบายโปรแกรม" ครับ เขียนอธิบายให้เข้าใจว่าสูตรนี้หรือ algorithm นี้ เอามาใช้เพื่ออะไร ทำอะไร อย่างไร จะเขียนให้ละเอียดขนาดเล่าเป็นนิทานก่อนนอน หรือจะเขียนสั้นๆก็ได้ ที่สำคัญคือต้องอธิบายให้นักพัฒนาโปรแกรมท่านอื่นที่มาแก้โค้ดเราต่อเข้าใจให้ได้
 
ส่วนแบบที่หนึ่งไม่ใช่ว่าจะไม่ดีไม่ใช้นะครับ งานบางงานก็ต้องใช้เหมือนกัน อย่างวิธีการ "Brute force" หรือ "Brute force atack" นี่ก็ใช้วิธีการเกรียนๆแบบนี้แหละ
 
บทสรุปสำหรับผมเองก็คือ ทั้งสองวิธีจะดีหรือไม่อยู่ที่เราเลือกใช้อย่างไร อยู่ที่เวลาที่ต้องทำงานให้เสร็จว่าเร็วช้าอย่างไร เพราะถ้ามัวหาสูตร หา algorithm อยู่ งานก็จะไม่เสร็จหรือเสร็จล่าช้าเอา เป็นผลทำให้โครงการล้มเหลวได้ แต่ถ้าเราแม่นเรื่องสูตรทางคณิตศาสตร์ แม่นเรื่อง algorithm อย่างนี้ได้เปรียบครับ มีชัยไปกว่าครึ่งแล้ว แต่ถ้าไม่แม่นก็ไม่เป็นไรครับ เกรียนๆไปก่อนก็ได้ แล้วหาทางมาแก้ไขภายหลัง หลังจากที่หาสูตรดีๆได้แล้วหรือหา algorithm ดีๆได้แล้ว ค่อยมาแพตช์แก้ไปก็ได้ (ไมโครซอฟต์ยังออกแพตช์ตั้งหลายๆครั้งเลย ลีนุกซ์เองก็ออกมาเหมือนกัน) ซึ่งการทำแบบนี้บางทีจะสร้างความรู้สึกดีๆให้กับยูสเซอร์ของเราด้วยซ้ำ เพราะเหมือนกับว่าเราตามดูแลงานให้เขาตลอดเวลา ไม่ใช่"ได้แล้วทิ้งกัน"อะไรประมาณนั้น
 
ดังนั้นอย่าไปยึดติดว่าวิธีนี้ดีวิธีนั้นไม่ดี เพราะมันเถียงกันไม่จบครับ เปลี่ยนเป็นมาคิดว่าเราจะประยุกต์วิธีการเหล่านั้นให้เกิดประโยชน์สูงสุดและมีประสิทธิภาพมากที่สุดได้อย่างไร นี่ล่ะครับสิ่งที่สำคัญกว่า
 
อย่าลืมนะครับว่า "มีด" มีประโยชน์เมื่อเราเอามาใช้หั่นผักหั่นเนื้อทำกับข้าว แต่จะมีโทษ ถ้าเราเอามาใช้ฆ่าคน
บางที แค่ดินสอธรรมดาก็เอาไปเขียนหนังสือในอวกาศได้แล้ว ไม่ต้องเสียเงินและเสียเวลาไปวิจัยพัฒนา"ปากกาอวกาศ"ที่สามารถเขียนได้ในสูญญากาศที่ไร้แรงดันน้ำหมึกออกมา
 
17 กันยายน 2552

2 comments

  1. โอ้!… เยี่ยมครับอะไรจะดีกว่ากัน? คำตอบก็อยู่ในคำถาม แต่การใช้งาน เราต้องเลือกกันอีกทีว่าจะใช้มีดหั่นเนื้อเนื้อหมูเพื่อทำกับข้าว หรือใช้มีดหั่นเนื้อ Eแก่ที่บ้าน หงิหงิ อันหลังเดี๋ยวตำรวจจะ insert เข้าตารางเปล่าๆ

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

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s