[关闭]
@EricJing 2017-05-11T05:13:54.000000Z 字数 5975 阅读 638

总结

自评

你好,我叫景宏刚,2012年毕业于浙江财经大学,目前就职于杭州挖财互联网金融服务有限公司,在公共基础组负责Android研发。五年Android App开发经验,负责过挖财多款App产品,包括挖财记账理财、钱管家、挖财宝、社保掌上通。具有扎实App架构、性能调优、App优化经验。两年项目管理经验,包括进度管理、团队协作、规范流程、Code Review。一年团队管理经验,包括招聘面试、技术规划、团队规范、技能分享。

技术方面

App架构

架构

Flux

单向数据流,React 标榜自己是 MVC 里面 V 的部分,那么 Flux 就相当于添加 M 和 C 的部分。

Action -> Dispatcher -> Store -> View

image_1be4qvhtnp5hb4d1jia1r0cd2m9.png-168.4kB

整个流程如下:

所有的状态都由 Store 来维护,通过 Action 传递数据,构成了如上所述的单向数据流循环,所以应用中的各部分分工就相当明确,高度解耦了。
这种单向数据流使得整个系统都是透明可预测的。

优点:单向数据流,分工明确,高度解耦。
缺点:代码复杂化,迁移旧代码复杂。

MVP

image_1becc392c13cm1qj4v2p15q1h29.png-11.2kB
优点:

缺点:
* 代码增加

MVC

image_1be4sicovr9i1e74bjg1hnufam.png-18.5kB

优点:
耦合性低,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。
重用性高,模型也有状态管理和数据持久性处理的功能,例如,基于会话的购物车和电子商务过程也能被Flash网站或者无线联网的应用程序所重用。
部署快,使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。
可维护性高,分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。

缺点:
增加系统结构和实现的复杂性,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。

MVVM

image_1becc6q6v3q913l911mh10bqqfgm.png-12.5kB

优点:

缺点:

Clean Architecture

优点:
* 解耦
* 可测试

缺点:
* 代码量增加

设计模式

OOD原则
常用设计模式

性能调优

界面渲染

卡顿

1帧16ms
* Systrace 与设备互动,查看渲染瓶颈具体问题
* Traceview 查看具体代码性能

网络优化

内存优化

电池优化 (只是了解)

测试

单元测试(项目30%)

持续集成

每天固定时间打包,运行单元测试,邮件发出测试报告。

静态代码扫描

扩展学习(考虑如何选型)

编译打包

热修复

缺点:
1. 不支持新增字段和资源

缺点:
1. 需要重新启动App
2. 需要给应用开启新的进程才能进行合并,耗费内存,可能失败

后来的技术选型是AndFix,只是为了修改Bug,足以。

逆向工程分析

编译插件开发

App优化

App瘦身

  1. 分析包,去除无用的图和依赖三方包,或者剥离使用的类,减小包大小
  2. 图片压缩,如果大于200*200dp,用WebP,否则使用Vector Drawable
  3. so处理,限制app支持的cpu 架构的数目,只是用armeabi-v7a
  4. 图片重用,特别是箭头图片

SDK化

  1. 提高开发效率,可以统一维护
  2. 比如重复开发,减少Apk大小

启动保护

  1. 5s内8次触发,开启安全模式
  2. 尝试使用热修复

Crash统计

扩展学习(如何技术选型)

数据库

GreenDao

依赖注入

Dagger2

图片处理

Picasso

快速开发

ButterKnife

Http

Volley

React Native

技术选型

项目管理

进度管理

项目期间每晚统计进度,发布邮件,尽快抛出风险,及时对项目功能和资源进行调整。

跨端团队协作

不只是QA、产品和设计,还包括Android、iOS和HTML

规范流程

代码规范、提测流程(保证单元测试、自测后进行提测)、每日站立会(昨天的进展,今天的计划,是否遇到什么困难)、

Code Review

MR,如果遇到有争议部分,进行Code Review。

团队管理

招聘面试

技术规划

技能分享

每周技能分享

问题

  1. 对行业技术的前瞻
    还是可以看出未来大前端的趋势,希望之后有对Android、iOS、Web(React Native、React)有更深的理解和实践,快速开发,完成产品迭代。
  2. 对各种架构的,编程模式的理解
    MVP、MVC、MVVM、Flux、Clean Architecture优缺点。
    函数式编程:它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。输入一定,保证输出一定。
    面向对象编程:
    面向方面(切面)编程:日志、监控、权限处理等

  3. 对开源库的理解,设计模式的理解

  4. 对技术架构的风险评估,技术选型的考虑方向
    不盲目追风,用部分人力投入,快速产出,评估技术成熟度。业务不同的发展情况,也决定技术的选型不同,主要是找到合适的。
    考虑团队人员配比。

  5. 用ReactNative还是Weex
    非阿里团队 选择React Native,用的人多,RN迭代快,趋于稳定,问题方便处理,招人成本相对低。

  6. 偏管理的,会问很多工作方式,沟通技巧,平时行为处事方式,爱好什么的
    工作方式:效率、可衡量目标、关注结果、执行力强
    沟通方式:根据不同的人,有不同的方式,有些人会很内向,保持固定的沟通,及时发现问题,提供帮助。耐心的听完。
    爱好:比较广泛,旅游、看书。

  7. 动态代理的几种方式
    静态代理:代码在编译时生成代理类,编译时增强
    动态代理:在运行时,利用反射动态创建,与静态带来相比,简化编程工作,提高软件系统的可拓展性,运行时增强

    • JDK代理:JDK的动态代理依靠接口实现
    • Cglib动态代理:cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
  8. Spring IOC、DI、AOP原理和实现
    Spring IOC:控件反转也就是由容器控制程序之间的关系,把控件权交给了外部容器,控制反转是一种思想
    DI(依赖注入):依赖注入就是将实例变量传入到一个对象中去,依赖注入是一种设计模式
    AOP原理:广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。

  9. 并发编程

  10. 深入分析了Classloader,双亲委派机制

  11. HashMap的并发问题

  12. 了解LinkedHashMap的应用吗

  13. 搜索算法

  1. // 递归版本
  2. int binary_search(const int arr[], int start, int end, int khey) {
  3. if (start > end)
  4. return -1;
  5. int mid = start + (end - start) / 2; //直接平均可能會溢位,所以用此算法
  6. if (arr[mid] > khey)
  7. return binary_search(arr, start, mid - 1, khey);
  8. if (arr[mid] < khey)
  9. return binary_search(arr, mid + 1, end, khey);
  10. return mid; //最後檢測相等是因為多數搜尋狀況不是大於要不就小於
  11. }
  1. /*
  2. * 冒泡排序
  3. * 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  4. * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  5. * 针对所有的元素重复以上的步骤,除了最后一个。
  6. * 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
  7. * @param numbers 需要排序的整型数组
  8. */
  9. public static void bubbleSort(int[] numbers)
  10. {
  11. int temp = 0;
  12. int size = numbers.length;
  13. for(int i = 0 ; i < size-1; i ++)
  14. {
  15. for(int j = 0 ;j < size-1-i ; j++)
  16. {
  17. if(numbers[j] > numbers[j+1]) //交换两数位置
  18. {
  19. temp = numbers[j];
  20. numbers[j] = numbers[j+1];
  21. numbers[j+1] = temp;
  22. }
  23. }
  24. }
  25. }
  1. /**
  2. * 查找出中轴(默认是最低位low)的在numbers数组排序后所在位置
  3. *
  4. * @param numbers 带查找数组
  5. * @param low 开始位置
  6. * @param high 结束位置
  7. * @return 中轴所在位置
  8. */
  9. public static int getMiddle(int[] numbers, int low,int high)
  10. {
  11. int temp = numbers[low]; //数组的第一个作为中轴
  12. while(low < high)
  13. {
  14. while(low < high && numbers[high] > temp)
  15. {
  16. high--;
  17. }
  18. numbers[low] = numbers[high];//比中轴小的记录移到低端
  19. while(low < high && numbers[low] < temp)
  20. {
  21. low++;
  22. }
  23. numbers[high] = numbers[low] ; //比中轴大的记录移到高端
  24. }
  25. numbers[low] = temp ; //中轴记录到尾
  26. return low ; // 返回中轴的位置
  27. }
  1. 目前遇到最困难的技术难点是什么?如何解决的?
    考虑React Native性能检测

结束后想问的问题

问题
1. 最近遇到最难的事情是什么,最后是怎么解决的
2. 你觉得你未来5年会在哪
带来团队实现可盈利的商业级产品
3. 为什么你想在这里工作
4. 如何解决和同事间的意见不同

别人的问题
1.团队情况
一共80人左右
业务线:9条 记账、挖财宝、信用卡管家、钱管家、基金、社区、股票、社保掌上通,公积金
公共线:4条,公共产品、公共基础、新业务、跨端

2.个人情况
你好,我叫景宏刚,12年毕业于浙江财经大学。有5年Android app开发经验,有一定的设计、架构,app优化经验,2年项目管理经验,包括进度管理,团队协调,流程规范,code review等,1年团队管理经验,包括招聘面试、技术分享等。14年加入挖财,经历了挖财从100多人到1000多人的快速发展。3年呆过4条业务线,均担任主力开发和pm角色,其中社保掌上通是从0开始,选型使用react native开发,在离开的时候,已经做到一周快速迭代。17年3月份开始轮岗到公共基础团队,负责监控,组件化开发,工具开发。
3.为什么要跳槽
挖财的技术岗位基本都做过一遍,在公共组看了下一年的计划,也基本知道该怎么做,挑战不大。希望可以有更多技术和带团队的挑战。个人也是希望在5年内可以带团队完成有盈利的商业级别产品,这样就需要我有技术,产品,运营,市场等相关的经验。
4.个人优势
非管理岗位
5年的Android App开发经验,在挖财业务线待过3年,作为主力负责过4款App,有一定的架构、设计、App优化等经验,也在基础团队轮岗,虽然时间不长,但也清楚组件化,工具开发,热修复,监控等实现和流程。并且也在业务中锻炼了自己项目管理的能力,很好的团队协作能力,对业务本身有很大的热诚。我相信我符合贵公司对该岗位的要求。

有管理岗位
5年的Android App开发经验,在挖财业务线待过3年,负责过4款App,也在基础团队轮岗,虽然时间不长,但也清楚组件化,工具开发,热修复,监控等实现和流程。并且也在业务中锻炼了自己项目管理的能力,很好的团队协作能力,对业务本身有很大的热诚,如果岗位需要,也能从业务,技术,开发流程,团队管理等各个方面带领一个团队。我相信我符合贵公司对该岗位的需要。

5.rn,native,h5如何选型
6. 贵公司产品的优缺点

针对领导人
1. 我们有利可图吗,盈利前景如何
2. 公司文化是什么

问题
1. 最近遇到最难的事情是什么,最后是怎么解决的
2. 你觉得你未来5年会在哪
带来团队实现可盈利的商业级产品
3. 为什么你想在这里工作

  1. 如何解决和同事间的意见不同
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注