写点什么

架构漫谈(五):什么是软件

  • 2016-03-15
  • 本文字数:2466 字

    阅读完需:约 8 分钟

架构漫谈是由资深架构师王概凯 Kevin 执笔的系列专栏,专栏将会以 Kevin 的架构经验为基础,逐步讨论什么是架构、怎样做好架构、软件架构如何落地、如何写好程序等问题。

本文是漫谈架构专栏的第五篇,作者将会从自己的认知角度再次反思什么是软件,文中作者探讨了软件发展火热的根本原因以及软件扮演的角色等问题。如前几天一位架构师所说,我们并不缺架构实践,而是缺少对于架构的反思,希望这系列文章能帮你重新理解架构,重新认识软件。

前面通过四篇文章,把什么是架构,如何做好架构等必要的概念澄清了一下。这些概念对于在各种不同的领域都应该也是有用的,需要读者自行思考,并应用到自己所在的领域中。在这篇文章开始,我们用同样的思考,来看看软件是怎么回事,以及如何运用架构思维,更好的设计和实现软件。

冯诺依曼结构,图灵机,以模拟人为目标

软件的历史,实际上可以说是用机器模拟人的历史。不管大家(包括在这个历史过程中的参与者)有没有意识到,我们都有意无意的在计算机上模仿人类的行为。从冯诺依曼结构开始,程序逻辑开始脱离硬件,采用二进制编码。加上存储,配合输入输出,一个简化的大脑就出现了。图灵机则是模拟大脑的计算,用数学的方式把计算的过程定义了出来,著名的邱奇 - 图灵论题:一切直觉上能行可计算的函数都可用图灵机计算,反之亦然。软硬件两者一结合,一个可编程的大脑出现了,这也是现在为什么我们把计算机叫做电脑。在硬件上编写出的程序,就是软件,是用来控制硬件的行为的。

成本为王

在初期,软件使用二进制编写的,从硬件到软件,成本都非常的高。随着半导体技术的进步,硬件的成本越来越低,性能越来越高,甚至出现了摩尔定律:当价格不变时,集成电路上可容纳的元器件数目,约每隔 18-24 个月增加一倍,性能提升一倍。软件方面,为了简化难度,开始采用汇编,进一步出现了类似于人类的语言的高级语言,比如 C/C++/Java 等,这使得人类可以用类似于人的语言来和计算机沟通。软件工程师慢慢越来越多,开发软件的成本也越来越低。计算机就好像是一个只需要电,不需要休息的人,可以无休无止的工作。

人们越来越愿意把原来只有人才能做的事情,交给计算机来做。结果就导致软件越来越丰富,能够做的事情也越来越多,成本也越来越低。可以这么说,成本是我们为什么采用软件的主要动力,可以节省大量的人员培训,减少雇员的数目。随着互联网的发展,人类社会也开始软件化了。原来必须实体店来进行售卖的,搬到互联网上,开店成本更低,并且能够接触到更多的人。想象一下,一个门店每天的人流达到百万级别是很恐怖的,由实体空间大小来决定。但是在互联网上,访问量千万级别都不算什么。最终的结果就变成,每个人能够负担的工作越来越多,成本越来越低。这也是为什么软件这么热的原因。

软件扮演的角色

随着软件的规模的变大,做好一个软件也变得越来越难了。早期的程序员写程序,主要是为了帮助自己研究课题。这些程序员熟练了之后,提高了自己的生产力,并发现还可以帮助别人写程序,慢慢软件就变成了一个独立的行业。程序从早期由一个人完成,也逐渐变成了由很多不同角色的人共同合作来完成。以下讨论的前提,都是基于帮助别人写程序,多人合作的基础上的。结论对于单人为自己写程序也适用。

在没有软件之前,每个人干自己的工作,自行保存自己的工作结果。人们面对面或者通过电话等沟通,如下图所示。

有了软件之后,实际上,我们是把我们日常生活中所做的事情,包括我们自己本人都一起虚拟化到了计算机中。而人则演化成了,通过计算机的输入输出设备,控制计算机中的自己,来完成日常的工作,以及与其他人的沟通。也就是说,软件一直以来的动力,始终都是来模拟人和这个社会的。比如模拟大气运动(天气预报),模拟人类社会(互联网社交),模拟交易,包括现在正在流行的 VR,人工智能等等。模拟的对象越来越高级,难度越来越大。

不管如何发展,模拟人的所有行为都是一个大的趋势。也就是说,软件的主要目的,还是把人类的生活模拟化,提供更低成本,高效率的新的生活。从这个角度来看,软件主要依赖的还是人类的生活知识。软件更多的是扮演一个 cost center,这也是为什么会出现很多的软件代工。

(点击放大图像)

软件开发的架构演变

软件工程师是实现这个模拟过程的关键人物,他必须先理解人是怎么在日常生活中完成工作的,才能够很好的把这些工作在计算机中模拟出来。可是软件工程师需要学习大量的计算机语言和计算机知识,还需要学习各行各业的专业知识。软件工程师本身的培养就比较难,同时行业知识也要靠时间的积累,这样就远远超出了软件工程师的能力了。所以软件开发就开始有分工了,行业知识和业务的识别,会交给BA,系统的设计会交给架构师,设计的实现交给架构师,实现的检验交给测试,还有很多其他角色的配合。为了组织这些角色的工作,还有项目经理。这就把原来一个人的连续工作,拆分成了不同角色的人的连续配合,演化成了不同的软件开发的模式。然后慢慢演变出专门为别人开发软件的软件公司。

软件架构的出现

如同前面描述的架构的定义,软件架构的出现也是同样的。一开始是懵懵懂懂的去写软件,后来慢慢的就有意识的去切分,演变成了不同的架构。这个背后的动力也是一样的,就是提升参与的人的利益,降低成本。导火索也是软件工程师的任务太重,我们需要把很多工作拆分出来。拆分的原则也是一样的,如何让权责一致。同样,这个拆分也是需要组织架构的调整,来保证架构的落地。具体如何分拆,如何调整,我们将在另外一篇中着重讨论。

以上通过简单的描述计算机和软件的发展历史,阐明软件的本质,其实就是通过把人类的日常工作生活虚拟化,减少成本,提升单个人员的生产力,提升人类自己的利益。软件工程师的职责在这个浪潮中,不堪重负,自然而然就分拆为不同的角色,形成了一个独特的架构体系。这一切的背后,仍然是为了提升人类自己的利益,解决人类自己的问题。


感谢郭蕾对本文的策划和审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-03-15 16:507104

评论 1 条评论

发布
用户头像
“设计的实现交给架构师”应该是“设计的实现交给程序员”
2020-06-26 19:11
回复
没有更多了
发现更多内容

Opencv 图像处理:图像基础操作与灰度转化

timerring

OpenCV 计算机视觉 10月月更

长安链源码分析之交易过程分析(3)

在线问题反馈模块实战(二十一):完结篇

bug菌

springboot 项目实战 10月月更

迷宫最短路径问题

lovevivi

数据结构 C语言 10月月更

Jenkins pipeline Git 检出的 Step

HoneyMoose

用户故事地图——让迭代计划灵动起来

Bruce Talk

Scrum User Story Product Owner User Story Mapping

JDK中自带的JVM分析工具

Java 架构

CLIP-as-service 0.8.0 版本发布:新增支持大型 ONNX 模型文件

Jina AI

开源 工程师 开发工具

【一Go到底】第二十五天---内置函数和Go错误机制

指剑

Go golang 10月月更

Jenkins pipeline 如何到子文件中去执行命令

HoneyMoose

JNI中实现类似C++回调方法-结构体操作

中国好公民st

c++ jni 10月月更

房产|1-9月份全国房地产开发投资下降8.0%

前嗅大数据

数据 房地产业 房地产

房产|9月全国70城房价出炉!快来看看你的城市房价变化

前嗅大数据

数据 房地产 房产

Redis数据结构(一)-Redis的数据存储及String类型的实现

京东科技开发者

二进制 哈希算法 数据存储 结构化 Redis 数据结构

高效IO之零拷贝技术

乌龟哥哥

10月月更

一行命令安装docker和docker-compose(CentOS7)

程序员欣宸

Docker Docker-compose 10月月更

从零到一搭建一个属于自己的博客系统(弎)

木偶

MySQL django 前端 10月月更

【译】深究 Go CPU profiler

非晓为骁

Go 翻译 pprof

CLIP-as-service 0.8.0 版本发布:新增支持大型 ONNX 模型文件

Jina AI

开源 工程师 开发工具 开源软件

探索证券行业智能化升级核心引擎:成就客户价值

易观分析

证券

1024 分享|如何打造围绕开源理念的团队工程师文化

Jina AI

人工智能 开源 1024 1024我在现场

长安链源码分析之交易过程分析(2)

数据湖(十):Hive与Iceberg整合

Lansonli

数据湖 10月月更

fastposter v2.9.3 简单易用的海报生成器

物有本末

海报生成器 海报编辑器 海报生成

长安链源码分析之交易过程分析(1)

Opencv 图像处理:图像通道、直方图与色彩空间

timerring

OpenCV 图像处理 10月月更

在线问题反馈模块实战(二十):实现文件批量导出到zip压缩包中功能

bug菌

springboot 项目实战 10月月更

“程”风破浪的开发者|python GUI开发记录

衝鋒壹号

学习方法 个人成长 “程”风破浪的开发者

力扣刷题训练(二)

lovevivi

数据结构 C语言 10月月更

HashMap源码分析(七)

知识浅谈

hashmap 10月月更

在线问题反馈模块实战(十九):实现数据批量导出到excel文件中功能

bug菌

springboot 项目实战 10月月更

架构漫谈(五):什么是软件_架构_王概凯_InfoQ精选文章