软件工程的实际困境
我在软件设计外包行业工作了几年,经常遇到需要和外行人合作的情况。这种外行人主导的事情对于工程师来说是非常痛苦的。 2013年左右,我和一位高级工程师合作了一个电子商务项目。甲方客户要求我们尽快上线新功能。看了需求,做了代码分析,我们俩都怀疑自己学的是“软件工程”。理解代码、做二次开发已经消耗了大量的时间,我们根本没有时间去添加新的功能。所以,每当遇到这种急于上线、做二次开发的项目,我都会拒绝。
在我看来,甲方和技术方的项目合作更像是一场游戏,一场拔河。大家都有一个共同的目标,就是项目顺利交付,但甲方的交付期望和付款能力却有很大差异。技术方的交付结果和交付质量需要考察,大家都差不多。甲方担保人的父亲不听劝告是一个通病。从规划之初,不断添加功能,从原型规划到UI再到交互,灵感一路迸发,最后的结局总是无法修复的Bug。软件开发团队“无条件”接受了甲方的需求,从头开始加班加点地添加新功能。然而,几个月后,速度放缓了。他们把所有的时间都花在修复错误上,而没有精力添加新功能。这是软件开发的特定规律。
这种困境其实源于外行人的误解。他们认为编程是一门自学成才的手艺,因此开发软件是小菜一碟。编程确实很适合自学,但仅限于“小”软件,比如写一个客户端或者视频播放工具,就像你可以请装修工人做一个脸盆或者水槽一样。自学确实可以成为一名优秀的剑客,但要真正掌握一项大工程,不仅仅是成为一名剑客,而是成为一名将军。想要成为一名将军,必须是“一将令万骨枯”,只有用千万将士的鲜血才能锻造出来。区别在于项目的规模。 “大”必然有所不同。
从另一个角度来看,外行人的误解也可能很大程度上与“码农”本身的特点有关。这个群体通常处于幕后,很少发声。即使说出来了,也很难用通俗易懂的语言清晰地传达给公众。 。 “编码员”群体不是科学家。他们不会发现有趣的模式并发表论文来获得名誉和财富。他们要确保自己的作品有用、安全,同时还要考虑成本和可行性。爱因斯坦在谈到科学定律时说:“一切都必须尽可能简单,直到不能再简单为止”。程序员的座右铭应该是“细节决定成败”。在软件开发中犯一些细微的错误可能会带来非常糟糕的结果。从一开始一个小小的int类型错误就可能导致整个系统崩溃。例如,当波音公司今年停飞其 737 Max 时,该软件本应控制飞机的运动。如果出了什么问题,飞机就会坠毁在地上!问题在于,波音 737 MAX 机型上的迎角读数发散警报并未在所有波音 MAX 机型上激活,但波音“并没有故意将其关闭”。后来又发现了更多的软件问题。波音 737 Max 机型已被禁止飞行,没有人再购买它。赔偿问题也是一个大问题。因此,软件不仅仅是一个项目,而且比传统项目要困难得多。工作一旦仓促,十之八九都会有不好的结局。
大到波音公司,小到定制一款软件的外包客户,都面临着“压缩工期”、“压缩成本”、“赶着上线”等仓促问题。这就是软件工程的实际困境。
落井下石,行业乱象
从历史来看,软件行业从一开始就是一个不好的行业。项目总是一拖再拖,软件最终交付后,总是会出现各种问题和错误。这样的“缘分”,也导致了一群喜欢自嘲的“码农”。以操作系统为例。使用一段时间后重新安装系统对于每个人来说都是一种痛苦的经历。客户的不满是不可避免的,因为根本没有售后服务,而且时时刻刻都有大量的黑客和计算机病毒的攻击。真的是一件很无忧无虑的事情。
从各种开发方法论来看,软件行业也是一个非常麻烦的行业。例如,大家熟悉的几种软件开发方法包括敏捷开发( )、极限编程( )、TDD(Test)测试驱动开发等。更糟糕的开发方法包括由什么都不懂的混蛋驱动的项目开发,以及晋升驱动的开发,即工程师只做那些高度可见且易于晋升的工作。这种软件开发方法论在大公司中很常见。简历驱动开发善于在项目中使用最新、最酷、最炫的不成熟技术,这样你就可以在简历中多添加几个很酷的关键词。只要这个人走了,后继无人,他就只能重新发展了。另一种是由KPI制度引起的,可称为隐蔽式开发。当软件出现问题时,不要让别人发现问题是我的代码造成的。在开发过程中,一定要注意如何掩盖自己的无能。还有一种称为“God Only”的方法,它决定了开发过程。无论兼容性、用户规模,任何问题都是开发者的问题。
无拘无束的匆忙是软件项目最大的敌人
根据最近的一项调查,大约 94% 的软件项目已经从头开始多次重新开发。虽然这个数字很吓人,但是和我多年的行业经验是一致的。大多数项目都会因新设计、新技术或新架构而被重建。重构也成为软件开发行业项目管理、演进和创新的手段。大多数项目在不断升级的过程中都会经历一次又一次的重构。这是行业内非常普遍的现象。
项目持续重建最重要的原因就是一个“快”字。软件行业发展到今天,快速上线是最重要的,尽快服务客户是最重要的,尽快添加新功能是最重要的,尽快修复bug是最重要的最重要的是,我们正在一场竞赛中,争取领先并跑得快。梯队是最重要的。为了更快,就需要设置更短的时间,更智能、更高效地工作,增加更多的人员或者增加班次。大家都知道,匆忙并不会让项目变得更快或更高效。这只会让项目开发人员和设计人员更加紧张、分心、效率低下。最终造成工程质量不稳定、脆弱。
从某种角度来看,任何试图仓促完成开发的行为都会消耗开发人员大量的情感和精力,最终导致项目效率低下、软件兼容性差。我们经常遇到一类具有“窥视效应”的客户。一旦目标是完成开发并上线,他们就没有时间和精力花在测试上。测试似乎不是开发的一部分。这种项目进度最终会导致大量时间花费在修复错误和破解代码上。
这与《稀缺》一书中提到的贫困陷阱类似。穷人的财富和资源都消耗在眼前,没有闲钱投资;穷人的时间和精力都花在短期利益上,他们没有闲暇时间投资于自身的增长。即使他们有空,也只享受当下,习惯性透支未来的资源。根本就没有长远的规划。这种“稀缺”危害也会出现在软件开发团队中。开发任务繁重,总是要做出权衡,这会导致认知下降、带宽不足、决策错误。不会有时间和精力去投资软件质量和开发效率。优越的。专注于解决眼前紧急的事情,而忽略真正重要的事情。这种偷看效应一旦形成,从长远来看,团队会造成人才流失,把优秀的开发人员赶走,开发效率会越来越低。
弗雷德里克·布鲁克斯(Fred)是一位计算机思想家,他于 20 世纪 60 年代末在 IBM 带领 300 人的团队开发操作系统,完成工作后写了一本名为《人月神话》的书,提出了两个感慨:
第一个感触是,一个人12个月做的事情,绝对不是12个人一个月能做的事情。项目使用的程序员越多,平均每个人完成工作的速度就越慢。因此,实际上没有办法规划“人/月”。但销售在为客户做计划时,却要把具体的“人/天”写清楚。这个矛盾很难调和。
第二个感受是,一个团队生产的软件的结构往往与你团队的人员组织和管理结构高度相似。因此,软件工程不仅需要管理项目,还需要管理人。因此,去年面临的隐私危机很大程度上是由于长期的网络管理造成的。
布鲁克斯的书问世后,人们充分认识到软件工程的难度。现代软件工程要求软件产品必须实现以下五个目标,称为“”——

、值得信赖,让客户真正可以信赖你的软件;
,必须可靠,永远不会出问题;
、软件是给人用的,必须能够上手;
安全,使用时不会发生安全事故;
,它一定不能轻易被黑客攻击。
最成熟的现代主流操作系统,包括Mac和Mac,每个都有近1亿行代码。虽然他们已经大致达到了这五个要求,但是其中仍然存在很多Bug,需要频繁的升级和修复。而且,这三大操作系统都是经过前几代几十年的失败和错误积累起来的。它们不是一朝一夕就能实现的,也不是一两次行政命令就能产生的。一旦有外人介入,工程就会更加困难。不可能顺利生产。一方面是经验积累不够,另一方面还有外界的介入。任何可能萌芽操作系统的种子都可能在萌芽阶段被扼杀,没有任何机会进化成操作系统。这就是为什么我们国家从来没有开发出自己的操作系统。最重要的原因是操作系统。
因此,想要让一个涉及多人的工程项目稳定运行,首先要放慢开发进程,约束需求“越走越远”。
如何减慢并优化开发流程
磨刀不砍柴,第一步是找专业、专注的人,第二步是放慢进度,让业务需求和开发团队完成有效的磨合,掌握合适的开发节奏,最终限制产品需求的增长并很好地平衡。业务需求与工程开发的冲突,提高了模块的自动化程度和产品的兼容性。
开发过程和开发工具都不会使项目运行起来。核心关键是人。 1987年,布鲁克斯写了一篇名为《No 》的文章。软件工程的根本问题是人的问题。招聘最有才华的人是最关键的事情。我们不刻意招募最聪明或最有经验的人,而是寻找那些有激情、懂规划、有能力行动的人。自负的人绝对不能让这样的人留在团队中,因为他们极具破坏性。此外,让整个开发团队尽可能地一起工作。不允许个人英雄主义和独狼式的开发者。要善于让集体贡献责任和成果。 “是,但是是”。尤其是在项目的早期阶段,一定要留出足够的时间来细化计划,至少争取每周收集反馈并调整计划。无论团队多么专业,都很难保证所有前期计划都能得到彻底落实。该计划很可能不会被严格执行。计划的目的是为了应对各种变化并经常修改。而不是静态的。
二是明确短期目标和长期战略。设定短期目标,以便项目成员能够更好地专注于完成关键任务。尤其是在外包合作的过程中,不要凭直觉做出决策,否则整个项目开发团队都会感到困惑,无法理解一个陌生业务的复杂性。
改善不同人之间的协作流程需要时间。参与项目的人越多,就必须花费更多的成本来使团队合作顺利。否则,项目延误的风险只会增加。虽然,多年来的技术进步可以解决某些问题,例如可视化控制和数据流、更好的操作系统、更好用的编辑器等。但是,技术进步和升级也带来了新的问题。编写程序总是在更新技术。
最后,考虑及时响应市场需求。这些冲突的累积效应是,领导软件开发的人必须能够理解高度复杂的事物。这样的人才绝对是帅气的。积极的软件工程就像带兵打仗。最起码能把人安全地带到战场上,不逃跑,不叛变,不闹事,而且吃得饱。
最后,你得到你所付出的代价。别指望花钱吃麦当劳的同时还能享受丽思卡尔顿酒店的五星级服务。
安迪
鲁微科技创始人兼CEO