不覺間已經工做六年,回想第一天實習的場景歷歷在目、恍若昨日。六年已足以令許多人轉管理、轉產品、轉測試、轉行,也必定有人還在堅守着編碼,只因熱愛。遇到過形形色色的經理、架構師、運維、性能工程師等等,仍是以爲寫代碼的纔是最厲害的!在這裏分享一些這些年來修習到的我的心得。也許並不適用於其餘人,但對於我卻都是最珍貴的「寶藏」。也謹以此文記念在代碼堆裏度過的青春~ 看到這些點點滴滴的收穫,就會感到全部逝去的光陰和揮灑的汗水都是值得的。php
關於IDE,目前我使用Intellj IDEA和Sublime Text來應對各類語言的開發。java
在大學期間初學Java時曾使用過MyEclipse,後來職業生涯的前期很天然的過渡到了更加靈活的Eclipse。但兩年前通過不斷的試用丟棄再試用,最終我成功從Eclipse轉投到了Intellij IDEA陣營。在那以後就一發不可收拾,不只重度使用Intellij,並且還短暫試用過JetBrains旗下的各類產品,Phpstorm,Pycharm,RubyMine包括最新的Clion。Google也選擇Intellij做爲其Android Studio的基礎。做爲Java開發者,固然最鍾愛的仍是Intellij,其智能程度實在是太震撼了!強烈建議還在觀望的同窗們去官網上看一下介紹它的各類操做的小動圖。python
好像很容易地,Intellj IDEA就成了我Java開發的不二選擇。然而對於其餘語言,尤爲是C/C++卻一直沒找到合適的IDE。從Vim+各類插件打造IDE到Emacs到Visual Studio和CodeBlocks,一直沒有令我滿意的,直到遇見了Sublime Text。如今它不只是我除了Java外全部語言的IDE,仍是個人博客編寫工具和代碼庫,在後面的3.2 Codebase一節你將會看到。詳見《Sublime Text 3下C/C++開發環境搭建》。程序員
UML領域中的好軟件很多,如Rose、EA,大可能是商業付費軟件。在開源免費軟件中,StarUML比較不錯,2.0版相比1.0作了很多改進,尤爲是總體外觀漂亮多了。配合Visio和Power Designer等補充UML之外的設計圖,如業務泳道圖、流程圖、拓撲圖、ER關係圖等,幾乎能夠知足大部分平常需求。golang
平常工做中免不了要使用Unix/Linux命令,或者直接鏈接到遠程的服務器上作一些操做。在Windows上模擬Unix/Linux命令固然要用Cygwin,在Windows上使用那些實用的Unix命令能夠大幅度提高效率,特別是你常常須要處理文本時。而SSH客戶端通常就用SSH Secure Shell或XShell,前者比較簡單,後者更強大但文件傳輸功能卻要裝另外的軟件XFtp。算法
固然,若是直接使用Linux作我的桌面那最好不過了,在Linux上開發和在Windows上不只是工具多了順手了,簡直就是思惟方式上的劇變!詳見《Linux Mint 17一週使用體驗》。shell
VirtualBox是個不錯的小巧快速的虛擬機軟件,VMWare也許更增強大,可是有些過重型了。用VirtualBox裝一些經常使用的操做系統和軟件,以及測試環境和測試數據,而後作成快照留做之後反覆使用,能夠免去不少作環境的麻煩。並且在虛擬機裏怎麼折騰都行,下降了使用實體機的風險。這方面,目先後起之秀應該是Docker吧,造福了廣大的開發者。由於尚未研究過因此先不作評論了。數據庫
做爲一名程序員,拿到任務後就有要當即編碼的衝動很正常,但爲了減小走彎路,咱們要剋制這種衝動。大到大型產品和項目的開發,小到一個算法的實現,都少不了先行設計和思考。大項目要作高層次架構設計,提早識別出那些「坑」,能夠有效地下降風險,避免返工。小算法要證實其正確性,避免一些邏輯思惟上的漏洞。關於一段代碼的正確性,詳見《程序員修煉之路-(1)基礎(下):正確性證實》。編程
關於思考的程度也要掌握一個「度」,否則就可能出現「過分設計」的問題。這個「度」感受很難掌握,只能靠時間和經驗不斷培養判斷和直覺,一點點地就學會了評估哪些設計如今作很費時應該放後,哪些設計如今作不麻煩但要是不作之後改起來就很費時。設計模式
說到簡潔和乾淨,就不得不提一些經典書籍對個人巨大影響。在大學時入手了《Code Complete》(代碼大全,聽了這狗血的中譯名真覺得是各類代碼的百科全書),很幸運地能在正式入行前就看到這本書,它讓我少走了不少彎路,甚至養成了一些代碼「潔癖」,有時甚至起個類名都要想半天,但時間證實一切都是值得的。
後來又看到了《Clean Code》,不只講述了簡潔代碼方方面面的技巧,還將寫出簡潔的代碼上升到了職業宣言的高度。詳情見《代碼整潔之道》讀書筆記。
《Clean Code》中結尾的一段話使人印象深入,至今難忘:
「2005年,Elisabeth遞給我一條綠色腕帶,上面寫着Test Obsessed沉迷測試的字樣,我高興地帶上。我發現本身沒法取下腕帶,不只是由於腕帶很緊,並且那也是精神上的緊箍咒。那腕帶就是我職業道德的宣告,也是我承諾盡己所能寫出最好代碼的提示。寫代碼時,我用餘光瞟見它。它一直提醒我,我作了寫出整潔代碼的承諾。」
我的雖然沒有深刻接觸過敏捷開發,但潛移默化中仍是接觸到了很多敏捷開發中好的思想和方法,好比接下來要說的重構。
重構的技巧有不少,可能不知不覺中咱們就已經用到了。從最簡單的重命名、成員變量提取,到類提取、繼承層次中的上下移動等等。MF的那本《重構:改善既有代碼的設計》配上侯捷的翻譯很是經典!這裏再次強烈推薦Intellij IDEA,由於它的重構功能實在太強大了,能夠節省不少時間,大幅度提高咱們的開發效率。
測試驅動開發(TDD)的方法和技巧其實很簡單,隨之而來的好處卻不少。一是對於很複雜的功能能夠先實現最簡單功能,再逐步完善;二是有了單元測試,能夠經過失敗的用例直接找到對應出問題的代碼;三是經過TDD不斷迭代出的代碼,設計比較合理,後期更加容易維護。任何技術都不可避免的有兩面性,TDD也不例外,詳見《TDD實踐感悟》。
關於其餘測試,如集成測試,使用Selenium還能夠將測試自動化。錄製好的測試腳本能夠自動播放,鼠標鍵盤就像「無人自動駕駛」同樣。
持續集成(CI)被譽爲項目的心跳。善加利用的話,不只能統一你們開發的步調,集成上各類有用的插件,例如JCoverage、FindBugs、CheckStyle和各類打包部署腳本,就能有效地提升代碼質量和開發測試速度。CI配合上UAT環境能讓客戶儘早地看到目前的產品是不是本身想要的那個樣子,避免越到後期越是很差修改,儘早暴露問題。Java世界裏最流行的開源CI服務器應該就是Jenkins了吧,參考《Jenkins持續集成環境搭建》。
儘管TDD和CI能自動化一部分工做,幫助咱們提高代碼質量和開發效率,但人工的代碼審查仍是少不了的。自查、互查、一塊兒查,就像結對編程同樣,這也是像高手「取經」的好機會!
一套準確而穩定的模型層的價值是難以估量的,這對於當前業務代碼以及將來升級版本都是具備很大做用的。這也是面向對象分析設計(OOAD)、領域驅動設計(DDD)等方法論的「戰場」。雖然對DDD沒有太多的實踐經驗,但仍是推薦一下,不是要全盤接收,而是從中汲取最精華的思想。DDD Sample Application是不錯的上手學習資料。此外,配合領域模型定製領域語言(DSL)也是個趨勢,值得關注。
前兩部分已經介紹了工具和方法論,能讓咱們迅速地加速到百千米。然而這些知識大部分是誰均可以從網上得到的。像工具誰都能安裝,除非你有「私房」插件,像方法論也都有不少著做能夠學習。要想彪到二百邁,惟有厚積薄發,造成我的風格和套路。所以,必定要有本身的長期計劃,並堅決地實行,畢竟慢工出細活。這是個人長期計劃《程序員修煉之路》:
傳說每一個高手都有本身的一套代碼庫。爲了成爲高手,我也再不斷積累本身的代碼庫。個人代碼庫主要來自工做中的項目實踐和業務時間的編程練習。對應最經常使用的兩種開發工具,個人代碼庫也分爲兩大部分:Java代碼和LinuxC系統編程代碼。
首先來看一下我我的Java庫的編排,通過屢次修改定爲以下結構:cs算法/編譯原理等計算機科學基礎、java基礎API、framework主流框架、mobile移動開發、bigdata大數據hadoop/緩存/機器學習等、ui用戶界面、architecture架構設計、project業餘和開源項目代碼、verification測試驗證代碼等。依賴管理方面使用了最順手的Maven。
$ tree -I "target|*.iml|pom.xml" -L 1 codebase/
codebase/
|-- 01-cs
|-- 02-java
|-- 03-framework
|-- 04-mobile
|-- 05-bigdata
|-- 06-ui
|-- 07-architecture
|-- 08-project
|-- 09-verification
|-- autobak.sh
`-- README.md
目前我使用Sublime Text管理Java領域外的各類知識和代碼,其編排主要按照系統由底層向上分爲:彙編語言、C語言(基礎、算法、系統、實踐、開源軟件)、腳本(批處理、Shell腳本、Cheatsheet)、其餘語言(Golang和Python等等)。
$ tree -L 2 syspace
syspace
|-- 1-assembly
|-- 2-ccpp
| |-- 21-basic
| |-- 22-algorithm
| |-- 23-system
| |-- 24-pragmatic
| `-- 25-opensource
|-- 3-batch
| |-- 31-bat
| |-- 32-shell
| `-- 33-cheatsheet
|-- 4-lang
| |-- 41-golang
| |-- 42-python
| `-- 43-php
|-- autobak.sh
`-- index.md
此外,不只要整理本身的代碼,還能夠收集一些小巧精悍的開源軟件來學習,好比經過Nginx代碼學習網絡編程,經過Redis學習C語言和數據結構,經過Lua學習編譯解釋原理,經過libevent學習併發編程。
Linus說過:RTFSC(Read The F***ing Source Code)。實習時在OpenJPA源碼裏尋尋覓覓,由於找不到一個功能的擴展點而改了源碼並替到Jar包裏,最後還真好使了。而後就一發不可收拾,沉浸在了Spring源碼的海洋。有時一馬平川地,從上到下看到底,如當時OSGi有個開源的小內核Felix。有時也會碰壁而半途而廢,記得有次看Derby,一直看到存儲層,記得好像用antrl生成的SQL解釋器吧,由於功力不夠而擱淺了。如今無論是C、Java仍是其餘主流編程語言的開源代碼,不能說絕不費力,可是很快速地就都能看出個大概流程,不得不說也是不斷閱讀的結果。總而言之,閱讀優秀源碼的收穫之大是沒法用語言形容的。
Cheatsheet小抄,也就是一些來自平常工做經常使用操做的速查表,主要由經常使用配置、命令、快捷鍵等組成。我目前分爲數據庫、IDE、各類語言、中間件、操做系統等。網上有一些現成的在線Cheatsheet,不過仍是本身整理的比較熟悉。實際工做中它也幫助我節約了大量的重複查詢工做和寶貴時間。
$ tree 33-cheatsheet/
33-cheatsheet/
|-- db
|-- ide
|-- lang
|-- midware
|-- os
`-- revctl
關於這一部分,每一個人可能都會攢了一些實用的小腳本。但要注意的是,有些工做是不適合或者說不值得用腳本自動化的。《卓有成效的程序員》裏說過:「別讓自動化的努力變成剪犛牛毛」。剪犛牛毛是一件很危險的事,它會吃掉你大把的時間,獲得的卻只是一個不實用、只能用幾回或者隱患很大的腳本工具。
腳手架(Scaffold)是個好東西,它能夠幫助咱們自動生成代碼的「骨架」。以後利用咱們代碼庫的積累對骨架作微調,不斷在上面添加功能就能快速地造成一個可用的應用程序。Maven提供的Archetype插件是個不錯的腳手架,不少項目都基於它提供了代碼模板。固然若是想要定製本身的模板也很簡單,具體參照《Maven原型骨架及常見問題》。
除了Maven這種構建工具外,IDE通常也提供了各類小腳手架來生成小段代碼。最多見的就是IDE裏的代碼模板和補全功能,若是以爲不過癮能夠編寫本身的模板和IDE擴展插件,就像RubyMine對Rails的腳手架的支持同樣。詳情見《Intellij IDEA插件開發入門》。
寫博客的做用可不容小覷!沒作過總結的知識那只是別人的知識,沒作過讀書筆記的書不久後就變得跟沒讀過同樣。當碰到了總結整理過的知識時,搜索你的Blog會給你最快速的答案。不要覺得這跟用谷歌搜索同樣,一遍遍翻看你本身用心寫的東西和看別人的東西是徹底不一樣的概念!並且中文技術文章裏有太多的粗製濫造的內容、亂七八糟的排版和無數不註明出處的轉發。因此看完書的一章或作完什麼有用的練習後,必定要趁熱打鐵趕忙總結一下!
那麼用什麼寫呢?以前試用過Emacs下的Orgmode,以前接觸太輕量級標記語言,配合Emcas感受挺驚豔的!後來遇到了Sublime後連寫博客都遷到它上面了,由於它的Markdown插件實在是太好用了。詳見《Markdown語法及SublimeText下使用技巧》。
隨着寫代碼的時間長了、見識多了,解決問題的手段就會多元化起來。什麼樣的編程語言適合用什麼樣的項目,什麼樣的架構設計適合什麼樣的場景。編程語言多元化,架構設計的多元化,開發工具的多元化,最終才能促成咱們解決現實問題的思惟的多元化。Thoughtworks維護了一個技術雷達,按期會更新技術、平臺、工具等方面的技術趨勢。
儘管有了上面各類輔助,可是若是不能靜下心來編碼一切都白費了。要麼看會這兒看會那兒,要麼就是在嘈雜的環境中沒法集中注意力。儘管不起眼,這倒是提升效率的「最後一千米」。
各類IDE通常都提供了全屏模式,像Sublime Text還額外提供了」Distraction Free Mode」抗干擾模式,讓你專心地投入到一個打開文件的編輯工做。
用過Linux桌面版的都知道,不少Linux分發版都提供了4個獨立的桌面工做區。一個工做區能夠作交流用,像收發郵件、即時通信等,一個工做區用來訪問遠程服務器或FTP環境,一個工做區則專心編碼不受干擾。Windows下也有如Dexpot這樣能夠實現虛擬桌面的軟件,不妨試用一下。
通常你們常常網上聊天的話,打字速度應該不成問題。但除了盲打26個字母外,像經常使用的標點符號分號括號引號、數字1-3和8-0、功能鍵F1和F二、Ctrl/Alt/Shift等最好也能熟悉其位置,這樣敲起來才能快如風。
此外,無論用什麼IDE和工具,掌握快捷鍵,讓雙手留在鍵盤脫離鼠標是基本功。否則空有快如風的盲打速度也是不行的。關於我最常使用的IDE的快捷鍵介紹請參考《十大Intellij IDEA快捷鍵》。關於這一部分的積累,別忘了保存到本身的Cheatsheet裏。
關於爲何編程時要聽音樂有很多研究,還都挺有意思的,說是不只抗干擾還能促興奮。萬能的知乎上還真有這個問題,以及一份推薦的榜單,見有哪些適合編程時聽的音樂?。甚至還有個專門的網站http://musicforprogramming.net/。這方面因人而異,我我的仍是比較習慣這種「抗噪」方式的,最近在聽剛看完兩季的《Silicon Valley》的OST。
固然,被別人干擾和打斷在所不免。在離開手頭工做以前,必定留下一些線索,好比關鍵點、思考到哪了等,這就是「麪包屑」。這樣等繼續時就能稍微快一些恢復出「現場」,就像進程的上下文切換同樣。
前面根據我的的經驗,分享了一些提升編程效率的我的心得。每一個人的經歷經驗不盡相同,相信其實每一個人心中都有一份本身的清單。但最最重要的是堅持投入,不斷地練習、練習、練習、練習、練習……
這裏引用最近看到的名言自我勉勵一下,來自Bruce Lee李小龍:
「I fear not the man who has practiced 10,000 kicks once, but I fear the man who has practiced one kick 10,000 times.」
我不害怕把一萬種踢法都練一次的人,但我懼怕把一種踢法練一萬次的人。
「There are many paths you can follow to reach your destination. However, you’ll never reach the end if you keep changing paths along the way.」
到達目的地的途徑有多種。但若是你沿途不斷變換路線,你是永遠不會到達終點的。
李笑來老師在《把時間看成朋友》曾說過:「全部學習上的成功,都只靠兩件事:策略和堅持,而堅持自己就應該是最重要的策略之一。」水滴石穿,繩鋸木斷。不要懼怕走彎路,只要專一地一直走就必定會到終點!祝福你們都能抵達夢想的彼岸,成爲本身心中最厲害的那我的!