หัวข้อที่ยังไม่ได้รับความสนใจจนมาถึงปี 2016 (ตอนที่ 1)

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

ทักษะที่ผมคิดว่าจำเป็นสำหรับโปรแกรมเมอร์ที่ควรจะมีติดตัวมีดังนี้

 

ความเข้าใจและชำนาญในเครื่องมือ

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

Tool ราคาเป็นล้านแต่ใช้จริงแค่หลักพัน

อะไรประมาณนี้
ลองกลับคิดดูว่าเครื่องมือที่คุณใช้สามารถทำอะไรได้และสามารถช่วยให้ชีวิตคุณดีขึ้นได้อย่างไร หรือแม้แต่ API (ตัวภาษาที่ใช้) Library หรือ Framework ที่กำลังใช้อยู่นั้นมีทีเด็ดอะไรแฝงอยู่หรือเปล่า เช่นเราสามารถจะเปลี่ยนการ concat string ไปใช้พวก StringBuffer เป็นต้น (ในระดับ bytecode ใน Java รุ่นหลังๆ มันทำให้ประสิทธิภาพเหมือนกันแล้วนะ แต่มันทำยังไงลองไปศึกษาเพิ่มเติมเอาเอง)

 

Testing

น่าแปลกใจที่โปรแกรมเมอร์เขียนโปรแกรมแล้วไม่ค่อยทดสอบระบบ คือเขียนแล้วคอมไพล์ผ่าน ทำงาน good scenario ได้ก็พอ (บางครั้งผมเห็นว่าไม่ทดสอบเลย แล้วก็ส่งให้ Tester ทดสอบ) เรื่องนี้ต้องเริ่มตั้งแต่การ design โค้ดเพื่อให้ทดสอบได้ง่ายก่อน หลายๆ ครั้งเราจะเห็นว่าหนึ่ง function ยาวเป็นหางว่าว ไล่โค้ดลำบาก เลยไม่ต้องพูดถึงการทำ unit test ก็เลยต้องแก้ตามน้ำไป ยังไม่รับรวมกับระบบที่โปรแกรมเราต้องไปเชื่อมต่อ หากระบบนั้นส่งค่ามาไม่ปกติหรือทำงานผิดพลาด ชีวิตเกิดดราม่าขึ้นแน่นอน นี่ยังไม่นับรวมว่า หากมีการแก้ไขระบบแล้วโปรแกรมยังทำงานถูกต้องไม่กระทบกับ function อื่น แล้วจะมีใครมานั่งทดสอบระบบใหม่ทั้งหมดอีกครั้งว่ายังทำงานทุกอย่างได้ปกติ

ดังนั้นผมจึงคิดว่าเราควรหันมาสนใจเรื่องการทดสอบระบบให้มากขึ้นกว่านี้ เริ่มตั้งแต่การ design code เพื่อให้ทำ Unit Test ได้ง่าย ใช้ jUnit หรือ TestNG คุมแล้วใช้พวก Integration Test อย่าง Selenium หรือ Arquillian คุมอีกที หากจำเป็นต้องเชื่อมต่อกับระบบอื่นก็ใช้ตระกูล Mock Object อย่างเช่น Mockito ช่วยจำลองผลลัพทธ์โดยไม่ต้องรอเชื่อมต่อจริงก็ได้ แล้วการ Test ยังมีอีกหลายอย่าง เช่น Penetration test, Load Test, Stress Test เป็นต้น

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

พอขั้นสูงขึ้นมาหน่อยก็จะเป็นแนว Test Driven Development หรือแนว Business Driven Development อันนี้จะเป็นแนว Test จ๋าเลย

แต่ว่า……. มันก็มีหลายอย่างที่ไม่สามารถทำเป็นแนว automate test ได้เหมือนกัน เช่น css เพี้ยน หรือพวก download, export หรือ print ที่ต้องใช้คนจริงๆ ทดสอบเหมือนกัน (เผื่อมีคนท้วงติงมาว่าทำ unit test แล้วสบายทั้ง project คือเราไม่จำเป็นต้องทำ test coverage ให้ครบ 100% ครับ)

 

Refactoring

เมื่อเรามั่นใจในการเขียน Test ว่าครอบคลุมทุกจุดสำคัญแล้ว สิ่งที่เราสามารถลุยต่อได้คือการแก้ไขเพื่อปรับปรุงหรือแยก function ที่มีการทำงานมากกว่าหนึ่งอย่างให้เป็น function ย่อยๆ หรือยุบรวมส่วนที่ซ้ำซ้อนกันให้มาทำงานที่จุดเดียวได้ เพื่อที่เราจะสามารถ test ได้ครอบคลุมมากขึ้นได้ (function นั้นต้องมีการทำ Unit testing คลุมไว้เพื่อที่เราจะได้แก้อย่างสบายใจว่ามันยังสามารถทำงานเดิมได้อย่างถูกต้อง) ซึ่งการทำ Refactoring มีหลายแบบ หากคนที่คุ้นเคยกับ IDE คงจะเคยเห็น เช่น extract constant, extract method เป็นต้น ถ้าศึกษาเรื่องนี้คงต้องได้ยินคำศัพท์ code smell แน่นอน นั่นแหละ refactoring ก็เป็นหนทางแก้อีกทางหนึ่ง

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s