说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

前Twitter iOS技术团队负责人:使用第三方库的四大准则

HTML文档下载 WORD文档下载 PDF文档下载
直接使用第三方库能够最大程度缩短开发时长,开发者很难抵挡着近在眼前的“短期红利”,但“魔法神奇库”也有可能阻碍程序排错。本文作者Ben Sandofsky曾领导Twitter iOS应用技术团队,他给出了挑选库时的几条原则。

CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面。如果您想投稿、参与内容翻译工作,或寻求近匠报道,请发送邮件至tangxy#csdn.net(请把#改成@)。 


如果今天能拿到50美元或1年后拿到100美元?你肯定选择前者;但五年后拿到50美元或6年后拿到100美元,你肯定选择后者。这真是不可思议,因为两种选择的时间差仍旧是1年而已。经济学家将这种现象称为双曲贴现(Hyperbolic Discounting),指在面临两种相似选择的情况下,人们往往倾向于更简洁及时的结果,暂且将其称之为“短期红利”吧。

在iOS App上加载第三方库曾是颇费周折的一件事,我们不禁停下脚步扪心自问:这一切真的值吗?后来CocoaPods(OS X 和 iOS 应用开发的第三方库管理工具)将加载过程缩减到秒,开发者就更难抵抗这近在眼前的“短期红利”了。


“短期红利”最吸引人之处在于省时,比如你的App需要一个REST API封装器,那么你是愿意用“魔法神奇库”只花1个小时搞定,还是花1天自食其力呢?

如果是创建原型,那么推荐使用现成的库。我让学生在初始阶段这么做,一来不想让繁琐的细节打击了他们的积极性,二来不想他们错过上交作业的最后期限。

但要开发一个数年屹立不倒的App就不是“一小时 vs 一天”的差别了,而是“100小时 vs 101小时”。这“魔法神奇库”适用于简单一致的API;而Production API牵扯到商业逻辑、边缘情况(edge case)和技术债务(technical debt)等等。产生式系统(production system)并不是十全十美的,“魔法神奇库”也可能阻碍程序排错。

此文无关库或CocoaPods本身,而是给你提个醒(见文章:“due diligence”)。一个团队吃饱了撑的才会花数周来寻找测试员测试代码;转而Google第三方库,选择搜索页面上第一条那个有10,000行代码的,也聪明不到哪儿去。

要知道库的成本并不是一劳永逸的。举个例子,苹果公司一向不怎么待见Core Data的“lock”方法,那要运行时下流行的Core Data封装器的最新版本怎么办?——可以先升级库,但填补5,774行代码空缺谈何容易?升级rename方法就意味着损害App。如果直接运行旧的Core Data,“lock”方法的顾虑也就不复存在了。

CocoaPods能解决依赖图(dependency graph)的问题,但应对不了API混乱(API churn)。如果你直接无视pod版本还能在半年后返回到原点(见文章:“return to the project after six months”),那真是个奇迹了。

总而言之,尽量别太依赖第三方库,能免则免。而且所幸你也用不了那么多。Cocoa网站背景引人注目,但它实际上是个一应俱全的框架,以创新方式提供动画、网络、持久化等App所需元素。

挑选一个库时,我秉持这几条原则。无法获得百分之百赞同是肯定的,但想反驳我,最好准备充分的理由。

1. 高级API避免使用abstraction。

iOS工程师在设计框架时,充分考虑了开发者自由发挥的“度”的问题。UIKit团队本来可以将UITableView进一步抽象,但他们知道要达到60FPS的速度,开发者必须考虑cell循环的问题。

总的来说,苹果公司为C语言提供低层API,为Objective-C提供高层API。如果需要一个简单的照片选择器,用UIImagePickerController,麻烦一点用AVFoundation。苹果公司也会犯错,比如iOS Keychain,还有复杂繁琐的Address Book API。前者已用封装器解决,后者已通过苹果的新Contacts.framework解决。

管理过程中,时不时出现的键盘会拖慢进程。重新布置所有Input View,把它们放在显而易见的位置。如果单纯把问题丢给库来解决,一旦遇到View Controller限制,那么abstraction就会漏洞百出,跟筛子似的。想想automaticallyAdjustsScrollViewInsets失败了多少次啊,它在UIKit里就是View Controller属性。

2. 别太把Boilerplate当一回事儿。

设定Core Data栈需要的20行代码,就好比巫师施法没有祭品一样让人匪夷所思。你可以使用一个Core Data封装器1行代码的Setup,但我的做法是直接复制粘贴样板文件。没错,复制粘贴而已。

初学编码时,别人就告诫你:“切忌重复”。但往往开发者非得浪费几百个小时为干巴巴的代码排错后,才突然明白原来自己一直在“重复”。

如果样板文件让你觉得天旋地转了,就将它重构进类方法吧。这也嫌麻烦的话,就创建一些模型对象(model object)。总而言是目标是迭代为领域模型(domain model)。苹果的框架只负80%的责是有原因的,剩下的20%得靠你了——因为毕竟是你自己的App。

3. 多多不一定益善。

在《代码大全(Code Complete)》一书中,Steve McConnell解释道:project的成本跟代码库规模并非线性扩展的关系。所以做小一点的project比较明智,这不足为奇。

AFNetworking这可能是最受欢迎的开源iOS库了,具有请求序列化、可达性监测以及安全保障等诸多特点。今年四月,研究者却发现了两个严重的安全漏洞,涉及2.1及以上版本用户,两个版本之间时间跨度长达一年。大多数App并不需要使用AFNetwork,为了降低安全风险肯定也不会用到“证书锁定(Certificate pinning)”。

4. 如果问题超出了熟知领域,推荐使用库。

千万不要走极端,自己不了解的东西出了问题,也是要承担责任的。为OAuth排错?还是省点力气吧,库虽然并非完美的解决方案,但它是更好的选择。曾经有人说:“要是库能解决问题,干嘛还费劲搞明白OAuth?”

iOS 5 Beta推出后,我的团队发现了苹果系统中OAuth库的漏洞。多文件上传(Multipart-upload)有问题,照片上传往往失败。那时候iOS 5 API是锁住的,而苹果看样子也没有及时修复问题的意思。所幸我们能善加利用OAuth,最终将苹果框架“糊弄了过去”,解决了问题。

没必要专门去了解OAuth,但是如果你的App用到了OAuth,那么了解至关重要。没有人会在乎是代码出了问题还是库出了问题。关键是——这是你的App,你难辞其咎。

(翻译/张新慧 审校/唐小引)

文章来源:Medium

作者简介:

Ben Sandofsky,iOS应用开发者,现任CodePath创业公司顾问;曾任HBO(美国付费有线和卫星联播网)的硅谷题材剧集《Silicon Valley》的技术顾问;曾领导Twitter iOS应用(iPhone、iPad和Mac)技术团队。


预告:  2015中国移动开发者大会(MDCC 2015)将于10月15-16日在北京新云南皇冠假日酒店召开。大会特设五大技术专场:平台与技术iOS、平台与技术Android、产品与设计、游戏开发、企业移动化、虚拟现实专场。此外,大会更是首次举办国内极具权威影响力的IoT技术峰会,特设硬件开发技术与嵌入式开发两大专场。大会将聚集国内最具实力的产品技术团队,与开发者一道进行最前沿的探讨与交流。 

第一时间掌握最新移动开发相关信息和技术,请关注mobilehub公众微信号(ID: mobilehub)。


知己知彼 企业应用移足云端必须清楚的10大方面 NVIDIA推Android掌机:七年孕育可否成就野心? 人民日报:2013关于新媒体的8个猜想 互联网大时代成就创新小企业 移动互联网创新论坛报道 Mobile Detect:判断移动设备类型的开源PHP类 我是如何Hack Facebook Employees Secure Files Transfer服务的 投资可再生能源:Google 2亿美元投资风力农场 构筑商业生态系统 阿里巴巴集团全面变革组织架构和管理体系 美国众多银行网站遭DDoS攻击 疑似伊朗所为 构建高可扩Web架构和分布式系统实战 CES2013 AMD发布移动处理器路线图和环绕计算概念 对话Linus Torvalds:大多黑客甚至连指针都未理解 PaaS玩家们,怎么演好自己的角色? Apple高管表态:低端机绝不是iPhone的未来 Web开发人员应该知道的IE 10兼容性问题 一周消息树:CES2013揭幕 科技巨头纷纷发力 2012专利排行榜 IBM位列第一、Google增长最快! 微软赞黑客并称Windows RT越狱非安全漏洞所致 周报第46期:GitHub历史上最糟糕宕机事故回放及反省 著名计算机黑客Aaron Swartz自杀身亡 移动周报:移动互联网行业技术趋势前瞻 旁门左道:让移动游戏下载量暴涨的邪门功夫 可植入身体:“可穿戴计算”时代来临 Web服务器份额:Apache仍居首,Nginx将超IIS 防税务欺诈:挪威财政部将开源收银机代码 响应式设计实战:3人+1.5个月 IE10优化版cnBeta诞生记 不听乔布斯劝告:“不专心”的Google照样干得好 躲过一劫!苹果不锁杂志类APP介绍截图 Oracle发布软件更新修复Java漏洞 设计师将吞噬工程师吗? 开源产品系列:小巧灵活的Web框架web.py 哪位大虾知道可以在哪里下载mpeg-1的codec,谁先告诉有效地址谁先得分!(不给分是小狗!) 可能很菜的问题,送分的问题!! 一个关于CDaoTableDefInfo的问题 ado的问题??求救!!!高分!!! 有关代码重用的问题,对Form的继承。 一个关于CString.Format的问题 学习编程时学图算法怎么学好? 一个很简单的CREATE TABLE语句为什么出错呢?向大家请教! jbuilder5运行需要最低配置 ,傻傻的问 Delphi6的盗版已经到了@_@ 喂,为什么我提问只能给最多37分,原先可比这要多的多 一个关于派生类的问题 关于页面关闭的问题 用new JTalbe(10, 20)创建了一个table,如何设置该table列(column)的宽度 请教一个关于用VC6开发outlook\exchange的问题。急!急! 时间服务器 请问一下,用DBM,如果用户注册的数量多了以后,程序的速度很一般的文本速度比较哪个快 纯数学问题:如何求模逆元? VB中实现进程间通信的方法?VB中的CallWindowProc的用法?VB中如何发送自定义的消息? 请问哪里能免费下载BCB5?下载多长时间没有关系,只要能够正确使用就可以了。 怎样得知CListCtrl中当前选项? 我想从WINME中自带的一个驱动程序提取出来在WIN97中安装,请问应如何做? 菜问题(2) 请教:为何数据库数据无法在网页上显示? CEditView 一定要override onChange function(ON_CONTROL_REFLECT(EN_CHANGE, OnChange))????;否则input 时不我待会错??? 请教:不通过页面,用VB如何得知来访者的IP? 如何将vcd转化为real的格式???????????急!!!!!!!!!!!!!! 对DMO播放内存MPEG2数据没有头绪,谁能给点提示? 支持bestbestbest!!!!!!!!!!!! 如何在win98下使用EJB? applet 可以打开到一个server的socket么 谁知道国内哪有下载jdk1.4,Thanks! 如何配置For Oracle8i 的ODBC? 请教如何动态改变窗口大小 弟兄们救命啊!!!rational rose中mdl的导出 Jbuilder5.rar的密码? 这条语句为何通不过?请指教! 各位大虾:一个WWW服务器,不通过页面,要得到访问者的IP怎么办? 劳改犯严正声明:支持3B、蝈蝈的正确领导,声讨"捣蛋杂碎"及"跳梁小丑".坚决维护水园的安定团结. 哪位高手能给我解释一下,关于Hook技术,谢谢 pcb板什么什么东东? 请问:malloc()函数的作用是什么? 关于TTS(vcmd.exe自动化服务器) to 斑竹 :::::::,为什么我提问给分怎么比以前少了许多 急急, 怎樣從在一個框架里放打印按鈕,但要打出來的是另外一個框架的東西? 我是一个初学者,要成为一名软件工程师,要学习哪些? ···基于水园各位GGJJDDMM的快乐着想,特别给大家一次浪漫的机会,以此缓解水园的紧张气氛··· 北京地区有ADSL了吗????? 新手向大家请教了关于jdk 请简单介绍一下developer 2000 哪里有JBuilder的参考书籍,哪位高手知道的说一声 在一个周长400米的圆形池塘周围植树,每隔4米栽一棵 ,一共可栽多少棵? 同学们在全长100米的小路一边植树,每隔5米栽一颗(两端都栽)一共需要多少树苗? 在一条马路一边从头到尾植树36棵,每相邻两棵树之间隔8米,这条马路有多长?快!算式?答案?有悬赏分! 在周长180米的池塘种树,每隔12米种一棵,要种几棵? 同学们在全长100米的小路一边植树,每隔5米栽一棵(两端要载).一共需要多少棵树苗? 在一条路的两旁共植树100课,每两棵树之间的间隔为3米,这条路至少长几米?小张家住11楼,他从一楼到五楼用了一百秒,他到家还需几秒?男子110米栏比赛共设10道栏,其中起跑线到第1道栏以 一个圆形的花坛,周长是120米,如果沿着花坛周围每隔5米种一棵杨树,每两棵杨树之间种一棵树,一共可种()棵树 同学们在全长100米的小路一边植树,每隔5米栽一棵(只栽一端).一共需要多少棵树苗 同学在街道两旁植树,两棵树之间的距离是5米,这条街道有多少米?如题!同学在街道两旁植树,两棵树之间的距离是5米,一共植了18棵,这条街道有多少米? 园林设计师傅打算在一个周长是150米的圆形花坛的周围每隔3米种一棵树,一共得准备多少棵树苗? 全长100米的小路植树,每隔5米栽一棵,两端要栽,一共要多少棵树苗 在一条长100米的公路两侧,从头到尾每隔2米栽一棵树,按3棵杨树、1棵柳树的规律栽.杨树、柳树各占植树总棵树的几分之几? 一花坛周长60米,每5米种一棵树,共种几棵树 同学们在全长100米的小路一边植树,每隔5米栽一棵(两端要栽).一共需要多少棵树苗?方法怎么写. 一条长2000米的公路两旁每隔10米种一棵杨树,每两颗杨树之间等距离种3颗枫树.这 一个周长是78.5的圆形花坛,每隔两米种一棵树,最多种多少树?再说一下39.25是肯定不对的!40也不对!最好是整数。 李红在乘长途汽车旅行时,注意观察平直公路旁边的里程碑,并把对应的时刻记录了下来,数据如下表:里程李红在乘长途汽车旅行时,注意观察平直公路旁边的里程碑,并把对应的时刻记录了下 一条102米长的公路两侧种树,从起点到终点共种树36棵,如果两棵树之间的距离相等,相邻两棵树之间有多少米今天一定要答案 一个圆形的花坛周长是20米,如果每隔5米种一棵树,那么一共可以种多少棵树? 某同学在乘长途汽车旅行时,注意观察公路旁的里程碑,并把观察的结果记录在下面表格中.表格如下:观察次数:1 2 3 4 5里程碑示数:10km 20km 30km 40km 50km观察时间:6:30 6:45 7:05 7:25 7:421、在6时30 一条长180米的公路两侧各栽了一行杨树,起点和终点都栽,共栽了20棵.如果相邻两棵树之间的距离相等,相邻两棵树之间的距离是多少? 一个圆形草地它的周长是480米沿着它的周长每隔六米种一棵树在在两棵树之间发两盆花一共放多少盆花 一同学在乘长途客车旅行时,注意到平直公路旁的里程碑,并把对应时间记录下来,数据如下表所示,回答问题┌——————┬—————┬—————┬—————┬—————┬————— 一条路长25米,少先队员在路的两旁植树,起点和终点都栽,一共栽了12棵树,每两棵树之间相隔多少米?要求:快,说出列式和每一步求的是什么. 在圆形的水池边,每隔3米种一颗树,共种树60棵,这个水池的周长是多少米? 某同学在乘长途汽车旅行时,注意观察公路旁的里程碑,并把观察的结果记录在下表中;里程碑数 10km 20km 30km 40 km 50 km 观察时刻 6:30 6:45 7:00 7:20 7:39 (1)汽车在总时间内的平均速度是多少?(2 在一条长120米的公路两侧分别种柳树和杨树【两端没种】柳树每隔3米种一颗,杨树每隔5米种一颗,在这条路的两侧有多少颗数相对 一个圆形水池的周长是12.56米,它的占地面积是多少平方米? 植树队在路的两旁种树,路的两端都种子树,一共种了300棵,树与树之间的间隔是5米,这条路长多少米? 一条公路一边栽了68棵每两棵杨树中间栽1棵柳树那么共栽了( )棵树 一个圆形水池的周长是62.8米,这个水池占地面积是多少平方米? 农民伯伯在公路两旁种树,树与树之间的距离是3.8米.已知两边共栽了300棵树.这条公路长多少千米?(公路的两端都要种树.)快,我现在就要,答得好我额外给 在一条长12千米的公路旁一共栽了600棵杨树,240棵柳树,平均每千米栽多少棵树? 一个圆形水池的周长是25.12米,这个水池占地面积是多少平方米? 农民伯伯在公路两旁种树,树与树之间的距离是3.8米.已知两边共栽了300棵树.这条公路长多少千米?(公路的两端都要种树.我现在就要,答得好我额外给 公路长1500米,20米植一棵柳树(两端都种),在柳树之间每隔20米植一棵杨树.植柳树,杨树个多少棵?算式是什么,在柳树之间注意了,之间,每隔20米植一棵杨树 一个圆形水池的周长是31.4米.现将这个圆形水池的直径扩大3分之2后,水池的面积比原来多多少平方米 一条长skm的公路两侧每隔acm就植一棵树,这条公路的两侧共植树多少 一条路,左边每隔5米种一棵杨树,右边每隔6米种一棵柳树,两端种着树,有5处杨和柳是相对的,路长()米.要算式 挖一个周长是56.52米的圆形水池,这个水池的占地面积是多少平方米 公路两旁种树,每隔5米种一次,则少21棵,每隔5.5米种一棵,则少1棵,求树苗数和急用!答案为199棵树 在一条长645米的小路两边植树,每隔3米植树一棵.如果从两端植起,那么一共要植树多少棵? 在圆形的水池边,每隔3米种一棵树,共种树60棵,这个水池的周长是多少米? 今年植树节,同学们沿一段公路植树,每隔5米种1棵,则少21棵,每隔5.5米种1棵,则少1棵,求树苗棵数及公路长度 (用方程) 在道路两旁种树,每隔3米种一棵,到头还多3棵在道路两旁种树(两头都种),每隔3米种一棵,到头还多3棵;每隔2.5米种一棵,到头还缺77棵.这条路有多长?共有多少棵树? 两棵大树中间有一棵小树 一边有太阳 一边下雨 题目该怎么起 在一个周长是400米的正方形水池边种树,每隔10米种一棵,共需种 几棵树,每边种了 在一条100米的小路旁植树101棵,不管怎么植,总有两棵树的距离不超过1米,为什么? 两棵大树之间相距250米,园林部门计划在两棵大树中间补栽小树,使每两棵小树之间的距离是10米.一共要补栽多少棵树 一条路长100米,在路的一边从头到尾每隔10米栽一棵树,一共要栽多少棵树 给一条路上植树,两棵树之间的距离和植树的棵树不成比例对吗? 两棵大树之间相距250米,园林部门计划在两棵大树中间补栽小树,使每两棵小树之间的距离是米,一共要补栽多少 在一条长100米的通路两侧,从头到尾每隔2米在一棵树,按2棵杨树,一颗柳树的规律栽植.杨树,柳树各占植树总棵要算式 我们在一条100米长的道路一侧种了52棵树,那一定有两棵树他们之间的距离不超过2米急 两棵大树之间相距160米,园林部门计划在两棵大树中间均匀地补栽39棵小树,每两棵小树相距多少米? 在一条长100米的路两侧,从头到尾每隔2米栽一棵树,按2棵杨树,1棵柳树的规律栽植,杨树,柳树各占植树总棵树的几分之几 在一条长100米的小路一旁植树101棵,不管怎么种,总有两棵树的距离不超过1米,为什么 两棵大树之间相距180米,园林部门计划在两棵大树中间栽44棵小树每两棵小树的间隔距 在一条长100米的甬路的两侧,从头到尾每隔2米栽一棵树,按2棵杨树,1棵柳树的规律栽.杨树,柳树各占植树总棵的几分之几? 在一条长100米的小路一旁种101棵树,证明不管咋么种,总有两棵的距离不过1米
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn