关于程序的一些琐碎的看法

根据张五常的思想,经济学的最高境界是解释世事。其实绝大部分的学问,包括所有的工科学问,最终都要落到解释世事上来。
编程也是如此。一段程序便是对某种世事的逻辑结构的一种抽象和同构。在程序空间和现实空间存在一种同构关系。在简单的程序中我们常常不能感受到这一点,但在设计巨大的程序(一般大于五万行代码)时,如果不能对它所反映的那个领域有着极其深刻的理解的话,那么这种同构常常是不完整的,甚至会 出现各种意想不到的错误。
编制程序是在无数层次上对世事进行同构。但是在一般情况下,我们可以将其分为3层到十几层。到底在何种层次上对其进行同构,决定了这一层次同构的难度。往往从上一层到下一层同构的过渡是相对比较自然和容易的,而如果中间缺了一个层次则会使人感到巨大的挑战。
一般情况下,这些层次按照顺序应如下:
世事(某个任务及这个任务所处的领域的全部可得到的经验)——〉
需求(列出详尽的需求分析说明书来记录它)------------------〉
结构分析(最初也是最高的抽象,使之直接反映世事的本质结构)——〉
模块分析-----〉
分解为函数----------〉
PDL伪代码------〉
代码。
这六层是最初步的划分,通常在设计大中型软件时我们常常按照这个顺序或更为细分的层次来进行设计。
本质上这种层次划分是为了降低复杂度。人不能同时应付太过复杂的事务,所以将一个复杂的事务分解为简单的事务往往是一个合理的选择。
《代码大全》中的部分语句诠释了这种思想。人的思维分解一般极限为7,也就是说人一般只能将一个事务分解为7个方面,如果更多,那么就需要考虑中间层次。
表驱动方法更反映世事的本质和人类思维的习惯,因此它极大地简化了编程,避免了那种大而无当的if----else语句。正是如此,很多程序员将其视为高级程序员与初级程序员的分野。熟练掌握表驱动方法并将其运用到自己的程序中,往往会使程序中的那些庞大无匹的控制函数变得极为简单,易于理解,其原因正是这种方法更深刻地反映和模拟了人类面对同类问题时的处理方式。
梁肇新在《程序员箴言》中认为不是程序员在“编”程序,而是“我即是程序,程序即我”。这和柯云路的“进入思维”理念不谋而合。而且程序员需要模拟的不是某个人(作为一个演员时)、某个画家、某个书法家(在模仿其作品时),而是要模仿计算机!于是你必须考虑到操作系统是如何运行的?编译系统是如何编译的?具体的某门编程语言的规则如何?关于计算机内部运行了解得越多越深刻,这种模拟也就越深入。
能够达到这个层次或至少主动而积极地按照这种方法来写程序的程序员,在中国已很少见了。能够意识到这一点的人也是少之又少的。这在某种程度上需要调动人的潜意识思维。做到这一点需要经过长期对心理的修炼和大量编程实践,无数次的量变到质变的飞跃和积极思考之后的提升。
根据《EGB》一书所提到的证明,所有现有的高级编程语言,都是Floop级的,因而从本质上讲是 同一门语言,或者说能够解决相同规模和难度的问题。这在某种程度上已经涉及到数理逻辑和哲学的范畴。我们只需有这样一个理念即可,而不需要理会其证明。
一个刚入门的程序员,能够做出一个对话框,读入一个数据,这是第一层功夫,是了解某种具体语言的规则并能够使用它的阶段。80%的程序员停留在这个阶段。第一层功夫练到熟练的标志是可以熟练运用一门语言的大部分常用的规则解决某个常规问题。当程序出错不太严重时能够在一番摸索之后解决它。
《xx语言从入门到精通》、《xx语言实例教程》之类的书是这个阶段要看的。
第二层功夫是在编程时主动注意编程时的各个细节,包括:书写规范(缩紧、对齐、分行等等)、运行效率(如减少循环或更简单的方法提高之)、扇入扇出、变量命名等等各种规则。这是成为一个专业级程序员的必要的修炼。同时,在这个阶段,熟练掌握一门语言的绝大部分规则并至少用它进行过十万行以上产品级的编码工作,才算第二层练成。第二层功力还包括:
掌握其它至少2---3门常规语言的规则并在这门语言上达到第一层的水平(对于这一层次的高手来说,这并不是太难的事情);
能够根据一篇几百行的代码推出某个不知道语言的大致语法规则;
独立解决调试时出现的99.99%的问题;
开始从执行效率和算法角度考虑问题;
习惯使用PDL、表驱动等方法编程;
开始习惯养成并开始不能容忍那些看来臃肿混乱的代码,追求代码的外观整齐的同时也开始注意内在逻辑的统一;
《代码大全》一书部分解决了这一层次的问题。林锐的《c++高效编程》也涉及到了这类问题。从这个角度来讲,高校本科及硕士毕业生中95%以上的没有到达这一层次。

第三层功夫的特征包括:
1、 从系统的角度考虑问题(操作系统如x86和64位系统原理、编译系统);
2、 从实践中认识到各种语言各自的优缺点并在软件设计时正确选择使用;
3、 主动从数据结构的层面思考问题,并利用改善数据结构提高效率,简化程序;
4、 在某一个或多个领域拥有丰富的领域经验,并用软件解决该领域问题,提出各种新的算法:如图形图像、管理(ERP之类)、科学计算…….
5、 在进行模块分析和函数设计时能够做出很好的方案,开始主动考虑测试和维护问题;
6、 对常见编程领域:网络、数据库等等更为熟悉;
7、 对底层语言,如80x86汇编语言的掌握;
8、 跟踪最新技术,保持对新技术及发展潮流的敏感性的能力;

第四层功夫的特征包括:
1、 对离散数学、组合数学、数理逻辑、概率论、矩阵论等高级数学工具的理解;
2、 能够通过理论和实践分析自己最擅长的语言的规则为什么这样设计?好处有哪些,同时带来哪些不利?
3、 根据硬件特点提高效率或发挥硬件效能,主动考虑与硬件的结合;
4、 能够找出本领域未解决的一些问题的算法,从而在行内建立威望;
5、 涉足管理领域,考虑软件工程及如何带领一个团队完成一个软件产品并保证时间和开发质量;开始学习与人(高级领导、下属程序员和客户)打交道
6、 进行优秀的系统设计,从全局考虑问题的能力;
7、 与客户交流,确定真正的需求的能力;

第五层功夫的特征包括:
1、 超越具体语言语法规则的层面,无所谓语言;各种语言都是工具,本质相同
2、 掌控大型团队开发大型软件(20万行以上)的能力;
3、 经营管理,树立软件品牌,开拓市场的能力
4、 软件生命全周期管理;
5、 基础技术、关键技术:如新的操作系统或行业内关键软件的市场占有,总是从客户角度而不是先从技术角度考虑问题;
6、 新的软件开发理念,新的程序设计语言的开发;
7、 以自己的软件产品引领新的潮流,开发面向十年后的产品;
8、 威望、个人魅力;

第六层:
1、 思考并主导未来行业发展趋势;
2、 培养具有4---5层功力的下属来带领团队;
3、 解决行业内的重大、关键问题;
4、 退隐

可能只具备某个层次的2-3种特征,或兼具几个层次的某个特征。

posted @ 2009-05-23 12:02  独孤一草  阅读(224)  评论(0编辑  收藏  举报