<style type="text/css"> <!-- p, li {white-space:pre-wrap} --> </style>

“代码是写给人看的,而机器码才是给机器看的。”

在给新生进行的培训课程上面,我又一次给尚未对编码世界有任何了解的同学做了如上的阐述,字字铿锵有力,不带半点犹豫。

想想看来,作为一个现在很多书上都会提到的观点,上面那句话已经成为了像我一样刚入编码世界不久,但是认识不深,却又渴望找寻公理的后生们公认的不二法门了。

于是,我们在平时编写代码的过程中便不断提醒自己,”代码是写给人看的“,所以我们的代码会很服服贴贴地遵循一些大家公认的,会让代码变得更易让人看懂的”规矩“——代码风格、编程范式甚至框架约束等等。

可这几天转念一想,这句话里面偏偏很可能存在着某种谬论吧。

暂时先不提这个谬论,我们先来举举现实生活中的例子——这样待会提出这个我觉得有些谬误的谬论的时候,你才不会在思维惯性之下,立马认为我这是一纸胡诌。

人类可以超脱于其他生物而成为这个星球的最大、最强的宿主,很大的一个原因就是因为我们会利用各种工具。

古老的牛车、现代的车床等等,都是很经典的工具。但是我们有没有在这些工具上面听到过这类言论呢——为了保证驾驶牛车的农夫的舒适度,我们可以把给牛车配备的装备的质量降低一些,再把这些节约下来的开支用来给农夫买一个更舒适的牛车坐垫;为了保证车床车工工作的效率,我们可以让车床本身执行一些不必要的操作——例如让它运行的转速比标准的更慢一些,好让车工能够更精细地操作他的仪器。

据我所知,在这些比较成熟的工具中(至少存在的历史长于计算机),类似于上述的说法往往是比较荒谬的——因为如果按照上面的说法去进行所谓的提高人工作效率的改变,那往往我们的活儿就没法按时干完了。

而在软件开发这个行业中,我们一直在走上面所述的在其他领域看来比较荒谬的路——我们一路过来都在把软件开发变成一种对人而言的更为舒适,更为高效的工作,但是却一直都没有把机器工作的效率的提高作为我们的主要发展目标之一。

这便是我刚才提到的让我有些疑惑的”谬论“。

让我们看看编程语言的发展路线,便能够更进一步了解这种趋势了。首先我们早期的程序员在纸带上打下一行行代表机器码的孔洞,然后交给机器处理;接着我们发明了机器码的对应符号语言——汇编语言,让我们走出了”用硬件编写软件“的时代——但是我们终于和原原本本的机器之间有了汇编器这个隔阂;然后我们还是不满足,发明了抽象层次更高的c语言、pascal语言等中低级语言,而且后来为了迎合object oriented programing的范式,发明了c++——这些工作让我们的代码和机器之间有了编译器和汇编器两层隔阂;接着我们又发明了java、c#这些平台化的语言,于是这些隔阂里面又多了一层解释器;更为近期的动态是,我们发明了完全解释执行的语言——例如perl、ruby、python等,而这时我们的代码和机器之间加上了最为笨重的解释执行器;最为极端的是DSL,领域专属语言,例如sql——我们甚至都不再告诉机器该怎么做了,而仅仅告诉机器做什么即可(Don't tell the machine how, just tell the machine what.)——而此时,我们和机器之间的距离就如同在摩天大厦水泥楼顶的人和地面沃土之间的距离了。

是的,我们一直都在努力,让人的效率变的更高——这么做的代价是让机器的工作效率变的更低。

不知道大家听说过安迪-比尔定律没有。

这个定律是目前IT业界发展遵循的三大定律的之一——其他两个定律分别是大名鼎鼎的摩尔定律和它的反定律,反摩尔定律。

安迪-比尔定律中的安迪指的是Intel公司的总裁安迪格罗夫,而比尔就指的是大家都认识的比尔盖茨。定律最简明的阐述是:安迪提供了什么,比尔就拿走了什么。

什么意思呢?

一句话概括来说,安迪的Intel公司遵循摩尔定律给IT业界带来的18个月翻番的计算能力,都被比尔盖茨的新版Windows占有、拿走了。

更通俗点讲,为什么我们需要不停的更新电脑来为微软的最新操作系统铺路呢?为什么和我们两年之前的电脑相比有两倍多的计算能力的新电脑,在今天却还是仅仅只能刚好配的上最新的Windows——甚至是很勉强的那种呢?

答案很简单——比尔拿走了安迪费了好大力气整过来的计算能力,而且是以一种很鲁莽的方式——和以前相比越来越低效的、越来越不机器友好的代码。

比尔本人也对他的员工发过类似的牢骚——”我早年用汇编搞的Basic,整个环境也就三百多k,而你们现在搞的.NET,大约三百多兆。但是.NET真的相对于Basic强了一千多倍吗?显然不是。“

跟着我的叙述,你也应该开始在心目中形成了一种观点——确实,我们软件开发的发展道路过于有些倾向于人的工作效率了——人在这个领域中被溺爱了,而同样很重要的工具本身被我们打入冷宫,成为了第二个考虑的因素。这个观点的正确与否我们姑且不予置评,但我们应该了解的是它必然存在一定的说服力。

那现在就引出了一个问题——究竟是人的效率,还是机器的效率更重要?

关于这个问题,或许会像一些本身就无法下定论的问题一样,大家分成两派,然后进行激烈的讨论甚至辩驳——然而终究是得不出一个一锤子钉死的结论的。

如果这个问题本身就有它的争执性的话,那我就姑且不班门弄斧说自己是哪个门派的了,我就仅仅阐述自己的几个比较原则性的观点吧。

第一个是中庸,抑或可以被称之为平衡。如果一个事物有两个都不能割舍的而且相互对立的方面的话,那这个事物发展下去,最终只有一个结果——它们找到平衡,从而让这个事物稳定下来,找到最终的形态。

第二个来自敏捷宣言,人和交互重于过程和工具。

第三个是我的c语言老师的名言——年轻人要有恒心,敢于深入底层,并知道机器在做什么。你机器在做什么都不知道,那你何来机器跑起来很舒服的代码?

呵呵,虽然说我不表达我的支持的论点,但是我想你也应该对我不言自明的想法有一定的了解了吧?

那,人的效率和机器的效率各自的重要性,你是怎么看的呢?

人的效率还是机器的效率?相关推荐

  1. 图灵社区 : 阅读 : [讨论] Java语言被很多人抱怨语法繁琐、开发效率低、体系繁杂而笨重,为什么还有这么强的生命力,尤其是在企业软件领域?...

    图灵社区 : 阅读 : [讨论] Java语言被很多人抱怨语法繁琐.开发效率低.体系繁杂而笨重,为什么还有这么强的生命力,尤其是在企业软件领域? 图灵社区 : 阅读 : [讨论] Java语言被很多人 ...

  2. 职场人必看:提高工作效率的6大法则

    提高工作效率的6大法则 01.先做最麻烦的事 02.建立未做事项清单 03.利用好碎片时间 04.给每一个工作任务限定时间 05.提前准备下一步 06.总结和思考 参考 进入职场, 你是否曾通宵达旦的 ...

  3. 懒人可以用Automator提高工作效率

    转载请注明出处:http://blog.csdn.net/horkychen Mac OS里除了Apple Script, 还有一个更简单的自动化工具Automator,恰当运用可以提高工作效率. 下 ...

  4. mysql的执行效率_数据库执行效率的对比测试

    今天看了一篇很有意思的文章,对比数据库和普通编程语言的效率测试, 测试的语言分别是mysql的存储过程,oracle plsql和perl. 测试机器是同一台机器上,测试标准是计算100万次的cos函 ...

  5. 效率app有哪些?效率便签app免费推荐

    每个人一天都只有24小时,如果想要超越他人,那么提高效率就是法宝.那么该如何提高效率呢?提高效率的APP又有哪些! 随着人们对效率越来越重视,手机软件商城里的效率APP也越来越多.本人亲测好用,可以帮 ...

  6. 水平拉滑轮组计算机械效率的题,机械效率杠杆论文,关于中考物理机械效率计算题*相关参考文献资料-免费论文范文...

    导读:这篇机械效率杠杆论文范文为免费优秀学术论文范文,可用于相关写作参考. 简单机械的机械效率计算是中考必考点,分值为6-8分.题型涉及选择题.填空题.探究题.综合计算题.所以学会解答简单机械的机械效 ...

  7. 如何评判软件测试的效率,如何衡量测试效率,提高测试效率?

    "根据系统测试发现缺陷数来衡量测试人员的系统测试效率,测试执行效率",这种方法是很片面的.它的优点是便于统计和分析,缺点是只通过一个方面考核了测试效率等,漏掉了很多其他因素. 那么 ...

  8. Java List去重 Lis集合去重 List去重效率对比 List去重复元素效率对比 List去重效率

    Java  List去重 Lis集合去重 List去重效率对比 List去重复元素效率对比 List去重效率 --- List 去重复元素的几种办法 一.概述 面试的时候,有个常见的问题:" ...

  9. MATLAB的超效率SBM-DEA模型代码 可以做期望产出和非期望产出的超效率和非超效率sbm模型和Malmquist指数和分解

    MATLAB的超效率SBM-DEA模型代码(有安装教程和内容讲解之类的东西),操作很简单 可以做期望产出和非期望产出的超效率和非超效率sbm模型和Malmquist指数和分解 ID:669695527 ...

最新文章

  1. 美团点评资深产品专家刘远飞:了解业务要弄清楚这三个问题
  2. mysql shell 回车换行_【shell mysql 导出数据到csv脚本,完美解决乱码转义符等问题】-费元星...
  3. LVS入门篇(五)之LVS+Keepalived实战
  4. 23种设计模式(五)单一职责之装饰模式
  5. 微信小程序 选择微信自带的地址 用户授权选择了拒绝
  6. 问道虚拟机服务器地址,【问道1.60.0905】虚拟机手工启动服务端+配套客户端+配套工具+充值注册软件+启动教程...
  7. Zotero——论文管理神器
  8. 概率论和数理统计知识点汇总
  9. 软件测试按照各种方式分类
  10. c语言一个笼子里关了鸡和兔子,成年后的你是否还质疑 古人为什么把鸡和兔子关在一个笼子里...
  11. 从头再学java系列之char和Character的区别及Character的源码分析
  12. PTA Python习题 找钱
  13. 网页二维码生成器纯js代码带logo图纯前端合成
  14. Latex技巧:LaTex插图命令includegraphics参数详解
  15. 数据,数据元素,数据项,数据对象的区别
  16. Python爬虫天涯论坛美图
  17. c语言一维数组字符串数组初始化,一维数组的定义、初始化和引用
  18. PostGre使用总结
  19. 纽约大学计算机学,纽约大学计算机科学硕士
  20. SpringBoot实战(四):SpringBoot整合Redis

热门文章

  1. Python数据可视化1.5 可视化图像
  2. MAC系统关闭IPV6命令
  3. 用批处理读取特定注册表项的路径值
  4. n!的分解 soj 2666
  5. EmitMapper,AutoMapper,NLiteMapper和手工映射性能大比拼
  6. 10-RabbitMQ-整合SpringBoot
  7. 学习日记0802函数递归,三元表达式,列表生成式,字典生成式,匿名函数+内置函数...
  8. # 20155224 第十一周 课堂练习《计算后缀表达式的值》
  9. CentOS查看CPU,内存,位数行等信息命令
  10. 【转】HTTP协议之multipart/form-data请求分析