文档章节

关于“编程的本质”的探讨

大大枣
 大大枣
发布于 08/31 14:27
字数 1498
阅读 6139
收藏 65

提出问题

如果你去面试,被大公司工作20年的资深技术总监问一个问题“说说你对软件工程的理解”,你会怎么回答呢?是不是会像我一样一脸懵逼,一个问题就让人回到了小学。没有经年的编程和架构经历,没有对问题本质的深入探究,恐怕任何回答都会显得非常苍白。

探索历程之编程本质

有了问题和好奇心之后,令你印象深刻的问题就会在一段时间内充斥你的脑海。让我回答对软件工程的理解,可能我会先从“软件工程”的定义说起,他应该是一个一级学科,下面包含的范围非常广泛,比如计算机科学、光电信息工程、媒体信息工程、自动化控制、通信工程等。
我自己比较熟悉的是计算机科学相关,而计算机科学又是包罗万象,日常工作可归之为“编程”一类,写的业务代码居多,中间件和架构也占一部分。
拿自己熟悉的编程来说,问题就变成了“什么才是编程的本质”,我如果把这个问题回答好了,以点破面,也算是能勉强回答总监提出的问题了。
那么什么是编程的本质呢,看到左耳听风的一篇专栏文章(强烈推荐耗子大神,专栏地址),大致观点如下:

编程 = 算法 + 数据
算法 = 逻辑 + 控制

用图来表示:

如果对一个表单做验证,用逻辑+控制的思想,可以这么写:

var meta_create_user = {
    form_id : 'create_user',
    fields : [
        { id : 'name', type : 'text', min_length : 3 },
        { id : 'password', type : 'password', min_length : 8 },
        { id : 'repeat-password', type : 'password', min_length : 8 },
        { id : 'email', type : 'email' }
    ]
};

var r = check_form(meta_create_user);

上面meta_create_user是“要做什么”,也就是逻辑。下面check_form是“怎么做”,也就是控制。
这个观点对我有非常大的启发,引发了我很多思考。

探索历程之架构设计

根据上面的观点,那么在架构设计层面,逻辑+控制的思路能否行得通呢?
正好我最近被另一个问题困扰,那就是随着业务的复杂,架构如何才能不僵化?比如一个企业服务CRM系统,多租户、多业务线,而且业务线之间耦合还非常重,随着业务线的增多,代码开始变得错综复杂,无数线头纠缠在一起,剪不断、理还乱。再把多租户考虑进去,就相当于在线头上又掉上了油漆。
老人扎进了修复bug的海洋,新人理不清业务线。出现这种情况,问题源头也好找:架构没做好。
可是架构怎么做?面向对象的五大原则(SOLID,即单一职责原则,开闭原则,里氏替换原则,接口隔离原则和依赖倒置原则)说起来头头是道,设计模式用起来得心应手,SOA的理念烂熟于心,分层的思想也面面俱到。还能要求架构师什么呢?
虽然很委屈,但也很焦急。
人找不到答案的时候,往往是视野出了问题,也就是视野太窄造成困于原地。
放出去看看业界有什么样的解决方案么?那些聪明勤奋的人恐怕早遇到过这样的问题。
还真被我找到了,这就是领域驱动设计,简称DDD。这种思想简直让我大开脑洞,印象最深刻的有两点:1、程序员要深入了解业务,了解业务之后建模;2、建模是构建一种共同的语言,这种语言架构师、领域专家、产品经理都能看得懂,而且就用这套语言沟通并一起完善它。
这种思想好啊,熟知领域知识说不定还能在代码层面进行微创新,真是振奋人心。
有了纲领,就是有了方向,接下来要考虑的就是怎么在编程层面的落实了。
还是老办法,这个思想出来了这么久,肯定有聪明人做过落实的这个事儿啊,何不参考之?麻烦就麻烦在有很多人做了实现,但开源的却太少。
在Github上找一找,真发现了一个阿里同学写的框架:https://github.com/alibaba/COPA
看过他的设计和博客文章后,也是惊为天人,非常感谢significantfrank的分享!

探索历程之融合

如果你和我有一样的困扰,建议你认真看一下COPA的理念。
接下来我们再来看领域驱动设计和逻辑+控制之间存在什么关系呢?
其实想要践行DDD,必然要熟练的应用到很多设计模式,我们以设计模式中比较经典的策略模式来看一下他们之间的关系,比如一个商品优惠的策略:

有三种优惠方式,分别是普通打折(比如9折),满减,期限内的特价。我们看到Strategy下的三个实现就是逻辑,而Context的组合拼装就是控制。
策略模式比较简单,回到领域建模,在COPA框架中分了三层,其中Service Facade可以看成是控制,Domain里都是逻辑,Infrastructure里则是数据了。现在再来看,从微观到宏观,编程 = 算法 + 数据算法 = 逻辑 + 控制 这种思想可谓是历久弥新!

© 著作权归作者所有

共有 人打赏支持
大大枣
粉丝 20
博文 30
码字总数 34742
作品 1
朝阳
架构师
私信 提问
加载中

评论(25)

烨儿
烨儿
将问题抽象化,然后实例化,最后持久化.
snowfox008
snowfox008
新手Python向大神学习,渴望赐教!!!
夏夜微凉
夏夜微凉
微观上来看是:利用手头能利用的资源以最小的代价解决问题!
宏观上来看是:让计算机替你解决一些周期性的反复劳动,节省时间提高工作效率!
软件工程的本质是用科学合理的办法管理软件开发过程,从需求进场到产品输出,降低研发成本,提升产品质量
编程的本质就是用计算机明白的语言告诉计算机做什么事情,怎么做,从而解决现实的问题。
政委dotio
政委dotio
1,为什么说软件的本质是概念和概念之间的关系
因为无论怎么简化,去掉实现差异,框架差异,语言差异,软件的本质最终不能再简化为一个问题域——即一些概念和他们的关系。

或者用另外一个表达式 程序 = 数据 + 逻辑
这个表达式在OO时代进化为:程序 = 对象+对象+对象…… && 对象 = 数据+逻辑
对象模型,很明显更能贴切的去表达概念和关系

2,为什么软件工程的本质是管理复杂性
软件工程一个不可避免的东西是(需求)变化
而软件是的本质是概念和概念之间的关系,这个本质类似什么,类似于中子影响原子的裂变。
所以,这导致了软件的复杂性爆炸。

这也是为什么《人月神话》作者在论述到这个本质和变化的时候说:“如果这是事实,那么终究没有银弹”。


这里切不去论证他这个论断是否正确,但是的确反应了人月神话描述的软件工程面临的诸多难题
1,软件很容易陷入泥沼
2,陷入泥沼很难纠正调控
……

复杂性我总结有三大类
1,问题域本身的复杂性
2,采用的技术方案引入的额外复杂性
3,涉及到的人和组织再引入的额外复杂性

软件工程 本质上要解决这三个复杂性
引入这三个复杂性的同时,我引入技术熵和组织熵的概念
熵是能量中不能做功的能量
技术熵和组织熵是技术和组织在解决问题中,额外多花费的能量。
很明显,这两者越少越好。

所以,
1,技术熵越少越好
2,组织熵越少越好
3,良好的业务模型,是真正的关键

这是软件工程的终极,核心问题
政委dotio
政委dotio
软件的本质是:概念和概念之间的关系(参见人月神话)
软件工程的本质是管理复杂性
KelvinQ
KelvinQ
编程的本质就是折腾
java9
java9
编程的本质不就是满足人的懒和贪欲吗
H_fanG
H_fanG
这个问题,他的答案也是开放式的,每个人的回答或许都不尽相同,只要能够自圆其说就好。或许他想通过你的回答,来看看你对于编程理解升华的程度。虽然这个答案不确定,但是最终的结论肯定是非常的简明,因为越简明,说明你提炼的越好。然后在从你简明的回答中,逐步拓展出更多、更广、更远的东西出来。可能这才是他想要的。
高手问答第 203 期 — 百度专家教你运用 Python 成为顶级数据工程师

OSCHINA 本期高手问答(2018 年 6 月 27 日 — 7 月 3 日)我们请来了@EdwardY 黄文青为大家解答关于 Python 数据分析方面的问题。 黄文青,目前就职于百度公司。参与过公司内部海量数据处理的...

局长
06/26
0
0
高手问答第 152 期 — 聊聊架构,洞见架构之道

OSCHINA 本期高手问答(2017 年 5 月 9 日 — 5 月 15 日)我们请来了@kevinarch (王概凯)为大家解答关于架构的问题。 王概凯,资深架构师,《聊聊架构》一书作者。 提起“架构”,大部分开...

局长
2017/05/08
6K
78
介直投资合伙人周攀:关于区块链教育的四点认知

介直投资合伙人周攀:关于区块链教育的四点认知 互联网+余音未尽,区块链+已马不停蹄,区块链+教育会给我们的生活带来怎样的冲击、改变、进步,和颠覆?近日,介直投资合伙人周攀在由谢宏中主...

脑海链
08/06
0
0
关于c语言结构体成员变量访问方式的一点思考

前言 上篇博文(关于c语言结构体偏移的一点思考)对c语言中结构体偏移做了一些思考,发现博文中还有一些小的问题,没有描述的足够清楚,所以才萌生了本篇博文的想法。 为什么不直接将本篇博文作...

算法与编程之美
2013/06/27
0
11
从服务机器人出发,NXROBO现身说法如何助力中国智造 "M-Tech " AI助力中国智造产业论坛

  作为“中国智造2025”的重要一环,智能服务机器人接下来可以怎么走?   场景一:   “xxx(机器人),给我打开电视。”   场景二:   “XXX(机器人),在我到家的时候带开电视。...

镁客网
2017/12/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Pycharm上Django的使用 Day8

1.添加新条目 1>编写用于添加新条目的表单 在forms.py中创建一个与模型Entry相关联的表单 1处给字段'text'指定一个空标签 2处定义小部件widgets,widgets是一个HTML表单元素 2>定义new_entry...

不会TC的猫
14分钟前
2
0
MongoDB副本集

MongoDB介绍 早期版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主 目前已经淘汰master-slave模式,改为副本集,这种模式下有一个...

chencheng-linux
27分钟前
1
0
WebService 客户端记录

https://blog.csdn.net/qiuhan/article/details/49487009

呼呼南风
27分钟前
0
0
七牛云彭垚:智能平台的创新和发展

2018 年 11 月 14 日至 11 月 18 日,第二十届中国国际高新技术成果交易会(简称高交会)在深圳成功举办,七牛云作为国内领先的以数据智能和视觉智能为核心的企业级云计算服务商受邀参展。 ...

七牛云
34分钟前
0
0
Java内存模型原理,你真的理解透彻了吗?

内存模型产生背景 在介绍 Java 内存模型之前,我们先了解一下物理计算机中的并发问题,理解这些问题可以搞清楚内存模型产生的背景。 物理机遇到的并发问题与虚拟机中的情况有不少相似之处,物...

小刀爱编程
39分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部