今天我将给大家分享一下我学习Android的一些方法和想法,分享中并不局限于Android哪一块怎么学习。而是一个总体的,普适性的学习套路和方法。希望可以帮助大家解决一些问题。

注意本文为知乎Live底稿,知识点相对分散,后面部分包含了一些听众提出的问题,但是不影响总体的阅读和理解。

Android需要打好哪些编程基础

  • Java基础(Kotlin)(参考技能树 olabqc6d8.bkt.clouddn.com/Java_skill_…)
  • OOP思想与设计模式
  • Android基础(参考Android技能树 7jpolu.com1.z0.glb.clouddn.com/Android_ski… )
  • 数据结构与算法
  • 其他,比如JVM相关

除了编程基础,我们还需要补充哪些能力

  • 喜欢钻研的兴趣
  • 良好的英语理解能力
  • 善于思考和总结的习惯
  • 高效率的学习方法
  • 能够机智地利用Google搜索
  • 善于利用工具
  • 和现实事物关联类比的能力
  • 对待问题的态度

1.喜欢钻研的兴趣,尽管高级编程语言的出现让我们将精力更多的放到业务上,而不是编程细节。正所谓知其然知其所以然,钻研细节可以更好地帮助我们实现业务,做到了然于胸。

2.良好的英文理解能力。由于一些原因,我们接触到的一些技术的资料都是二手资料,而这些二手资料往往在知识传递的效果上有一些折扣,甚至是偏差。英语可以说是(安卓)编程提升的加速器。同时,英语好的话,可以辅助我们写出更具有自解释的代码。

3.善于思考和总结的习惯。真理越辩越明,同样技术越思考越清晰。对于一个技术通常我们需要抱有这样的疑问

  • 它是什么 一句话概括
  • 解决了什么问题 存在的意义
  • 怎样解决了问题 内部的实现
  • 它的缺点是什么 多角度分析

比如我们关于WebView的考虑点的总结

  • 是否支持js
  • 是否支持mixed content (https网页加载http图片)
  • 与js通信的问题,比如给方法增加JavaScriptInterface注解
  • 是否自身处理某些URL(协议不同,不让flipboard://showSection等)还是交给外部程序
  • 关于UA中是否加入特定的标识,比如Flipboard字样
  • 是否增加特定的header

有了思考,我们需要以文字的形式记录下来,这也应了那句老话,好记性不如烂笔头。建议以博客的形式总结出来。

4.高效率的学习方法。

  • 理清楚概念很重要
  • 做好控制变量法
  • 多动手实践,与理论结合
  • 抓住重点,剔除干扰因素

其实,任何复杂的事情都是由简单的事情组成,编程也是一样。在编程过程中,我们会接触到很多概念,这些概念很重要,对于概念的一知半解往往会使得我们越走越慢,学习起来原来越困难。因此对于编程中的概念要务必理解准确和深刻。

控制变量法:我们在初中做实验的时候,经常会用到控制变量法。在编程中红也是。当我们在解决问题时,也要做到控制一处修改。比如我们项目中需要修一个webview相关的bug,我们要想一想能不能脱离现在庞大而负责的项目,单独写一个简单的变量单一的sample来重现,做到快速和小粒度验证。

多动手实践与理论结合:很多时候,我们学习新技术的时候,我们应该先学会使用它,有了初步的认知之后,便于我们更好的理解和深入研究。比如关于GUI的东西,我们最好时不时做出一些东西,理论和实践要做到相辅相成。

抓住重点,剔除干扰因素:

  • 任何复杂的事情都是简单问题错综复杂交织在一起,进行拆分
  • 去除无关因素或者干扰因素
  • 补充了解问题必备的知识
  • 具象分析:看它的实现原理和运行机制 (比如通过分析源码,我们知道HandlerThread无非就是一个自带并初始化好了Handler的线程)
  • 抽象总结:从适度抽象的角度进行归纳

5.机智地使用Google。从事编程工作,使用Google是一种必须。虽然国内访问不了,但是对于聪明的程序员来说这不算问题。通常情况下,我都是讲想要搜索的知识点转成英文的形式,不包含中文。优先查看stackoverflow 和 google groups的内容。相比而言,中文的相关资源并不是很可靠,质量也普遍差一些。

6.善用工具,多使用终端,多尝试写一些脚本解决重复的工作。Python,Ruby,Shell脚本都可以帮助你写出很多利器。

  • 比如全文查找关键字工具 grep -E $1 --exclude-dir={.git,lib,.gradle,.idea,build,captures} --exclude={*.png,*.jpg,*.jar} . -R --color=always -n能找出Android工程下面的包含某个关键字的文件以及所在的行数。
  • 快速获取当前Activity的名称 adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp' --color=always
  • 快速检查json文件是否合法
  • github.com/androidyue/…

7.和现实事物关联类比的能力

随着编程时间的增长,我们会原来越发现程序里的很多概念和现实生活中的事物是类似的。

  • 比如数据库的索引和现实生活中我们使用的字典索引。好处都是便于快速查找。不好的地方,索引多了会增加占用,增加,删除,修改同时连带索引修改会慢一些等。
  • 比如对象池和现实中餐厅的公共餐具是类似的。我们都需要回收的时候,清理脏数据,避免影响到下一次使用。
  • 比如KFC里面的餐具回收人员关于何时回收餐盘,和JVM的GC其实是类似的。一个对象不被其他对象持有,就可以回收。即一个桌子上没有人,只有餐具通常是可以回收的。

如何做到关联和类比

  • 了解编程中的具体概念,抓住问题的关键点和关键行为
  • 选择现实中习以为常的事物和行为进行类比,不要选择模糊不清的。
  • 提取共同点,检查是否match。

8.对待问题的态度 对待问题的态度一定要积极。不能得过且过。比如对待不容易/不能复现的问题,及时手头没有可以复现的机器,也要通过模拟/使用云设备 等方式尝试重现。

对于目前在做的只有自己已知的问题,不要隐瞒,尽量暴露出来,这样便于自己和他人更好的发现解决。

作为Android程序员,如何把握好技术的宽度和深度

对于Android来说,有太多的诱惑,比如React Native,小程序,热更新,插件化。

我学习Android的一些套路_第1张图片 image.png

我理解的应该是先从宽度上拓展,然后在尽心深度研究。

什么时候需要横向拓展

  • 初学者
  • 工作业务量繁多,比如浏览器开发(普通App开发技术,HTML+Javascript等技术)
  • 自身兴趣

什么时候需要纵向深入

  • 中级和高级开发
  • 追求更深入的细节和思想
  • 工作内容需要

横向发展有哪些

  • ReactNative等技术
  • 简单的后台开发 Java/PHP/Python/Ruby
  • IOS等应用开发
  • 总而言之就是会的多

纵向发展有哪些

  • 系统源码
  • 各种技术的实现机制
  • 操作系统相关知识等
  • 总而言之就是学得精,知其然深知其所以然。

我个人比较倾向于多花点时间做深入研究,在这个过程中会慢慢形成一种透彻理解技术的能力,有了这种能力之后就能触类旁通,学习其他技术也会更加轻松。

另外,工作需要时影响你朝着哪个维度发展的重要因素。所以选择一个公司要谨慎。

  • 通常大公司,优秀的团队会有利于你进行纵向深入
  • 小公司,创业公司更多的会影响你进行横向发展。

如何从日常的工作中获取最大的收益

日常的工作中,我们都是在做公司的项目。我们想要做到最大化收益需要做到

  • 不要将自己的要求仅仅停留在功能实现(比如完成一个界面不代表你的收益做到最大,只是代表任务完成)
  • 要理解你所使用的技术的原理和本质。不要停留在API使用,否则无法增强你的竞争力。比如我们对于加载Bitmap都会用到LRUCache,我们则需要至少理解LRUCache的原理,如果可以的话,了解它的内部实现机制。
  • 项目中有好的地方,要去思考好在何处。思考这种技术的通用场景。
  • 在项目中思考更好的解决方法。做好两种方案的优缺点对比。比如你听了《Android Performance Pattern》中关于ArrayMap的讲解,也考虑到HashMap的空间占用问题,不要急于去替换。要做到对比(既要了解HashMap也要了解ArrayMap)同时结合业务场景来选择最适用的。
  • 如果在项目中遇到了问题,建议先解决,然后空余时间研究这个技术的原理和细节。后续的研究务必要做。
  • 善于做总结,将自己的经验和教训写成博客分享给他人。

日常的工作给我们提供了许许多多好的实践和不好的问题,是一块弥之珍贵的技术提升的源泉。

Android那么多库,我该选择哪些,怎么学,学到什么程度

库的存在是为了封装细节,简化调用者实现或者辅助我们更容易发现问题。比如ButterKnife利用注解简化了对于view的查找和类型转换等功能。

关于如何选择那些库

  • 确定这个库是否是必需的
  • 这个库能否带来开发效率的提升,降低代码的维护成本
  • 这个库的学习成本如何 比如rxjava其实学习成本会相对高一些。
  • 这个库的质量如何,不要仅仅看star,更要看issue的处理情况

Flipboard常用的库(部分)

  • LeakCanary A memory leak detection library for Android and Java.
  • Stetho Stetho is a debug bridge for Android applications, enabling the powerful Chrome Developer Tools and much more.
  • ButterKnife Bind Android views and callbacks to fields and methods.
  • Baber A custom view styling library
  • GoldenGate An Android annotation processor for generating type safe javascript bindings
  • MaterialEditText EditText in Material Design
  • 。。。

关于库,首先我们需要掌握其使用方法,同样也需要理解其运行机制。

对于初学者,大学生的建议有哪些

  • 越来越多的关于互联网寒冬的消息传出
  • 听见越来越多的人抱怨Android找工作越来越难,已经趋近饱和。
  • Android开发的红利期正在逐渐消逝,尤其是对于初级和中级开发人员
  • 关于现在加入Android开发队伍,我并不反对。
  • 仍然可以赶上红利期的有容器,机器学习和人工智能。
  • 但是无论选择哪一种技术,即便是Android,请具备好的基础和较强的编程能力和足够的爱好。不要仅仅追求物质。

一直想学,却很难坚持下去

  • 有意愿是很好的。
  • 如果很难坚持下去,可能的原因有没有学进去,或者自制力比较差
  • 关于没有学进去,可以参考上面提到的学习方法
  • 如果是自制力的话,可以通过自我监督和他人监督的方式来改善。

不知道去哪里学安卓,可以边学边工作么

  • 学习Android的途径有很多,可以是自学(视频网站,看书,博客)也可以选择培训(不推荐)
  • 边学边工作通常是可以的,不过具体实施起来还要结合自身的情况,比如时间是否充裕,学习者的决心和自学能力。

春招做准备,数据结构和算法不懂怎么办

无论是春招还是秋招,对基础知识的掌握程度都是很重要的衡量标准,毕竟毕业生的实战经验比较少一些。

数据结构和算法应该是必不可少的一部分。建议还是要多多做一些准备工作。

呈现出最好的状态来面试春招。

自己有一个什么样的个人项目才有竞争力

如果这个项目是App

  • 首先有足够的用户量,比如月活达到上万的数量级
  • 界面和交互处理良好,符合Android UI/UE规范
  • 运行流畅和稳定,不存在低级的错误(比如卡顿等问题)
  • App能明显解决用户的痛点

如果这个项目是一个开源项目

  • 有足够的star(然而这个已经被玩坏了)
  • issue的处理情况
  • contributor的数量
  • 设计的思想是否优秀
  • 代码是否居然自解释性
  • 学习成本和维护成本尽量少

我该如何选择网络中鱼龙混杂的学习资料 pass

  • 使用Google和StackOverflow,Medium
  • 如果是博客文章,在自己能力可以理解前提下,尽量选择英文
  • 最简单判断一个文章的优劣可以先到文章的底部看评论(Good,Execellent,Awesome)以及Google+,Facebook,Twitter分享数量
  • 尽量选择内容整洁(说明态度认真)的文章

学习效果差的问题 pass

  • 长期看慕课和论坛,感觉效果很差
  • 感觉通过视频学习,进步很大,但是即使学习完了,感觉还是菜鸟
  • 视频也看了,书也读了,但是写起来还是很吃力,下一步如何熟练和进阶

产生这些结果的原因:

  • 通常的视频网站传授给大家都往往是立竿见影的技能。
  • 学习中缺乏思考,无法做到触类旁通。只知道照葫芦画瓢
  • 基础薄弱,概念没有搞清。导致做上层的东西举步维艰。
  • 没有比较良好的辅助工具或者无法找到优秀的辅助内容。

如何提高安卓程序员的核心竞争力,项目理解能力还是技术能力,哪个更重要

  • 什么是核心竞争力。表现在学习技术的能力,对待问题的态度,解决问题的技术方案。别的行业其实也是这样的。
  • 具体如何提高核心竞争力,我上面有提到,参考程序员需要具备其他那些能力。
  • 这两个能力是相辅相成的,很难做出孰重孰轻的决断。

大龄Android程序员的烦恼

经常收到一些安卓程序员的邮件,其中有很多问题是,做了Android很多年了,为以后的职业选择惆怅。比如互联网寒冬,华为清退34岁以上员工等等。

的确,由于Android相关的工程师需求不如之前那么好,加之年龄越大,拼劲可能不如刚刚毕业的年轻人。这种烦恼是可以理解的。

走出烦恼的一些方法

  • 不断学习,夯实基础,拓展技术面。为什么总是提到这个,因为其实存在很多程序员,逻辑思维不强,还不爱学习。不断学习对于程序员来说至关重要。
  • 提高自己的竞争力,不要成为仅仅面向API编程的程序员。要勤于思考,追求更高。求其上者得其中,求其中者得其下。你必须和5年前,甚至是10年前的你有改变,不能仅仅是一项技能重复了5年,10年。
  • 建立个人品牌:写博客,写书,开源项目,写独立App等。注意这其中任何一个都是一个长期坚持才能完成的事情。关于写博客,我在以前的知乎live讲过一些技巧和思路,地址为 www.zhihu.com/lives/79677…
  • 其实现代人的烦恼,不论是否是程序员,很多都是关于物质生活的恐惧。买车买房,家庭支出等等问题。以及对于自己的能力无法满足物质支出的恐惧和担心。在自己无法改变的情况下,适当调整心态。
  • 尝试知识变现,但是需要不断积累,需要时间。不能一蹴而就。
  • 关于舒适区,学习区和恐惧区的理论

理论

我学习Android的一些套路_第2张图片 image.png
  • “舒适区”, 对于你来说是没有学习难度的知识或者习以为常的事务,自己可以处于舒适心理状态。

  • “学习区”,对自己来说有一定挑战,因而感到不适,但是不至于太难受。

  • “恐慌区”,超出自己能力范围太多的事务或知识,心理感觉会严重不适,可能导致崩溃以致放弃学习。

对于一个人来说,最理想的状态是处于“学习区”,学习具有适当挑战性的东西, 一段时间后,“学习区”会慢慢变为“舒适区”, “舒适区”越变越大, 而一部分的“恐慌区” 也会相应变成“学习区”。

更多相关文章

  1. Android 教程之实现动作感应技术
  2. 谁说Android不行了,以个人能力的不行来否定整个市场的需求是弱者
  3. 电商应用开发实例分享:《凡客移动应用之Android + HTML5技术运用
  4. Android图像识别扫名片识别技术SDK
  5. Android 实现手写板技术
  6. Android文件操作IO技术
  7. BIOS中开启虚拟化技术
  8. android官方技术文档翻译——Android Lint
  9. 技术|Android安装包优化

随机推荐

  1. Android 系列之Android 命令行手动编译打
  2. android material design 主题
  3. Android布局之LinearLayout
  4. Android之七 闪屏的实现
  5. Android Settings 设置中 PreferenceActi
  6. Android Activity 属性介绍
  7. android studio 的自动更新问题
  8. Android添加快捷方式(Shortcut)到手机桌
  9. Android之辅助服务下篇————Accessibi
  10. Android 设置EditText不会自动弹出键盘