随着在这个行业里年限地增长,慢慢地,偶尔也会被问及如何入门和提高?为了避免不一而再,再而三地重复同样的内容,特意在这里写下一些个人的所感所悟。完全是一家之言,只是为了自己省事,没有半分为人师表的意思。
1. 概述
笔者属于半路出发的选手,入行的时候没有去过培训班,时至今日也没呆过大公司体验正规的开发流程,更没有得高人指点打通任督二脉的奇特境遇。唯一一次得贵人青睐的机会还让自己主动放弃了。所以这些年来漫长的自学路上孤身一人走到了现在,既是周遭环境影响,也是个人性格所致。
说上面这些的目的不是为了顾影自怜,只是为了说明,虽然时代不同了,但是我下面要说的这些方法相信还是能够对你有所帮助的。毕竟努力的路上独自前行才是常态,而笔者正是这么过来的。现在就让我们开始吧。因为笔者做的是前三年的.NET,而后面这几年则是Java。所以下面的推荐中某些细节是基于Java,但所有提及的方法和注意事项与语言无关。
2. 入门篇
2.1 读一本入门书籍
首先,本文对于完全没有基础的,建议下看看 《Core Java(第10版)》(中译《Java核心技术》),Java在入门书籍的位置做得并不好,所以这本属于矮子里挑将军。 如果你是半路出家,并且经济压力比较大,那就先SSM框架撸起来,然后业余时间把这本书实践掉。笔者因为是从.NET转到Java,所以对于这本书只是扫了一遍,现在对这本书的印象就是写得还是蛮详细的,记住其中关于桌面开发的部分可以直接跳过。
2.2 建一个私人项目
强烈建议在入门这行的时候,马上创建一个项目,这个项目里存放的就是你针对JDK或者某个学/用到的第三方框架里的某个类的研究的代码,以单元测试的形式进行存放,这一步一定要引起足够的重视。因为这个项目将陪伴你走完你的整个职业生涯。
这里我能给出的其他建议是:
- 将JDK和第三方框架的研究分为两个项目,尽量保持JDK研究项目的依赖纯洁性。
- JDK研究项目就是按照框架的package结构来组织你创建的package结构。
- 单元测试类的命名也是直接以被研究类的名字开头,加上个人比较倾向的后缀。
- 第三方框架的研究分开进行,分别创建项目,不要偷懒整合在一起。相信我,最开始我就是这么干的,但随着迭代,发现各种依赖彼此打架,最后自己都越来越不愿意打开那个项目了。至于重复工作量的问题,完全可以通过maven的archetype特性进行大幅缓解。
- 最后就是保持更新,保证迭代。创建一个庞大的财富基石。
2.3 写博客
从入门之初就要开始写博客,保持一周一篇原创博客的更新频率——只要是原创的就行。博客里可以记录基础知识(重要的是自己的总结和理解)。内容浅薄很正常,重要的是从博客所展示的时间线里表现出来的你的学习能力,坚持,坚韧,进步速度,这些品质在任何地方都能让人高看一眼。
记住一开始博客会很差,但只要你现在的博客比之前的好,这中间的比较就是能被人看到的进步,那么过去的差就能反衬出你现在的好。
这是笔者之前写过的一篇文章 —— 为什么要写文章,这篇文章可以不看,但请一定要看看其中引用的那篇参考文章。绝大多数看过的人都会有滋生庆幸和后悔这两种情绪,笔者也是。
2.4 熟悉几个常用的第三方工具集
类似于Google的Guava,Apache的lang3,或者是码云上的明星项目hutool-core,这些工具集可以大大减轻你在编码中重复性的劳动,同时还能大大减低犯错的风险。读者可以通过在上面创建的项目中进行这步操作。
笔者所在的公司的规模也是小,所以来面试的人水平也不怎么样,但是很多号称两三年,甚至四五年工作经验的人被问到平时是怎么处理文件,字符串,日期等操作时,回答都是网上找个工具类,或者直接下面这种(大哥你在这行业里这么些年干什么去了?你说JVM,JDK源码研究看不到效果不好坚持,这工具类学一个马上见效的东西你也不了解下,这说不过去吧.....):
2.5 使用电子笔记本
笔者面试的某些面试者,偶尔还是会有透露自己依然是使用纸质笔记本来进行日常知识的归纳总结。首先传统的纸质笔记本有其优点——所谓眼过千遍,不如手过一遍。但是IT作为一个知识迭代非常快(其实这话里有陷阱),纸质笔记本的迭代速度实在是有些捉襟见肘。
所以还是推荐入门的时候就选定一个自己比较中意的电子笔记本作为知识管理工具,当然如果你要是能够去熟悉个人Wiki这种专业的那是最好了。
这里就给出几个关于电子笔记的最佳实践:
- wiz,印象,OneNote等等都可以,笔者用的是wiz。但是更推荐OneNote,不过国内OneNote同步是个问题,所以笔者在使用了两年的OneNote后换成了wiz。
- 选择哪种不是很重要,最重要的是一旦决定,一定要坚持下去,保持所有的知识都在其上,不要东放一点,西放一点。这是笔者多年来血的教训,也是《如何有效阅读一本书》里作者明确提出的观点。
- 最后还是上面的那句话,最重要的是不断为笔记补充原材料,笔记的格式可以乱,排版可以不好看,但正所谓巧妇难为无米之炊,原材料都没有,你要上天都没梯子。
- 保持迭代,不要认为记录在那就万事大吉了,记录的目的是为了以后能够找到并借鉴甚至改良它。
3. 提高篇
这里提高的意思是你在能够满足一般小公司的业务开发——现在的你能把东西磕磕碰碰地做出来,但做的质量不高。
3.1 编码规范
本想将本小节放在”入门篇“里的,但考虑到新手入门初期连基础知识都忙不过来,如果顾及太多可能就疲于奔命到灰心丧气,故将其放在了这里。
我们总被教导——能力有问题可以忍,但态度有问题就绝对不能留了。而在开发中,代码的逻辑完整性是能力问题,但你这代码写得时间长了,只有上帝知道什么意思,那就只能是态度问题了。
记住只有有意义的命名才能被人理解和记住, 你随便取个无意义的A,你打算一周后如何回忆其代表的意思? 靠回忆当时的心理状态还是当时的中午吃了什么吗?
所以这里再次推荐下《Clean Code》这本书,这是笔者加过的对代码规范要求最严苛的一本书。相比较之下,《重构》,《.NET设计规范》,《阿里巴巴代码规范》等都略有放松。相信等你实践完这本书,你不会再对任何代码规范产生约束感。
此书可以阅读三遍以上,并反复实践其中的内容,然后演化出自己的风格(记住这个风格和团队的代码风格不能冲突,如果冲突,请让步于团队风格)。
最后说几句题外话,笔者在实际的工作中,发现不少开发人员抱着你又没说的心态。上述的代码规范看似区别很大,但所有的差异也只在于细节的详尽程度和偏好,大体诸如有意义的命名,快速返回,仔细挑选访问修饰符,使用更有针对意思的异常等等,这些东西绝对不可能有偏差,也绝对存在各个规范中。
笔者认为基础就意味着我们默认你要一定要掌握的,否则你是怎么进入这一行的? 算法和数据结构是基础,但平时工作中中用不到,你只会简单的几种能理解,但代码规范这种无时无刻不在的东西,你还寄希望别人来教你? 请认清楚你是在工作,你是拿着薪水的员工,不是付款的学生,笔者极其抵触在这上面还振振有词,别人把碗和饭准备好还嫌不够,还得递到嘴边的行为。学习和传授永远是双向选择,在讨论二次方程式的解法时,没有人希望对方连1+1等于几都还需要教。
遵循了绝大部分最佳代码规范,只有少数几处违反了可以理解为暂时不知道,但全部都是反例的代码就很难让人相信所谓的热情和态度端正了,没有人希望自己认真对待的东西被人以玩笑的态度对待。
3.2 推荐书籍
接下来就直接推书了,很多只能意会,无法言传的东西恕笔者现在的功力不够还无法用文笔表现出来,读者可自行翻阅其他大牛的作品。
- 《深入分析Java Web技术内幕》- 这一本基本能让你胜任要求比较高的开发任务了。
- 《Spring源码深度解析》- 逃不开的门槛。
- 《Maven实战》- 只要谈到Maven学习就一定是它,在公司推荐不知道多少次了,一个去看的都没有。然后有问题就又问过来了。
- 《重构》- 好代码是演化出来的。
- 等等,有时间笔者可以拍张照片上传。
4. 进阶篇
到了这一步,你应该有了自己的判断和对这个行业的理解,笔者就不妄下断言了,正如本文的开头,本文只是从笔者自身这么多年的实践出发,提供一些入门技巧,希望能够帮助到几个迷茫的朋友。
5. 参考
- 程序员必读书单 - 这是笔者还在做.NET的时候找到的书单,非常全面,涉及多种语言以及基础。
-
语言选择: