驳“编程思想”至上者

cber 2003-04-11 09:43:28
自从Bruce Eckel的《Thinking in C++》和《Thinking in Java》两本书被国内引入翻译成为《C++编程思想》和《Java编程思想》之后,“编程思想”这个词也越来越多地被很多人所引用。但凡在一个比较激烈的讨论之中(尤其是和具体语言相关的讨论之中),总会有些人跳出来,说道:“用什么语言并不重要,关键是编程思想”。而这些人在说这话时,往往扮演着两种角色中的一种:和稀泥者;或自以为高人一等者。以和稀泥态度出现的人,我们姑且不去评论,但对于那种自以为掌握了软件开发之“道”——“编程思想”的人来说,我总觉得有些话是如“骨鲠在喉”,不吐不快。

首先,让我们来看看程序到底是用来干什么的。

一般来说,计算机程序总是为了解决某类问题而被开发出来的。相对于那种比较“形而上”的“思想”来说,计算机程序总是比较具体的东西,除了我们不能触摸它们之外,我们绝对是可以感受到它的存在,它的运行,以至于它的内部结构……总之,计算机程序是一种十分具体的事物。而“思想”不用我说,大家都知道它的抽象性了。因此两者之间应该不会存在着什么必然的联系。

当然,你可以说,程序是在某种为人所知(或不知)的“编程思想”的指导之下被开发出来的,而那种可以替代一切的“道”也就存在于程序的内部,也只有那种领悟了“道”的人才可以从错综复杂的程序代码中发现出这种“思想”。

我们可以先撇开是否真的有这种“道”的存在不谈——那样太容易陷入求道者最擅长的空洞辩论中去,还是先来谈一些具体的东西吧。

有人说,不同行业的软件,其差异不会比两个行业之间的差异小。如果真的存在有一种大一统的“道”来指导着我们的软件开发,那么试问这种差异又怎么解释呢?既然你可以认为掌握了“编程思想”就等于掌握了软件开发的一把钥匙,那么为什么这把钥匙为什么又不能打开消除不同软件之间差异的那把锁呢?Frederick Brooks在其经典著作The Mythical Man-Month中写过:“No Silver Bullet”,并且把软件开发中的根本困难给我们指出来了:“我认为软件开发中困难的部分是规格说明、设计和测试这些概念上的结构,而不是对概念进行表达和对实现逼真程度进行验证”。在现代软件系统中存在着一些不可规避的内在特性:复杂度、一致性、可变性和不可见性。(F. Brooks 1995)从中可见,所谓的“编程思想”其实也就是我们所臆想出来的一类Silver Bullet而已。

当然,你也可能会反驳说:我们所说的“编程思想”其实不如你所想象的那样,是一种大一统的“道”,而只是在开发过程中所存在着的一种局部的、可以用来指导程序编写的方法论,它是独立于具体的编程语言而存在于所有的程序编写活动中。嗯,在此我们姑且还是暂时接受你的这种说法,然后再继续对此进行剖析……

作为存在于所有程序编写过程中的“思想”,其最终还是会反应在我们所得到的程序编写结果——软件——中去。让我们还是回到先前提出的那个有关差异的问题中去,既然“编程思想”是固定的(或相对固定的),为什么还会造成如此大的差距呢?

我想对于上面那个问题,仅仅使用“编程思想”来解释是绝对解释不清楚吧。

下面,我想提出一些自己的观点:

一个软件的开发实际上和软件所处的领域关系非常紧密,不同行业的软件,其联系程度倒不是那么大了。正如ERP系统关注在工作流层次之上,操作系统关注的则是如何利用好硬件能够提供的功能。所以,在软件开发中,领域内的知识是非常重要的,几乎所有的软件都是针对某个领域内的某些问题来提供解决方案,脱离一个固定的领域而存在的软件,只能算是一个玩偶而已。另外,在目前我们所能够得到的认知下,还无法得到一个可以覆盖所有领域的、无所不能的“思想”。

选择不同的语言,对于软件开发,其产生的影响也是不可忽视的。对于这方面的讨论,我们可以从经济、技术、以及软件目的等各方面来进行……

在程序的编写过程中,还是存在着一些“放之四海皆准”的准则,如Decoupling,Cohesion,Modularize等,但这都只是编写程序所要求的一般准则,每个合格的程序员都要求掌握并应用它们(当然,在特殊的场合下面,可能并不要求实施它们)。

“工欲善其事,必先利其器”这种做法,是我一直所认同的。既然不存在一个无所不在的“编程思想”,既然所有的软件必须还是用程序来实现,程序员要是不能够掌握一种工具的话,又如何可以做到合格的呢。只是作为不同的工具,大部分流行的编程语言之间其实都是大同小异,所以会给某些人造成“语言并不重要,重要的是思想”这种观念,然后就对于一些容易做到的技巧提高的工作不感兴趣,反倒是追寻了虚无飘渺的“思想”,颇有点“缘木求鱼”的感觉。尤其是在现在这个分工比较明确的社会,“一专多通”的人才远比“多通不专”的人要更容易得到承认。
...全文
242 151 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
151 条回复
切换为时间正序
请发表友善的回复…
发表回复
maojincxj 2003-04-24
  • 打赏
  • 举报
回复
收藏
shishiXP 2003-04-24
  • 打赏
  • 举报
回复
好!!!!!!!!!!

有魄力!!!!!!!!!

加分!!!!!!!!
vonafter 2003-04-24
  • 打赏
  • 举报
回复
思想当然是最重要的,软件设计正是体现思想的途径。

我想,一个设计思想明确的方案摆在大家面前,我们都能很快的用自己熟悉的语言实现,但换做我们不熟悉的语言,稍加了解其语法,结果也可以写出那个功能。所以我觉得编程思想在软件工程中的地位无疑是最为关键的,一个好的软件当然有一个好的代码工程师,但一个差的软件却不一定一定出自一个差的代码工程师。
qiuafa 2003-04-24
  • 打赏
  • 举报
回复
劫分&捧场
caimouse 2003-04-24
  • 打赏
  • 举报
回复
做什么都是要去做,没有做的精神,一切都思想,工具都是费话。
如果你的产品没有人要,什么东西都是没有用的。
zxyin4 2003-04-19
  • 打赏
  • 举报
回复
mark 先
beone 2003-04-19
  • 打赏
  • 举报
回复
mark
sjd163 2003-04-19
  • 打赏
  • 举报
回复
干什么都要有思想。
zxy_zs 2003-04-19
  • 打赏
  • 举报
回复
我觉得。编程思想要服从于业务需要。如果你的程序不是在实验室里的,如果面对的是客户。而客户需要的是软件功能上的实现的话。那业务需要就是第一位。
一个应用了多好的编程思想,用了多么好的算法的程序,如果不适应业务需要(或者说用户需要)。 那也是废物一堆。
peon 2003-04-19
  • 打赏
  • 举报
回复
常有有下面的话:
“关键是思想,工具和语言不重要”
说这种话的人有:
1.初学的,也没有什么思想,看了高手的话人云亦云,也是自己不多学习的借口。
2.大牛人,会N种语言,各种工具平台引用自如。
3。一些特殊行业,比如研究一些算法人工智能之类,语言本来就不是重点,数学才是。

语言本身的确不重要,但是在选择一种语言和工具的时候,我们也选择了一种平台,而平台之间的差别不是那么一点点,MFC/VCL的差别不小吧!尽管他们都基于win32api,但是却是不同的编程模型,假如只要懂得思想就可以在平台间切换自如的话,MS.net和SUN.java也不会搞得你死我活了.
而且语言之间也不是完全没有差别,OO的思想,汇编也可以做到,但是想想实现vtable之类的结构,太费劲了吧!除了特别的需要,我想没有人会用汇编写OO程序,而只是写一些子程序给其他的语言调用.我认识一个VB的大牛人(MVP),他会N种语言,但是用VC好的时候,他不会用VB,尽管也可以做到。
对于大部分做工程人来说,如cber所说,行业太重要了,平台和开发工具也太重要了,思想的确是很重要的东西,但是不和实际结合是没有用处的,就好像哲学和具体自然科学的关系一样,你是哲学家,你也许可以说说大概,但要你去做实验,你肯定搞不定.
alula 2003-04-19
  • 打赏
  • 举报
回复
有几句提醒。

>>有些人跳出来,说道:“用什么语言并不重要,关键是编程思想”。

这和<TICPP>, <TIJ> 及其中文译名关系不大。

我多次(至少三次)遇到对我说这些话的人。
他们有个共同特征,就是只有熟用一种的语言(说话的当时)。
我想,说这些话当儿,他们仅仅是想当然的话,或者是跟风的说法。
不管什么原因导致他们如此说,共同点就是:没有经过亲自的去分析和思考的说道法。

每一种语言都提供一套概念作为抽象的基础,不同的语言有各自的重点,这些区别
都要影响人们使用它解决问题的分析起点。
即使是C++,Java这样的具有通用目的的主流语言,他们各自的特性也决定了在问题域上各有适应。
Java 的解释性、简化、虚拟机管理机制、决定了执行效率较C++低。在实时性要求强的应用上,显然要求你作选择。相比C++庞大复杂,Java易学易用;好的C++程序员必须理解机器的体系结构,Java有意把程序员与机器分离;Java的"纯"面向对象,C++则多编程范X;等等的区别有时也是需要作出取舍的原因。

“不同语言决定了解决问题的思维方式” -- <Design Pattern>
书上提出设计模式适用在支持面向对象语言,尤其与面向过程语言比较。

“聪明的程序员,选择最适合解决问题的语言。需要什么语言,就选择什么语言。”--<Rumination on C++>

关于<Thinking in ...>,严肃的人,不要就别表面的附和他人说<xx思想>。
<中国程序员杂志> 2002有登载过对 Bruce Eckel的一次访谈,其中提到确切的含义是
"用...思考",就如同"speak C++ as native language","speak in Chinese","speak in English", ...,

任何对拓展我们能力的工具都是重要的,作为工具的思想尤其重要。

任何事物也都是发展的。
今天我也常常说出很愚蠢的“想法”,但我在不停进步。
谁能断言我明天就不会说出深刻的,以至引起未来人类历史大转折的“梦话”呢? 晕:-

程序员,要严于律己,自强不息。
updatedb 2003-04-19
  • 打赏
  • 举报
回复
c++里面是完全可以看出面象对象的思想的!
在学习好C++(一门工具)的同时,我们写程序最主要是去做什么?
我想是去设计!设计就是一种思想!编程需要一种思想!用不同的工具需要不同的思想!
我初学者,C++还没有学好,只是写程序时有这样的感受,不知道写楼主的"编程思想"是不是一致!
无论怎么样,要成为好的程序员,一定要有思想!--->程序的思想--->编程思想,哈哈哈,当然这是一定局限内的,程序员的其它思想说不定不是编程思想,是吧
glassshark 2003-04-19
  • 打赏
  • 举报
回复
无聊.
wyqiang 2003-04-18
  • 打赏
  • 举报
回复
我今天看看 mode
发现有必要看思想
ixMind 2003-04-18
  • 打赏
  • 举报
回复
应该叫做”编程的哲学“(或者编程之道)
IT范围太广
Grosvenor 2003-04-18
  • 打赏
  • 举报
回复
我说句夸张的话,上了50句的代码就能体现出“思想”来,只是深度不同罢了--这在表面上体现为:1.程序能稳定无误地运行多长时间;2.程序是否能尽可能的运行迅速;3.程序是否能尽量的简洁(就是执行文件小)。--稍微深一点:是否有良好的移植性?是否有良好的可维护性...而且这几个方面是互相矛盾的,只有程序的目的才能决定它们的取舍。所以思想学好了,才能通过相同的函数、指令组合成最佳状态的程序,达到多个矛盾的最佳折中点
eagle2000 2003-04-18
  • 打赏
  • 举报
回复
同意楼主
对于每种语言有其自身的特点,其思想也必不相同
绝不对混为一气,说语言不重要,重要的思想!

love_snoopy 2003-04-18
  • 打赏
  • 举报
回复
比如
《C++设计与演化》讲述的就是在设计C++语言本身时的设计思想。
《C++代码设计与重用》,讲述的是在使用C++的时候为了复用,移殖等目标的思想。〈DESIGN PATTERN〉讲述的是在设计大型程序时降低偶合,增加复用等方面的思想。
STL中的跌代器也是基于容器与算法分开的思想(程序员有一篇文章是STL之父访谈录,里面看看他怎么说的〉

所以小程序可能编程思想不容易体现出来,但是在做大型程序或者写一个通用的C++程序库的时候,编程思想(或者是设计思想)就体现的淋漓尽致。

所以我觉得编程思想是coding的高级阶段,它体现了对问题解法的效率,复用,移殖,偶合等方面的考虑。

设计思想是编程思想的高阶,它体现了设计者对问题的个个细节的取舍,比如为了给程序员自由的空间,BS决定在C++中不引入GC机制(至少是现在)。
answerzy 2003-04-18
  • 打赏
  • 举报
回复
同意楼主
elvahuang 2003-04-18
  • 打赏
  • 举报
回复
思想是个什么?
没有思想还能作什么呢?
只不过你在编程的时候已经用上了但没觉得罢了·
加载更多回复(131)

15,447

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧