本文的内容有别于之前文章中纯技术的探讨,会从业务逻辑、技术、团队和方法论的角度探讨如何快速高效地完成一个Android项目。当然,快速高效是有前提的,第一,本文依然是从研发的角度来谈如何把控项目的,而这种研发人正如陈皓在《技术人员的发展之路》中提到的,需要具备高效的学习能力和解决问题的能力。另外,快速需要保证质量,没有质量的速度是不负责任的。
一、业务逻辑
计算机科学的核心是通过数据结构和算法实现对现实世界的抽象,平台是会随着技术发展不断变迁的,只有数据本身所描述的这种抽象才是事物永恒的本质。作为研发,笔者推荐通过数据结构来理解业务逻辑,比如,数据库建模需要对系统中所有的实体关系进行抽象,是理解业务逻辑的核心。当然,可能有不少App研发人对后台的业务逻辑并不太关心,但实话讲,任何依赖于平台(Windows、Symbian、Android、iOS……)的开发者是没有安全感的,平台是会不断迭代的,研发人需要去抓住那些本质的、稳定的计算机科学的核心知识。有点跑题,举个栗子,一个进销存管理的Android软件,先抛开复杂的、精细的管理流程不讲,从最小可行产品(MVP)来说,主要会包括如下业务:
- 进货=选商品+加库存;
- 销售=选商品+减库存;
- 库存=查库存+库存修改(商品修改);
- 基础资料=新增/修改店铺+新增/修改商品;
- 报表=入出操作流水。
对于一个店铺来讲,进货需要选品和增加库存量,选品的方式可能包括扫描69码或从库存添加(69码最终也会对应库存中的SKU);销售包含选品和减少库存量;库存包含增删改查等基本操作;基础资料包含店铺信息、人员信息、设备信息等;基础报表包含利润、进货明细、销售明细、对账等操作流水。当然,上述业务框架仅仅是MVP,并未考虑ERP、WMS中精细化管理的各种场景,但对于App的研发来讲,这也是最基础需要了解的。
二、技术
本节将从Android开发的角度来说明在快速开发中最常用、最重要的几点技术:
-
数据结构和算法。正如业务逻辑中讲到的,数据结构和算法是软件技术的核心,在快速Android开发过程中,需要了解Java中的各种数据类型的实现及原理。比如下列问题是否了然于胸?
1、List、Queue、Stack的实现有哪些异同?ArrayList如何实现扩容?PriorityQueue、LinkedBlockQueue的主要特性是什么?直接在循环中删除List的元素为什么会报ConcurrentModificationException?
2、如何实现树的深度遍历、广度遍历?文件系统如何使用二叉树建模?红黑树有什么特性,主要的应用场景是什么?
3、Hash原理是什么?HashMap的Key有什么注意事项?Java中是如何解决Hash冲突的,有哪些解决Hash冲突的办法?基于Hash冲突的攻击是什么原理?为什么要重写hashcode和equals方法?LinkedHashMap、TreeMap以及SortMap有什么异同,各自的应用场景是什么?Map如何通过迭代器进行遍历?
4、如何对Collections中的元素进行排序?Compareable和Comparator有什么区别?如何实现线程安全的集合类?常见的并发场景有哪些?闭锁、FutureTask、信号量、栅栏等各自的应用场景是什么,实现原理?如何将串行任务并行化?锁的实现原理是什么? -
Android中的View、WMS及AMS的知识。如果是数据是应用的灵魂,那么View、WMS及AMS就是应用的外观。因此,应用要求良好的交互性、体验等,就需要深入理解View的原理及WMS的知识。比如下列常见的问题是否理解?
1、RecyclerView的使用,是否了解其与ListView的区别?RecyclerView嵌套与适配器?如何响应Item中控件的操作?如何在RecyclerView与Activity之间通信,并实现数据联动?RecyclerView在ScrollView中的显示需要注意什么问题?
2、自定义View需要重写哪些方法?invalidate()和postInvalidate() 的区别及使用?如何实现具有动画效果的View?View的层次关系是什么?Android中的事件类型有哪些?事件的传递过程?ViewGroup和View在事件处理方面有什么异同?
3、Activity界面的层次?Window、WindowManager以及WindowManagerService之间的关系?如何通信?
4、Activity的启动过程如何?主线程消息队列如何启动?ActivityThread与AMS如何通信?Activity在异常情况下的生命周期?如何在Service中实现对Activity的跨进程回调?
需要说明的,这里提到的技术点并不是像面试中问到的,因为面试时需要探探应试者的深度,这里主要是说明快速开发中直接使用的技术,也是最需要掌握的基础知识。笔者最近准备写个系列文章,从八个方面来说明对Android开发的理解,主要包括:数据结构与算法、网络通信编程、线程与并发、进程的通信与调度、View体系及WMS、四大组件及AMS、设计模式与架构、性能优化与虚拟机,敬请期待~~
三、团队
在需要快速高效完成项目的场景下,团队的沟通、协作是非常重要的。如何带领一个Android开发团队,这里列出几个笔者认为比较重要的点:
- 研发团队不能管理的太紧,关键是要制定好标准,搭好框架,然后在遵循统一的标准下保持进度。研发要避免过度管理,*、开放的环境更有利于产品研发工作,流程、制度约束太多对创新无益。团队成员更多的是协作,而不是管理。
- 技术团队Leader的工作包括:搭建稳定、可靠的开发框架,模块化、插件化架构,网络通信请求回调方法,单元测试流程,技术调研,渠道包管理,产品、UI和测试团队的沟通协作,需求讨论及工期安排,各种核心流程图及文档,Code Review,崩溃日志分析及处理等等
- 团队是有人构成的,团队中需要有各种不同类型的人,有担当、能救火的人;有远见、能防火的人;有执行力、靠谱的人;有喜感、能活跃氛围的人;有独立思考、事事能提出不同意见的人……以上总总,只要是能给团队带来正面影响的人,作为团队Leader,一定要以开放、妥协、灰度的眼光求同存异。
四、方法论
从个人的角度来讲,如何在高度压力之下完成大量的工作?不管在公司承担重要项目,还是自己创业,这都是不可避免的话题。以下谈谈笔者个人的体会和方法:
- 节奏。工作的时候要全身心投入,避免各种打扰,比如测试提的BUG,各种会议,要尽量保证工作的连续性,避免被打扰。完成了一周紧张的工作,要及时的休息,脑袋里完全抛开工作上的事情,做一些其他轻松的事情,比如笔者喜欢写写毛笔字、喝点小酒,总之,做一些与工作完全无关的事情。
- 计划。凡事遇则立,不预则废,一定要有计划,要有明确的条理,知道今天该完成什么,明天该完成什么,进度该怎么把控,有什么风险点,所有的事情一定要提前定好计划,没有准备的仗是一定打不赢的。有了计划之后,才会工作的走向有所把控,心里才有底,面对领导、同事以及相关工作人的时候,才会有底气,也才会有自信心。
最后,和大家分享一个经历和体会,与本文标题没有直接关系,没兴趣的话可以直接跳过。
上上周末完成了一次从北京的东南到西北的徒步穿越,全程接近40公里。徒步是最简单的一种思考方式,用脚步这种最原始的方式去经历每一处风景。
- 在你到达目标的过程中,不可能一条平坦开阔的大路走到底,还要去走很多没人走过的小路。大路走的人多,你觉得很有安全感;小路人迹罕至,你很担心自己走错。但如果你的目标是终点,你就勇敢的走下去吧。其实路没有大小,只有你是否能通过此路到达目标。
- 如果你一开始就决定要走一条很长的路,那么一开始的走左边,还是右边其实影响不大,到达目标的路径有千万种选择。对于一个长跑选手来说,重要的是方向和节奏。只要大方向对,以**为起点,只要朝着西北方向,保持每小时3-5公里的节奏,目标终能到达。
- 人走在路上,到了中点的时候,可能脚下已经起了水泡,每走一步都很疼。这正如人到中年,工作、职场、家人、身体已经已经落下很多的问题,要去解决这些问题,就会很疼。往回走,就是失败;站在原地,就会彷徨;所以只能往前走,遇到困难,死活顶上去,保持进步的节奏,你才可能朝目标前进。很多人到了中年之后开始向各种问题妥协,其实就相当于站在原地,彷徨。
以上。