GAget(OS X上的Google Analytics widget)背后的故事
OK,其实吧,我这个标题有点误导性。我四个月前才开始学习Swift,在此之前,我没怎么接触过编程。我从没有开发过任何平台上的native app。现在想起来,我当时可能根本不知道自己在干啥。
为了让大家理解我“如何”做这件事,首先得讲清楚我“为什么”做这件事。
回到过去
我一直爱玩电脑。在我差不多8岁的时候,我爸给我买了***台电脑,没玩几下我就上瘾了。那台破电脑跑着DOS系统,屏幕是CRT的渣屏,但是不管怎样,在它的帮助下我能做很多我想做的事情。这特么是多牛逼的事儿啊!当然了,我当时还是主要以玩游戏为主,但同时,这也让我爱上了所有跟电脑相关的东西。我逐渐学习到了电脑的工作原理,把各个程序里所有能点的东西都点了个遍,顺便还成为了朋友们口中的“技术通”。
时间快进至1999年。在1999年,我们用的是56K的拨号连接和ADSL连接。当互联网在匈牙利开始兴起的时候,我仍然保持着对电脑的热爱。几乎每天下午,你都可以在学校机房里找到正在狂看Geocities网页的我。那是一个美好的时代,大家都基于开发网站,还会在上面放一个叫"dancing baby animgif"的小玩意,而我也想成为这个潮流的一部分。
我开始学习HTML语言,并且创建了我人生***个网站。因为当时正值99年,所以我恰当地将它命名为“Zolee Site Millenium”。我那个网站在学校服务器上运行,还只能通过一个Frankensteinian URL 被访问,就像这个一样:www.kkt.piar.school.gov.hu/~hosszu2(注意,这里有一个漂亮的波浪线哦)。但不管怎么样,我也是互联网大军的一员了,我感觉自己仿佛征服了Word Wide Web新大陆的一角。感觉爽爆了。
接下来的几年里,我还是痴迷于玩游戏。我超爱反恐精英。这款游戏当时特别火,所以我总是有机会给自己所在的战队建网站。我喜欢设计和构建页面,但一段时间后,我开始致力于视觉效果和易用性方面的事情。我不断学习图像和用户体验知识,还顺带着经历了***一波网页开发风潮。
今天,我作为全职UI设计师在一家匈牙利机构供职。对于当下流行的Node、Angular或Bootstrap框架,我是一点儿经验都没有。不过呢,这对我来说也不是什么大事。
但是,毕竟我还有些私人的设计项目,所以还是一直关注着HTML、CSS和JavaScript的相关动向。
GAget的创意来源
2011年,我的网站迎来了一次巨大的机遇。我的网页设计得到了DevianArt的推荐。我每天都检查新用户,每发现多一些我都超激动。但我也真的很不爽。我不爽不是因为访客数据的多少,而是我没有简便的方法去获得访客数据。我当时有两种选择。要么我就继续跟Google Analytics死磕,要么我就得找一个简单的应用来帮我做这件事。我认为这就是OS X Dashboard widgets诞生的目的,因此我开始考虑搞一个这样的东西。
但现成的方案只有两个,一个太简陋,另一个又数据不够。因此,作为一名设计师,我想出了一个我能想到的***设计方案,然后把这个方案放到了Dribbble上。
大家给我点了一些赞,正是这些赞让我有动力继续深入下去。我发现widgets基本都是用HTML和JavaScript写的,于是我开始更认真地考虑开发这个东西。我想说的是,这可是我最熟悉的两种语言啊,有木有!
几天之内,我在Dashboard上面做好了产品原型。我将其命名为 GAget [读音跟 gadget相同]——它是Google、Analytics和widget的缩写。这名字有点傻,不过聊胜于无嘛。
两周之后,也就是2011年8月,我发布了这个widget。
一段时间后,我停止了更新推荐GAget的书签...
得到的反馈数量之多让我有点吃惊:MacStories、SwissMiss以及数不清的博客都推荐了GAget。匈牙利电脑世界杂志中甚至还出现过我的名字。我必须全力以赴!
###下一步做什么?
现在,这个widget有了超过84000的下载量,每周都有成千上万的人在用它。我甚至还跟一个朋友开发了一个iPhone版本的GAget。因此,当苹果发布了Yosemite更新并且宣布不继续支持Dashcode的时候,GAget的未来就变得不太明朗起来。
不过,塞翁失马,焉知非福:苹果向开发者开放了通知中心,而通知中心可以显示widget。好!支持!威武!有希望了!或许我这个小widget的成功故事可以继续了!
我开始读关于Today Extensions(这是苹果对widget的称呼)的官方文档。可是,那上都是些本地化的Objective-C代码。什么鬼啊哎!什么编译器、内存泄露、多线程进程……我可一点都不想弄这种事。对一个没做过这些的人来说,这些词完全就是天书。但我做出了决定,GAget必须成为一个本地化的widget才行!
***的问题是,我根本不知道从哪儿开始。
#p#
Objective-C的纠结
我买了一本用Objective-C进行iPhone开发的书可是看了几页就放弃了。老实说,对于一个只会点前端语言和PHP的人来说,Objective-C实在是太难了。看看下面这些代码:
- @interface ReminderViewController()
- @property (nonatomic, weak) IBOutlet UIDatePicker *datePicker;
- @end
interface和property这都是什么鬼?@和*在这儿摆着是几个意思?好吧,老子唯一能看懂的就是end了!谢谢!
更快的编程方式
那本书的教程对我来说完全无从下手。挣扎了几个月,本地化的widget还是如海市蜃楼一般。
然后我突然想起来,Yosemite的发布的时候,Apple同时介绍了一种新的编程语言叫做Swift。Swift对每个人来说都是全新的,所以,很多大牛连碰还没碰就开始琢磨着怎么搞个大新闻,把它批判一番,以长者的姿态告诫大家还是得学Objective-C。这一切都激起了我的好奇心:我把它下载下来,读它的说明文档。
那感觉竟如春风拂面般舒爽。代码看上去变熟悉了,就跟复杂版的JavaScript差不多!我搞定了Xcode,然后开始看着教程依葫芦画瓢。
我的目标是开发一个OS X widget,但大多数教程的重点只是Swift语言本身或iPhone应用开发,所以,“路漫漫其修远兮,吾将上下而求索”啊。我仍有很多问题没找到答案,例如:
-Widget如何与应用程序通信?(核心数据和app组)
-我能否使用鼠标悬停互动?(不能)
-如何才能只打开widget中的一行?(自动布局,再加上一些手动的高度调整)
苹果官方文档里关于widget的那一页让我在github和Stack Overflow上找源码,这让我花了无数时间才找到答案。
我收集了一些我觉得非常有用的链接。如果你刚开始学iOS或OS X开发的话,它们也会有帮助。
我努力找到了所有我需要的东西,然后发现学习进展比我预想的还要快:Yosemite版本的GAget开始成形了。
4个月之前,我根本搞不懂MVC、多线程进程、app对象、view controller、核心数据这些名词。不过,度过了无数个有教程和Stack Overflow陪伴的夜晚之后,我学会了Swift和OS X开发的基础知识。
感谢参与测试的800位“壮士”,在他们的帮助下,测试非常成功。我的***款本地化应用,GAget,[现在可以在App Store下载了](http://gagetapp.com/osx/)。
除了一门新的编程语言之外,我还学到哪些?
我发现,在Swift出来之前先开发私人项目所花时间之长是很可怕的。在私人项目中,你可以做**你**想做的事情而不用去管上司或者客户。你可以随便添加或删除功能,并且按照自己的节奏工作。
Deadlines
但是,我发现**给自己一个***期限是激励自己的绝好方式**。每个新年前夜,我都跟我妻子坐下来,写一份下一年年我们想完成的事情的清单。这一次我列出来的是,我希望在1月末发布GAget的新版本:这是我的deadline。
虽然我最终还是比deadline晚了一个月(由于苹果的审查进程和一些其他的项目),但我为了完成这一目标,整个1月都在倾尽全力地工作。在纸上写下来要做的事情绝对是一个强大的动力。
学习周期
我还发现了学习新东西的三个阶段:激情阶段、彷徨阶段和解决阶段。
1.激情阶段:一开始都是在这个阶段。你有一个新的构思并且开始学习新东西,所有事情看起来都很好,你开始设想下一步该做的事情。你很有动力,而且你的工作是你所熟悉和擅长的。但无论怎样,***你总是会发现自己知识上存在着瓶颈。
2.彷徨阶段:当你碰到***个实际问题的时候,你的激情和动力开始被消磨。你会感到茫然无助,不知所措。你甚至会感到绝望:会为了一个答案而对着Google发疯。
3.解决阶段:终于!那个烦死人的问题,你终于把答案给找着了。你发现自己正在以更快的速度进步,并且重拾了激情和动力。你返回到了***阶段。
所以,当下一个循环开始的时候,你得记住:彷徨阶段可能会很长、很难熬,但终有一天你会乘舟破浪、到达彼岸。而寻找彼岸的过程本身,就是人生的乐趣所在。
好了,不要忘记去看看GAget(http://gagetapp.com/osx/)
原文:How I, a designer, learned to code and released an app in 4 months