คุณสมบัติในการเป็น software engineer ที่ดีจาก Microsoft
https://www.monkeyuser.com/2018/demo/
ช่วงวันหยุดมีโอกาสได้อ่าน research จาก Microsoft เรื่อง What Makes A Great Software Engineer? ซึ่งเป็นการรวบรวมคุณสมบัติ 53 ข้อของการเป็น software engineer ที่ดี จากการสัมภาษณ์ engineer มากประสบการณ์เกือบ 60 คนภายใน Microsoft โดยแบ่งออกเป็น 4 ด้่รใหญ่ ๆ คือ
- Personal: ด้านตัวบุคคล
- Decision making: ด้านการตัดสินใจ
- Teammates: ด้านการทำงานร่วมกับคนอื่น
- 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
คำถามที่น่าสนใจคือว่าตอนนี้เรามีคุณสมบัติตามนี้กี่ข้อ แล้วเราน่าจะต้องพัฒนาจุดไหนกันบ้าง ลองตกตะกอนกับตนเองกันดูนะครับ