• 1. Unit Test

    一直觉得Dropbox同步的自动测试复杂到几乎不能. 然后看见 Jesse Grosjean  (成名于WriteRoom, TaskPaper, PlainText)的DropboxSync库里居然用GHUnit (Gabriel Handford)搭起了几十个测试用例. 心里就想, 等FW的同步功能写的差不多时, 待我来过一遍他的单元测试.

    GHUnit这里最有用的就是GHAsyncTest, 异步测试. 而FW里同步代码基本上都用block做回调. 于是, 测试代码就可以写的很集中, 比如, 删除一个文件可以这样测试:

    [self prepare];

    [[NSFileManager defaultManager] removeItemAtPath: local_path] error:NULL];

        [dbSaver_.changeSet deleteFile: dropbox_path];

    [dbSaver_ syncWithDropboxSuccess:^{

                [self notify: kGHUnitWaitStatusSuccess];

    } fail:^(NSError *error) {

                [self notify: kGHUnitWaitStatusFailure];

            }];

    [self longWait];

    // then verify local folder is synced as expected

    2. 冲突

    其实Dropbox同步的问题不在于单单上传/下载一个文件那么简单. 麻烦全在各种冲突情况发生时. FW所面临的同步问题, 实际上和一个完整的Dropbox客户端面临的是一样的. 复杂的就需要画格子来一一处理了:

    对于一个文件, server端可能的变化有:

       new, modify, delete (rename = new + delete);

    client端的变化有:

       new, modify, rename, delete (new, modify, rename可以累积). 

    这就是一个 3 X 4 的大表格, 剔除不可能的组合(比如server_new 和 client_delete, 还有其他几个), 剩下的就是所有冲突的情况了. 一一处理.

    3. 同步中的修改

    我并不希望正在同步时用户来打搅, 但这是一个不能回避的问题.

       借口: 用户用的iPad, 大多数都是WIFI上网, 同步时禁掉UI耽搁不了几秒.

       反驳: 这个WIFI是在LAN上吗? WIFI over GPRS/3G怎么办. 开着VPN怎么办.

    于是, 可以列个同步时用户"手贱"一下的可能了: 

       client发起的同步: delete, modify, rename

       用户可能的动作: new, rename, delete

    这又是一个 3 X 3 的表格. 这里的每一项都是可能的, 需要按照最大限度保护数据的原则来完成 - 比如, 发起上传后, 用户的删除, 只应删除本地副本.

    4. 实测

    这种列表格的方式, 最大的好处就是跳出巨大 if .. then .. else嵌套的混乱. 于是和测试框架本身斗争过后, 冲突检测的用例都一次通过. 这就是对这种方式最好的奖励.

    5. NIH - 重新发明轮子?

    为啥不直接用DropboxSync?

    1. DropboxSync是基于DropboxSDK 1.0写的, 没有1.2里的 delta (差量)对比

    2. Sync代码很庞大+混乱

    3. 没有通知UI动作的那一层

    4. 其上的PlainText还有些神秘的同步bug - Jesse本人也比较挠头

    ------------

    Setup时, 每次都要把Dropbox端的目录重建一次, 然后再从client端上传一个初始目录结构作为基准, 每个测试都得几十秒到一分钟. 中午在下WWDC 2011的视频, 于是带宽就吃紧; 看着 Xcode log里的时不时冒出的 -1001 (超时错误), FW在吃力的同步, 心里便有些不忍啊 ...

    分类: Work
  • 2012-04-26He

    "Alfred isn't created by a big company, he was created by me and my wife so

    that we could do what we love - create great Mac software. The Powerpack is

    intended to help me fund development of Alfred so I hope and trust that

    users respect the license policy.

    Cheers,

    Andrew"

    from here

    分类: Work
  • 2012-04-10Lean Life - [Life]

    《Ignore Everybody》中提到要警惕那些华丽的绊脚石 - 比如, 一个新iMac/MacBook Air. 举的例子就是, 多数二流导演, 喜欢用Mac做出二流影片; 因为他的焦点已经偏离到剪辑的设备而非影片本身了. 

    史蒂芬.金在里谈他赚到钱后, 就觉着得搞一个配得上他名头的桌子来写作, 当真的坐在那个巨型桌子前, 却憋不出一个字來; 就又回到他的小课桌, 窝在那里思如泉涌去了.

    《Born to Run》里提到, 当马拉松运动早期, 八十年代, "波士顿马拉松俱乐部里能在二小时十二分内跑完一场马拉松的选手能数出半打", 而到了2000年奥运会时, 美国只有一人勉强进入决赛(2:15), 以第六十九名收场. "真正的问题不是别人为什么这么变快, 而是我们为什么变慢了. 事实上, 自从金钱渗入赛事, 美国长距离赛跑就一路江河日下."

    JK罗琳说, 当无论从哪种社会标准来衡量"我都是一个失败者"时, 自己还有一个打字机和一个宏大的梦想.

    Charles Petzold说他要去度假, 就带个命令行编译器, 一个文本编辑器. 没有GUI, 只有自己和代码.

    -----
    写这段话时, WriteRoom试用期结束了, 正在犹豫要不要购买一套($9.99). 想了想, 还是Emacs吧.

     

    分类: Life
  • 2012-02-22只有 - [Life]

    「回想起我们二十四、五岁的时候,刚走进动画这一行,既没有职业生涯的保障,也不知道希望在哪里,没有钱,甚至也没有才能」 - 宫崎骏,「出发点」,p135.

    分类: Life
  • InstaPaper的作者曾在quora上回答关于商业模式的问题:"我卖软件,花的比赚的少"。

    -----

    在InstaPaper的设置页面里有一大页致谢,里面有很多知名的苹果开发者 (e.g. brent simmons)。最后面是对用户的:

    And to you, all of my customers:

    Your support has given me my dream job, supporting my family by doing what I love.

    (致我所有的用户: 你们的支持给了我梦想的工作: 做我喜爱的工作还能养家糊口,谢谢你们)

    -----

    Net news ware的作者,也即上文中的Brent是很多indie开发者的偶像,曾经说,什么奖项,测评和一句用户夸赞的话比起来都微不足道。

    -----

    Touchworthy这本书里有很多访谈,都是干货。Facebook app的作者Joe说,写图片浏览器为了和苹果本地的照片浏览器媲美,费了很大功夫: “苹果的那个图片放到最大后,会超出一点点,再反弹回来。” Joe说,”我喜欢必须走的这最后一公里的挑战,很值得,这就是乐趣所在。”

    这最后一公里在InstaPaper里有很多体现。比如,如何从其他应用分享链接到InstaPaper。虽然大多数应用都可以通过InstaPaper的API来将链接发送到InstaPaper的服务器,但是对于冥顽不化的其它应用呢 (比如,网易阅读,Flipboard)?

    1) 你可以复制链接,然后切换到InstaPaper,它会侦测剪贴板,如果是链接,就会提示要不要添加这个网页。

    2) 邮件,InstaPaper设置里有一项邮件设置,可以根据你的InstaPaper帐户在服务器上自动生成一个邮件地址,此地址也自动添加为本地联系人 (InstaPaper - Read Later),这样将一个链接通过邮件发送至该联系人后,服务器端就会添加这个链接。

    -----

    「旅行的艺术」里阿兰德波顿提到某个火车站的穹顶上的金属梁上居然铸造上了一排小花,来去匆匆的旅行者们不经意间仰望时,不禁会心的微笑,设计师当初倾注的心血此时就转化为对忙碌的人们心灵的慰籍了。

    -----

    "去TED的最大收获就是发现我所尊敬的人都是"农夫". 这些医生, DNA研究者, 舞蹈家, 巧克力师傅, 海底摄影师, 宇宙学家, 投资人有一个共同点: 都是nerds. 他们为所钟爱的东西执着的工作. 你和他们谈话怎能不谈及他们的热情."

     

    分类: Life
  • 2012-01-25正交性 - [Work]

    id的规模现在比原来Quake III时大了很多倍了, 卡神访谈时就经常谈到些设计/管理的问题了, 看到的有这两个: 正交性, 静态分析.

    1. 正交性可以这样形象的来理解: 将类的一部分责任分离出去, 类图上就看见支出去了另外一个类. 另一点就是分离出去的类有了自己独立的继承层次. 例如: Cocoa中存在的众多delegate, 就是将policy和mechanism"正交", delegate定义了policy, 而delegate依附对象则定义了mechanism.

    2. 如果反过来从对象的行为去看, 接口应当是干净, 没有副作用的 (Cocoa有一个API review team来保证接口的纯洁). 

    3. 从使用者的角度, 正交性应当意味着, 定义良好的类, 在组合起来使用时, 其行为应当是可以理解/解释的: 比如, UITextView 内嵌在 UIScrollView里时, 由于UITextView本身就是一个UIScrollView的子类, 两个可滚动的View套在一起, 依然可以按照content view, content size, content offset以及事件来理解. 

    如果发现这两个东西陷入了麻烦, 就是事件相应和delegate配置的问题 - 充分信任cocoa, 充分信任xcode.

    分类: Work
  • 有个故事,是讲某岛上的土著看到殖民者在跑道两侧点起火堆,一会儿飞机就从天而降。于是看了很多次后,就得出了火堆引来飞机的结论。

    Csdn上看到有人说芬兰路边到处都有小心撞到驯鹿的提示。大家就说看人家老毛子多环保啊。楼主后来说: 与环保无关,驯鹿体形硕大,很容易造成车毁鹿亡的严重后果。

    外甥女说,熊猫粪是清香的,因为它只吃竹子。我说,牛也只吃青草,牛粪为啥不是清香的呢?

    PhotoNoter刚写出来时,我很有信心: 实时缩放的绘制,全矢量的保存,全程撤销重做,手写板自动步进,连续书写的精确提示,iPhone 3g上也可流畅书写,甚至文件系统满了也可以正常工作。

    销量却很差,我很久后才勉强面对这个问题,开始总结: 开发周期太长 (和小贝同岁),目标用户不明确,界面上私有的相簿和iPhone 本地相簿两套容易混淆,feature有些膨胀 (比如相框的关闭,背景图案的打开)....

    问题是,这个总结对吗?它也许就是个黑天鹅的情况呢。

    圣诞节开始,我决定试验一下,.99$降为免费,开始冲榜,在香港,台湾和日本的摄影类免费榜都进前十了,由于iTunes connect圣诞期间不再调整排名,于是可以赖在榜上很久。这样就有了很多评价,用户告诉我,连续书写会有点适应难度,保存太麻烦,为啥不支持全分辨率?

    夸的骂的都有,但这样才能凸显问题所在(和感情一样,最怕的就是漠视了。)

    这样圣诞期间13万套,这说明还是很有潜力的. 改为收费后,销量又迅速回落至个位数,这说明我还是没有找到有效的转化方法。

    还有就是,万一这只是你糊弄了苹果的排名机制,在圣诞交了狗屎运呢?

    我决定再试一次,上周五到周六免费冲榜。这下没有节日因素,看看能有啥表现。周五一万套,周六两万套,疯了。AppAdvice居然给我来了封信说阁下的photonoter在我们的限免推荐里了。改为收费,用户迅速降为10+#。

    这说明有潜力?毕竟在一堆免费应用里探出头也是很困难的嘛。

    故伎重演,这周再试一次: 周五1000+,周六还没有数据,但明显势头不行。

    这一切又说明什么?

    现实很复杂,从这个结果似乎很难寻觅到某些决定性的因素了。急于得出一个结论,往往会被后面的事实推翻。不断调整才是关键。

    老乔当初推出.99$的低价策略时,就是在培育一个巨大的付费用户群,而这些用户就充当着达尔文式的自然选择之手,让优秀的应用能够进化出来,这个过程很残酷,你可以了解,但不会吃透。

     

    分类: Work
  • 2012-01-01禅, 出世与入世 - [Life]

    禅, 出世与入世

    读过3个版本的道德经, 一个简注版, 王蒙的"老子的帮助", 以及蔡志忠的漫画道家思想. (王蒙的那本很垃圾.)

    老子当年看周朝没落, 担心被炒鱿鱼, 就主动辞职出函谷关, 一个小官阻拦之, 说你满腹经纶, 要不写点东西就这么遁了, 岂不可惜. 老子执拗不过, 就写下了"道德经". 然后遁去, 从此不知活了几百岁, 再也没有写过作业.

    一直以来困惑于这样一个问题: 作为一个周朝没落的图书管理员, 怎么能有如此深邃的思想?

    隐含的意思是, 过了几千年, 我手里拿着iPhone看老外的入门哲学书"禅与摩托车修理的艺术"时, 觉得并不比老子的说法先进哪怕一小步, 而且并不全面.

    "禅的初心"是铃木峻隆写的一本给老美的启蒙书. 里面讲修禅时, 能像一只青蛙那样心无旁骛的蹲在荷叶上, 该捕虫时捕虫, 该唱歌时唱歌, 就很好了. 他的弟子早乙弘文指导过年轻的乔布斯, 劝他不要离开苹果专业修禅 - 因为开公司也就是在修禅.

    -----

    最近有点明白了, 禅了, 道了, 哲学了的问题在于没有上下文. 

    都听过三个秀才赶考时, 去问算命的结果怎么样, 算命的先生就竖起一根指头, 什么话也没说. 结果大家都说准: 一个没考上, 一个考上了,一起考上了, 一起没考上, 随你解释.

    事后, 可以拿这套东西往上套. 但是事前, 谁又能说哲学能告诉我此时该"破釜沉舟"还是该"走为上计"?

    所以, 当一个修禅的从历史的故纸堆里, 类比归纳出一个道理, 并把它组织的朗朗上口时, 他的真切体验会有多少呢? 

    所以, 当一个老师说上善若水. 也许很贴切, 但是他当年也许指着冰激凌对弟子们说, 大善就像水一样, 放进冰箱就结成冰块, 夏天吃来真凉爽. 

    -----

    那么, 这堆东西的意义在哪里呢? 

    也许, 就在于, 我们的智力进化远没有那么快("暗时间", 刘未鹏) - 比如, 贪吃, 这个富足的时代提倡健康饮食的时候, 我们依然很难拒绝香喷喷的肉夹馍, 因为我们的祖先老是在挨饿, 所以他们一有捕获就"啖其肉, 尽其骨, 乃去", 还觉的要教育子子孙孙见了肉就要上, 便拿起小刀在DNA上镌刻了一段代码:

      if meat then eat end

    这样, 哲学在几千年前就可以总结出很多现在依旧需要面对的问题. 而当时灵光一闪的上下文已经湮没在历史里了. 

    它告诉我们, 我们是靠摸着石头过这条河的, 过河时摸过的石头有这么多类, 手感怎么样; 但是石头也许变了, 河也早就不是那条河了.

     

    分类: Life
  • 1. 开始觉得Siri也没啥, 比google强不了多少. 

    -----

    2. 有个关于人工智能的笑话, 说终于有一天AI到了"计算机自己编程"的水平了.

    于是对计算机说"你把这个数据库按姓名排一下序. 请.",

    计算机沉思片刻, "排完了". 

    当你惊讶于计算科技日新月异时, 你发现计算机"偷懒"了 - 它清空了数据库, 然后想当然的认为, 包含0条数据的数据库是排好序的.

    -----

    3. AI的问题在于它不理解语境, 你告诉它排序, 还得告诉它别干别的傻事 - 比如, 排不出来别重启, 就算用冒泡排序也别打算排到世界末日, 诸如此类的.

    问题这些琐碎的限定语境的问题太多, 就像饭店里多问的那句"葱姜蒜有没有什么忌口?" 让人烦了. 你让它排个序, 它却想让你告诉它怎样才能"安全"的排序而不毁灭世界, 不然它就要干出一番轰轰烈烈的傻事来了.

    -----

    4. google voice就是google的一个壳, 你告诉他 "I'm locked". (我被锁在外面/里面了).

    google就会牛轰轰的告诉你, 0.32秒, 它发现了416,000,000个答案:

    1) Youtube上有个蠢货也被锁在车里了还打了911. (点击查看更多蠢货)

    2) Twitter把我的帐号封锁了, 因为我试了密码很多次.

    3) Yahoo知识堂: 我锁在屋里了, 怎么出去?

    4) 我锁在屋外了; 我的狗和笔记本在屋里, 但狗马上要撒尿了. (点击查看33条回复)

     ...

    -----

    5. 还好, 它没像银河系漫游指南的大牛计算机那样给出 生命, 宇宙以及一切的终极答案: 42.

    google没有理解问题, 他只是在匹配关键字 - 甚至关键两个字都可以去掉 - 他只是按照不同语言, 分词, 按照这些词统计的频率, 过滤掉没用的副词之类的, 然后搜腾出, 这个世界上所有包含这几个词的网页.

    然后, 最关键的部分来了: 按照这些网页的"有趣"程度, 排序.

    也就是说, 你搜"我锁在外面了", 然后点"手气不错" (I Feel Lucky.), 你就能一键欣赏到youtube上一个和你一样蠢的家伙给大家带来的欢乐了.

    -----

    6. Siri, 我被锁在外面了.

    "恩. 我搜到了附近有6家锁匠."

    分类: Work
  • 2011-10-09Indie income of US - [Work]

    Indie devloper总是对自己的收入讳莫如深 - 很多blog里只是提一提收入增长率, 图表上从来都没有具体的数字 (flyingmeat.com). 树大招风嘛, 这样可以避免很多麻烦, 可以理解. 当然也有例外, Delicious Monster 的产品第一天就5w$, 第一个月25w$, 这个是显摆了很久的.

    -----

    最近在Indie + Relief上看到当年为海地地震捐助的142家indie developer, 捐出2010.01.20当日所有收入, 共计: $143,872.

    做个除法$143872/142 = $1013. 很漂亮的数字吧? 

    这个就是US同行的成绩, 这个平均数字让人郁闷的是, 无论你怎么估计具体样本的分布, 都有大牛日进斗金, 让人有点劫富济贫的冲动. 

    -----

    think about it.

    分类: Work
  • 2011-10-04让我来帮你一下 - [Work]

    http://www.kaixin001.com/repaste/688143_3532985911.html

    "他告诉我甲骨文的 Larry Ellison 是如何提高团队效率的故事。如果一个团队效率底下,他会每个星期过来说“让我来帮你一下”。他做了什么呢?他每次从团队调走一个人,直到团队停止无谓的会议,开始做出产品。"

    分类: Work
  • 2011-08-05. - [Life]

    我不做调整. 我静静的等这一刀切下来, 看看有多疼.

    分类: Life
  • 2011-08-04帮主说 - [Work]

    人们认为专注意味着对你需要专注的事情说“是”。但这根本不是专注的含义。专注意味着对上百个其它好主意说“不”。你必须谨慎选择。相比已经完成的工作,我对那些没有完成的工作一样感到自豪。创新就是对 1000 件事情说“不”。

    分类: Work
  • 2011-07-09衣钵 - [Work]

     

    最近很火的google+,由于Steven levy同学的精彩报道,作为google+ cicle的设计者, Andy Hertzfeld这位Macintosh软件的缔造者又从幕后走到台前。Andy在自己的google+上澄清,说这是集体的功劳,逐一列举了成员名单,并说这和1984 Mac发售时的情形类似,媒体总是喜欢这样的孤单英雄的故事,而真正的系统往往是由很多人完成的。

    当然,Andy同学名片上印的Software Wizard,也不能说没有一点ego. 

    我就在想这些人在team中的作用到底是怎样的呢?

    Woz一手设计了apple, apple][, Macintish的软硬件工程师大都研读过Woz的系统手册(比如,伯瑞尔.史密斯)。Andy在forklore.com上也提到,MAC team很大程度上是Woz当年hacking精神的继续。Wil Shipley在about页面里写道:他十几岁时读到的Woz写的磁盘驱动器代码是至今读到的最美的优化代码。

    据说Ken Thompson在google连c语言项目的check in权限都没有,因为他没有阅读过google的c语言风格指南。但是,他写了go语言的编译器 - 又好又快又简单。能做到这三点的没有几个人。贝尔实验室的风格就这样吹到了google。

    乔帮主说招聘,说你必须找到比自己更优秀的人 - 如果A水平招B水平,B招C,很快你周围就被Z水平的员工填满了。

    37signals 最近一篇blog提到don norman(The Design of Everyday Things)所说的know how: 即有些东西是需要师傅~学徒这种方式来学习的。这世上没有优秀员工或者大牛守则,只有员工守则 ﹣ 那卡的是底线。

    于是,大牛除了自己很高产以外,他能有个门槛作用,过滤掉B类应聘者。然后就像老和尚一样带着徒弟们修行,不同之处在于,没有老和尚的等级。这样,衣钵便传承了下来...

     

    分类: Work
  • 2011-06-301 - [Life]

    Think about the different areas of your life (career, relationships, spiritual, health, etc.) – and rate your satisfaction in each area from 1 to 10. Go through every area you rated a 5, 6, 7, or 8 – and replace it with a 1! Never settle for “it’s not so bad” – and instead face up to what you really want.

    Derek Sivers summarizing a lesson from the book “Personal Development for Smart People” by Steve Pavlina. Come to think of it, this is a pretty good way to rate feature ideas too. Leave in the essential, omit the rest.

     

    分类: Life
  • 2011-06-21Father's day - [Life]

    Google 今天用一张烫印的名片和一条领带告所我,美帝的爹们都在过节了。


    "他的生命从无静止,他就像一条河流,一直在奔腾向前。"

    分类: Life
  • 2011-05-29设计是一个... - [Work]

    “设计是一个发现问题、而不是发现解决方案的过程” —— Leslie Chicoine

    分类: Work
  • from here:

    "Most everyone I meet feels pulled in more directions than ever, expected to work longer hours, and asked to get more done, often with fewer resources. But in these same audiences, there are also, invariably, a handful of people who are getting things done, including the important stuff, and somehow still managing to have a life.

    What have they figured out that the rest of their colleagues have not?

    The answer, surprisingly, is not that they have more will or discipline than you do. The counterintuitive secret to getting things done is to make them more automatic, so they require less energy.

    It turns out we each have one reservoir of will and discipline, and it gets progressively depleted by any act of conscious self-regulation. In other words, if you spend energy trying to resist a fragrant chocolate chip cookie, you'll have less energy left over to solve a difficult problem. Will and discipline decline inexorably as the day wears on.

    "Acts of choice," the brilliant researcher Roy Baumeister and his colleagues have concluded, "draw on the same limited resource used for self-control." That's especially so in a world filled more than ever with potential temptations, distractions and sources of immediate gratification."

     

    分类: Life
  • 2011-05-13zeitgeist - [Life]

    from here:

    "而且,模仿也可以说是一条可行的捷径。不过,在模仿的外表下,我们还是要考虑一下真正属于自己的东西。以一个很小的细节为例,在43things上,导航栏里有一个不常用的词,叫作zeitgeist,第一次上43things的时候不知道这个词的意思,于是去查字典,金山词霸将此译为The spirit of the time,基本上可以感觉到这个词的时代性和感召力,43things希望向用户传达的是一种很有进取性的理念,就像在他们的list的title是“the world wants to ...”,在43things,最多人想做的事情就是这个世界想做的事情。始终在传递一种精神,一种理念,43things和43places成功就在于此。我去看了一下几个中文模拟网站,从爱米开始,千篇一律采用了“排行榜”这个词。意思大概是对了,不过那种感觉已经不在."

    分类: Life
  •  

    by pg:

    Here it is: I like to find (a) simple solutions (b) to overlooked problems (c) that actually need to be solved, and (d) deliver them as informally as possible, (e) starting with a very crude version 1, then (f) iterating rapidly.

     

    分类: Work