首页>
知识库>
详情

VC高级学习:编程本质论

2020-08-06 来源:CloudBest 阅读量: 0
关键词:

    这几年各种新的技术井喷一样的涌现出来。身处这样一个时代的我们,难免就有一种拔剑四顾,心下茫然的感觉。在某一方面的做到精专已属不易,全才似不可能,那么究竟又该何去何从?这篇文章目的是探讨编程过程中一些本质的东西,已期对大家的学习有所帮助。
    个人以为,从编程这一职业诞生开始一直至今,其本质就没有改变过。对概念的抽象对逻辑的描述始终都是编程过程中最核心的东西。
    程序为解决某一问题而存在。而问题可拆分成某些概念和逻辑关系。而结构化程序设计和面向对象程序设计不过是对概念和逻辑进行表达的不同方式。而程序中逻辑关系的复杂程度随程序的规模而增加。
    程序的本质不是各种技巧。就算你把EffectiveC++,MoreEffectiveC++中的每一条款都应用到了你的C++程序中,如果没有对逻辑关系的良好组织,你的程序也可能糟不可言。可能高耦合低内聚,可能不可扩充―――。
    上面这段文字提到了四个概念,他们分别是:问题、概念、逻辑和技巧。
    我来举个例子来说明这四个概念都代表些什么。
    现在假设我们需要根据已知的一个文件名产生一个临时文件名。如果输入为      prog.dat,mydir,hello.,oops.tmp,end.dat那么相应的输出为
    prog.dat=>prog.tmp
    mydir=>mydir.tmp
    hello.=>hello.tmp
    oops.tmp=>oops.xxx
    end.dat=>end.tmp
    (这里使用了TheC++StandardLibrary中第11章的例子)
    什么都不做的程序是不存在的,程序总要解决客观世界中的某些问题。这里的问题就是要为一个已知的文件名产生相应的临时文件名。
    解决这个问题时涉及的概念主要有两个:字符串和扩展名。扩展名可以用字符串进行表示。
    解决这个问题的逻辑之一可用下面的伪代码来表述:
    if(输入文件名没有扩展名)
    {
    用输入文件名、'.'号和"tmp"生成临时文件名;
    }
    else
    {
    得到输入文件名的扩展名;
    if(扩展名为空)
    {
    用输入文件名和"tmp"生成临时文件名;
    }
    elseif(扩展名为"tmp")
    {
    把"tmp"替换为"xxx";
    }
    else
    {
    把文件名'.'以后的部分替换为"tmp";
    }
    }
    当然你还可以有其他的实现逻辑,而这种逻辑总是可以独立于语言、操作系统的。
    至于你是用C++标准库、还是MFC的Cstring类或者。net中的相应类或者不依靠类库自己用某种语言来表述这种逻辑那就是技巧。
    上面虽然是个小例子,但我认为完成任何程序:从上层应用直到底层驱动,都会涉及到这四个概念,。
    上面所说编程时必须的四个要素中,我个人认为逻辑和概念是编程中更本质的东西,直接的原因是他们在更大的程度上决定着程序的质量。不要忘了评价软件质量的几个指标:
    健壮性、可重用性、易扩充性、容错性等。
    而这些指标并不是你选择了某个语言或者某个框架他们就达到了。而要通过对解决的问题的逻辑进行提炼和精化才可能达到。不要说这是系统分析的责任,程序每一部分都有自己要解决的问题,怎么可能每一部分程序质量的保证都是系统分析的责任。
    此外当你要把原来用软件实现的功能换做用硬件来实现的时候,这点就分外的明显--软件其实就是一组逻辑关系。
    但眼下主流意识形态似乎并不认同这点,各种招聘广告可为明证。
    下面是一个招聘软件工程师的广告:
    1.BSdegreeoraboveincomputerscience.
    2.Atleast2yearsofdriverdevelopmentexperience.
    3.ExperienceinC,C++,windowsSDK/DDKorLinuxsystemdevelopment.
    4.Familiarwithcomputernetworkingortelecommunication802.3,802.11,TCP/IPprotocolisaplus.
    5.Familiarwithembeddedsystemdesign.
    6.FamiliarwithBluetoothisaplus.
    如果把编程与磨刀砍柴做类比的化,那么
    当某个人熟悉某种语言、某个框架、某个IDE、某个协议某个开发包的时候我们可以认为这个人拥有一把较锋利的柴刀。但这和这个人最终擅不擅长砍柴并没有然的关系。夫欲善其事,必先利其器。但利其器了未必就会善其事。所以说上面的广告一定程度上相当于想找一个会砍柴的人,但看人的时候却更注重他有没有一把锋利的刀子。(更可悲的是挣扎在生存边缘的我们,纵然不愿却也不得不迎合这种要求)
    未避免矫枉过正,这里要强调一点,不是说基本技能不重要,没有对语言、框架、IDE的一定认识,根本就产生不了有用的程序。但当我们执迷于对不同语言、框架、IDE的优缺点进行比较的时候,不要忘了他们并不对程序的健壮性、可重用性、易扩充性、容错性等最终衡量程序优劣的诸多方面起决定作用。起决定作用的是你对概念的定义方式和对各种复杂逻辑关系的描述方式。