做一个 App 前需要考虑的几件事

 来源:limboy的博客

 

随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了。尽管如此,有些事情最好前期就做起来,避免当 App 有了一定规模后,再感慨当初为什么没有多留点心。

完善的日志系统

以 iOS 为例,有时图方便,就直接用 NSLog 了,甚至线上都一直开着。一方面会影响性能,尤其是输出比较频繁的时候,另一方面也容易泄露敏感信息,所以一般做法是在 Release 模式下禁用 NSLog,比如在 pch 文件中,通过对环境的判断,对 NSLog 做不同的处理。

但这样仍会有问题,比如我们发现线上的 App 在特定场景下会有某种异常的表现,这时就很希望能有日志来提供更多的信息。可以考虑使用像 cocoalumberjack 这样功能更完善的第三方日志工具,在线上仍然开着日志,但不消费,这样就不会泄露敏感信息。当我们需要看日志时,可以通过「调试模式」打开它,然后连上 iOS Console 来看。

因为 Log 是一个很普遍的行为,所以最好前期就规范起来,后期遍地都是 NSLog 时,再要改动会有点麻烦,当然也可以偷懒点,直接把 NSLog 的宏定义改了。

Commit Message 规范

在前期开发的时候,往往为了快速实现功能,而忽略了 Commit Message 的规范,然后就会出现很随意的 Commit 信息。这样别人在 Review 代码时就会很累,写某个版本的 Release Notes 也会变得艰辛,甚至过一段时间自己都不知道这些 Commit 代表的意思。而如果自己也讲不清这次改动究竟该怎么描述时,往往是这次改动混杂了较多的信息。

这篇文章 简洁精确地描述了为什么要写好 Commit Message,以及如何写。遵守这些规范后,就很方便产出这样的 Release Notes 了。

代码规范

这个最好在前期就抓起来,如果前期不做约束,每个人的风格往往会有比较大的差异,导致代码看起来会比较累,甚至有些人是从其他语言转过来的,还会保留之前语言的一些书写习惯,就容易有「出戏」的感觉。一致的代码规范不仅看起来舒服,而且让团队更像一个整体。

这个实施起来会有一定难度,尤其是团队中有一些「老人」的时候,他们往往积累了一套自己的编程习惯,而且不容易被说服。

准备一份编程守则

里面包含了「最佳实践」和「不要踩的坑」,这个可以一定程度上提高开发效率,避免一些低级错误。比如以 iOS 为例,「不要随便使用通知」,因为通知使用起来太方便了,用得多了调试起来就会很累,而且也不好管理;「通知用完之后记得 remove observer」;不要使用containsString (如果还需要支持 iOS 7 的话)。随着时间的累积,这份守则里的内容会越来越多,也是一件挺宝贵的财富。

页面布局规范

这个在 Android 相对还好,基本都是通过 xml 来进行布局。在 iOS 里玩法就多了,有用 storyboard 的,有用 xib 的,有直接计算坐标和大小的,有用原生 autolayout 的,有用第三方布局类的。总之就是各显神通,尽量用同一种布局规范(但不建议直接计算坐标和大小),看起来也会方便些。

统计埋点

这是很重要的一块,客户端所有的数据基本就靠它了,所以尽量选择一个灵活、稳定的数据方案,同时最好在他们提供的 SDK 上再封一层,方便做一些额外的事情(比如想同时接入另一家服务作对比)。

统计埋点还有很重要的一点是「验证」,是否有错打、漏打等现象;iOS / Android 是否有用同一个点;有些点还需要额外的参数,这些参数的格式是否正确等。这些工具往往只能自己来做了,这也是比较花时间的一部分。

App 架构

App 架构会随着业务、人员的增长而演进,所以当发现当前的架构无法满足日常的业务迭代时,就需要考虑对它做调整了。一般来说,大方向上也就是 MVP / MVVM,等人员多起来时,基本就是组件化开发,当然组件化也会有它的问题(比如资源 / 类重用、组件间通信等),这里就不展开了。

在前期选择一个相对轻量级,但比较清晰的架构(尽量不要选择 MVC),大家都遵守这个架构开发,也能一定程度上提高效率。

页面跳转机制

虽然 Android、iOS 都原生支持 open 特定 scheme 的 url,不过可能的话,还是通过 router 统一处理会比较方便,也更灵活。比如可以知道注册了哪些 URL;可以知道页面的跳转成功率;方便处理一些奇奇怪怪的需求等。

在线配置

在线配置可以赋予 App 极大的灵活性,比如运营的一些活动、banner 位调整、首页弹窗等;还可以针对特定机型、系统分发特定的内容,结合规则引擎甚至可以给一部分有相同特征的用户发推送;可以做流量切分等。所以一个强大/稳定的配置中心就显得尤为重要,A/B Test 也可以基于配置中心来做。

这里有些注意事项,因为不少配置的值是运营填的,她们对 value 不那么敏感,所以会出现 value 为空,或者不是想要的类型,或者配了张图片,但是体积超大等,有可能造成客户端 crash / OOM 等异常表现,所以客户端要有足够强大的容错能力。

选择合适的 Crash 平台

Crash 会给用户造成极大的负面体验,所以需要经常关注 Crash 情况,尤其是刚发版的那段时间。这块 fabric 做的比较好,只是由于是国外的服务,会有些许数据上的丢失,不过问题倒也不是很大,也可以考虑国内的一些服务,如 bugly,毕竟腾讯自己也在用。

Code Review

这也是容易忽视的一点,当业务需求压过来时,先把功能实现了再说,而且在初期往往人手也不够,抽不出时间来做 Code Review。如果是这样的话,可以先 Review 一些核心的点,保证重要的代码是经过 Review 的,不太重要的业务代码可以先放放,等人员充足后再覆盖更大的范围。

Code Review 的主要作用是保障代码质量,同时促进双方成长,一个担心点是质量偏低的代码比例如果较大的话,会影响开发者的心情,增加维护成本,日积月累就成了重重的「历史包袱」。

选择合适的开发模式

如果是使用 git 来做源码管理的话,可以采用 flow 模式,基本能满足大部分的需求,而且不少 git 工具也内置了 flow 的支持。这样当需要处理 feature / hotfix / 发版等场景时,就会很方便。

持续集成

持续集成的目的是让产品在快速迭代的过程中还能保证质量,当有错误发生时,可以第一时间被检查出来,方便修复。如果想偷懒的话,可以直接使用成熟的服务,如 travis,也可以自己基于 Jenkins 来搭,iOS 的话,配合 fastlane 效果会更好。自己搭的好处是灵活度更大,可以加入一些个性化需求。

如果有打包平台的话,还可以定时出一个包,这样当发现某个功能使用起来有问题,代码上又没什么头绪时,可以对比以前的包来定位。

Bug 管理系统

这个 Bug 包括测试阶段和线上的 Bug,Bug 管理工具有很多,使用在线服务或自己搭都可以,但要有,不然很有可能忘了还有哪些问题需要修复,哪些已经修复了。

项目管理工具

在 App 开发初期,人员较少,沟通起来比较方便,所以很多需求当面就说了,一些原型/设计图可能也是直接 AirDrop 过来的,这样效率自然高,但不便管理。比如没有 prd,产品、开发的理解可能不一致,到头来发现做的不是产品想要的,或者一些细节不符合要求;设计图有更新,但没有同步到所有的开发;需求有变更,但当时在专心做某个 feature,可能就忘了,或者没有理解全面等。所以最好还是有一个项目管理工具来统一处理,再结合敏捷开发,项目的质量和进度就容易得到保障。

Checklist

一个 App 发布上线之后,要保证不出大的问题,就要在发布之前,先检查一下「一定不能出问题」的点是否正常,就像飞机起飞之前一定会走一遍 checklist 一样。比如推送是否正常、log 是否关闭、组件版本是否正确等,随着 App 功能的增加,这个 list 也会越来越长,虽然过一遍 checklist 会花费些时间,但跟收益相比还是值得的。

以上这些点是在感受不过不同量级的 App 开发后整理的,肯定还会有疏漏,不过如果真能做到这些,就已经很不错了,至少当有新人进来时,不会背上沉重的「历史包袱」。

做一个 App 前需要考虑的几件事的更多相关文章

  1. 做一个App前需要考虑的几件事

    本文转载于文章原文链接,版本归原作者所有! 随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 App 有了一定规模后, ...

  2. [转载]做一个 App 前需要考虑的几件事

    本文转自http://limboy.me/tech/2016/07/06/starting-an-app.html ========================================= ...

  3. IOS-APP前需要考虑的几件事

    做一个 App 前需要考虑的几件事 来源:Limboy's HQ 链接:http://t.cn/R5sEDMJ 随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了. ...

  4. 开始 App前 需要考虑的几项

    来源:Limboy's HQ http://t.cn/R5sEDMJ 随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 ...

  5. 涨姿势:创业做一个App需要花多少钱(8个人,6个月,就要100万,附笔记心得)

    (原标题:涨姿势:创业做一个App要花多少钱?) 作为互联网从业者,被外行的朋友们问及最多的问题是,“做一个网站需要多少钱?”或者“做一个APP需要多少钱?”. 作为做过完整网站项目和APP的人,今天 ...

  6. 【移动端debug-6】如何做一个App里的web调试小工具

    原文链接:如何做一个App里的web调试小工具 我们知道现在hybrid app非常流行,在这样的app里,h5页面是应用非常广泛的.相对于以往在pc端开发的网页,放在app里的网页由于无法直接使用桌 ...

  7. 创业成本?亲身经历告诉你做一个app要多少钱

    导语:作为一名苦逼的移动互联网创业者,被外行的朋友们问及最多的问题是“做一个网站需要多少钱?”或者“做一个APP需要多少钱?” 作为一名苦逼的移动互联网创业者,被外行的朋友们问及最多的问题是“做一个网 ...

  8. 尝试用kotlin做一个app(写在前面)

    学kotlin的目的好像就是做一个app,不一定有什么想做的项目,只是单纯想掌握这一门技术,确切地说只是单纯想学会做app.对于概念的东西,我也没兴趣深究,用得到的学一下,用不到的,就算了.我也不知道 ...

  9. 保护嵌入式802.11 Wi-Fi设备时需要考虑的10件事

    保护嵌入式802.11 Wi-Fi设备时需要考虑的10件事 10 things to consider when securing an embedded 802.11 Wi-Fi device 随着 ...

随机推荐

  1. 对CSS中的Position、Float属性的一些深入探讨

    对CSS中的Position.Float属性的一些深入探讨 对于Position.Float我们在平时使用上可以说是使用频率非常高的两个CSS属性,对于这两个属性的使用上面可能大多数人存在一些模糊与不 ...

  2. Windbg Extension NetExt 使用指南 【3】 ---- 挖掘你想要的数据 Managed Heap

    摘要 : NetExt中有两个比较常用的命令可以用来分析heap上面的对象. 一个是!wheap, 另外一个是!windex. !wheap 这个命令可以用于打印出heap structure信息. ...

  3. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

  4. js变量声明作用域问题

    1.先来看两个题 var a = 1; foo1(); function foo1(){ console.log(a); //输出1 }; foo2(); var a = 1; function fo ...

  5. 【译】Unity3D Shader 新手教程(1/6)

    本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D ...

  6. 从零开始编写自己的C#框架(11)——创建解决方案

    这段时间一直在充电,拜读了园子中大神们的博文(wayfarer的<设计之道>.TerryLee的<.NET设计模式系列文章>.卡奴达摩的<设计模式>还有其他一些零散 ...

  7. Hawk 4. 数据清洗

    数据清洗模块,包括几十个子模块, 这些子模块包含四类:生成, 转换, 过滤和执行. 数据清洗可以通过组合多个不同的子模块,生成多样的功能,通过拖拽构造出一个工作流,它能够产生一个有限或无限的文档序列. ...

  8. 【原创】记一次Project插件开发

    一.开发背景 最近在使用微软的Office Project 2010 进行项目管理,看到排的满满的计划任务,一个个地被执行完毕,还是很有成就感的.其实,不光是在工作中可以使用Project进行项目进度 ...

  9. linux2.6 内存管理——逻辑地址转换为线性地址(逻辑地址、线性地址、物理地址、虚拟地址)

    Linux系统中的物理存储空间和虚拟存储空间的地址范围分别都是从0x00000000到0xFFFFFFFF,共4GB,但物理存储空间与虚拟存储空间布局完全不同.Linux运行在虚拟存储空间,并负责把系 ...

  10. 防御性编程习惯:求出链表中倒数第 m 个结点的值及其思想的总结

    防御性编程习惯 程序员在编写代码的时候,预料有可能出现问题的地方或者点,然后为这些隐患提前制定预防方案或者措施,比如数据库发生异常之后的回滚,打开某些资源之前,判断图片是否存在,网络断开之后的重连次数 ...