只有懒惰的程序员才会去编写那些可以最终代替自己工作的自动化工具,才不会成天为了实现相似的功能去编写大段大段冗余重复的代码 - 这种代码往往是软件后期维护和重构的天敌。通常来说,由于惰性的驱使所产生出来的工具和程序将最终极大的提高生产开发的速度。

  当然,对于一个程序员来说,光光具备懒惰这个要素还是不够的。在享受懒惰之前,他必须以最大的热情和最高的效率去研究解放自己的途径,比如:找到最有助于开发的工具,最能体现“一次编写,多次复用”精神的代码架构的设计。只有在这些必要的工作之后,才可能真正享受轻松编程的乐趣。

  所以“懒”的精髓用一句老话来描述,那就是磨刀不误砍柴功。如果你不想办法磨亮手中的柴刀,就算一天二十四小时都在砍柴,效果也不如拿把锋利的斧头一天只砍一小时。

  从这个角度来说,Google给员工的20%自由时间是完全发挥了“懒”的能动力。为了更好的享受偷懒的乐趣,员工会更加具有创造力的去高效完成自己的任务。

  夸张一点来说,懒惰才是人类进步的原动力。

   这一点似乎比懒更让人不能接受。在解释这里所说的笨的具体含义之前,我们先看看一个聪明人(或者说认为自己足够聪明)会做什么:

  1) 停止学习新的东西
  2) 不愿意用批判的眼光去审视自己的工作

  第1点将使我们很难去接受或者主动的去研究一项新的技术 - 即使新技术能带给他更多工作上的便利。第2点会使我们无法清晰的分析自身工作的问题所在,要对其进行改进或者重构就更加困难。

  从这两点来考虑,作为一个程序员太自以为是不见得是件好事情。由于对自身的过于自信,往往无法客观的看待自己和自己的工作。相反的,笨一点(确切的说,谦逊一点)有时候倒有助于开发的顺利进行。举例来说,当程序出现bug的时候,最好尽早承认问题是出在自己编写的代码上面而不是在于编译器(当然除非是字节高低位编码方式之类的问题,这种问题编译器会是错误的根源之一)。如果你太自负的认为自己的程序没有问题而去猜测可能是编译器或者其他的什么外部因素出问题的话,那么十有八九你会在调试过程中走上一长段的弯路。

  程序员应该笨一些的更为关键的原因在于,当需要思考问题的最佳解决方案的时候,往往要求我们首先要跳出思维定式。你对系统了解的越多,积累了越多的经验,就越难走出已有的局限,可以尝试的范围就越小。相反的,对于一个什么也不懂的门外汉来说,因为没有任何失败的记忆和潜规则的约束,也就没有什么是“不可能”的,这样的大脑所能迸发出来的在专业人士看起来愚不可及的想法往往正是解决问题所需要的关键点所在。

  可能很多程序员都会有类似的经历,在面对别人(尤其是其他部门)对于一个bug的描述的时候,必须把自己摆在一个普通用户而不是程序开发者的角度来分析问题,否则的话可能你永远都想象不到这种错误也会发生。越能让自己变得“笨”起来,越能很快的定位到问题所在。我们先看看这么一段关于web开发问题的程序员和客服人员的对话:

  “从昨天开始我们的用户就看不到我们站点上的Logo了。”
  “他试过重启浏览器么?”
  “是的。”
  “他试过重启电脑么?”
  “是的。”
  “他清空过浏览器Cache么?”
  “是的。”
  “他的浏览器版本是IE6么?”
  “是的。”
  “他确信是真的看不到Logo了么?”
  “是的。”
  “他是在电脑显示器屏幕上看我们的站点么?”
  “什么?”
  “比如说,它可能是打印出来看不到?”
  “不。他是在显示器上看的。”
  “除了站点Logo之外,他是不是其他的图片都看不到?”
  “什么?哦。我再问问他。”

  从这段对话来说,估计用户实际上是禁止了浏览器显示图片的功能(或者他儿子干的)。不管怎么样,如果你不是用这种傻瓜式的思维方式去寻找答案的话,可能怎么也找不到问题的根源。  很多时候,问题发现者对于问题的描述往往是非常片面的,并且加上了主观推测的成分在里面。如果你不能透过这些主观的描述去发现问题的实际表象,或者说根本就是你自己根据程序员的经验逻辑来判断问题所在的话,十有八九会在歧途上越走越远。

  对于白痴级的问题,只有用白痴的行为方式才能得到答案。

  即便同样是程序员,但对于你的程序并不熟悉,也会经常有这样的疑问:“为什么我调用你的代码出错了?”这种问题的答案,很多时候是因为他们的调用方式不对,或者调用了错误的库文件,或者库文件的版本使用不当,或者根本就没有联接到库文件上。当你想让同事帮你检查一下程序中的一个莫名其妙的bug的时候,一般来说希望他对你的系统了解的越少越好,只有这样他才会问一些你自己认为绝对不可能出问题的“笨”问题。

  所以“笨”的精髓在于你如何去思考问题:不要假设些什么,把自己假设的太完美或者把别人假设的很聪明都会使你忽视一些很浅显的事实。思考的前提必须是完整的事实表象,思考的过程必须是抛弃成见的问题跟踪。在发现事实之前作太多的主观思考和臆断,倒不如把自己当作白痴一样来行动更好。

  当然,不思考的一个极端是不分情况都直接去做,另一个极端是完全脱离事实,用思想办事。一个优秀的程序员应该做好权衡。10次决定里面的1次错误决定不是致命的;只做5次正确的决定而另外5次没有任何决定才更糟糕。

  最后是一个蜈蚣的故事。蜈蚣本来用自己的几百只脚走路走的很快很好,但他从来没有花时间去想过为什么。直到有一天,一只臭虫问他:“你是怎么管理好你的几百只脚的?你不觉得这是件很困难的事情吗?”臭虫问完之后就走了。只剩下蜈蚣坐在地上,不停的思考这个问题,却一直想不出个究竟。从此以后,这只蜈蚣再也没办法好好的走路了。

转载于:https://www.cnblogs.com/flying_bat/archive/2005/10/30/264978.html

优秀程序员的两大要素:懒 + 笨相关推荐

  1. 优秀程序员最重要的两个能力

    [回复"1024",送你一个特别推送] 我之前,应该是好久了,写过一篇文章就是:程序员的核心竞争力.但是我现在回想看来,感觉之前写的不是很准确.或者说随着自己经验和阅历的增长,对于 ...

  2. 优秀程序员和一般程序员差别在哪?

    摘要:在这个世界上有两种程序员:Day Programmers(白班程序员)和Night Programmers(夜猫子程序员),你知道优秀程序员和一般程序员有哪些差别吗?你又是哪一类型的呢?俗话说不 ...

  3. 优秀程序员应该具备哪些素质?

    你可以不聪明,但是你绝对不能不用心. --<女人公敌> 程序员求职是本是一件只要"郎有情女有意",一拍即合的事情,可是企业与求职者却总是看不对眼,进而导致IT市场上总是 ...

  4. 优秀程序员和普通程序员都是怎样过完一天的

    (点击视学算法公众号,可快速关注) 普通程序员的一天,可能是这样的. 早晨到公司,想一想今天有哪些事情需要处理.打开记事本,按照上面的要求的任务一条一条开始做. 昨天项目经理说,客户对聊天模块的文件传 ...

  5. 成为优秀程序员的方法就是抛开编程?

    原文:How To Become a Better Programmer by Not Programming 作者:Jeff Atwood 我在2006年写过一篇题为"Programmer ...

  6. 优秀程序员的秘密|宝贵经验分享

    源作者:Edmond Lau 来源:程序师 更新整理:极客重生 优秀程序员是稀缺的,你只要问大厂面试官:你们还招人吗,他肯定会说:一直在招人,为什么会一直在招人呢,HC真的有那么多吗?真实情况是,面试 ...

  7. 简单的计算机程序代码,优秀程序员通过简单代码,窥探电脑编程中强大的数组操作功能...

    优秀程序员通过简单代码,窥探电脑编程中强大的数组操作功能.编程语言中,数组是一个非常重要的概念,也是一种很常用的类型.本文中通过javascript语言的代码实例,展现编程中数组的魅力.在javasc ...

  8. 优秀程序员的开发效率是普通程序员的 10 倍,那么如何提升呢?

    1975 年,弗雷德里克·布鲁克斯(Frederick Brooks)出版了软件行业的名著<人月神话>,他给出了一个统计结果,优秀程序员的开发效率是普通程序员的 10 倍.40 多年过去了 ...

  9. 成就优秀程序员的很多因素你知道多少?

    程序员想变得更牛逼吗? 导读:编程虽是复杂活,但成就优秀程序员的很多因素和我们在学校中最早学到的相差无几. 1. 分享所有 尽可能使用开源,并且当你有能力的时候,要对其有所贡献.聚全社会之智慧,胜过某 ...

最新文章

  1. 如何用初中知识理解机器学习到底在干什么事情
  2. Nginx配置:nginx如何配置跳转fpm
  3. mdpi的手机_【初印象】Android手机屏幕适配API:nodpi,xhdpi,hdpi,mdpi,ldpi
  4. 【css】如何实现响应式布局
  5. 万字详解:腾讯如何自研大规模知识图谱 Topbase
  6. Kubernetes学习之路(四)之Node节点二进制部署
  7. linux怎么用命令备份数据库,使用linux的mysqlhotcopy命令备份数据库
  8. git学习(7):创建ssh key时遇到“Bad escape character ‘ygen’.”
  9. windows上搭建NFS服务器
  10. python日志处理_Python之日志处理(logging模块)
  11. 《啊哈 C语言》读书笔记
  12. sketch up rbs/rbz/rb插件安装方法
  13. ciscn 2020 Misc the_best_ctf_game
  14. android 自定义indicator,【Android】TabLayout 自定义指示器 Indicator 样式
  15. 怎么查看php-fpm的错误日志,php fpm如何开启错误日志
  16. linux加载的驱动无法卸载,linux驱动加载后不能再卸载
  17. 平头哥智能语音CB5654开发板如何读取云端的返回值
  18. RocksDB 架构
  19. 子网掩码和prefixlength
  20. springBoot+springSecurity验证密码MD5加密

热门文章

  1. TensorFlow入门--实现多层感知机
  2. Indian Buffet Process(印度自助餐过程)介绍
  3. selenium的安装
  4. 网络爬虫中的Unicode码解决[实例]
  5. Hypermesh+Abaqus加载问题
  6. hp服务器增加raid卡,惠普ProLiant服务器Raid卡配置过程详解
  7. 监听器Listener
  8. 【读书笔记0102】Beginning linux programming-3rd
  9. java io 模型_五种 IO 模型
  10. spring ioc原理_这70 道Spring高频面试题,你不好奇吗?