项目总结 转载 (壹)

第一个正式的universal项目差不多快要结束,总结一下,分享给大家。因为可能我的比较具有代表性,如何从压根不懂开始做起,甚至没有面向对象的语言经验。(分享的另外一个目的也是希望大家提提建议,毕竟只有互相交流中才能更快成长)
-----------------------------------------------
做项目前:
  1. 零面向对象实际项目经验,更不用说透彻理解design pattern
  2. 零iOS实际项目经验
  3. 只懂一点点的C和汇编代码,其它如java、ruby、php、HTML5一点不沾边,可以说是不属于互联网的业余玩家


项目的情况:
  1. 做项目过程中,客户需求变化极其频繁和巨大,对代码结构的robust是一大挑战。虽然本人特别讨厌需求变动,但是在外,身不由己
  2. Universal项目,即是iPhone + iPad 的一个项目
  3. 基本上这个项目涉及到了iOS的方方面面,麻雀虽小,但是五脏俱全


关于程序结构设计
尝试用面向对象的方式去设计结构,但设计的时候流于形式,根据现有的一些best practice依葫芦画瓢,但实际上只有实践了才知道,比如:
1. 属性: 什么时候用和为什么用属性、如何保持属性私有、self.的使用,属性的内存释放;
2. 成员变量和属性的区别
3. 方法:什么时候用类方法和对象方法
4. 好的设计真的是“增之一分则太长,减之一分则太短”;好的设计关系到以后重构的方便性
5. 解耦设计:对象之间如何通讯,如何传值,如何回传,如何用好notification、delegate、KVO;如何保持对象的纯洁(不受玷污)
6. MVC中的M和C分离,一直觉得自己做的项目是小项目,而且一直认为过于注重结构,会增加代码量,但是实际上项目不分大小,好的设计:
  • 能随时应对客户的需求变化
  • 能自己看得懂自己写的代码(改的多了,都看不懂自己的代码了,这是最悲催)
  • 回归测试,一旦客户需求改变,乱糟糟的代码更加乱,这样回归基本上是需要全部。好的设计可以把客户需求改变带来的回归测试降低到最低

如何面对复杂和未知
这个其实也是程序结构设计的问题,不过我单独拿出来。在做项目过程中,到处都是复杂、未知,有时特别打击自信心也造成压力巨大,比如到底用什么zip开源框架,这个类应该怎么设计等等。几点体会:
  1. stackoverflow去找未知,一定有。不要急着在上面提问,因为99.99%的问题都已经在上面有答案了
  2. 常用逆向思考,比如不是问怎样才能把这个功能设计的更简洁而是问到底这个复杂在哪里? 
  3. 不要纠结于问题,要把重点关注在结构上,因为就如刚才说的,99.99%的问题都已经有答案,但是结构设计的问题基本上人家很难帮忙搞定的
  4. 要对自己绝对有信心,这不是阿Q精神,因为刚才说了99.99%的问题都有答案


关于面向对象设计
之前从没有面向对象设计的经验,所以第一次从这种角度去解决问题, 这是项目做下来体会最深的,也是最受伤的地方。好的代码应该是易维护、易修改,怎么改自己也看得懂。几个自己的经验总结。“实践出真理”,无论你平时看多少书,如果没有实践过,真的是无法体会面向对象设计的:
  1. programming的核心,就是“找对象”,一切以对象为出发点
  2. 拥抱变化,之前在淘宝做产品经理,经常能听到工程师抱怨需求变化,但是我想优秀的程序员必须有拥抱变化的勇气、能力和前瞻。
  3. 尽可能按照现实世界建模(符合客观存在的逻辑)。更“自然”的对复杂事物进行建模。所谓“自然”,不仅仅体现在产品用户体验上,更是一种思维方式
  4. 不要挑战自己的记忆力:尽量把类中的数据成员规模控制的小些(6个以下),如果不行,则尽量划分
  5. 所谓面向对象,就是根据现实世界中客观存在的事物(即对象)出发来构造软件系统
  6. 只有真正从面向对象去设计,几个月甚至几年后,你才能复盘你的代码。以前一直觉得代码复盘如同围棋复盘绝对是天才才有的本领,现在才明白,其实关键是:你要清楚的知道你的代码用在了哪里,为什么用
  7. 从面向对象出发,不要觉得一个功能很简单一个方法就搞定,尽量用面向对象去考虑。这是做项目过程中犯的最大的错误   
  8. 从关注 问题和解决方法 转移到关注架构 这其实也是面向对象与面向过程的最大区别,也是做项目过程中经常犯的错误


关于ARC
我是项目做了1个月后,才决定把项目从MRC转到ARC,现在回头看看,当初真实明智,因为在第一个月,内存管理上的问题和处理让我很头疼也很花时间。关于ARC
  1. 没有想象中的会比MRC性能差,ARC不是JAVA的垃圾回收,性能其实与MRC基本一致 (ARC是编译器提供的机制,而不是GC这种运行时提供的机制,这是根本区别。)
  2. ARC中没有明确的release操作,这时更需要注意内存管理,比如在一个Controller中使用Gyro sensor的时候,这种操作是绝对不能赋值给局部变量的:[[CMMotionManager alloc]init]
  3. 虽然ARC似乎能为你做很多事,但是有些事情自己解决还是自己解决,比如当不需要用Gyro sensor时,_motionManager = nil(此时如果不设置,则startDeviceMotionUpdatesToQueue中的更新会一直进行);
  4. 总之,对于ARC,难得糊涂中要“时刻保持觉醒”


关于Perfomrance设计
Coding真的是一点都来不得马虎,以前一直觉得iOS性能强大,无须担心性能,但是项目做下来,一大痛苦之处就是性能不够:
  1. 应用程序、UIViewController和UIView的生命周期的认识如果不十分清楚,就很容易造成性能瓶颈
  2. 大量的UIView插入移除操作会导致性能问题
  3. UITableView和UIScrollView导致滑动不顺畅的best practice


关于知识点
成为一名优秀Programmer需要丰富的经验和知识面,但是知识永远是学习不完的,所以要抓核心和基本,做正确的事情比把事情做好更重要,个人觉得以下几个知识点是iOS开发必须的。至于有些比如CoreText、CoreImage等,其实等到需要用时再去学习也来得及。个人觉得着眼于花式写法和各种技巧是没有必要的,基础才是最重要的。另外, 不混小网站,不看乱七八糟事例,推荐stackoverflow。 devdiv.com很不错,因为里面有很多大牛的及时回复。
  1. 内存管理,MRC和ARC
  2. 多线程,iOS下有多种多线程实现方式,什么都应该了解一下,但是除了dispatch需要精通,其它只需要看懂 (dispatch效率最高,使用最方便)
  3. 数据库,无论是Core Data,FMDB还是基本的Sqlite,万事不离其中,掌握Sqlite和SQL基本语法是必须的
  4. UIViewController、UITableViewController 和应用程序的生命周期
  5. 看似简单但是很有深度的View之间的转场处理,因为涉及到大量生命周期,如presentModalViewController, presentViewController, pushViewController, addSubview, removeFromSuperview, self.view
  6. 网络处理相关的,如何请求JSON数据,如何HTTP GET和POST
  7. 旋转处理,特别是iOS4、iOS5、iOS6的不同处理
  8. Debug的能力
  9. 基本的设计模式:MVC、delegate、notification、target-action
  10. 面向对象的核心思想,例如:不要以用户无法使用或不感兴趣的东西扰乱类的公有接口、类之间应该零耦合、把不相关的信息放在另一个类中
  11. 要不复杂问题简单化,尽量简单,虽然这是一句空话,但是也是一直的目标,因为Less code less bug

不重复造轮子
这个也不例外,iOS下的开源framework都太多了,基本上你需要的都能在Github或者Stackoverflow上找得到,所以平时:
不要做井底之蛙,平时多了解开源的框架
框架适合就行,就像争论AFNetwork和ASIHttpNetwork更棒没有意义的。写程序的有两类人,一类人追求技术极致,一类人技术只是实现产品的一种手段,我就是后面这个


关于开源框架的学习
这世界好的开源框架太多了,给我10年都看不完,所以需要选择,就像读书不在于都多,而在于读精,个人推荐如下。
  1. Three20 (其实我是不推荐的,因为它过时了,但是因为淘宝客户端用到)
  2. AFNetwork
  3. MBProgressHUD
  4. SDWebImage

关于Continuous Improvement
Six sigma中提到了持续改进,我们的能力提高也是这样。通过读好的开源框架是最好的进步方式。如何读开源框架,我们读开源框架的目的:
  1. 其中的花式写法我们只是了解,不是我们的目的
  2. 了解作者写框架的思路
  3. 对比自己现有的,求改进
关于20%的时间和总结
2-8 法则似乎哪里都适用。Google的20%时间中创造了半数以上的Google重要新产品;沃尔玛的20%的主力消费产品创造80%的销售额。项目做下来,真心体会到这个重要性。无论工作多忙,一定要给自己抽出20%的时间用于学习,我一般把这20%的时间用于学习:
  1. 到处看看,新的不错的framework,业内新闻
  2. 自己的总结。还是那句,不要挑战你的记忆力,适时总结比什么都重要

关于设计模式
做项目前,把GOF的23种设计模式都看了一遍,项目做下了,体会到:
  1. 单看设计模式的书,纯粹是无用
  2. 设计模式的核心在于平时的有意无意的使用,因为它本身来源于实际
  3. 能熟背23种设计模式固然是件好事,但是不能也不见得是坏事(反正我是记不住的)。有太多人讲设计模式了,也太多人扭曲这个玩意了,所以个人觉得不要去看设计模式的文章和书,要么或者真正的“读几本好书”。iOS开发对设计模式其实真没太多要求,就我现在做下来只用到:工厂模式、MVC、delegate、通知、KVO。觉得把这些弄明白了就够了

欲速则不达
代码之间往往只查一两个字符,但性能和结局多半千差万别,因为项目紧,压力大,又是第一个项目,所以写代码的时候,追求:"meet requirement,先满足功能,再考虑代码结构",但是实际:
  1. 需求无论大小,代码结构设计是必须的而且是第一位的,因为这关系到未来的改动,未来自己能否看懂;
  2. 欲速则不达,真是一个真理
关于Best Practice的重要
iOS已经很成熟了,基本上,所有问题都能找到答案,所有的需求都有现成的framework,或者只需要稍许改改。但是也正因为“万能的internet”,所以很多答案或者很多framework都是有问题的,所以适时总结很重要:
  1. 把常用的代码或者容易错的代码写到Xcode的snippet中
  2. 要有自己的library,不是自己摆酷,而是知识需要积累,有些开发中经常会遇到的
  3. 用好的framework。不流行的框架要注意是否用了私有方法(苹果 will reject it)
  4. best practice,比如如何自定义TableCell,如何自定义Navigation bar
  5. 不玩花的,不玩偏门的,写代码就是规规矩矩,一切按照苹果的best practice写
  6. 面向对象的思想有很多概要,平时要时刻提醒自己

关于HTML5
iOS原生与HTML5 WEB APP天生就是一对敌人,做HTML5的可以不懂iOS开发,但是做iOS开发必须懂点HTML5:
  1. iOS应用中一些“高度变化”或“性能要求不高”或“上线紧迫”的地方会用到UIWebView
  2. iOS原生与UIWebView的之间交互其实也可以很棒,甚至JSP交互
  3. HTML5是“可能”的未来,世界都在谈论
  4. HTML5看似只有一个知识点,但是其实要求比iOS原生开都高:一个典型的移动HTML5页面 = JSP + HTML + CSS + JQuery + backbone.js。或者学习PhoneGap也是不错的注意。
关于程序员的几个谎话(从SegmentFault.com摘录),我觉得写的非常好,也是一直犯错的地方
  1. 我以后再给代码加注释。
  2. 这只是临时的办法,发布版本中我当然不会这样写。
  3. 已经开发完了。只剩下几个小问题需要处理。
  4. 这很简单,我几天就能完成。
  5. 开发:这需要10天。 老板:5天能完成吗?开发:可以!
  6. TODO
  7. 在我机器上是好的…
  8. 这不需要测试,肯定是好的!
  9. 以前就有这个问题。
  10. 只需要改一行代码,不会影响其它程序的。
  11. 这是硬件问题,跟软件没关系。

关于未来:
如何让自己在最短的时间内成为优秀,这是每天都在思考的,因为对比别人_大学+工作下来的多年工作经验,我是不惧任何优势的,但是既然入行,就必须做优秀。所以选择值得做的事尤其重要:
  1. 看书没用,实践和Coding是提高能力的唯一途径;
  2. 做实际项目比自己玩玩靠谱十万倍
  3. 压力下工作成长更快,所以不断挑战自己,人的潜力是无限的
  4. 番茄工作法则比较适合我(每次集中做半个小时)
  5. 现在只是会用框架,未来希望能自己写框架,我想这是普通与优秀的最大区别
  6. 提高建模能力,而不是解决单一问题的能力,也即所谓架构和框架设计
  7. 尽量不看中文资料:一则是想提高英文能力,二则中文的翻译、表达来说经常不如英文准确
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值