iOS考題整理

長久以來,我們就常看到一些徵才的文章,告訴我們國外團隊是怎麼找人的。像是pair programming、on-site coding、白板考演算法、看github contribute。

上個月面試了幾家公司,其中幾家是上市公司,最少也是100個人的大小,每個都說自己是行動開發知名團隊。加上之前找工作時有找過幾家,差不多也寫過20家公司的考卷了。有些公司是剛成立mobile team,寫最久的工程師不超過一年,那demo幾個作品聊兩句就會結束了。

至於那些大公司嘛,大概會有這兩個特色:

1.筆試

絕對不會上機考,也就是說,讓應徵者使用進來工作後完全不一樣的工具、完全不一樣的環境、也完全不提供任何語法reference。

考觀念或演算法就算了,大部分竟然是要手寫程式碼,iOS每年更新幾百隻甚至上千支api,誰背得起來啊!就算是常用的api,有些長度已經是不用autocomplete就打不出來的程度。我同事有次autocomplete壞掉,連NSDictionary都差點拼不出來。

我看到這現象,都會對這間公司扣20分。不過大家都一樣,所以應該說有考live coding的直接加20分。

2.不考ObjC

看到這一步,我已經想謝謝再聯絡了。大概遇到一半都是這樣,比例高得驚人阿!

這家公司又準備要讓應徵者使用進來工作後用完全不一樣的工具、完全不一樣的環境、寫完全不一樣的語言、難道也是完全不一樣的職缺嗎?
(我還真的聽過某知名外商考java進來寫javascript)

這在越大型的公司越常發生,原本寫C的公司想要發展iOS app,就拿C的考卷來考。還遇過要我寫java或者php考卷。反而是新創公司或者接案公司就不會發生這種問題。

比較神奇的是有公司考sql query,還很鎮定的說這可以同時審核iOS跟Android工程師。

第一次遇到的時候可以說是驚訝、第三次遇到的時候是憤怒:你是在羞辱我嗎?後來再遇到的時候心情已經很平淡了,「喔!又來了喔」

以上句句屬實,有人想要那些公司的名字可以私下問我。

至於考的題目嘛(嘆)

第一次開始找工作的時候,我很緊張的把國外論壇上的面試題目作一遍,像是oDesk上面有幾份細的要命的考題、Codility上面也有演算法題。後來寫了幾家的題目....我才發現這根本是想太多,會考到這種程度的公司台灣不存在。

常常在怨歎找不到好人才的技術主管,到底有沒有想過要怎麼找人!


面試到目前為止,我只遇過一家,Splashtop,有拿筆電出來考coding能力、我也是後來才知道有同事透過遠端監控看我畫面上在幹嘛,算是藏起來的pair progrmming。早知道我應該開記事本跟他對話。當初的題目是要我做一個NavigationController 包tableView +custom cell +旋轉後元件不能歪+所有button點了要有alert。要求一個半小時完成我一小時就做好了。

這篇文章到目前為止都是抱怨文,下面是我看過比較正常的題目,原文都是英文,以下順便翻譯:

1.什麼是MVC、MVC的好處?

2.什麼是delegate?舉例?

3.什麼是KVO?寫個範例

4.實作callback的時候怎麼決定要用block還是delegate

5.thread之間要怎麼溝通?NSOperationQueue跟GCD的差別是?

6.objc裡面可不可以用try catch?為什麼不常看到?

7.請問HIG裡面說一個button最小的大小是多少?

8.在iOS6跟iOS7分別要怎麼樣客製化UIAlertView

9.MapView裡面要怎樣customized pin,有哪幾種作法? 除了原生mapKit還用過哪些圖資?

10.請實作singleton 

11.請實作一個factory 物件

12.請寫出view lifecycle

13. arc的壞處?

14.演算法題:都差不多,寫個小function或者給function要寫出output。
  • 給一串string吐回inverse
  • 把河內塔用push pop代替recursive寫一遍。
  • 或者ACM抄來的。
下面這幾題跟objC無關,但是寫iOS一定要知道,筆試不會考,都是我在面試時被問或問對方的:

1.有一天推播突然不能用了,有哪幾種可能?

2.要怎麼看 dsym

3.xib要怎麼和storyboard混用

4.storyboard上要怎麼用用客製化的view,xib上要怎麼用用客製化的view。

5.什麼是hash什麼是加密?各舉兩個例子。


以上應該是寫過一年到兩年的iOS developer可以答出的題目,有些問題甚至寫過一兩個案子就可以答出來了。

如果有公司想拿去面試不用徵求我的意見,可以直接拿。另一方面,如果自認是專業行動開發團隊,團隊內的工程師卻不能回答這些問題的話,那就要好好檢討了。

用鬼島的方法玩HipsterCEO

之前有一句話是這樣說的:
「在鬼島、如果你違背良心、壓榨員工、作黑心產品、不把消費者的權益當一回事.....
那你就會....賺大錢。」

WTF


在昨天那篇正當玩法以後,我用從鬼島學到的操作手法重玩一次HipsterCEO,重點如下:
  • 只請最便宜的員工,如果員工哭夭要加薪不理他,走了就再請一個
  • 不注重產品品質,完成30%就推出....後續幾乎不更新。
  • 用最便宜的行銷費用達到最多的購買數
  • 不求賣給所有人,只專攻某幾個高消費力的族群
  • 盡可能的調高售價
  • 這是一家空殼公司
  • 有盈餘就掏空、有盈餘就掏空、有盈餘就掏空

結果如下




只請最便宜的員工,100個人裡面99個sales,自己作marketing,沒有人作研發。


花最多錢的是marketing campaign,大概是20個員工加起來
所有人的薪水都比不上設備的費用


(左)In the bank每天增長速度約400k

(右)收購的出價最高值大概會是公司現值的1/3,能掏空幹嘛賣


還真的賺大錢了XD

今天的感想是我以後絕對不能開公司,會被告死。




Hipster CEO

前幾天看到facebook上面在轉貼<Hipster CEO>這款遊戲,剛好昨天訂的新手機到了,就裝來玩玩看。

攻略就不細說了,我想xdite的那篇介紹文寫得很清楚。

簡單來說,前幾次先衝經驗值,這遊戲預設就是要讓你知道前幾次創業不會成功。我最新的一次產品,Tech技能全滿去創業,做完10個feature三個指標都是90%,Day to live還有500多。然後就是灑廣告等投資,有錢以後再去下更大的廣告,有閒錢先補sales...幾個輪迴以後就會變成一直下最高額的廣告,滿滿的sales。



錢多到花不完。現在就看world ranking一直爬上去。


以下是我覺得作品想告訴我們的訊息:
  1. 創業很難、靠北難
  2. 失敗3 4次,自己經驗值提升後才能提高一些可能性
  3. 先有人潮,才有錢潮
  4. 有錢以後先不要想去擴張,看有缺什麼先補,想辦法把現金流轉正才對。
  5. 同上,過早最佳化是萬惡的淵藪
舉例說明:
我靠廣告拿到第一筆投資後,就先把廣告停掉。先去顧sales增加收入,
雖然廣告可以增加知名度,但是沒有東西賣不出去也是沒屁用的。

一直在marketing跟sales間作微操作,有閒錢就去補sales或買更大的廣告。有空才去看tech,因為怕被hack,產品上市後就只專攻stability,拿了一堆stability的獎。

一直到40個人規模的時候,Tech才只有3個人、Marketing一人專門買廣告、其他全部Sales。

如果我一開始就補Tech產品把做起來,那我拿到第一個獎的時候大概錢也燒完了。

然後是我發現人性美好的一面:

在我現金流穩定以後,想要把Tech的人補起來,原本team裡有兩個等級10的開發者,然後產品已經是業界領導品牌了,每項都是90%,所以顧一個等級五的來作Design、一個禮拜後他竟然就變成等級10了,價差10倍以上耶!

這讓我體會到教育訓練的重要,把一個普通的工程師放在頂尖的環境裡,
就會火速提升功力。

所以後來我在sales那邊也用同一招,有一個頂尖sales加不停的marketing打下市場以後,一次顧5個中等的sales灌下去團練,大概過一小時,他們能力值都變成80左右了,跟人力市場上面的比較,至少都便宜一半以上。


最後是一些bug:
  • 在換office的地方,tableView沒辦法卷到最下面。最多只能選到100人的office>
  • 他的timer開太多,玩一個小時後就要重開一次,不然連tableView在scroll的時候也會delay。




2013 台北遊戲開發者論壇

去年去過一次遊戲開發者論壇,聽了很多小蝦米求生存的故事,深受感動。今年雖然我也還沒開始寫遊戲,而且今年門票要自己出錢,不過感動是沒辦法用金錢衡量的。

今年講者雖然也很厲害,可能是去年震撼太強烈了。大絕招吃第二次就沒這麼痛了,反而可以用比較平淡的心情來聽大家分享。ptt GameDesign版上有大致的介紹,第一天 第二天

兩天聽下來,內容很全面。從找錢->成員->創意發想->開發工具->找發行商->上架策略->行銷->上架後改版->下一個遊戲。全部都有提到!

以下就找錢、創意發想、行銷三點來簡介。

找錢

AppAbove Games 有在贊助新遊戲開發經費,之前因為公開徵選太耗時耗力,目前只接受私人投稿。


Kickstarter & Greenlight
傲逆的C-Wars在kickstarter上面獲得300%的募資,講了很多kickstarter實作上的細節,像是:
  • 必須要有個在美加英新澳的公司或聯繫人,有公司最安全。聯繫人的話要值得信任。
  • 初期行銷平台用社群網路,論壇除非你有重量級的帳號,否則不要用論壇。評測網不要找,等遊戲上市後他們自己會來。
  • KS一定要拍影片,影片要有特色。像他們把所有成員像素化、成員用各種語言、最後傳達他們是本土純中國人團隊的訊息。
  • KS最重要的是建立backer和遊戲間的連結,影片要有故事性。
  • 一定要和玩家互動。
  • 玩家專屬道具可以提升友好度。
  • 不要作實體獎勵商品(如T-shirt)會很累
  • 不要吝嗇設定超額目標,有些backer就是很愛投

創意發想
所有開發者都有提到,這也是開發遊戲時最難的問題。

片岡陽平說遊戲要有故事性與獨特性,讓遊戲跟玩家的一部分作出連結會比較容易接受在製作Tokyo Jungle時結合了animal和ghost town這兩個元素,animal和ghost town都是常見的題材,同時存在就還蠻特別的。

或者是作自己本來就很喜歡玩or很擅長的遊戲,像雷亞出的一系列遊戲全都是節奏感很強烈的。


行銷
遊戲市場已經是紅海了,除了想出厲害的idea外,如何行銷也很重要,這兩天聽下來講最好的應該是Aaron Isaksen,這是我那場記下的心智圖。


實踐上Alexander Bruce舉了很多例子。他開發Antichamber花了7年,在行銷方面,他:
  • 不停參加比賽,累積知名度。期間也不停失敗不停修正。
  • 花了三個禮拜,就只為了想一個跟遊戲內容相關又好記的名字
  • 2012 IGF時獲得很多報導,是因為之前就跟那些記者聯繫好了
  • 花了三年在想要怎麼介紹這個遊戲(最重要)
  • 選上市日時避開大作避開12月,延到一月
  • 獲得TotalBiscuit報導後,請TotalBiscuit延後刊出,因為希望在上市時同時出現刺激買氣。
所以上市7小時就變成steam第一名。看到他精算了這麼多努力,就知道他的成功絕非僥倖。

如果重新開始學iOS,我會建議....

先自我介紹一下,我從iOS4的時候開始寫app,期間寫過10幾個案子,大概作過這些:
  • 品牌app代工
  • SMS串接
  • LBS應用
  • 2D遊戲
  • VOIP、聊天室
在學習的過程中,運氣很好遇到許多朋友一起學習、也有很多前輩不吝分享,這段時間,也走了很多冤枉路。如果我重新開始學iOS,我會建議:

前半年
  • 一開始不要看iOS的書,應該要看ObjC的。先搞懂ObjC裡面的OO怎麼作,學會繼承、封裝就夠了,多型之後再說。學完ObjC再看iOS。
  • 背基本語法,像是NSString、NSArray、NSDictionary、NSNumber的語法都背下來,不管哪個案子都一定會用到的。
  • 先學會刻UI,這是一切的根本。一開始可以全部都用storyboard完成一個案子,之後要學會和xib混用。(光這條大概就可以練半年一年了)
  • 不小心寫到遊戲的話:ㄜ....熱情會支持你完成所有事情的。翻出高中數學、線性代數還有微積分吧!
  • 定目標,有目標才有動力。:像是「半年內看完市面上所有iOS教學書」或者「要寫出十個app上架」還是「每個月寫一篇slide」之類的都可以。
  • 寫第一個案子的時候,先求能動、不要管design pattern。
  • 寫了三四個月以後,再把一開始寫的code拿出來笑一下。這個時候再把多型練起來。
  • 學會用block還有memory使用(雖然arc很方便,但也有一些用了arc就必死無疑的狀況)。
  • 要用到thread 如果不需要cancel就全部都用GCD,盡量不要用operationQueue。
  • 最重要:卡關的時候要知道那邊可以參考,可以參考這篇<每天都會看的iOS 論壇/部落格>,加feed每天追看個三個月就差不多趕上最新趨勢了。這些文章內容一定有很多是現在開發的案子用不到的,但是如果哪一天需要用的時要知道去哪裡找資料。
半年後,比較進階的
  • 開始學design pattern,嘗試在案子裡面使用,但要記得design pattern 是選項,不是必要。
  • 開發之前預先想好哪些東西可以模組化,模組化的東西其他案子也可以用到。考慮到規格變動的可能性,先想好app架構再開始開發。
  • 要學會跟PM壓時間。事情作不完就看看有沒有同事可以幫忙,不行就看看能不能改due、再不行就分階段驗收、再不行才加班、加班發現解決不了就workaround跟他拼了。還不行就只能跪客戶了XD。(有的PM會把加班當成事情作不完的第一選項,需要溝通
  • 看WWDC session video,session speaker大部分都是framework作者。所有iOS教學書的來源都是官方文件,再加上作者自己開發上的心得,很多書都只是把session英翻中用自己的話講一次,看過影片就沒必要買書了。
  • 參加聚會,多參加幾個就會發現除了apple這世界還很大。
長期努力目標
  • 組讀書會,這需要主管支持才辦得到,找一些不是特定語言的書跟其他同事一起討論。像是<Code Complete>、<Clean Code>、<Pragmatic Programmer>、<浮現式設計>、<高效程序員的45個習慣> 這幾本都還蠻適合的。
  • 吃飽閒閒的話,可以參加HPX讀書會,從UX出發,會看到一些跟設計、心理學有關的書。
  • 把code寫得像apple sample code一樣。
  • 去hackthon,這需要找到隊友才去得了。簡直就是精神時光屋,跟2 300個人一起熬夜寫程式壓力有夠大。近距離觀察神人發光,無價。
  • 分享,寫slide或寫部落格,趴數提升後試著上台分享。優點應該不需要再強調,通常這就是思緒重新整理的時候,也可以知道自己到底是全部了解還是只懂自己有用到的。







Yahoo Hack Day 2013

去年回來的當晚,很高興寫了一篇心得文,雖然是倉促寫出來的,不過現在看起來,還是當下的感覺最強烈!回來的當晚一定要寫些東西,現在寫出來的東西是最重要的。所以來吧~~

剛剛從今年Yahoo Hack Day回來,今年也是和同事組隊,不過年中的時候我換了公司,所以除了我之外,其他三位成員都是第一次去Yahoo Hack Day,好像也是第一次去Hackthon。Calos 、Kevin寫backEnd,我跟以鑫寫iOS,以鑫是我主管,來玩的。

這一年來我參加了很多conference,去了一些Hackthon,連Yahoo也來了好幾次,所以今年完全不緊張啊。一直提醒隊友接下來會發生什麼事,淡定面對所有凶險。


這次我們的作品是Travel Hunter,沒錯,就是很老梗的地圖打怪。

這idea去年在Windows開發嘉年華的時候就用過了,當時是叫文青地圖,不過當時全部都是假資料,code也不是我寫的,跟同事在討論題目時,提到要作這個時,其實有種想用自己的手把剩下部分完成的感覺,而且要串好幾支API,完成一個遊戲,其實有點硬,如果在平常上班作的話,大概會花1~2個禮拜吧。

這是這次的作品連結~



source code :
backend : https://github.com/tw5475/yahoo-hackday
iOS app : https://github.com/Hokila/Travel-Hunter

其實我很多地方都沒做完,甚至是用寫死的東西。
但是最重要的戰鬥系統全部都有做出來,這也是我第一次用UIKit來寫遊戲,活動結束前半小時才加上音效跟被砍會晃動效果!!

戰鬥畫面demo(有音效)
後半部是在demo bug,連按就會出現

一個晚上寫好一個遊戲,也不是第一次做了,以前不會估工時跟PM壓錯deadline的時候就做過一次,也不小心待在公司看日出,但也是距今快一年前的事了。

過了這陣子的安逸,這次除了要串好幾支API,還有幾個除了遊戲的小feature,原本以為會開天窗的,結果發現有些事真的是想做就做得到~
一如我一開始規劃妄想的一樣,搞定!


工作分配

這是我最失敗的一件事,我怎麼會找了兩個公司內最強的backEnd,然後作一個client端要做很多事的東西呢!

照他們的能力,應該是我只要作個trigger,然後後台就開始作big data分析,音頻分析、圖形辨識之類的,然後把結果show在client端就好!

寫完結算的時候,Kevin說他們backEnd所有code加起來大概300行....
client端大概寫了1000~2000吧(吐血

工作分配不均的結果,就是Calos 早早串好api,給Kevin整合完就沒事做了。以鑫幫忙寫了個頁面、然後就回家帶小孩了。

印象很深刻的是,禮拜六晚上8點半寫完除了戰鬥以外的其他頁面,買保險第一次commit。Kevin很無聊的開始畫圖。

10點Kevin畫完所有戰鬥需要的圖,開始睡覺。

凌晨一點把Kevin挖起來叫他改api(還限半小時改好),題目的答案排序每次都是亂數,改成backEnd來做,因為我連寫12小時已經不想再算數學了。

Kevin醒來,開始炫耀Ruby的奇怪function,說這我10分鐘就改好了。
我去上個廁所,回來竟然真的改好了。

Kevin沒事作,我快暈倒了。我們開始pair programming,雖然我們語法互相看不懂,但是邏輯解釋一下也是會懂的。

pair programming的威力真是太強了,尤其在需要連續好幾小時專心時特別有效,好幾次都想要休息一下的時候,一想到旁邊有個人在看,就想要再堅持一下。一直堅持下去,一個個小功能也接著完成,凌晨四點終於寫完,開始睡覺!感謝數學小老師曹沖桌遊社永遠的內奸Kevin的協助,提供一堆數學公式,沒有他我至少會寫到八點。

6點8點10點各醒來一次,一直改小東西,10點大致上恢復體力,加上被攻擊會晃動的效果,還有音效!遊戲果然就是要有音效,突然就變得好玩很多!

如果還有下次,我會仔細頻估工作分配!!!!一定把backEnd弄死

有趣的作品

跟去年一樣,使用yahoo自家的hack day平台,今年所有作品在這裡
有的作品很明顯不可能是24小時內完成的,比較像是事先寫好各種module,24小時把他們組裝起來。

得獎的作品裡,g0v的就不用說了。萌典簡直就是來炫技的,這種作品不給他們得獎實在是蒼天無眼。看他們的git commit數高達144次(現在更高了),我一個案子做一個月可能都不到144次,實在太誇張,成員應該都很習慣極速開發了吧。

g1v的立院影城,很明顯會受到市府官員的嚴重打壓,好在拿下最佳人氣獎。

另一個也是打政府臉的油電雙掌,很可惜走的是跟g1v一樣路線,而且更沒實用性。要是沒有g1v,最佳人氣獎會是他們吧!


這次看到了很多各conference的講師、業界團隊、或去年得獎沒得獎隊伍捲土重來的。認識的當然看臉就知道、不認識的看看git owner的資料大概也可以猜得出來。

如果我沒看錯記錯的話,最厲害的就是Polydice,去年拿了兩個獎,今年又拿了兩個,YA TAIKO! 很明顯是在嘲諷Yahoo Mail垃圾郵件太多,超好玩的,我刪了好幾封垃圾郵件呢!去年也有朋友做了類似app,Yahoo願意頒獎給他們真的很有風度。

ARTOUR 旅遊行程規劃加餐廳推薦,類似的作品看過很多,今年也有Travel Together 揪團去旅行 作一樣的東西,ARTOUR多了餐廳推薦。
兩次都得獎實在太誇張了,如果哪天Polydice要上櫃我一定買他們的股票。真的。


FotoFlick
這是我心目中的第一名,非常實用的一個作品,划一下就可以備份照片,簡單操作、也打到痛點。成員都是Cardinal Blue的人,每次Cocoaheads聚會都在他們公司,成員見過好幾次了。這次他們也派兩隊,另一隊
PHOTOO7好像臨時換題目,應該是有參考了一些Pic Collage的功能。加上demo有點失誤,可惜沒得名。

Flickr Land 難得UI比程式搶眼的作品,可是source code抓下來是空殼。大概得獎後就懶得commit了吧。

Chatbar 另一個我覺得很可惜的作品,可惜的是野心太大,想一天做出個即時通訊軟體,結果端出個四不像,沒有解決什麼問題,也沒有什麼亮點。







MOPCON

這兩天跑去高雄參加MOPCON,而且還投稿。大約是在半年前,偶然看到mikimoto寫的Mopcon 2012 回顧與展望,裡面一句:

我當app開發者這麼久,我發現一件事,通常使用者不會report crash,而是直接給一顆心評價

看了很有感觸,加上參加cocoheads一年多聽到許多朋友分享的工具,就很想一篇與crash有關的slide,原本是想要用在公司內教育訓練的,但當時主管更希望我講其他題目,所以這篇就一直pending沒有完成,一不小心就過了半年。兩個月前看到MOPCON 在call for paper就想這題目應該可以講夠久,40min應該不是問題。加油添醋了一番投了一篇讓你的App優雅的crash三部曲最近的習慣是slide裡都要偷渡同事照片,這次把彼得潘放在33頁。


雖然平常在聚會講過好幾場,但是第一次講conference,內心還是有點小緊張,一直覺得什麼地方沒有做好,會不會講得太簡單之類的,早上搭高鐵過去的時候還在加東西,完全沒有rehersal,結果講太多iOS的東西,沒什麼共鳴,上台後才發現MOPCON來了很多學生,早知道我應該多提些跟學生有切身經驗的東西,像是做專題、做研究vs做案子、戰學校之類的。現在想起來,起承轉合裡面,承跟合的部份還可以做得更好!不過結束就結束了,下一場再努力吧。

以上是第一天當speaker的心得。

第二天壓力差很多,純粹是當觀眾認識其他人的心情過去的,參加過幾場conference,我覺得去現場跟在家裡看錄影最大的差別是:

參加conference除了聽厲害的演講外,更重要的是「互動」。QA的時候發問、平常遇到的時候聊兩句、資深的引導資淺的。會來conference的講者都是很願意分享才來的。 

我想只要不涉及商業機密的問題,問什麼都可以獲得解答的吧!

如果只是聽演講,那幾個月後等slide釋出,影片出來不就好了,還能想看幾次就看幾次,這次從幾位朋友身上得到許多啟發實在受益良多(這句好矯情)。一般conference會有的irc這次MOPCON也有,而且每一廳還有紀錄組即時把發生什麼事po在irc上面,有一廳的紀錄組甚至做了每場talk的心智圖,真是太聰明了。

小崇 (olli wang)(王老師)的世界迷霧


第二天結束的晚上有講者晚宴+慶功宴,很可惜的是參與的講者並不多,只有zonble、Neil、awaw跟我去而已,應該是隔天禮拜一要上班的關係,有好幾個都是從台北下來的。

席間聽到jserv老師講說他成為自耕農的故事,實在很感動。想不到這世道還有這種熱情奉獻的好老師。


也很感慨自己在大學為什麼沒有遇到這種老師、為什麼學校有開創業課自己竟然沒有去修、大學的時候到底在幹嘛?

接下來就會想到自己能幹嘛?能對現在的學生作些什麼?以下隨便想想
  • 捐錢給jserv買設備。(經費往往都是大咖教授拿去這有待過學校的都知道)
  • 鼓勵學生參加聚會(會來的就是會來,不會來的應該死都不會來)
  • 直接去學校社課。(這還蠻可行的,但是要去哪?)
  • 去學校演講。(去過一次,但是就沒有後續了,也沒學弟跟我聯絡)
  • 去學校app課幫忙當助教(寄信給x大開該門課教授,說要找我去但是後續沒下文)
  • 聚會提供學生免費保留票(沒做過,好像很可行,尤其是像一些秒殺的聚會)
趁自己還沒結婚沒家庭壓力的時候,這些事想做就可以做。也該從接火把的人變成丟火把的人了。


另外,前輩指點了些技術發展上可以努力的方向,應該是這兩天最大的收穫吧!開始有很多書想要看的感覺,要開始閉關了。

Cocoaheads Taipei 2013.10

這次的聚會是我參加cocoaheads以來站最久的一次,加上前一天上拳擊課,對打的時候被揍了好幾拳,隔天超想請假的。

因為八月底九月初的時候聽了Taien的Android app security還有Kevin的IAP 第三方驗證,聽完想了想,還沒有聽過iOS security的題目,之前作過的案子,每次都喜歡用稍微不同的方法做出一樣的功能,再加上最近這半年接觸了enterprise級的app,就把自己用過的防禦方法大致上介紹一下。





分享前一天晚上在家裡錄的


這次的重點是在防禦而不是在攻擊,只是要防禦之前要先知道可能會有哪些攻擊手法,所以簡單列了一些工具。

在講http request/response那邊的時候,台下有提問說為什麼要這麼麻煩,直接用SSL就好。我的想法是:

這是賭一口氣,就算沒有用SSL也要讓對手看得到吃不到,也是種火力展示。 
有些步驟不單單只是加密,而是把資料簡化,減少傳輸量。

當然要作到更誇張就是只開TCP連線,再加上定義好的flag簡化傳輸資料,精簡到每個package都錙銖必較的程度。

在我講完之後,後續也聽了好幾個犀利的talk,尤其是在安全性上面更進一步講解,可惜是live demo,沒有投影片,這也應該是在座20幾個人才有的福利吧。




Build app support PIE

Position Independent Executable(PIE),也叫 (Address space layout randomization),可以避免buffer overflow attack,防止對已知記憶體位置作攻擊,重點是前幾天上架時iTune Connect跟我說我的app不支援PIE不可以上架,會有這問題是因為我們的library是很久以前build的,沒有支援PIE,重build就好了。

iOS 在4.3之後開始支援,Android是在4.0,根據 QA1788,只要確認這幾個設定有設對,build出來的app就會有PIE,新開的project預設選項都有開。






看到app的flag裡有PIE就成功了
$ otool -hv /path/to/MyApp.app/MyApp
MyApp:
Mach header
magic   cputype cpusubtype caps filetype  ncmds  sizeofcmds   flags
MH_MAGIC  ARM    V7        0x00  EXECUTE    23        2372     NOUNDEFS DYLDLINK TWOLEVEL PIE

當然,攻擊時要把他拿掉也是可以啦XD

reference:
WIKI-ASLR
iphoneWIKI-ASLR
废除应用程序的ASLR特性

稍微去了一下日月潭

員工旅遊,跟同事去住日月潭玩,住雲品,大膽猜測是因為訂不到涵碧樓的關係。
雲品跟涵碧樓一樣貴,要不是有旅遊補助我才不會去呢!

全部的照片

與紙箱王的賈伯斯合照


從飯店看出去的樣子 

 晚餐的buffet吃到飽,真的很好吃





從飯店check out以後去開電動汽車,越做越好了,爬坡的時候也很有力,完全感覺不出來是電動的。


不過這種事還是玩玩就好,繞日月潭一圈大概一小時,我還有走下來逛逛,大概開了一個半小時,簡直就是去日月潭練車的嘛。

Google 行動開發高峰論壇 2013 &Android Taipei 9月份聚會

上個禮拜接連去了這兩場活動,一些紀錄如下。剛好辦在同一天,請了天特休,整天在外面跑來跑去,其實有點累,影片上傳兩次才成功。

雖然我是寫iOS的,但是Android也是mobile的一份子,許多設計理念都是相通的,一天聽下來,聽了許多Android有但是iOS沒有的東西(像是upstream 的notification);相對的,在這次WWDC iOS7更新裡面也有很多功能是iOS有而Android沒有的。(這可以舉的可多了)

以下摘自當天寫的note

不管寫iOS還是Android 大家都是用MAC喔 >.@

此風不可長


overview
jelly + ICS = 63%
現在支援 alpah + beta test,還可以設定要 adoption多少percent user

google play service,其實就是個APK
第一個功能:google map API v2

location APIs
geofencing:設一個geo 的fence,離開時吐notification給app
activity regnition:看是在開車走路還是腳踏車(絕對不是只有判斷速度這麼膚淺的招式)

notification,new upstream notification,手機回傳給server

支援game的cloud save

clip時觸發區域可以不用是方形的了

Android 4.3
BLE low energy api support
multiple user 使用者權限管理
OpenGL ES 3.0
media enhance(自己看spec)
UI automation test


Android UI design pattern
reference:
1.google.com/io
2.Android design in action

簡單介紹一些design pattern
新招:action bar
還不會用的快去學

navigation可用這些
  • spinner
  • fixed tabs
  • scrollable tabs
  • navigation drawer (啊不就是隱藏側邊欄)

navigation drawer 打開來的時候action bar 不應該有任何移動

developer.android.com/design/patterns

密 unofficial design patterns
1.fading action bar
scroller 的時候action bar 變透明
ex google music

2.swipe to refresh
ex:gmail

3.action drawer
右邊跳出來

4.cards

responsive design :Android的痛

if use "android:layout make-present"
phone->pad ,app會跑版,多出很多空白
請作一個layout給平板
要用fragment!!!

起碼要有3套layout:手機,7" 10"
android studio有一些default template
ex:Master/detail flow

SlidingPanelLayout: open source ,download gogogo

新作的 Holo scheme,OEM不可以改動

settings flow menu

Your branding + Holo = Your app
Holo scheme 會不會影響branding的樣子
  • information design:畫面上的design
  • interaction design
  • visual design: 品牌設計 UI設計
在interaction design的時候要作大部分android都習慣的方式
ex :back button要有用,所有非遊戲app應該都要有action bar

visual design的時後可以作自己的特色or 跟Holo一致

Example:
  • good: 在phone和pad都做optization
  • fence
  • expedia 
  • what's app 原本沒有follow design guideline,follow之後download數增加了
  • TED

How to get "not" featured

kyunghwan Min (Korean)

great store listening,include 
1.information icon
2.titles
3.screen shots:No device image
4.description
5.feature graphics:No device image again!

#1 worst Newspaper app
1.No feature graphic
2.Icon round corner above 15% 長得很像apple store上面的app
please no more than 5%

3.use apple's share button in android app
4.label back button
please hardware back button
5.when click back button:ask "do you want to exit?"
when there is no back view,after click back button ,just go to home screen directly

another example:
1.a functionless action overflow key
2.non-android products in description
寫了一堆在App Store得獎的description,寫說可以跟iphone sync

3.most coommom mistake
用了iphone或ipad in feature graphics

Google Play Publishing Best Practices:

會遇到的各種問題(跟寫程式無關的)

resources:
1.android development support help center(最近要改版了)
2.Merchant payment support Help Center
3.Technical&API level support 
有教學影片,討論區
4.play user support help center

developer console,是developer應該不陌生
chat support channel
real time human service,晚上code不會寫可以打這個,當作練英文也可以

有讀過 content policy請舉手:只有5%
違反時會怎樣,知道的請舉手:幾乎沒有!!(啊不就是下架停權)

每天有?個submission(包括new app和update)

我們不像a公司要審很久,Android一下就過了喔!(a = apple)

有看過app policy help resources請舉手(只有一位)

Most common type of violation
1.keywords Spam
2.IP,用別人的branding Ex:google ++、g00gle search
3.sexual contents
4.AD:把自己偽裝成system alert、part of application 
5.引誘user rate app and reward user

payment一定要用google wallent
不可以偷偷蒐集user data
不可以導到非google play的store下載apk

Google cloud platform




GCM,Google play Services & Location APIs 

不管是寫iOS還是Android,只要是寫mobile的都應該看一下這篇



===
晚上去這個月的Android Taipei
一個Android app都沒寫過,我是衝著柏齊去的,順便參觀一下EZtable,不虧是近幾年衝很快的startup,從工作環境就可以感覺到他們的企圖心。


我好像把他拍得有點淫蕩

標語蠻震撼的,要看每個人是怎麼定義coding時間的。
我扣掉開會回email想架構還有看別人code的時間以後,自己coding應該是不到五小時啦


 很團結的cardinal blue,穿一樣的衣服一起出來就很有氣勢
上面的「野心」也不錯,如果是大陸公司的話也許會貼「狼性」

柏齊在前面分享Android自動化測試

雖然我是在活動前兩小時才報名的,也有我的名牌,實在是有點感動。
這也給接下來要辦的公司一點小壓力,出場地出食物竟然還有名牌!

我在接案公司的日子



在cocoaheads Tapiei 七月份分享的投影片,趁這幾天中秋連假,把一些小地方修一修。當然有些隱晦的字句都把他拿掉了。

這篇大概是在五月初的時候就差不多做好了,差不多半年過去了。
好久,剛剛我還以為這篇是我上輩子寫的。

我一直都有作紀錄、寫日記的習慣,一開始我只是想把在前一家公司接案時期學到的遇到的整理一下,不知不覺就這麼多了,不管哪家公司都一樣,一陣子過去了一定會大轉變,可能是轉型、可能是擴張、可能是被併購、也可能是跟別人合作。不管怎樣,半年已經是個夠長的時間,長到什麼事都有可能發生,我也不再是個小屁孩了(雖然心態上還是)。


開發者應該如何面對iOS 7?

標題用問號結束,是因為幾乎每天都聽到有不同的解法。下面來作個整理,比較一下看到現在apple官方、開發商、開發者對於iOS7出現做的各種應對。



apple對於iOS 7的說明,在iphone 5 的64bit架構出來後又更新了一次,不管是開發者還是UI/UX/UED,都可以找到需要看的文件

對於一個開發者基本要看的是 Xcode 5 release noteiOS 7 diff,雖然我看完了,但很多地方看不懂,還在重看當中。

根據三個月前的iOS 7 beta1,首先看到的是UI大改,所以首先需要解決的問題是客製化UI在iOS 7上面會亂掉的問題,只要是Xcode 4 build出來在iOS 6上面跑得好好的UI,基本上在iOS7上面都不會有什麼問題,大部分的app可以用這招先檔一陣子。但是同一份code在Xcode 5上面build出來以後,看到的大多是慘不忍睹,像是navigation歪掉,tableView Cell改變。我的建議是,先用Xcode4 把iOS7上面有問題的地方修好,出個iOS7的版本,先稱一陣,這段時間趕快用Xcode 5 把有問題的地方都修一修。這樣是為了怕未來上傳 app的時候需要支援120x120的icon,但是120x120的icon一定要Xcode5才能加,等到我們所有上架的app都必須用Xcode5以上才能上架,到時候再解已經來不及了。

在同一個app內針對iOS 7有什麼問題的地方作微幅修正,這是最簡單的作法,也是最省錢的作法,相信大部分台廠老闆都會選擇這招!比較有心的團隊會在iOS 7還在beta版的時候就開始修改,我待的團隊在iOS 7 beta 5的時候開始投入,解了10多個UI上的問題,全部都是客製化UI才跑來的問題XD。接案公司或者app製造機,一定都是等客戶靠北以後才會改。

我在上個月一篇放棄iOS6 直攻iOS7? 裡寫說我看到的其他人作法,有很多是盡早使用扁平化設計,這樣等轉換到iOS 7時,使用者在使用app跟離開app後看到的是一致性的設計語言,這也提高了app在手機內的存活率。先在iOS 6的app裡面作防範,這並沒有解決app在iOS 7會跑版的問題,所以、大概有這幾種選擇!

incredible solution for support iOS 567

  • 我們最先遇到的問題就是view的原點從status bar下面變成最左上角了,根據這篇使用 Interface Builder 設計 iOS7 Layout 並與 iOS6/iOS5 相容,我們看出來可以用autolayout來輕鬆解決原點跑掉的問題,但是仔細看看這篇文章就會發現只是作一個簡單的View就這麼麻煩了,像是大變動的tableView跟datePicker要怎麼辦!
  • 所以我比較喜歡這種,作兩隻app,然後順便加新功能!當然舊app也要正常運作,iOS 5 6作一支,iOS6 7以上用另外一支,最著名的例子當然就是Reeder 2,我猜他們在iOS 7 beta 之前就已經投入開發了,看到iOS7以後毅然捨棄support iOS 5。不過這招會牽扯到商業策略的問題,不是開發者可以單獨決定的,除非原本的app在iOS 7上面bug實在是多到爆炸,否則正常公司是不會使用的。

來自官方的幫助

apple不是笨蛋,也知道開發者都很懶惰,不可能使用者18號升級,開發者就馬上提交新版本,所以幫了兩個忙。

一是可以下載舊版app以往當我們的裝置是iOS 5但是app最低支援版本是iOS 6的時候,點 了下載 AppStore會說不可以下載。現在只要app之前有支援iOS 5的版本,就會讓你下載該app支援iOS 5的最後一個版本。相關文章可以看這裡這裡

圖來自pcmag

第二是加速app審核速度,這兩天在討論版裡面,都可以看到很多開發者朋友體驗到尊爵不凡的review速度,兩天一天甚至15小時一小時通過review的都有




說好的coding conventions

一人開發團隊是不用訂什麼coding style的,但是當程式越寫越大,越大越複雜的時候,一致性的語法就很重要了。

最近這幾個月都在做project的merge,原本維護的案子是一個與世隔絕的專案,現在要用其他專案當作base,使用同一批檔案來搭建出一樣的app。簡單來說就是大量的refactor,能用繼承的地方就用繼承,如果某些功能A專案裡要有B專案理沒有,那就用override的方式。兩邊一樣名字的function作不一樣的事。參考了base project的coding conventions來改寫,三個月過去了,只完成了UI部分,data model還有很多地方沒有完成。

這幾個月的經驗,我才搞懂很多之前自以為是的觀念,像是繼承、self、delegate、block、catagory、run time debug,這些零零碎碎的東西。也再一次體驗到好的design pattern讓你上天堂,不好的struct讓你想殺人。關於怎麼把程式寫得像是語言這點很多書裡都有講,我這裡想表達的是coding conventions。

列幾篇關於coding conventions&coding style的文章:

Coding Guidelines for Cocoa
官方的不看可以摔鍵盤了

Google Objective-C Style Guide
google也來參一腳,跟apple的很像

NYTimes Objective-C 編程風格指南
NYTime團隊自己的定義,很多細節

几点 iOS 开发技巧
這不是coding commention,而是refactor module架構時要注意的事,看完這篇有種「對、我就是這樣做的」感動!

稍微去了一趟澎湖


連續兩個禮拜都在社群活動(coscupiOS bootcamp)裡度過,禮拜五事情做完實在很無聊,想想這個禮拜又要這樣過去了。快下班的時候突然想到我有兩個朋友好像在徒步環島,上FB問他們發現正在澎湖,禮拜六晚上澎湖又有演唱會,好像還不錯。就買個機票吧。

禮拜六下午原本計畫是要去 Code for Tomorrow的活動,但是這樣飛機就有點趕,只好放棄。隨便在忠孝復興這邊買三罐啤酒就去搭飛機了。不然我是想買義美布丁的

真的很快,一小時就到了。把啤酒拿給他們的時候酒還是冰的。



晚上就跟steve還有luke在隘門沙灘喝酒聽陳昇打嘴砲,陳昇真的很好笑又很敢講。一直講前年來澎湖表演尾款還沒收到的事。

禮拜天早上要出發了

七美,簡直就是黑傑克的家

看看這個海這個天空

左邊那個是Nikon 右邊是Canon

課本裡的雙心石滬

澎湖到處都是仙人掌產品,仙人掌冰沙、仙人掌汁啦!
路上看到野生的仙人掌隨便摘

世界最美麗海灣不是叫假的
因為其他海灣都被污染光了

望安的海灘,跟墾丁藍灣一樣大一樣漂亮
但是一個人都沒有

禮拜一早上9點搭飛機回台灣,睡太晚,不然原本想天亮起來去海灣游泳。出發前到鄉裡的市集買早上剛捕上岸的小管,都還是透明活跳跳的,回台北後直衝公司。澎湖這麼近當然是想去就去啊,一個小時就到了怎麼可能沒時間。

下次來挑戰早晨在外島游泳、下午在誠品看書、晚上在夜店開趴。

iOS Boot Camp 心得

找到的活動紀錄

FB hashtag 
twitter hashtag

側拍照片

側拍影片



報名網站

Cocoaheads
Registrano 有20%的人寫我不是開發者,還好有統計!

緣起

iOS BootCamp其實是iOS Dev Camp的改版,之前社群的朋友提過說要跟國外連線辦iOS Dev Camp,一個三天不過夜的hackthon,很可惜台灣剛好遇到颱風,等颱風走了,也失去連線的意義了。

乾脆來辦教學營!
原本的名牌長這樣,寫自己關心的三件事


以往在每個月的cocoaheads的聚會,每次都有很多人分享自己的作品,或是自己開發上的經驗分享。可是在學習的過程中,最缺乏的是帶著我們的mentor,很多公司的作法都是由案子來學習,「兩個月內完成就對了」,你有看過沒寫過objc的畢業生,上班第二天就被assign一個案子的嗎?(第一天是認識環境跟設定系統),然後老闆肩膀一拍,「就交給你了」。


如果同期進來的同事很多,那還比較好一點,一起菜一起不會、一起奮鬥一起加班。沒人帶沒有訓練課程,案子還是一直來,那就只能靠自己了:跟公司請款買書、一起辦讀書會自救一下,經過幾個案子的洗禮,才覺得自己似乎懂了一些東西。這就是我之前過的生活。

如果是單兵作戰的話,就算寫了半年一年,還是會覺得自己弱弱的很多觀念都不會啊!!!
在cocoaheads的聚會中,認識了很多這種朋友。

Lab與Workshop 

這次的活動,jamie提出要在下午加上workshop的時候,真的是非常高興,一直以來都沒有mentor帶領,大部分招式都是從書或網路上看來的。終於可以看看別人是怎麼訓練新兵的了。下午的workshop,如果沒有zonble的幫助真的辦不起來,KKBOX的訓練課程是我看過幾家公司裡最完整的。


pair programming的概念之前有看cubie的朋友提過,他們是full time pair,後來也看了一些pair的文章,自己在上一份工作離開前跟同事交接的時候也玩了兩天的pair。這時候一定要提一下Splashtop personal,一台裝streamer 一台裝mac 版的client,就可以享受比teamviewer 10倍快的傳輸速度,我之前做pair programming就是靠它,mentor還可以開多個視窗查資料,因為用太爽乾脆直接加入。

影片是用ipad操縱,但實際上用mac也可以操縱。加入後才知道用Android 也可以,買了CSG以後PC功能完全解封。下次應該跟公司拿幾個免費account來promote。



Lab的概念是EV提出來的,我也是第一次知道WWDC Lab的運作方式,跟正牌的Lab相比我們當然有很多不足的。不過沒關係,我們有我們的玩法,在lab master跟device還有attendant都缺乏的情況下,EV一個人就可以搞定一切,實在是非常神奇!如果之後有更多的master參與,就可以針對不個主題開不同Lab,像是View、Storage、Network開不同Lab。


我的工作

這次的活動,我擔任主持人跟走來走去的工作,主持人其實沒什麼好說的,只要知道什麼時間該做什麼事就好了。重點是在跟大家互動的過程,跟大家討論基本觀念:像是setter getter 還是self是幹嘛的,在教的同時也學到很多,也有跟其他公司的朋友聊聊平常的開發流程、開發工具,踩地雷經驗分享。


有很多想法

這次的聚會我們採用了pair programming還有 workshop方式大受好評,一個帶一個的方式非常有效,根據這次的經驗還有大家填的回饋,下次應該會增加這兩項的比重。之前聚會OOBE提出的喝咖啡隨便聚也快要出來了。

看到zonble做的小遊戲,也想要把自己之前寫的特訓99放出來,剛剛看了一下,完全沒有MVC概念,改一下在拿出來獻醜。還有最近在refactor,用的一些工具Ash ligting talk有提到,整理一下加上這兩個月的心得再來寫一篇。

一步一步來吧。

媽啦這篇我在咖啡廳打了三個小時 =.=

放棄iOS6 直攻iOS7?

隨著iOS 7 GM的日子越來越近,越來越多app推出支援iOS 7的版本,

而且有個趨勢,很多人因為不想maintain兩套UI,乾脆把UI都改成扁平化設計,讓所有版本的畫面都長得一樣。現在

還在猶豫的開發者,或許可以從這篇文章得到一些啟示:
根據575份有效問卷,95%的開發者有支援iOS 7的計畫 (我也是)
重點來了,52%的開發者會放棄iOS6 ,最低支援版本是iOS 7



以下是我把文章中附檔轉成google doc的樣子,幾乎所有人都提到了tintColor在iOS7的行為不一樣。



這是美國開發者的統計數據,國內呢?根據app接案公司的朋友指出

鬼島有鬼島的玩法

老闆會想到app UI和OS體驗不一樣導致使用者體驗變差。幹!林北不相信。

都碼是客戶靠北才會改一下,要把原本的設計全部改成扁平化設計,不給錢誰會想做啊!
不過反過來想,這也是app開發者的好機會,趕快跟客戶提案,這是打敗競業的好機會。
等到9月中iOS 7 出來才發現周圍的同行一個個都改版才想到投預算已經太晚了!!

看看這些app,還不支援iOS 7嗎? 還不改成扁平化設計嗎?
這還是兩個月前的文章耶!!




coscup 2013 心得


這次搶票速度出乎預期,我只是忘記打電話號碼,第二次輸入的時候票就賣完了。
也因為每年都搶不到票、每年都在家裡看轉播,原本我是想報名當工作人員的,但是也沒搶到!連工作人員也搶爆了是怎麼回事。還好社群有一個主持人的名額讓我也可以進去。


主持人還蠻簡單的,幾句話介紹一下講者,偶而轉達一下大會的消息:light talk開始報名囉、light talk已經報滿了。唯一的小插曲只有Fred筆電螢幕解析度調很久,多花了5分鐘,也是唯一不是用mac的講者



會主持到penk那場真是個美麗的意外,不過既然都已經這麼熟了,當然要好好衝康介紹他,上台前閒聊penk說他沒甚麼內容:台下嘴砲的時候,原本是要我介紹講者10分鐘、penk講15分鐘、QA5分鐘的。


這場真是個災難,QA的三個問題都是在打臉,聽完我也才想到之前當RA的時候也做過類似的題目,那個時候是用分tribe的PSO來做,想不到會從penk口中聽到這麼學術的題目,真是始料未及。

g0v

flicker上面已經有很多照片了以往COSCUP主題比較多是自己寫OS、輸入法、各種語言介紹之類的。今年open data大鳴大放,尤其是g0v,講了很多進行中的專案,像是萌典福利請聽,都是發生在身邊四周的事情,非常有感覺,聽了有以身報國的衝動,回家馬上開irc看有甚麼可以幫忙的。

收穫

今年八軌同步,100多場session,有很多session沒辦法聽到,而且休息時間也很短,在趕場的時候議程就已經開始了,跟幾個朋友分頭進行,沒聽到的只好等錄影出來再補完了

參加coscup除了可以遇到很多傳說中的人物外,更重要的是可以跟他們互動、聊聊天問問題甚麼的,這些是看轉播無法得到的。遇到的幾位前輩,都很謙虛、但也都很熱情,寫程式對他們來說似乎已經不是一種技術、不是養家活口的工具。而是一種態度,「我寫故我在,我在所以我寫」、「開站一時、開源一輩子」,參加完這兩天,技術上其實沒甚麼收穫,比較多的是心態上的改變:
  • 專注某幾項讓自己活命的語言是本來就要做到的,但是多看看Go、 F#、C++ 11  這些新世代的語言可以讓自己看得更遠。
  • 幾乎每個月都有hackthon,g0vCoD也都有很多進行中的專案,想貢獻一己之力的話,去irc裡面問問都有很多事可以做。不然自己在咖啡廳辦一個人的hackthon也可以
  • 「寫程式改變世界」,連FirefoxOS都在call for patch了,只要去bugzilla看看有沒有什麼想解的bug,問一下有沒有人在解這隻bug,沒有人在解的話等管理員assign給你就可以開始上patch了。不然還有Ubuntu touch。
  • 把自己的open source的proj寫得完整一點吧,目標明年可以申請到開放源碼票!