从软件工程的角度解读任正非的新年公开信

昨天被任正非的那封《全面提升软件工程能力与实践,打造可信的高质量产品》的公开信刷屏了,作为一个软件工程专业科班出身的软件开发从业者,自然是引起了我(@宝玉xp)的好奇,仔细阅读之下确实让我大吃一惊,看似八股官方文,但细看之下是作者对于软件工程的理解确实非常深刻,各种专业术语信手拈来,比喻恰到好处。

我对华为的研发其实一直挺好奇的,从传统的硬件公司,到现在软硬件齐头并进,华为手机销量都已经超过了苹果,可见华为的软硬件研发实力早已是全球领先了。信中的这一句

二十年前的IPD变革,重构了我们的研发模式,实现了从依赖个人、偶然性推出成功产品,到制度化、持续地推出高质量产品的转变。

也揭示了华为的软件研发能做到领先水平的原因。

华为是在1999年开始从IBM引进IPD的,到今年2019年正好20年,在过去的20年里,IPD帮助华为从游击队变成了正规军,研发队伍从几千人到几万人,软件产品也覆盖到手机操作系统、应用、云服务。

我对IPD是不甚了解的,只知道IPD(Integrated Product Development,集成产品开发)是一种产品开发方法,但如果说软件产品的开发方法,我是比较熟悉的,那就是软件工程么!

任正非发出的这封信的大背景也很特殊,2018年中美贸易战开始,中兴、华为首当其冲成为美国开刀的对象,跟风站队的澳大利亚、新西兰、英国也跳出来抵制华为,说华为不安全,可能含有间谍软件,窃听国家机密,这帽子一扣是很难扯清的!这就是为什么整封信从标题开始,一共17次提到两个关键字:“可信”。

只有让客户觉得华为的产品“可信”,华为才能尽快走出这场危机,那么怎么才能做到可信?

如果你是餐厅老板,有人造谣你的厨房脏乱差,员工上完厕所不洗手,你怎么办?最好的办法自然是用先进的管理流程,并且让整个做菜的过程尽可能公开透明。

所以信中有这样一句话:

我们要转变观念,追求打造可信的高质量产品,不仅仅是功能、特性的高质量,也包括产品开发到交付过程的高质量。

要转变观念,不再只认结果的质量,还要追求过程质量了!而如何追求过程质量呢?那就是要:“全面提升软件工程能力和实践

如果信到此为止,也就是个普通官方八股文了。领导们么,可不就是喜欢指个大方向,说你们要用软件工程,要实施软件工程,至于怎么用,那是你们的事情,毕竟做领导的哪有几个真的懂软件工程的,难得的是这封信居然有很多具体怎么做的内容。

软件项目管理金三角

先看这一句:

我们各级管理者和全体员工都不得以进度、功能、特性等为理由来降低可信的要求,确保可信的要求在执行过程中不变形。

振聋发聩呀同志们,热泪盈眶呀!生活中多少次:三个月的项目老板说你一个月就要给我做完;做到一半的项目,PM说这个功能很重要,我们要加上去。最终怎么办?牺牲质量呗!又想要马儿跑得快又想要马儿不吃草,天底下哪有那么好的事情!

软件工程里面早就告诉我们了:时间、范围、成本这三个要素直接决定了产品的质量!

 

640?wx_fmt=jpeg点击此处添加图片说明文字 

 

希望各位老板别光学乔布斯,也学学任正非!

 

640?wx_fmt=jpeg点击此处添加图片说明文字 

 

程序开发

2018年底程序员被裁的不少,很多程序员开始担忧起前景来,其实如果你能做到这下面要求的应该是不担心被裁的!

我们要从最基础的编码质量做起,视高质量代码为尊严和个人声誉。代码就像是高楼大厦的一砖一瓦,没有高质量的代码,可信的产品就是空中楼阁。我们要优化并遵循公司各种编程规范,遵从架构与设计原则,熟练使用各种编程库和API,编写出简洁、规范、可读性强、健壮安全的代码。

这一段是说给我们程序员看的,这其实也是对程序员的基本要求,大家看看自己,看看身边,真能做到的有多少?像我一样觉得自己还做的不够好的,咱还是努力学习吧,多练练,多用点心肯定更没问题的。

架构

说完程序员开始说架构师了:

我们要深刻理解架构的核心要素,基于可信导向来进行架构与设计。

看到没有,又提到可信了,架构设计的时候,别再天马行空,啥新酷用啥,啥流行用啥,一定要“可信导向”,架构设计目标先搞清楚!

再是细节:

在确保可信的前提下,要在性能、功能、扩展性等方面做好权衡;慎重地定义我们的模块与接口,真正做到高内聚与低耦合;我们要遵循权限和攻击面最小化等安全设计原则,科学设计模块之间的隔离与接口,提升安全性;低阶架构与设计要遵循高阶的架构与设计原则,在充分理解原有架构与设计的情况下,持续优化;我们要熟悉各种设计模式,重用公共成熟组件和服务,避免重复劳动。

“高内聚与低耦合”,“权限和攻击面最小化”,“模块之间的隔离与接口”,“重用公共成熟组件和服务”……道理我都明白,做到可不容易!

技术债务

华为这些年高速发展,早些年为了追求速度肯定也没少走捷径,这些年下来也肯定没少欠技术债务,现在也是一个从追求速度到追求质量转型的契机。所以信中说完架构开始讲技术债务了:

我们要重构腐化的架构及不符合软件工程规范和质量要求的历史代码。我们知道,再好的架构,其生命力也是有限的。随着时间的推移、环境的变化以及新技术、新功能特性的引入,架构也会腐化。面对腐化了的架构,要毫不犹豫地去重构它。同时主动以可信设计原则为导向,去重构不符合软件工程规范和质量要求的历史代码,提升软件架构的生命力。

我们都知道,没有万能的架构,只有适合当时需求,当时技术条件和人员的架构,时间推移了很多架构就满足不了要求了,就需要重构了!作为80后,小时候其实生活挺艰苦的,那时候我们穿衣服都讲究的是:“新三年,旧三年,缝缝补补又三年”,架构也一样嘛,不满足需求我们先修修补补,真要重构挑战还是不小的,但是不去做它会一直成为发展的一个障碍,这封信也算是推了一把:“面对腐化了的架构,要毫不犹豫地去重构它。”,当然你重构,也不要忘记“可信”这个根本目标:“同时主动以可信设计原则为导向”。

其实Google在这方面已经走在前面了,一直鼓励重写代码,任何软件每隔几年就重写一遍,这样可以优化代码,采用最新技术,去掉一些没有价值的功能,最重要的是让新员工得到锻炼,保持高昂的斗志。不知道这点是不是华为在像Google学习!

安全

这些年,互联网发展很快,但是安全事故却层出不穷:开房记录被泄漏、密码被泄漏、比特币被盗……这暴露出业界其实对安全是不够重视的,所以信中也不止一次提到安全问题:

公司已经明确,把网络安全和隐私保护作为公司的最高纲领。”
“我们要深入钻研软件技术,尤其是安全技术。”

 

“我们要遵循权限和攻击面最小化等安全设计原则,科学设计模块之间的隔离与接口,提升安全性”

 

“编写出简洁、规范、可读性强、健壮安全的代码。

要打造一个“安全”的软件,就是首先要有安全意识,然后要懂安全技术,在整个开发过程中要从架构设计、代码方方面面去注意。

技术是工具

这些年开发界一直有些不好的风气,就是都认为自己的技术是最牛的,写后端的看不上前端的,用angular的看不上vue,写PHP的认为自己的语言是全世界最好的,开发的还看不上测试的。但是信中这一句话不要忽视呀:“软件技术是我们打造产品的基本工具”,技术只是工具,只是我们用来打造产品的工具!

“技术是否先进,技术选择是否合理,将决定我们软件的高度;”,技术的选型,不仅看的是不是先进,还要看是不是适合当前产品项目,并不是什么什么新酷就用什么!

“我们要深入学习架构与设计、编码、测试、安全、可用性、性能、维护性、体验等技术,并科学运用这些技术。”,既然技术只是工具,那么我们就没必要给自己设置各种技术壁垒障碍。如果开发就只学编码,测试就只学测试,认为安全那应该是搞安全的事,这样的话是非常不利于团体协作的,每个人都在一个领域能有深入的钻研,同时对其他领域有一定了解,对个人,对团队是非常有利的一件事。这样也不需要DevOps这种为了兼顾开发、测试、运维三种角色而存在的工种!

一致性

我们做软件开发的都知道,也看过很多段子:从客户的需求,到最终的实现,总是差别很大;我们在项目初始的时候制定了很多规范,却总是不了了之,难以执行;我们良好的设计,在编码实现的时候,因为赶进度、开发人员偷懒等各种原因绕开设计,抄近路,最后设计和编码无法一致……

 

640?wx_fmt=jpeg点击此处添加图片说明文字 

 


一致性在软件开发领域一直都是理想美好而现实却很残酷,信中也提到:

我们要遵守过程的一致性。遵守适用的法律法规、遵循业界共识的标准、规范,确保规范到实现的一致性、代码到二进制的一致性。架构要符合架构原则,设计要遵循设计模式,代码要符合编程规范,最终做到需求与实现一致,达成各项对客户的承诺。我们只有脚踏实地做好每一步,才能真正打造出可信的高质量产品。

无论这个目标有多难,但是从“遵守过程的一致性”开始,在每个阶段都去做到一致性,“脚踏实地做好每一步”,还是有希望做到,“真正打造出可信的高质量产品”。

改变习惯

在实施软件工程的过程中,有两个难题,一个就是转变思想,另一个就是改变习惯了,这种改变的过程也一定是很痛苦的。

为此,我们要改变行为习惯,追求精品。我们要开放透明、积极和勇于揭示问题并主动推动改进。软件开发是一种创造性和艺术性的工作,需要充分发挥我们的聪明才智和潜力。我们要改变只重视功能结果、不重视代码质量的行为习惯,要严格遵守软件工程规范;改变被动的修修补补;改变碎片化知识获取,主动去学习提升并贡献经验、代码,形成共享知识库。我们需要改变的行为和习惯还有很多,对绝大多数人来讲都将是一个痛苦的转变过程,会脱一层皮,但我相信大家能够迎接这种挑战。

从事软件开发工作越久,恐怕养成的坏习惯就越多,信中列的几条都很有代表性:

  • “只重视功能结果、不重视代码质量”
    “功能实现完了就完事了,质量那是QA的事”,这种坏习惯不改质量是很难有保障的

  • “不遵守软件工程规范”
    软件工程的各种规范不是约束,也不是摆设,而是实实在在为了团队整体更好的协作。对于定好的规范,要严格执行,不合理的规范,也要提出来一起改进。

  • “被动的修修补补”
    为了能继续凑合,继续修修补补,而没有考虑重构改进,也是一个不好的习惯。

  • “碎片化知识获取,不主动去学习提升”
    在现在的信息时代,碎片化的知识获取是容易的,但是像软件工程这种知识,仅仅通过碎片化的学习还是不够的,必须的主动的,系统的去学习,虽然这个过程会很辛苦,但是是非常有必要的。

  • “不愿意贡献经验、代码,不去形成共享知识库”
    很多人不愿意去分享知识和经验,有的是因为太懒,有的是觉得没什么好处。但是分享本身就是一个学习和提升的最好手段!知识库这种事不仅是对别人,对自己也是一个特别好的过程。
    想象下你新加入一个团队,如果这个团队有很好的知识库,你可以通过知识库很快的上手工作,同样的,如果你把你的经验写到知识库,后面的新人也可以受益你的贡献!

“软件工程”和“质量工程”需要依靠架构技术

“软件工程”和“质量工程”需要依靠架构技术,而不是依靠CMM和QA管理流程。一切工程问题,首先要思考能否通过技术解决,当前技术无法解决的问题,暂时由管理手段代劳,同时不停止寻找技术手段。

所有的涉及到人的管理最终都要归结到人治还是法治的问题上,软件项目管理也不例外,如果过多的依赖于人的管理,那么项目经理的职责就太重了,优秀的项目经理本身就是稀缺资源,最终会变成一个瓶颈。

所以通过架构技术和工具来辅助是一个非常好的方式。有两个例子可以很好的说明这点。

早些年软件项目团队是非常庞大的,各个服务庞大模块紧密,所以管理成本很高,后来微服务这种架构提出后,将大的服务拆成小的服务,整个组织也从大项目部门拆分成各个小组,各小组可以独立更新维护。

另一个例子是以前单元测试和代码审查还有自动部署很难执行,后来借助源代码管理工具和CI(Continuous integration,持续集成)工具,就可以很容易的进行代码审查、并且可以确保单元测试测试跑通过后才进行部署。这一点其实信中也有体现:

我们将全面强化以Committer角色为核心的代码审核和提交机制,代码经过更加严格和系统的审核才能合入版本。为此我们将建立一支更高水平的Committer角色群体,负责软件架构的看护、代码的审核和提交,整体保障合入代码的高质量。我们要变革考核机制,要让架构设计好、代码写得好的人脱颖而出,对编程能力不满足要求的人给予帮助和培训。但任何人如果编写的代码长时间不能合入版本,将会被团队抛弃。

 

软件工程就像一个国家的农业

软件工程就像一个国家的农业,是最基础的设施!

 

很感动,这些年软件工程被提起的其实不多,大家关注的更多是各种新酷的技术,而对于这种软件开发最基础的理论视而不见。希望这封信能带动软件工程在国内的更多发展,也希望我这篇浅显的文章能帮助大家更好的理解一些软件工程的概念。

原文地址:https://www.cnblogs.com/dotey/p/10220520.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HttpClient在.NET Core中的正确打开方式

问题来源长期以来,.NET开发者都通过下面的方式发送http请求:using (var httpClient new HttpClient()){var response await httpClient.GetAsync(uri);//do something with response}这段代码理论上来说遵守了C#的最佳实践,HttpClient是IDi…

[CQOI]九连环(FFT优化+高精)

文章目录题目题解code题目 九连环是一种源于中国的传统智力游戏。 如图所示,九个的圆环套在一把“剑”上,并且互相牵连。游戏的目标是把九个圆环全部从“剑”上卸下。 圆环的装卸需要遵守两个规则 1.第一个(最右边)环…

任正非公开信:投入 20 亿美元全面提升华为软件质量

昨天,华为心声社区发布了来自任正非的公开信《全面提升软件工程能力与实践,打造可信的高质量产品》,信中强调从基础代码做起,全面提升华为软件工程能力和实践,其中提到一些重要举措,包括编码质量、架构设计…

[指数型生成函数专练]chocolate,红色病毒问题,排列组合,字串数

文章目录T1:chocolate题目题解codeT2:“红色病毒”问题题目题解codeT3:排列组合题目题解codeT4:字串数题解codeT1:chocolate 题目 已帮大家翻译了,不要去UVA或者luogu上面交,卡精度&#xff0…

微服务之:从零搭建ocelot网关和consul集群

介绍微服务中有关键的几项技术,其中网关和服务服务发现,服务注册相辅相成。首先解释几个本次教程中需要的术语网关 Gateway(API GW / API 网关),顾名思义,是企业 IT 在系统边界上提供给外部访问内部接口服务…

使用 WRK 压力测试工具对 ASP.NET Core 的接口进行压力测试

0. 简要介绍WRK 是一款轻量且易用的 HTTP 压力测试工具,通过该工具我们可以方便地对我们所开发的 WebAPI 项目进行压力测试,并且针对测试的情况返回结果。PS:Wrk 并不能针对测试的结果生成动态的图表,如果有这种需要,可…

[TJOI2019]唱、跳、rap和篮球(指数型生成函数+NTT+卷积)

文章目录题目题解code1(NTT)code2(EGF卷积)题目 大中锋的学院要组织学生参观博物馆,要求学生们在博物馆中排成一队进行参观。他的同学可以分为四类:一部分最喜欢唱、一部分最喜欢跳、一部分最喜欢rap&…

Sum of Paths CodeForces - 1467D

Sum of Paths CodeForces - 1467D Tagscombinatorics dp math *2200 题意: 定义一条好的路径,当且仅当从任意点出发之后恰好经过了 k 次移动,定义这条路径的权值为经过点权值的总和(可重),进行 q 次修改,每次将ak 改…

[矩阵乘法/快速幂专题]Arc of Dream,Recursive sequence,233 Matrix,Training little cats

矩阵快速幂习题复习矩阵乘法及快速幂模板乘法模板快速幂模板T1:Arc of Dream题目题解codeT2:Recursive sequence题目题解codeT3:233 Matrix题目题解codeT4:Training little cats题目题解code做题的时候后悔没有保存过模板&#xf…

你准备好了在云中工作吗?

前几天写了一篇文章 《云时代的.NET》,今天继续这个话题聊下云时代的技能。无服务器计算,容器化,云原生应用,DevOps,人工智能,机器学习以及混合云和多云解决方案等IT趋势正在成为主流或“新常态”。所有大小…

最长公共上升子序列(LCIS)

题意&#xff1a; 求最长公共上升子序列 题解&#xff1a; 最长公共上升子序列 最长公共子序列&#xff08;LCS&#xff09;与最长上升子序列&#xff08;LIS&#xff09; LCS核心代码&#xff1a; for(int i1;i<n;i){for(int j1;j<m;j){if(a[i]b[j])dp[i][j]max(dp[…

[高斯消元及理论]线性方程组整数/浮点数,模线性方程组,异或方程组模板

文章目录理论线性方程组整数类型解线性方程组浮点类型解模线性方程组异或方程组高斯约旦消元约旦消元无解无穷解唯一解理论 高斯消元法&#xff0c;是线性代数规划中的一个算法&#xff0c;可用来为线性方程组求解。但其算法十分复杂&#xff0c;不常用于加减消元法&#xff0c…

eShopOnContainers 知多少[7]:Basket microservice

引言Basket microservice&#xff08;购物车微服务&#xff09;主要用于处理购物车的业务逻辑&#xff0c;包括&#xff1a;购物车商品的CRUD订阅商品价格更新事件&#xff0c;进行购物车商品同步处理购物车结算事件发布订阅订单成功创建事件&#xff0c;进行购物车的清空操作架…

后缀数组 SA

后缀数组 SA 后缀树组(SA&#xff0c;suffix array)&#xff0c;用于处理字符串子串形成的结构。 处理子串的结构主要方式有&#xff1a;后缀数组 SA&#xff0c;后缀自动机 SAM&#xff0c;后缀树 ST。 后缀树和后缀自动机暂时决定咕咕咕&#xff0c;以后学习可以参考ix35 的字…

微软热门开源项目及代码库地址

点击蓝字关注我这几年来&#xff0c;微软在开源与社区方向的努力与成就是全世界有目共睹的。微软的开源项目超过2000多个&#xff0c;挑了一些比较火热的给大家整理了一下。欢迎补充~Visual Studio Code非常流行的跨平台代码编辑器&#xff0c;提供全面的编辑和调试支持、可扩展…

[树链剖分][SDOI 2011]染色,Housewife Wind

文章目录T1&#xff1a;Housewife Wind题目题解codeT2&#xff1a;染色题目题解code今天选择写这篇博客主要是为了告诉大家一个道理&#xff0c;数组比vectorvectorvector快太多了&#xff0c;我这两道题第一次都因为vectorvectorvector&#xff0c;TTT到飞起 T1&#xff1a;…

ASP.NET Core 网站运行时修改设置如何自动生效

点击蓝字关注我在ASP.NET Core中&#xff0c;如果修改了appsettings.json中的设置&#xff0c;那么默认情况下就得重启网站才能生效。有没有办法在修改设置后自动刷新并应用呢&#xff1f;背景首先&#xff0c;我们看看默认模板建出来的 ASP.NET Core 网站&#xff0c;配置文件…

1022. 宠物小精灵之收服

1022. 宠物小精灵之收服 题意&#xff1a; 现在有n个胶囊&#xff0c;m个生命值&#xff0c;k个怪物&#xff0c;每个怪物需要a[i]个胶囊&#xff0c;且会造成b[i]个伤害后才能捕获&#xff0c;问在活着的前提下&#xff0c;最多捕获多少怪物&#xff0c;在怪物最多的情况下剩…

【周末狂欢赛6】[AT1219]历史研究(回滚莫队),大魔法师(矩阵+线段树),单峰排列

文章目录T1&#xff1a;单峰排列题目题解codeT2&#xff1a;历史研究题目题解codeT3&#xff1a;大魔法师题目题解code我可能这辈子都更不出来狂欢赛5了&#xff0c;先咕咕 T1&#xff1a;单峰排列 题目 一个n的全排列A[i]是单峰的&#xff0c;当且仅当存在某个x使得A[1]<…

YBTOJ:圈套问题(分治法、鸽笼原理)

文章目录题目描述数据范围解析代码图片转载自&#xff1a; https://blog.csdn.net/weixin_43346722/article/details/118435430题目描述 平面上有 n个点&#xff0c;用n个大小相同的圆分别将一个点作为圆心&#xff0c;同时满足圆圈不相交&#xff0c;求圆的最大半径。 数据范…