คลังเก็บหมวดหมู่: Programming

พูดคุยแต่เรื่องสร้างซอฟต์แวร์

ภาษาคอมพิวเตอร์กับแพลตฟอร์ม

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

มีหลายภาษาคอมพิวเตอร์ที่ผมยังชำนาญอยู่ แต่ก็มีอีกหลายภาษาคอมพิวเตอร์ที่ผมเคยจับ เคยทำ พอผ่านไปแล้ว ก็ไม่ได้กลับไปทบทวน ซึ่งผมก็เชื่อว่า ถ้าต้องย้อนกลับไปทำ ก็น่าจะยังทำได้อยู่บ้าง (เหรอ จริงเหรอ?)

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

มันเป็นเรื่องช่วยไม่ได้ เพราะเรามีเรื่องอื่นต้องจำอีกเยอะ!!!

ใน IEEE Spectrum ได้แบ่งประเภทของแพลตฟอร์มไว้ 4 ประเภท คือ Enterprise, Web, Mobile และ Embedded System ซึ่งแพลตฟอร์มเหล่านั้น ก็ล้วนทำงานอยู่บนเครื่องจักรประมวลผล ที่มีพฤติกรรมแบบคอมพิวเตอร์ทั้งนั้น ดังนั้น มันก็ต้องมีช่องทางให้สั่งงานมันได้ผ่านภาษาคอมพิวเตอร์ ไม่ว่าทางใดก็ทางนึง

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

ภาษาคอมพิวเตอร์กับแพลตฟอร์ม
ภาษาคอมพิวเตอร์กับแพลตฟอร์ม

ภาพข้างบนคือภาษาคอมพิวเตอร์และเครื่องไม้เครื่องมือที่ผมทำเป็น จะเห็นว่าผมไร้ทักษะในแพลตฟอร์ม Mobile และ Embedded อย่างเห็นได้ชัด!!!

คือคิดไม่เป็น ทำไม่เป็นเลยแหล่ะ ไม่ได้ไปเรียนรู้อะไรเลย และแพลตฟอร์มเหล่านั้นเป็นอนาคตซะด้วย!!!

มันเลยเหมือนผมเป็นคนเก่าแก่ในแพลตฟอร์มเก่า แต่เป็นเด็กใหม่ในแพลตฟอร์มใหม่ อะไรประมาณนั้น

ในขณะเดียวกัน บนแพลตฟอร์ม Enterprise หรือ Web เอง ทุกวันนี้ก็มีสิ่งใหม่ ๆ ปรากฎขึ้นมาให้ใช้งานมากมาย ไม่ว่าจะเป็นภาษา Python เอย Ruby เอย หรือเครื่องมือ เช่น Ruby on Rails, AngularJS, Node.js, Express.js แต่ผมก็ไม่ได้ไปต่อในเรื่องเหล่านี้เหมือนกัน

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

ด้วยวิธีการนี้ทำให้ผมมองเห็นได้ง่าย ว่าผมอ่อนด้อยและไร้ทักษะในด้านไหนบ้าง และถ้ามันจำเป็น ผมหมายถึงจำเป็นจริง ๆ นะ ผมก็จะไปพัฒนาในด้านนั้น

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

อ้าวไม่ใช่ล่ะ!!!

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

เวลาแต่ล่ะคนมีจำกัด ก็ต้องเก็ง ๆ กันไปครับ

 

ปัญหาการขาดแคลนโปรแกรมเมอร์

ข่าวออกมาถี่มาก เรื่องขาดแคลนโปรแกรมเมอร์เนี่ย

เขียนโปรแกรมคอมพิวเตอร์ จริง ๆ มันไม่ได้ยาก แต่มันต้องมีโจทย์มาก่อน

ทิศทางของโจทย์ จะทำให้ตัวโปรแกรมเมอร์รู้ได้เองว่า ตัวเองจะพัฒนาไปในทิศทางไหน

ทิศทางของการพัฒนาโปรแกรมเมอร์ ซึ่งอิงตามโจทย์ จะขึ้นอยู่กับสามปัจจัย คือ

1. โปรแกรมคอมพิวเตอร์ต้องทำงานอยู่บนคอมพิวเตอร์แบบไหน? มันต้องทำงานอยู่บนคอมพิวเตอร์ที่อยู่ในห้องดาต้าเซ็นเตอร์ หรือ ที่ตั้งอยู่บนโต๊ะ หรือ ที่ถือติดมือพกพาได้ หรือ มันทำงานอยู่ในแอร์ ตู้เย็น หรือ มันฝังอยู่ในหุ่นยนต์

คลาสของคอมพิวเตอร์
คลาสของคอมพิวเตอร์

2. โปรแกรมคอมพิวเตอร์ต้องประพฤติตนแบบไหน? อันนี้จัดง่ายเพราะ IEEE Spectrum เขาจัดไว้ให้แล้ว คือ เป็น web application หรือ mobile application หรือ enterprise application หรือ embedded application

ถ้าลองเอาข้อ 1 กับ 2 มา combination กัน ก็อาจยกตัวอย่างได้เช่น web application และ enterprise application มีโอกาสทำงานอยู่บนคอมพิวเตอร์ที่อยู่ในห้องดาต้าเซ็นเตอร์ได้ทั้งคู่ และเพื่อจะสร้าง app ทั้งสองแบบนี้ โปรแกรมเมอร์ก็จะต้องใช้ทักษะที่แตกต่างกัน ต้องพัฒนาตัวเองไปในทิศทางที่แตกต่างกัน เป็นต้น

3. ภาษาคอมพิวเตอร์ที่เหมาะสมและกำลังเป็นที่นิยม ซึ่งสอดคล้องกับข้อ 1 และ 2 คือภาษาอะไร อันนี้ก็ง่ายในการจัดลำดับอีกเหมือนกัน เพราะ IEEE Spectrum เขาจัดอันดับให้แล้ว

IEEE Spectrum Top Programming Language 2016
IEEE Spectrum Top Programming Language 2016

จะเห็นว่า combination มันมี 3 ตัวแปร ซึ่งแปลว่ามันเยอะ

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

ยกตัวอย่าง บางคนเก่งภาษา C สำหรับสร้างโปรแกรมคอมพิวเตอร์แบบ enterprise application เพื่อใช้ในคอมพิวเตอร์ที่ทำงานอยู่ในดาต้าเซ็นเตอร์ เขาชำนาญด้านการสร้าง services, daemon, multi processing, multithreading และ tcp server socket

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

หรือเขาจะยังคงทิศทางการพัฒนา enterprise application เพื่อทำงานบนคอมพิวเตอร์ที่ทำงานอยู่บนดาต้าเซ็นเตอร์ต่อไป โดยเปลี่ยนจากภาษา C เป็นภาษา Python แทน?

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

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

บางทีคนพอ แต่อาจกระจัดกระจาย ก็เอามารวมอยู่ด้วยกัน แต่ถ้าไม่พอก็ค่อยมาคิดอ่านว่าจะสร้างเพิ่มกันขึ้นมาได้ยังไง

กระบวนการแปลภาษาทางคอมพิวเตอร์

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

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

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

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

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

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

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

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

สั่งเครื่องจักรด้วยภาษาเครื่อง
สั่งเครื่องจักรด้วยภาษาเครื่อง

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

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

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

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

การแปลภาษาเครื่องให้เป็นภาษาระดับล่าง
การแปลภาษาเครื่องให้เป็นภาษาระดับล่าง

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

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

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

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

การแปลภาษาระดับสูงเป็นภาษาเครื่อง
การแปลภาษาระดับสูงเป็นภาษาเครื่อง

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

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

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

แต่ถ้าเราจะสร้างภาษาระดับสูงด้วยเหตุผลทางแฟชั่น อันนี้ก็ต้องคิดค้นไวยากรณ์ขึ้นมาใหม่ และรับผิดชอบสร้างตัวแปลภาษาเองครับ ซึ่งแฟชั่นที่ว่าก็เช่น ถ้าช่วงนี้ใคร ๆ ก็อยากจะสั่งเครื่องจักรให้ทำงานด้าน Machine Learning หรือ Data Mining หรือ Data Science หรือ 3D Printing และภาษาชั้นสูงที่มีในปัจจุบัน มันไม่เอื้อต่องานด้านนี้ ก็สามารถสร้างกันขึ้นมาใหม่ได้ครับ ตามแฟชั่นกันไป

 

ทักษะสำคัญ 5 ประการในวิชาชีพคอมพิวเตอร์ (หรือวิชาชีพอื่น ๆ)

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

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

ภายหลังผมจึงเข้าใจ

การออกไปผจญโลกภายนอกในวิชาชีพคอมพิวเตอร์ (หรือวิชาชีพอื่น ๆ) มันต้องมีทักษะสำคัญ 5 ประการ คือ

1. ความรู้ทางทฤษฎี เช่น ความรู้ในทฤษฎีคอมพิวเตอร์ ความรู้ในผลิตภัณฑ์หรือบริการทางคอมพิวเตอร์ ความรู้ในกระบวนการทางคอมพิวเตอร์

2. ความเชี่ยวชาญในการปฏิบัติ เช่น ทักษะการเขียนโปรแกรม ทักษะการเขียนเอกสารวิเคราะห์ระบบ ทักษะการสร้างเอกสารเพื่อบรรยาย ทักษะการบรรยายนำเสนอ ทักษะการใช้งานผลิตภัณฑ์หรือบริการทางคอมพิวเตอร์

3. ความมีเสน่ห์ คือ มีบุคลิกภาพดึงดูดผู้คนให้เข้าหา หน้าตาอิ่มเอมไม่เศร้าหมอง พูดจาดีน่าเชื่อถือ น้ำเสียงไม่ขู่กรรโชก วาจาไม่ก้าวร้าว ไม่ยกตนข่มท่าน ไม่ชักสีหน้า รู้จักรักษาน้ำใจคน

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

5. การบริหารการเมือง คือ รู้จักจัดสรรผลประโยชน์ เพื่อแบ่งให้ตัวเองและผู้อื่น รู้จักการเข้าหาผู้คน รู้จักการประนีประนอม รู้จักใช้ทฤษฎีเกม รู้จักวิธีการพึ่งพาผู้อื่นอย่างเหมาะสม รู้จักการอ่านใจคนและอ่านพฤติกรรมคน

ผมมีข้อ 2 แค่ข้อเดียว ส่วนข้ออื่นด้อยหมด

ในขณะที่พี่คนนั้นเขาด้อยในข้อ 2 แต่มีดีในข้อที่เหลือทั้ง 4 ข้อ

มันก็เป็นดังนี้แล …

ให้ PHP ใช้ SAPRFC เพื่อดึงข้อมูลจาก SAP R/3

ผมกำลังจะทำชิ้นงานหนึ่งชิ้น เพื่อดึงเอาข้อมูลออกจาก SAP R/3 ออกมาใช้ครับ โดยชิ้นงานที่ว่าจะออกเป็นแนว Web Application ซึ่งผมก็คิดว่าผมจะสร้างมันด้วย PHP โดยจะใช้ SAPRFC ซึ่งเป็น PHP Extension สำหรับแทงทะลุเข้าไปใน SAP R/3 ครับ

จริง ๆ แล้วผมจะเขียนภาษา ABAP เพื่อให้มันทำงานบน SAP R/3 ก็ได้นะ มันได้ผลเหมือนกัน เพียงแต่ผมอยากจะแสดงผลออกมาเป็น Web Application ที่มีลูกเล่นสวย ๆ โดยใช้ XHTML + CSS + jQuery + AJAX มากกว่า และอีกอย่างผมก็ไม่อยากจะให้ผู้ใช้งาน ต้องมาติดตั้ง SAP GUI ให้วุ่นวายด้วย ก็เลยเลือกทำเป็น Web Application แทน

หลัก ๆ แล้วการเชื่อมต่อจาก PHP ไปที่ SAP R/3 สามารถทำได้สองวิธีครับ คือใช้ RFC กับใช้ SOAP แต่ผมเลือกใช้ RFC เพราะมีคนเก่ง ๆ ทำ PHP Extension ที่เรียกว่า SAPRFC ให้เราแล้ว ทำเป็น API สวยงาม พร้อมให้เราเรียกใช้ได้เลย

ตอนแรกผมนึกว่าผมจะใช้ ASP.NET เพื่อทำเป็น Web Application แล้วต่อเชื่อมไป SAP R/3 ด้วย SAP Netweaver ที่มี API ของ .NET Framework เตรียมมาให้ แต่แย่หน่อย ผมไม่ได้เป็นสาวกของ Microsoft ผมชอบ PHP มากกว่า ก็เลยเลือกใช้ PHP แทน (ชุมชนมันใหญ่ดี)

วกกลับมาเรื่อง RFC ต่อ คือว่า แนวคิดของ SAP R/3 เ่นี่ย เขาจะอนุญาตให้โปรแกรมคอมพิวเตอร์ภายนอกเรียกเข้ามาที่ SAP R/3 ได้ แต่ไม่ให้เรียกเข้ามาตรง ๆ มาคุ้ยมาเขี่ยตามใจชอบอะไรแบบนั้น คือจะต้องเรียก Function ที่เตรียมเอาไว้ใน SAP R/3 ซึ่ง Function ดังกล่าวก็จะมี Parameter สำหรับรับเข้าและส่งออก และที่สำคัญ Function ดังกล่าวต้องสร้างเอาไว้โดยมีคุณสมบัติเป็น Remote-enabled Module

มีคนแต่งหนังสือสอนเรื่องนี้ไว้หลายคน เช่น อันนี้ เป็นต้น

การเขียนโปรแกรมคอมพิวเตอร์เพื่อเชื่อมต่อกับ SAP R/3 ถือว่าเป็นเรื่องท้าทาย เพราะโดยปรกติแล้ว ก็มีแต่ผลิตภัณฑ์ของ SAP กันเองนั่นแหล่ะ ที่ใช้่ RFC เพื่อเชื่อมต่อรับส่งข้อมูลหากัน คนนอกไม่ค่อยอยากไปยุ่งด้วยเท่าไหร่หรอก มันเป็นระบบกึ่งปิดกึ่งเปิด