本文转载于文章原文连接,版本归原做者全部!php
随着工具链的完善,语言的升级以及各类优质教程的涌现,作一个 App 的成本也愈来愈低了。尽管如此,有些事情最好前期就作起来,避免当 App 有了必定规模后,再感慨当初为何没有多留点心。html
此处由标哥的技术博客站长点评:ios
看完本篇文章以后,也让我想起了很多之前作过的蠢事,作过不少重复的工做。以前在项目中使用过cocoalumberjack,我的感受是很不错的日志管理框架。固然,不必定要求使用它,也在另外一家公司里,原来的人将NSLog重定义了,改写了输出,可是整体并无cocoalumberjack的强大。git
使用git或者SVN提交代码时,必定要加上详细注释,不然出现问题时,都找不到是哪次提交的,并且没有好的注释也不利于code review。对于代码规范和编程准则,在公司一般都有要求的,除非你是来公司的第一人。其余就很少说了,你们慢慢体会吧,这些是很经常使用的!github
完善的日志系统编程
以 iOS 为例,有时图方便,就直接用 NSLog 了,甚至线上都一直开着。一方面会影响性能,尤为是输出比较频繁的时候,另外一方面也容易泄露敏感信息,因此通常作法是在 Release 模式下禁用 NSLog,好比在 pch 文件中,经过对环境的判断,对 NSLog 作不一样的处理。架构
但这样仍会有问题,好比咱们发现线上的 App 在特定场景下会有某种异常的表现,这时就很但愿能有日志来提供更多的信息。能够考虑使用像cocoalumberjack这样功能更完善的第三方日志工具,在线上仍然开着日志,但不消费,这样就不会泄露敏感信息。当咱们须要看日志时,能够经过「调试模式」打开它,而后连上iOS Console来看。app
由于 Log 是一个很广泛的行为,因此最好前期就规范起来,后期遍地都是 NSLog 时,再要改动会有点麻烦,固然也能够偷懒点,直接把 NSLog 的宏定义改了。框架
在前期开发的时候,每每为了快速实现功能,而忽略了 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 架构会随着业务、人员的增加而演进,因此当发现当前的架构没法知足平常的业务迭代时,就须要考虑对它作调整了。通常来讲,大方向上也就是 MVP / MVVM,等人员多起来时,基本就是组件化开发,固然组件化也会有它的问题(好比资源 / 类重用、组件间通讯等),这里就不展开了。
在前期选择一个相对轻量级,但比较清晰的架构(尽可能不要选择 MVC),你们都遵照这个架构开发,也能必定程度上提升效率。
虽然 Android、iOS 都原生支持 open 特定 scheme 的 url,不过可能的话,仍是经过 router 统一处理会比较方便,也更灵活。好比能够知道注册了哪些 URL;能够知道页面的跳转成功率;方便处理一些奇奇怪怪的需求等。
在线配置能够赋予 App 极大的灵活性,好比运营的一些活动、banner 位调整、首页弹窗等;还能够针对特定机型、系统分发特定的内容,结合规则引擎甚至能够给一部分有相同特征的用户发推送;能够作流量切分等。因此一个强大/稳定的配置中心就显得尤其重要,A/B Test 也能够基于配置中心来作。
这里有些注意事项,由于很多配置的值是运营填的,她们对 value 不那么敏感,因此会出现 value 为空,或者不是想要的类型,或者配了张图片,可是体积超大等,有可能形成客户端 crash / OOM 等异常表现,因此客户端要有足够强大的容错能力。
Crash 会给用户形成极大的负面体验,因此须要常常关注 Crash 状况,尤为是刚发版的那段时间。这块 fabric 作的比较好,只是因为是国外的服务,会有些许数据上的丢失,不过问题倒也不是很大,也能够考虑国内的一些服务,如 bugly,毕竟腾讯本身也在用。
这也是容易忽视的一点,当业务需求压过来时,先把功能实现了再说,并且在初期每每人手也不够,抽不出时间来作 Code Review。若是是这样的话,能够先 Review 一些核心的点,保证重要的代码是通过 Review 的,不过重要的业务代码能够先放放,等人员充足后再覆盖更大的范围。
Code Review 的主要做用是保障代码质量,同时促进双方成长,一个担忧点是质量偏低的代码比例若是较大的话,会影响开发者的心情,增长维护成本,日积月累就成了重重的「历史包袱」。
若是是使用 git 来作源码管理的话,能够采用flow模式,基本能知足大部分的需求,并且很多 git 工具也内置了 flow 的支持。这样当须要处理 feature / hotfix / 发版等场景时,就会很方便。
持续集成的目的是让产品在快速迭代的过程当中还能保证质量,当有错误发生时,能够第一时间被检查出来,方便修复。若是想偷懒的话,能够直接使用成熟的服务,如travis,也能够本身基于 Jenkins 来搭,iOS 的话,配合 fastlane 效果会更好。本身搭的好处是灵活度更大,能够加入一些个性化需求。
若是有打包平台的话,还能够定时出一个包,这样当发现某个功能使用起来有问题,代码上又没什么头绪时,能够对比之前的包来定位。
这个 Bug 包括测试阶段和线上的 Bug,Bug 管理工具备不少,使用在线服务或本身搭均可以,但要有,否则颇有可能忘了还有哪些问题须要修复,哪些已经修复了。
在 App 开发初期,人员较少,沟通起来比较方便,因此不少需求当面就说了,一些原型/设计图可能也是直接 AirDrop 过来的,这样效率天然高,但不便管理。好比没有 prd,产品、开发的理解可能不一致,到头来发现作的不是产品想要的,或者一些细节不符合要求;设计图有更新,但没有同步到全部的开发;需求有变动,但当时在专心作某个 feature,可能就忘了,或者没有理解全面等。因此最好仍是有一个项目管理工具来统一处理,再结合敏捷开发,项目的质量和进度就容易获得保障。
一个 App 发布上线以后,要保证不出大的问题,就要在发布以前,先检查一下「必定不能出问题」的点是否正常,就像飞机起飞以前必定会走一遍 checklist 同样。好比推送是否正常、log 是否关闭、组件版本是否正确等,随着 App 功能的增长,这个 list 也会愈来愈长,虽然过一遍 checklist 会花费些时间,但跟收益相比仍是值得的。
以上这些点是在感觉不过不一样量级的 App 开发后整理的,确定还会有疏漏,不过若是真能作到这些,就已经很不错了,至少当有新人进来时,不会背上沉重的「历史包袱」。