การผลิตซอฟต์แวร์ที่มีคุณภาพแพงกว่าจริงเหรอ

ถ้าพูดถึงเรื่องต้นทุนในการผลิตซอฟต์แวร์ เรามักจะนึกถึงค่าจ้าง programmer มานั่งเขียน Code ให้เรา ถ้าถึงเวลางานที่ได้เป็นไปตามเป้าหมายที่เราต้องการนั่นก็เป็นเรื่องที่ดี แต่ถ้าไม่ก็ต้องหาทางกดดันให้ได้ผลลัพธ์ที่ต้องการไม่ว่าด้วยวิธีการยังไงก็ตาม ปัญหาเกิดจากการ (under estimate) หรือการประเมินราคาออกมาต่ำเกินไปนั่นเอง

วันนี้เรายังไม่ได้พูดถึงเรื่องของการประเมินราคาของซอฟต์แวร์ แต่เราจะพูดถึงเรื่องของต้นทุนที่แท้จริงในการเขียนโปรแกรม ซึ่งนอกจากการจ้าง programmer มานั่งเขียน Code แล้วเรายังต้องมีต้นทุนในเรื่องของการทดสอบและแก้ไขเพื่อให้โปรแกรมทำงานได้ อย่างที่เราต้องการ

ซึ่งโดยต้นทุนของการคำนวนเรื่องของต้นทุน เราจะพูดถึงค่า Cost of Quality (COQ) ซึ่ง COQ จะมีสมการดังนี้

ซึ่งค่าของค่าของ Cost ทั้งสองตัวมีความหมาย ดังนี้

  • Appraisal Cost คือต้นทุนในการป้องกันปัญหา ไม่ให้เกิด
  • Failure Cost คือต้นทุนที่ทำการแก้ไขหลังจากเกิดปัญหาขึ้นมาแล้ว

คือทั้งสองตัวนี้จะเป็นต้นทุนในการแก้ปัญหาเหมือนกัน แต่ทั้ง 2 ตัวนี้จะทำก่อนเกิดปัญหาและหลังจากเกิดปัญหา ซึ่งวิธีในการป้องกันปัญหามีหลายวิธี เช่นการทำ Code Review หรือ Design Review (ในกระบวนการของการ Review ก็มีให้เลือกหลายวิธีด้วยกัน)

แต่เราจะทำการวิเคาระห์จากสมการนี้กันว่าจริงๆแล้วการผลิตซอฟต์แวร์ที่มีคุณภาพสูงนั้นต้องมีต้นทุนที่สูงจริงหรือไม่

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

ดังนั้น ถ้าเราเอาต้นทุนที่คิดจากเวลาของทีมงานที่ใช้ในการป้องกันปัญหา เช่น จากเดิมเราไม่เคยทำการ Review เลย เราต้องเสียเวลาของคนในทีม แทนที่จะได้เขียน code แต่ต้องมานั่งอ่าน Code ของเพื่อนแทน

ซึ่งเราจะเทียบง่ายๆว่า ถ้าเวลาในการอ่าน Code ของเพื่อน 1 ชั่วโมง กับเวลาที่เราใช้ในการจัดการ Bug ของเราเอง อันไหนน่าจะได้ผลงานมากกว่า ซึ่งในงานวิจัยโดยส่วนใหญ่เราจะพบว่าในเวลา 1 ชั่วโมงที่เสียไป กับการ review จะทำให้ Defect หรือ Bug ที่เกิดขึ้นลดลงอย่างเห็นได้ชัด เนื่องจากจะได้ Code ที่เขียนจาก 2 มุมมองคือ เจ้าของ Code และคน Review

ดังนั้นการที่เราทำการเสียเวลา ทำการ Reviewใน Phase ต้นๆ นั้นจะลดภาระใน Testing ไปได้เยอะ เราจึงสรุปได้ว่า การที่เราจะผลิตซอฟต์แวร์ที่มีคุณภาพที่สูงนั้น ไม่ได้มีต้นทุนที่สูงกว่าเสมอไป ขึ้นอยู่กับกระบวนการผลิตของแต่ละองค์กร ดังนั้นเราสามารถที่จะเพิ่ม Quality และลดต้นทุนได้พร้อมๆ กัน เรียกได้ว่ายิงปืนนัดเดียวได้นกสองตัวเลยทีเดียว

 

คณิตศาสตร์สำหรับการเขียนโปรแกรม ตอนที่ 3

ในบทความนี้จะพูดถึงเรื่องของลำดับในการทำงานของ operator ความหมายของ operator คือ การทำงานทางคณิตศาสตร์ เช่น +, -, *,/, %, and, or และอื่นๆ เมื่อตัวดำเนินการต่างๆมาทำงานร่วมกันหลายๆตัว ก็จำเป็นจะต้องจัดลำดับความสำคัญว่าใครทำก่อน ใครทำหลัง

ซึ่งในการทำงานหรือการทำข้อสอบจะเป็นเรื่องปวดหัวมากถ้าเจอกับโจทย์แบบนี้ เรามีวิธีการง่ายๆในการช่วยให้จำได้ง่ายขึ้นมากๆ

ในการจัดลำดับ operator ต่างๆ ให้ใช้หลักการของ BODMAS ซึ่งย่อมาจาก

  • B   – Bucket First (ทำในวงเล็บก่อนเสมอ)
  • O   – Orders (มีการทำงาน 2 อย่างคือ ยกกำลัง หรือ square root)
  • DM – Division and Multiplication (การหารและการคูณ ที่ต้องเอาไว้คู่กันเพราะทั้งการหารและการคูณมีลำดับความสำคัญเท่ากัน)
  • AS – Addition and Subtraction (การบวกและการลบ เหมือนกับการคูณและการหาร ทั้ง 2 ตัวนี้มีลำดับความสำคัญเท่ากัน)

สุดท้ายถ้าจำลำดับความสำคัญได้แล้วก็ให้จำว่า ถ้าความสำคัญเท่ากันจะเรียงจากซ้ายไปขวาเสมอ เหมือนกับเราอ่านหนังสือ

ตัวอย่าง

  1.  สิ่งที่ต้องทำก่อนคือ 6 *3 เนื่องจากอันดับการทำงานสูงกว่า + และ – (ที่เลือก 6 * 3 ก่อนเพราะคูณกับหารมีความสำคัญเท่ากันเลยเลือกที่จะทำจากซ้ายไปขวา)
  2. หลังจากนั้นให้เอาผลลัพธ์จาก 6*3 คือ 18 มาหารด้วย 2
  3. สุดท้ายเราจะนำผลลัพธ์ที่ได้จาก 18 /2 ซึ่งก็คือ 9 มาบวกกับ 12

ผลลัพธ์สุดท้ายเราจะได้  21

ดังนั้นถ้าเราจำคำว่า BODMAS ได้ เราก็มาแยกหาลำดับการทำงานของ Operator ได้ เมื่อเราเจอโจทย์ที่ต้องทำการจัดลำดับของ Operator ก็จะไม่มีปัญหาอีกต่อไป

หมายเหตุ ในตัวอย่างที่ให้มาไม่มี วงเล็บ และ การยกกำลังหรือ ถอด square roots ดังนั้น * และ / จึงมีลำดับสูงสุด

ข้อแนะนำในการทำงาน เราอาจเข้าใจเรื่องของลำดับของ Operators เป็นอย่างดีแต่เราก็ไม่ควรทำให้ Code อ่านยากโดยไม่จำเป็นดังนั้นให้พยายามจัดลำดับของการคำนวนด้วยวงเล็บเสมอ นอกจากเวลาเขียนไม่ต้องคิดให้ปวดหัวแล้วคนอ่านก็ไม่ต้องตีความเช่นเดียวกัน

Coding standards กับ Naming conventions ความเหมือนที่แตกต่าง

คำว่า Coding Standards และ Naming Conventions จะเป็นคำที่พูดถึงกันบ่อยๆ ใน Software Engineer แต่สิ่งที่คนมักจะใช้ผิดคือความหมายของ 2 คำนี้ที่ใกล้กัน จริงๆแล้ว Naming Conventions จะเป็นส่วนหนึ่งใน Coding Standards  ดังนั้นถ้าพูดถึง Naming Conventions จะเป็นการพูดถึงส่วนหนึ่งของ Conding Standards

Naming Conventions หมายถึงรูปแบบของการตั้งชื่อตัวแปร เป็นบทแรกๆใน Conding Standards แต่ Coding Standards ไม่ได้มีเพียงแค่ Naming Conventions เท่านั้น แต่ยังรวมไปถึง เรื่องอื่นๆด้วย เช่น Overload Method , Exception Handling และอื่นๆ

Overload Method เป็นส่วนที่จะกำหนดว่า Method ใดบ้างที่มีการ Overload และ Parameter มีกี่รูปแบบอะไรบ้าง (ใน PHP ไม่จำเป็นต้องมีเอกสารส่วนนี้เนื่องจากการทำ Overload ใน PHP นั้นทำได้แค่กำหนดให้ parameter นั้นเป็น optional)

Exception Handling เป็นส่วนที่ทำการกำหนดว่าในการเกิด Exception จากสาเหตุต่างๆนั้น เราจะ handle(parameter ที่กำหนดใน catch) ด้วย Exception ตัวไหน หรือ ในกรณีที่เราจะโยน(throw) Exception ตัวไหนออกไป  และถ้าเราต้องสร้าง Exception ขึ้นมาเอง Exception ตัวนั้นจะสื่อความหมายถึงอะไร เช่น EmptyException หมายถึง ไม่มีข้อมูลในฐานข้อมูล เป็นต้น

Coding Standards จะเป็นเอกสารที่พูดถึงรูปแบบของการเขียน Code ทั้งหมด ซึ่งรวมทั้งการตั้งชื่อใน Naming Conventions ซึ่งประโยชน์ของการมี Coding Standard นอกจากจะทำให้ Source Code ของเราอ่านง่ายขึ้นแล้วยังมีผลทำให้เรายังสามารถที่จะวัดขนาดของ Software ง่ายขึ้นอีกด้วย เนื่องจากรูปแบบของการเขียน code นั้นถูกกำหนดไว้อย่างชัดเจน

Coding Standards จะเป็นจุดเริ่มต้นที่ดีของการทำ SPI (Software Process Improvement) เพราะถ้าองค์กรไหนขาด Coding Standards หรือ มี Coding Standards แต่ Programmer ในทีมไม่เอาไปใช้งาน ไม่ว่าจะทำอย่างไร Software ของเราก็ไม่มีทางที่จะคุณภาพ

พื้นฐานการสร้างเว็บไซต์

สำหรับมือใหม่ที่ยังไม่เคยเรียนรู้เกี่ยวกับการสร้างเว็บไซต์มาก่อนอาจงง เมื่อต้องเริ่มต้นเรียนรู้การสร้างเว็บไซต์ เพราะมีหลายวิชาให้เรียนรู้มาก วันนี้เราจะมาดูภาพรวมกันว่าเราจะต้องเลือกเรียนรู้แต่ละทักษะ และเลือกใช้เครื่องมืออย่างไร

เริ่มต้นจากส่วนประกอบของเว็บไซต์ มี 4 ส่วนหลักๆ

  1. HTML เป็นส่วนของ content ของเว็บไซต์เรา
  2. CSS ทำหน้าที่ตกแต่งเว็บไซต์ของเราให้สวยงาม
  3. JavaScript ทำให้เกิดการตอบโต้กับผู้ใช้งาน เช่นการคลิกปุ่ม เป็นต้น
  4. Server-side Script เป็นการเขียนโปรแกรมบนฝั่ง Server จะใช้เมื่อต้องทำงานกับฐานข้อมูล มีหลายภาษาให้เลือก เช่น PHP, JSP หรือ ASP.net

ใน 4 ส่วนประกอบนี้เราจะเริ่มทำการเรียนรู้ไปทีละ Step เริ่มต้นจาก

  1. HTML ในปัจจุบันการเขียน PHP มีเครื่องมือที่ช่วยให้เราไม่ต้องเข้าใจ HMTL มากนัก แต่การเริ่มต้นที่ดีเราควรจะใช้งานเครื่องมือโดยที่มีความเข้าใจเรื่องของ HTML บ้าง เครื่องมือที่ใช้กันส่วนใหญ่ก็จะเป็น Dreamwaver แนะนำให้เริ่มต้นจากการใช้เครื่องมือก่อน
  2. CSS ส่วนของ CSS ส่วนนี้ให้เริ่มจากการเรียนรู้การใช้งานว่า Style Sheet สามารถกำหนดที่ส่วนไหนของเอกสารได้บ้าง แล้วแต่ละส่วนมีลำดับการทำงานอย่างไร แล้วค่อยเริ่มว่าการกำหนดค่าของ property แต่ละตัวนั้นมีความหมายอย่างไรบ้าง อาจเลือกใช้ Dreamwaver มาช่วย Generate Style Sheet ด้วยก็ได้
  3. JavaScript นั้นเป็นส่วนที่เริ่มต้นในการเขียนโปรแกรมเพราะส่วนของ HTML และ CSS นั้นไม่ได้ใช้ทักษะของการเขียนโปรแกรมเท่าไรนัก ดังนั้นการเรียนรู้ JavaScript ที่ง่ายที่สุดคือการเรียนรู้การใช้งาน Framework ต่างๆ โดยตัวที่ได้รับความนิยมและใช้งานได้ง่ายที่สุดคือ jQuery หลังจากนั้นค่อยเรียนรู้การทำงานของ JavaScript ไปเรื่อยๆ
  4. การเขียน Server-side Script นั้นเริ่มจากการเลือกภาษาก่อน โดยถ้าเป็นมือใหม่ที่ไม่เคยเขียนโปรแกรมมาก่อนแนะนำว่าถ้าไม่เริ่มจาก PHP ก็ให้เป็น ASP.net (Web Forms) ต้องมีวงเล็บไว้ด้วยเพราะยังไม่ควรเริ่มต้นกับ MVC วิธีการเลือกก็ง่ายมากถ้าอยากให้สร้างเว็บไซต์ได้ง่ายๆ ใช้เวลาไม่นานเลือก ASP.net แต่ชีวิตเราจะต้องใช้ Host ที่เป็น Windows Server ตลอดกาล ถ้าเราต้องการที่จะ run ได้ทุกๆ Platform หรือทุกๆ OS ให้เลือกเป็น PHP ส่วนเรื่องของการเขียนก็เริ่มจากหนังสือหรือ Web site ทั่วไป

ถ้าเราผ่านการเรียนรู้ทั้ง 4 ส่วนนี้ การสร้างเว็บไซต์ก็จะไม่ใช่เรื่องใหญ่สำหรับเราอีกต่อไป