2017年总结

12月下旬了,是时候总结一下2017年的收获和教训。

Java

今年最大的收获是明确了接下来的技术发展方向。从中级迈向高级,有四个方面的技术需要掌握。

一、Java虚拟机

掌握Java虚拟机的工作原理,包括内存布局、垃圾回收、JVM调试、字节码的结构、JIT运行机制等。

今年买了《深入理解Java虚拟机》,目前已学完一半。

二、数据结构和算法

掌握java.util包下的各种集合类,包括但不限于ArrayList、LinkedList、HashMap、TreeMap、HashTable、HashSet、TreeSet等。这里说的“掌握”并不仅仅是熟悉API,而是掌握具体的数据结构及算法,诸如堆排序、红黑树等。要理解每一种数据结构的优劣、是否线程安全、内存的消耗情况等。

由于工作需要,这两年一直在反复研读严薇敏老师的《数据结构(C语言版)》。但是这本书相对而言还是浅显了,进一步掌握还是得靠《数据结构与算法分析》这本书,并且仔细分析java.util包中提供的源代码。

三、Java并发编程

掌握分时操作系统的算法和原理,进程、线程的应用与原理、Synchronized及其实现原理、线程间的协作(wait/notify/sleep/yield/join)、volatile的使用及其原理。

并发编程一直是我最弱的一环。虽然软件设计师考试中关于操作系统进程调度的题目我都能正确解答,但是实在缺乏应用经验。需要仔细分析java.util.concurrent包的工具类,以及它们的实现原理。

四、Java网络编程

每个学Java的同学都会学Socket、HttpURLConnection,但是这远远不够。需要掌握Java的NIO、AIO、BIO等类库,掌握不同的I/O模型(select、poll、epoll、kqueue),掌握实际开发常用的框架(Netty、Mina)。

软件工程

今天通过了软件设计师认证。但在软件工程方面,实在没有什么值得称道的长进。也许明年会开始学习系统分析师的九大知识域吧。

一、软件测试

因为研发软考课程的需要,不得不学习软件测试的相关知识。以前只了解黑盒测试用例,今年又学习了一些白盒测试的设计方法。诸如环路复杂度分析,判定表,语句覆盖、条件覆盖、路径覆盖等。

帮助测试工程师分析了一些基于python和selenium的自动化测试脚本。对软件的自动化测试有了一定了解。

二、持续集成(CI)

今年接触了不少使用Jenkins进行持续集成的项目。不过由于我今年并没有什么需要持续集成的项目,所以暂时搁置了这方面的学习。

三、Docker

今年用这个神器部署了自己的论坛、博客,以及Minecraft服务器,挺好玩的。来年打算学习如何使用Docker的脚本来制作镜像。

不过优先级很低,原因还是没有需要实际应用docker的项目。

四、自动化构建

自动化构建工具有很多,我说的是Gradle。今年把用了好几年的Eclipse 3.8升级到了最新的4.6、4.7,就是因为新版本的Eclipse自带Build Ship插件,可以直接创建Gradle工程。

从2017年下半年开始,我强迫自己把所有Eclipse工程都改成了Gradle工程,使用build.gradle脚本来管理项目依赖。

来年要进一步掌握gradle的自动构建脚本,并尝试把自己的项目发布到jcenter。

教学

今年我退出了教学工作,重归教学内容研发,期间辅助同事点评一些学生的作业。唯一说得上的成果,是在今年第三季度,我利用业余时间编写的一套jMonkeyEngine初学者教程。

这是一个失败的成果。

  • 由于没有任何人约束自己,也不需要严格遵循规范,写作思路经常飙到八百里之外;
  • 事先只做了一个非常简陋的大纲,没有认真分析每一章内容的知识复杂度和所需的学时;
  • 没有考虑按知识的难易度分层,把递进教学思路抛到九霄云外;
  • 没有设计每一章所需的练习,缺乏实践;
  • 资产管理器(AssetManager)这么重要的东西我居然没写!

与其说这是一个教程,不如说只是我个人的学习笔记。

2018年,要重做第二版教程,这回要仔细规划规划。

图形学

今年我的兴趣发生了重大改变,从游戏设计与开发转到了计算机图形学。

起因是我总觉得jMonkeyEngine的画面不如Unity3D和Unreal引擎的画面好看,同时认为这并不是jME3的锅,是我技术不行做不出来。

于是我怒买了很多图形学的书,诸如:

由于图形学中有大量的数学公式,我又买了:

我在知乎上关注了龚敏敏、叶劲峰、秦春林、空明流转等诸位大佬,并且尝试用Java开发了一个3D软光栅渲染器,以此来实践图形学的各种算法。

然而我对力量依然一无所知。。

图形学领域还有全局光照、基于物理的光照模型、阴影渲染、水体渲染、体积光、体渲染(体积云)、次级平面散射、抗锯齿、延迟渲染等诸多技术需要解决。

如果想要实现能和角色交互的水面,还得学习快速傅里叶变换(FFT)。

今年头发掉的很厉害……吐血。

3D游戏开发

一、游戏引擎

今年对jMonkeyEngine的理解更深入了,不过对于它的图形渲染方式依然不是很清晰。可喜的是,本来我以为jme3只支持1个Pass,后来看FilterPostProcessor的源代码才发现可以增加多个Pass。2018年要再仔细研究一下jme3的渲染引擎,争取读完jme3的全部源代码。

出于对照学习的目的,我2018年打算找一个开源的C++引擎来学习。UnrealEngine暂时还是算了,太复杂,先找个“简单副本”通关了再说。目前决定选择Urho3D引擎,我已经加入了一个Urho3D的讨论群。

Unity3D依然不在我的学习日程上。

二、游戏设计

游戏首先得有可玩性,程序、美术、音乐都要为此服务。我对游戏设计一窍不通,光有技术是做不了游戏的。

今年买了几本与游戏设计相关的书籍,由于沉迷图形学技术,目前只读了第一本。希望来年能学完《游戏机制 高级游戏设计技术》。

三、3D建模

今年上半年在B站看了几集“台湾大神的Blender教程”,了解了Blender的操作方式,能够自己进行简单的3D建模。不过UV展开、纹理、材质、渲染、动画等操作还没学。另外由于没有经常动手练习,现在已经有点遗忘了。

下面是知乎上一个比较靠谱的建议,我打算2018年根据他的建议继续学习Blender。

如何系统的学习blender? - 章彦博的回答 - 知乎

Blender官方网站:https://www.blender.org/

Blender中国社区:http://www.blendercn.org/

今年还买了一本书:《网络游戏角色制作(附光盘)》,光盘里有很多课时的建模视频教程,使用的是3ds max。

2018年的当务之急不是买新书,而是要消化这些知识。

四、音乐

其实我没打算开始学音乐的,但是老婆买了一把尤克里里。这把琴有附带的教程小册子,看起来还蛮有意思的。不过今年没什么机会了,2018年再学吧。

恐怕还得学一点乐理知识。

总结

我想学的东西很多,但人的精力是有限的,面面俱到的结果是每一门都无法深入。

虚云老和尚开示:

凡看一切经书。虽云广记博闻。反塞自己悟门。不如一门深入。尽空所有。自有相应处。决不赚人。只要坚心。此事旷劫难逢。我与诸人。多生错过。今不努力。便待何时。挨舍身命。毕竟乐讨个分晓。若不如此。永堕地狱。倘或见谛。上宏下化。以报佛恩。若不如此。亦永堕地狱。

2018年的重点依然是Java,毕竟这是我吃饭的本事。优先学完虚拟机,随后并发和网络编程是最主要的东西,数据结构和算法则靠后续的慢慢领悟。持续集成、自动化构建、自动化测试,应该伴随工作自然掌握。

如有余力,则继续研究图形学技术,并尝试在jme3中实验各种图形学方法,通过实践来掌握技术。比较零碎的时间,可以抽空学习游戏设计、3D建模和音乐,不求熟练应用,只求弄懂这一行是怎么回事。

虽然我想转行做技术美术,但这个急不来。总得先拥有足够的能力,才能有机会去做,初步计划还要有3~5年左右的学习期吧。