做软件,除了编程还有什么呀?
请不要紧张,这并不是一个数学问题。
但是却很值得深思。
我们犯下了很多错误,就是因为没有想明白这个问题。
我们自以为是,结果总是捉襟见肘,也是因为小看了这个问题。
我们效率低下,沟通困难,还是因为忽略了这个问题。
真的这么重要吗?
是的,且听我慢慢道来。
不能有效解决问题的软件不是好软件
你可能遇到过这种情况。
你想下载一个编辑器,结果广告太多,居然下载了一个播放器。
那么,你是凑合用呢,还是继续找编辑器呢?
很显然,播放器是不能做编辑的。你需要的是一个可用的编辑器。
那么是因为播放器的代码写的不好吗?
谁还管这个呀。
这道理大家都明白。
所以,你在给客户的说软件功能的时候,敷衍是没有任何作用的。
客户需要一个编辑器,你说你的软件能解码各种格式的视频也是没有用的。
因此,解决客户的问题,才是软件得以存在的原因,软件才能实现价值。
确定客户想解决什么问题,是编码之外的事情。
而且弄错了就会导致整个软件项目南辕北辙。
确定客户问题的过程叫做需求分析。
客户是想要一匹更快的马,还是想行动更快捷。决定了你是去找千里马,还是要发明汽车。
不重视需求的项目团队,会遭遇无休止的返工。
直到某一天撞大运,碰巧满足了客户的需求为止。
需求在变化,软件在演化
软件,就像一只小动物一样,它是活的。
只要软件还在被人使用,它就在不断的演化。
因此,我们不要对一切相关的事物的意外变化感到惊讶。
甚至,我们会主动促进这种演化。
我们要持续交付,加速运转。
反馈是进化的源泉。
最近刮来一阵很酷的龙卷风,叫做敏捷开发。
其中就有这种思想。
如果说软件是一个产品,那么编码只是产品的生产环节
正如生产在工厂中的地位一样。
与生产相关的产品设计,产线控制,质量管理,甚至产品说明书,都是不可缺少的。
产品设计相当于架构设计和程序设计。
好的设计产生好的产品。
不幸的是,软件在演化过程中,这些设计难以保持不变。
而幸运的是,我们提前知道了这些。
所以,一开始就要面向变化进行设计。
软件不是组装起来的,而是逐渐丰富起来的。
因此,产线控制就是要控制软件每时每刻的发展情况。
这叫做版本控制。
你能拿到任何时刻的软件版本,降低了调整和修复的成本。
代码质量这是一个很大的话题,后面再说吧。
再就是产品说明书了,简称文档。
这是最容易被人忽略的。
我们看到字典也没有说明书,但并不会感到奇怪。
可能是因为字典是文字,说明书也是文字吧。
代码是文字,就很难想到给它写文字的说明书了。
我们会想,需要看说明的话,读源代码不行吗?
然而,软件的使用者是不会去读源代码的。
或者说,读源代码并不会实现软件的价值。
因此,没有说明书的产品是不友好的,甚至可以说是功能不全的。
并且,没准哪天,你还可能吃自己的狗粮呀。
不直接用二进制进行编码,而是用编程语言,就是要促使你写出人能读懂的代码
对于发展中的事物,就要用发展的眼光看待。
如果你没办法预测未来,那就尽量避免假设。
例如,不要假设你的代码只有你自己阅读。
想象下一个读你代码的人,脾气暴躁,体壮如牛。
例如,不要假设只有人会去读你的代码。
想象各种分析工具在你的代码上踱来踱去。
发展中的东西控制质量和品质很困难,一不小心,就越来越烂。
怎样才能控制熵增呢?
或者说,怎样才能保持代码的优雅呢?
那就要及时调整,持续重构。
为了保持干净,要经常打扫房间。
不要总是让别人替你打扫。
另一方面,同时让更多的人保持安静,是很困难的。
软件项目也是一样,让更多的人代码风格一致,也是很困难的。
所以,要想改善代码质量,就要限制团队的规模。
给编码设置权限,划分功能,每个功能只让部分人参与编码。
参与的人越少,就越有希望减小噪音。
如果有人不文明,随地大小便。
那就别留情面,把它赶出去。
就如同它在你家卧室方便一样。
你容易低估软件的成本,因为你觉得软件无非就是编程而已
通过上面的分析,编程相对于软件,真是小巫见大巫了。
这就要求我们计算软件成本时,不要只考虑到编码的成本。
否则,你就是在执行一项不可能完成的任务。
如果人们一直在埋头编码,无暇顾及其他时,那就有问题了。
将要大祸临头了。
因为很多该做的重要事情一定没有人在做。
程序员的价值,体现在他能做出多好的软件,而不是他能写多少坨代码。
更多的代码意味着阅读和维护成本更高。
代码产量少的程序员,不一定是能力差的程序员。
沟通也是需要成本的,不是免费的午餐。
多一个人,他就要和其余每个人进行沟通。
向一个进度落后的项目中添加人手,只会使项目更落后,就是这个道理。
控制软件项目成本就像摆放多米诺骨牌一样不稳定。
任何一个环节出错,都会毁掉它。
结语
以上这些讨论,也并不全面。
把所有这些提到的和未提到的汇总起来,就构成了软件工程。
即使你会写代码,也不一定懂得写软件。
软件项目之所以步履维艰,就是总有一些人自以为是。
害人害己。
不过,也没事。
孔子云,人不知而不愠,不亦君子乎。
如果说软件项目有最佳实践的话。
那就是尊重那些具有工程思想的人吧。
因为说到底,产品的竞争,最终还是人的竞争。