Advanced Software Engineering 现代软件工程 讲义
软件工程师的能力评估和职业发展
介绍: 个人软件流程, 职业发展, 个人绩效的衡量和提高, 软件开发是科学, 工程, 手艺, 或是艺术?
我们刚讲了软件工程, 它包括了什么呢?
软件工程包括了开发,运营, 维护软件的过程中有很多技术, 做法, 习惯, 和思想。软件工程把这些相关的技术和过程统一到一个体系中, 叫 “软件开发流程”,软件开发流程的目的是为了提高软件开发, 运营, 维护的效率,以及用户满意度, 可靠性,和软件的可维护性。 |
软件开发流程不光指团队的流程, 软件团队是由个人组成的。在团队的大流程中, 是每一个具体的个人在做开发,测试,用户界面设计,管理,交流等工作。因此, 个人在软件团队中也有个人的流程。
个人的劳动成果有序地组织起来, 就是团队的流程。这里说的“有序”, 并不是“无争论”, 在大部分成功的软件团队模型中, 各个角色(开发, 测试, 项目管理等)考虑问题的出发点是有区别的, 不同意见的冲突在所难免, 一个好的团队流程能把冲突的积极方面 (各自尽力把自己的工作做好,说服别人) 释放出来,而避免消极方面 (因为冲突而产生的消极,抵触情绪等)。
我们用足球作一个比喻: 足球中有没有个人流程? 当然有, 职业球队对于运动员有很严格的要求: 例如:
体能, 技术, 意识, 斗志
具体技术有传接,盘带,射门, 定位球, 跑位, 等。一些特定的角色(守门员)还有独特的技术要求。
足球的团队有没有流程? 当然有:
阵型, 配合, 临场应变
足球队有不少 “阵型” (442, 433, 451和它们的各种变体, 等等) 和打法 (南美,欧洲,技术,力量, 小快灵, 抢逼围, 两翼齐飞, 全攻全守, 等等).
尽管有这么多理论, 足球的每一次盘带, 传球, 跑动, 射门,扑救,都是单个运动员完成的。 如果单个运动员的技术, 体能不行, 无论是什么阵型用处都不大,有些阵型反而会起反作用, 例如, 让体力弱的球队去打全攻全守。
软件也是这样。
软件系统的绝大部分模块都是由个人开发或维护的。在软件工程的术语中, 我们把这些单个的成员叫做 Individual Contributor (IC).
IC 在团队中的流程是怎么样的呢? 我们以开发人员为例:
理解问题或任务
提出多种解决办法并估计工作量
其中包括寻找以前的解决方案,因为很多工作是重复性的 – 例如实现某些类似的web页面。
与相关角色交流解决问题的提案, 决定最终方案
执行, 把想法变成实际中能工作的代码
修复缺陷, 对结果负责
每个人的工作质量直接影响最终软件的质量。
作为一个软件工程师, 你觉得自己表现如何? 有没有这样的体会:
看书的时候觉得“技止此耳”,开发项目的时候才觉得实际情况和书上讲的都有一些出入,一些重要的细节书上没有提。我们很多人是边看asp.net的书, 边开发asp.net 的项目,这相当于一边看医学书一边动手术。。。
如果你是病人, 你希望你的医生是下面的那一种呢?
a) 刚刚在书上看到你的病例, 开刀的过程中非常认真严谨, 时不时还要停下来翻书看看…
b) 富有创新意识, 开刀时突然想到一个新技术, 新的刀法, 然后马上在你身上试验…
c) 已经处理过很多类似的病例, 可以一边给你开刀, 一边和护士聊天说昨天晚上放的 《非诚勿扰》的花絮…
d) 此医生无正式文凭或医院, 但是号称有秘方, 可治百病。
e) 还有这一类, 给你开刀到一半的时候, 出去玩去了, 快下班的时候, 他们匆匆赶回来, 胡搞一气, 给你再缝好, 打了很多麻药,就把你送出了院, 说“治好了”!
事实上, 很多软件项目就是用 a) b) 这样的方法搞出来的。当然也有一些人走 d) 这条路。 e) 这一种可以在很多大学生软件大作业上看到例子。
如果我可以选择, 我要选 c) 那样的医生。
职业成长– Steve McConnell 版本:
Steve McConnell 创立的公司 (Construx Software) 为员工提供了下面的成长路径。
知识:把相关的软件知识分为十大知识领域。
能力:一个工程师对这些知识的掌握分为如下四个阶段:
入门 (Introductory); 熟练 (Competency); 带头人 (Leadership); 大师 (Mastery)
职业成长级别 (Professional Development Ladder):
把工程师分为6个级别 ( 9 – 15) 每一个工程师属于一个技术等级。一个工程师要从一个级别升到另一个级别, 需要在各方面达到一定的要求。例如, 要达到 level12 ,工程师必须在三个知识领域达到“带头人”水平。 例如要到达“工程管理 (知识领域) 的熟练 (能力)”水平,工程师必须要做到以下几点:
· 阅读: 4-6 个经典文献的深入分析和阅读
· 工作经验: 要参与并完成6 个具体的工作
· 课程:要参加3 个专门的课程
有些水平还要求工程师获得某种专业证书,在工业界,教育界教课, 发表论文等等。
职业成长– 大公司版本:
微软公司针对软件工程师的职业发展也有很完备的规划和支持。这方面的资料比较多, 这里简单地以软件开发工程师为例说明一下。 下面的解释部分来自于 Eric Brechner 的书– Hard Code (link)
SDE (初级软件开发工程师)
入门。在学校里学到了一些技能, 但是还没有在实践中得到充分锻炼。
SDE II (中级软件开发工程师)
独立。可以写别人交给你的任何东西。如果你不懂, 你知道去问谁。
Senior SDE (高级软件开发工程师)
小组领导。影响着3 – 12 个工程师, 或者是他们的行政领导; 或者是他们的技术带头人。怎么显示领导力呢? 这有几个例子:
· 你当过新员工的导师么? 他们后来都尊重你的种种教诲么?
· 你是否成为别人的榜样? (写的代码, 做的设计, 别人可以拿来重用)
· 你在招人方面是否有心得, 并言传身教, 让大家都认识到面试的重要性和各种技巧。
· 你是否创立/改进/推动一些流程, 而且这些流程不需要你亲自参与,也能流传下去?
· 在和别的角色 (例如, UX/PM/QA) 打交道的时候, 你往往都能赢得别人的支持, 而不是和别人争执, 抱怨不休?
Principal SDE (首席软件开发工程师)
团队领导。影响着12 人以上的一个大团队, 成为影响团队成败的关键人物。
Partner SDE, Distinguished Engineer, Technical Fellow
影响力扩大到整个机构,甚至工业界。
职业成长– Pragmatic 版本 – 从小工到专家
IT业界的不少专家也对于程序员的成长提出了不少好的建议. 例如:
这本书的副标题是“from journeyman to master”,从打下手的小工到大师。
原创文章,作者:carmelaweatherly,如若转载,请注明出处:https://blog.ytso.com/186407.html