- UID
- 824598
|
前几天做过一个小调查,问觉得“软件靠吃年轻饭”的有多少,结果近80%的人举起了手。多数人觉得软件靠吃年轻饭,是因为觉得做软件就是埋头写代码、通宵写代码、玩命写代码,靠的是年轻的拼劲和体力。
先让大家看个行业数据:在软件行业里,产业化团队的生产率只有1000代码行/年,当然这是以人为单位。许多在校大学生光作业和考试写过的代码,早就超过1000代码行/年的速率,就我前阵子提过的那个一小时完成的小项目,也有近200的代码行,按这个数量级看来,1000代码行不过是一天的工作量。
大家不用吃惊或怀疑,上面的数据是真实的情况(见《人月神话》)。为什么会有这么大的反差?因为我们说的是程序,而人家说的是软件,这得看看我们平日的工作和软件行业的真实产出有哪些差距。
我们学生平日所做的,叫程序,它本身是完整的,可以由作者在所开发的系统平台上运行。但那样的东西还未能达到实用化、商业化、产业化的高度,还有两种途径可以使程序转变成更有用的、但成本更高的产物。
一种是将程序变成编程产品,这是可以被任何人运行、测试、修复和扩展的程序。它可以在多种操作系统平台上运行,供多套数据使用。这就要求程序必须按照普遍认可的风格来编写,特别是输入的范围和形式应广泛适用于各种合理的基本算法;接着还得对程序进行彻底的测试,确保它的健壮性和可靠性,这意味着必须准备、运行和记录详尽的测试用例库(绝大多数学生编程时都未考虑到测试的因素),用来检测输入的边值和范围;最后还要完备的文档,以便每个人可以使用、修复和扩展(见过不少学生写程序连注释都未能做好,这里面也包括我)。
另一种是将程序变成编程系统中的一个构件单元。要求它是在功能上能相互协作、具有规范的格式、可以进行交互的程序集合,并可以用来组装和搭建整个系统。这就要求程序符合一定的要求编制,使输入和输出在语法语义上与精确定义的接口一致,同时程序还应符合原先设定的资源限制——内存空间、输入输出设备、计算机时间等。最后,还是测试的问题,即程序须和其他构件单元一道,以任何能想象到的组合进行测试,且测试用例会随着组合不断增加,范围愈加广泛,而且一些意想不到的交互会产生许多不易察觉的BUG,测试工作会是一个非常耗时的环节。
而事实上,软件产业真正需要的产出,是以上两种的结合体,即编程系统产品,经验数据表明,这样结果的成本是起初程序的9倍,然而只有它才是真正有用的产品,也是大多数系统开发、项目研发的目标。
前一篇日志里写说中国当代大学生普遍不符合社会的需求,就软件业来看,学校里做的,只是最低层次——即程序的实现,甚至连程序实现的要求都远未及社会企业的实际要求。因为在大家眼里,很少能见到哪一本教科书、哪一个教师或是哪一场考试会做出以下这些要求:
- 单一功能子函数代码不得超过50行、形参个数不得超过7个、程序嵌套深度不得超过7层;
- 圈复杂度必须在15以内,对程序的修改或扩展不得增加其原有圈复杂度;
- 代码未写,文档先行,注释必须按照固定统一范式撰写;
- 各类编程风格规范:关系运算必须常量在左、变量在右,不许使用复杂的运算表达式,必要时添加括号而不依赖于优先级,魔鬼数字需用宏定义替代等等;
- 局部变量必须初定义、避免不必要的内存操作、内存操作必须考虑异常处理;
……
可以列出的要求条目还有好多,而这些,还仅是新员工入职前要记住和注意的内容罢了,在工作过程中还有功能重量评估、测试用例编写(不仅限于测试人员,研发人员也需做自己的测试用例)、循环迭代敏捷开发等等,各种学校里接触不到的要求和环节,这在公司里仅是家常便饭。
- 只有在中国,才能听到“软件靠吃年轻饭”的论断,而且说得最多的不是行业的专家,而是不明真相的学生和外行人
上面从软件行业产出的角度,表明了编代码写程序只是软件行业里最底层最基础的工作。从性质来看,软件其实就是利用计算机模拟人的计算与逻辑能力,从而以各种形式快速得到和展示思维的结果。所有软件活动都包括一根本任务——打造构成抽象软件实体的复杂概念结构,和一次要任务——使用编程语言表达这些抽象实体,在空间和时间限制内将它们映射成机器语言。
前一篇日志也提过,完整的软件设计是要经历需求分析、系统设计、编码实现三个步骤,对应的职位分别是系统分析师、软件架构师和程序员。把软件设计比作打仗,程序员就像小兵,实现的是软件中的次要任务,而根本任务的实现,就掌握在系统分析师、软件架构师、项目经理这些元帅和将军的手里。
系统分析师、软件架构师、项目经理这些都是程序员的高阶形态,或都归类于软件工程师,正如元帅和将军都先要经过小兵这一过程一样,而这一过程的转变,并非朝夕可达的。中国最缺的,就是有10年以上工作经验的软件工程师。金山软件董事长雷军(其投资的还有凡客、多玩、UCWEB、小米)曾说过:“在印度,包括在美国,我见到的项目经理都是三四十岁的人,他们‘越老越值钱’,有些人甚至拥有超过20年的行业经验。”事实上,做软件和做硬件的一样,都是越老越值钱,当然这里指的是程序员的高阶形态,而非程序员。
只是,不见得每个小兵都能往上发展,因为打仗这东西,光靠点手脚功夫是不够的,正如程序员埋头学习新的开发工具、钻研程序代码,一边挥洒汗水、熬夜写代码,一边又对自己30岁以后的职业方向充满恐慌,却不知逐步提升自己的视野、思维和经验。
前一篇日志也论述过管理和心理知识对研发人员的重要性,其对软件从业人员的作用更加明显,这是软件根本任务所决定的,也是解决软件固有属性困难——复杂性、一致性、变化性和不可见性时,所需具备的角度和能力。做软件的愈往上走,对从业人员的综合素质要求就愈高,这也才有了“越老越值钱”的说法。
前阵子,听朋友说做应用层的软件没前途,因为技术门槛低,没能把握住核心竞争力,可后来想想,不是没有竞争力,只是应用层软件是面向客户需求的,其核心竞争力不在于技术的实现,而在于需求的分析与心理的把握。
举两个简单例子,像近年来大热的小游戏——植物大战僵尸和愤怒的小鸟,二者的市场价值早已突破10亿美元关口。单从技术角度而言,其实现并非难事,但稍微有点心理学知识基础的会发现,二者有一明显的共同特点,即利用对比的手法,将两种不具关系的事物通过某种方式强制关联起来(植物和僵尸,小鸟和绿猪),游戏模式中还涉及到不同层次的动机与能力塑造,进一步加深玩家的喜好、甚至狂热程度。这两个游戏的成功,依靠的不是技术的优势,而是对心理知识的把握与运用,而这样的思维与成就,单靠写写代码、用用工具是达不到的。
软件的魅力在于它的创造性、不重复性和纯粹思维活动,但其困难也是随之产生的追求完美的必要性、由他人设定目标和思维逻辑的复杂性,这些问题的解决方法不单一依存于某本具体的书中,而是涉及管理、心理、逻辑、哲学等多方面的知识,恰巧中国教育方式将软件和这类知识分在了对立的两块中,也难怪会有中国软件业的这种囧态。
其实上述这些,许多企业和专家、从业人员都已意识到(像华为软件培训里相当一部分时间就是在进行管理类的培训),用百度或谷歌一搜“软件靠吃年轻饭”这句话,出来的基本都是否定的论断。这样的言论,流传得最多的便是学生和外行人,外行人就不提了,但学生是行业未来的人员,持有这样道听途说得来的观点,中国软件行业能不陷入恶性循环么?
只是也应该说,这是正常的事。人在不确定的时候总是倾向于相信周围人的意见,学校里的知识给不了更高更广的视野,学生们不清楚不了解,也难怪会听风就是雨。 |
|