昨天晚上出去和几个朋友交流了一下,聊了很多,思考了一下这一年学习技术的经历,趁着在宿舍养病,将自己的想法记录了下来。
总结过去与思考
从开始决定当码农到现在将近两年零三个月,起初是因为自己专业的科研不是自己想象中的那样,加之对程序员的羡慕和崇拜,于是就走上了码农的不归路。作为非科班出身的学生,和计算机院的学生比起来有先天的劣势,例如好多的基础课程未学习、周围的编程氛围太差等等,然而事实上:正是由于不是科班学生,我们比别人更努力,更愿意付出时间去学习。
去年四月底开始学android,当时是由于实验室项目(不是做应用层),今年6月份开始学了一个多月iOS,移植了写在android上的功能。今年做了三个商业性质的软件,1月份做了我第一个商业项目,4月份做了一个供路由器使用的app,八月份做了比较大的一个项目模块类似于茄子快传/QQ面对面传文件,800多万的用户。
站在今天的角度来审视这一年走过的路,用一句话来总结就是:觉得什么都没干呢,一年就过去了!
随着时间的发展,我对一些东西也有深的认识,就拿android开发来说。android开发学起来很简单,上手很容易,高中生也可能会做,但是做android难道仅仅是拖几个控件,摆几个layout或者使用几个漂亮的开源框架能做个还说得过去的手机app么?显然不是的。使用工具,使用轮子来拼凑产品只是最基本的要求,深入原理才是更重要的,不仅仅要知其然,更要知其所以然!例如android中的各种manager,进程间通信Binder,view视图的绘制,触摸事件的分发,消息机制,view动画等等,如果不去研究,不去看原理,做一段时间就会遇到瓶颈期,因为会发现android开发就是接口api的调用,你可能会傻傻的认为手机屏幕上显示的一个界面就是activity,甚至都不知道传说中的Java程序的启动类main函数在哪。还有由于android自带的控件比较丑,做项目的时候会使用一些第三方的控件、效果,不能仅仅会直接拿来用这些,在达到一定的水平之后,要试着自己来实现一些好的效果,不仅提高自己的水平,可能还会造福他人。在一个就是使用第三方的开源框架工具,比如经常使用的ImageLoader,Volley,他们到底是怎么实现的呢?这些都是用来学习的最好的资料啊!当然我目前还没研究这两个,不过接下来肯定要看看。
所以我体会最深刻的就是,做一门技术,会用只是最基本的要求,会使用很简单,难的是要能深入到底层的原理,一定要研究的深入。知其然,知其所以然,当然并不是让所有人去重复制造轮子,而是在制造轮子的过程中,对自己技术的提升绝对是非常非常快的。其实团队开发中也有更重要的例如编码规范、风格,模块的解耦合等等,这个另当别论。以后工作了就很少有时间去研究了,跟着产品迭代的节奏会很少有时间去学习,所以一定要珍惜现在的时间。
java是做android的基础,其实刚开始学android的时候,我的java基础并不是很好,好多都是根据c++的类比大致了解了一下。也是在今年,好好的把java的相关知识研究了一下,对语言的学习也不能仅仅停留在知道怎么用的层次,照着教学视频能实现各xx系统没什么用,基础才最重要。有时间最好去研究其深层的原因,这绝对是有益而无害的。比如java的集合具体是怎么实现的?当然这和学过的数据结构是一样的,只是jdk的开发者封装的更好,代码更加严谨,研究这些源代码不仅仅是对数据结构的复习还是对大牛的编程思想风格的学习。还有如果不看代码,怎么知道hashtable和vector为什么是线程安全的,如果不懂原理,怎么知道hashmap是乱序的treemap是有序的?还有java中高级一点的主题NIO(这是我做类似于茄子快传/QQ面对面快传功能的基本技术)、并发编程。不要认为做android又不是做后台服务器,学这些用处不大,这就大错特错了。事实上这些知识都是非常有区分度的,也是非常有用的。再深入java要学的当然就是java虚拟机,这也是最近正在研究的内容,里面关于内存空间划分、垃圾回收、类加载的过程等等都是非常非常有用的东西。例如,能看懂字节码,对理解类、对象的初始化过程就有很大帮助。
展望未来
由于下一年就要找工作,所以接下来学习的东西会更偏向于基础知识。
android部分要在研究一些开源框架,图片缓存加载库ImageLoader,Volley通信库和一些框架层的源码。
java会按照java面试宝典上的内容再回回顾一下java的小知识,继续看深入理解java虚拟机。
tcp/ip:其实作为学通信的,这部分掌握较好,不过还要认真看看。
算法:之前已经将数据结构还有常见的排序算法写了一遍并且整理在了博客,因为我不想在基础知识还不熟悉的情况下就去刷题。接下来就要狂刷题,看剑指offer,编程之美。虽然我很反对应试教育。
操作系统:看一本操作系统的书/视频。
设计模式:其实之前已经研究过一部分设计模式,android中最常用的观察者模式、工厂模式,java I/O的装饰者,集合中的迭代器等等,后面还要再学习几种。
另外,再深入挖掘以前所做项目中的相关问题。
干任何一件事情,都不可避免的会走一些“弯路”,可是这是弯路几乎是非走不可的,因为任何事情,你不经历永远体会不到。更何况,所谓的弯路并不一定是弯路,任何走过的路,犯过的错,都会成为日后成功的垫脚石。记得前段时间看知乎上有个问题:你有什么道理后悔没有早点知道?从这个角度来看,我的回答是:看书,看经典书。经典书籍绝对是最好的知识宝库,以前没意识到看书的重要性。事实上当真正研究了一本书,就可以对相关方面有一个全面的掌握,更主要的是还能对一些问题有更深刻的见解。经常说的一句话:光阴似箭岁月如梭时光荏苒如白驹过隙一般。现在最大的感触就是时间过的真的好快,然而过去已经无法掌控,那么只有把握好当下。时间过得很快,一定要勤奋。
下面罗列一些我看过的java相关的很不错的书,有些书不一定完全看了。
Thinking in Java
Java并发编程实战
Java Nio
深入理解java虚拟机
深入理解android内核设计思想
算法导论(前面部分)
TCP/IP 电子科大杨宁老师的视频
设计模式之禅
effective java
还有一些我没看过的,但是评价非常不错的书
Java核心技术卷1/2
Java并发编程的艺术(已购买)
Android开发艺术探索(看了目录就感觉相当棒,绝对是好书)
鸟哥的私房菜(学android还是要掌握一些Linux的)
hotspot实战(翻过pdf,还不错)
* *以上只是我个人的一些观点,如果有什么不妥之处还请谅解**