当前位置: 首页 > 代码艺术, 工程能力 > 正文

软件工程能力之思:工程能力实践

在上一篇文章《软件工程能力之思:工程能力漫谈》 中,笔者介绍了什么是工程师思维,以及讲到工程师应该具备的工程能力的定义。本篇文章将结合章淼老师在QCon2021上的技术分享,淡淡工程能力在日常开发实现中,需要关注的9条核心实践总结。

 

一、质量第一

在当前几乎所有中国互联网企业都996.ICU加班的情况下,普遍的现象是大家在资源和时间都双重受限的情况下,会考虑降低工程的质量以期快速上线交付。那如果我们把工程的质量放在首位考虑的话,会是什么个思维理念呢?

在《软件开发的201个原则》书中,第一原则就是“质量第一”:

无论如何的定义质量,客户都不会容忍低质量的产品。质量必须量化,并建立可实施落地的机制,以促进和激励质量目标的达成。既是质量差、也按时交付产品,这似乎是在政治正确的行为,但这是短视的。从中长期来看,这样做是自杀。质量必须放在首位,没有可权衡的余地。Edward Yourdon建议,当你被要求加快测试、忽视剩余的少量bug、这设计或需求达成一致前就开始编码时,直接说“不”。

要做到质量第一,我们需要在脑海中明确根据场景和需求定义质量要求。在实际的开发过程中,不能“只立规矩不执行”。需要通过相关的流程、规范对质量绝不妥协,需要深刻地意识到:低质量不仅影响用户体验,而且影响软件价值,增加整体的研发成本。作为一个有经验的工程师需要平衡质量和交付时间的关系,依靠提高技术水平来高效率、低成本、系统性的保证质量。

 

二、实现软件价值的持续交付

前面我们讲过,软件研发的目的是提供价值。本条将深化这一理念:工程化的目标是价值的持续交付。所以,作为工程师,我们需要提升认知:软件的研发和维护是一个长周期的,需要综合考虑全生命周期内的研发成本,长期维护、长期服务以及持续的迭代改进优化。常见的现象是,在项目开发的前期(如需求阶段和设计阶段),经常会放松要求、投入不足,导致后期维护出现难以维护的问题,甚至经常出现“祖传代码修改一个bug引起多个bug”。

从开发者来看,持续交付的一个关键要求就是,确保软件能够健康迭代。除了我们的各种需求文档、设计文档、接口文档、测试文档、使用文档等都需要做到让其他人容易看懂外,我们开发出来的代码也必须能够让人看得懂,这样才能够做到“可维护”。在《软件开发的201个原则》中也讲到“程序首先是写给人看的”(详见原则92)。笔者作为快5年的开发工程师也是深信不疑:代码是写给人看的,不是给机器看的。

 

三、使用系统化和科学的方法

软件工程是一项系统工程,它是一个非常专业的方向,需要有扎实的计算机理论基础,让能保证这项工程稳健可靠。就如同基建中的基础设施一样,工程的效率取决于软件复用能力的支持快速迭代以及科学的工程方法。能否使用科学的方法,效率可能相差十倍、百倍。我们常说的10x程序员,就是他们在日常工作中,讲究使用科学的方法,不断反思总结,并不断优化自己的思维方法,提升工作效率。

那如何系统化、科学的工作,这其实就是方法论的问题了。好在在这个信息爆炸的时代,找到方法论真的“太简单了”,我们可以通过一些书籍、在线公开课、在线专栏课程等方式提升自己的计算机专业素养能力。这里推荐下“极客时间”APP,里面有非常做不错的计算机技术的专栏课程,如《许式伟的架构课》、《左耳听风》、《技术领导力实战笔记》、《10x程序员工作法》等等。

 

四、持续提升研发效率

效率似乎是一个永恒的话题。作为老板尤其如此,但是在员工看来,这个问题却存在着两集分化。一部分员工是比较排斥的,他们认为效率就是压榨,迫使员工在单位时间做出更多的产出,他们多大是工作了很多年的中老“油条”。而另一部分员工则是积极的,他们拥有技术情怀,揣怀报复,并不断要求自己,提升自己的工作效率,做出更多激动人心的东西,并为此激动不以,他们大多是一些精神饱满、渴望技术实现自我价值的年轻人。

作为开发工程师,我们日常工作中的现象是,对于业务目标非常关注,而对于软件研发能力的提升关注十分的不足。这样做,是非常没有成长的,甚至时间久了,就只剩下业务开发能力,对于新技术、新架构、新语言都缺乏跟进学习并为我所用的能力。

所以,要想成为一个用技术情怀的工程师,我们要从自身的角度思考出发,提升效率、提升人效永远是软件研发要追求的目标。要成在当前,看眼未来,今天的方法是不是最好的,明年会有哪些变化,会不会还有更高效的方法。

 

五、工程能力的素质要求

在《百度软件工程能力定义》中,将工程能力的素质要求分为三个层次,即公司能力素质、团队能力素质和个人能力素质。公司能力素质包括规范和指南、工具、平台、开源协作、知识管理和能力资源机制。团队能力素质包括研发过程管理、研发效率、成本意识和教育培养。个人能力素质包括需求把握、系统设计、编码能力、项目管理、运维能力、产品意识、客户服务意识、安全意识、质量意识和沟通能力。

那么,提升工程能力,应该从我做起,做到自我驱动。对于优秀的人,从来不是靠考核来驱动的,他们对待工作都是积极乐观的态度:我会做到更好,我希望把这个工作、性能加以提升/改善。对于素质要求上,我们除了需要有需求把握、系统设计、编码能力、项目管理和运维能力等必备技能外,还需要在认识和观念上,把产品意识、客户服务意识、安全意识、质量意识和沟通协意识作等意识放到自己日常的开发中。

 

六、人是工程能力的根本

上面讲到“代码是写给人看的”,要想作为一个优秀的工程师,还有很多其他的能力要求,但无论如何,人一定是工程能力的根本之所在。这一点,笔者也算是深有体会。在创业早期阶段,其他很难招到合适的人才。光靠几个甚至是单单一个优秀的工程师很难将一个产品做好。普通的工程师在业务理解、思维认识和工程开发中还是存在一些不足。

我们经常听到的声音是,优化xxx工具。其实人的作用要大于工具,试想一下,问什么用同样的工具,你的人效却不及别人的1/N呢?同样的,优秀的人+一般的工具要远远强于普通的人+优秀的工具,几个优秀的工程师团队也远远强于大规模一般工程师团队。而且,优秀工程师不仅能做好开发质量,而且会创造伟大的系统和工具,培养更多优秀的人,进而提升产品能力和业务价值。

 

七、重视项目文档

有些人认为,些文档是在浪费时间,没有时间写文档,就算写了也不一定有人看,还不如直接看代码来得实在等等。其实这是个错误的观点。文档本身也是产出,coding的时间一般少于30%(其实有一半时间用在了项目沟通中,所以提升沟通的效率十分必要);写文档是一个整体自己思路的过程(打字速度应该快于思考的速度)。所以,工程师对文档的认识应该意识到:文档除了能提高沟通的效率还能提升对“思考过程”的管理。

这里借用《软件开发的201个原则》中第64条原则:“没有文档的设计就不是设计”说明下文档的作用:

我经常听到软件工程师说,“我已经完成了设计,剩下的就是写文档”。这种想法毫无道理。你能想象一个建筑设计师说,“我已经完成了你新家的设计,剩下的就是把它画出来”,或者一个小说家说,“我已经完成了这部小说,剩下的就是把它写下来”?设计,是在纸或其他媒介上,对恰当的体系结构和算法的选择、抽象和记录。

 

八、重视需求分析

有些开发者并不喜欢需求分析,他们认为那是产品经理的职责。其实并不是这样的,笔者一直认为,一个好的开发者可以当半个产品经理。其实在一些非常崇尚工程师文化的国外公司中,他们早期甚至是公司中期都是没有产品经理这一角色的。比如google、facebook等,他们优秀的工程师自身就具有非常不错的技术产品设计理念,加上他们富有创意的技术创新,常常能够做出让人眼前一亮的产品。讲这些只是想说明,其实工程师本就应该具有理解需求的能力。

笔者自己更喜欢用“理解业务”来表述这一点。这里的“业务”即需求,而“理解”二字就是分析能力。产品或者说需求是展示给客户的在外结果展示,而用工程师内部话讲,其实就是将需求转发为“业务”。这里插个题外话,笔者一直在思考“技术”、“业务”和“产品”这三者之间的关系。业务其实是桥梁,它连接着技术和产品。业务的理解能力就是对需求的分析能力。当一个项目交给你后,首先应该分析拆解需求。核心的需求是什么?需求的价值是什么?需求的受众用户是谁?需求的优先级和重要程度如何?

 

九、重视项目管理

技术管理一直是研发效能茶前饭后的必谈话题。笔者认为所谓的项目管理应该是“两面一体”的:一个面是团队的管理,即对人的管理;另一面是对技术本身的管理;而“一体”指的是一体化管理,即将“人”和“事”落实到“流程”中去管理。

在日常的项目开发实践中,项目管理的重要性往往被严重低估。多数工程师认为写好代码,搞好技术就行了,而且他们觉得自己不是leader或经理,何必多花费那边多精力做项目管理呢?其实我们每一个工程师都是管理者,至少是自己的管理者。而只有具备良好的项目管理能力才能团结整个team做出可靠、稳定的好产品。

这里在此借用《软件开发的201个原则》中对于项目管理的原则,原则127:“好的管理比好的技术更重要”:

好的管理能够激励人们做到最好。糟糕的管理会打击人们的积极性。所以伟大的技术(CASE工具、技术、计算机、文字处理器等)都弥补不了拙劣的管理。好的管理,即使是在资源匮乏的情况下,也能产生巨大的效果。成功的软件初创公司,不是因为他们有强大的流程或者强大的工具(或与此相关的优秀产品)而成功。大多数的成功都是源于成功的管理和出色的市场营销。

 

笔者在学习、了解工程能力相关的技能中,发现百度公司无疑是把工程能力做到最好的国内互联网公司之一。其内部内制定了多份工程标准和规范。这里列举一些以供后期学习参考之用:

百度工程能力的提升之道:https://www.infoq.cn/article/zpd74espqrmgy*g6p7yv

研发效能度量核心方法与实践:https://www.infoq.cn/article/kxcdj0gmee4csv05xvnq

技术培训《代码的艺术》:http://bit.baidu.com/productsBuy?id=26

章淼老师QCon技术分享:https://mp.weixin.qq.com/s/hJS5LJRZkMZmHm6g2R_jpw

章淼老师翻译书籍(更新):《软件开发中的201个原则》

《百度方法+》:白皮书



这篇博文由 s0nnet 于2021年06月07日发表在 代码艺术, 工程能力 分类下, 通告目前不可用,你可以至底部留下评论。
如无特别说明,计算机技术分享发表的文章均为原创,欢迎大家转载,转载请注明: 软件工程能力之思:工程能力实践 | 计算机技术分享
关键字: ,

软件工程能力之思:工程能力实践:等您坐沙发呢!

发表评论

快捷键:Ctrl+Enter