#1 tech recruiter in thailand

Warning! Your Programming Career

See the original English version of this article here

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

ภาษา, เทคโนโลยี หรือ ทักษะ?

ก่อนอื่นคุณต้องถามตัวเองก่อนว่า คุณต้องการอะไร ชอบ Mobile App, Website, Desktop Application หรือหากสนใจพัฒนา Game จะเล่นบน Desktop หรือ Mobile เป็นต้น แต่ถ้าจะให้ดีกว่านั้น คุณควรรู้ว่า มีทักษะอะไรบ้างที่จำเป็นต้องใช้ในการสัมภาษณ์งานและช่วยให้ได้งานที่คุณต้องการ แต่ก่อนอื่นคุณควรรู้ภาพรวมของ “World of Programming” ซะก่อน ซึ่งประกอบไปด้วย 3 Platforms หลักๆ:

1. WEB (Google Search, Facebook, Amazon, Twitter และอื่นๆ )

เมื่อพูดถึง Web สามารถแบ่งออกได้เป็นส่วนของ Front-End และ Back-End

Front-End คือหน้า Web ที่เราเห็นกันนั่นเอง ถ้าคุณอยากเชี่ยวชาญด้านนี้ คุณควรเข้าใจเรื่อง Look & Feel และรู้จักเครื่องมือเหล่านี้คือ HTML (Look), CSS (Look & Feel), JavaScript (Feel) ซึ่งมันอาจยังไม่พอ คุณต้องรู้จักเลือก Framework ด้วยซึ่งที่นิยมใช้กันอยู่ก็มี Angular, React หรือ Vue แล้วสิ่งที่คุณเลือกก็ต้องขึ้นอยู่กับงานหรือบริษัทด้วยว่าชอบแบบไหน ถ้าชอบ Google ก็ใช้ Angular ถ้าชอบ Facebook ก็ใช้ React ถ้าไม่ชอบทั้งคู่ก็อาจเลือก Vue นอกจากนี้คุณควรเข้าใจแนวคิดพื้นฐานบางอย่าง เช่น การทำงานของ HTTP Protocol, ทำความคุ้นเคยกับ Web Servers (อย่างน้อยควรรู้จัก Apache หรือ Nginx) ในฐานะของ Front-End Developer คุณต้องนำข้อมูล (ที่เหมาะกับ User) จาก Back-End มาแสดงผล ดังนั้น ความเข้าใจเบื้องต้นและรู้จักว่า API หรือ JSON คืออะไร (และทำไมมันดีกว่า XML) ถือเป็นเรื่องจำเป็นเช่นกัน

Back-End หรือที่เรามักเรียกกันว่า หลังบ้าน นั่นแหละ สมัยก่อนแค่รู้จัก PHP ก็เพียงพอ จากนั้น Microsoft ก็มี ASP.NET ออกมา ซึ่งก็ดูจะขับเขี้ยวกันอยู่ จนมี Node.js ขึ้นมา สิ่งที่สร้างความสับสนมากที่สุดในส่วนของ Back-End คือ ความหลากหลายของภาษาที่จะใช้ ซึ่ง Back-End เป็นคำที่ใช้แทนทั้ง “Query Database, Process Data, Respond to Client และทำให้มันมีประสิทธิภาพมากที่สุดเท่าที่จะทำได้” ดังนั้นการเลือก Language/Technology/Database ที่เหมาะสม จึงเป็นเรื่องสำคัญ ในส่วนของ Database นั้น Developer หลายคนเลือกใช้ Relational Databases อย่าง MySQL หรือ PostgreSQL แต่ถ้าคนรุ่นใหม่ๆ หน่อยอาจเลือก NoSQL (อย่าง Cassandra หรือ MongoDB) ซึ่งมันขึ้นอยู่กับคุณจะนำไปใช้กับลักษณะงานแบบไหนและคุณถนัดใช้มันหรือไม่ สำหรับ NoSQL อาจมีข้อยุ่งยากหน่อย แต่ที่จริงมันขึ้นอยู่กับ Services และ Data Architecture ของคุณด้วย ซึ่งมีให้เลือกใช้ทั้ง MongoDB, Redis, Neo4j หรือ ArangoDB นอกจากนี้ยังมี Concept อื่นๆ ที่คุณควรรู้อีกด้วย คือ

    • Caching: เริ่มต้นจาก CPU Cache (มีหลาย Levels) และลงท้ายด้วย Browser Cache โดย Caching ถูกใช้ทุกที่สำหรับ Service ที่มี Load สูงอย่าง Google Search หรือ Facebook ด้วยแล้ว Caching ถือเป็นสิ่งจำเป็นอย่างยิ่ง
    • Servers: สำหรับ Back-End Developer แล้ว Server ในที่นี้หมายถึง Web Server ซึ่ง Web Server ที่ได้รับความนิยมในปัจจุบันคือ Nginx และหากคุณรู้วิธี Setup และ Configure ด้วยแล้ว มันจะดีต่อหน้าที่การงานของคุณในอนาคตด้วย
    • Sockets: ถือเป็นพื้นฐานสำคัญของ Network Programming ทุกอย่างที่คุณ Send/Receive ผ่านทาง Network จะทำโดย Sockets การที่คุณรู้จักรายละเอียด Low-level ของ Socket Programming ถือเป็นโบนัสในทักษะของคุณ (ยิ่งรู้ความแตกต่างระหว่าง TCP Sockets กับ UDP Sockets และ รู้ว่า WebSockets คืออะไร ก็ยิ่งดีไปอีก)
    • Database Design: ไม่ว่าคุณจะเลือก DBMS ตัวไหน แต่การจัดการกับ Data ถึงเป็นหนึ่งในงานหลักของคุณ ความสามารถในการมองเห็นภาพ, Visualize Data และ Connections ระหว่าง Data Units ถือเป็นทักษะที่คุณควรมีในการทำงาน
    • Security: ในเรื่อง Security อย่างน้อยคุณควรรู้พื้นฐานบางอย่างเช่น การเก็บ Password Hashes แทนที่จะเป็น Plain Texts, การเช็ค Requests ผ่าน API Token, การ Verify User Permissions ของแต่ละ Request เป็นต้น

2. Desktop (Dropbox, Photoshop, Visual Studio, Skype และอื่นๆ )

มี Application มากมายบน Desktop Platforms ซึ่งใช้ทักษะที่หลากหลายและแตกต่างกันไป เช่น หากอยากเขียนอะไรที่คล้ายกับ Dropbox คุณควรรู้จัก Socket Programming หากคุณต้องการสร้าง Compiler หรือ IDE เหมือนอย่าง Visual Studio คุณควรรู้จักการกำหนดโครงสร้างของ Compiler เป็นต้น เมื่อพูดถึงภาษาสำหรับ Desktop Applications Programmer ดูจะเป็นเรื่องยาก ว่าจะเลือกภาษาอะไรดีระหว่าง C++, Java หรือ C# ถ้าคุณชอบ Microsoft ก็ใช้ C# ถ้าชอบ Oracle ก็ใช้ Java ถ้าไม่ขึ้นกับบริษัทใดเลยก็เลือก C++ หากแนวทางนี้ยังไม่ช่วยในการตัดสินใจของคุณ งั้นลองมาดูกันที่ Sub-Platforms ดีกว่า ถ้าคุณเขียน Software สำหรับ Windows Users เท่านั้น C# ก็น่าจะเหมาะสมที่สุด แม้ C# Developer จะยืนยันว่าหลังจากเปิดตัว .Net Core แล้ว ก็สามารถใช้งาน C# ใน Linux Environment ได้ แต่ถ้าจะใช้งานกับ Linux จริงๆ ก็ขอแนะนำ C++ เพราะ มันถูกสร้างมาให้เป็น Cross-Platform Programming Language ซึ่งทำงานได้กับทุก Operating Systems แต่จะว่าไปแล้ว C++ ก็ยังมีจุดอ่อนเรื่อง GUI แต่คุณก็สามารถใช้ Qt ซึ่งเป็น Cross-Platform GUI Library ได้ แต่หากคุณไม่ชอบความซับซ้อนของ C++ และไม่อยากวุ่นวายมาใช้ Library อย่าง Qt ก็แนะนำให้ใช้ Java เพราะมันมี Virtual Machine เป็นของตัวเอง และ Application ของคุณก็สามารถทำงานได้ดีกับ OS ต่างๆ ด้วยเมื่อติดตั้ง Java Virtual Machine แล้ว

3. Mobile (SoloLearn, Instagram, Uber และอื่นๆ)

เมื่อพูดถึง Java สิ่งแรกที่นึกถึงคือ Android ก่อนหน้าที่จะเกิด Kotlin, Java เป็นภาษาหลักในการ Implement Android App แต่ปัจจุบัน Kotlin ก็สามารถใช้พัฒนา App สำหรับ Android Platform ได้ ดังนั้นถ้าคุณต้องการสร้าง Android App ก็มี Choice ให้เลือกระหว่าง Java และ Kotlin แต่ก่อนจะเลือก เรามาลองพิจารณาให้ลึกขึ้น ซึ่งประเด็นคือ Google ดูจะไม่ค่อยเข้ากันกับ Oracle สักเท่าไหร่ Oracle เป็นเจ้าของ Java แต่ Java ก็เป็นตัวหลักที่ใช้งานกับ Android ของ Google ดังนั้นเพื่อให้เกิดความยืดหยุ่นมากขึ้น Google เลยออกแนวเชียร์ให้ใช้ Kotlin ซะมากกว่า ดังนั้น หากใครอยากเป็น Android Developer การเลือกศึกษา Kotlin ก็ดูจะเป็นทางเลือกที่เหมาะ แต่หากคุณศึกษา Java ด้วยก็ยิ่งดี ตอนนี้เรามาพูดถึง iOS กันต่อ แต่ก่อนเมื่อพูดถึง iOS, Objective-C ดูจะเป็นภาษาที่โดดเด่นมากที่สุด แต่ด้วยความยากและต้องใช้ความพยายามมากในการเรียนรู้ Apple จึงแนะนำภาษา Swift ขึ้นมาซึ่งมันง่ายกว่าใช้ Objective-C หากคุณอยากเป็น iOS Developer ก็ต้องเรียนรู้ Swift เป็นหลัก แต่หากคุณศึกษา Objective-C ไว้ด้วยก็จะมีประโยชน์มากเพราะมี Apps มากมายที่เขียนโดย Objective-C แต่ที่อยากกล่าวถึงอีกอย่างคือ React Native ซึ่งสามารถใช้เขียน Apps ทั้งของ Android และ iOS platforms โดยใช้ JavaScript ได้ ซึ่งถือว่าเป็นทางเลือกอีกทางหนึ่งของคุณ

การเตรียมตัวสัมภาษณ์งาน

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

1. Algorithms & Data Structures – เป็นทักษะที่เป็นที่ต้องการมากที่สุดก็ว่าได้ ซึ่งในหัวข้อนี้คุณควรคุ้นเคยกับเรื่องเหล่านี้

Algorithm Complexity: Big-O notation และวิธีคำนวณ Algorithms Complexity รวมทั้งรู้ว่า Algorithm ใดที่ดีกว่าภายใต้ Complexity นั้น เช่น O(N) vs O(logN)

Basic Data Structures & adapters: Array, Linked List, Stack, Queue

Sorting & Searching: การรู้จัก Sorting Algorithms ที่หลากหลาย จะช่วยให้คุณระบุการ Implementation ที่เป็นไปได้มากที่สุดใน Project ของคุณ ในทางปฏิบัติ คุณควรลอง Implement เกี่ยวกับ Insertion Sort, Selection Sort หรือ Merge Sort และระบุข้อแตกต่างระหว่าง Linear Search และ Binary Search

Trees & Graphs: คุณจะพบ Trees และ Graphs ได้แทบทุกแห่ง ตั้งแต่ “friends graph” ใน Facebook จนถึง “knowledge graph” ใน Google Search

Hashtables: เป็นหนึ่งใน Data Structures ที่มีประสิทธิภาพที่สุดในโลก Hashtables ถือเป็นตัวเลือกที่ดีเสมอ คุณควรจะสามารถ Implemant Hashtable ได้และทำความคุ้นเคยกับเทคนิคในการแก้ปัญหา Collisions ได้

2. Computer Organization & Operating Systems – ขอแนะนำเป็นอย่างยิ่ง ให้คุณทำความคุ้นเคยกับหัวข้อต่างๆ เหล่านี้:

  • Bitwise operations
  • วิธีที่ CPU ทำการ Execute Machine Code
  • ข้อแตกต่างระหว่าง Static RAM และ Dynamic RAM
  • ประเภทของ OS kernel
  • ข้อแตกต่างระหว่าง “Mutex” และ “Semaphore”
  • Deadlock และ Llivelock คืออะไร

3. Coding – คุณควรรู้จักอย่างน้อยหนึ่งภาษา Programming เป็นอย่างดี, รู้ถึงข้อดี-ข้อเสีย, Best practices ของภาษาที่คุณถนัดเพื่อการเขียน Code ที่มีประสิทธิภาพ Code ที่ดีและอ่านง่าย แนะนำให้คุณฝึกฝนด้วยการแก้ปัญหาที่มีความท้าทาย เช่น:

  • The Josephus Problem
  • Tower of Hanoi
  • String Compression
  • Balanced Parenthesis
  • Twin Prime Numbers

4. System Design – การรู้จัก Object-Oriented Programming ถือเป็นสิ่งจำเป็นสำหรับ Programmer ยุคใหม่ System Design ในที่นี้หมายถึง การคิดเกี่ยวกับระบบทั้งหมด, สามารถออกแบบ Architecture ของมันได้, แบ่งย่อยออกเป็น Classes, นิยาม Object Interactions ได้ ที่สำคัญควรเตรียมหาคำตอบของคำถามเหล่านี้:

  • คุณจะออกแบบ Google Search อย่างไร? เกิดอะไรขึ้นถ้ามี Request เกิดขึ้นพร้อมๆ กันนับล้านรายการต่อวินาที
  • คุณจะ Implement เกี่ยวกับการค้นหาเพื่อนใน Facebook อย่างไร?
  • ทำไมคุณคถึงควรใช้ระบบ Relational Database Management?
  • ทำไมคุณคถึงควรใช้ NoSQL DB?
  • คุณควรรู้ความแตกต่างระหว่าง Composite และ Decorator

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

ISM Technology Recruitment Ltd. (#1 Tech Recruiter in Thailand) เราเชี่ยวชาญในธุรกิจ IT Recruitment & IT Outsourcing โดยเฉพาะ เปิดทำการกว่า 25 ปี มีพนักงานทุกสายและทุกระดับทางด้าน IT ที่ได้ร่วมงานกับลูกค้าองค์กรใหญ่ที่มีชื่อเสียงและบริษัทข้ามชาติมากมาย หากคุณเป็นคน IT ที่อยากทำงานท้าทายและร่วมงานกับองค์กรชั้นนำ สามารถฝากประวัติการทำงาน (Resume) ของคุณไว้กับ ISM ได้ที่ https://www.ismtech.net/submit-your-resume แล้วคุณจะพบว่าอนาคตและโอกาสก้าวหน้ากำลังรอคุณอยู่

Source:  https://medium.com/

en