
昨天被任正非的那封《全面提升软件工程能力与实践打造可信的高质量产品》的公开信刷屏了作为一个软件工程专业科班出身的软件开发从业者自然是引起了我宝玉xp的好奇仔细阅读之下确实让我大吃一惊看似八股官方文但细看之下是作者对于软件工程的理解确实非常深刻各种专业术语信手拈来比喻恰到好处。我对华为的研发其实一直挺好奇的从传统的硬件公司到现在软硬件齐头并进华为手机销量都已经超过了苹果可见华为的软硬件研发实力早已是全球领先了。信中的这一句二十年前的IPD变革重构了我们的研发模式实现了从依赖个人、偶然性推出成功产品到制度化、持续地推出高质量产品的转变。也揭示了华为的软件研发能做到领先水平的原因。华为是在1999年开始从IBM引进IPD的到今年2019年正好20年在过去的20年里IPD帮助华为从游击队变成了正规军研发队伍从几千人到几万人软件产品也覆盖到手机操作系统、应用、云服务。我对IPD是不甚了解的只知道IPDIntegrated Product Development集成产品开发是一种产品开发方法但如果说软件产品的开发方法我是比较熟悉的那就是软件工程么任正非发出的这封信的大背景也很特殊2018年中美贸易战开始中兴、华为首当其冲成为美国开刀的对象跟风站队的澳大利亚、新西兰、英国也跳出来抵制华为说华为不安全可能含有间谍软件窃听国家机密这帽子一扣是很难扯清的这就是为什么整封信从标题开始一共17次提到两个关键字“可信”。只有让客户觉得华为的产品“可信”华为才能尽快走出这场危机那么怎么才能做到可信如果你是餐厅老板有人造谣你的厨房脏乱差员工上完厕所不洗手你怎么办最好的办法自然是用先进的管理流程并且让整个做菜的过程尽可能公开透明。所以信中有这样一句话我们要转变观念追求打造可信的高质量产品不仅仅是功能、特性的高质量也包括产品开发到交付过程的高质量。要转变观念不再只认结果的质量还要追求过程质量了而如何追求过程质量呢那就是要“全面提升软件工程能力和实践”如果信到此为止也就是个普通官方八股文了。领导们么可不就是喜欢指个大方向说你们要用软件工程要实施软件工程至于怎么用那是你们的事情毕竟做领导的哪有几个真的懂软件工程的难得的是这封信居然有很多具体怎么做的内容。软件项目管理金三角先看这一句我们各级管理者和全体员工都不得以进度、功能、特性等为理由来降低可信的要求确保可信的要求在执行过程中不变形。振聋发聩呀同志们热泪盈眶呀生活中多少次三个月的项目老板说你一个月就要给我做完做到一半的项目PM说这个功能很重要我们要加上去。最终怎么办牺牲质量呗又想要马儿跑得快又想要马儿不吃草天底下哪有那么好的事情软件工程里面早就告诉我们了时间、范围、成本这三个要素直接决定了产品的质量点击此处添加图片说明文字 希望各位老板别光学乔布斯也学学任正非点击此处添加图片说明文字 程序开发2018年底程序员被裁的不少很多程序员开始担忧起前景来其实如果你能做到这下面要求的应该是不担心被裁的我们要从最基础的编码质量做起视高质量代码为尊严和个人声誉。代码就像是高楼大厦的一砖一瓦没有高质量的代码可信的产品就是空中楼阁。我们要优化并遵循公司各种编程规范遵从架构与设计原则熟练使用各种编程库和API编写出简洁、规范、可读性强、健壮安全的代码。这一段是说给我们程序员看的这其实也是对程序员的基本要求大家看看自己看看身边真能做到的有多少像我一样觉得自己还做的不够好的咱还是努力学习吧多练练多用点心肯定更没问题的。架构说完程序员开始说架构师了我们要深刻理解架构的核心要素基于可信导向来进行架构与设计。看到没有又提到可信了架构设计的时候别再天马行空啥新酷用啥啥流行用啥一定要“可信导向”架构设计目标先搞清楚再是细节在确保可信的前提下要在性能、功能、扩展性等方面做好权衡慎重地定义我们的模块与接口真正做到高内聚与低耦合我们要遵循权限和攻击面最小化等安全设计原则科学设计模块之间的隔离与接口提升安全性低阶架构与设计要遵循高阶的架构与设计原则在充分理解原有架构与设计的情况下持续优化我们要熟悉各种设计模式重用公共成熟组件和服务避免重复劳动。“高内聚与低耦合”“权限和攻击面最小化”“模块之间的隔离与接口”“重用公共成熟组件和服务”……道理我都明白做到可不容易技术债务华为这些年高速发展早些年为了追求速度肯定也没少走捷径这些年下来也肯定没少欠技术债务现在也是一个从追求速度到追求质量转型的契机。所以信中说完架构开始讲技术债务了我们要重构腐化的架构及不符合软件工程规范和质量要求的历史代码。我们知道再好的架构其生命力也是有限的。随着时间的推移、环境的变化以及新技术、新功能特性的引入架构也会腐化。面对腐化了的架构要毫不犹豫地去重构它。同时主动以可信设计原则为导向去重构不符合软件工程规范和质量要求的历史代码提升软件架构的生命力。我们都知道没有万能的架构只有适合当时需求当时技术条件和人员的架构时间推移了很多架构就满足不了要求了就需要重构了作为80后小时候其实生活挺艰苦的那时候我们穿衣服都讲究的是“新三年旧三年缝缝补补又三年”架构也一样嘛不满足需求我们先修修补补真要重构挑战还是不小的但是不去做它会一直成为发展的一个障碍这封信也算是推了一把“面对腐化了的架构要毫不犹豫地去重构它。”当然你重构也不要忘记“可信”这个根本目标“同时主动以可信设计原则为导向”。其实Google在这方面已经走在前面了一直鼓励重写代码任何软件每隔几年就重写一遍这样可以优化代码采用最新技术去掉一些没有价值的功能最重要的是让新员工得到锻炼保持高昂的斗志。不知道这点是不是华为在像Google学习安全这些年互联网发展很快但是安全事故却层出不穷开房记录被泄漏、密码被泄漏、比特币被盗……这暴露出业界其实对安全是不够重视的所以信中也不止一次提到安全问题公司已经明确把网络安全和隐私保护作为公司的最高纲领。”“我们要深入钻研软件技术尤其是安全技术。”“我们要遵循权限和攻击面最小化等安全设计原则科学设计模块之间的隔离与接口提升安全性”“编写出简洁、规范、可读性强、健壮安全的代码。要打造一个“安全”的软件就是首先要有安全意识然后要懂安全技术在整个开发过程中要从架构设计、代码方方面面去注意。技术是工具这些年开发界一直有些不好的风气就是都认为自己的技术是最牛的写后端的看不上前端的用angular的看不上vue写PHP的认为自己的语言是全世界最好的开发的还看不上测试的。但是信中这一句话不要忽视呀“软件技术是我们打造产品的基本工具”技术只是工具只是我们用来打造产品的工具“技术是否先进技术选择是否合理将决定我们软件的高度”技术的选型不仅看的是不是先进还要看是不是适合当前产品项目并不是什么什么新酷就用什么“我们要深入学习架构与设计、编码、测试、安全、可用性、性能、维护性、体验等技术并科学运用这些技术。”既然技术只是工具那么我们就没必要给自己设置各种技术壁垒障碍。如果开发就只学编码测试就只学测试认为安全那应该是搞安全的事这样的话是非常不利于团体协作的每个人都在一个领域能有深入的钻研同时对其他领域有一定了解对个人对团队是非常有利的一件事。这样也不需要DevOps这种为了兼顾开发、测试、运维三种角色而存在的工种一致性我们做软件开发的都知道也看过很多段子从客户的需求到最终的实现总是差别很大我们在项目初始的时候制定了很多规范却总是不了了之难以执行我们良好的设计在编码实现的时候因为赶进度、开发人员偷懒等各种原因绕开设计抄近路最后设计和编码无法一致……点击此处添加图片说明文字 一致性在软件开发领域一直都是理想美好而现实却很残酷信中也提到我们要遵守过程的一致性。遵守适用的法律法规、遵循业界共识的标准、规范确保规范到实现的一致性、代码到二进制的一致性。架构要符合架构原则设计要遵循设计模式代码要符合编程规范最终做到需求与实现一致达成各项对客户的承诺。我们只有脚踏实地做好每一步才能真正打造出可信的高质量产品。无论这个目标有多难但是从“遵守过程的一致性”开始在每个阶段都去做到一致性“脚踏实地做好每一步”还是有希望做到“真正打造出可信的高质量产品”。改变习惯在实施软件工程的过程中有两个难题一个就是转变思想另一个就是改变习惯了这种改变的过程也一定是很痛苦的。为此我们要改变行为习惯追求精品。我们要开放透明、积极和勇于揭示问题并主动推动改进。软件开发是一种创造性和艺术性的工作需要充分发挥我们的聪明才智和潜力。我们要改变只重视功能结果、不重视代码质量的行为习惯要严格遵守软件工程规范改变被动的修修补补改变碎片化知识获取主动去学习提升并贡献经验、代码形成共享知识库。我们需要改变的行为和习惯还有很多对绝大多数人来讲都将是一个痛苦的转变过程会脱一层皮但我相信大家能够迎接这种挑战。从事软件开发工作越久恐怕养成的坏习惯就越多信中列的几条都很有代表性“只重视功能结果、不重视代码质量”“功能实现完了就完事了质量那是QA的事”这种坏习惯不改质量是很难有保障的“不遵守软件工程规范”软件工程的各种规范不是约束也不是摆设而是实实在在为了团队整体更好的协作。对于定好的规范要严格执行不合理的规范也要提出来一起改进。“被动的修修补补”为了能继续凑合继续修修补补而没有考虑重构改进也是一个不好的习惯。“碎片化知识获取不主动去学习提升”在现在的信息时代碎片化的知识获取是容易的但是像软件工程这种知识仅仅通过碎片化的学习还是不够的必须的主动的系统的去学习虽然这个过程会很辛苦但是是非常有必要的。“不愿意贡献经验、代码不去形成共享知识库”很多人不愿意去分享知识和经验有的是因为太懒有的是觉得没什么好处。但是分享本身就是一个学习和提升的最好手段知识库这种事不仅是对别人对自己也是一个特别好的过程。想象下你新加入一个团队如果这个团队有很好的知识库你可以通过知识库很快的上手工作同样的如果你把你的经验写到知识库后面的新人也可以受益你的贡献“软件工程”和“质量工程”需要依靠架构技术“软件工程”和“质量工程”需要依靠架构技术而不是依靠CMM和QA管理流程。一切工程问题首先要思考能否通过技术解决当前技术无法解决的问题暂时由管理手段代劳同时不停止寻找技术手段。所有的涉及到人的管理最终都要归结到人管理还是制度管理的问题上软件项目管理也不例外如果过多的依赖于人的管理那么项目经理的职责就太重了优秀的项目经理本身就是稀缺资源最终会变成一个瓶颈。所以通过架构技术和工具把管理流程落实下来是一个非常好的方式。有两个例子可以很好的说明这点。早些年软件项目团队是非常庞大的各个服务庞大模块紧密所以管理成本很高后来微服务这种架构提出后将大的服务拆成小的服务整个组织也从大项目部门拆分成各个小组各小组可以独立更新维护。