软件工程师的成长
个人能力的衡量与发展
软件系统的绝大部分模块都是由个人开发或者维护的,这些单个的成员叫做Individual Contributor(IC)。
IC在团队中的工作流程如下:
- 通过交流、实验、快速原型等方法,理解问题、需求或任务。
- 提出多种解决方法并估计工作量。(包括寻找以前的方案)
- 与相关角色交流解决问题的提案,确定一个可行的方案。
- 执行,把想法变成实际能工作的代码,同时验证方案的可行性和其他特性(例如程序的效能)。
- 和团队其他角色合作,在测试环境中实现方案,修复缺陷(bug)。如果此方案有严重的问题,就考虑其他方案。
- 发布解决方案后对结果负责。
初级软件工程师的成长
- 积累软件开发相关的知识,提升技术技能,例如编程语言的掌握,诊断/提高效能的技术,对设备驱动程序、内核调试器、开发平台的掌握。
- 积累问题领域的知识和经验。
- 对通用的软件设计思想和软件工程思想的理解。
- 提升职业技能,例如自我管理的能力、表达和交流的能力、与人合作的能力、按质按量完成任务的执行力。
- 实际成果
团队对个人的期望
- 交流。
- 说到做到。
- 接受团队赋予的角色并按要求完成工作。
- 全力投入团队的活动。
- 按照团队流程的要求工作。
- 在各项任务前做好准备工作。
- 理性地工作。
思维误区
- 分析麻痹。想弄清所有的细节、所有的依赖关系之后再动手,心理上过于悲观,不想修复问题,出了问题都赖在相关问题上。
- 不分主次、想解决所有依赖问题。想马上动手修复所有的主要和次要依赖问题。
- 过早优化。陷入局部问题,花费大量时间进行优化。“过早优化是一切罪恶的根源”。
- 过早扩大化/泛化。在我看来其实和“过早优化”属于同一个方面,即陷入局部问题,浪费过多时间。
技能的反面
巴克斯顿(Bill Buxton)说的技能的反面是解决(低层次)问题(Problem Solving)。要将提高技能,就要通过不断地练习,把低层次的问题都解决了,变成不用经过大脑的自动操作,然后才有时间和脑力来解决较高层次的问题。
注意在学习的时候,要确保自己学习的内容适合自己当前的状况,避免进入学习恐慌区,出现拖延症的现象。
感想
这一章给我的感觉就是很真实,很多地方都有切身的体会,比如“过早优化”,陷入技能的反面——解决问题中这些,不只是在编程中,在生活的方方面面都有类似的问题。引以为诫。