如何通过自学成为一名 Android 应用开发工程师?

作者:陈昱全
链接: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的移动论坛,在里面搜索答案或者自己提问,这样就能解决很多疑惑了。 现在大家最好的地方就是: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:知乎排版怎么都给丢了,大家将就着看吧。。。


1,074 人赞同了该回答

我正在自学Android开发,已经有半年时间了,基本上业余时间可以挤出来的,都拿来学习了
由于还没有找到Android开发的工作,先占个坑,不敢擅自回答,以免误导,等找到工作了,再详细描述着一路过来的自学经历。
PS:本人之前没有任何软件开发经验。
**********************

update:2014.9.22

经过了八个月的自己,终于在上周五被一家公司录用了,现在遵守诺言,说说这段时间的自学经历。
背景介绍:性别:男、无任何编程经验、年龄:28(大龄青年了)、学习方式:工作业余时间自学。

第一阶段:学习Java 用时:一个半月
一开始我使用的是Princeton大学的线上资源学习:Introduction to Programming in Java: An Interdisciplinary Approach,学习完后,觉得自己掌握的不够系统,于是找到了另外一本教程:Introduction to Java Programming, Eighth Edition,继续学习,该教程学到第30章,没有继续学习下去是因为后面的越来越难懂了,于是就学到这里,等学习Android开发的时候,有需要的,再回国头来学习。
Java阶段学习的主要方式是一边学习,一边用Eclipse模拟练习,该阶段的学习持续一个半月。
第二阶段:初步熟悉Android开发 用时:两个月
???内容较多,稍后更新
************************************
不好意思,耽搁了这么久,现继续更新

第二阶段:入门Android 用时:两个月(业余时间学习计算)
在入门Android的时候,听从了网上一些人的发言,首先选择了google官方的文档,里面有一个trainging的资料,发现这个资料学习起来生恢难懂,而且讲得不够详细,跟着做项目也是困难重重,很不适合初学者,不建议,我也是在学习了一周后,果断放弃;然后选择了Amazon.com上面的Android学习资料,找到一本排名第一的,叫做Android Programming:The Big Nerd Ranch Guide,跟着一起学,由于学的有点急躁,大概花了一个月多,感觉效果是有,但是不是很好,然后在知乎上看到有人推荐TeamTreeHouse,试用了一下,感觉很好,于是注册了会员,开始学习,这个阶段的学习持续了两个月,感觉效果很明显,而且视频的里面,都把资料讲的浅显易懂,看了以后,兴趣大增,很建议选择这个作为入门的学习资源
第三阶段:深入学习
其实学完第二阶段,我就已经开始慢慢的投简历了,但是都没有任何回应,于是有开始了新的阶段的学习,这个时候,我选择了Udacity,里面的一个Android的学习课程,虽然说也是基础的 课程,但是讲的比TeamTreeHouse的深入许多,而且更加的贴近实际工作情况,不过讲的没有前者详细,所以在学习过程中,需要自己翻阅资料,整个过程也是持续了一个月多,我现在的这份工作,就是在这课程学完不久后找到了

后记:其实通过自学,想达到用人单位的要求,其实是相当困难的,我学了快八个月了,投出去的简历,也几乎是渺无音讯,期间的打击是肯定有的,不过还好坚持了下来,我的建议是,如果选择了这条路,就一定要有足够的毅力,并且能够在简历、面试被拒绝后,心无旁骛的继续学习,直到达到目的为止,而且这个阶段没有一个固定的时间,如果不是我现在的主管看中我的一些其他品质(不是我的Android开发实力),我也不会被录用,可能还要继续的学习几个月,所以自学这条路只属于肯坚持下来的人,祝好!

后后记;现在在新的公司上班,由于我也只是刚入职不久,也有许多没有上手了,做起来也没有之前想象的简单,毕竟是工作了,也容不得疏忽,于是压力也大了起来,不过毕竟现在做的是自己喜欢的工作,感觉之前的付出,值得,我希望后续想自学的人,一起努力吧。

***********************
update:2014.11.27
现在上班已经有快两个月了,做个更新吧
刚找到工作那家公司,是一家创业公司,我进去的时候,公司正在转型,Android开发的工作很少,我就去基本都是在看别人现成的代码,呆了一个月之后,公司突然辞退了两个Android开发的,包括我,理由是公司决定转型做平台,暂时不做Android客户端,下午四点通知,六点就走人,当时确实有点彷徨,也有点担心。
回到家马不停蹄的投简历,把自己的工作经历写成了半年(实际只有一个月),四天后获得了一个面试,是一家做Android定制的,在面试的时候,我夸大了自己的开发实力,由于我渴望通过工作来增加阅历,于是进来了。
新的工作开始后,让我庆幸的是,之前吹的牛皮,基本上在努力后,也基本实现了,公司需要完成的项目,也都可以按时完成,现在的进度差不多是一周的时间,就可以初步开发出一款电商类的APP,由于公司自有我一个Android开发的,不知道这种进步算什么水平。
总之,很庆幸的是,很多知识都可以通过自学掌握,那些不会实现的功能,也可以通过摸索而实现,也让我信心更坚定了点,真的非常感谢前人在网上发布的博客内容,给予我的帮助真是太大了,同时我也开始自己写博客了,把工作中有价值的问题和解决方法记录下来,希望对别人有些许帮助。
打算这一两天申请转正,心里还是有点忐忑啊,太盼望这一天了!!!

*********************
update: 2015.1.6
这次更新的主要理由是公司终于同意我的转正了,只是工资没有预想的多,只涨了八百,现在已经基本上手了,碰到的问题很多也是都可以独立解决,而且还能抽出空余的时间,学点新的东西,这次的转正对我本人来说,意义非凡,至少证明了,我这么久的努力还是值得的,而且现在可以靠着这份手艺挣到钱,而且这份工作是我确实喜欢的。
接来下我计划会是继续的加强自身的开发实力,多阅读 牛人的博客和代码,真的收货非常大,而且知道的多了,也比较清楚自己的接来下要努力的方向,所以我会朝着这些方向去努力,不过会没以前那么拼命了,之前只顾着转职,陪家人老婆的时间少了许多,现在稍微稳定点了,我想慢慢的补回来,不知学习不会放下的
争取在三个月左右,再涨一次工资吧,在这里立下证据,待日后核验。

******************************
updata:2015.2.11
最近的工作由于比较大的变动,于是在这里记录下
首先,公司说的涨薪的八百,实际到了第二个发工资的时候,发现其实只涨了四百,期间说了各种理由,总之是这是一家不靠谱的公司,不靠谱的老板
工作方面,我自己独立完成了一款APP的开发,从零开始,一直开发到上线推广,中间也碰到了种种的问题,在努力下也都一一解决了,这个是我在这家公司最大的收货,第一个项目结束后,开始试着投简历,无意中找到了一家新的公司
新的公司经历了三轮面试,第一轮是人事的,我把我的工作经验说成了八个月(实际四个月),然后是项目总监,最后是老板,整个面试过程很顺利,由于公司没有安卓的开发人员,所以我那些技术上的吹嘘也都一一瞒过去了,最终被录用了,新的公司,待遇比之前的高了一千,上班时间也改成了五天7.5小时,老板跟公司的环境跟上家比,都好了许多,工作也基本上可以胜任,好歹也是有点真本事,不是完全的吹嘘,最后,总结下对个人比较有帮助的部分:
1、写博客:写博客不仅可以激励自己学习新的东西,而且以后碰到类似的问题,直接从博客中copy代码,简单省事;
2、把代码中重复的模块写成一个工具类,下次调用直接简单的一行代码就可以实现了,比如emptyView, viewPageIndicator。
3、从github上照搬代码的时候,记得读懂里面的代码,真的帮助很大,那些大神的代码真的写的太好了,每次读完都很有收获。
4、工作中碰到不懂的,切勿马上搜索答案,先查看官方api接口,寻找思路,最后再用搜索引擎
暂时就这些了,其实我还只能是入门级别的,能有更深入一级的体会的时候,再来记录下。。

***************************
update:2015.6.26
刚好现在有空,继续更新下吧
目前的这家公司各方面感觉都还可以,虽然目前是我一个人独立负责Android的开发,基本上是上手的,在技术上是没有碰到什么解决不了的问题,碰到很多不懂的内容,在Google搜索后,基本都找到答案了,或者寻找相关的源码去了解下,也都可以一一的解决,这几个月,可以感觉到自己在技术上又有了不错的提升,现总结如下,希望有所参考;
1、尽早从Eclipse迁移到Android studio。虽然去年就开始接触studio了,当也是懵懵懂懂,今年随着1.0正式版本的发布,心里就痒痒的,想迁到studio上面来,由于对Gradle的不熟悉,还有配置等各种原因,一直没有迁移,不过也有陆陆续续的练习使用,在基本熟悉了,就开始迁移目前的工作项目了,迁过来了以后,就再也回不去了,Android studio真的比Eclipse好用太多了,你越熟练使用它,它就越好用,特别是github上面很多项目都是基于Gradle的,集成到studio中很方便,总之,强烈建议迁到studio开发平台上来。
2、学习使用Git。公司用的版本工具是SVN,我估计很多公司都是用这个,我试了在studio上面集成SVN,可是试了很多次都失败了,又听说git很先进,狠下心来学习了git,在Udacity上面有个Google开发的Git学习课程,免费的,粗略掌握后,就开始摸索在studio上面使用git,发现studio对git的集成太好了,虽然网上这方面的资料很少,但是基本上摸索了些就学会了,基本所有的git操作都可以在studio上进行,不用使用Git原生的命令,方便异常,另外在配合Bitbucket,简直太好了,用Android studio + Git + Bitbucket,可以天下无敌了啊,哈哈!
3、代码方便维护和复用。在实际的开发过程中,发现很多方法都是相同的,特别是网络访问这块,对于相同的方法,尽量写在一个公用的BaseFragment或者BaseActivity中,这样在后期,如果接口有改动的话,不需要每个页面都改动,只要改动通用的方法就可以了,还有在每个页面的代码结构要足够清晰,多谢方法,不要很多代码写成一坨,这样后期不好维护,会看的晕头转向的。
4、使用leakcanary。内存控制是我的薄弱环节,刚好最近Square出了这款工具,可以很方便的检测内存泄露,我在我的项目中一试,真的发现了好多问题,也发现了很多容易造成泄露的书写习惯,嫉妒推荐使用。
5、使用AppCompatActivity。如果你的项目还在开发的话,不要用FragmentActivity了,用这个新出的,也是官方推荐使用的,可以很好的兼容5.0以上的系统,另外用了也可以让各种系统的控件Style保存一致,各种好处说不尽,用了就知道了
6、BugHD,检测崩溃。并不是每次崩溃都可以被你采集到,这个工具可以采集到你开发的APP的所有的崩溃,免费试用的,关键是集成很方便,我一直在用

现在基本上算是入行了,想想之前刚开始投简历的时候,发了一百多封简历,接不到一个面试电话的情况,难免有点唏嘘,虽然上手工作暂时没什么问题了,但是想要进一步的深入,还是有许多的路要走,还是继续努力吧
下一步的方向应该是放在进一步研究各种api和效果实现上面,最近发现研究官方的源码,收获很大,官方的代码写的真的是太精辟,太有逻辑性了,很好的学习教材。

*************************
update:2015.9.3
最近工作又有一些变动,在这里做个分享吧
原有的公司,因为项目的原因,我已经空闲的快一个月了,预期接下来的几个月都没有什么开发需求,根据我这段时间的表现,公司还是希望我一直留下来的,万一有新的项目,就不用再折腾的招人了,不过空闲对于我自己是莫大的时间浪费,于是就试着看看有没有其他合适的机会,总之,挺顺利了,就找了份不错的新工作。好了,下面分享一些最近新的感悟
1、 找工作的选择,我之前都是选择创业公司,很大的一部分原因是因为我的工作经验,很难进入一个大的公司,不过创业公司的失败风险真的很大,特别是那些没有天使轮的,真的很容易死亡,当然项目都的死亡,损失最大的应该是老板,不过对于我们做开发的,也因为的开发的产品没有得到市场的考验,你也不知道你开发的APP到底好不好,有没有什么问题,机型的匹配怎样。说了这么多,个人的经验是工作的选择,还是尽量选择一个靠谱的工作,有更大的用户去使用你开发的APP,这样对你的成长才是真的巨大的。
2、 做开发的时候,不仅仅是实现功能,还有代码的优化,结构布局,真的很重要,我这几天看了下Picasso的源码,发现自己的代码真的写的太烂的,一看就是质量不够好的,所以尽量多看一些大神写的代码,了解他的布局和思想,然后再拿来改进自己的代码
3、 开发中碰到了问题,记得自己先去思考下解决方案,或者网上Google,不要马上就到群里面去问,我最近退出了很多技术交流群,因为有很多自己都没怎么思考的问题,就抛到群里面来,其实我们做开发的,我觉得解决问题的能力比开发的技术还跟重要,等你熟练自己解决问题了,就会发现其实需要去求教别人的地方是很少的

最近接触的多了,就越发现自己不懂的也多了,之前说算是入行了,现在想起来,其实还只能算是入门,如果你也是走写代码这条路,就一起猛干吧,阿门。。。。


***********************************************
update:2016.2.3
最近触动比较多,还是继续更新下吧
到了新公司,完整了参加完一个项目下来,感觉自己收获最大的不是技术方面的成长,而是态度方面的成长,良好的态度能够规避很多技术的问题的,刚好有时间,粗略写个总结吧;
1、确认好产品文档的技术细节:千万千万要跟产品确认好需求,产品的需求文档会包含交互细节,页面逻辑等,但往往会忽略技术的实现细节,或者在实现起来,有很多的细节需要考虑的,但是都是文档说欠缺考虑的,一般的情况下,一份新的需求,我大概要花费一天的时间,去完整的评估实现方案,在评估完成后,发现有出入的,还需要跟产品重新沟通确认,确认好后,千万要记得让产品更新文档,以后测试好依据新的文档测试。
2、在实现一个功能之前,先打好草稿:我做项目经常犯的一个错误是急着写代码,逻辑跟着代码一边写一边走,现在回过头去查看原来写的代码,发现结构混乱,方法各种重复,逻辑耦合度高,总之就是烂,最近静下心来,在完善一个功能之前,先用纸跟笔把各种情景考虑清楚,再把各种逻辑交互处理好,并且用流程图之类的方法表达清楚,然后再开始写代码,这样写的代码明显质量高很多,bug也少,由于逻辑结构清晰,后期的维护跟更新都比较简单。
3、加强自测:不知道是不是开发的普遍不喜欢测试,我好一阵都是对测试不感兴趣,提不起劲,感觉没有技术含量,直到提交的代码一次次被测试妹子提的bug给淹没,脆弱的心灵深受打击,于是只好痛定思痛,要加强自测,一般自己写的模块,自己是最清楚的,知道哪些地方容易出bug,基本功能测试一遍,再极端条件再测试一轮,基本没有空手而归的,每次都能发现代码中的bug,不知道有没有那种神一般的程序员,有一双上帝之手,写的代码蹭蹭的出来,而且基本不出bug,我这辈子是没可能到达这种境界了,所以只好老老实实的自测吧。
4、分支管理:现在应该一般用git了吧,建议是开一个主分支,这个分支打的包也是测试用的包,然后自己再个分支,在上面开发测试,如果有其他的队友,也各自开分支,新的功能开发自测合格后,再合并到主分支,这样比直接在主分支开发,能够规避许多的bug,说起来简单,我也是一开始忽略了,只好看着满满几十页的bug心里发抖。
5、小白心态:一直觉得自己是个小白,对于写的功能,某个方法总是抱着怀疑的态度,对于我来说,抱着小白心态,或者菜鸟心态写代码,明显质量好很多,但是进度慢了不少,如果抱着信心满满的心态写代码,速度明显飙升,但是对于我来说,bug反而会变多,所以我一般尽量让自己保持菜鸟的心态写代码(代码深似海,其实真只能算新手,每次看到Android的源码,都深深的感觉自己跟高手的差距达到估计这辈子不知道可否追的上)

对于外行入门Android开发的,尽量去大一点的公司,你的成长会比小公司的大很多,我前几份工作都是小公司,目前这个家公司规模还不错,工作了几个月,就能明显的感觉到之前成长的局限性了

*************************
update:2016.10.27
有一阵没有更新了,刚好有空,做些补充吧,可以的话,这个答复希望一直更新下去
在新的公司上班一年多了,基本上适应了这边的节奏,还记得刚进来的时候,怕自己的水平太烂(也确实烂),晚上睡觉心里都会忐忑不安,之前每次找到新的工作,当步子迈的太大的话,内心都会这样纠结,不过这样也有一点好处,他会逼着你往前走,因为你以为把自己逼着没有退路了,开发路上,义无反顾,一往直前。
你有没有这种困惑:当你开发了一段时间,简单的该会的会了,复杂的不会还是不会,一开始的时候,能够明显的感觉到自己的进步,最近逐渐发现自己慢慢的进步变慢了,然后又突然觉得开始停滞不前了,有一阵,我自己突然有这种想法,发现自己进步越来越慢了,压力小了,生活也安逸起来,人也变得懒惰起来,不像之前的那种拼,那股闯劲,好可怕,感觉自己沦陷了!
于是我试着找回最开始的那种拼劲,接着让自己进入快速成长的路上,不停的接受新的知识,逐渐的,又让我找到节奏了,多亏了github,多亏了开源,安卓网上总是有不停的很好的库开发出来供大家使用,我一边使用这些库,一边查看别人的源码,发现里面的奥妙,慢慢的发现里面的许多实现方式,都让我非常的敬佩,你总能发现许多比你自己写的还好的代码,总是发现自己还有很多的不足,让自己一直保持这种饥饿的状态,原来我还有这么多的不懂,还这么的水,慢慢的找回了这种状态,就像是一开始找工作一样
我相信人是习惯于安于现状,特别是现状还不错的时候,但是心态上,不能这样想,要让自己处于一种动荡的心态中,我们的选择,只有不停向前,虽然我已经三十了,看着周边一群群的九零后,我希望我的激情不亚于年轻人,一直保持一份年轻的冲劲!

473 人赞同了该回答

~2014年3月27日更新~
今天我正式填坑~~
这个坑被 N 多人吐槽了,也确实有段时间,期间尝试过不少能帮助小白入门的方法,也有所收获,后面我会一并更新到答案中~


泻药~ 
第一次认真回答问题,有人给点鲜花鼓励什么的没~~

-----------------------------我是正式开始的分割线------------------------------------

这个问题其实需要展开来说下~

学习新技术都很多人来说本身就是一件比较痛苦的事情(因为学习会改变自己原有的认知,是个自我更新的过程)~
所以能不能学会学好的前提条件是你是不真真愿意去学,你想学adnroid的根本出发点是什么,这个出发点是否强大到让自己完成这个学习。

如果上面两点你已经认识到了,那接下来我们再来看如何自学成为一名android开发工程师~

优秀的android开发工程师和普通的差别很大,而根据题主的描述,我们这里就说如何成为一名合格的android工程师(也就是入android开发的门)。

学习需要静心,特别是入门的时候需要静心,我不觉得看英文的google android官方文档(Getting Started)或者[eoe社区组织翻译的中文文档](Android开发-最全的Android开发资料-eoe移动开发者社区)想快速入门是件容易的事情;也不觉得找一些免费的视频看下去能快速的入门。因为这些东西都是入门后才合适看的。

说到入门,那我要推荐一下自己策划和参与撰写的《Android开发入门于实战》这本书籍了(本书第一版是笔者参与撰写的中国大陆第一本android开发教程,现在市面上是我们刚刚撰写完成的最新的(也就是第二版),官方介绍如下
《Google Android开发入门与实战》是中国大陆第一本Android开发教程。

此书第一版由eoe的创始人姚尚朗和靳岩于2008年底所写,第二版由eoe众多实力派社区版主于2013年共同协作改版。

此书目前已经重印超过18版本,已经是Android开发者是受欢迎的Android开发图书之一;是Android开发者学习人手一本的必备红宝书。

在这里解决大家阅读过程中遇到的所有问题,勘误收集,源码下载,讨论交流,作者答疑,反馈建议等等内容均可发布,希望eoe社区这本书能成为Android入门经典标准教材,让更多人学会android开发。

封面如下

BTW:
详细的目录在这里: Contents · eoecn/google_android_book_v2 Wiki · GitHub

紧接着,我来说说入门的步调:
我个人建议的入门途径是这样的:
1.第一阶段:认知上入门
买一本纸质的android入门书籍,一定是入门的,比如我参与策划和编写的[Android开发入门和实战](《Google Android开发入门与实战》),给自己1周完整的时间按照里面的阅读建议阅读完,第一遍不需要完全读懂,特别是代码的地方,但是你需要尽量的尝试看懂(这个阶段不需要开电脑查资料,因为电脑上诱惑太多了,你的注意力会被其他干扰的)。读完这本书后,你基本上就从认知上入门了;

2.第二阶段:知识上入门
认知入门后其实就比较简单了,拿过上面那本书,从环境搭建开始,到第一个例子,到书中其他的演示的例子都自己尝试跑一遍,遇到错误自己尝试解决,如果超过20分钟没解决掉,记得去《Google Android开发入门与实战》这个社区问,作者会第一时间帮助你的。跑完例子基本上就有对 android 有个大体上的入门了~

3.第三阶段:实战上入门
有了基础认知吼,就进入到真正的 android 工程师成长轨迹中了,这个时候信息和知识就不是主要的了,这个阶段主要的按照知识点的形式来强化和实战,目的是持续学习在工作中会用到的各种技能~
这个阶段的知识点很多,很多情况下一些人会抓不住重点,把时间花在一些另外20%的技术上去,所以按照我对 android 技术的理解和经验,推荐试试我们新发布的新产品《极客学院-android开发教程|android视频教程》,『极客学院』是我们最新的一个收费产品(真的超值,30元/月的价格可以学习里面全部的课程,android 为主,还有 cocos2d 和 c 等课程),按知识点形式对真正有用的技术进行讲解;此外,务必去『eoe Android开发者社区_Android开发论坛_Android开发』注册一个帐号,遇到问题自己搞不定的时候去和大家讨论讨论~

4.第四阶段:开发者圈子上入门
前面说的很多都是自己一个人在战斗,要想更好的进入这个行业,需要有自己的开发者圈子,前面好像有同学也提到了诸如 GDG之类的活动,恩,就是这样的活动。
我这里说的是 还是 eoe社区的活动(没办法,这样的活动就是我觉得开发者活动应该是这样的),我们有两类活动,一类是基于城市的『eoe 同城会』,现在在上海,北京,深圳等14个城市都有本地的组委和志愿者,会定期活动分享,例如『eoe沙龙活动_android社区活动_android活动论坛』,此外还有一类是诸如 eoe 每年一届的移动开发者大会。
BTW:
活动不要跑多了,特别是线下活动,别没事就跑去参加什么活动,挺浪费时间的~

好了,坑填完了,心安一点了,有需要更多信息的给我私信吧(我争取能及时给大家回复~)~


--------------我是一个很极客的分割线-------------------

接下来我再给大家推荐几个『极客学院』里对这个问题可能有用的课程

1小时,独立开发第一个“Hello World”
jikexueyuan.com/course/

4个实战项目,教你7天学会Android
jikexueyuan.com/course/

24个Android常用知识点精讲
jikexueyuan.com/course/

Android系统安全【教程 实战 策略 项目 开发 课程】
通过对现代网络安全的基础理论的学习,掌握和理解其核心原理。

此外,还有诸如
Flappy Bird 开发视频教程 源码下载【教程 实战 策略 项目 开发 课程】
轻松玩转微信分享--极客学院

极客学院-android开发教程|android视频教程』还有很多不错的课程,我们也在每天不断添加新的课程,我个人觉得是每个学习 android 的人必备的,超值的很~~


123 人赞同了该回答

绝大部分人说官方文档和范例App Components)是最好的教程,如果你英语好,且有Java和XML基础,那按照官方的Training一路下来就算入门了。

如果英语不好,可以看一些视频入门,如Mars的《Android视频教程》的。最起码得先把开发平台搭建起来吧。再结合视频做一些小练习,最基础的布局先练好,不要急。

当然,看视频的话虽然通俗易懂,但是进度可能比较慢(即使我视频调至2倍速看),所以必须结合看书。但是,市面上的书大部分都跟不上Android最新的脚步。
不过还是推荐两本:

对了,现在还有更新颖的学习方式,可以在线互动编程学习Android开发 | Fenby.com),你可以尝试一下。

总体来说,书都比较落后,Android学习主要还是靠网络。入门是最关键的,入门之后相信你自己也会找资源了。然后可以启动以项目为导向的学习方式,用到什么学什么,这样最快。但是,快并不是浮躁,别想一口气吃成胖子。况且,一入IT深似海。。。不扯淡了-_-。

其他参考:


我现在也在慢慢学习和摸索中,望共同进步。

138 人赞同了该回答
其实成为初级android工程师,并不困难,但是目前初级android工程师已趋于饱和,这与前两年客户端培训火爆密不可分,所以呢,这可能会让一些正在走这条路或者想要走这条路的人感到困难。但是想要脱颖而出也不是很难的。
今年参加校招,也拿到bat之一等一线互联网公司offer. 想说说我的看法,虽然客户端现在的市场趋于饱和,但是我想说的是:想进入一线互联网公司并不是没有可能,可以分享一下我的自学之路。
背景:本人科班,也不是很好学校,决定走客户端方向是因为自己的兴趣,学校内教的东西太浅显了,很多东西都是自学,就连基本课程也觉得老师并没有讲什么。(可能是我没听)
1.基础,基础最重要。想进入一线互联网公司,这一项必不可少,这也就是你比外面培训班所在的优势了。
算法分析和数据结构:查找,排序,DP,图论,数论,栈,堆,二叉树等,一本《算法导论》,再来一本数据结构的书基本够了。最重要的是刷题,让你更加理解。同时有些公司笔试也这样。
操作系统:进程线程,中断机制等,推荐书《深入理解计算机系统》
计算机网络:五层架构,各种协议等等,推荐书《计算机网络:自顶向下方法》
编译原理:它可以让你更好的理解语言的结构,词法分析,语法分析等,对你的掌握语言有帮助,书籍一本教材就差不多了。
数据库:可以去了解了解,各种范式,android开发对其要求也不高,但有必要了解,可以去买一本简单的教材看看。
2.java语言掌握,写android肯定要会java语言啊,所以java语言也需要良好掌握。
java虚拟机(jvm):到底java语言是怎么运行起来的,jvm内部又有哪些部分,需要一本周志明的《深入理解java虚拟机》
java基础:推荐书籍《Java编程思想》《java并发编程实战》
3.android基础:安卓工程师肯定android基础要熟练啦,所以呢,新手入门推荐郭大神的《第一行代码》后面可以看看《android开发艺术探索》,《android编程权威指南》可随便翻翻,当字典用。
4.设计模式,对于java和android熟悉后,你还需要对代码整洁度等的提升,推荐书籍《大话设计模式》《head first:java》到工作中了可以看看《重构:改善既有代码的设计》《android源码设计模式与实战》
总结一下书籍:
基础:
《数据结构与算法分析》,《算法导论》可尝试
《深入理解计算机操作系统》
《计算机网络:自定向下方法》
《编译原理》《数据库系统概论》
java基础:
《深入理解java虚拟机》《java编程思想》《java并发编程实战》
android基础:
《第一行代码》《android开发艺术探索》《android编程权威指南》
设计模式:
《大话设计模式》《head first:Java》《重构》《android源码设计与实战》
上面是需要看的书籍,也可以通过csdn下载电子书。也可以多去逛逛国内大神的博客,都在csdn上面,看看他们的一些思想。还可以去看视频学习,现在互联网时代,自学真的很方便的,推荐慕课网,还有网易云课堂,云课堂里面的老师都是通过筛选的,很多基础讲得也很生动。还有好好利用github,stackoverflow,这些网站,github有很多开源库,stackoverflow基本上有你遇到的90%的问题及解决方案。
学习方式:看书,逛博客,看视频。
自己写一个感兴趣的项目,把学到的知识都用到,这个就是能让你慢慢从书本上到实践的过程啦。
好吧,学了上面的知识,真的可以去互联网一线公司了吗?我觉得未必,还差一点。
还需要融会贯通,也就是说,把整个基础,java以及android都链接起来,成为你自己的知识体系。需要你去钻研,Read The Fucking Source Code,程序员必须有这份钻研的精神在,所以我们可以去找找我们喜欢的开源库,先去使用它,熟悉之后,去看看内部是如何架构的,为什么这样架构,如果是你来架构,又会用什么方法,跟他有什么不同?你可以学到些什么。这一步我觉得才是达到一个真正程序员的关键。也就是为什么你比别人厉害之处。
这部分我的思路:从微观到宏观,再从宏观到微观,首先从开源库的一个小功能学习起来使用,慢慢的熟悉整个开源库的功能,然后呢,我整个开源库有哪些功能我都知道了。开始试着画出开源库的类图,整体是怎么构造的,也就是从微观到宏观;后来知道整体构造,我再去有宏观到微观,细到每一行代码是怎么写的,为什么这么写。如果是我,我又会怎么写。
举个例子:比如你需要封装一个ImageLoader图片库,你可以想到什么?ImageLoader简单说就是加载图片,显示图片功能。安卓手机oom所以要图片压缩;因为单线程(UI线程)绘制,所以需要线程间通信,整体为一个生产者消费者模型,需要同步异步拉取;因为流量有限,所以需要缓存等等。这些都是在脑海里的框图。然后再细看,同步异步又是怎么做到的,代码如何实现。异步的本质又是什么?不就是中断机制吗,这又涉及到计算机操作系统,又可以了解中断机制。为什么要中断呢?很大程度上是进程间通信,保护现场,进程间通信又有哪些方式呢?进程又是什么?了解之后,你又会发现android为什么会用binder机制等等。
为什么上面我写得那么细呢?因为我觉得可能那才是我的亮点之处,也是各大互联网公司看重的吧。
好吧,这大概就是我的自学之路了,没有导师,我相信你们也可以的。但是这个肯定比外面培训班花的功夫更多吧,差不多一年时间。这也只是我经历今年校招的看法,希望对大家有帮助,至于社招的同学,如果要进入一线互联网公司的话,还需要更加努力。
祝大家好运吧~

54 人赞同了该回答
我自学java和android一年多,现在是一名android工程师。总一下自己的经验,希望对你有帮助。
首先我想说的是入门android一定要有java基础。我自学android的时候由于java的基础不是很好,甚至连java的基本语法和对常用类用发都很模糊,导致后面学android的时候学了一个月还是不清不楚,信心大减很受打击,无奈还是重新学一遍java再来学android,发现学习android好理解很多,所以一定要先把java的基础学扎实!
然后,android跟xml的联系还是挺多的,资源文件都用到xml,所以多多少少理解一下xml的结构,基本语法对自学android也是很有帮助的。
准备好学习android的基础之后,正式学习android。如果是零基础,我个人觉得最好的学习方法是以看视频教程为主(网上可以搜到很多免费的android视频教程),辅以一两本android基础的书。
入门android,最大的阻力莫过于如何自己创建一个android项目进行开发,包括了解android项目的结构组成、使用什么开发工具以及基本开发步骤。很多关于android入门的书一开始一边都是讲一些关于android系统的发展过程等等这些介绍性的东西,然后在讲讲android开发的重点是什么四大组件。大多数人一般看看都能接受这些东西,但是大多数人都挂在了接下来真正学习android的环节,也就是如何自己创建一个android项目进行开发。

猜你喜欢

转载自blog.csdn.net/qq_42334312/article/details/81018750