从网上看到的,感觉挺不错的!

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules. Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch. Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea. If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
  • 小即是美。
  • 让程序只做好一件事。
  • 尽可能早地创建原型。
  • 可移植性比效率更重要。
  • 数据应该保存为文本文件。
  • 尽可能地榨取软件的全部价值。
  • 使用 shell 脚本来提高效率和可移植性。
  • 避免使用可定制性低下的用户界面。
  • 所有程序都是数据的过滤器。

    选一个样板,follow 之

      每个 NBA 新秀都有自己的样板,我们也总习惯称某足球新星为『小罗』,『小小罗』。样板为你提供了可模仿可追赶的对象,同时也让你审视自己究竟想成为什么样的程序员。我的样板是 Greg Pass 和 Werner Vogels,虽然我这辈子可能也达不到他们的高度,可这并不妨碍向着我心目中的明星一步步靠近。

    写代码,而不是调代码

      写软件最糟糕的体验恐怕是边写边调,写一点,运行一下,再写一点。是很多程序员都会这么干。原因有二:1. 不熟悉相关的代码(类库),需要边写边运行保证代码的正确。2. 现代编程语言的 REPL (Read-Evaluate-Print-Loop,就是语言的 shell)能力助长了这一行为。

      写系统软件的人很少这么做。他们手头糟糕的工具让边写边调的行为成为效率杀手 —— 如果稍稍改动,编译就要花去几分钟,甚至更长的时间,你还会这么干么?所以他们往往是写完一个模块,再编译调试。(由此看来,高效的工具有时候是把双刃剑啊)

      我觉得写代码就跟写文章一样,构思好,有了大纲,就应该行云流水一样写下去,一气呵成,然后回过头来再调整语句,修改错别字。如果写完一段,就要回溯检查之前写的内容,效率很低,思维也会被打散。

      靠边写边调做出来的代码还往往质量不高。虽然局部经过了雕琢,但整体上不那么协调,看着总是别扭。这就好比雕刻,拿着一块石头,你先是精修了鼻子,然后再一点一点刻画面部。等修到耳朵的时候,鼻子可能过大或过小,即便再精美,它也得不到赞赏。

      聪明地调试

      软件总会出问题。遇到问题,很多程序员就会用 IDE 在各种可能的地方加断点调试,如果没有 IDE,那么各种 print/log 手段一齐抛出,有枣没枣打一杆子再说。

      优秀的程序员会在撰写代码的时候就考虑到调试问题,在系统关键的节点上注入各种等级的调试信息,然后在需要的时候打开相应的调试级别,顺藤摸瓜,避免了不靠谱的臆测。这是调试之『道』。

      很多问题打开调试开关后就原形毕露,但有时候靠调试信息找到了初步原因,进一步定位问题还需要具体的工具,也就是调试之『术』,如上文所述之断点调试。有些时候,遇到靠类似 gdb(如 python 的 pdb)的工具无法解决的问题时(如性能问题),你还需要更多的调试工具做 runtime profiling,如 systemtap。

      使用标记语言来写文档,而非 word/power point

      不要使用只能使用特定软件才能打开的工具写文档,如 word/page 或者 power point/keynote。要使用『放之四海而皆可用』的工具。

      java 的市场口号是:『一次编写,到处运行』,对于文档,你也需要这样的工具。Markdown (md) / Restructured Text (rst)(以及任何编辑语言,甚至是 jade)就是这样的工具。通过使用一种特定的文本格式,你的文档可以被编译成几乎任意格式(html,rtf,latex,pdf,epub,...),真正达到了『一次编写,到处运行』。最重要的是,由于逻辑层(文章本身)和表现层(各种格式,字体,行距等)分离,同样的文档,换个模板,就有完全不一样的形象。

      除非必须,我现在所有的文档都是 md 或者 rst 格式。

      一切皆项目

      程序员的所有产出应该项目制。软件自不必说,文档和各种碎片思想也要根据相关性组织成项目。举一些我自己的例子:

    • 我的博客是一个名叫 jobs 的 github 项目
    • 我的微信文章全部放在 craftsman 这个项目中
    • 我学习某种知识的过程(比如说 golang)会放在一个或若干个项目中
    • 我工作上每个项目的各种产出(包括会议纪要)会按照项目对应生成 git repo

      项目制的好处是具备可回溯性。每个项目我可以用 git 来管理,这样,几乎在任何一台设备上我都可以看到我之前的工作。想想你三年前写的某个文档,你还能找到它么?你还能找回你的修改历史么?

      项目制的另一大好处是可以在其之上使能工具。比如说你看到的这些微信文章,我随时可以

    make publish YEAR=2014

      来生成包含了 2014 年我所写文章的 pdf。

      心态开放,勇于尝试

      在程序员社区里,语言之争,系统之争,软件思想之争几乎是常态。python vs ruby,go vs java vs erlang vs rust,scala vs cljure,OOP vs FP,iOS vs Android。其实不管黑猫白猫,抓到老鼠的就是好猫,facebook 还用 php 呢。程序员应该用开放的心态去包容新的技术,新的思想,勇于尝试,而不是立即否定。这个世界最悲哀的是,手里有把锤子,看什么都是钉子(或者说,眼里就只能看见钉子)。

      我接触 mac 时间不过三年。可这三年时间,我从对 mac 不屑,到深深热爱,最终成为 mac 的一个重度用户。很多东西用过才知道,不尝试不接触我可能永远活在自己下意识构筑的无形之墙的另一边。

      最近的两年里我学习了 erlang,golang,scala,还看了一点点 clojure 和 rust。目前我热衷于 golang 开发,但并不妨碍我继续拥抱 python 和 nodejs。每个程序员要在不同的层级上有一门主力语言,比如说我:

    • 系统级(realtime):C (可能以后会是 rust)
    • 系统应用级(realtime):erlang(养成中)
    • 系统应用级(非 realtime):golang(养成中)
    • 应用级:python
    • Web 后端:python,nodejs,golang
    • Web 前端:javascript
    • 设备端:Android Java(暂无计划)

      这个列表你不必参考,我只是想用此来说明心态越开放,你看到的世界就越大

     
  • 小即是美。
  • 让程序只做好一件事。
  • 尽可能早地创建原型。
  • 可移植性比效率更重要。
  • 数据应该保存为文本文件。
  • 尽可能地榨取软件的全部价值。
  • 使用 shell 脚本来提高效率和可移植性。
  • 避免使用可定制性低下的用户界面。
  • 所有程序都是数据的过滤器。

高效能程序员的七个习惯【csdn】的更多相关文章

  1. 《高效能程序员的修炼》读后感 By Yong Zhang

    想不到我工作中经常GOOGLE搜寻技术问题的stack overflow网站的创办人竟然是<高效能程序员的修炼>一书的作者!看了一遍全书,果然名不虚传. 本书更多的从人文角度而非技术角度去 ...

  2. 促使团队紧密协作[高效能程序员的修炼-N1]

    在Jeff看来,团队里最重要的事情,是人与人之间地协作和沟通!所有的问题,其实都是人的问题.“不管什么问题,那总是人的问题”-温伯格.即,让你和团队陷入困境的最快的方法,就是认为技术是决定性的因素,而 ...

  3. 高效能Windows人士的N个习惯之一:启动篇

    接触电脑十多年,经历了各种折腾阶段,这几年开始沉静下来,不再追求花哨的界面与应用,只注重工作的效率,逐渐养成了一套自己的操作习惯,感觉不错,特撰文分享.标题借用了一下<高效能人士的七个习惯> ...

  4. 高效程序员的45个习惯·敏捷开发修炼之道(Practices of an Agile Developer)读书笔记

    首先,这本书值得再看一遍——这次的阅读,有很多东西都是知其“形”,不知其“神”的,这导致了我对其中某些建议持怀疑态度,接受了的建议也有待商榷. 总之,先记录本书的一些信息: Practices of ...

  5. 成为优秀 Node.js 程序员的10个习惯

    JavaScript出现近二十年了,但由于其有些问题不能解决,使得像Python和Ruby这一类的语言很吸引人,这些问题包括命令行接口.交互式开发环境.包的管理和没有一个有组织开源社区等.幸亏Node ...

  6. 做高逼格程序员之说走就走的「Windows」

    简介:随着移动固态硬盘越来越便宜,网上逐渐出来一个黑科技.Windows To GO见名知意.简单来说就是在U盘或者是移动固态硬盘上安装Windows系统.达到即插即用. WTG 简介 Windows ...

  7. 做高逼格程序员之说走就走的「Linux To Go 」

    简介:想拥有一个Linux,在自己的电脑上安装双系统太麻烦.想和WTG一样,随插随用. 使用LTG的好处 安装.修复系统:配置好后的Linux系统极其强大. 工作中我们同样可以使用这个系统,回到家里插 ...

  8. 我为什么鼓励程序员写blog

    工程师该怎样才能突破自己的能力瓶颈?写 blog! 工程师该怎样精进自己在职涯上所需要的能力?写 blog! 工程师该怎样才能保持学习与成长的动能?写 blog! 工程师该怎样才能证明自己的潜力与特质 ...

  9. 程序员大牛 Jeff Atwood 的两本中文书

    程序员大牛,StackOverflow.com创始人之一--Jeff Atwood 英文博客:http://blog.codinghorror.com <高效能程序员的修炼>,人民邮电出版 ...

随机推荐

  1. TOJ3216 我要4444

    传送门  http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3216 时间限制(普通/Java) ...

  2. PHP遍历数组常用方式(for,foreach,while,指针等等)

    1使用for循环遍历数组 count($arr)用于统计数组元素个数         for循环只能用于遍历,纯索引数组!!如果存在关联数组,count统计两种数组的总个数         使用for ...

  3. vue 登录前做校验this.$router.push(location)

    有很多按钮在执行跳转之前,还会执行一系列方法,这时可以使用 this.$router.push(location) 来修改 url,完成跳转 例如:登录按钮,点击时需要先判断验证码等是否正确,此时

  4. jquery 事件委托(利用冒泡)

    将事件绑定在父元素上,格式$(父元素).on("事件名称","子元素选择器",function(方法体){}) <!DOCTYPE html> &l ...

  5. [Java笔记]面向对象-单例模式

    单例模式 目标 使JVM中最多只有一个该类的实例,以节省内存.缺点:只能建一个该类的实例. 实现 具体实现思路: 1构造方法私有化//故在外面不能new很多次 2对外提供一个公开的静态的类方法,获取类 ...

  6. maven 转化gradle

  7. 转:css知多少(12)——目录

    <css知多少>系列就此完结了.常来光顾的朋友可能会觉得突然:css的知识点还有很多,怎么突然就完了,还没讲完呢?这样说是对的.不过凡事都有一个定位,如果盲目求多,定位模糊,那样就没有目的 ...

  8. docker从私有镜像库pull/push镜像问题:Error response from daemon: Get https://xxxx.com/: x509: certificate signed by unknown authority

    docker从私有镜像库pull/push镜像问题:Error response from daemon: Get https://harbor.op.xxxx.com/v2/: x509: cert ...

  9. 继承 (js原型链)

    原型链是实现继承的主要方法.基本思想:利用原型让一个引用类型继承另一个引用类型的属性和方法. 1.构造函数.原型.实例的关系: 每个构造函数都有原型属性(Prototype),指向一个原型对象(函数创 ...

  10. C单链表操作

    #include <stdio.h> #include <stdlib.h> #define ElemType int #define Status int #define O ...