您的位置:首页 > 编程语言

编程领域感悟

2015-07-25 19:39 183 查看
有两种方式构建软件设计:

一种是把软件做得很简单以至于明显找不到缺陷;

另一种是把它做得很复杂以至于找不到明显的缺陷;

数据与计算的关系

传统的计算模型是数据向程序靠拢:数据流向计算程序

大数据的技术模型是:程序向数据靠拢:程序流向数据(分布式部署),归并后再流向程序

闭包与对象

闭包是附有数据的行为,对象是附有行为的数据

大家观察下:闭包与对象,传统技术与分布式计算其实都是逆向思维的产物,这个也是编程思维的一次跳跃

程序模型:

所有的程序模型都是围绕着输入、输出,和过程处理来展开的;这也是世界万物之间交互的最基本模型;我们总是企图使用程序来模拟世界万物的交互,未曾想交互异常复杂,原因:

世界万物天生是并行的,任意时刻事物都是独立存在和变化的;

世界万物本身之间存在相互的作用;

世界上的万物存在关联性:动物,植物,微生物等等;

这就给程序设计带来极大的困难:最基本的程序线性的,是一维的,其结果是可以预测的,最多只具备描述事物的一个特征:其只有顺序,循环,分支三个模式,其只能以一条时间线来解决单一一个问题,比如:计算1-100的自然数的和,这在最早称之为作业,这个也就是计算机诞生时干的事情;

在同一时空下两个独立的东西的交互这种程序设计就显的捉襟见肘,怎么办?这时我们想到了分时:机器的CPU非常的快,在很短的时间内不同的切换多个作业:此时就诞生了操作系统和进程的概念,OK,到了这个阶段人类具有了初步模拟现实世界的能力;但是这还远远不够,比如多个事物不是独立的,他们之间相互影响,而且不停变化,这时我们又设计了:系统进程(线程)间通信,这个基本是现代程序设计的基石。所有的现代程序设计语言都是在这个基石上工作:无非是进行抽象包装,引进一些语法糖等工作,以至于从高级语言的角度,完全看不清计算机的工作模式,这也是为什么那么多系统程序员非常不习惯高级语言的原因,也是为什么那么多高级语言程序员不了解底层系统的原因。其根本原因是:高级程序语言的编译器和运行时为你做了大量的工作,以至于程序员出现思想的断层,这种断层积极的角度看是社会分工精细话,生产力高的标志,但它确实程序员的一个分水岭;这个世界本身就是金字塔形的,为什么说真理掌握的在少数人手里,就是这个道理,程序员也一样,如果一直只是熟悉一门语言,并且会使用其进行熟练的编程,完全不了解计算机的基本原理和这门语言的编译原理和运行机制,那最多就是个熟练的码农这个层级,遇到性能瓶颈后估计很难搞定是什么原因,于是就上网查下:张三说不能这么用,应该那样用,如果那样用会导致什么,至于为什么不想知道也看不懂原理。其实反过来看编程语言只是个工具:语言自带特性,语言类库,语言框架 无非是借助这三个元素结合语言的特性进行范式编程,重复发明一个又一个轮子(这个轮子可以是个新语言,可以是个新类库,可以是个新的框架);当然对于每门语言都有其最佳工程实践:我们美其名曰编程范式或者设计模式;从语言的角度分为:过程式的,函数式的,面向对象;再细分到面向对象的语言,又有23种我们常说的设计模式。

其实我们认真的去想想,编程没有我们想象的那么高深莫测,语言也没有那么神秘,无它,但手熟尔。

封装:所谓封装就是一种设计思想和理念,但不是方法:将整体划分为不同的层,或者不同的模块,层与层,模块与模块间通过接口进行调用,核心思想是:最小接口原则;层或模块内高内聚;层或模块外高耦合;

它有多个实现机制:第一种实现机制是:访问控制:该看到的你才能看到,不该看到的你不要看到:比如c++里面的:(private,public,protected), friend function friend class .以及常对象,常成员变量等等,统统都是围绕这个机制来展开,但是我们也明显的感觉到c++的语言作者在实现可见性方面抽风和分裂性:既想要好的封装,又允许特例访问;(导致访问的复杂性)

第二层实现是分层:分层人类社会实践中最通用的方法:大到国家治理的各级政府,小到一个公司的治理,都是层级的;计算机的软件堆栈一样是分层的:

硬件层,驱动层,OS层,应用软件层;网络的分层;横向的分层,纵向的划分模块是任何设计的通用黄金准则;

第三种实现机制就是引入类的概念:在代码的书写上将c中分散的数据数据和函数聚拢到类中,最起码从代码的组织视觉上看是有层次的;

其他的实现的封装的机制:命名空间(C++) 包(java)

共享:共享在实际中有两种方式:代码共享,数据共享

代码共享:面向对象的继承(以及类的static 方法),动态库(运行时代码共享),各种语言的库(编程,编译时共享),泛型,模板等

共享数据:缓存(CPU, 磁盘,OS, 以及各种数据库),共享内存(编程),全局变量(编程),类的(static 变量)(缓存当时是鼓励的,共享内存式的编程不是很鼓励:通过通信来共享内存,而不是通过共享内存来通讯,go的哲学)

本人是go的粉,顺便推荐下go的相关哲学,可见这篇文章

GO通信模型:

不要通过共享内存来通信,而是通过通信来共享内存

闭包与对象

闭包是附有数据的行为,对象是附有行为的数据

go的设计思想:少即是多,只提供一种方法做事情,拒绝过度设计;强类型,动态性,并行,duck模型;

编程范式:接口+组合,最小的语言特定满足最大的灵活性;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: