链接:https://www.zhihu.com/question/21565227/answer/142800222
来源:知乎
1、初级之路 1.1 项目引路 对于自学的人来说,在边做边学的过程中是最容易起步的了。我的技术之路也是这样开始的,当年参加创业大赛的时候,我们想做一个类似于Admob的产品,拉上一堆好友开始做产品,由于我们缺乏技术,所以自己也上场了。从一个实际的项目开始,学习java学习android一步步的完成产品的开发,在后续的过程中,我们还做了一款抄袭Bump的软件叫做:《分享乐》以及一款聚会O2O软件我也忘记啥名字了,也许你现在还能在豌豆荚上搜索到。
1.2 学习 Java JAVA核心技术(卷1) (豆瓣) Effective java 中文版(第2版) Android Android开发入门教程 (豆瓣) 这个阶段我的学习资料主要来自于书本,那个时候是10年的时候了,网上资料还并不是特别多(个人到现在也是习惯书本系统学习),我记得Java语言是学习的《Java核心技术》,这个系列有两本书,这本书可以理解成一本工具书,对于Java的讲解面面俱到,在你不记得相关的知识的时候需要拿出来,巩固学习。而Effective Java的学习是进阶学习,在了解Java的基础的前提下,开始学习更多知识点。 学习完Java后,就按照入门教程上说的慢慢的做Android开发,这个时候API主要是在Android开发入门教程上做对照。但是这个时候大家都会遇到一个情况就是,实现之后会出现一些莫名其妙的问题,所以还必须要会利用一些平台去搜索。
1.3 解惑 现在Android的资料已经满天飞了,最好的方式就是VPN+google的方式了,基本上大部分的问题都已经有了答案,因为行业已经很成熟了。我们那个时候相关资料比较少,都是去论坛提问的多,比如那个时候的eoeandroid以及csdn的移动论坛,在里面搜索答案或者自己提问,这样就能解决很多疑惑了。 现在大家最好的地方就是:https://www.google.com Stack Overflow
1.4 找工作 1.4.1 策略 学习+刷题 当你不断的学习和做项目总结经验,总结遇到的坑和解决方案后,这个时候我们要从草根发展走向专业之路了,所以我们需要一份工作。 面试的时候,大公司对于应届生的要求主要还是集中在基础,所以对于数据结构+算法以及计算机基础知识是非常重要的。
1.4.2 资料 这个时候我的学习资料主要是:数据结构与算法分析 (豆瓣) 编程珠玑 (豆瓣) C程序设计语言 (豆瓣) 计算机网络 (豆瓣) 操作系统 (豆瓣) 不过很遗憾的是,后面2本看得比较少了,操作系统更是无法看懂,于是乎只能更多的去刷一些题目。
1.4.3 面试策略 内推+面试经验 内推最好的就是联系上你心仪公司或者产品的直接负责人、面试官或者开发者,比如你可以联系我,QQ空间和腾讯微云(我会直接面试你)都在招聘(强行做个广告)。社交平台是联系他们最好的渠道了,我那个时候就是通过微博找到了百度云的移动端负责人,然后获取了面试的机会(那个时候我们还在做一个百度通讯录的产品)。 面试的策略比较简单,就是先去一些自己不太愿意去的公司,多积累面试经验,把那些不会的都去搜索答案,然后弄懂弄会,然后再去面试自己心仪的公司和产品。
1.4.4 系统学习 进了公司之后你会发现,以前你写的都不是商业化软件,只是实现了功能,完全没法去保证质量和设计。所以工作后有很好的机会去学习商业软件的开发,在这个过程中也是要多依靠自己不断的学习提升,这就是我们的下一个话题了----中级工程师之路
update:2017年1月26日
2、中级之路 2.1 要求 中级开发者更多还是能够比较好的完成一个大型商业软件的核心功能模块,或者中小型商业软件的整体架构。
2.2 技能树 很多人想要知道技能树,比如通用的: 计算机网络、数据库、存储,数据结构、软件架构和设计、编码语言以及平台特性等技术点。 还有很多很多的技能树,而这些其实都依赖于你的项目经验和项目特性,为了点亮这些技能树,我们抽象出来更抽象层级的技能树。
2.2.1 解题思路
- 为什么解题思路很重要
很多人不解的是,为什么很多大公司总喜欢问一些算法题,而忽略自己的项目本身。其实很多时候当你的项目经历不够或者还不够深的时候,面试官了解不了你得解题思路,不知道你遇到其他复杂问题的时候是否有好的方式去解决。
实践出真知,我来考一个问题,这个是我们实际开发中就能遇到的,比如我们设计了一套数据通知机制,存储结构是链表,这个链表的排序方式是ModifyTime,现在有通知过来要更新一个数据,这个更新的数据ModifyTime也已经变化了,怎么能更高性能的去更新这个数据呢?(这个问题还可以深入下去,除开ModifyTime排序外还可以依赖更多排序规则,这样你的数据结构又是如何),这个策略的优化足够的让我们在大量数据的时候量级的优化性能。
- 如何提升解题思路
(一)基础扎实 首先我们要有比较扎实的基础技术能力,这个题目我们要的是扎实数据结构和算法能力,如果我们要做上传下载速度模块,那我们就会需要很强的计算机网络和存储这块的基础知识了,这些基础是我们解题思路的保证。
(二)学习很重要 这个学习是学习前人的,学习别人的,其实做很多事情都是有套路的,多去看源码和优秀的一些组件,多跟组内大牛交流,了解别人怎么做的,往往能让我们思路更加的开阔,从而让我们也有更加多的解题思路。
2.2.2 软件架构和设计
知道解题是第一步,思路有了,但是如何才能让我们的代码更加方便维护和扩展呢?
现在的大部分童鞋都是基于面向对象的开发方式了,大家知道为什么你的项目开发不用面向过程的写法呢?(虽然很多时候我们还是面向过程的开发)
- 面向过程 VS 面向对象
以前我们总是吐槽,产品经理没事就改需求,互联网产品的开发更多的时候是面向变化的,而面向过程的开发是需要明确需求的情况下开发的,否则一旦需求变化你的流程可能就全不对了,整体都需要重写。这也是为什么,我们很多时候用面向对象的语言基于面向过程的开发,在需求变动后是那么的难以维护,所以只有吐槽产品经理。
- 如何提升
很多人对没有设计经验的同学推荐设计模式的书籍,这些我是不推荐的,那些设计模式是我们在建房子基础上的装饰,最关键我们要解决的问题是:
- 如何从现实世界映射到对象世界
- 如何通过对象世界去描述现实世界的方法
- 如何验证对象世界的行为是否正确反映了现实世界的方法。
这里我推荐几本书:大象:Thinking in UML(第2版)
高阶提升 有了这个基础之后,你可以看看设计模式,更为重要的是多看优秀组件或者系统源码,这些源码的设计和对设计模式的应用是非常多的,能帮助你在良好的建模之后还产生更多优雅的代码。
2.2.3 经验 (一)经验的作用 好的工程师有丰富的开发经验,一个业务在你做之前他就知道瓶颈在哪里,需要注意哪些地方? 举个例子:关于错误码的设计,一个业务模块错误码的设计是否可以随意设计呢,只要和后台不重复即可? 那么问题来了,我们现在要针对一些错误进行重试,那么遇到错误码后我们怎么区分应该重试还是不重试呢?如果写死几个错误码,那以后扩展了怎么办,后台下发如果不及时或者错误码越来越多了怎么办? 这个时候老司机会告诉你,老司机会告诉你HTTP的错误码设计很好,因为他是依赖数字段:HTTP协议中的1xx,2xx,3xx,4xx,5xx状态码分别表示什么,列举常见错误码及含义 - 上帝的宠儿 - 博客园
(二) 如何拥有丰富的经验 项目经验+总结+重复造轮子 项目经验丰富你自然而然懂得就多,踩过的坑就越多,多总结你才能记忆更深刻,更加能够系统性的去归纳这些经验,重复早轮子你才能知道没做过你总会错过那么多的坑。多看优秀的源码,有可能的话重复造一遍也挺好的。
2.3 开阔的视野 很多国内技术项目怎么来的呢,因为国外有优秀的解决方案了,比如当年FB解决了2.3的LinearAlloc的问题,国内的解决方案开始爆棚了。比如FB的Buck构建,国内多少技术团队基于此做了构建优化(也得到了晋升)。这里我就不多说了,有能力的同学多做做创新吧。 国内外互联网公司有哪些比较优秀,经常更新的技术团队博客? - 互联网公司 - 知乎这个问题值得大家收藏下
2.4 培养他人和带领技术团队的能力 这个领域我暂时就不展开了。
接下来就是高级之路的分享了 3、高级之路未完待续
PS:知乎排版怎么都给丢了,大家将就着看吧。。。
转载自原文链接, 如需删除请联系管理员。
原文链接:如何通过自学成为一名 Android 应用开发工程师?,转载请注明来源!