思考,2018 年总结,2019 年目标

0. 2018

从2018年4月1日正式开始工作,到现在已经有14个月了,14个月前,自己还是一个java小白,那个时候,java语法还只会流程控制语句,面向对象思维一点没有,OOP更是谈不上,对于框架,到是听过大名鼎鼎的spring,但也只会使用@Autowired和@Service。实习第一个星期,leader让我做一个BookManager系统,使用的框架是Spring、paoding-rose(web)、paoding-jade(持久层),paoding框架是原人人网的框架,以后有机会详细介绍一下,个人认为paoding-jade算是一款非常简单易用的持久层框架。最开始虽然啥也不会,但是依葫芦画瓢的水平还是有的,大致看看leader写的几个样例,自己照着写一下,debug一下,最后三天的时间差不多搞定了。短短三天,我依稀觉得自己跨入了一道门槛。这三天时间,安装intellij、nginx、mysql、maven等等环境,并动手写了一个小项目,从数据库的crud到velocity的模板渲染,算是入门了吧!对于基础薄弱的自己,实习期的表现应该还是基本合格的吧,这也得益于大学写了不少C++。但是合格与优秀之间差了十万八千里地,当然,这是之后感觉到的,毕竟菜鸡对自己的菜的认识也是有限的。

随着业务项目的慢慢深入,也随着自己渐渐进入”java研发工程师”这样一个角色,对自己的不足也认识得越来越清晰。虽然框架基本会用了,开发新的业务也没有问题,但是要问一句我是谁,那无疑是灵魂的拷问,crud + html填空,谁上都行,我的价值在哪里呢?我觉得我的水平应当远不限于此。

在2018年6月份,我clone了spring的framework,最后证明,走出这一步的意义不关乎于我对spring的理解,而在于我走上了技术探寻的道路。读源码无疑是枯燥的,煎熬的,并且后来发现,还是需要技术的。无疑,才接触java不到3个月的我,是看不懂spring的源码的,一个模块也看不懂,但这无疑也是一件好事,因为它让我变得”不舒适”。

“不舒适”的好处就是告诉你,你很菜,这句话你的同事不会说,你的爸爸妈妈会告诉你你很棒,你的朋友会羡慕你高工资,你的女朋友会让你relax,但是优秀的源码会告诉你,你就是个菜鸡,连我在干嘛都不知道。从那时候开始,我发现优秀的源码和书籍十分的重要,他们会时刻告诉你你有多菜,你有多少东西不知道。

大跃进式的学习是无效的,如果连OOP思维萌芽都没有,连java一些基础语法和特性都没有办法完全理解,连java基础类库的全部用法都不能掌握,拿什么东西去看spring呢,浪费时间罢了。这时候才能开始体会到大牛们常常挂在嘴边的那句,基础最重要

大概7月到11月的时间,开始回头看一些经典的书籍,《java编程思想》,《设计模式》是这段时间重点学习的两本书籍。对《java编程思想》这本书的评价总是褒贬不一,现在来说,这本书绝对不是入门书籍,以前我记得有老师教我们,”看计算机的书有不懂的没关系,看到后面自然就懂了”,这句话同样不适用于《java编程思想》,如果前面有地方没有搞懂,我保证,看到后面不懂的只会变多,而不是变少。这本书是一本宏观的杂谈,没有很规整的基础知识点的罗列,没有由浅入深的节奏,它不会语重心长、郑重其事的讲解这些知识,而是以一种更高层次的态度平等的去阐述java的各种特性。《java编程思想》适合已经具备一定java基础的人去弥补自己的不足,适合在初学java的时候反复观看。《设计模式》我看的是head first的版本,这本书非常棒,目前来说,是对我提升最大的一本书,它使我开始转变java的编程思维,当然是变成OOP的思维,里面讲述了如何使用设计模式去增强复用以及提升系统的扩展性和稳定性,里面讲述了几点设计原则,这些原则应该算是OOP的精华,就像牛顿三定律在力学的地位一样。在学习完这两本书籍之后,完成了一个小的分页模块,里面使用了一些OOP的思维,使用了接口和继承,使用了模板方法模式和工厂模式。让我对OOP有了更深刻的理解。

当然,java相关的知识不是一个计算机从业者需要唯一关心的,很多计算机的基础理论会极大的丰富你解决问题的思维。去年五月份,我在一个独立工程里面使用了流水线模型,完成了一个高性能高可靠性的异步任务系统。由于需求的特殊,每一个task必须独占系统的所有资源,用来公平的对task的性能做评估,所以核心步骤必须是单线程的,这就像极了CPU,CPU不也是采用流水线架构来提升单核吞吐量的吗,受这点的启发,除了独占系统的那部分时间外,其他的工作例如前期的task初始化、远程获取、垃圾清理等等步骤都可以使用不同的流水线去完成,不同流水线之间使用一个线程安全的队列去同步,这样,即避免了多线程并发带来的系统复杂度飙升,也极大的提升了系统的吞吐量,由于系统天生线程安全,又极大保证了系统的稳定性。现在看来,这并不是一个了不起的工作,但是重点是,在我还不会java并发技术时,传统的一些计算机思维和算法仍然能够给予我极大的帮助。这个例子表明,活跃的思维和汲取灵感的能力也非常重要,要随时避免思维僵化。

2018年大概10月期间,接到一个调研数据平台的任务,与其说是调研,不如说是学习。java的家族之大,生态之活跃完全超乎我的想象,调研持续了1周,从Hadoop到Hbase再到Sqoop,从自己编译Hadoop到部署一个小的集群做MR计算,完全颠覆了我的视野,原来java可以干这么多事情。

在这期间,我还看了《Spring In Action》英文版,不得不说,这对于我的英文阅读水平有非常大的提升,读英文书籍确实比那些翻译稀烂的中文技术书要舒服得多,当然,通过这本书使我对Spring也有了一个更全面的了解。

2018年12月和2019年2月,可以算作”失去的三个月”,这三个月里面,似乎是误入了歧途。最近盛起的机器学习大潮冲昏了我的头脑,大学期间,我就十分痴迷于神经网络算法,那种痴迷就像是发现了神迹一般。机器学习的盛起让我动摇了,我把公司的《深度学习》带回了家,从家里寄来了《机器学习》和《统计学习方法》,在原本属于java的时间里面,研究起了机器学习、python、吴恩达的课程,甚至一度萌生了考研究生的念头。这期间的我是迷失的,拿不定方向的,一方面是算法,一方面是工程。等头脑渐渐清醒的时候,发现自己不可能是那个可以用算法改变世界的人,机器学习在现阶段也要落地到具体工程上。回头望向好久没有精进的java,还好它还在等我,魅力不减当年。当然,这段经历也不是全然没有帮助,首先它帮助我明确了目标,其次它提供了一种更加数学的和更加形式化的方式去看待计算机问题。

2019年3月到现在,重振旗鼓之后,算是踏踏实实的去好好学习了一下java,期间也深入看了不少框架。比起60W行的spring和5W行的mybatis,我仔仔细细的阅读完了paoding-jade框架,这个框架很小巧,完全基于spring对jdbc的支持和动态代理完成的一个持久层框架,框架一共不到5K行,麻雀虽小五脏俱全,核心思路就是使用动态代理,创建各种interface的代理类,然后解析注解里面的sql语句,扔进spring的JdbcTemplate执行,最后将结果使用自定义的RowMapper去解析。大致用法和Mybatis的注解用法差不多,但是简洁很多,比如对”in”的支持和一些动态表达式的支持等等。之后又阅读了部分paoding-rose框架,个人感觉这个框架过分强调了模型而在某种程度上忽略了功能,感觉比较臃肿,所以放弃了,但是核心思路看到了,debug也不成问题,我觉得到这个程度就可以了,rose基于filter去拦截请求而不是servlet的思路让我觉得非常新颖,”约定大于配置”的信条也非常前卫(应该是来自于ruby on rails)。除了这些框架以外,我还看了Jedis的部分源码,Jedis算是一个简单粗暴的框架,里面主要封装了和redis的通信,以及pool,比较深入的用法还没有来得及研究。Spring仔细阅读了bean部分的代码还有很多其他代码。哦,对了,WebMagic这个爬虫框架也完全阅读过了,并做了一些自己的扩展。仔细的阅读完了ThreadPoolExecutor的源码和BlockingQueue的源码,对并发的技术提升不少。自己尝试写了一个封装阿里云TableStoreSDK的持久层框架,用jade的思路,It works,很开心,对Class、动态代理以及反射技术掌握了很多。

2018年由于业务需要,还学习了一段时间的Ruby,这个语言真的花里胡哨的,语法糖巨多,个人不太喜欢,但是做到了基本能读懂它在干什么。也学习了Python,感觉python是不能够做工程的,给人的感觉没有java严谨,写写脚本那真的非常棒。node.js对我算是一次颠覆,它在对那种高并发的轻量请求比java来的容易的多,因为它是基于异步事件驱动的语言,而且启动快,去年有一个小服务我就是用node.js做的。之后有空可以看看Golang,了解一些其他语言的理念也是很棒的事情。

目前在看dubbo框架,这个框架真是一想之美,又勾勾又丢丢。我想我们的架构离进一步的微服务化也不远了。

硬要做一个总结的话,踏实不足浮躁有余,很多东西掌握得都还非常的表面,比如Spring框架的阅读,还有很多代码下载了都只是瞟了一眼,要弄清工作、学习、女朋友、身体这四者的关系也着实不容易。总之2018年到现在有失去的,有得到的,更多的应该还是得到的。要说不满意的地方,那就是学习效率和学习深度。

1. 2019

其实现在已经过去5个月了,但是考虑到2018年四月才入职,算了,就不在意这些细节了,争取明年的总结时间提到1月份。

那2019的计划当然也是剩下的7个月里的计划。

接下来的7个月里面,java的进一步掌握就是我要攻克的重点。

  • java集合源码全部阅读,JUC源码阅读,弄懂nio。
  • 看源码一定要写demo然后去debug
  • netty
  • spring-bean spring-mvc spring-context
  • Dubbo SOFA
  • tomcat
  • Apollo zk
  • RocketMQ
  • 一致性算法 raft
  • 工资upup

野心不可谓不大,也许无法全部完成,但是尽力吧!

最后,送上一句”莫那·鲁道”的话共勉:”站在十年之后看今天的自己”。