2021/1/4 15:27:49 星期一
经历了几场Android面试, 这两年搞系统相关工作,Android应用开发知识着实有些落后了。 但是这两年也并没有浪费掉,知识面的扩大,知识体系的见立,是让我有种打通了任督二脉的感觉,既然如此,后面的规划就着重深入,沉下心来, 好好搞几款作品出来。
面试的失败确实挺打击人的,但是站在面试人的角度想也是合理的, 我说我能胜任绝大多数的app开发,但是面试的效果并不能让人信服,你说是为了扩大知识面?但人团队也没有必要去承担我这种选择所带来的风险, 所以, 除非自主创业, 但凡还得进公司, 必然得经过面试,必然得遵我循市场的规律, 既然面广不精,那么就精了再来吧。
打通了任督二脉是啥感觉? 学习技术不再是毫无头绪, 手上仿佛找到了编程的小锤子, 到处都能敲敲。 那么就拿手上的锤子, 好好打造作品吧。
前几年扩展自己的知识面,这也是性格使然,我学习的过程,超出了认知范围的,必然得刨根问底, 一直刨到认知识范团的答案, 才能从心理去接受那个知识。这样学会的知识不容易忘记, 但学习效率就慢了。而有的人学习可以先强记下来并加以运用, 所以可以很快见到效果。而我对强记下来,没有理顺逻辑的知识,是打心里不认同, 因此也不愿意强记,因此也总记不住。 而经过这么多年的学习, 强记也是学习的一种有效的入门手段。
学习必然得记忆, 我不愿意强记是在为害怕那种记不住的感觉,而靠逻辑记忆, 更加适合记住而已。因此,学习的本质就是克服对未知的恐惧, 克服打破舒适区的不适感, 克服怕麻烦的感觉。
这几天, 我开始使用文件来建立任务管理,克服怕建文件的麻烦心理,创建文件写博客这个效果就显现了,写作的能力感觉也有所突破, 特别是在写周报,写计划的时候,写总结报告的时候, 证明我这几年坚持记录还是有效果的。
每个人都有自己的节奏,在我这个年龄的人, 甚至比我小很多的人,技术水平比我高得多, 这我是比不了的, 差距太大的我也没有必要去比了。每个人的经历不一样, 我从2004年-2014年,整10年的时间,都忘记了好好学习是种什么状态了,这个时间段,精力被网络游戏耗掉了90%,毕业后的学习效率也因为沉迷游戏后遗症的影响大打折扣, 但是终归不是走过来了么。 但是学习还是要竞争,与他人竞争不了, 就与自己竞争, 好好把握好接下来的节奏。
量变引起质变, 不管理写作,编程,鶝业,还是英语,都有一种开始收获的感觉了。我相信, 这些个事情,我的智商还是在线的, 我是可以做成功的。
这样的写作感觉就很好, 也不排斥思考, 思路也清晰,也知道自己该做什么。
(学习jetpack分心所想)
2021/1/7 14:06:37 星期四
学习误区
又进入了误区,上来就想搞透原理? 这是效率最低的。可以先学习使用, 然后针对不明白的地方,再从原理分析。
所以,开始的学习就是用起来。
打通了任督二脉,只是错觉,一回生,二回熟才是最实用的学习办法。这个急不来。
写博客的误区也是这样。想一次性成型, 那也是熟能生巧之后的事。
2021/1/8 20:38:21 星期五
学习敏感度
现在学习工具的使用有一定的经验,但是要总结说出个啥,还真不好总结。 工具的使用,环境变量的设置,程序的运行都是基于系统环境。有了这个大前提,再解决问题就不容易偏离方向。
但理学习框架原理就不容易抓住重点。还是编码少了, 遇到的业务少了?
解耦(业务隔离),依赖倒置,设计模式,多线程切换, 生命周期, 内存泄漏,面向接口, 单一职责,不再重复,这是框架设计的基础。
编程中的一些原则:
单一职责, 开放-封闭(开放扩展,关闭修改), 依赖倒置(面向接口编程), 里氏代换原则(子类可完全替代父类), 迪米特法则, 不重复, 避免过早优化, 最小化耦合, 组合优于继承, 正交性, 稳健性
基于这些原则,结合具体的业务,平台的特性,制定计划, 搭建框架, 都有了规划。
对于Android, 平台特性是四大组件,及其生命周期,具体的业务就是app的功能,至于卡顿,性能优化, 内存泄漏,这是框架完成后的事情。
mvc, mvp, mvvm
mvc 在于架构简单, 但是业务复杂的话,controller将不堪重负,扩展性不强。
mvp 使代码更易于扩展及阅读,但是业务复杂的话,会创造过多的接口, 解耦并不强。viewr 与 presenter 相互持有,会不会造成循环引用?堆内指针产生一个有向闭环。
这里有一个指针与引用的问题,引用不可变, 指的是地址,指针可变,存的是地址。 java中的类对象是引用还是指针?
mvvm 解耦很强,数据变化,UI及时更新,但是对于代码阅读性可能会变差? 而且框架过于复杂, 基于观察者模式。
之所以使用这些架构,主要是便于团队间的合作,统一代码风格。但是真正在实现的时候,不是采用单一的架构,而是结合着使用。
引用和指针
每个对象在内存区域都会有一个地址和值。这个地址可以使用一个名称来表示,即引用, 地址可以有多个名称,编译器在编译的时候,会直接将该名称与地址存建一个映射表,编译成汇编的过程中都直接替换成地址。 而指针,本身也是一个变量,有地址和值,指针的地址也是引用,指针的值是地址,如果想告诉编译器,我想访问所指向地址中的指, 就加一个号来表示。几级指针, 想访问值就得加几个号。
内存回收是根据引用数为零来回收,指针的指向不会计引用数,但是指针本身也占用空间,虽然是固定的32位或者64位, 指针的值没有初始化,就是一个空指针,指针的值指向一个不合法的地址,就是一个野指针。free,delete 是解引用,
引用计数在java中, 就是多个对象变量的赋值,在c++中是实现智能指针的用的。c++中手动释放内存不需要引用计数, 但是可能会造成其他程序crash。因此有智能指针。
java中的引用是c++中限制了的指针, 不可以与整数加减法,只能通过new由jvm分配指向特定的内存区域。