V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
cralison
V2EX  ›  iDev

开发流程告诉你,为什么是软件工程师而不是码农

  •  3
     
  •   cralison · 2015-01-24 06:55:11 +08:00 · 5056 次点击
    这是一个创建于 3621 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我们以一个APP成功上线,作为思考的起点,往前推,看看我们需要做些什么?

    1、一个99美元的开发者帐号
    嗯,如果不需要真机跑程序,这个可以是最后一步。当然早早买个开发帐号,好处会非常大,看到自己的程序在真机上跑,整个人都兴奋起来,就不用老喝鸡汤。

    2、一个App包
    当然,这才是真正难点。所以这里会有大量的细分步骤。

    1)异常控制
    在所有数据都没有问题之后,我们需要反复用各种奇葩操作来把应用搞崩溃,或者把数据搞乱,看看会有哪些异常。除此之外,在设计的过程中,也需要处理一下,现实中不大可能出现的,自己能想象出来的异常情况。

    2)联调数据
    在所有色差都调整过来之后,我们需要切换到线上环境(或称生产环境)进行真实数据联调。这一步主要的工作不在iOS端,而是推送数据的后端。iOS开发,主要是协助后端发现计算或算法或接口问题。

    3)适配色差
    在完成第一套界面之后,我们需要找不同型号的终端来检验屏幕适配和色差调整。一般的情况,会让设计师出全套分辨率的图标、大图,和给颜色的具体色值。如果做得彻底一点,可以根据不同的设备在代码上使用不同的色值。

    4)切图界面
    在实成性能调优之后,我们需要开始让App向“最后样子”靠拢。我们需要设计师给我们一套切图,包括图标、背景、启动页大图,甚至色值等。
    然后,我们开始做界面,把该加的Image都加上,把该有的动画效果都加上。在这个过程中,如果有些效果自己不熟悉,可以先做一版勉强可看的,在这个基础上再继续优化。要保证,至少能用得上,不至于太惨不忍睹。

    5)重用性能
    在所有视图都做完之后,我们可以从重用和性能的角度把代码重构一遍。当然最理想的状态就是动手之前先考虑好怎么重用怎么优化性能,只是一般很难做到。尤其是对于新手,几乎不可能做到。所以,先完成再调优,是一般人的一般原则。
    App开发上的重用,一般包括几大块:TableView和CollectionView上的单元格Cell重用,独立视图重用(这个在Storyboard上比较麻烦一点,在xib上比较方便一点),类的重用。
    重用的最大好处是方便改。因为重用后,在同一个地方的代码或设计,只需要改一个地方就可以在所有地方完成效果的修改,比较好维护。
    性能调优,也有几大块,一般关注得比较多的是内存和CPU执行的优化,这两块一般用专业工具来完成,比如专门看一下这个链接里的内容:# 19 调试
    比较容易忽略的是方法的“输入输出控制”。就是一个方法开始之前,传递进来的数据应该符合什么要求,方法结束之前,传递出去的数据应该符合什么要求。这个一般会被归为“测试驱动开发”,在写任何功能代码前,应该先设计好。事实上做起来或推广起来并不容易。多数人一般只会在功能完成后,加一步做检查。

    6)效果视图
    在所有功能实现之后,如果这个时候设计师也已经完成效果图,我们可以开始完成基本的视图开发。
    视图的开发,两大类:TableView和CollectionView。相对于简单的数据呈列,一般会通过TableView来完成。如果对分布排版有更多的要求,一般会通过CollectionView来完成。把这两个View吃透,可以完成多数的简单视图开发。
    如果APP有非常多的个性化奇效果的视图设计,那就没办法了,只能开个空的ViewController,自己一点点堆。这里,也会有两个层面。一、通过标准控件堆叠出效果。这样的性能可能会差一些。二、代码手写视图。个中苦逼,谁写谁知道。还有第三层次:代码“画”视图。
    做视图时,要尽量贴近设计效果,否则产品或测试会把达不到效果的地方报Bug,可能会收到一份长达5页纸的BugList。为什么不是百分百实现原设计,谁做过谁知道。

    7)存储请求
    在所有回调处理都正常之后,可以开始接入后端接口请求数据。请求主要有四类GET/POST 和同步/异步。请求过程中要特别注意所要求的协议和参数类型。
    因为不是所有情况下都能保证网络畅通,为了让用户在无网络的情况下,都能做一些基本的操作,我们需要缓存部分从服务器上请求过来的数据。
    如果缓存的东西比较少,可以用NSCoding。如果比较多,就需要CoreData或者其它可以增量存储的类库。
    缓存的操作最好开个线程异步处理。

    8)方法回调
    在基本的流程交互实现之后,我们往往需要考虑单向操作后的回调。比如单击一个按钮后,把数据传回上一个页面或刷新上一个页面等。
    回调有两大类,一个是Delegate,一个是Block。Delegate的好处在于方便统一管理。Block的好处在于实现方便。
    我现在基本上用Block。先在类里增加一个Block属性,属性特性注意用Copy。然后在需要用的地方创建Block对象,把Block变量赋给对应的对象属性。

    9)流程交互
    在数据容器都设计完之后,可以开始根据产品设计的APP操作流程实现模型的交互。比如对数组的查删增改。这里要尽量满足产品设计的流程,否则也会归入BugList。
    过程中需要注意打印Log观察数据容器的变化,看看变化是不是符合自己的交互预期。

    10)单例组典
    在对象属性设计完成之后,可以考虑模型里用到的数据通过什么数据容器来装载。
    常用的数据容器有单例、数组和字典。
    单例装载整个程序里都会用到的同一份数据。数组装载有顺序要求的数据。字典装载需要按值查找的数据。

    11)对象属性
    在功能模型统计完成之后,可以开始类的设计。类的设计,是一个面向对象的过程。
    所谓面向对象,就是把所有东西都抽象为一类属性和方法。
    比如一个APP的首页,需要显示最新热点和用户关注,那么我们就针对“首页”这个对象设计一个Home的类,这个类里有Hots和Collects两个属性,ShowHots和ShowCollects两个方法。

    12)功能模型
    上帝是我们的老板,所以,老板说要有首页,于是我们有了首页;老板说要有最新热点,于是我们有了最新热点;老板说要有用户关注,于是我们有了用户关注。
    这种上帝畅想的统计工作,一般由产品完成。当上帝非常“民主”,只说“要有APP”之后,就开着车带着秘书“躲猫猫”的话,后续畅想工作会交给产品来完成。等产品统计完了,她们会以“老板说”或“用户习惯”开头向我们讲述她们的伟大统计或设计。
    这是APP一切的开始,是混沌,是太初,是太守,是太太,是什么都行,就是一定得定啊,这里不定,上面的所有步骤都没法干了啊。定定定定定定,一定要定定定定定啊啊啊啊!!!!!

    完了吗?没完!

    就像苹果公司喜欢“One More Thing”一样,程序员的世界里,数字永远从“0”开始。于是一切结束之后,我们也需要一个:

    0)指南模块
    这才是软件工程师跟码农的真正区别。真正的软件工程师,他应该可以对外输出开发指南和成熟模块,大大提升开发界的开发效率。
    很多老手害怕技术开发这个日新月异的世界,害怕那些无限进取的同行,他们会选择闭帚自珍,然后就是闭门造车,然后就是闭目等死。
    凯文.凯利大法师告诉我们,所有科技的发展都必然会发生,不可避免,科技在人类创造出来之后,就已经不受人类控制,人类最终只能被科技奴役。我们可以选择在科技上加上自己的一脚,也可以选择被科技压断双腿拖着前行。就像《黑客帝国》里一样,红还是蓝,你自己选。

    完了吗?没完!

    粉丝群的一位朋友问我,在这个技术日新月异的世界里,已经累觉不爱了,怎么办?

    疯子答曰:何以解忧,唯有搞基!

    人,是群居动物。我们对同伙的需求,超出我们的想象。也许,没有任何同伙,我们也能过一辈子,然后孤独地死去。但是,只要尝过同伙的快乐,我相信少有人愿意重回孤独。就像酒一样。

    所以,让我们再来一个助于我们冲破天际的反作用力:

    -1)共研开源
    共同研究,开放源码,不在于我们可以从别人那里得到多少东西,而在于我们自己本身确实有实打实的输出需求。我不知道怎么解释这个需求,我只知道我确实有,我接触过的优秀伙伴们都有。而且,往往输出越多的人获得越多,超标输出的人赢得了全世界。
    如果一定要让我好好解释一下,或许我只能说:只有射了才快乐!

    完了吗?没完!

    为防一片赤血丹心遭折叠,保险起见,让我们回一下正题:)

    在看完整个开发注程之后,我们不难知道,作为开发的真正工作,从模型设计开始。这也是无数大牛说“开发就是数据结构设计”的原因。

    单从代码的层面来看开发工作,大体可以分以下两类四步:
    二进 位置(内存地址)、解释(数据类型)
    对象 属性(实例数据)、方法(数据操作)

    所以,其实,不管是从底往上做开发,还是从顶向下做开发,看点基础类型的书,都不会吃大亏,就算特别高大上地想一开始就上来开发APP,一层一层剥下去,最后还是免不了要做功能模型设计。

    不要想速成,不要急,因为急也没用。无根之萍,漂到哪都只是漂。

    我发现我说那么多,还是容易被打为“没用也”,怎么破。。。。
    我想到啦,我有终极大法:开发很简单,无非是多写代码多读书!!!少年,你缺的只是行动!!!
    唉,终极大法就是好使,么么哒:)
    9 条回复    2015-05-05 02:36:06 +08:00
    djh
        1
    djh  
       2015-01-24 08:35:03 +08:00 via Android
    好帖。
    Oucreate
        2
    Oucreate  
       2015-01-24 10:53:42 +08:00
    需要不断地“修改、调试”,本质原因是IT类需要边看书边实践,需要做出成品,就像工程师;而不像迷醉在数学里的科学家那样几乎纯理论研究。说的对吗?
    ciwonderful
        3
    ciwonderful  
       2015-01-24 11:18:22 +08:00
    赞 分享
    Biwood
        4
    Biwood  
       2015-01-24 12:26:14 +08:00 via Android
    写的很好,非常感谢
    zhangmeteor
        5
    zhangmeteor  
       2015-01-24 12:28:31 +08:00
    这不是一个正常工程师应该干的事情么
    shawngao
        6
    shawngao  
       2015-01-24 12:35:34 +08:00
    自己enjoy就行了,别的不重要
    wangtuyi
        7
    wangtuyi  
       2015-01-24 13:46:13 +08:00
    你这是自己独立开发都要自己做。如果一个成型的开发团队,这些东西都不用你去想,详细设计做好后,你可以真的只负责 coding,那些做对日外包的特别有感触,人家都做出伪代码了,就把 coding 留给你,重复而且没进步的工作,遂称之为农。
    anynices
        8
    anynices  
       2015-01-24 13:58:56 +08:00
    Praise
    Septembers
        9
    Septembers  
       2015-05-05 02:36:06 +08:00
    刚好100天 来挖个坟 顺便确认存活
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2592 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:32 · PVG 23:32 · LAX 07:32 · JFK 10:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.