阅读更多

25顶
0踩

研发管理

转载新闻 高效能程序员的七个习惯

2014-03-05 10:14 by 副主编 WnouM 评论(11) 有14875人浏览
本文转载自Tyr Chen的博客在文中作者总结了他认为高效能程序员应该具备的七个习惯,原文内容如下。

昨天收到一个读者留言,问作为程序员,有什么学习和工作上的好习惯可以借鉴?想了想,干脆附庸风雅一下,总结个『高效能程序员的七个习惯』吧。Disclaimer:一家之言,可不信,但不可全信。

1.  拥抱unix哲学

每个程序员入门的第一堂和第二堂课应该是和unix哲学相关的内容,简言之就是:做一件事,做好它。具体点:

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

引用
In [1]: import this
The Zen of Python, by Tim Peters

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!


2.  选一个样板,follow之

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

3.  写代码,而不是调代码

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

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

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

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

4.  聪明地调试

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

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

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

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

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

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

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

6.  一切皆项目

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

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

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

项目制的另一大好处是可以在其之上使能工具。比如说你看到的这些微信文章,我随时可以“make publish YEAR=2014”来生成包含了2014年我所写文章的pdf。

7.  心态开放,勇于尝试

在程序员社区里,语言之争,系统之争,软件思想之争几乎是常态。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(暂无计划)
这个列表你不必参考,我只是想用此来说明心态越开放,你看到的世界就越大。

原文链接:http://tchen.me/posts/2014-03-05-highly-effective-programmer.html
25
0
评论 共 11 条 请登录后发表评论
11 楼 fangang 2014-04-09 20:39
第五点大家讨论得比较多,分歧也大。我的理解,不要将设计说明与程序分离,而是将程序与设计说明放在一起,拿java来说就是javadoc。

一边写程序,一边写设计文档,最终的结果就是设计与文档的分离:设计已经更新了N多版本,文档还是原有的文档。这样的文档将失去它原有的意义。

正确的做法就是,边设计编写代码,边在程序中随手编写说明,最后的设计文档应当是从程序中自动生成的,如java的API文档。这样的文档,将随时在跟随最新的设计,才是真正有意义的文档。详细设计文档都应当是这样的文档。
10 楼 Cwind 2014-03-07 18:49
每一条论断都不应该脱离语境断章取义,数据应保存为文本文件是1994年Mike Gancarz提出的UNIX哲学中九条训格之言之一
说到文档,online文档似乎更方便于协作
9 楼 JonathanWang 2014-03-07 16:54
aa87963014 写道
"数据应该保存为文本文件"
纯粹的sb,没有之一.项目毒瘤

没文化真可怕。。。
8 楼 aa87963014 2014-03-07 11:39
"数据应该保存为文本文件"
纯粹的sb,没有之一.项目毒瘤
7 楼 wanglewen 2014-03-06 15:07
第3点,和TDD冲突了。各有各的想法吧。
6 楼 jimmee 2014-03-06 13:12
3.  写代码,而不是调代码
4.  聪明地调试
7.  心态开放,勇于尝试

很有体会
5 楼 JonathanWang 2014-03-06 12:27
Rossalee 写道
能举个例子说明一下“数据应该保存为文本文件”有何优势?
真心求教。

读写速度快,大数据下很多数据分析工具的使用的源数据都是文本文件,只是后缀名有所不同。
4 楼 washingtonDC 2014-03-05 22:58
第五点挺感兴趣,以前没听过。
数据应该保存为文本文件,在 .Eric.Steven.Raymond.The.Art.of.UNIX.programming一书中对之有详细论述。我记得保存为文本文件是相对于保存为编码文件而言的。文本文件人一看就懂,而编码文件除非用特殊软件,否则读不懂。另外linux的shell脚本都是基于文本文件做操作的。
3 楼 Rossalee 2014-03-05 16:43
能举个例子说明一下“数据应该保存为文本文件”有何优势?
真心求教。
2 楼 Bernard 2014-03-05 15:11
chris_strive 写道
第五点不太适合中国国情吧。。。从来只写office文档的飘过。。


docbook 重度用户表示你接触的人用word而已,或者你只注意到别人用word了。
1 楼 chris_strive 2014-03-05 10:24
第五点不太适合中国国情吧。。。从来只写office文档的飘过。。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • xxljob从入门到精通-全网段最全解说

    xxljob解决的是以下几个痛点: 1) 跑批处理监控无法可视化,当前跑批的状态是:成功?失败?挂起?进度?为什么失败/原因? 2)批处理任务不可重用,特别是无法对批处理任务做:定时?重复使用?频次?其中路由...

  • Java Web、Tomcat、Servlet、JSP

    直接关闭tomcat窗口也可快速关闭服务器,但是这种做法服务器没有执行正常的关闭流程,有时会造成下次启动报错,遇到这种情况只要再执行一次shutdonw.bat即可解决问题。 2.5.tomcat的目录结构 bin — 存放tomcat...

  • Eclipse的Web Maven项目创建和配置

    Eclipse的Web Maven项目创建和配置 1.Maven项目的创建(版本我的是JDK:1.8,TomCat8.0) 打开eclipse右键选择new–>project–>Maven Project,然后next到 选择红线圈中的这个点next 接着填入Group Id...

  • Java基础笔记

    概念:顺序结构的程序虽然能解决计算、输出等问题但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构 2.形式: 单分支:if( 条件){ 代码 } 多分支1: if(条件){ 满足条件执行代码1 } else{ 不满足...

  • CGB2005-京淘16(跨域:jsonp cors,单点登录系统 通过跨域访问 用户名数据效验 static代码块 接口文档 根据url快速定位页面,HttpClient)

    callback:回调函数 hello({"id":"1","name":"tomcat猫"}) 1.3.2 JSONP概念 JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1....

  • Paoding Rose使用手册

    打开eclipse(需要提前安装好m2clipse插件) new -> other -> maven -> maven project create a simple project next group id:com.54chen artifact id:rose-example packaging: war finished 2.4 基础配置三步...

  • 网络博客

    sleep wait sleep是Thread类的静态方法。sleep的作用是让线程休眠制定的时间,在时间到达时恢复,也就是说sleep将在接到时间到达事件事恢复线程执行,例如: try{ System.out.println("...

  • SpringBoot+myBatis(plus)+MySQL+VUE最基础简易的前后端全栈demo制作

    maven下载地址:https://maven.apache.org/download.cgi eclipse创建maven项目:https://www.cnblogs.com/shanhubei/p/16779442.html maven项目模板: 2. springBoot基础 2.1 springboot项目制作过程 首先:file ->...

  • 商品后台页面整合显示、商品列表展示功能EasyUIDataGridjson分页功能PageHelper

    因此,首页控制器代码如下,@Controller告诉Spring自己是控制器类,RequestMapping为访问此方法的URL,返回首页的jsp名字,即跳转到首页,然后我们启动tomcat,可以访问到首页. 这里解释一下为什么返回String就可以完成...

  • Linux的C开发环境

    如图3-5,3-6所示。...12、reloadable 这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重起tomcat的情况下改变应用程序。

  • py-19-JTWEB01

    京淘1 目录: day01:京淘- Maven继承聚合 ...day06:京淘-Tomcat集群, Nginx负载均衡,Linux部署 day07:京淘-数据库主从复制amoeba读写分离 day08:京淘-数据库双机热备Mycat读,写分离 day09:京淘-Redis分片,商品...

  • elasticsearch你了解多少?

    centos6启动错误解决方案 2.5.1. 错误1:内核过低 我们使用的是centos6,其linux内核版本为2.6。而Elasticsearch的插件要求至少3.5以上版本。不过没关系,我们禁用这个插件即可。 修改elasticsearch.yml文件,在最...

  • Linux_FastDFS分布式文件系统——搭建

    是一个轻量级的开源分布式文件系统,主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡。   支持存储服务器在线扩容,支持相同的文件只保存一份,节约磁盘。    FastDFS 只能通过...

  • javaweb编程技术第三版教材_Java Web编程技术(第3版)-微课版

    第1章Java Web技术概述1.1Internet与万维网1.1.1主机和IP地址1.1.2域名和DNS1.1.3万维网1.1.4服务器和浏览器1.1.5HTTP与URL1.2Web...和动态文档1.3.3服务器端动态文档技术1.4Tomcat服务器1.4.1...

  • day69_淘淘商城项目_02_dubbo介绍 + dubbo框架整合 + zookeeper + 商品列表查询实现 + 分页 + 逆向工程_匠心笔记

    :将Java工程generatorSqlmapCustom导入到eclipse中,运行/generatorSqlmapCustom/src/下的GeneratorSqlmap.java文件生成我们所需的代码。 1.4、系统间通信问题 1.4.1、分析   由于淘淘商城是基于soa的架构...

  • 远程debug流程,方便debug

    远程debug流程,方便debug

  • 基于麻雀生物特性的搜索算法(SSA)的Matlab实现:原理、代码与实战应用,基于圈养麻雀特性的搜索算法(SSA)matlab实现:原理、代码与警觉机制解析,麻雀搜索算法(SSA)的matlab实现

    基于麻雀生物特性的搜索算法(SSA)的Matlab实现:原理、代码与实战应用,基于圈养麻雀特性的搜索算法(SSA)matlab实现:原理、代码与警觉机制解析,麻雀搜索算法(SSA)的matlab实现 原创代码,注释清晰,可直接运行 研究表明,圈养的麻雀存在两种不同类型:发现者和加入者。 发现者在种群中负责寻找食物并为整个麻雀种群提供觅食区域和方向,而加入者则是利用发现者来获取食物。 在生活中我们仔细观察会发现,当群体中有麻雀发现周围有捕食者时,此时群体中一个或多个个体会发出啁啾声,一旦发出这样的声音整个种群就会立即躲避危险,进而飞到其它的安全区域进行觅食。 这样的麻雀被称为警觉者。 麻雀搜索算法就是利用麻雀的这种生物特性进行迭代寻优的优化算法。 本资源包含以下三部分内容: 1.麻雀搜索算法的基本原理(两篇参考文献),非常适合用来学习。 2.麻雀搜索算法的matlab代码,注释详细,结构清晰。 3.五个群智能优化算法常用的测试函数。 ,麻雀搜索算法(SSA); MATLAB实现; 原创代码; 注释清晰; 可直接运行; 生物特性迭代寻优; 发现者与加入者; 警觉者; 参考两篇文献。

  • 基于java的五子棋游戏设计源码+论文

    基于java的五子棋游戏设计源码+论文

  • deepseek-r1使用指南

    deepseek-r1使用指南

  • DeepSeek+DeepResearch-让科研像聊天一样简单

    DeepSeek+DeepResearch——让科研像聊天一样简单 (1)DeepSeek如何做数据分析? (2)DeepSeek如何分析文件内容? (3)DeepSeek如何进行数据挖掘? (4)DeepSeek如何进行科学研究? (5)DeepSeek如何写综述? (6)DeepSeek如何进行数据可视化? (7)DeepSeek如何写作润色? (8)DeepSeek如何中英文互译? (9)DeepSeek如何做降重? (10)DeepSeek论文参考文献指令 (11)DeepSeek基础知识。

Global site tag (gtag.js) - Google Analytics