Screen Shot 2558-04-06 at 1.05.51 PM
ปัจจุบันในการพัฒนา software นั้น มักจะพูดถึงคำว่า Simplicity กันบ่อยขึ้น
ในการพัฒนา software เราฝันไว้ว่า
ระบบงานต้องเป็น monolithic application แต่ละระบบทำงานของมันไปเลย
สิ่งที่สร้างมันนั้น ต้องเป็นไปตามสิ่งที่ลูกค้าอยากได้

ดังนั้นก่อนเริ่มพัฒนา เราจึงเริ่มด้วยการค้นหา framework !!
ที่มันสามารถทำงานได้ตามความต้องการของระบบ
ที่มันจะทำให้ชีวิตเราง่ายขึ้น

แล้วสิ่งที่เราทำมานั้น มันคือ Simplicity จริงหรือ ?

มีคำถามที่น่าสนใจ

ทำไมเราต้องใช้ library เล็กๆ เยอะๆ ล่ะ
ในเมื่อ framework มันมีความสามารถ และ library เหล่านั้นทั้งหมดแล้ว ?

น่าคิดมากๆ นะ

ในการพัฒนาเขาบอกไว้ว่า

Software มันจะสามารถทำงานได้ดีที่สุด
เมื่อ software มันเน้น หรือ ทำงานเพียงอย่างเดียวให้มันดี
แต่สิ่งที่เกิดขึ้นกับ software คืออะไรล่ะ ?
Software มันทำงานหลายๆ อย่าง หรือทำทุกอย่างที่เราต้องการเลยใช่ไหม ?
แสดงว่า Software ที่สร้างมันไม่ Simplicity หรือ ?

มาย้อนดูก่อนสิว่า Simplicity มันคืออะไรกันแน่

ในการพัฒนา software นั้นคำว่า simplicity มันไม่ใช่คำใหม่อะไรเลย
เนื่องจากคำนี้พูดถึงตั้งแต่ปี 1975 โดย Edsger Dijkstra
ซึ่งบอกไว้ว่า

“Simplicity is prerequisite for reliability”

มันจริงไหมนะ ลองคิดกันเอาเอง !!

ลองกลับไปดูระบบ Unix ดูหน่อยสิ

เขาบอกว่าพวก utility program ต่างๆ ใน Unix
สร้างมาตามแนวคิดที่ว่า

“Do one thing only and do it very well”

ตัวอย่างเช่น

  • find สำหรับค้นห file ตาม expression ที่กำหนด
  • wc สำหรับนับตัวอักษร
  • cut สำหรับตัดข้อมูลข้อความออกมา
  • tar สำหรับการบีบอัดไฟล์

และอื่นๆ อีกมากมาย

โดยที่ utility program เหล่านี้
มันเรียบง่าย ใช้งานง่าย ไร้ซึ่งความซับซ้อน
แต่ละ program มันทำงานอย่างใดอย่างหนึ่งไปเลย

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

คำถามคือ เราจะทำอย่างไรดี ?

สิ่งที่เราต้องทำก็คือ นำ utility program ที่ทำงานได้ดีในแต่ละอย่างมาทำงานร่วมกัน
ดังตัวอย่าง

จากตัวอย่าง
อาจจะบอกได้ว่านี่ระบบมัน complex นะเนี่ย
แต่ลองดูสิว่า แต่ละขั้นตอนหรือส่วนการทำงานมัน simple มากเลยนะ
เพราะว่าแต่ละการทำงาน มันเฉพาะเจาะจงไปเลย
เพียงแค่นำมันมาเชื่อมต่อกันเท่านั้นเอง

ในฐานะที่เราเป็นนักพัฒนา software ควรที่จะ

เข้าใจความแตกต่างระหว่าง

“การสร้าง complex software กับ
การสร้าง software ที่ทำงานแบบ complex”

มันยังไงล่ะที่นี้ งงมากๆ?

Complex software คืออะไร ?
มันคือ software ที่สร้างยาก
มันคือ software ที่ทดสอบยาก
มันคือ software ที่พังง่าย เมื่อทำการแก้ไข
มันคือ software ที่ … อีกมากมาย

ดังนั้นแทนที่จะสร้าง complex software
ก็ให้ทำการแบ่งหน้าที่การทำงานออกมา
เพื่อสร้างระบบย่อยๆ เล็กๆ ที่มันทำงานอย่างใดอย่างหนึ่งไปเลย
นั่นคือการเคารพในแนวคิด

ซึ่งมันทำให้ง่ายต่อการสร้าง
ง่ายต่อการทดสอบ
ง่ายต่อการแก้ไข
ง่ายต่อการนำไปใช้งาน
หรือไม่นะ ?

แล้วนำส่วนการทำงานต่างๆ มารวมกัน
เพื่อใช้แก้ไขปัญหาที่ complex ต่อไป …
เห็นไหมว่ามันแตกต่างกันนะ

ดังนั้นในการพัฒนา software

คุณควรจะแบ่งย่อยปัญหาออกมาให้ได้
คุณควรจะทำการแยกการทำงานของสิ่งต่างๆ ออกจากกัน
คุณควรคิด และ ดูด้วยว่า สิ่งที่สร้างมันทดสอบได้ และ ง่ายไหม

สิ่งที่สร้างควรเป็นในรูปแบบ modular ไหมนะ ?
นั่นคือ สร้างมาเพื่อช่วยเหลือคนใช้งานใช้ง่ายขึ้น ไม่ใช่การบังคับ
นั่นคือ สนใจฝั่งคนใช้งานเป็นหลัก (Client side)
เพื่อทำให้ใช้งานง่ายที่สุด เท่าที่จะเป็นไปได้นะครับ

Keep it simple นะ
แต่มันไม่ง่ายนะครับ
แต่มันต้องฝึก ฝึก ฝึก และ ฝึก
และ ลงมือทำ ครับ

คำถาม
ปัจจุบันเราสร้าง software แบบไหนกันหรือ ?