从决定撰写本书到完稿历时9个月,期间曾经遇到过种种困难和挫折,但这个过程让我明白了坚持的意义,明白了“行百里者半九十”的寓意——坚持下去,终于到了写前言的时刻。
为什么写这本书
从第一次敲出/"Hello World/"到现在已经有15年时间了,在这15年里,我当过程序员和架构师,也担任过项目经理和技术顾问——基本上与技术沾边的事情都做过。从第一次接触Java到现在,已经有11年4个月了,在这些年里,我对Java可谓是情有独钟,对其编程思想、开源产品、商业产品、趣闻轶事、风流人物等都有所了解和研究。对于Java,我非常感激,从物质上来说,它给了我工作,帮助我养家糊口;从精神上来说,它带给我无数的喜悦、困惑、痛苦和无奈——一如我们的生活。
我不是技术高手,只是技术领域的一个拓荒者,我希望能把自己的知识和经验贡献出来,以飨读者。在写作的过程中,我也反复地思考:我为谁而写这本书?为什么要写?
希望本书能帮您少走弯路
您是否曾经为了提供一个/"One Line/"的解决方案而彻夜地查看源代码?现在您不用了。
您是否曾经为了理解某个算法而冥思苦想、阅览群书?现在您不用了。
您是否曾经为了提升0.1秒的性能而对N种实现方案进行严格测试和对比?现在您不用了。
您是否曾经为了避免多线程死锁问题而遍寻高手共同诊治?现在您不用了。
……
在学习和使用Java的过程中您是否在原本可以很快掌握或解决的问题上耗费了大量的时间和精力?也许您现在不用了,本书的很多内容都是我用曾经付出的代价换来的,希望它能帮助您少走弯路!
希望本书能帮您打牢基础
那些所谓的架构师、设计师、项目经理、分析师们,已经有多长时间没有写过代码了?代码是一切的基石,我不太信任连/"Hello World/"都没有写过的架构师。看看我们软件界的先辈们吧,Dennis M.Ritchie决定创造一门“看上去很好”的语言时,如果只是站在高处呐喊,这门语言是划时代的,它有多么优秀,但不去实现,又有何用呢?没有Dennis M.Ritchie的亲自编码实现,C语言不可能诞生,UNIX操作系统也不可能诞生。Linux在聚拢成千上万的开源狂热者对它进行开发和扩展之前,如果没有Linus的编码实现,仅凭他高声呐喊“我要创造一个划时代的操作系统”,有用吗?一切的一切都是以编码实现为前提的,代码是我们前进的基石。
这是一个英雄辈出的年代,我们每个人都希望自己被顶礼膜拜,可是这需要资本和实力,而我们的实力体现了我们处理技术问题的能力:
你能写出简单、清晰、高效的代码?——Show it!
你能架构一个稳定、健壮、快捷的系统?——Do it!
你能回答一个困扰N多人的问题?——Answer it!
你能修复一个系统Bug?——Fix it!
你非常熟悉某个开源产品?——Broadcast it!
你能提升系统性能?——Tune it!
……
但是,“工欲善其事,必先利其器”,在“善其事”之前,先看看我们的“器”是否已经磨得足够锋利了,是否能够在我们前进的路上披荆斩棘。无论您将来的职业发展方向是架构师、设计师、分析师、管理者,还是其他职位,只要您还与软件打交道,您就有必要打好技术基础。本书对核心的Java编程技术进行了凝练,如果能全部理解并付诸实践,您的基础一定会更加牢固。
希望本书能帮您打造一支技术战斗力强的团队
在您的团队中是否出现过以下现象:
没有人愿意听一场关于编码奥秘的讲座,他们觉得这是浪费时间;
没有人愿意去思考和探究一个算法,他们觉得这实在是多余,Google完全可以解决;
没有人愿意主动重构一段代码,他们觉得新任务已经堆积成山了,“没有坏,就不要去修它”;
没有人愿意格式化一下代码,即便只需要按一下【Ctrl+Shift+F】快捷键,他们觉得代码写完就完了,何必再去温习;
没有人愿意花时间去深究一下开源框架,他们觉得够用就好;
……
一支有实力的软件研发团队是建立在技术的基础之上的,团队成员之间需要经常地互相交流和切磋,尤其是基于可辨别、可理解的编码问题。不可否认,概念和思想也很重要,但我更看重基于代码的交流,因为代码不会说谎,比如SOA,10个人至少会有5个答案,但代码就不同了,同样的代码,结果只有一个,要么是错的,要么是对的,这才是一个技术团队应该有的氛围。本书中提出的这些问题绝大部分可能都是您的团队成员在日常的开发中会遇到的,我针对这些问题给出的建议不是唯一的解决方案,也许您的团队在讨论这一个个问题的时候能有更好的解决办法。希望通过对本书中的这些问题的争辩、讨论和实践能全面提升每一位团队成员的技术实力,从而增强整个团队的战斗力!
本书特色
深。本书不是一本语法书,它不会教您怎么编写Java代码,但是它会告诉您,为什么StringBuilder会比String类效率高,HashMap的自增是如何实现的,为什么并行计算一般都是从Executors开始的……不仅仅告诉您How(怎么做),而且还告诉您Why(为什么要这样做)。
广。涉及面广,从编码规则到编程思想,从基本语法到系统框架,从JDK API到开源产品,全部都有涉猎,而且所有的建议都不是纸上谈兵,都与真实的场景相结合。
点。讲解一个知识点,而不是一个知识面,比如多线程,这里不提供多线程的解决方案,而是告诉您如何安全地停止一个线程,如何设置多线程关卡,什么时候该用lock,什么时候该用synchronize,等等。
精。简明扼要,直捣黄龙,一个建议就是对一个问题的解释和说明,以及提出相关的解决方案,不拖泥带水,只针对一个知识点进行讲解。
畅。本书延续了我一贯的写作风格,行云流水,娓娓道来,每次想好了一个主题后,都会先打一个腹稿,思考如何讲才能更流畅。本书不是一本很无趣的书,我一直想把它写得生动和优雅,但Code就是Code,很多时候容不得深加工,最直接也就是最简洁的。
这是一本建议书,想想看,在您写代码的时候,有这样一本书籍在您的手边,告诉您如何才能编写出优雅而高效的代码,那将是一件多么惬意的事情啊!
本书面向的读者
寻找/"One Line/"(一行)解决方案的编码人员。
希望提升自己编码能力的程序员。
期望能够在开源世界仗剑而行的有志之士。
对编码痴情的人。
总之,只要还在Java圈子里混就有必要阅读本书,不管是程序员、测试人员、分析师、架构师,还是项目经理,都有必要。
如何阅读本书
首先声明,本书不是面向初级Java程序员的,在阅读本书之前至少要对基本的Java语法有初步了解,最好是参与过几个项目,写过一些代码,具备了这些条件,阅读本书才会有更大的收获,才会觉得是一种享受。
本书的各个章节和各个建议都是相对独立的,所以,您可以从任何章节的任何建议开始阅读。强烈建议您将它放在办公桌旁,遇到问题时随手翻阅。
本书附带有大量的源码(下载地址见华章网站www.hzbook.com),建议大家在阅读本书时拷贝书中的示例代码,放到自己的收藏夹中,以备需要时使用。
勘误与支持
首先,我要为书中可能出现的错别字、多意句、歧义句、代码缺陷等错误向您真诚地道歉。虽然杨福川、杨绣国两位编辑和我都为此书付出了非常大的努力,但可能还是会有一些瑕疵,如果你在阅读本书时发现错误或有问题想一起讨论,请发邮件([email protected])给我,我会尽快给您回复。
本书的所有勘误,我都会发表在我的个人博客(http://cbf4life.iteye.com/)上。
致谢
首先,感谢杨福川和杨绣国两位编辑,在他们的编审下,本书才有了一个质的飞跃,没有他们的计划和安排,本书不可能出版。
其次,感谢家人的支持,为了写这本书,用尽了全部的休息时间,很少有时间陪伴父母和妻儿,甚至连吃一顿团圆饭都成了奢望,他们的大力支持让我信心满怀、干劲十足。儿子已经6岁了,明白骑在爸爸身上是对爸爸的折磨,也知道玩具是可以从网上买到的,“爸爸,给我买一个变形金刚……你在网上查呀……今天一定要买……”儿子在不知不觉中长大了。
再次,感谢交通银行“531”工程的所有领导和同事,是他们让我在这样超大规模的工程中学习和成长,使自己的技术和技能有了长足的进步;感谢我的领导李海宁总经理和周云康高级经理,他们时时迸发出的闪光智慧让我受益匪浅;感谢软件开发中心所有同仁对我的帮助和鼓励!
最后,感谢我的朋友王骢,他无偿地把钥匙给我,让我有一个安静的地方思考和写作,有这样的朋友,人生无憾!
当然,还要感谢您,感谢您对本书的关注。
再次对本书中可能出现的错误表示歉意,真诚地接受大家的“轰炸”!
秦小波
2011年8月于上海