《學徒模式- 優秀開發者的養成之路》心得







一句話簡介:
把一個軟體工程師從菜鳥到老鳥會遇到的問題都解決了。







這本學徒模式短短200頁,都用很精簡的話把複雜的問題給簡化,要認真寫的話應該寫個3000張都可以吧,他都是在教導程式人員建立在各種時期遇到不同問題時應該要有的心態,舉幾個我覺得有趣的:

1.一個SE要被升成管理職,這時候他應該?

       雖然有人說寫code只適合沒有家累的人來做,有家庭負擔以後還是變成architecture或是manager比較適合,但事實上是看各人調適都可以,只要找到適合自己的頻率,在那個位置都可以很快適應。一個SE要變成管理職,就是要選擇一條不歸路,一旦選擇管理職,就回不去惹,往後的職崖就得面對一堆會,要看的code會變得越來越少,到最後就會變成一個用嘴巴寫程式的人。而且在公司也沒有空碰新技術,對於技術的深度與廣度就停留在轉職前的認識。

2.一個充滿熱誠的菜鳥,找到自己認為找到理想的工作,但是身邊的人覺得你薪水太低,該怎麼辦?

        看到這問題的時候其實我就想到剛退伍的我,當時我也面臨要留在新竹還是台北的抉擇,很慶信我當初的決定跟書裡建議的一樣,而且驚訝的是連思考模式也一樣。
     
        這時應該要傾聽自己內心的聲音,「有些事,現在不做,以後就不會做了」。看重學習與長期成長的機會,而非慢慢增加各種技術,老闆雖然不能給我加薪,可是老闆會給我很多機會,讓我去寫架構、培養各種能力,像是技術分解、跟PM Art 溝通、估時程,尤其是估時程,這招實在太重要了,現在也還在學習當中。

3.一個不怎麼樣的菜鳥,該怎樣升級?
 
       很簡單,對工作充滿熱情。
有了熱情,就會願意去學新招式、願意與他人分享、在教學相長的過程中,整個團隊就會越來越強;更進一步的,會去參加各種網聚,和各種不同領域的人切磋,瞭解彼此的想法,在實做時就會站在其他同伴的位置上思考,把思考格局從個人提升到團隊。

4.我是某個領域的大師了,接下來應該在我最擅長的領域裡發揮就好了吧,學新技術是菜鳥在做的事?

        書裡舉了一個JAVA大師後來又去學RoR,二轉的故事。


這本書看了以後不會讓人程式功力變強,但是會建立正確的心態,很適合當作一本睡前讀物,每隔幾年翻一翻,一定會有新的感受。不管是緬懷過去、還是瞻望未來,這本都很有用。

有人要我列一下我心目中新人train半年應該要有的能力,我一併在這篇回答好了:
我覺得至少要做到這些:

  1. 對工作充滿熱情(最重要)
  2. 樂於分享專案上成功或失敗的經驗
  3. 會主動去問SE或同事不會的問題
  4. 要知道stackflow或相關論壇,知道怎麼下「正確」的關鍵字
  5. 能夠遵守已經開出來的時程,要能趕上進度 (雖然我覺得有點難)
  6. 對於不是自己寫出來的bug,要會去想產生bug的流程
  7. 不會被炫麗的技術吸引,而忘記客戶訴求的問題
然後是我覺得可遇不可求的

  1. 自己動手刻輪子
  2. 知道實現同一種功能的各種作法,然後選一個最適合的
  3. 替別人想要怎麼寫才會讓別人工作更有效率
  4. 在執行專案的時候就想到refactor ,何不現在就先拆module
後面四項我自己也在學習


     

graph api撈 facebook 相簿照片連結

https://developers.facebook.com/tools/explorer?method=GET

用graph api
粉絲團ID?fields=albums.fields(type,name,cover_photo,count)
會回傳一堆json

每個Dictionary裡面有
{
"type": "",
"name": "",
"cover_photo": "",
"count": ,
"id": "",
"created_time": "2010-11-:06:22+0000"
},

把type =normal 的顯示出來
然後再看cover_photo的編號去拿縮圖
實在很麻煩!

cover_photo的編號?fields=photos.fields(picture)
拿到列表,每一個dictionary裡面有
{
"picture": "",
"id": "",
"created_time": ""
},
picture裡面的就是照片的連結,要其他大小的縮圖必須要自己再處理一下

有三層graph api要parse 真是夠了


crash 得有意義

幾個跟crash時常見的後續動作

1.串flurry 的crash error
2.讓程序優雅的crash 先跳一句,我要crash囉
3.打開crash report 用dsym解析,這真的超難用的

結構模組寫得好清楚lifecycle,就沒有這困擾惹

Objective-C literals

雖然已經可以用了,但每次寫每次忘,記錄一下XD

array = @[ a, b, c ];
m_array = [@[ a, b, c ]mutableCopy];
dict = @{ k1 : o1, k2 : o2, k3 : o3 };
m_dict = [@{ k1 : o1, k2 : o2, k3 : o3 }mutableCopy];

char_number = @'X';
int_number = @12345;
ulong_number = @12345ul;
llong_number = @12345ll;
float_number = @123.45f;
double_number = @123.45;
bool_number = @YES;

客戶不給iOS開發者帳號,想要自己上架時需提供的檔案

   客戶必須先建好app ID(或稱bundle ID),選擇要不要推播功能,加入開發者用到device的UDID,然後產生出開發時和上架時會用到的provision,最後再到app ID裡面載下pem後打指令產生push server上面用的pem。每個檔案詳細說明如下:

1.開發者p12:有兩個
   分別是development用的跟distribution用的,一般來說客戶不給開發者帳號的都是公司帳戶,所以提  供的p12格式會像這樣,develop像是:developmentName.p12,distribution會長得像是companyName.p12。p12點兩下加入keychain,名稱前方要有三角形才是對的。

2. provision:有三個
a. provision  for development (例:appDev.mobileprovision)
b. provision  for distribution AdHoc (例:appAdHoc.mobileprovision)
c. provision  for distribution APP Store (例:appAppstore.mobileprovision)
3.推播設定檔案:有兩個,下載後需要打指令產生
a.push for development ( 例:apns_dev.pem)
b.push for distribution (例:apns_pro.pem)
指令如下
比如說要建立development 用的pem,要先有 apns-dev-cert.p12    apns-dev-key.p12

 openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12  
 openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12  
 openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem  
 cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem  

然後再做一次 apns_dis 的
(需注意同一個bundle id 只可以設定一個provision,設定兩個以上的話,推播會收不到)

最後再說明一次,開發者拿到p12 還有 bumdle id 名稱,就可以開始開發了
開發時用deveopment的provision 就可以把檔案builld 到允許的device裡,要測推播就把客戶給的pem傳到push server裡,就可以測試推播了。

程式寫完要給客戶測試,包成ipa後可以用testflight,也可以自己架個Adhoc的server。
客戶檢查後都ok,準備要上架了,這時要請客戶在iTune connect裡面建APP,打好一切資料,狀態變成waiting for upload以後。

然後分為兩種情況走下去:
一種是要給程式碼給客戶,那就把程式碼打包給客戶,客戶那邊使用Xcode Archive上架。

如果程式碼不用客戶,只需給ipa的話
用上架用的provision包出ipa,把ipa丟給客戶。客戶一般都會用Application Loader 上架。

補充說明:
很少有客戶會不給開發者帳號要自己上架的,我遇過的只有XX協會、XX市政府而已,他們的開發者帳號裡面有10~20個APP,同時有好幾個外包公司在執行他們的案子,為了怕外包公司之間彼此打架,所以統一都不給開發者帳號,而是由自己的資訊人員來處理app管理事宜。

Yahoo Hack Day 2012 心得

剛剛結束今年的yahoo hackday ,簡直就是吃喝玩樂之旅,雖然沒有得名,但是200多人一起團練,獲得很多經驗值、看到許多web 和mobile上的創意跟可能性,這次熬夜完完全全值得。


我們的作品是yahoo 請客+,hackday 上的連結在這裡,如果沒有辦法進去,簡介如下:


Description

透過Yahoo 請客+,你可以更容易認識新朋友、建立一段邂逅、與社群網站上失聯的朋友重新建立連結,另一方面,店家會大量曝光,快速提升知名度,帶來大量人潮,是社群網站和電子商務的完美結合 If you have this kinds of problems ,this APP can help you: 1.a lonely person want make friend but shy to take action. 2.a poor person want to save money but cost a lot on food. 3.a person want compensate relationship with loves,also make some surprise! 4.a store-owner want promote your store but lack of budget . Yahoo 請客+ provide a incredible combination with social-network and e-Commerce. more than 300 stores offer extremely cheap meals in Taipei everyday, which meal is free to 50% off. After launch app, you can search the nearest spot around you.Just a click,pick up a girl/boy from your Facebook friend list and our APP member list .After you friend receive and accept the invitation, she/he will post a message on Facebook feeds Wall like " WOW ,Mike just buy a spaghetti for me,Mint restaurant is so delicious ,thanks you ",make enormous exposure for the restaurant.



超強的設計Lex 馬上做出來的介紹影片

 


我一直覺得這是一個很好的idea,一次解決三個問題

  1. 認識異性、增加朋友間的連結強度
  2. 省錢
  3. 增加店家曝光率
可惜評審不是很喜歡,。我猜有可能是這些原因:

Yahoo 辦這個比賽的目的是要找出來自己已經有的服務裡面,有什麼可以再強化的,所以沒串yahoo API的直接GG,而且就算有串,但是沒有創意、沒有辦法幫yahoo帶來流量、幫yahoo增加曝光的,我想也是沒有用。

所以說,雖然我們有趴Yahoo 生活上的店家資料,但是這個服務做起來以後yahoo並不會是直接受惠者,所以要我是評審,我也不會把獎頒給Yahoo 請客+,但是作為一個商業化的prototype 應該蠻不錯的。

剛剛看了一輪今年所有的參賽作品,發現有幾種類型:

1.來火力展示的
    自己公司已經有一套服務上線,這兩天一頁只是把原有的服務再show 一次、在另外一個領域上發揮、或者是增加小功能之類的。這一類型的全部都沒有得獎。

2.作自己想要用的東西
   這類型的作品還蠻多的,共通點就是沒有用到什麼Yahoo的module,然後有解決一些生活上的問題,我們的作品就是屬於這類。比較可惜的是今年沒看到什麼惡搞的東西,或許是我在我們demo完後就無心看其他組的東西惹,所以其實有人有做但我沒有看到。

3.投其所好
   拿Yahoo提供的資料,例如:新聞、股市、天氣、知識家....,用圖像化的方式重新整合成另一個介面,從新的介面當中可以更容易的瞭解原本資料提供的資訊;或者是把原本Yahoo的服務整合其他平台的服務,像facebook Dropbox ,最後把使用者導到Yahoo這邊。
這一類的作品佔最大宗,也是有切到這次hackday比賽目的的一群。

4.來鬧的、或者說走錯路的
   兩天一夜中從零到有生出一個作品,但是沒有解決實質上的問題、也沒有用到Yahoo的module,也沒有讓任何人受惠、甚至是把一個簡單的功能變得複雜化。這類作品不超過五個,缺乏亮點,一般都沒有demo完,很像是為了hackday 而hackday的。以交作業的心態來參加非常可惜。

這次我們的團隊成員有

Moon :一天.....喔不半天就開完7支API ,然後接下來時間都老神在在的看小說打桌遊玩ipad,不虧是有經過facebook hackday洗禮的男人

Luke :白河style iOS 土台客 ,這樣寫會生氣嗎XD ,block達人,他寫的facebook module 超級無敵快搞定facebook,串各大社群平台都要成精了 ,整隻APP幾乎都是Luke在寫的,這樣還可以12小時就搞定一切實在是太神惹!

Lex:其實Lex是隊長吧,雖然Lex有一半的時間跑回公司去忙另一個workShop的事,但是身為創意部第一把交椅的名號果然不是虎爛的,禮拜四晚上決定方向,禮拜五就做好版型跟執行企劃,小修一下禮拜六上午就切好圖打完收工了,禮拜天靠一人之力就完成了Demo影片,身兼PM跟設計。

相較之下,我大部分的時間都在看facebook,吃吃喝喝,或者跟其他人聊天,我只寫了兩個頁面的功能,還有寫作品介紹,在luke卡關的時候提供語法查詢功能,扮演Demo影片主角這些之類的雜工而已,總共寫code的時間不超過6小時吧XD


----
這次的極快速開發,我想以後公司的內部案也可以朝這個方向進行,一天做好一個可以用的app(不考慮error handling的作法),我想,如果這些工具會用的話,我們可以更順利

1.git 
   我不太確定換git會不會好一點,在用svn的時候,明明我跟Luke都是commit不同的檔案,svn竟然說有conflict  ,結果後來就都是Luke commit

2.小工具
   影片編輯、轉檔、桌面錄製,之類的小工具,雖然平常沒有需求,但是等要用到的時再學就慢了好幾步了,像今天就發生轉檔的問題,還要去google即時找轉檔的工具、結果找到一個有浮水印的,後來花了很久的時間才解決,這些工具平常如果有裝的話,問題發生時只要click一下就搞定了

3. 隨時隨地可以上網的工具
    當然是指3G或WiMax啦,yahoo 那邊的wifi比3G還要慢實在是一件很誇張的事,而且大家的ipad都沒辦法連線,只有我的可以是怎麼回事XD,這算是special case
這次hackday是一次寶貴的經驗,沒有得名其實在想好題目的時候就意料到了,只是我比較喜歡做自己會想用的東西,想說賭看看吧,沒想到賭輸惹,明年再戰吧~~

 

最後這是今年的影片,看不到直接連去yahoo看,他是用flash寫的 =.=

新手機觀望

米二功能介紹
http://www.mobile01.com/topicdetail.php?f=634&t=2970440&last=38974078
看完這篇,大陸最強手機真得當之無愧....
不過,依照之前跟大陸一些大廠合作的經驗,大陸的東西我是不敢買啦
不是說品質不好,而是安全性實在很誇張阿

最近在用的手機電池壞了,原本想要換一支智慧手機的,但是Android我不是很熟、iphone平常測試機就多到吐了、windows phone現在買時機還沒到;還是反璞歸真繼續用爛爛的2000塊手機好了。反正那些功能我又用不到,也沒空用

自製framework的必要性

最近週會的時候,突然談到我們做了這麼多支APP,平均每一到兩個禮拜就會做好一支,一樣的功能每次就都是那些,比如說:每次都要做facebook分享、每次都有推播、每次都有alert、每次都有tabbar.....之類的一大堆舉都舉不完。

就我而言,我比較關心的是分享平台跟UIKit 上View的轉換之類的,好在康康寫好了一堆UITool ,我最近把它補一些我覺得很好用的,像是圖片縮圖、在ios4.3下實做AutoLayout給其他object用,想一想其實也蠻有趣的。等我們把framework做出來,平均產能起碼可以提升20%以上吧,我們就不用再看星星下班了。

自製framework,好處一定有,問題是威力有多大!手機部比較尷尬的是我們有三個平台,網站部用javascript就可以統一天下了。我們做出來的framework會用的人,大概也只有網站部的1/3威力而已,這年頭還是做網頁的人比較多,我一直覺得javascript可以統一天下,等哪天有javascript轉C這種東西出現,我大概就要被搶走一半的薪水了。

等現在這個project結束,應該把時間留給javascript一下,不然一直覺得他很厲害又一直不學他,這跟白癡一樣。自作孽!

Locale Notification 作法

剛剛熊熊發現永恆戰士跟Agent Dash都有local Notification,找了一下原理跟作法,
發現他真是個不可多得的好物阿!
跟remote push 結合在一起,可以一直提醒使用者"快來用我  快來用我",
再進化下去,可以在收到推撥的時候放一段2秒的音樂

以下code全部來自這邊
http://blog.csdn.net/alexjames_83/article/details/7481750


註冊一個Notification
  1. UILocalNotification *localNotification = [[UILocalNotification alloc] init];  
  2.   
  3. // 設置notification的屬性  
  4. localNotification.fireDate = [startTimePicker.picker.date dateByAddingTimeInterval:36000]; //出發時間  
  5. localNotification.alertBody = @"Time To Schedule Our Service"// 消息內容  
  6. localNotification.repeatInterval = NSSecondCalendarUnit; // 重複的時間間隔  
  7. localNotification.soundName = UILocalNotificationDefaultSoundName; // 觸發消息時播放的聲音  
  8. localNotification.applicationIconBadgeNumber = 1; //應用程序Badge數目  
  9.   
  10. //設置隨Notification傳遞的參數  
  11. NSDictionary *infoDict = [NSDictionary dictionaryWithObjectsAndKeys:@"reminder", @"notificationId", @"phone", txtPhone.text, nil];  
  12. localNotification.userInfo = infoDict;  
  13.       
  14. [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; //註冊  
  15. [localNotification release]; //釋放  

遍歷已經註冊的所有LocaleNotification
  1.     NSArray *notifications = [[UIApplication sharedApplication] scheduledLocalNotifications];  
  2.     for (UILocalNotification *notification in notifications ) {  
  3.         if( [[notification.userInfo objectForKey:@"source"] isEqualToString:@"dailyReminder"] ) {  
  4.             [[UIApplication sharedApplication] cancelLocalNotification:notification];  
  5.             break;  
  6.         }  
  7.     }  
撤銷LocaleNotification
  1. [[UIApplication sharedApplication] cancelAllLocalNotifications]; // 撤銷所有的Notification  
  2. <pre name="code" class="cpp">[[UIApplication sharedApplication] cancelLocalNotification:notification]; // 撤銷某個Notificiation,若要刪除某個特定的Notification,則可以在UserInfo中加入標記,遍歷所有的Notification來刪除。</pre>  
  3. <pre></pre>  
  4. <p></p>  
  5. <pre></pre>  
  6. <strong></strong>  
  7. <p></p>  
  8. <p></p>  
  9. <p><strong>響應事件</strong></p>  
  10. <p>當Notification被觸發後,你的應用需要對此作出反應。應用此時可能會處於以下幾個狀態:</p>  
  11. <ul>  
  12. <li>在前台運行 - 當應用在前台運行時,則ApplicationDelegate的didReceiveLocalNotification會被調用。<pre name="code" class="cpp">- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {  
  13.     NSLog(@"Notification Body: %@", notification.alertBody);  
  14.     NSLog(@"%@", notification.userInfo);  
  15.     application.applicationIconBadgeNumber = notification.applicationIconBadgeNumber-1;  
  16. }</pre><br>  
  17. </li><li>在後台運行 - 用戶可以看到類似Push Notification的提醒,若用戶選擇查看提醒詳情,則應用通過 ApplicationDelegate的didFinishLaunchingWithOptions進入<br>  
  18. <pre name="code" class="cpp">- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
  19.     UILocalNotification *localNotification =  
  20.     [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];  
  21.     if (localNotification) {  
  22.         NSLog(@"Notification Body: %@",localNotification.alertBody);  
  23.         NSLog(@"%@", localNotification.userInfo);  
  24.         application.applicationIconBadgeNumber = localNotification.applicationIconBadgeNumber-1;  
  25.     }  
  26.     // set up everything else  
  27.     return YES;  
  28. </pre>}<br>  
  29. </li></ul>  

5.0 貓D打法

摘自老艾的筆記本,吟游濕人
感謝sotdownplease 賜我裝給我G,找伺服器第一名的貓D教我打

狂野衝鋒   (跑位瞬間到位)  
自然迅捷   (搭配賽夢最大化輸出必點又可以自補)
精靈群襲   (這層看副本貨王的性質)
森林之魂   (終結技回能量必點) 
厄索之旋   (這層看副本或王的性質)
塞納留斯之夢  (最大化dot必點,若不想虐待手指可點自然戒備)



屬性:
命=熟>精通>爆級>>加速
2550 = 7.5% 命or熟
191.64 精通=1%精通
424 加速=1%加速
600 暴擊=1%暴擊
精通的投資報酬很明顯較高,而且使用賽夢輸出必定是精通流血

雕文:
[兇蠻咆哮] (必裝)
[潛行]  (這張可跟[撕碎]互換,例:奧特拉就改用撕碎,找背N年了其實[撕碎]不需要而且只有再開猛虎才有用 如果說改成插雕文不用背也能使用技能再考慮吧)
[奔竄咆哮] (奔串變40碼,這太科學了!! 站附雕文可有可無 現在沒雕文復起來血也有60%)


監控BUFF
BUFF請監控 兇蠻咆哮 塞納留斯之夢(法術ID:108381) 清晰預兆 猛獸迅捷 猛虎之怒 狂暴推薦UI EventAlert
DEBUFF 撕扯 掃擊 痛擊  推薦UI CLASSTIMER
能量集星監控 推薦UI Comergy

巨集:
#showtooltip 
/castsequence   reset=10 自然迅捷,治療之觸

何謂塞納留斯之夢!?
當你使用治療之觸後,下2發近戰技能傷害提高25%包含DOT

貓D如何使用治療之觸!?
1.以上巨集
2.5星終結技後會給一個BUFF~猛獸迅捷(可使下一發治療變順發) 

輸出手法:
單體:
1.開場倒數剩2秒藥水兇蠻咆哮(準備T8*4開場貓叫多8秒是差很多的但是記得要換回來)之後潛行

2.開王后野性衝鋒>劫掠>掃擊這時如果4星請連按上面的巨集觸發塞納留斯之夢後開猛虎之怒補上一發掃擊後5星接撕扯 因為5星會觸發猛獸迅捷這時請使用治療之觸會立刻再觸發塞納留斯之夢接著請開狂暴
補上痛擊之後就是瘋狂撕碎爆發吧!!
  這是理想的完美開場,但現今暴擊低得可憐再來假設另一種開場。

3.
野性衝鋒
>劫掠>掃擊 此時如果2~3星 請斯碎至4~5星,如有4星請照上序,若5星請使用巨集觸發
塞納留斯之夢後開猛虎之怒補上一發撕扯後接掃擊之後參照2.底線部分

PS:這種開場 如果沒有T8*4是很難完成的 那8秒改變一隻貓的一生啊!!

4.之後凡觸發猛獸迅捷請使用治療之觸來得到塞納留斯之夢,下2發技能最好是掃擊&痛擊

5.清晰預兆最好留給痛擊50能量非常划算

6.斬殺期(25%)前請參照2.粗體字部分上完DOT後塞納留斯之夢都留給掃擊&痛擊,必要時1星兇猛撕咬也可以

多目標:1.若要跟王一起AE請以王為目標觸發塞納留斯之夢開啟猛虎之怒使用痛擊+揮擊,星請留給兇蠻咆哮>撕扯

狀態維持:

1.兇蠻咆哮
2.賽夢+猛虎的撕扯>猛虎撕扯>撕扯
3.賽夢+猛虎的掃擊>猛虎掃擊>掃擊
4.賽夢+猛虎的痛擊(斬殺期)>猛虎痛擊
(斬殺期)>痛擊 
第4的前2項通常只會在斬殺期才這麼做平時的痛擊只要在觸發清晰預兆的時候
或是前3項秒數>10又有3星以上再使用



PS:這種打法真是會讓手抽筋!!