หลายปีมานี้เห็นคนบ่นเรื่องคนเรียนไอทีเยอะแต่แรงงานโปรแกรมเมอร์ยังขาดแคลน เพราะคนไม่มีคุณภาพ ซึ่งเป็นประเด็นที่ผมเคยไม่ค่อยสนใจเท่าไหร่เพราะคิดว่าเป็นเรื่องไกลตัว แต่ไม่นานมานี้ผมได้มีโอกาสเปลี่ยนงานจากการ support โปรแกรมที่ dev โดยคนอื่นมาก่อน มาเป็นงานที่ต้อง dev project ใหม่จากศูนย์เป็นครั้งแรก และได้ค้นพบว่าระดับ
ความยากและความเครียดของงานมันห่างกันเกินกว่าที่คาดไว้มากกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกก จนผมเริ่มไม่แปลกใจแล้วว่าทำไมโปรแกรมเมอร์ถึงเปลี่ยนไปทำอาชีพอื่น -- กลายเป็นส่วนหนึ่งของโปรแกรมเมอร์ไม่มีคุณภาพที่เค้าพูดถึงกัน -- ผมเริ่มสงสัยว่าโปรแกรมเมอร์ที่ทำงาน dev เต็มตัวและยังเหลือรอดอยู่ได้นี้คือเค้าต้องมีความสามารถขนาดไหนกันนะ
เคยได้ยินคนบอกว่า การเป็นโปรแกรมเมอร์ แค่เขียนภาษาหลักๆ ได้สักภาษานึง และรู้จัก framework หลักๆ ของภาษานั้นได้ก็ไม่ต้องกลัวตกงานแล้ว -- ผมพบว่ามันไม่จริงเลยครับ ผมเคยคิดว่าตัวเองเป็นคนที่ถนัดโปรแกรมมิ่งมากๆ เรียกได้ว่า born to be programmer เลย ชอบโค้ด อยู่ว่างๆ ก็ชอบเขียนโปรแกรมเล่น ศึกษาภาษาและ framework ใหม่ๆ นี่ของโปรด
แต่ ...
พอได้มาทำงาน dev เต็มตัวถึงได้รู้ว่าสกิลที่ว่ามานั้นมันเป็นแค่ส่วนเดียวของงาน แท้จริงแล้วยังมีสกิลที่โปรแกรมเมอร์จำเป็นต้องมีอีกมากมาย
การคุยกับลูกค้าและเพื่อนร่วมงาน
โปรแกรมเมอร์ต้องเค้นพลังงานทั้งหมดที่มีออกมาใช้เพื่อสร้างภาพให้ตัวเองดูคูลที่สุดเท่าที่จะทำได้ทั้งๆ ที่จริงแล้วไม่ถนัดเรื่องการพูดคุย ต้องเตรียมถูกตำหนิและถูกตั้งคำถามหลายอย่าง ต้องโม้ว่าโปรแกรมที่เราเขียนนั้นมันทำนั่นทำนี่ได้แล้ว ทั้งที่จริงมันยังทำไม่ได้ (แต่จำเป็นต้องโกหกเพราะเราผิดเองที่คิดไม่ถึงว่ามันต้องทำอันนี้ได้ด้วย) และต้องมาอดหลับอดนอนแก้โปรแกรมตามที่โม้ไป พอโม้เยอะไปหน่อยเลยทำให้ทำ feature ที่วางแผนไว้ไม่เสร็จ และอธิบายให้คนอื่นๆ เข้าใจไม่ได้ว่าทำไมถึงทำงานไม่เสร็จ
การดีไซน์ระบบ
การทำงานโปรเจคใหญ่ ต้องมีการดีไซน์ระบบอย่างดี ไม่เหมือนกับการเขียนโปรแกรมเล่นยามว่าง เพราะเราต้องทำงานเป็นทีมร่วมกับคนอื่น ถ้าดีไซน์ไม่ดีจะลำบากตอนจะใส่ feature เข้าไปและสุดท้ายระบบก็จะเละเทะ ถ้าเรา dev คนเดียวเราจะมาแก้ดีไซน์ตอนไหนก็ได้ แต่การ dev เป็นทีม เราต้องแบกรับบาปกรรมของดีไซน์ห่วยๆ ของเราไว้ไปตราบนานเท่านาน แต่การดีไซน์ระบบให้รองทุก feature ของโปรเจคใหญ่ๆ นั้นไม่ง่ายเลย มันมีหลายอย่างที่เราไม่รู้ และไม่มีเวลาพอที่จะไปค้นคว้า และบางทีเราก็ไม่มีประสบการณ์พอที่รู้ล่วงหน้าว่าจะต้อง concern เรื่องอะไรบ้าง ทำให้เราเลี่ยงไม่ได้ที่จะต้องทำผักชีโรยหน้าไว้ก่อนและก้มหน้ารับกรรมในภายหลัง
การแบ่งงานและเวลา
ถ้าเปรียบโปรเจคใหญ่ๆ เป็นเหมือนการปั้นช้างที่ตัวใหญ่เท่าภูเขา เป็นไปไม่ได้เลยที่เราจะปั้นช้างทั้งตัวในทีเดียว ความยากก็คือเราต้องสามารถ zoom out สมองของเราออกมาและแบ่งให้ได้ว่างานทั้งหมดที่ต้องทำมันมีอะไรบ้างและใช้เวลาเท่าไหร่บ้าง และต้องใช้คนช่วยกี่คน
การวาง development process
โปรแกรมเมอร์ต้องศึกษาและมโนเอาเอง เพราะไม่รู้ว่าชาวบ้านเค้าทำยังไงกัน
- การวาง CI (Continuous Integration) Server
- การกำหนดกติกาในการแตก branch และ push code
- การวางแผน release version เพราะเราต้องทยอยส่งงานลูกค้า ไม่ได้ส่งทีเดียวตอนเสร็จ
- การทำ detailed design
- การ review และ merge code
- การทำเอกสารต่างๆ
การเทส
โปรแกรมเมอร์ต้องเป็นวัวสันหลังหวะ กลัวว่าสักวันลูกค้าและหัวหน้าจะรู้ว่าเราไม่ได้เขียน unit test (เพราะไม่มีเวลาจ้า)
ความรู้เฉพาะทางของธุรกิจต่างๆ
โปรแกรมเมอร์ต้องศึกษาความรู้เฉพาะทางของธุรกิจที่โปรแกรมซัพพอร์ต เช่นการเงิน การทำ stock สินค้า การออกใบเสร็จ และข้อกฎหมายต่างๆ
การจัดการเวลา
โปรแกรมเมอร์ต้องประเมินงานของตัวเองเสมอว่าจะใช้เวลากี่
ชั่วโมง โปรดสังเกตคำว่า
ชั่วโมง มีคนกล่าวว่าถ้าโปรแกรมเมอร์ขอเวลาเป็น
วันแปลว่าเขายังไม่ได้คิดว่าต้องทำอะไรบ้าง
ขอถามเลยครับ
ว่าโปรแกรมเมอร์คุณภาพที่คนเค้าพูดถึงกันเนี่ย นอกจากสกิลการ coding ที่ดีแล้ว แล้วต้องมีสกิลดังกล่าวเหล่านี้ในระดับสูงด้วย ผมเข้าใจถูกต้องไหมครับ
โปรแกรมเมอร์ที่มีคุณภาพเค้าต้องเทพขนาดไหนหรอครับ
เคยได้ยินคนบอกว่า การเป็นโปรแกรมเมอร์ แค่เขียนภาษาหลักๆ ได้สักภาษานึง และรู้จัก framework หลักๆ ของภาษานั้นได้ก็ไม่ต้องกลัวตกงานแล้ว -- ผมพบว่ามันไม่จริงเลยครับ ผมเคยคิดว่าตัวเองเป็นคนที่ถนัดโปรแกรมมิ่งมากๆ เรียกได้ว่า born to be programmer เลย ชอบโค้ด อยู่ว่างๆ ก็ชอบเขียนโปรแกรมเล่น ศึกษาภาษาและ framework ใหม่ๆ นี่ของโปรด
พอได้มาทำงาน dev เต็มตัวถึงได้รู้ว่าสกิลที่ว่ามานั้นมันเป็นแค่ส่วนเดียวของงาน แท้จริงแล้วยังมีสกิลที่โปรแกรมเมอร์จำเป็นต้องมีอีกมากมาย
การคุยกับลูกค้าและเพื่อนร่วมงาน
โปรแกรมเมอร์ต้องเค้นพลังงานทั้งหมดที่มีออกมาใช้เพื่อสร้างภาพให้ตัวเองดูคูลที่สุดเท่าที่จะทำได้ทั้งๆ ที่จริงแล้วไม่ถนัดเรื่องการพูดคุย ต้องเตรียมถูกตำหนิและถูกตั้งคำถามหลายอย่าง ต้องโม้ว่าโปรแกรมที่เราเขียนนั้นมันทำนั่นทำนี่ได้แล้ว ทั้งที่จริงมันยังทำไม่ได้ (แต่จำเป็นต้องโกหกเพราะเราผิดเองที่คิดไม่ถึงว่ามันต้องทำอันนี้ได้ด้วย) และต้องมาอดหลับอดนอนแก้โปรแกรมตามที่โม้ไป พอโม้เยอะไปหน่อยเลยทำให้ทำ feature ที่วางแผนไว้ไม่เสร็จ และอธิบายให้คนอื่นๆ เข้าใจไม่ได้ว่าทำไมถึงทำงานไม่เสร็จ
การดีไซน์ระบบ
การทำงานโปรเจคใหญ่ ต้องมีการดีไซน์ระบบอย่างดี ไม่เหมือนกับการเขียนโปรแกรมเล่นยามว่าง เพราะเราต้องทำงานเป็นทีมร่วมกับคนอื่น ถ้าดีไซน์ไม่ดีจะลำบากตอนจะใส่ feature เข้าไปและสุดท้ายระบบก็จะเละเทะ ถ้าเรา dev คนเดียวเราจะมาแก้ดีไซน์ตอนไหนก็ได้ แต่การ dev เป็นทีม เราต้องแบกรับบาปกรรมของดีไซน์ห่วยๆ ของเราไว้ไปตราบนานเท่านาน แต่การดีไซน์ระบบให้รองทุก feature ของโปรเจคใหญ่ๆ นั้นไม่ง่ายเลย มันมีหลายอย่างที่เราไม่รู้ และไม่มีเวลาพอที่จะไปค้นคว้า และบางทีเราก็ไม่มีประสบการณ์พอที่รู้ล่วงหน้าว่าจะต้อง concern เรื่องอะไรบ้าง ทำให้เราเลี่ยงไม่ได้ที่จะต้องทำผักชีโรยหน้าไว้ก่อนและก้มหน้ารับกรรมในภายหลัง
การแบ่งงานและเวลา
ถ้าเปรียบโปรเจคใหญ่ๆ เป็นเหมือนการปั้นช้างที่ตัวใหญ่เท่าภูเขา เป็นไปไม่ได้เลยที่เราจะปั้นช้างทั้งตัวในทีเดียว ความยากก็คือเราต้องสามารถ zoom out สมองของเราออกมาและแบ่งให้ได้ว่างานทั้งหมดที่ต้องทำมันมีอะไรบ้างและใช้เวลาเท่าไหร่บ้าง และต้องใช้คนช่วยกี่คน
การวาง development process
โปรแกรมเมอร์ต้องศึกษาและมโนเอาเอง เพราะไม่รู้ว่าชาวบ้านเค้าทำยังไงกัน
- การวาง CI (Continuous Integration) Server
- การกำหนดกติกาในการแตก branch และ push code
- การวางแผน release version เพราะเราต้องทยอยส่งงานลูกค้า ไม่ได้ส่งทีเดียวตอนเสร็จ
- การทำ detailed design
- การ review และ merge code
- การทำเอกสารต่างๆ
การเทส
โปรแกรมเมอร์ต้องเป็นวัวสันหลังหวะ กลัวว่าสักวันลูกค้าและหัวหน้าจะรู้ว่าเราไม่ได้เขียน unit test (เพราะไม่มีเวลาจ้า)
ความรู้เฉพาะทางของธุรกิจต่างๆ
โปรแกรมเมอร์ต้องศึกษาความรู้เฉพาะทางของธุรกิจที่โปรแกรมซัพพอร์ต เช่นการเงิน การทำ stock สินค้า การออกใบเสร็จ และข้อกฎหมายต่างๆ
การจัดการเวลา
โปรแกรมเมอร์ต้องประเมินงานของตัวเองเสมอว่าจะใช้เวลากี่ชั่วโมง โปรดสังเกตคำว่าชั่วโมง มีคนกล่าวว่าถ้าโปรแกรมเมอร์ขอเวลาเป็นวันแปลว่าเขายังไม่ได้คิดว่าต้องทำอะไรบ้าง
ขอถามเลยครับ ว่าโปรแกรมเมอร์คุณภาพที่คนเค้าพูดถึงกันเนี่ย นอกจากสกิลการ coding ที่ดีแล้ว แล้วต้องมีสกิลดังกล่าวเหล่านี้ในระดับสูงด้วย ผมเข้าใจถูกต้องไหมครับ