Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1701
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2015-09-07 20:18
文章分类
文章存档

2015年(1)

我的朋友
最近访客

分类: Android平台

2015-09-07 20:35:48

不觉间已经工作六年,回想第一天实习的场景历历在目、恍若昨日。六年已 足以令许多人转管理、转产品、转测试、转行,也一定有人还在坚守着编码,只因热爱。遇到过形形色色的经理、架构师、运维、性能工程师等等,还是觉得写代码 的才是最厉害的!在这里分享一些这些年来修习到的个人心得。也许并不适用于其他人,但对于我却都是最珍贵的“宝藏”。也谨以此文纪念在代码堆里度过的青 春~ 看到这些点点滴滴的收获,就会感到所有逝去的光阴和挥洒的汗水都是值得的。

1.启动:得心应手的工具

1.1 全能IDE

关于IDE,目前我使用Intellj IDEA和Sublime Text来应对各种语言的开发。

在大学期间初学Java时曾使用过MyEclipse,后来职业生涯的前期很自然的过渡到了更加灵活的Eclipse。但两年前经过不断的试用丢弃 再试用,最终我成功从Eclipse转投到了Intellij IDEA阵营。在那之后就一发不可收拾,不仅重度使用Intellij,而且还短暂试用过JetBrains旗下的各种产 品,Phpstorm,Pycharm,RubyMine包括最新的Clion。Google也选择Intellij作为其Android Studio的基础。作为Java开发者,当然最钟爱的还是Intellij,其智能程度实在是太震撼了!强烈建议还在观望的同学们去官网上看一下介绍它的各种操作的小动图。

好像很容易地,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命令,或者直接连接到远程的服务器上做一些操作。在Windows上模拟Unix/Linux命令当然 要用Cygwin,在Windows上使用那些实用的Unix命令可以大幅度提升效率,特别是你经常需要处理文本时。而SSH客户端一般就用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)的方法和技巧其实很简单,随之而来的好处却很多。一是对于很复杂的功能可以先实现最简单功能,再逐步完善;二是有了单元测 试,可以通过失败的用例直接找到对应出问题的代码;三是通过TDD不断迭代出的代码,设计比较合理,后期更加容易维护。任何技术都不可避免的有两面 性,TDD也不例外,详见《TDD实践感悟》

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

2.5 持续集成

持续集成(CI)被誉为项目的心跳。善加利用的话,不仅能统一大家开发的步调,集成上各种有用的插件,例如 JCoverage、FindBugs、CheckStyle和各种打包部署脚本,就能有效地提高代码质量和开发测试速度。CI配合上UAT环境能让客户 尽早地看到目前的产品是否是自己想要的那个样子,避免越到后期越是不好修改,尽早暴露问题。Java世界里最流行的开源CI服务器应该就是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等等)。

阅读(106) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~