零基礎(chǔ)四個(gè)月做出一款A(yù)PP
OK,其實(shí)吧,我這個(gè)標(biāo)題有點(diǎn)誤導(dǎo)性。我四個(gè)月前才開始學(xué)習(xí)Swift,在此之前,我沒怎么接觸過編程。我從沒有開發(fā)過任何平臺(tái)上的native app。現(xiàn)在想起來,我當(dāng)時(shí)可能根本不知道自己在干啥。
為了讓大家理解我“如何”做這件事,首先得講清楚我“為什么”做這件事。
回到過去
我一直愛玩電腦。在我差不多8歲的時(shí)候,我爸給我買了***臺(tái)電腦,沒玩幾下我就上癮了。那臺(tái)破電腦跑著DOS系統(tǒng),屏幕是CRT的渣屏,但是不管怎樣,在它的幫助下我能做很多我想做的事情。這特么是多牛逼的事兒??!當(dāng)然了,我當(dāng)時(shí)還是主要以玩游戲?yàn)橹?,但同時(shí),這也讓我愛上了所有跟電腦相關(guān)的東西。我逐漸學(xué)習(xí)到了電腦的工作原理,把各個(gè)程序里所有能點(diǎn)的東西都點(diǎn)了個(gè)遍,順便還成為了朋友們口中的“技術(shù)通”。
時(shí)間快進(jìn)至1999年。在1999年,我們用的是56K的撥號(hào)連接和ADSL連接。當(dāng)互聯(lián)網(wǎng)在匈牙利開始興起的時(shí)候,我仍然保持著對(duì)電腦的熱愛。幾乎每天下午,你都可以在學(xué)校機(jī)房里找到正在狂看Geocities網(wǎng)頁的我。那是一個(gè)美好的時(shí)代,大家都基于開發(fā)網(wǎng)站,還會(huì)在上面放一個(gè)叫"dancing baby animgif"的小玩意,而我也想成為這個(gè)潮流的一部分。
我開始學(xué)習(xí)HTML語言,并且創(chuàng)建了我人生***個(gè)網(wǎng)站。因?yàn)楫?dāng)時(shí)正值99年,所以我恰當(dāng)?shù)貙⑺麨?ldquo;Zolee Site Millenium”。我那個(gè)網(wǎng)站在學(xué)校服務(wù)器上運(yùn)行,還只能通過一個(gè)Frankensteinian URL 被訪問,就像這個(gè)一樣:www.kkt.piar.school.gov.hu/~hosszu2(注意,這里有一個(gè)漂亮的波浪線哦)。但不管怎么樣,我也是互聯(lián)網(wǎng)大軍的一員了,我感覺自己仿佛征服了Word Wide Web新大陸的一角。感覺爽爆了。
接下來的幾年里,我還是癡迷于玩游戲。我超愛反恐精英。這款游戲當(dāng)時(shí)特別火,所以我總是有機(jī)會(huì)給自己所在的戰(zhàn)隊(duì)建網(wǎng)站。我喜歡設(shè)計(jì)和構(gòu)建頁面,但一段時(shí)間后,我開始致力于視覺效果和易用性方面的事情。我不斷學(xué)習(xí)圖像和用戶體驗(yàn)知識(shí),還順帶著經(jīng)歷了***一波網(wǎng)頁開發(fā)風(fēng)潮。
今天,我作為全職UI設(shè)計(jì)師在一家匈牙利機(jī)構(gòu)供職。對(duì)于當(dāng)下流行的Node、Angular或Bootstrap框架,我是一點(diǎn)兒經(jīng)驗(yàn)都沒有。不過呢,這對(duì)我來說也不是什么大事。
但是,畢竟我還有些私人的設(shè)計(jì)項(xiàng)目,所以還是一直關(guān)注著HTML、CSS和JavaScript的相關(guān)動(dòng)向。
GAget的創(chuàng)意來源
2011年,我的網(wǎng)站迎來了一次巨大的機(jī)遇。我的網(wǎng)頁設(shè)計(jì)得到了DevianArt的推薦。我每天都檢查新用戶,每發(fā)現(xiàn)多一些我都超激動(dòng)。但我也真的很不爽。我不爽不是因?yàn)樵L客數(shù)據(jù)的多少,而是我沒有簡便的方法去獲得訪客數(shù)據(jù)。我當(dāng)時(shí)有兩種選擇。要么我就繼續(xù)跟Google Analytics死磕,要么我就得找一個(gè)簡單的應(yīng)用來幫我做這件事。我認(rèn)為這就是OS X Dashboard widgets誕生的目的,因此我開始考慮搞一個(gè)這樣的東西。
但現(xiàn)成的方案只有兩個(gè),一個(gè)太簡陋,另一個(gè)又?jǐn)?shù)據(jù)不夠。因此,作為一名設(shè)計(jì)師,我想出了一個(gè)我能想到的***設(shè)計(jì)方案,然后把這個(gè)方案放到了Dribbble上。
大家給我點(diǎn)了一些贊,正是這些贊讓我有動(dòng)力繼續(xù)深入下去。我發(fā)現(xiàn)widgets基本都是用HTML和JavaScript寫的,于是我開始更認(rèn)真地考慮開發(fā)這個(gè)東西。我想說的是,這可是我最熟悉的兩種語言啊,有木有!
幾天之內(nèi),我在Dashboard上面做好了產(chǎn)品原型。我將其命名為 GAget [讀音跟 gadget相同]——它是Google、Analytics和widget的縮寫。這名字有點(diǎn)傻,不過聊勝于無嘛。
兩周之后,也就是2011年8月,我發(fā)布了這個(gè)widget。
一段時(shí)間后,我停止了更新推薦GAget的書簽...
得到的反饋數(shù)量之多讓我有點(diǎn)吃驚:MacStories、SwissMiss以及數(shù)不清的博客都推薦了GAget。匈牙利電腦世界雜志中甚至還出現(xiàn)過我的名字。我必須全力以赴!
###下一步做什么?
現(xiàn)在,這個(gè)widget有了超過84000的下載量,每周都有成千上萬的人在用它。我甚至還跟一個(gè)朋友開發(fā)了一個(gè)iPhone版本的GAget。因此,當(dāng)蘋果發(fā)布了Yosemite更新并且宣布不繼續(xù)支持Dashcode的時(shí)候,GAget的未來就變得不太明朗起來。
不過,塞翁失馬,焉知非福:蘋果向開發(fā)者開放了通知中心,而通知中心可以顯示widget。好!支持!威武!有希望了!或許我這個(gè)小widget的成功故事可以繼續(xù)了!
我在Instagram上發(fā)布的關(guān)于全新設(shè)計(jì)的圖片
我開始讀關(guān)于Today Extensions(這是蘋果對(duì)widget的稱呼)的官方文檔。可是,那上都是些本地化的Objective-C代碼。什么鬼啊哎!什么編譯器、內(nèi)存泄露、多線程進(jìn)程……我可一點(diǎn)都不想弄這種事。對(duì)一個(gè)沒做過這些的人來說,這些詞完全就是天書。但我做出了決定,GAget必須成為一個(gè)本地化的widget才行!
***的問題是,我根本不知道從哪兒開始。
Objective-C的糾結(jié)
我買了一本用Objective-C進(jìn)行iPhone開發(fā)的書可是看了幾頁就放棄了。老實(shí)說,對(duì)于一個(gè)只會(huì)點(diǎn)前端語言和PHP的人來說,Objective-C實(shí)在是太難了??纯聪旅孢@些代碼:
- @interface ReminderViewController()
- @property (nonatomic, weak) IBOutlet UIDatePicker *datePicker;
- @end
interface和property這都是什么鬼?@和*在這兒擺著是幾個(gè)意思?好吧,老子唯一能看懂的就是end了!謝謝!
更快的編程方式
那本書的教程對(duì)我來說完全無從下手。掙扎了幾個(gè)月,本地化的widget還是如海市蜃樓一般。
然后我突然想起來,Yosemite的發(fā)布的時(shí)候,Apple同時(shí)介紹了一種新的編程語言叫做Swift。Swift對(duì)每個(gè)人來說都是全新的,所以,很多大牛連碰還沒碰就開始琢磨著怎么搞個(gè)大新聞,把它批判一番,以長者的姿態(tài)告誡大家還是得學(xué)Objective-C。這一切都激起了我的好奇心:我把它下載下來,讀它的說明文檔。
那感覺竟如春風(fēng)拂面般舒爽。代碼看上去變熟悉了,就跟復(fù)雜版的JavaScript差不多!我搞定了Xcode,然后開始看著教程依葫蘆畫瓢。
我的目標(biāo)是開發(fā)一個(gè)OS X widget,但大多數(shù)教程的重點(diǎn)只是Swift語言本身或iPhone應(yīng)用開發(fā),所以,“路漫漫其修遠(yuǎn)兮,吾將上下而求索”啊。我仍有很多問題沒找到答案,例如:
-Widget如何與應(yīng)用程序通信?(核心數(shù)據(jù)和app組)
-我能否使用鼠標(biāo)懸停互動(dòng)?(不能)
-如何才能只打開widget中的一行?(自動(dòng)布局,再加上一些手動(dòng)的高度調(diào)整)
蘋果官方文檔里關(guān)于widget的那一頁讓我在github和Stack Overflow上找源碼,這讓我花了無數(shù)時(shí)間才找到答案。
我收集了一些我覺得非常有用的鏈接。如果你剛開始學(xué)iOS或OS X開發(fā)的話,它們也會(huì)有幫助。
我努力找到了所有我需要的東西,然后發(fā)現(xiàn)學(xué)習(xí)進(jìn)展比我預(yù)想的還要快:Yosemite版本的GAget開始成形了。
4個(gè)月之前,我根本搞不懂MVC、多線程進(jìn)程、app對(duì)象、view controller、核心數(shù)據(jù)這些名詞。不過,度過了無數(shù)個(gè)有教程和Stack Overflow陪伴的夜晚之后,我學(xué)會(huì)了Swift和OS X開發(fā)的基礎(chǔ)知識(shí)。
感謝參與測試的800位“壯士”,在他們的幫助下,測試非常成功。我的***款本地化應(yīng)用,GAget,[現(xiàn)在可以在App Store下載了](http://gagetapp.com/osx/)。
除了一門新的編程語言之外,我還學(xué)到哪些?
我發(fā)現(xiàn),在Swift出來之前先開發(fā)私人項(xiàng)目所花時(shí)間之長是很可怕的。在私人項(xiàng)目中,你可以做**你**想做的事情而不用去管上司或者客戶。你可以隨便添加或刪除功能,并且按照自己的節(jié)奏工作。
Deadlines
但是,我發(fā)現(xiàn)**給自己一個(gè)***期限是激勵(lì)自己的絕好方式**。每個(gè)新年前夜,我都跟我妻子坐下來,寫一份下一年年我們想完成的事情的清單。這一次我列出來的是,我希望在1月末發(fā)布GAget的新版本:這是我的deadline。
雖然我最終還是比deadline晚了一個(gè)月(由于蘋果的審查進(jìn)程和一些其他的項(xiàng)目),但我為了完成這一目標(biāo),整個(gè)1月都在傾盡全力地工作。在紙上寫下來要做的事情絕對(duì)是一個(gè)強(qiáng)大的動(dòng)力。
學(xué)習(xí)周期
我還發(fā)現(xiàn)了學(xué)習(xí)新東西的三個(gè)階段:激情階段、彷徨階段和解決階段。
1.激情階段:一開始都是在這個(gè)階段。你有一個(gè)新的構(gòu)思并且開始學(xué)習(xí)新東西,所有事情看起來都很好,你開始設(shè)想下一步該做的事情。你很有動(dòng)力,而且你的工作是你所熟悉和擅長的。但無論怎樣,***你總是會(huì)發(fā)現(xiàn)自己知識(shí)上存在著瓶頸。
2.彷徨階段:當(dāng)你碰到***個(gè)實(shí)際問題的時(shí)候,你的激情和動(dòng)力開始被消磨。你會(huì)感到茫然無助,不知所措。你甚至?xí)械浇^望:會(huì)為了一個(gè)答案而對(duì)著Google發(fā)瘋。
3.解決階段:終于!那個(gè)煩死人的問題,你終于把答案給找著了。你發(fā)現(xiàn)自己正在以更快的速度進(jìn)步,并且重拾了激情和動(dòng)力。你返回到了***階段。
所以,當(dāng)下一個(gè)循環(huán)開始的時(shí)候,你得記?。横葆咫A段可能會(huì)很長、很難熬,但終有一天你會(huì)乘舟破浪、到達(dá)彼岸。而尋找彼岸的過程本身,就是人生的樂趣所在。