计算机相关产业的进化速度总是让人咋舌,如今随便一个手机的运算能力就超越了少几年前一般台式机的能力,这对使用者来说是好事,对程序员来说更是好事。倘若计算机性能强大到让开发者不用顾忌时间、空间复杂度,一切算法、优化什么的也就完全没了意义,毕竟这些东西都是为了我们能更划算的完成尽可能多的任务。但写出能让人长期维护扩展下去的程序比写让机器高效运行的程序难度大的多,机器性能的增强也不会直接促使程序员写出更优雅的代码,不然怎会看到专门收钱帮项目做设计模式、软件工程的顾问公司却没有做算法顾问的。
记得我曾经做一个项目有一个c文件有5000行,后期在解决跨编译器移植性问题时TC竟然都不能完全加载整个文件,更别谈顺利编译,不得不放弃这个编译器。想来c/c++通过包含头文件以c/cpp为编译单元,再将所有编译单元生成的目标文件连接为可执行文件的编译方式应是受制于计算机早期性能有限,特别是内存资源珍贵无比,一个小点的项目还好,把大项目的所有源码或其AST、符号表等东西都加载进内存就不现实了,于是无奈的只能划分成单个c/cpp编译单元进行操作。因为使用头文件包含做语法分析和部分代码生成,便随之可能产生循环包含、引用的问题,当然,这些都是可以避免的。
现代的高级编程语言环境一般都伴随很多较早期高级语言更智能的特性,比如功能更强大的IDE,代码着色,代码自动完成,类型提示,类型自动推导,注释文档提示,无头文件包含编译等,哦对了,把所见即所得的界面编辑也姑且算进去吧。需要付出的开销,或者说代价就是更大的内存占用,编译器/IDE将内存用于存储整个工程所有源码的AST、符号表,甚至是注释信息,即使程序员还没有点任何编译按钮。
我们希望机器更聪明,这也是一代代从业者努力的目标;更希望机器能摆脱人的干预自己就可以聪明的解决一些问题。语言越来越智能,编程貌似越来越简单,但正如刚才说的,只要像Java、C#这些较新(一般还都是在智能IDE中敲代码)的高级语言给了程序员只要import/using后就可以使用作用域内全盘任意的东西的能力,经验欠缺的程序员用它们写出循环引用、静态变量过多的代码的障碍就会较使用c/c++小很多。我不得不说自作聪明的高级语言会惯坏初级程序员,如果想学编程,先用功能看起来笨些的语言入门吧,用的久了自会分辨出大巧与真拙的区别。无边界效应的函数式编程语言也许能在编程范式上较指令式编程语言更有益于程序员养成好的习惯,可惜这类国外的基础甚至入门实践在国内乏人问津。
语言本身并无功过是非,可是越是智能的语言越是难以让程序员领会到怎样写出更好更易维护的代码,除非写程序的你不甘计算机的真相被埋没在它聪明的背后。
充分理解业务上的知识也是非常重要的,这些自动化的东西就是为了避免重复造轮子,避免陷入底层代码的海洋。如何制造一个世界上最好的轮子,和如何最出色的使用这个轮子完全是两个不同的领域,世界上最出色的建筑师可能并不知道如何制作一把世界上最好的锤子,那是世界上最好的造锤师傅干的活。
唯一的区别在于,做底层做框架的人的客户就是上层业务的开发人员,而上层业务的开发人员的客户就是最终购买产品的消费者。无论你在哪一层,你的最终目的就是要让你的用户觉得你的产品好用,如果你的用户还需要来学你的产品是怎么做的,那还要你干什么?
其实,并没有谁比谁更高端~有的只是无尽的虚荣心和优越感。
本文地址:http://www.nowamagic.net/librarys/veda/detail/1536,欢迎访问原出处。