PHP Programming’s Style Guidelines

         พอดีว่าทำเอกสารสำหรับ Team Developer เมื่อนานมาแล้ว เพื่อให้ Style ในการเขียน Software ต่าง ๆ นั้นไปในทิศทางเดียวกัน เลยต้องมีการกำหนด Style ขึ้นมา เวลาทำงาน และอ่าน code จะได้ไม่ไปคนละทิศทาง มากนัก การกำหนด Style ในการเขียน นั้นไม่ได้ขึ้นอยู่กับตัวภาษาเพียงอย่างเดียว แต่ขึ้นอยู่กับ Team ของเราด้วยว่าจะกำหนดไปในทิศทางใด และง่ายต่อ Team ของเราว่าจะถนัดแนวไหนมากกว่ากัน เรามาเริ่มกันเลยแล้วกัน อาจจะขาด หรือเกินไปบ้างนั้นสุดแล้วแต่หัวหน้าของเราเองว่าจะกำหนดอะไรบ้าง และสิ่งที่ผมได้รวบรวมมานี้ เป็นการเขียนที่ได้ผ่านการขัดเกามามากพอสมควร และผ่านการใช้งานโดยส่วนตัวมามาก ว่าทำงานได้เร็วและเข้าใจได้ง่ายต่อตนเอง และคาดว่าน่าจะทำให้คนอื่นๆ ที่เข้ามาอ่าน Code ของเราเข้าใจได้ง่ายด้วยเช่นกัน


PHP Programming’s Style Guidelines

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

  1. Version, Changelog, Readme และ License
  1. การตั้ง version ไม่มีกฎตายตัวในการตั้ง แต่ที่จะแนะนำในเอกสารฉบับนี้ก็คือ version ของโปรแกรมจะใช้ทศนิยมจำนวน 2 จุดเพื่อบ่งบอกการพัฒนาของโปรแกรม ให้ไล่จาก ทศนิยมจุดที่ 2 เช่น 0.0.1 โดยทศนิยมจุดที่ 2 คือการแก้ไขข้อผิดพลาด อันเกิดจากการ coding หรือการ flow โปรแกรมที่ผิดพลาดไป และเป็นการประกาศเริ่มต้นการพัฒนาไปในตัวด้วย หรืออาจจะใช้ a – z ต่อท้ายตัวเลขก่อนเพื่อบ่งบอกการใส่ฟังค์ชั่น หรือการแก้ไขในการเริ่มต้นพัฒนาก็ได้ ส่วนทศนิยมจุดที่ 1 นั้นเป็นการเพิ่มฟังค์ชั่น, เพิ่มคลาสต่าง ๆ เข้าไปใหม่ เพื่อเพิ่มความสามารถของโปรแกรม ส่วนตำแหน่งหน่วยนั้นเป็นการประกาศ version release เพื่อบ่งบอกว่าโปรแกรมพร้อมใช้งานในทุก ๆ ด้านโดยไม่ขาดตกบกพร่องในขั้นตอนการใช้งานจริงจากกลุ่มทดสอบแล้ว แต่อาจมีข้อผิดพลาดตามมาได้เช่นกันหลังจากประกาศ version release ไปแล้ว เพราะไม่มีโปรแกรมใดสมบูรณ์แบบที่สุด แต่ถือความสำเร็จจากผลของการใช้งานในช่วงของการทดสอบของกลุ่มทดสอบเป็นสำคัญ แต่โดยส่วนใหญ่แล้ว version แรกที่ส่งออกสู่ผู้ใช้มักจะเป็น version ที่ลงท้ายตัว alpha และต่อมาก็ตามด้วย beta ขึ้นอยู่กับผู้พัฒนาจะเลือกตัวไหนมาใช้ หรือใช้ตามลำดับทั้งสองตัวก็ได้ แต่หมายเลข version ในครั้งแรกจะเริ่มที่ 0.0.1 alpha เป็นส่วนใหญ่
  2. การทำChangelog เพื่อเป็นการสร้างเอกสารเพื่อแสดงถึงความคืบหน้า และรวมถึงการแก้ไขข้อผิดพลาดต่าง ๆ โดยทุก ๆ ครั้งที่ มีรูปแบบดังนี้

    Software version August 10, 2004

    =========================================================

    August 2004:

    ——————————————————————————–

    ! fixs bug in function xxx in fileName.php

    + add new function to program.

    =========================================================

  3. การทำไฟล์ Readme จะทำก็ต่อเมื่อโปรแกรมนั้นพร้อมใช้งานได้แล้วในระดับหนึ่ง โดยในไฟล์นี้จะระบุรูปแบบคือ การติดตั้ง, ทีมงาน หรือผู้จัดทำ, ประวัติงานต่าง ๆ
    การทำไฟล์ License
  4. เป็นการบ่งบอกว่าโปรแกรมนี้ยึดหลักการลิขสิทธิ์แบบใดในการคุ้มครองตัวโปรแกรมนี้ เช่น GNU/GPL ของ Free Software Foundation เป็นต้น
  • Comment
    1. ทุก ๆ ไฟล์ของโปรแกรมให้เขียน Copyright statement comment ทุกครั้งบนหัวของโปรแกรมทุก ๆ ไฟล์ไม่ว่าจะเป็นไฟล์ใดก็ตาม โดยในนั้นจะมีระบุชื่อไฟล์นั้น ๆ ก่อน ตามด้วยชื่อของโปรแกรมต่าง ๆ ตามตัวอย่างนี้

      Copyright statement comment

      /*******************************************************************************

      * fileName.php *

      ********************************************************************************

      * Software name with short name : Software name with long name *

      * Project Inspired by Your Name ([email protected]) *

      * ======================================================= *

      * Software Version: Software 0.0.1 *

      * Software by: Software *

      * Copyright 2005-2006 by: Software *

      * Support, News, Updates at: http://www.website.org *

      ********************************************************************************

      * This program is free software; you may redistribute it and/or modify it *

      * under the terms of the provided license as published by Open-Source. *

      * *

      ******************************************************************************/

    2. การแก้ไขไฟล์โดยต้องใส่ comment คือการแก้ไขไฟล์เพื่อแก้ไขบัก หรือข้อผิดพลาดของโปรแกรมนั้น ๆ เพื่อง่ายต่อการไล่การพัฒนาการของโปรแกรมนั้น ๆ เช่น

      # This function is casting Date and Time from MySQL DateTime.

      หรือถ้าต้องการหลายบรรทัดก็ให้ใช้

      # I imagine this file will eventually become a backwards

      # compatibility wrapper around a load balancer object, and

      # the load balancer will finally call Database, which will

      # represent a single connection


    3. เพื่อง่ายต่อการอ่านก็ได้ และในทุกคลาส, ฟังค์ชั่น และตัวแปรที่ประกาศครั้งแรก ให้ทำการเขียน comment ตลอดทุกครั้งเพื่อง่ายต่อการนำไปใช้งาน และการแก้ไขตัวโปรแกรมในอนาคต
  • Indentation Style (Code Layout, Tabs และ Spaces)
    1. Tab character สำหรับแทรกระหว่างกั้นหน้าซ้ายกับอักษรแรกของแต่ละบรรทัด ได้จากปุ่ม Tab
    1. ควรตั้งความกว้าง tab ไว้ที่ 4 ตัวอักษร น้อยกว่านี้จะอ่านยาก มากกว่านี้จะกินที่ อีกเหตุผลคือนี่เป็นตัวเลขที่โปรแกรมเมอร์ส่วนใหญ่เขาใช้กัน ฝึกสายตาให้คุ้นกับค่ามาตรฐานย่อมได้เปรียบ
    2. สำหรับบรรทัดแรกให้เริ่มพิมพ์อักษรแรกที่คอลัมน์ 0 ชิดกับกั้นหน้าซ้ายเสมอ
    3. เมื่อขึ้นบรรทัดใหม่ หากไม่มีเหตุผลอะไรเป็นพิเศษให้จัดย่อหน้าให้ตรงกับบรรทัดก่อนหน้า เพื่อสื่อว่าสองบรรทัดนี้ความสำคัญอยู่ในระดับเดียวกัน
    4. เมื่อเปิดบล็อกใหม่ด้วยปีกกาเปิด (‘{‘) ต้องเพิ่ม tab ให้บรรทัดถัดไปหนึ่งขั้น เพื่อสื่อว่าบรรทัดหลังเป็น subordinate ของบรรทัดก่อนหน้า
    5. เมื่อจะปิดบล็อกด้วยปีกกาปิด (‘}’) ให้ขึ้นบรรทัดใหม่ ลด tab ลงหนึ่งขั้นแล้วจึงพิมพ์ปีกกาปิด เพื่อสื่อว่าบรรทัดถัดไปจะไม่เป็น subordinate อย่างบรรทัดก่อนหน้าอีกแล้ว หากบรรทัดที่พิมพ์ปีกกาปิดนั้นไม่มีปีกกาเปิดต่อท้าย ให้เริ่มบรรทัดใหม่ที่ tab ตรงกับปีกกาปิดได้ทันที
  • Space characterสำหรับแทรกระหว่างอะไรก็ตามที่ควรแทรกในระหว่างบรรทัด ได้จาก Space Bar
    1. เคาะ space เพียงครั้งเดียวสำหรับตำแหน่งที่ต้องการ space เพื่อประหยัดเนื้อที่และคีย์สโตรก
    2. เคาะ space กั้นชื่อคลาส, เมธอด, ตัวแปร, ค่าป้อน, คีย์เวิร์ดโอเปอเรเตอร์, ปีกกาปิด/เปิด ฯลฯ
    3. เคาะ space ตามหลังจุลภาค (‘,’) ที่กั้นระหว่างไอเทมในลิสต์
    4. อย่าแทรก space ระหว่าง dot operator (‘.’) กับ identifiers (ชื่อคลาส ชื่ออินสแตนซ์ ชื่อเมธอดและชื่อฟิลด์) เพราะ dot operator มีไว้เพื่อเชื่อมสองสิ่งให้กลายเป็นสิ่งใหม่ที่มีความหมายต่างจากเดิม
  • Newline character ได้จากปุ่ม Enter
    1. ขึ้นบรรทัดใหม่เมื่อจบสเตทเมนท์ปกติ
    2. แต่ละตำแหน่งที่ต้องการบรรทัดว่างให้แทรกบรรทัดว่างเพียงบรรทัดเดียวเท่านั้น เพื่อประหยัดเนื้อที่และคีย์สโตรก
    3. จัดกลุ่มของสเตทเมนท์ที่เกี่ยวข้องกันเป็นหนึ่งหน่วยความคิด อย่าแทรกบรรทัดว่างลงไปแยกหนึ่งหน่วยความคิดนี้ออกจากกันเด็ดขาด
    4. แทรกบรรทัดว่างลงไปตรงกลางแยกสองหน่วยความคิดออกจากกัน
    5. แทรกบรรทัดว่างระหว่างบล็อกหลักของคลาส เช่น บล็อกของการประกาศชื่อฟิลด์ บล็อกของคอนสตรักเตอร์ บล็อกของเมธอด ฯลฯ
    6. ข้อแนะนำ tab และ space
    1. อย่าใช้ space ในตำแหน่งที่ควรจะใช้ tab ด้วยเหตุผลหลักสองข้อ
    1. ประหยัดคีย์สโตรก คุณต้องเคาะ space สี่ครั้งจึงจะได้ช่องว่างเท่ากับ tab หนึ่งครั้ง
    2. โปรแกรมเมอร์ a อาจจะตั้งความกว้าง tab ไว้ที่ 4 ตัวอักษร ขณะที่โปรแกรมเมอร์ b ตั้งไว้ที่ 6 ตัวอักษร เมื่อมีการส่งไฟล์ให้กันจะไม่เกิดปัญหา"ความกว้าง tab ที่ไม่คุ้นตา"
  • แต่คุณอาจจะใช้ tab แทน space ก็ได้ เมื่อต้องจัดคอลัมน์ของเทกซ์ให้ตรงกัน เช่น เมื่อคุณต้องป้อนค่าเริ่มต้นให้ตัวแปรในลักษณะตาราง หากคอลัมน์ตรงกัน การอ่านหรือแก้ไขข้อมูลในตารางก็ง่ายขึ้น
  • ข้อแนะนำ tab และ newline
    1. หากหนึ่งสเตทเมนท์ยาวเกินกว่าหนึ่งบรรทัด ให้ปัดส่วนเกินของสเตทเมนท์มาไว้ในบรรทัดถัดไป และเพิ่ม tab จากต้นสเตทเมนท์ขึ้นหนึ่งหรือสองขั้น เพื่อเป็นจุดสังเกตว่าสเตทเมนท์นี้มีความยาวมากกว่าปกติ
  • ข้อแนะนำ space และ newline
    1. อาจวางสเตทเมนท์สั้นๆที่มีความเกี่ยวข้องกันหลายอันไว้บนบรรทัดเดียวกัน โดยใช้ space กั้นระหว่างสเตทเมนท์
  • ตัวอย่างต่าง ๆ
    <?php
        …………
    ?>


    <?php echo($XXX);?>
    ห้ามใช้ <?=$XXX?>


    if(condition) {
        …………
    } elseif(condition) {
        …………
    } else {
        …………
    }


    for($i=0; $i< $x ; $i++) {
        …………
    }
    do  {
        …………
    } while (condition)


    while(condition) {
        …………
    }


    function functionName () {
        …………
    }


    class className {
        …………
    }

  • Variable Names, Function Names และ Function Arguments
    1. การตั้งชื่อตัวแปรควรตั้งให้สื่อความหมายต่อการใช้งาน และตั้งชื่อตัวแปร, ชื่อฟังค์ชั่น และชื่อตัวแปรนำเข้าค่าของฟังค์ชั่น ด้วยตัวอักษรตัวเล็กเท่านั้น และช่องว่างระหว่างคำให้ใช้ Underscore ในการเว้นช่องว่าง ระหว่างคำ เช่น $current_user, print_login_status(), do_stuff($value_name) ห้ามใช้ $currentuser และ $currentUser
    2. ในภาษา PHP นั้นไม่มีการกำหนด Type ที่แน่นอน จึงไม่ต้องระบุ Type ด้านหน้าตัวแปร เช่น intMember แบบในภาษาอื่น ๆ แต่มีข้อยกเว้นในส่วนของ array และ object ควรใส่เพื่อบ่งบอกว่าเป็น array หรือ object ด้วย เช่น array แทนด้วย arr_var_name และ object แทนด้วย obj_var_name เปนต้น
    3. ตัวแปรนับรอบ Loop, Loop counter หรือ Loop Indices ให้ใช้ตัวแปรที่มีขนาดตัวอักษรที่สื่อความหมายเท่านั้น โดยใช้คำว่า index_counter ขึ้นต้นเสมอ เช่น $index_counter_member เป็นต้น

    ทั้งหมดทั้งปวงนี้เป็นเพียงแค่ส่วนหนึ่งของ Style ที่ทำการรวบรวมมาไว้ อาจจะยังไม่ครบทั้งหมดในกระบวนการ แต่ว่าก็เพียงพอต่อการทำงานเป็น Team ได้บ้างแล้ว

    ปรับแต่งเนื้อหาให้ใช้งานได้ดีขึ้นจาก indentation style in Java programming ( http://www.intellectworld.com/thai/indentation.html )

    จริงๆ ยังเหลือ Tags Manual อีก แต่ว่าขอเวลารวบรวมรายละเอียดอีกสักพัก เพราะว่าละเอียดพอสมควรทีเดียว

    บ่นนิดๆ สะกิดหน่อยๆ (Core Programming)

    เมื่อ blog อันเมื่อกี้ไม่ได้ทักทายมาอันนี้ทักทายนิดดีกว่า

    คือที่หายไปเพราะว่ามี project SAD แล้วเดี่ยวต้องทำ project Database ต่ออีก โอ้ววววววว ยังไม่พอนะท่านๆ ตอนนี้ทำ Project ขนาดใหญ่พอสมควร ทำคนเดียว อีก เวรกรรม เพราะว่าเพื่อนๆ ใน section และชั้นปีมันคงไม่มีใครเขียน PHP และทำงานบน MySQL ได้ (แค่ SQL ทำงานแบบ SELECT กว่า 80% ยังคงใช้งานไม่เก่งเพียงพอ ขื่นมาช่วยทำเกรงว่าเวลา train กับเวลาทำเอง จะพอๆ กันกลายเป็นงาน x2 ไป -_-”) แถมเขียน PHP แบบ OOP อีก ยิ่งไปใหญ่ เพราะอย่างที่บอกไป Concept OOP ถ้าคนไม่เข้าใจจะโคตร งง ผมก็ไม่ได้เก่งเท่าไหร่ แต่เอามาใช้งานได้ก็ถือว่า OK แหละ

    คือเขียน PHP แบบ OOP นี่มันค้อนข้างจะผิดหลักพอสมควร (Version 4 ครับ) มันไม่ Encapsule เลย เซง แต่ก็พยายาม lock ตัวเอง และอื่นๆ ไม่ให้มันออกมานอก Class ได้แบบไม่ตั้งใจ ทุกๆ อย่างทำงานผ่าน Method หมด กันไว้ก่อน เพราะว่ามันปรับแต่งผ่าน Method ให้มันจัดการกับตัวแปรต่างๆ ได้ง่ายกว่าด้วย ขื่นให้ดึงไปใช้ได้ดื้อๆ มันจะมีปัญหาแน่นอน …. ตอนปรับแต่ง code บางคนที่มามอง class อาจดูโง่ๆ แต่ถือว่าเผื่ออนาคตดีกว่า มันไม่แน่ไม่นอน เพราะว่ายิ่งใกล้ทำ prototype ให้เค้ายิ่งมี request ที่ไม่ตรงกับ interfact และ operation ของเรามากขึ้น ยิ่งต้องเตรียมการไว้ก่อน จะได้สบายหน่อย

    แต่ PHP แบบ OOP ถือว่าเขียนง่ายนะ สำหรับ Version 4 แต่ถ้า Version 5 ผมว่า OK กว่า แต่ว่าหา Server มา Run มันยากเลยต้องยึด เจ้า Version 4 ไปก่อนดีกว่า เพราะว่า Version 5 มันไปไกล และเขียนได้ดูเป็น OOP มาก และจัดการตัวแปร ง่ายกว่าเยอะ ทำให้ผมโปรแกรมภายในได้ง่ายกว่าเยอะเลย แต่ก็เล็กกับข้อกำหนดจุกจิกสักหน่อย แต่ไม่หวั่น เพราะว่าC++ มันมีเยอะกว่า เลยเฉยๆ ฮา …….

    แต่เมื่อวานนี้คุยกับรุ่นน้องคนนึงมาคุยเรื่องเขียนโปรแกรมแบบ OOP ไม่รู้เรียนอีท่าไหน เอาตัวแปรมาใส่ Public เพียบเลย แถมถามกลับไปว่ารู้จักใช้ get/set ป่าว ตอบกลับมาแบบ งง ว่า “คือไร” ไอ้เราก็เซงเลยดิ อืมมมมม นะ

    คือไม่ใช่อะไรหรอก การจัดการตัวแปร ต้องผ่าน method ที่ขึ้นต้นด้วย get (เข้าถึง) และ set (ตั้งค่า) ด้วยเหตุผลว่า การเข้าถึงแบบ method นั้น เราสามารถโปรแกรมได้ว่าจะ get/set แล้วมีขั้นตอนอย่างไรบ้าง โดยที่ข้อมูลที่ “ตั้งค่า” และ “เข้าถึง” นั้นจะถูกนำไปใช้งาน หรือได้รับออกมาได้ถูกต้องตรงตามที่มันควรจะเป็นไป เช่น(ตัวอย่าง PHP นะ)
    $x->set_month(15); // มันจะไม่ได้ เพราะว่าใน method นี้จะมีการตรวจเช็คว่า value >0 and <13 อยู่ และ return หรือ echo ออกมาว่า เกินกว่าจำนวนเดือนที่เป็นจริง แต่ถ้าเป็น
    $y->date_month = 15; // มันจะใส่ได้ และไม่ขึ้น error หรือ echo อะไร เพราะว่ามันเป็นการใส่ค่าไปตรงๆ โดยไม่มีการตรวจสอบแบบด้านบน

    ส่วน get ก็ประมาณเดียวกัน แต่ว่าการ get อาจจะเอามาใช้ในการแปลงตัวแปรต่างๆ ได้เช่นกัน ประมาณว่า
    echo($x->get_month_name(12)); // มันก็จะเอา 12 ไปเทียบกับ string แล้ว return ค่าเป็นชื่อเดือนแทน อะไรประมาณนี้

    เห็นแมะ ถ้าจัดการผ่าน method มันจะทำให้เราเขียนจัดการตัวแปรเข้า และออกจาก object ได้ง่าย และถูกต้องตรงตามความจริงได้ง่ายๆ เลย

    ใครคิดว่า OOP มันเป็นอะไรที่ยาก ลองศึกษาและคิดใหม่น่าจะดีนะ ;)

    อะไรคือโปรแกรม และการเขียนโปรแกรม ตอนที่ 1

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


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

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


    ว่าด้วย การเขียนโปรแกรม

                อย่างที่กล่าวไปแล้วเมื่อครู่ การเขียน/พัฒนาโปรแกรม ก็คือการ "สร้าง" โปรแกรมขึ้นมาตามความต้องการของเรา ซึ่งเริ่มต้นมาจากความต้องการ หรือจินตนาการ ว่าต้องการให้เป็นอย่างไร แต่ว่าเพียงเท่านั้น เพียงพอหรือไม่? เพื่อให้เข้าใจง่ายขึ้น เราลองมามองการสร้างโปรแกรม ในเชิงเปรียบเทียบกับสิ่งที่ค้อนข้างเป็นเรื่องทั่วไป และสามารถทำความเข้าใจได้ง่ายกันดูครับ



    มองซ้าย มองแบบคนเรียนวิทย์ – การสร้างสิ่งของ/สิ่งก่อสร้าง

                ก่อนอื่นเราลองมามองอย่างคนเรียนสาบวิทย์กันก่อน นั้นคือ ลองมองการเขียนโปรแกรมให้เป็นเหมือนกับการสร้างอะไรซักอย่าง เช่นตึกรามบ้านช่อง ศูนย์การค้า รถยนต์ ฯลฯ โดยในที่นี้ ขอยกตัวอย่างการสร้างสิ่งก่อสร้างเป็นหลัก

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

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

                การมองแบบนี้ทำให้เราเข้าใจการสร้างโปรแกรมขึ้นได้อย่างไร? อดใจสักนิด เรามาลองมองอีกด้านนึง ซึ่งต่างจากแนวคิดข้างต้นกันดูดีกว่า


    มองขวา มองแบบคนเรียนศิลป์ – การเขียนนิยาย

                เมื่อตอนต้นเรามองการเขียนโปรแกรม ในเชิงการก่อสร้างสิ่งต่างๆ ไปแล้ว ตอนนี้เราลองมามองอีกมุมหนึ่ง โดยมองการ เขียนโปรแกรม เหมือนกับการ เขียนนิยาย กันบ้าง

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

                นอกจากนี้ ความรู้พื้นฐานในเรื่องที่เราต้องการเขียน ก็เป็นสิ่งสำคัญไม่ใช่น้อย เช่นนิยาย/ภาพยนต์เกี่ยวกับอวกาศและเทคโนโลยีชื่อดังเรื่อง 2001: Space Odyssey นั้นใช้ความรู้เกี่ยวกับอวกาศตลอดจนฟิสิกส์ค่อนข้างมาก รวมถึงจินตนการในการสื่อออกมาและการคาดการณ์อนาคตจากพื้นฐานของอะไรหลายๆ อย่างด้วย ในขณะที่นิยายของ Tom Clancy นั้นมักจะมีเรื่องของแผนการต่างๆ และเงื่อนงำต่างๆ ทางทหารเข้ามาเกี่ยวข้อง ซึ่งแน่นอนต้องหาข้อมูลกันมาอย่างดี และผู้เรื่องราวกันอย่างดี

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

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

    เรียบเรียงบทความโดย Rawitat Pulam
    บทความฉบับนี้เป็นไปตามข้อกำหนดของ GNU Free Documentation License 1.2. เท่านั้น

    Computer Science != Programming and Programmer

    Found this on Lambda the Ultimate weblog entry, about what George E. Forsythe (founder of Stanford’s Computer Science Department) thought about Computer Science. This is originally written in Stanford technical report, number 26. Quote here:

    “I consider computer science to be the art and science of exploiting automatic digital computers, and of creating the technology necessary to understand their use. It deals with such related problems as the design of better machines using known components, the design and implementation of adequate software systems for communication between man and machine, and the design and analysis of methods of representing information by abstract symbols and of processes for manipulating these symbols. Computer science must also concern itself with such theoretical subjects supporting this technology as information theory, the logic of the finitely constructable, numerical mathematical analysis, and the psychology of problem solving. Naturally, these theoretical subjects are shared by computer science with such disciplines as philosophy, mathematics, and psychology.”

    พบข้อความนี้จาก Lambda the Ultimate weblog ซึ่ง George E. Forsythe คือผู้ก่อตั้ง ภาควิชา Computer Science ที่มหาวิทยาลัย Stanford ได้กล่าวเกี่ยวกับ Computer Science ไว้ได้อย่างน่าสนใจ ซึ่งนี่คือข้อความที่เขียนไว้ใน Stanford technical report หมายเบข 26 มีข้อความว่า

    “ฉันคิดว่า Computer Science เป็น ศิลป์ และ ศาสตร์ ของการทำงานของเครื่องดิจิตัลคอมพิวเตอร์อัตโนมัติ และเป็นการสร้างสรรค์เทคโนโลยี เพื่อทำความเข้าใจในสิ่งที่เราจะใช้มัน มันเป็นการนำปัญหาต่างๆ มาออกแบบเพื่อให้เครื่องทำงานได้ดีกว่าเดิมเพื่อรู้จักส่วนประกอบต่างๆ การออกแบบผลของสำหรับระบบซอฟต์แวร์ที่เพียงพอต่อการสื่อสารระหว่างมนุษย์ กับเครื่องจักร และเป็นการออกแบบ และวิเคราะห์ขั้นตอนของข้อมูลที่เป็นตัวแทนของสิ่งที่อุปมาณขึ้นมา ด้วยสัญลักษณ์ที่ก่อกำหนดขึ้นจากผลของก ารประมวลผลของข้อมูลที่จับต้องได้ทางสัฐลักษณ์ Computer Science น่าจะเหมือนกับการนำหัวของทฤษฎีที่สนับสนุนเทคโนโลยีต่างๆ เหมือนกับทฤษฎีสารสนเทศ, ตรรกะของขอบเขตข้อมูล ,ระบบจำนวนตัวเลขในการวิเคาะห์ทางคณิตศาสตร์ และปรัญญาด้านการแก้ปัญหาต่างๆ โดยตัวของมันเองแล้ว Computer Science คือหัวข้อของทฤษฎีที่ว่าด้วยเรื่องของการเชื่อมโยงกันโดยหลักของปรัญญา, คณิตศาสตร์ และจิตศาสตร์”

    จะเห็นได้ว่า concept ของ Computer Science มิได้สร้างมาเพื่อเป็น Programmer แต่ประการใด แต่เป็นการ “ศึกษาขั้นตอนการแก้ปัญหา วิเคราะห์ และออกแบบการแก้ปัญหาโดยใช้หลักของปรัญญา, คณิตศาสตร์ และจิตศาสตร์ ในการแก้ปัญหาต่างๆ”

    ผู้แปลเป็นภาษาไทย Ford AntiTrust
    ผู้นำเสนอถึงผู้แปล Rawitat Pulam @ Tsukuba University in Japan

    REF :http://rawitatpulam.blogspot.com

    ปล. ไม่รู้ว่าแปลตรงความหมายมากแค่ไหนนะครับ พอดีว่าฝึกแปล ……. :P

    จบคณะวิทยาการคอมพิวเตอร์จะไปทำอะไร

    คำถาม : อยากรู้ครับ ว่าจบคณะวิทยาศาสตร์ คอมพิวเตอร์ แล้วไปสมัครงานอะไรได้ครับ จะหาสมัครงานได้จากที่ไหน แล้วก็ ทำไมคนถึงไม่นิยมเรียนคณะวิทยาศาสตร์กันครับ

    ถ้าจบไปจะไปต่อยอดหรือทำงานอะไร นั้น ในสาย Science นั้น มีทางเลือกได้มาก เพราะว่า Science คือศาสตร์ที่ว่าด้วยการทำงานที่เป็นระบบ ขั้นตอน ซึ่งคือการจัดการนั้นเอง หรือ Managment ครับ คุณต้องมีคุณลักษณะใน Sci’ method ที่มาก (ขั้นตอนทางวิทยาศาสตร์) จริงๆ คุณต้องได้รับมาก การทำงานเป็นขั้นเป็นตอน ทำงานด้านวิจัยจะไปได้ดีกว่าครับ คนจบวิทย์มา จะได้เปรียบมากๆ เพราะว่าเรียนมาขั้นตอนมันสอนครับ แล้วไปเรียนต่อยอดด้าน SA หรือ NS ก็ได้

    ต่อมาครับ การทำงานในระดับ Com Sci นั้นเป็นการนำขั้นตอน ทั้งปรัญญาศาสตร์, จิตศาสตร์ และคณิตศาสตร์ มารวมกันให้เกิดการตอบโจทย์ของคำถามที่ส่งมา

    คุณต้องใช้ ปรัญญาศาสตร์และจิตศาสตร์เพื่อทำให้เกิดการทำงานร่วมกัน ระหว่างโปรแกรม รวมถึงระหว่างคน และทีมงานด้วย (วิทย์ต้องทำงานเป็นทีม และทำงานเป็นระบบครับ ซึ่งใช้ใน การเชื่อมโยงให้คุยกันได้ระหว่างระบบ หรือขั้นตอนนั้นๆ) และใช้คณิตศาสตร์ในการทำขั้นตอนในการ ตอบคำถามในแต่ละส่วนทั้งแนว condition หรือinteration ต่างๆ เป็นต้น

    ผม intro มานาน ต่อในเรื่องทำงานต่อนะครับ

    นั้นหมายความว่าคนที่จบวิทย์มานั้นทำงานในสายจัดการระบบ หรือทำงานในสายคิดค้นก็ได้ เพราะได้พื้นฐานจากความรู้และขั้นตอนทางวิทยาศาสตร์ มาครับ ซึ่ง ส่วนมากที่ได้เรียนกันก็มีในส่วนของ Computation, Algorithm, Data Stucture, Software Engineering (อันนี้สาย CS เรียนนะครับ ชื่อบอกวิศวะ แต่จริงๆ คอร์สมันเป็นของ CS ครับ), Software Analye ฯลฯ จริงๆ มีอีกหลายตัวครับ

    ผมมองว่าการทำอาชีพมันจะไล่อันดับไปเรื่อยๆ ครับ จากคน Coding -> Team Leader -> Team Director -> Brand Manament -> Software Leader -> Corp Mangament ครับ จริงๆ มีมากกว่านี้แต่ไล่คร่าวๆ ครับ

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

    แล้วทำไมคนไม่ชอบเรียนผมบอกไว้เลยว่า เป็นเฉพาะที่ไทยมากกว่ามั้งครับ

    ตอบตรงๆ นะ

    “คณะนิยม”

    ต่อการทำงานนิดนึงครับ จริงๆ แล้วทำงานได้เยอะนะครับสาบวิทย์

    สายบริหาร, สายจัดการระบบ, สายค้นคว้าวิจัย, สาย Coding ครับ เอาแค่นี้ก่อนดีกว่าครับ

    จริงๆ CS ไม่ได้จบออกมาแค่เขียนโปรแกรมนะครับ แต่ทำด้านอื่นได้อีก แต่ใช้สิ่งต่างๆ ที่เรียนมา นำมาประยุกต์ใช้ครับผม

    ส่วนเรื่องการหางานนั้น แนะนำว่าให้ทำงานแนว Freelances ตอนเรียนไปก่อน (ถ้ายังเรียนอยู่นะครับ) แต่ถ้าจบมาแล้ว แนะนำให้ทำงานใน SWH ครับ ผมว่าได้ประสบการณ์ในการทำงานมากครับ ถึงจะโดนใช้เยี่ยงทาส เครียด แต่คุ้มในเรื่องประสบการณ์การทำงานครับ

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

    ผมว่าสบายกว่ากันตั้งเยอะครับ แถมได้เจอปัญหาใหม่ๆ ทั้งคน ทั้งงานเยอะมากครับ มีประโยชน์ในอนาคตแน่นอนครับ

    ลำบากตอนแรกครับ ได้อะไรเยอะครับ แล้วเจออะไรสบายๆ ผมว่ามองอะไรได้กว้างขึ้นเยอะครับ เพราะเราลำบากมาแล้ว จะเข้าใจคนทำงานด้านล่าง ถ้าเรามาทำงานบริหารครับ …..

    ปล. คิดในทางที่ดีไว้ครับ ชีวิตจะได้ไม่ทุกข์มากครับ