高效程序猿的狂暴之路

不觉间已经工做六年,回忆第一天实习的场景历历在目、恍若昨日。六年已足以令不少人转管理、转产品、转測试、转行,也必定有人还在坚守着编码,仅仅因热爱。遇到过形形色色的经理、架构师、运维、性能工程师等等,仍是认为写代码的才是最厉害的!在这里分享一些这些年来修习到的我的心得。或许并不适用于其它人,但对于我却都是最珍贵的“宝藏”。php

也谨以此文记念在代码堆里度过的青春~ 看到这些点点滴滴的收获,就会感到所有逝去的光阴和挥洒的汗水都是值得的。java


1.启动:驾轻就熟的工具

1.1 全能IDE

关于IDE,眼下我使用Intellj IDEA和Sublime Text来应对各类语言的开发。python

在大学期间初学Java时曾使用过MyEclipse。后来职业生涯的前期很是天然的过渡到了更加灵活的Eclipse。但两年前通过不断的试用丢弃再试用,终于我成功从Eclipse转投到了Intellij IDEA阵营。golang

在那以后就一发不可收拾,不只重度使用Intellij,而且还短暂试用过JetBrains旗下的各类产品,Phpstorm,Pycharm,RubyMine包含最新的Clion。Google也选择Intellij做为其Android Studio的基础。做为Java开发人员,固然最钟爱的仍是Intellij。其智能程度实在是太震撼了!算法

强烈建议还在观望的同窗们去官网上看一下介绍它的各类操做的小动图。shell

好像很是easy地,Intellj IDEA就成了我Java开发的不二选择。数据库

然而对于其它语言,尤为是C/C++却一直没找到合适的IDE。编程

从Vim+各类插件打造IDE到Emacs到Visual Studio和CodeBlocks。一直没有令我惬意的,直到遇见了Sublime Text。现在它不只是我除了Java外所有语言的IDE,仍是个人博客编写工具和代码库。在后面的3.2 Codebase一节你将会看到。详见《Sublime Text 3下C/C++开发环境搭建》设计模式

1.2 UML和设计

UML领域中的好软件很多,如Rose、EA。大可能是商业付费软件。缓存

在开源免费软件中。StarUML比較不错。2.0版相比1.0作了很多改进,尤为是整体外观美丽多了。配合Visio和Power Designer等补充UML之外的设计图。如业务泳道图、流程图、拓扑图、ER关系图等,差点儿可以知足大部分平常需求。

1.3 Shell

平常工做中免不了要使用Unix/Linux命令,或者直接链接到远程的server上作一些操做。在Windows上模拟Unix/Linux命令固然要用Cygwin,在Windows上使用那些有用的Unix命令可以大幅度提高效率。特别是你常常需要处理文本时。

而SSHclient通常就用SSH Secure Shell或XShell,前者比較简单,后者更强大但文件传输功能却要装另外的软件XFtp。

固然,假设直接使用Linux作我的桌面那最好只是了,在Linux上开发和在Windows上不只是工具多了顺手了。简直就是思惟方式上的剧变!详见《Linux Mint 17一周使用体验》

1.4 虚拟环境

VirtualBox是个不错的小巧高速的虚拟机软件,VMWare或许更增强大。但是有些过重型了。用VirtualBox装一些常用的操做系统和软件,以及測试环境和測试数据。而后作成快照留做之后重复使用,可以免去很是多作环境的麻烦。

而且在虚拟机里怎么折腾都行。减小了使用实体机的风险。这方面,眼下后起之秀应该是Docker吧。造福了广大的开发人员。因为尚未研究过因此先不作评论了。


2.加速:简单有效的方法论

2.1 动手前先思考

做为一名程序猿,拿到任务后就有要立刻编码的冲动很是正常,但为了减小走弯路,咱们要节制这样的冲动。大到大型产品和项目的开发,小到一个算法的实现。都少不了先行设计和思考。大项目要作高层次架构设计,提早识别出那些“坑”。可以有效地减小风险。避免返工。小算法要证实其正确性。避免一些逻辑思惟上的漏洞。关于一段代码的正确性,详见《程序猿修炼之路-(1)基础(下):正确性证实》

关于思考的程度也要掌握一个“度”。否则就可能出现“过分设计”的问题。这个“度”感受很是难掌握。仅仅能靠时间和经验不断培养推断和直觉。一点点地就学会了评估哪些设计现在作很是费时应该放后,哪些设计现在作不麻烦但要是不作之后改起来就很是费时。

2.2 简洁的代码

说到简洁和干净,就不得不提一些经典书籍对个人巨大影响。在大学时入手了《Code Complete》(代码大全。听了这狗血的中译名真觉得是各类代码的百科全书)。很是幸运地能在正式入行前就看到这本书,它让我少走了很是多弯路,甚至养成了一些代码“洁癖”,有时甚至起个类名都要想半天,但时间证实一切都是值得的。

后来又看到了《Clean Code》。不只讲述了简洁代码方方面面的技巧,还将写出简洁的代码上升到了职业宣言的高度。

详情见《代码整洁之道》读书笔记

《Clean Code》中结尾的一段话使人印象深入。至今难忘:
“2005年。Elisabeth递给我一条绿色腕带。上面写着Test Obsessed沉迷測试的字样,我高兴地带上。

我发现本身没法取下腕带,不只是因为腕带很是紧,而且那也是精神上的紧箍咒。那腕带就是我职业道德的宣告。也是我承诺尽己所能写出最好代码的提示。写代码时,我用余光瞟见它。它一直提醒我,我作了写出整洁代码的承诺。”

2.3 重构

我的虽然没有深刻接触过敏捷开发,但潜移默化中仍是接触到了很多敏捷开发中好的思想和方法。比方接下来要说的重构。

重构的技巧有很是多。可能不知不觉中咱们就已经用到了。从最简单的重命名、成员变量提取,到类提取、继承层次中的上下移动等等。MF的那本《重构:改善既有代码的设计》配上侯捷的翻译很是经典。这里再次强烈推荐Intellij IDEA。因为它的重构功能实在太强大了,可以节省很是多时间,大幅度提高咱们的开发效率。

2.4 单元測试与TDD

測试驱动开发(TDD)的方法和技巧事实上很是easy。随之而来的优势却很是多。一是对于很是复杂的功能可以先实现最简单功能,再逐步无缺;二是有了单元測试,可以经过失败的用例直接找到相应出问题的代码。三是经过TDD不断迭代出的代码。设计比較合理,后期更加easy维护。

不论什么技术都不可避免的有两面性。TDD也不例外,详见《TDD实践感悟》

关于其它測试。如集成測试,使用Selenium还可以将測试本身主动化。录制好的測试脚本可以本身主动播放,鼠标键盘就像“无人本身主动驾驶”同样。

2.5 持续集成

持续集成(CI)被誉为项目的心跳。善加利用的话。不只能统一你们开发的步调。集成上各类有用的插件,好比JCoverage、FindBugs、CheckStyle和各类打包部署脚本,就能有效地提升代码质量和开发測试速度。CI配合上UAT环境能让客户尽早地看到眼下的产品是不是本身想要的那个样子,避免越到后期越是很差改动。尽早暴露问题。

Java世界里最流行的开源CIserver应该就是Jenkins了吧。參考《Jenkins持续集成环境搭建》

2.6 代码审查

虽然TDD和CI能本身主动化一部分工做,帮助咱们提高代码质量和开发效率。但人工的代码审查仍是少不了的。自查、互查、一块儿查。就像结对编程同样,这也是像高手“取经”的好机会!

2.7 领域模型

一套准确而稳定的模型层的价值是难以估量的,这对于当前业务代码以及将来升级版本号都是具备很是大做用的。

这也是面向对象分析设计(OOAD)、领域驱动设计(DDD)等方法论的“战场”。虽然对DDD没有太多的实践经验。但仍是推荐一下,不是要全盘接收。而是从中汲取最精华的思想。

DDD Sample Application是不错的上手学习资料。此外,配合领域模型定制领域语言(DSL)也是个趋势,值得关注。


3.增压:持续的知识积累

3.1 知识体系

前两部分已经介绍了工具和方法论,能让咱们迅速地加速到百千米。然而这些知识大部分是谁都可以从网上得到的。像工具谁都能安装,除非你有“私房”插件。像方法论也都有很是多著做可以学习。要想彪到二百迈,惟有厚积薄发,造成我的风格和套路。

所以,必定要有本身的长期计划。并坚决地实行,毕竟慢工出细活。这是个人长期计划《程序猿修炼之路》

  • 计算机数学:离散数学与详细数学。

  • 算法分析设计:常用设计技巧和数据结构。
  • 系统平台:体系结构、操做系统、网络、编译原理和数据库。
  • 代码设计:架构设计、设计模式、方法论。

  • 代码实现:开发工具和主流编程语言。

  • 測试验证:单元測试、性能測试和优化。

3.2 Codebase

传说每个高手都有本身的一套代码库。为了成为高手,我也再不断积累本身的代码库。个人代码库主要来自工做中的项目实践和业务时间的编程练习。

相应最常用的两种开发工具。个人代码库也分为两大部分: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仍是其它主流编程语言的开源代码,不能说绝不费力,但是很是高速地就都能看出个大概流程,不得不说也是不断阅读的结果。总而言之。阅读优秀源代码的收获之大是没法用语言形容的。

3.3 Cheatsheet

Cheatsheet小抄,也就是一些来自平常工做常用操做的速查表,主要由常用配置、命令、快捷键等组成。我眼下分为数据库、IDE、各类语言、中间件、操做系统等。

网上有一些现成的在线Cheatsheet,只是仍是本身整理的比較熟悉。实际工做中它也帮助我节约了大量的重复查询工做和宝贵时间。

$ tree 33-cheatsheet/
33-cheatsheet/
|-- db
|-- ide
|-- lang
|-- midware
|-- os
`-- revctl

关于这一部分,每个人可能都会攒了一些有用的小脚本。但要注意的是,有些工做是不适合或者说不值得用脚本本身主动化的。

《卓有成效的程序猿》里说过:“别让本身主动化的努力变成剪牦牛毛”

剪牦牛毛是一件很是危急的事,它会吃掉你大把的时间,获得的却仅仅是一个不有用、仅仅能用几回或者隐患很是大的脚本工具。

3.4 脚手架

脚手架(Scaffold)是个好东西,它可以帮助咱们本身主动生成代码的“骨架”。以后利用咱们代码库的积累对骨架作微调。不断在上面加入功能就能高速地造成一个可用的应用程序。Maven提供的Archetype插件是个不错的脚手架。很是多项目都基于它提供了代码模板。

固然假设想要定制本身的模板也很是easy,详细參照《Maven原型骨架及常见问题》

除了Maven这样的构建工具外。IDE通常也提供了各类小脚手架来生成小段代码。

最多见的就是IDE里的代码模板和补全功能。假设认为只是瘾可以编写本身的模板和IDE扩展插件,就像RubyMine对Rails的脚手架的支持同样。详情见《Intellij IDEA插件开发入门》

3.5 Blog

写博客的做用可不容小觑!没作过总结的知识那仅仅是别人的知识,没作过读书笔记的书不久后就变得跟没读过同样。

当碰到了总结整理过的知识时,搜索你的Blog会给你最高速的答案。不要觉得这跟用谷歌搜索同样。一遍遍翻看你本身用心写的东西和看别人的东西是全然不一样的概念!而且中文技术文章里有太多的粗制滥造的内容、乱七八糟的排版和无数不注明出处的转发。因此看完书的一章或作完什么有用的练习后。必定要趁热打铁赶忙总结一下!

那么用什么写呢?以前试用过Emacs下的Orgmode。以前接触太轻量级标记语言。配合Emcas感受挺惊艳的!后来遇到了Sublime后连写博客都迁到它上面了,因为它的Markdown插件实在是太好用了。详见《Markdown语法及SublimeText下使用技巧》

3.6 多元化

随着写代码的时间长了、见识多了,解决这个问题的手段就会多元化起来。什么样的编程语言适合用什么样的项目。什么样的架构设计适合什么样的场景。编程语言多元化。架构设计的多元化,开发工具的多元化,终于才干促成咱们解决现实问题的思惟的多元化。Thoughtworks维护了一个技术雷达,按期会更新技术、平台、工具等方面的技术趋势。


4.狂暴:专一与抗干扰

虽然有了上面各类辅助。但是假设不能静下心来编码一切都白费了。要么看会这儿看会那儿,要么就是在嘈杂的环境中没法集中注意力。虽然不起眼,这倒是提升效率的“最后一千米”。

4.1 免分心模式

各类IDE通常都提供了全屏模式。像Sublime Text还额外提供了”Distraction Free Mode”抗干扰模式,让你专心地投入到一个打开文件的编辑工做。

4.2 虚拟桌面

用过Linux桌面版的都知道,很是多Linux分发版都提供了4个独立的桌面工做区。一个工做区可以作交流用,像收发邮件、即时通信等。一个工做区用来訪问远程server或FTP环境,一个工做区则专心编码不受干扰。Windows下也有如Dexpot这样可以实现虚拟桌面的软件,最好仍是试用一下。

4.3 盲打与打字速度

通常你们常常网上聊天的话。打字速度应该不成问题。但除了盲打26个字母外,像常用的标点符号分号括号引號、数字1-3和8-0、功能键F1和F二、Ctrl/Alt/Shift等最好也能熟悉其位置,这样敲起来才干快如风。

此外,不管用什么IDE和工具,掌握快捷键,让双手留在键盘脱离鼠标是基本功。否则空有快如风的盲打速度也是不行的。关于我最常使用的IDE的快捷键介绍请參考《十大Intellij IDEA快捷键》。关于这一部分的积累。别忘了保存到本身的Cheatsheet里。

4.4 音乐

关于为何编程时要听音乐有很多研究,还都挺有意思的,说是不只抗干扰还能促兴奋。

万能的知乎上还真有这个问题,以及一份推荐的榜单。见有哪些适合编程时听的音乐?。甚至还有个专门的站点http://musicforprogramming.net/。这方面因人而异,我我的仍是比較习惯这样的“抗噪”方式的,近期在听刚看完两季的《Silicon Valley》的OST。

4.5 面包屑

固然,被别人干扰和打断在所不免。

在离开手头工做以前,必定留下一些线索。比方关键点、思考到哪了等,这就是“面包屑”。这样等继续时就能略微快一些恢复出“现场”。就像进程的上下文切换同样。


5.高效编程=工具+方法+体系+专一

前面依据我的的经验,分享了一些提升编程效率的我的心得。

每个人的经历经验不尽一样,相信事实上每个人心中都有一份本身的清单。但最最重要的是坚持投入,不断地练习、练习、练习、练习、练习……

这里引用近期看到的名言自我勉励一下,来自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.”
到达目的地的途径有多种。

但假设你沿途不断变换路线,你是永远不会到达终点的。

李笑来老师在《把时间看成朋友》曾说过:“所有学习上的成功,都仅仅靠两件事:策略和坚持。而坚持自己就应该是最重要的策略之中的一个。”水滴石穿,绳锯木断。不要惧怕走弯路,仅仅要专一地一直走就必定会到终点!

祝福你们都能抵达梦想的彼岸。成为本身心中最厉害的那我的!

相关文章
相关标签/搜索