# 程序员效率指南
几条建议
### 尽量不要用windows进行开发
除非你只用dotnet开发软件,不然osx/ubuntu会是更好的开发平台。太多太多优秀的工具在osx/ubuntu下可以一键安装,在windows下却不得不花费超过一个甚至几个数量级的时间去安装,更别提有的工具windows压根没有替代品。
如果不认可Rule 1,那么直接可以跳过下面的文字走人。
### 尽量使用mbp
我在「能花钱的,就不要花时间」文中已经强调,有条件买15"高配的就不要买15"低配,有条件买15"低配的就不要买13"(Retina/ssd版本是必备)。作为一个开发者,你实在应该在开发工具上对自己好些 —— 毕竟你跟她相处的时间比跟女盆友/老婆多多了!
如果实在觉得mbp太贵 [1],可以考虑一个15"轻薄的本子装ubuntu。
mbp的好处不在于逼格 [2],而在于优秀的硬件 + 优秀的Unix兼容的软件。retina屏,超长的电池续航(相比PC),舒服的trackpad让工作的舒适度提高不是一星半点,而软件上强大的spotlight等系统功能让效率提升很多。这个我就不详述,自己看『mactalk·人生元编程』去。
### 使用大屏幕
工作中使用mbp是为了便携性 —— 在各种场合都可以进行开发任务,应对会议和各种各样的演示需求。可一旦坐在工位上好几个小时,全神贯注地写代码时,就最好有个大屏幕。
屏幕多大才好?在机器带的起来的情况下越大越好,能27"就不要24",能24"就不要21",能21"就不要直接使用笔记本的屏幕。大屏幕可以让一个屏幕同时显示好几个窗口而无需来回切换。我现在自己的工作配置是15" mbp + 27" apple display,用上了就回不去了,一天呆在公司12小时都不嫌多。
我自己一般把屏幕劈成两半,左边chrome,右边iterm,这样,在vim里写代码时,随时可以查文档。配合vim的热键,我可以用 xx 在chrome里打开某个开发语言的文档,鼠标都不用动一下。
### 使用dotfiles
一个程序员一天可能80%的时间都在跟shell打交道,有个好的shell(bash or zsh),加上合理的shell配置绝对让效率提升一大截。我以前都是直接使用 mathiasbynens/dotfiles 的设置,后来自己改得多了,就干脆fork了一个版本 tyrchen/dotfiles 出来,把自己的改动放上去。
dotfiles这样的东西不必自己从头来,在github上找个star最高的clone或者fork之即可,这便是所谓的站在巨人的肩膀上。武学中要打通任督二脉,靠勤奋往往是不够的,还要有际遇,好比虚竹遇上了无涯子或者张无忌遇到了白猿。程序世界里的无涯子和白猿们都在github上,只是需要你的发掘。
我自己的dotfiles就在Mathias的基础上发展而来,基本上,我做了两个主要的改动:
- 把prompt换成帅呆了的liquidprompt
- vim使用vundle,并且使能了一堆我喜爱的插件(这个随后讲)
### 挑一款趁手的editor和ide
作为一个开发者,你需要精挑细选一款趁手的用来编辑代码的editor。我使用了几年的vim,又换用过大半年的emacs,为了强制自己习惯emacs,我甚至在bash中把vim alias成emacs。但最终,没能打开emacs下的任督二脉的我实在无法抗拒vim下的那些好用的插件,又回到了vim的阵营。所以在editor这里,我只能先讲讲更为熟悉的vim。
vim下最基本的vundle不提,至少这些插件你值得拥有:
- SirVer/ultisnips: 撰写和使用snippet神器,用过textmate/sublime的人应该都知道。一个程序员的效率很大程度上跟他的snippet库有关。如果你的python class,html的标签,erlang/elixir的otp代码还是一个字符一个字符手敲,那么你该好好看看这个插件了。配合着 honza/vim-snippets,大部分代码的snippet都有了;遇到结构类似的代码块(bolerplate),又没有已经定义好的snippet时,调用 :UltiSnipsEdit 立刻定义之,你基本上就走在无敌的路上了。
- scrooloose/nerdtree:让你的vim支持文件树。这个插件加上 tpope/vim-eunuch,文件系统的各种操作和显示全在vim里搞定了。
- sheerun/vim-polyglot:几乎所有程序语言的源文件syntax/tab等的支持。有此一个插件,就不再需要 vim-ruby,vim-go等一票单独的语言插件了。
- Valloric/YouCompleteMe:让vim支持自动补齐。这个几乎是IDE的标配,效率提升的另一大神器。有了它,IDE的需求就减弱很多。
其它的插件就不一一介绍了,感兴趣的可以在我的dotfiles里面一一翻阅。
大部分编程的工作,轻量级的editor就足够胜任,但有些开发语言和框架,bolerplate代码实在太多,整个开发目录太繁杂,这时候不得不使用IDE,比如说java下的很多项目。当你不得不使用IDE的时候,intelliJ系列的IDE是比eclipse系列好很多的选择。
当然,这条rule的核心是尽量使用editor,能不用IDE就不用IDE。
### 把常用的任务命令化/快捷键化
国外的开发高手也都是使用快捷键的高手,我以前不习惯使用快捷键,但看了很多高手的screencast后,发现他们都是当一个任务重复几次后,顺手就定义快捷键或者命令。这里我讲讲vim怎么做,emacs的用户自行脑补。
在进行elixir做TDD开发的时候,我经常需要运行 mix test 来确保我新写的代码或者重构的代码能够跑过已有的test case。这事做多了也就烦了,因为在vim里总需要输入 !mix test,这个时候,我就会为此定义个快捷键。如果快捷键只跟当前项目有关,那么就在当前项目根目录下生成一个 .vimrc,定义快捷键,否则在系统的 .vimrc 中定义:
~~~
noremap <leader>et :!mix test<CR>
~~~
这样,以后需要运行这个命令的时候,直接敲 key + ed 就好。对于elixir,我有这些定义:
~~~
noremap <leader>ed :!mix deps.get<CR>
noremap <leader>et :!mix test<CR>
noremap <leader>ec :!mix compile<CR>
~~~
因为每个语言都有类似的 dependency,test,compile等任务,如果要定义在全局的 .vimrc 文件里,可以为每种语言附不同的前缀(elixir为 e)区隔。如果你喜欢按项目定义,那可以把 t 统一定义为UT的命令,这样可以省去敲一个字符的时间。
### 培养自己好的重构习惯
这里讲的重构和代码里的重构大体意思一样,就是不断优化自己的工作环境。Rule 6其实就是一种重构。
经常问问自己这些问题:
- 常用的命令是不是做了alias?比如:总敲 ls -l,是不是应该alias出一个 ll 来?
- 常用的服务器信息是否写在了 .ssh/config 里?服务器登录是否使用了pub/private key(毋须输入密码)?
- 对于某些操作,可不可以定义一些快捷键(比如说google search)?
- 项目里重复的工作是不是写成了makefile(或是其他任务脚本,如rake,jake)?
- 常写的代码结构是否定义了snippet?
讲讲snippet。我特别喜欢vim的ultisnips,它能让我按语言很方便地定义snippet。比如在elixir里总要写的 GenServer 代码,大体结构是 Public API + GenServer API,我可以定义一个snippet,在敲入 defgen 的时候,可以展开成为下面的代码(并且我可以在代码中跳至需要我修改的地方):
~~~
defmodule name do
@moduledoc """
"""
use GenServer
### Public API
def start_link do
{:ok, server} = :gen_server.start_link __MODULE__, [], []
end
### GenServer API
def init(state) do
{:ok, state}
end
def handle_call(, _from, state) do
end
def handle_cast(, state) do
end
end
~~~
这将省去我多少bolerplate的时间 —— 更关键的时,我的思绪不会被撰写这些无趣,但又不得不写的bolerplate打断。
### 使用git管理个人文件
大部分开发者对于自己的代码项目都有很好的习惯:使用git(或者其他scm)管理。但代码之外的文档,管理起来就有些随意,即没有历史记录,单纯存储在本地也容易丢失。建议大家对 $HOME 下的文件,只要是自己生成的文档(太大的二进制除外),一律用git管理(在目录下 git init)。你们看到的这个公众号的所有文章就是用github存储(private repo)。然而github上存储private repo毕竟要花钱 —— 不想花钱,又想很多私人的文档想管理怎么办?可以在dropbox(或者其他类似的网盘)上生成一个git的bare project,然后把本地的文档push上去。
### 多看高手的screencast
很多时候我们没有机会近距离看高手是怎么工作的,但观看他们的screencast不失是一种提高自己的好办法。在这个方面,其他语言的爱好者估计都要妒忌ruby的拥趸 —— ruby社区的各种screencast多得令人发指!通过订阅这些screencast,你不仅能快速学到语言相关的知识和实用的技巧,更重要的是,你知道高手都在用什么工具,如何写代码。11年的时候我看过一个php的screencast,一个法国人介绍如何用symfony撰写项目。那是我第一次领略什么是指尖如飞,也给我播下了snippet的种子(他用的是textmate)。从那以后,我会时不时地看一些各种各样的screencast(以rails的居多),学习点新东西的同时,还能学习高手的习惯。
### 参考资料
- [程序员效率指南](http://mp.weixin.qq.com/s?__biz=MzA3NDM0ODQwMw==&mid=206041450&idx=1&sn=3982c8cc45d7c47f0fbc19fe8371490f#rd)
- 介紹
- 程序员基础知识
- 字符编码
- 技术名词
- 语义化版本
- 命名规范
- 书写文档
- 开源协议
- 目录结构
- 正则表达式
- 平凡之路
- 数据结构与算法
- 堆和栈
- 浮点数类型
- XML和JSON
- 算法学习之路
- 排序算法
- 代码架构
- 设计模式
- 常用的Javascript设计模式
- 面向对象编程
- 继承
- 多态
- 封装
- 面向接口编程
- 代码评审
- 六种量化你代码的方式
- 程序员必备的代码审查(Code Review)清单
- 服务器部署
- AWS简介
- 网络知识
- HTTPS, SPDY和 HTTP/2性能的简单对比
- HTTP状态码
- 懂点设计
- 佳作赏析
- 无缝平铺
- Sketch学习
- 设计与实现的平衡
- 写点东西
- 使用gitbook
- 合格的PM
- 一个好的产品经理
- 产品经理的技能
- 团队合作
- 关于招聘
- 培训新人
- 领导能力
- 获取知识
- MOOC
- Podcasts
- 英语学习
- 设计学习
- 前端学习
- iOS学习
- 游戏开发
- 关注健康
- 过劳检测
- 关于睡眠
- 提升效率
- 学会阅读
- 学会提问
- 善用搜索
- 学会写作
- 时间管理
- 知识管理
- 文件管理
- 密码管理
- 制作视频
- 制作PPT
- 论音乐对效率的影响
- 程序员效率指南
- SOHO
- 创业资源
- Hacker
- 保护隐私
- 关于工作
- 找工作前需要思考的问题
- 原则与技巧
- 关于简历
- 其他方面
- 硬件相关
- 常用软件
- Windows
- 硬件配置
- 系统安装
- 常用软件
- Mac
- 通用设置
- 权限问题
- alias设置
- 常用软件
- 开发环境
- 快捷键设置
- 常用终端命令
- dotfiles
- Android
- 常用软件
- 如何登录美国区GooglePlay
- 开发工具
- git
- EditorConfig
- node
- shadowsocks
- ST3--Windows篇
- ST3--Mac篇
- gulp
- 字体的选择
- Emacs
- WebStorm
- tmux
- Sketch
- Sketch中文学习资料
- Trello
- 使用Trello管理项目的经验
- git进阶
- 15分钟学会使用Git和远程代码库
- GitHub秘籍
- JetBrains
- IDE设置
- 附录
- 计算机科学与技术
- 网站
- 书籍
- 工具