- 我是一名iOS开发者,专业为软件工程,以下主要是一些基于iOS的软件工程工作流总结和感悟,不仅限于iOS,在使用Mac做开发或做其他开发的都可以一起来讨论,总结出最高效的方法。以下全部为手打原创,欢迎大家和我一起讨论,共同进步。
在传统的软件项目开发中,通常使用瀑布模型进行开发,开发过程是通过设计一系列阶段顺序展开的,从系统需求分析开始直到产品发布和维护,每个阶段都会产生循环反馈,因此,如果有信息未被覆盖或者发现了问题,那么最好 “返回”上一个阶段并进行适当的修改,项目开发进程从一个阶段“流动”到下一个阶段。
但在现如今移动应用盛行的时代,若将瀑布模型应用于移动应用的开发,就会稍显尴尬,以下将从软件项目周期的各个阶段进行分析和论述,包括在我看来一些实用的技术和软件建议。
可行性分析
在传统的软件项目中,可行性分析是首当其冲的,当然在现在的敏捷开发、极限编程中也不可或缺。首先最容易被忽略的问题便是做出来的软件是否会有人用,现如今创业就等于做APP,大多数客户都是想通过做APP来创业,都想搞个平台或者商城,希望很多人来使用这个平台。但大多客户并不会推广和运营,只是有一个创业的想法,大多数软件公司不会说客户的想法哪里不好,毕竟软件公司都需要存活,那么客户的任何需求也就都顺理成章的成为了可行。
除开软件业务的可行性,客户最关心的便是软件制作的价格、工期以及软件公司是否有能力做出软件。客户往往会毫无依据的开始压工资和压价格。公司本该需要对项目的工作范围、时间、质量、成本进行全方位的评估,但根据客户的要求软件公司就只有被动的考虑技术上是否能实现,在技术能实现的情况下能否满足客户的时间和价格需求。只要以上的都满足,以做出来为原则,就会认为是可行,公司便会立马和客户签合同。往往这就会忽略掉其他因素,这类软件做出来过后的可行性就大打折扣,客户往往也是走一步看一步,最后走向失败。
对一个项目来说当然最理想的情况就是“多、快、好、省”。“多”指工作范围大,“快”指时间短、“好”指质量高,“省”指成本低。但是,这4者之间是相互关联的,提高一个指标的同时会降低另一个指标,所以实际上这种理想的情况很难达到。
需求分析
在与客户沟通的过程中要把确定的和需要做的事情都记录下来形成文档。可以用图沟通就不要用文字,可以用文档沟通就不要用口。需求获取可以用OmniOutliner或者Excel来记录,到最终确定需求的时候便就是需求文档或项目报表,需求获取到过后可以用Xmind构建出项目基本模块和架构并输出产品原型,整个过程采用敏捷开发模型,迅速迭代,整个过程所有人都可以查看和提出建议,最终由产品经理(需求工程师)修订产品原型和文档,项目经理(技术大牛)根据需求原型和需求文档整理出项目报表和工期表。
如果客户也懂得软件方面的知识,那么肯定是严格按照标准走是最好的。但现在大多数客户并不懂得软件,甚至连自己也不知道自己真正的需求是什么,他们只说出一个大概,比如要一个直播或者一个商场,然后便让开发商报价和估计工期,然后便毫无依据的开始压价格和工期。这就好比客户说要修一栋别墅,也没说这栋别墅需要多大,多少层,每层多少个房间。所以通常只有通过制作原型来直观地体现客户的想法,传统的需求文档过于抽象,并没有界面原型来的直观。如果需求分析再规范一些的话,还需要通过UML建模,然后再制作界面原型。但是因为客户的需求时刻都在变化,用UML建模跟不上时刻变化的需求。所以就直接用原型将需求体现出来,让客户也能更直观地看到界面及功能上的变化。在原型设计方面比较流行的是Axure,但是Axure对APP原型的制作不太友好,相比较而言Justinmind就是专门针对移动设计的,在线的原型设计网站墨刀也很不错,还能实时分享查看,还有就是Flinto,它还有可供Sketch用的插件,Balsamiq Mockups也不错,但仅仅只是草图,没有交互设计,特点就是快速。还有Facebook最近开源的御用原型工具Origami Stdio,也能在手机上实时查看,潜力无穷,具体如何选择,可以根据具体的需求来。界面尺寸和颜色的标注也可以使用Mark Man,使用起来非常方便,缺点是只能基于px进行标注,而iOS更希望是pt。
设计
当原型确定过后就要进行界面具体设计了,说到界面设计,当然首推Sketch,它不仅是基于矢量的,而且操作简便,上手也非常快,还有非常丰富的插件,可以和flinto、framer、principle等交互设计软件无缝衔接,能够一键导出SVG、Png、PDF等常用格式,也有可供标注的插件使用,非常方便,是移动设计的不二之选。当交互设计完成后可以使用Kap来录制Gif图进行分享。
当界面设计完成后便将完全设计好的界面发布,让前端可以开始搭建项目架构和界面,后台人员则开始设计数据库和数据接口,并形成API文档。
整个过程可以使用Git进行版本管理,Github很不错,不过需要收费,git.oschina是免费的,不是特别重要的项目可以使用,有时候可能会漏掉一些更改,不是很稳定,coding.net也很不错,正在发展中,潜力很大推荐使用。
编码
在设计完成后,开发人员便可根据界面图和接口文档开始进行编码,在编码之前需要制定一个时间周期表,可以使用OmniPlan来管理项目的进度,coding.net在近期也推出了项目进度管理的功能,团队协作产品Tower.im也非常值得使用。在编码时因为会进行团队多人开发,所以需要使用Git或SVN等版本管理工具,Sourcetree是个非常好用的Git管理客户端,可以不用使用命令行。在iOS端编码的时候,可以使用Reveal界面分析工具实时分析界面,可以节省大量的时间,减少出现BUG的几率。在团队开发中,需要规定好规范并严格遵守,包括项目前缀和代码注释。在Xcode 8之后,VVDocumenter被继承在了Xcode中,只需要在需要注释的代码上方按(⌥ Option + ⌘ Command + /)便可快速生成固定格式的注释。
在项目中经常会使用到第三方库如AFN,Masonry之类的,CocoaPods提供了方便的第三方库管理功能,只需要编辑Podfile便可随意管理第三方库,CocoaPods会直接创建和修改项目的workspace配置,一切都是为了便捷,我们只需要修改pod文件并不需要过多的关心其他事情,CocoaPods创建的是高度集成的项目。相对于CocoaPods,另一款第三方库管理工具Carthage的特点是灵活,耦合度不高,集成时不需要集成相应的project,不需要创建workspace,而仅仅需要依赖打包好的framework文件即可。两者也可配合使用。
在多人开发时最好把自己写好的东西封装起来,进行组件化开发,要测试的时候只需要取消注释掉封装的那一行代码便可以进行测试。
Charles是Mac上的抓包神器,Charles可以截取 Http 和 Https 网络封包。支持重发网络请求,方便后端调试。支持修改网络请求参数。支持网络请求的截获并动态修改。支持模拟慢速网络。在进行网络编程、测试和调试的时候非常有用。
每天最常见的动作就是查看各种API文档,Dash是一个API文档浏览器,可以查询不同语言和不同框架的API,使用起来非常方便,并且反应迅速。它还具有代码片段管理功能,
利用Dash的代码片段管理功能,我们可以把日常使用频繁(也就是你经常需要复制粘贴)的代码保存起来,然后为其设置一个独一无二的缩写,这样一来原本需要一遍又一遍的敲击键盘重复录入的繁琐工作,就可以交给Dash来帮你搞定。
测试
Instruments是Xcode自带的强大的测试工具,可以好好利用。
蒲公英可以很好的进行应用托管,并进行App应用众测分发,关键还是免费的,还能生成Crash报告和数据统计,非常好用。
腾讯 Bugly,是腾讯公司为移动开发者开放的服务之一,面向移动开发者提供专业的 Crash 监控、崩溃分析等质量跟踪服务。Bugly 能帮助移动互联网开发者更及时地发现掌控异常,更全面的了解定位异常,更高效的修复解决异常。针对移动应用,腾讯 Bugly 提供了专业的 Crash、Android ANR ( application not response)、iOS 卡顿监控和解决方案。移动开发者 ( Android / iOS ) 可以通过监控,快速发现用户在使用过程中出现的 Crash (崩溃)、Android ANR 和 iOS 卡顿,并根据上报的信息快速定位和解决问题。
iOS单元测试,OCUnit(即用XCTest进行测试)其实就是苹果自带的测试框架,我们主要讲的就是这个。GHUnit是一个可视化的测试框架。(有了它,你可以点击APP来决定测试哪个方法,并且可以点击查看测试结果等。)OCMock就是模拟某个方法或者属性的返回值,你可能会疑惑为什么要这样做?使用用模型生成的模型对象,再传进去不就可以了?答案是可以的,但是有特殊的情况。比如你测试的是方法A,方法A里面调用到了方法B,而且方法B是有参数传入,但又不是方法A所提供。这时候,你可以使用OCMock来模拟方法B返回的值。(在不影响测试的情况下,就可以这样去模拟。)除了这些,在没有网络的情况下,也可以通过OCMock模拟返回的数据。UITests就是通过代码化来实现自动点击界面,输入文字等功能。靠人工操作的方式来覆盖所有测试用例是非常困难的,尤其是加入新功能以后,旧的功能也要重新测试一遍,这导致了测试需要花非常多的时间来进行回归测试,这里产生了大量重复的工作,而这些重复的工作有些是可以自动完成的,这时候UITests就可以帮助解决这个问题了。