软件工程的第一性原理丨SmartIDE

40d3873e94151db453191955971fae65.gif

作者:徐磊

原文地址:https://smartide.cn/zh/blog/2022-1022-software-engineering/

f80cc10444540f32376582d6b2e87c6b.jpeg

徐磊

英捷创软科技(北京)有限公司创始⼈/⾸席架构师 / CEO / SmartIDE开源项⽬创始⼈。微软最有价值专家MVP,微软区域技术总监,华为云MVP,认证Scrum Master,EXIN DevOps Master/Professional 认证讲师,中国最⼤的敏捷精益社区IDCF创始⼈。专注于软件⼯程,敏捷精益商业创新⽅⾯的管理咨询。客⼾涵盖从电信,能源,传统⽣产制造,⾦融和电商等各⾏业,从2005年⾄今已经为超过100家企业提供过软件⼯程⽅案的咨询和服务,包括:华为、中国农业银⾏、招商银⾏、兴业银⾏、中国银⾏、斯伦⻉谢、中国联通、中国⼈⺠保险、京东商城、通⽤汽⻋等。

一直都想写这样一篇文章来聊一聊我对软件工程的看法,粗略算来我从事软件工程这件事情已经有将近18个年头。很多人并不理解软件工程和软件开发的区别,用一个简单的类比来说明一下:如果说软件开发人员是淘金者,那么从事软件工程的人员就是卖牛仔裤的。是的,软件工程就是为软件开发人员提供最好的方法,工具和实践的学科。要做好软件工程这件事情首先要做的就是要理解到底什么是软件开发,必须对自己所服务的对象有正确理解,才能摸清其中的规律,从而为软件开发人员提供符合自然规律的方法,工具和实践 — 这个所谓的规律就是我今天想跟大家聊的内容:软件工程的第一性原理。

第一性原理这个词被埃隆马斯克带火了,其基本含义就是事物的根本性规律,马斯克经常说自己对物理学很痴迷就是因为物理其实研究的就是世间万物的根本性规律,从这个规律出发所做出的判断和决策就是符合规律的,也是一定可以实现的。相反,如果做不符合规律的事情,那么结果就是被各种困境缠绕,无法脱身。所谓的适者生存,就是这样一个简单的道理。

但是,符合规律的做法不一定就是简单方便的做法,事实上一般的情况恰恰相反,符合自然规律的做法往往都更加困难,违背基本的人性。举个简单例子,我们都知道要获得健康的身体就要坚持规律的作息,持续的锻炼身体并且科学的饮食;而实际的情况是我们总有理由去熬夜,总会在计划好的锻炼时间偷懒,高糖高碳水的冰淇淋和蛋糕也永远比蔬菜沙拉更加吸引我们,这就是人性。

软件第一性原理第一定律:

          软件是虚拟的

3b0c8747754c01b61a1a96c6916b3a02.png

软件是一个虚拟物品,这就是软件工程的第一性原理,认识到这一点你才能正确理解精益敏捷、理解DevOps和持续交付,理解研发效能,理解平台工程,理解任何为了软件而存在的方法,工具和实践。等等,软件是一个虚拟物品,这不是废话吗?是的,只有符合自然规律的描述才能被称之为废话,因为这个第一性原理本来就不神秘,本来就在你的身边。这就好像牛顿的力学定律一样,说出来你也会觉得是废话,但是真的要把它解释清楚,那么你就成为牛顿了。是的,你和牛顿的距离就是一句废话。

地下室的故事

话说一家知名的房地产大厂有一位具备500年房地产从业经验的设计师,他设计大楼的经验年头甚至都比大楼存在的时间要长那么几十年。有一次这位设计师来到一座将要竣工的大楼面前,这座楼有50多层,已经进入到内装修阶段了。设计师在仔细检查了大楼的各项设施之后提出了自己专业的意见,这个大楼需要增加2层地下室。

3480fe36f1331537f150d28f0a69c1f3.jpeg

你一定可以想象在场的项目经理,施工方和工人们惊吓的目光,感觉自己遇到了一个疯子。不过,类似的场景其实只是各个软件/互联网大厂的日常而已吧,这样的疯子每天都见,早就习惯了。

疯子错了吗?

当然没有,他只是发现了一个“底层”问题,但是并没有意识到这是个“底层”问题,因为他根本看不到这栋大楼。这就是软件,一个虚拟的大楼。

作为程序员,大家都懂软件的分层,数据/逻辑/界面这是基本的三层架构;实际中的软件往往比这要复杂的多。但是如果你尝试去给普通人解释,这将是一件非常有挑战的工作,恐怕要从Hello World讲起。

因为软件本身是一件虚拟物品,普通人很难通过常识判断软件的复杂性以及内部关系,造成严重的信息不对称,这是软件工程领域的各种问题的原罪!

软件第一性原理第二定律:

     软件只能被制造一次

bb2ea253418348a62e168eb2a02a7b28.png

复制一款软件和复制一辆汽车的成本是完全不同的,这也是基于第一定律延续。复制一辆汽车需要重新投入原材料,人工和各种生产资料,但是复制一款软件只需要Ctrl-C加Ctrl-V就够了。软件开发团队所做的事情严格来说不是生产制造软件,而是在设计软件,因为生产制造是指重复产出同样的产品,而软件开发团队每次产出的都是不一样的产品。

5d7440f3e6e630c0b6fc2ea0bf3df67f.png

瀑布模式就是个错误

设计是一项创造性活动,创造性活动的目标是无法被预先定义的,其最大的风险是创造了无用的产品,如果方向错了,所有的努力都只会加速死亡。既然生死未知,计划的意义何在,你在计划更好的生,还是计划更快的死?现实中的表现是软件经常延期,工作量估算不准确,开发过程经常遇到不可见问题,轻则延期重则推翻重做。这也是瀑布式开发模式为什么从根本上就是错的,瀑布式开发的一个基本假设就是目标是确定的。

既然瀑布本身就是错误,为什么有那么多组织和团队在使用这种模式呢?其实在本文一开始已经解释了原因,这就是蔬菜沙拉和奶油蛋糕的区别。瀑布模式虽然不符合软件工程的基本规律,但是它更加符合懒惰和规避变化的人性特点,因此大家会不自觉的选择奶油蛋糕。如果再考虑组织中僵化的流程,官僚的氛围以及各种利益的驱使因素,那么瀑布这种更加容易管理,更省心轻松的方式自然会受到欢迎,至于产出的软件是否有用,是否浪费了资源,开发人员是否痛苦不堪,这些都不重要。当然,前提是这个组织本身不依赖软件生存,对于一个数字化的组织或者强烈依赖软件运作的组织而言,产出无用的软件这一点就已经足够驱动他们选择蔬菜沙拉了。那些选择了奶油蛋糕的组织早就死于高血脂引发的心血管和脑梗了。

敏捷只是个标签

倡导迭代式的敏捷开发模式为什么现在被大多数开发团队认可,原因就是敏捷从根本上承认了软件开发目标的不确定性,而不像瀑布模式那样非要去定义一个无法被定义的东西。精益思想里面的核心Build-Measure-Learn强调的也是在目标不确定的前提下,怎样通过不断的检视来识别问题,调整方向,最终达到目标。DevOps的三步工作法 1)建立流和系统化思维 2)建立反馈 3)建立持续实验和学习的文化,看上去是不是也异曲同工?这些方法和实践都诞生于软件工程领域,现在已经在很多非软件行业使用,其思想根基都是以上所述的软件第一性原理,都是为了应对客观规律而被总结出来,又在实际工作中被验证的方法。

软件工程的基本工作思路 - 

            粒度和解耦

74bc4a3bf65ad27095cac0bed826dfc4.png

软件这件事情,现在变得越来越重要。现在火热的所谓数字化,研发效能,平台工程,其根本都是在寻找最大化软件价值的方法而已,只不过关注的层面有所不同。数字化更加关注用户侧和业务价值,研发效能更加关注开发过程,而平台工程则强调用一个内部开发者平台(Internal Developer Platform, IDP)来承载具体的方法和实践。1993年,被称为是互联网点火人的马克安德森(Marc Andreessen)开发出了Mosaic浏览器,后来加入网景(Netscape)公司,开创了互联网时代。可以说,软件这件事情只有到了互联网出现以后才真正开始进入普通人的生活。2011年,马克安德森提出了 软件正在吞噬世界(software is eating the world) 的说法,同一年的1月21日腾讯推出了一款为智能终端提供的即时通讯软件,叫做微信。

ccf8a332c63b4603436d1767f2174267.jpeg

随着软件规模的不断扩大,早期几个人就可以搞定的软件现在需要几百上千人协同完成,软件开发过程本身的问题也被放大,变成了影响组织生存发展的大问题。从研发效能的层面,从软件第一性原理出发,我们需要确保在目标不确定,方法不确定,系统越来越复杂的前提下帮助企业取得成功,其基本思路只有2个:就是粒度和解耦。面对不确定目标最简单的应对方式就是将复杂问题简单化,对问题进行拆解,然后逐个攻克。但是在拆解的过程中会带来一个副作用就是拆解后的单个问题确实简单了,但是问题的数量增加了,同时不同问题之间的依赖会造成副作用。因此我们需要解耦,采用各种管理和技术手段,让拆解后的问题可以被独立解决,而不是依赖其他问题。有关粒度和解耦的话题,请参考我的另外一篇文章 DevOps实施落地的2大法宝——粒度&解耦(点击查看)

d612895b4c6374dd3e6e022aca8e11ee.png

解耦是一个非常难的话题,在软件工程领域,对这个问题的解决方式就是 基础设施即代码 (Infrastructure as Code, IaC),IaC本身看上去是一个纯粹的工程方法/工具,实际其背后隐含了一个重要逻辑,就是如果要降低AB系统耦合,就要从他们依赖中提取共性,然后由第三方C来解决这个问题,如下图:

9ab170de92272a22418c14147b910f93.png

如果想详细了解IaC的概念以及落地方法,请参考我的另外一篇博客 没有使用IaC的DevOps系统都是耍流氓(点击查看) 。

软件工程随着软件在我们生活中变得日益重要而开始引起了越来越多人的关注,这个行业也非常善于创造概念,因此你会听到各种新鲜的词汇,包括在本文中提到的敏捷,精益,DevOps,平台工程,研发效能等等。但只要做的还是软件,就无法背离软件工程第一性原理的2条定律,记住粒度和解耦,落实IaC的工作方法,你就一定能找到适合自己的模式,应对好自己的问题,在自己的领域中取得成就。

最后还想说一句话:这些方法都会帮助你登上高峰,但一定不是别人的那座。

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

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

相关文章

排序算法之快速排序详解

一、算法介绍 快速排序:快速排序的基本思想是通过一次排序将等待的记录分成两个独立的部分,其中一部分记录的关键字小于另一部分的关键字。C部分的快速排序一直持续到整个序列被排序。 任取一个元素 (如第一个) 为中心提出所有小于它的元素,并…

openstack 中国联盟公开课參会总结

主流趋势 1. openstack defcore 互操作性认证。打通不同的openstack 厂商之间的连接2. 首批OpenStack管理员认证(COA)将于2016年进行3. 混合云应用广泛 Cloud Broker,cascading openstack 云连接器4. DevOps5. 虚拟桌面6. Storage 方面,Ceph和Glusterfs 7. Network…

Re:从零开始的Vue项目搭建

Re:从零开始的Vue项目搭建初始的终结与结束的开始Nodejs项目的简单测试从零开始webpack开发模式webpack编译打包后记初始的终结与结束的开始 最开始接触vue项目搭建是从vue-cli开始,模板式操作,一键搞定,几乎可以无缝进入代码开发…

C# WPF 用代码画一幅图(*精品*)

概述有时候我们的程序界面中需要显示一些简单的示意图,一般我们有原图的话直接嵌入我们程序就可以,但有时候我们没有原图,这时候我们不妨用代码自己画出来.今天小编要给大家展示的是这样一副图片:接下来,我就用代码纯手…

矿难让显卡压了那么多货咋办?NV如是说

2019独角兽企业重金招聘Python工程师标准>>> 在苏州 GTC 开幕的几天前,英伟达刚刚遭遇了一次股价的腰斩。 近来加密货币的热度渐低,受到挖矿热潮照顾许多的英伟达「矿机」销量受到打击,甚至出现了严重的库存危机,加上近…

花式看超级碗 人工智能、大数据在碗里

“超级碗”可不是一个大碗!!!超级碗(Super Bowl)是美国国家美式足球联盟(也称为国家橄榄球联盟)的年度冠军赛,胜者被称为“世界冠军”。超级碗一般在每年1月最后一个或2月第一个星期天举行,那一天称为超级碗星期天(Super Bowl Sunday)。超级碗是比赛的名…

SimMechanics/Second Generation倒立摆模型建立及初步仿真学习

笔者最近捣鼓Simulink,发现MATLAB的仿真模块真的十分强大,以前只是在命令窗口敲点代码,直到不小心敲入simulink,就一发不可收拾。话说simulink的模块化建模确实方便,只要拖拽框框然后双击设置属性就可以慢慢堆建自己的…

10 行代码提取复杂 Excel 数据

把 Excel 文件导入关系数据库是数据分析业务中经常要做的事情,但许多 Excel 文件的格式并不规整,需要事先将其中的数据结构化后再用 SQL 语句写入数据库。而一般情况下,结构化的工作量会比较大,而且很难通用,每次都要针…

人工智能模型的网络结构可视化

本文主要介绍人工智能模型的网络结构可视化的常见方法。对于使用神经网络模型来说,我们主要关注的是模型的输入和输出。在 ML.NET 中使用 ONNX 模型时,我们就需要了解这些信息,以便在构成神经网络的所有层之间生成连接映射。下图就是昨天 《Y…

整理ASP.NET MVC 5各种错误请求[401,403,404,500]的拦截及自定义页面处理实例

http://2sharings.com/2015/asp-net-mvc-5-custom-404-500-error-hanlde https://blog.csdn.net/yhyhyhy/article/details/51003683 ASP.NET MVC 5的开发中,服务器的各种错误[如:401(登录授权验证),403(禁止…

编辑器领域正发生变革?从面试看 Visual Studio Code 的崛起

Visual Studio Code(VS Code)的使用率在迅速上升,现在已经成为大多数工程师的首选编辑器,并似乎正迅速抢占其他顶级编辑的市场份额。Triplebyte 每周都会面试数百名工程师。在每次面试中,我们都会记录面试者使用的编辑…

C#7.0 ref引用传递

1.概要在工作中大家用到引用类型是非常多的,大家都知道引用类型在使用过程中传递的是对象引用并不会发生整个对象复制。而值类型在传递的过程中就不一样了,我曾经在编写代码时希望通过值类型来压低应用程序的内存占用,在高并发的情况大量的对…

android面试详解

前台就是和用户交互的进程 可见进程例如一个activity被一个透明的对话框覆盖,该activity就是可见进程 服务:service进程 后台一个activity按了home按键就是从前台退回到后台 标准模式:不管任务栈是否存在相同的activity都会创建一个新的activ…

element-ui Notification重叠问题,原因及解决办法

在1个方法中调用两次this.$notify方法,会出现通知框重叠的问题 methods: {checkLogin: function () {if (this.username ) {this.$notify({title: 提示,message: 请输入用户名})}if (this.password ) {this.$notify({title: 提示,message: 请输入用户密码})}}}网上…

Visual Stiudio使用技巧

技巧1 自动生成带参构造函数当我们在编写代码时会经常遇到初始化一个的类,需要通过构造函数进行对象初始化。那么这个时候我们可能会需要逐个去手动写,这样的工作即重复又无趣。如果是在项目非常紧急的情况下还有大量的字段需要与入参一一对应起来简直太…

C#性能测试BenchmarkDotnet

1.简介在我们开发高性能代码时,需要各种针对性能优化进行编码。那么如何才能知道我们所加的代码是否有性能方面的正向优化呢?有了BenchmarkDotNet,做性能对比测试就非常容易了,只需要把你的测试方法加上特性[Benchmark], 想做不同…

Requests获取连接的IP地址

在接口自动化的时候,需要获取到连接的本地IP地址,方法如下 1 import requests 2 3 rsp requests.get("http://www.baidu.com", streamTrue) 4 print rsp.raw._connection.sock.getpeername()[0] 5 print rsp.raw._connection.sock.getsockna…

阿里云APP(V4.3) SSH远程登录功能设置操作指南

阿里云APP V4.3 发布了,这次的升级,不仅在iOS和android平台上支持SSH远程登录ECS功能,也支持密钥登录哦~~~ SSH远程登录,这是一个连阿里巴巴自己的技术人员都开心不已的功能! 各位攻城狮们,从更新到V4.3的那…

JS专题之节流函数

本文共 2000 字,读完只需 8 分钟上一篇文章讲了去抖函数,然后这一篇讲同样为了优化性能,降低事件处理频率的节流函数。 一、什么是节流? 节流函数(throttle)就是让事件处理函数(handler&#xf…

【Flutter教程】从零构建电商应用(一)

在这个系列中,我们将学习如何使用google的移动开发框架flutter创建一个电商应用。本文是flutter框架系列教程的第一部分,将学习如何安装Flutter开发环境并创建第一个Flutter应用,并学习Flutter应用开发中的核心概念,例如widget、状…