在2007年程序员杂志第三期中列举了程序员的七种武器,由此好事,根据自己的经验和对计算机编程的理解列出了对于程序员来说,几个必备的概念,需要在在编程中经常要考量的点。
[七种武器] 数组、字符串与哈希表 正则表达式 调试 两门语言 一个开发环境 SQL语言 编写软件的思想
##############程序员的“三层心法”
******************[低级心法]***************************************************************************************** --->经典数据结构及其定义的操作 点评:盖起程序大楼的砖瓦,不能不熟
--->网络路由 点评:很经典的自适应算法,在一个磅礴的系统里面,能够让消息自如的行走,实在不容易!
--->移动通讯经典网络体系结构 点评:经典的分布式应用系统,在它的责任划分、模块划分,以及基于网络技术的应用,一个神奇移动通讯的世界出现了!HLR负责用户的计费、鉴权,MSC负责呼叫的控制,在固定地点的结构网络里面支持了用户的移动通信和漫游。
--->编译性语言与解释性语言的差异 点评:现存的所有语言都不出这两种语言的范畴。知道其差异就知道刀剑各有所长
--->C语言与Lisp语言 点评:语言并不是所有的都和c语言很像,其实语言有很多种,可以看出计算模型是多么神奇,由一个源点发源出很多种“文明”出来。
--->对称编程 点评:资源申请后对称地释放,例如C++中构造函数和析构函数,对称的调用关系。一种对称的美,保证程序优雅地进入,优雅地退出,挥挥手不留下一片“恶迹”,让自己对历史负责,让他人继续拥有未来!
******************[中级心法]***************************************************************************************** --->堆栈概念 点评:其实堆栈都是内存,只不过使用的方式有差别而已。堆交由了程序员处理,而栈的维护则全部交由了系统或编译程序的。个人观点,栈也不过是堆的一种特例,因为在现在的计算机系统中,可以看做,实际上首先是系统申请了堆空间,然后被以栈的操作方式来使用!申请空间的时候,栈顶指针上移;释放空间的时候,栈顶指针下移。而最后系统还会以堆的方式释放用作栈的内存空间!可以看成,系统一启动,全部的内存空间都是堆,而再后来,才有栈的产生,栈只不过是一种使用效果。所以,道生两仪,两仪生四象,四象生八卦!最根本都是一样的内存!
--->计算机“存储执行”的简单机器模型 点评:计算机的简单机器模型,即程序存储,程序执行。白话来说,就是计算机在预先编定、存入存储区内的“步骤”--可以对应理解为指令,按部就班的运行。计算机的“死脑筋”就表现在这里了,如果你偶然犯的一个小的Bug,计算机也会按照对的去执行。例如,一个加法的“步骤”,C = A + B ,首先计算机会取左数据到加法器左寄存器位置,再取右数据到加法器右寄存器位置,然后下步指令触发加法器加的动作,后面就是取得加法器的中间结果,存入C的地址位置。程序员的伟大,就在于此的,它用代码可以控制他想到的一切,所以你看到了光怪陆离的计算机软件世界。简单计算机机器模型,程序员的骄傲就以此开始的。
在用程序启动程序的世界中,只要你完成了被启动程序的装载到内存,设置完成冯诺伊曼“存储执行”所需要的环境和其他一些必备的操作系统记录信息,环境信息,特别是程序执行计数器、堆栈基地址寄存器等,只要这些完毕另外一个进程也就诞生了,进程的诞生就如它的生产者最初来到这个计算机世界一样,必须设置好冯诺伊曼机的运行环境!
--->多进程/任务的切换 点评:
--->进程间通讯 点评:
--->线程安全
点评:
--->缓存cache概念
点评:
--->树、栈、表,电脑三友
点评:这几种数据结构在计算机编程世界中居于核心地位,其他的数据结构基本上由这几种结构派生出来。另外,对于树,或者树形的结构,在很多地方有很神奇的应用。我们可以将程序在宏观上看类似一颗树形结构,虽然在C语言下体现为过程式编程,但是程序组织内部树形结构的影子还是能够看到的。这也就是为什么,我前一段感想,只要能够组织成树形结构,他就能够担任翻译编程语言的责任。就像xml可以转化为C语言一样!
--->状态机与定时器
点评:关乎流程、协作的应用场景,用状态机和定时器模式去编写程序,对程序结构的组织都是非常有益的!
--->同步和异步过程 点评:计算机许多处理过程,都不外乎这两种类型的流程结构,而这两种流程结构,对于你的处理策略和算法有至关重要的影响。对于,我们解决新问题也一样,问题到底是一个什么过程,以及需要什么样的一个过程,是对模块设计、发展很重要的!
同步过程每个阶段都是衔接的,而异步过程每个阶段是分接。异步过程,往往会导致你会采用一些“胶合”技术去胶结各个分离的阶段,或者说是一种Hook机制。例如,如果客户端响应采用http方式连接到服务器端,而此服务器也只是一个中间件,此客户端请求还要继续走长征路,发起到另外一个网元的UDP连接。由于UDP是无连接,什么时候响应消息回来是不确定,适合采用异步的过程处理这个流程。但是,由于客户端到中间件的HTTP胶合技术,使得如果采用异步过程,将是一个灾难性的。因为在http交互下,是一种客户端主动的机制,非常难以想象当中间件收到响应消息,是如何再把消息转交到客户端。过程的同步、异步特性和异步所必然连带的胶合技术问题,都会对系统的架构有深刻影响,将很大程度上决定了c/s或者b/s结构。
--->有状态(session)模块和无状态(sessionless)模块 点评:一个模块的设计其本质是有状态的还是无状态的,对你模块的通用性、服用性、设计复杂度是有很大影响的。有状态模块可以看成对于外界同样的输入,时间点不一样可能返回的结果总不一样。无状态模块,对于同样的输入总是返还同样的结果。
--->主动模型和被动模型 点评:传统的web编程模型是一个客户端主动\服务器端被动的模型,所以高效的服务器端主动通知客户端的消息往往要引入除了Http外的其他技术。DLL动态链接库的代码是死的,一点都自己不会动的代码,只有等到被加载或者调用时才具有活力。
--->粒度的概念 点评:粒度一个在功能、模块设计时,经常会遇到的一个概念,特殊的一个应用场景是数据库的锁机制使用。到底是使用全数据库锁、整个表的所、部分子集的锁、行记录的锁、还是属性锁,会带来不同的编程复杂度和Bug温床的厚度
--->流(Stream)概念 点评:计算机界将很多数据都抽象为流的概念,例如数据流、文件流等!流的概念的把握,以及把数据组织成流,都对自己或别人很有帮助的。
--->原子性操作(Atomic)概念
点评:将一些互相捆绑的概念包裹在一起,要么完成,要么清清白白退出,有助于程序运行期状态的一致性。但是,却不要小看状态的一致性,呵呵,我以前曾经讲过“如果有足够的flag,程序可以控制一切”,我们程序是依据状态来装我流向的。如果状态错误,流向也会错误,而导致一些错上加错的诡异事件!
--->事件驱动和Callback/Hook回调机制 点评:
--->文档对象结构(DOM) 点评:
--->对象结构信息的完备性、自描述性和系统的自反性、传递性、对称性、闭包 点评:在完备性和自描述性原则的影响下,程序模块化和彼此模块的正交性设计的入门概念。
--->精通一门语言,知晓其设计与实现及演化 点评:
--->设计模式 点评:让你从初级的Coding走到架构的一条捷径。在设计模式下,所有的语言都不重要,当程序拥有了这个“结构”,程序将保持稳定的、不变的,但是又极具适应性
--->指针和函数指针、强制类型转换 点评:在指针和强制类型转下,好像没有什么事情作不了的
--->高内聚/低耦合/重用 点评:在程序设计时指导性原则
--->容器概念 点评:负责调用组件、为组件的运行提供了安全、可靠的稳定环境和上下文。类似tomcat对serverlet的样子
--->程序运行的上下文 点评:程序运行的上下文,即其对外部环境所作出的假定。如果假定不满足,则其表现肯定会不满足当初对它的假设!
******************[高级心法]**************************************************************************************** --->递归概念 点评:物质由是物质构成,举一个简单的理解模型!如果从原子概念出发,我们可以将整个宇宙看成 就是在这一层层的递归中产生!递归过程就是一些化学键、分子力、结构学等一些“算法”步骤,完成物质的组配。是需要深入理解的一个概念,而不是汉诺塔之类的
--->固定与变化之道 点评:用硬编码对付固定,用“变量”对付变化,此程序可以永生
--->空间和时间 点评:程序的运行脱离不了时间和空间的,以时间换取空间,还是以空间换取时间,权衡和博弈,这里面就诞生了“大师”!