# 程序員效率指南
幾條建議
### 盡量不要用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設置
- 附錄
- 計算機科學與技術
- 網站
- 書籍
- 工具