我学习 Android 的一些套路,这份 333 页关于性能优化知识点的 PDF 你不能不看
是否自身处理某些 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 文件是否合法
7.和现实事物关联类比的能力
随着编程时间的增长,我们会原来越发现程序里的很多概念和现实生活中的事物是类似的。
比如数据库的索引和现实生活中我们使用的字典索引。好处都是便于快速查找。不好的地方,索引多了会增加占用,增加,删除,修改同时连带索引修改会慢一些等。
比如对象池和现实中餐厅的公共餐具是类似的。我们都需要回收的时候,清理脏数据,避免影响到下一次使用。
比如 KFC 里面的餐具回收人员关于何时回收餐盘,和 JVM 的 GC 其实是类似的。一个对象不被其他对象持有,就可以回收。即一个桌子上没有人,只有餐具通常是可以回收的。
如何做到关联和类比
了解编程中的具体概念,抓住问题的关键点和关键行为
选择现实中习以为常的事物和行为进行类比,不要选择模糊不清的。
提取共同点,检查是否 match。
8.对待问题的态度 对待问题的态度一定要积极。不能得过且过。比如对待不容易/不能复现的问题,及时手头没有可以复现的机器,也要通过模拟/使用云设备 等方式尝试重现。
对于目前在做的只有自己已知的问题,不要隐瞒,尽量暴露出来,这样便于自己和他人更好的发现解决。
作为 Android 程序员,如何把握好技术的宽度和深度
对于 Android 来说,有太多的诱惑,比如 React Native,小程序,热更新,插件化。
我理解的应该是先从宽度上拓展,然后在尽心深度研究。
什么时候需要横向拓展
初学者
工作业务量繁多,比如浏览器开发(普通 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 的途径有很多,可以是自学(视频网站,看书,博客)也可以选择培训(不推荐)
边学边工作通常是可以的,不过具体实施起来还要结合自身的情况,比如时间是否充裕,学习者的决心和自学能力。
春招做准备,数据结构和算法不懂怎么办
无论是春招还是秋招,对基础知识的掌握程度都是很重要的衡量标准,毕竟毕业生的实战经验比较少一些。
数据结构和算法应该是必不可少的一部分。建议还是要多多做一些准备工作。
呈现出最好的状态来面试春招。
评论