开发语言的选择
在软件这个行业里,怕是没有任何一个其话题域像开发语言这样引起争议了。对开发语言是非的争论,不单旷日持久,且深度亦是与时俱进。
实现要强调下的是,在这里我们要专注的是开发语言的选择而非开发语言的优劣。
从不同的视角对开发语言进行选择,其结论可能大相径庭。
从项目的角度看,语言自身特性的多少,强弱往往并不成为一个关键选择因素。好比说某语言支持多重继承,而某语言不支持多重继承,但对大多项目而言多重继承这一语言特性并不成为选择的决定性因素。从项目角度看,某些通常被考虑(或不得不考虑)的因素有:
- 历史的原因。维护升级类项目这类没有选择的选择自不必提,这里说的历史的原因是指这样一类情形:完成某个项目需要某一图形算法库,而公司中只有这类库的C++静态库。这个时候也许可以再做一层封装,但从省力的角度看,很多人可能更愿意选C++。
- 现实的具体的原因,也就是说非这种语言不可的情形。做C51程序的话,恐怕大多数人都会直接想到用C。或者面对需要指针直接对内存进行操作的情形,很多人也自然的会想到C/C++。
- 既有类库(组件等)的丰富程度。比如Windows下,.net中提供的类库要比非管态的C++中多很多。同等情形下,很多人出于生产率的考虑,恐怕会选C#,而不是非管态的C++。
- 配套工具。IDE的丰富程度,单元测试工具,静态测试工具等等。
- 其他还有现有人员的技能,目标性能等因素。极端情形下,团队成员水平较差,那同等条件下就要避免复杂的语言。
总而言之,在做项目的时候,开发语言的选择往往并不是由语言自身特性的多寡而确定的。通常也并不需要做语言特性的完整比较,而后再做选择。
其中一个根本原因在于:就通用编程语言而言,大多的最常用的语言特性是即被这种语言支持,也被那种语言支持的,否则的话这种语言也就不能成为一种通用编程语言。
如果单纯从学习的角度看,那需要考虑的因素与上述不同。
在学习阶段,当我们编制某个程序的时候,与程序结果相比,更应该关注的是过程,也就是究竟学到的是什么。
就编程而言,不论编制任何程序,在学习的阶段,其根本目的更应该是加深我们对编程所面临的本质问题的体会。这也就可以推导出学习阶段编程语言选择的一些基本约束:
- 远离RAD。在这里RAD包括,但不限于可视化编程,应用框架等等。RAD相关联的东西可以帮助我们快速达到结果,但会减少我们对程序本质进行思索的机会。因此和RAD关联过于紧密的语言,不适合作为学习的语言。
- 选一种支持多范式的,支持大多现代语言特征的编程语言。强调多范式的一个根本原因是很多时候我们要知道我们究竟有多少选择。就一般论而言,偏于一极通常是不对的,所以强调一切皆是对象的语言必然因此导入其他限制。至少我们应该知道世上还有结构化分析和设计方法。强调现代语言特征是因为,我们很难在不支持类的语言中学习面向对象,在不支持模板的语言中学习泛型。
- 选一门可以贯通软硬件的语言。在今时今日开发网页的时候可能完全不需要对计算机体系结构,对操作系统有所了解。但从发展的角度看,一旦我们需要对某些较大规模的产品整体负责的时候(比如:系统集成等等)了解这些基础知识的必要性就会凸显出来。从结局来看,肯定不可能每个士兵都成为元帅,但在起点上就决定了一个人必须一直当士兵的安排,多少是有点不恰当的。
读完上面的原则,很多人会发现,最终可能还是C++这类非管态的语言更适合于打基础。
这确实是我的观点。从学习的角度看,首选语言应该是C++。在很多场合C++自身的宽泛性和复杂性会成为其自身的弱点,但从学习的角度看,这却成为它的强项。C++的C语言子集可以帮我读懂类似《深入理解计算机系统》这样的书,C++的抽象数据类型,面向对象特征和泛型特征可以让我们对程序的本质问题有多个视角的考察。甚至这门语言也可以帮助我们认识面向对象这样一种方法的缺陷。
这是完全不功利的观点,一旦结合起来那个有助于赚钱,那就是另一个复杂的话题了,一时半会说不清楚的。
--------------------------------------------------------------
理想流 + 软件 = 《完美软件开发:方法与逻辑》
理想流 + 人生 = ??
理想流 + 管理 = ??
理想流 = 以概念和逻辑推演本质,追求真理。