关于程序的一些零碎思考

原创 2006年05月17日 08:54:00

根据张五常的思想,经济学的最高境界是解释世事。其实绝大部分的学问,包括所有的工科学问,最终都要落到解释世事上来。
编程也是如此。一段程序便是对某种世事的逻辑结构的一种抽象和同构。在程序空间和现实空间存在一种同构关系。在简单的程序中我们常常不能感受到这一点,但在设计巨大的程序(一般大于五万行代码)时,如果不能对它所反映的那个领域有着极其深刻的理解的话,那么这种同构常常是不完整的,甚至会 出现各种意想不到的错误。
编制程序是在无数层次上对世事进行同构。但是在一般情况下,我们可以将其分为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种特征,或兼具几个层次的某个特征。

一名程序员十年技术之路的思考与感悟

文:赵建春 回顾在腾讯的十年,作为一个本科毕业生,在管理上六年升任副总监,技术上七年半晋升 T4 专家。虽不是发展最好的,但相对平均速度来说都是比较快的。我总结主要的几点是学习成长、合作共赢、总...
  • u014344668
  • u014344668
  • 2016年09月08日 17:47
  • 549

一个程序员对互联网的思考

时间匆匆,转眼间,在IT行业已经瞎混了足足两年的时光,在这期间,有过快乐,有过悲伤,想过放弃,想过转行,想过不做北漂,挣扎过,逃避过,思考过,不管过程是如此的不堪回首和煎熬,总之,我熬过了IT行业的入...
  • jidangrensheng
  • jidangrensheng
  • 2015年07月09日 00:00
  • 3619

叔本华系列之(一)论独立的思考

即使是藏书最为丰富的图书馆,如果里面的书籍胡乱摆放,那么它的实际用处还不如一个收藏不多、但却整理得井井有条的小图书室。同样道理,如果大量的知识没有经过自己细心地思考加工,那么它的价值也远远逊色于数量较...
  • c_trekman
  • c_trekman
  • 2016年11月26日 14:55
  • 188

JMeter学习笔记21-如何添加思考时间

本文来介绍,JMeter如何插入思考时间。前面介绍过一个真实的性能测试场景,是需要加入思考时间,来模拟真实用户行为。本文就来介绍,如何在三个请求之间添加思考时间。 1. 在Test Plan下新建一...
  • u011541946
  • u011541946
  • 2017年05月05日 16:13
  • 2434

程序调试的一般思路

每个程序员的很多时间都在和bug打交道,而debug的过程总不那么令人高兴。本人在调试过程中总结了几点调试程序的一般方法,写出来和大家分享,能力有限,欢迎各位大神批评指正! 1.单步调试 从问题程...
  • cyfcsd
  • cyfcsd
  • 2016年02月21日 21:38
  • 379

《清醒思考的艺术》读后感

咱们大部分人都是普通人,一些常见的思维漏洞我们也不免存在,这本书讲了50多种常见的常见的思维习惯并有小故事帮助我们理解这些习惯中的漏洞,让我们对事物有更加清楚的认识。 一、幸存偏误 概念:由于日常...
  • HEJI1103
  • HEJI1103
  • 2016年07月05日 18:52
  • 1623

读书笔记:逆向思考的艺术

这本书的作者是Humphrey B. Neill,本来想查一下wiki看看这个人的介绍,居然没查到。逆向思考可以简单表述为:不落他人窠臼,相信自己的想法,思考问题的时候要尽量做到特立独行,避免思想的雷...
  • carolzhang8406
  • carolzhang8406
  • 2015年06月01日 10:45
  • 1030

LoadRunner性能测试-思考时间

LoadRunner思考时间  一、virtual user generator(脚本录制与设置)        1、在录制脚本的时候LoadRunner会自动记录录制者在录制软件系统...
  • liuyuzhu111
  • liuyuzhu111
  • 2015年11月12日 19:38
  • 1183

读《面向对象的思考过程》作者matt Weisfeld

最近接触了很多java代码,开始于机缘巧合,读了《java编程思想》的大概前四分之一,这比我读《C++primer》还要多了,两本都是大部头,我能完整读完还需毅力。惊讶于两门语言语法非常的相似,之前对...
  • czl389
  • czl389
  • 2017年02月22日 11:36
  • 994

对于人工智能的思考

这些天来被AlphaGo和李世石的"世纪人机大战"刷屏,由此引出的对人工智能好坏的思考成为人们以及媒体谈论的焦点,一说人工智能将会服务人类,战胜李世石是计算机史上的里程碑事件,又一说自学习人工智能将会...
  • u010168422
  • u010168422
  • 2016年03月19日 15:45
  • 381
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于程序的一些零碎思考
举报原因:
原因补充:

(最多只允许输入30个字)