Demo https://www.monkeyuser.com/2018/demo/

ช่วงวันหยุดมีโอกาสได้อ่าน research จาก Microsoft เรื่อง What Makes A Great Software Engineer? ซึ่งเป็นการรวบรวมคุณสมบัติ 53 ข้อของการเป็น software engineer ที่ดี จากการสัมภาษณ์ engineer มากประสบการณ์เกือบ 60 คนภายใน Microsoft โดยแบ่งออกเป็น 4 ด้่รใหญ่ ๆ คือ

  1. Personal: ด้านตัวบุคคล
  2. Decision making: ด้านการตัดสินใจ
  3. Teammates: ด้านการทำงานร่วมกับคนอื่น
  4. Software Product: ด้านการพัฒนา software

มาดูรายละเอียดกันว่าแต่ละด้านนั้นมีอะไรบ้าง

Personal

  • Improving: หมั่นปรับปรุงและพัฒนาตนเอง product และคนรอบข้างอย่างสม่ำเสมอไม่หยุดอยู่กับที่
  • Passionate: อินกับความรู้และทักษะที่ใช้ในการทำงานจริง ๆ ไม่ใช่แค่ทำงานไปเพื่อเงินอย่างเดียว
  • Open-minded: เปิดใจพร้อมรับฟังสิ่งใหม่ ๆ และปรับวิธีคิดของตนเอง
  • Data-driven: นำข้อมูลมาใช้ในการวิเคราะห์และประเมินแนวทางการทำงานและ software ตามสมมติฐานที่ตั้งร่วมกันไว้กับทีม
  • Systematic: ลงมือทำโดยมีกระบวนการคิดที่เป็นระบบ
  • Productive: ลงมือทำแล้วได้มาซึ่งผลลัพธ์ที่ประหยัดแรงและค่าใช้จ่ายมากกว่าคนอื่น หรือ ใช้แรงและค่าใช้จ่ายเท่ากันแต่ได้ผลลัพธ์มากกว่า
  • Perseverant: ไม่ย่อท้อสิ้นหวังต่ออุปสรรคและความล้มเหลว
  • Hardworking: ขยันทำงานให้ได้มากกว่าที่คาดหวังไว้เพื่อส่งมอบงานและหรือเพื่อบรรลุเป้าหมายของทีม
  • Curious: มีความอยากรู้อยากเห็น
  • Risk-taking: กล้าเสี่ยงที่จะขึ้นไปจับงานที่ตนเองไม่ได้มีความชำนาญมาก
  • Adaptable: สามารถปรับเปลี่ยนการทำงานของตนเองไปตาม environment ที่เปลี่ยนไปได้ ไม่ว่าจะเป็นด้าน product, people, processes, tools
  • Self-reliant: สามารถทำงานจบได้ด้วยตนเองโดยไม่ต้องพึ่งพาคนอื่นตลอด ผ่าทางตันให้กับทีมโดยใช้ความสามารถและ resource ที่ตนเองมี
  • Self-aware: มีตระหนักรู้ว่าตนเองกำลังคิดหรือทำอะไรเพื่อตัดสินใจลงมือทำในสิ่งที่เหมาะสม
  • Aligned: คำนึงถึงผลประโยชน์ของ product และบริษัทก่อน ไม่ใช่เอาแต่ตนเอง
  • Executing: รู้จังหวะ timing ว่าตอนไหนควร/ไม่ควรลงมือทำ
  • Prideful: มีความภาคภูมิใจในตนเองและผลงานของตนเองซึ่งเกิดจากการสะท้อนทักษะของตนเองลงไปในผลงาน
  • Creating: มีความอยากจะนำเสนอ idea หรือ feature ใหม่ ๆ ลงไปในผลงานของตนเองจริง ๆ
  • Focused: ปันเวลาส่วนใหญ่ที่ใช้ในการทำงานที่มีความสำคัญมากที่สุดก่อน

Decision making

  • Knowledgeable about people and the organization: ตัดสินใจโดยคำนึงถึงบริบทด้านคน เพื่อนร่วมงานและ structure ขององค์กร
  • Sees the forest and the trees: ตัดสินใจโดยคำนึงถึงทั้งรายละเอียดปลีกย่อยและภาพรวมใหญ่ เช่น technical, industry trends, vision
  • Updates their mental models: ปรับกระบวนการตัดสินใจไปตามบริบทที่เปลี่ยนไป
  • Handles complexity: สามารถตัดสินใจจากการเชื่อมโยงสิ่งต่าง ๆ ที่ซับซ้อนเข้าด้วยกันและให้เหตุผลเกี่ยวกับการตัดสินใจได้
  • Knowledgeable about their technical domain: ตัดสินใจโดยคำนึงถึงความรู้เกี่ยวกับ product ทั้งด้าน domain และหรือ market
  • Knowledgeable about customers and business: ตัดสินใจโดยคำนึงถึงความต้องการของ customer/business เป็นหลัก
  • Knowledgeable about tools and building materials: ตัดสินใจโดยคำนึงถึงจุดแข็ง-จุดอ่อนของเครื่องไม้เครื่องมือที่จะนำมาใช้ในการพัฒนา software
  • Knowledgeable about engineering processes: ตัดสินใจโดยคำนึงถึง engineering practices ที่ใช้ในการพัฒนา software รวมถึงค่าใช้จ่ายด้านคนและเวลา
  • Models states and outcomes: ตัดสินใจโดยคำนึงถึงสิ่งที่มีอยู่ในปัจจุบัน ตัวเลือกอื่น ๆ ที่กำลังจะไปในอนาคต และผลที่ตามมาของการตัดสินใจนั้น ๆ

Teammates

  • Creates shared context: สามารถอธิบายสร้างความเข้าใจในเรื่องใหม่ ๆ ร่วมกันในทีมได้แบบไม่งงงวยจนเกินไป
  • Creates shared success: สร้างความสำเร็จที่เกิดจากทุกคนร่วมด้วยช่วยกัน
  • Creates a safe haven: สร้าง environment ที่ทีมสามารถเรียนรู้และพัฒนาตนเองจากความผิดพลาดโดยที่ไม่มีผลร้ายตามมา
  • Honest: จริงใจ ไม่ปั่นไม่ตุกติก แค่นั้นเลย ฮ่า ๆๆ
  • Integrates contexts: สร้างความเข้าใจของตนเองจากข้อมูลหลาย ๆ แหล่งซึ่งเกิดจากการถามคำถามเกี่ยวกับปัญหาหรืออุปสรรคที่ทีมกำลังเจอ
  • Well-mannered: ให้เกียรติผู้อื่น
  • Acquires context: เรียนรู้ context และความรู้ใหม่ ๆ จากงานของคนอื่น
  • Not making it personal: แยกเรื่องงานกับอคติเรื่องส่วนตัวออกจากกัน
  • Mentoring: ช่วยเหลือให้คำปรึกษาคนอื่นในการพัฒนาตนเอง
  • Raises challenges: ผลักดันคนในทีมให้ออกจากขีดจำกัดของตนเอง
  • Walking-the-walk: ทำ (ไม่ใช่แค่พูด) ให้ดูเป็นตัวอย่างที่ดีให้กับทีม
  • Manages expectations: กำหนด expectation ที่ชัดเจนแล้วพยายามทำให้ได้ตามนั้น สามารถปรับได้ตามสถานการณ์ที่เปลี่ยนไป
  • Has a good reputation: สร้างเชื่อเสียง (ไม่เอาเชื่อเสียนะ) เพื่อให้คนในทีมเชื่อมั่นในตัวเรา
  • Stands their ground: ยืนหยัดในสิ่งที่ตนเองคิดอย่างเหมาะสมโดยไม่ไขว้เขวไปตามแรงกดดันข้างนอก
  • Trading favors: หยิบยื่นน้ำใจช่วยเหลือและตอบแทนคนอื่น
  • Personable: ทำตัวใหคนอยากเข้าหาเราทั้งในงานและนอกงาน
  • Asks for help: ขอความช่วยจากคนอื่น ๆ เมื่อเกิดปัญหาที่เราไม่สามารถหรือมั่นใจว่าจะแก้ไขได้เอง

Software Product

  • Elegant: เรียบง่ายและเข้าใจง่ายพอที่จะไม่หนักหัวคนอื่นมากจนเกินไป
  • Creative: Solution มีการต่อยอดจากความเข้าใจในบริบทและข้อจำกัด solution เดิม
  • Anticipates needs: พัฒนา software ที่ตอบโจทย์ความต้องการทั้งปัจจุบันและเผื่อในอนาคตอันใกล้ไว้ได้
  • Makes tradeoffs: ออกแบบ software โดยคำนึงถึง tradeoff เพื่อเลือกสิ่งที่สำคัญกับ product ในบริบทนั้น ๆ
  • Attentive to details: ลงรายละเอียดในการ coding เช่น error handling, memory consumption, performance เป็นต้น
  • Fitted: ออกแบบ software โดยคำนึงถึงส่วนงานอื่น ๆ ในระบบ
  • Evolving: ออกแบบ software ที่สามารถปรับแก้ได้ง่ายในอนาคต
  • Long-termed: ออกแบบ software โดยคำนึงถึงระยะยาวไว้บ้าง
  • Carefully constructed: มี engineering practice เช่น การทดสอบเข้ามาอยู่ในการพัฒนา software

คำถามที่น่าสนใจคือว่าตอนนี้เรามีคุณสมบัติตามนี้กี่ข้อ แล้วเราน่าจะต้องพัฒนาจุดไหนกันบ้าง ลองตกตะกอนกับตนเองกันดูนะครับ