2016年8月30日 星期二

Android 從無到有(3)

大家好,我是Teng,
我從事Android App Development已經有三年經驗了,
分享一下我從無到有的學習路程認知。
如果你是新入行的朋友,可以參考參考,
也希望如果我哪裡走偏了可以被指正,感謝。
之前提到了寫程式之前應先了解測試與寫Code的初步,
如果有遺漏的朋友可以去之前的文章看看。
第三部分
當走過第一第二部分以後,
我相信大部分的Android App規劃已經不是什麼問題,
但比較困擾的是之後呢?
我應該要發展的廣?
還是專研的更深?
這點我沒有標準答案,畢竟我也只是小小碼農,
一切依造個人喜好。

Gradle(Groovy):

我覺得接觸專案到某個數量以後,
會自然而然的去接觸Groovy這個語言,用來操作Gradle,
譬如如何利用Product flavors去快速的部屬不同外觀但是相同內容的Application,
或是如何利用Gradle自動產生對應版本號碼,跑自動測試等等的功能,
值得高興的是Android Studio內建許多強大的Gradle Script,
我通常只要搞懂什麼Script是幹嘛的就能順利的使用這些功能。
不過還有很多不懂的地方就是了…

RxJava:

RxJava大概是近一兩年內最火紅的程式寫法了,
鑑於網路上超級多文章,就不多贅敘。

Cross platform language:

如果想要發展雙刀流(Android,iOs),
React Native或是比較淘汰的Cordova都是個入門方式,
最近跟人交流時也有聽過使用CMake建構非UI的程式架構,
供不同平台的語言使用。

AOSP:

如果對於四大元件在Android裡面到底是如何生成的,
或是想要了解Android從開機到使用者可以操作,
這一整套機制是如何運行的,可以花些時間專研這個,
我提供一些收集到的資源網址:
另外就是偷偷打個我們社群目前在試辦的讀書會廣告,
以下是大家一起編的教材。
還有本周三(8/31)會在台北舉辦的第二場活動
第二回AOSP學習會(試辦)

Domain knowhow:

或許你的工作注重的是非程式方面的商業邏輯,
那麼也會有許多值得探索的地方,
有時候要解決一些現實中的需求,
需要的不只是程式的專業,
一些非程式的專門知識,
如何與程式結合,也是一門課題。

------------------------------------------------------------
以上是我這三年寫Android中學習到的一點心得,
趁者最近有空閒的時候,把這三年來學到的東西,
系統性的自我分析一下,希望能提供新人們一些方向。
最後要感謝跟打個廣告給提供我許多學習資源的社群,
社群中有許多技術深厚的大大跟一起努力的夥伴,
在摸索程式的路上提供了許多建議,
也歡迎在台北的Android programmer可以一起參與這個社群,
大家互相交流成長!

2016年8月25日 星期四

Android 從無到有(2)

大家好,我是Teng,
我從事Android App Development已經有三年經驗了,
分享一下我從無到有的學習路程認知。
如果你是新入行的朋友,可以參考參考,
也希望如果我哪裡走偏了可以被指正,感謝。
之前提到了寫程式之前應先了解測試與寫Code的初步,
如果有遺漏的朋友可以去之前的文章看看。

第二部分

看這篇文章之前,
希望是對第一部分的一些基礎概念比較熟捻的程式開發者了,
但也可以依照個人學習習慣。
我認為當熟練了一些Android的基礎架構以後,
可以開始看這四個比較進階的東西,譬如:
Third party library:
原則上,
就是看一看網路上的大家提供了哪些自己寫的元件,
有些元件可以直接達成工作上希望你做到的事情,
既然有人寫好輪子了,也就不用自己造輪子,
可以讓事情的進展更快,也可以學習別人的程式架構、習慣、想法。
我自己是看這幾個以及Github上比較多星星的項目,
看到新的時候想一想自己大概要怎麼把她實作出來,
大約需要幾天,有空就實作看看,歡迎交流:
Design pattern:
隨著寫程式解決問題多了以後,
會發現有很多問題不是那麼的好解決,
會想知道有沒有更好的解法,
這時你就該開始看一看Design pattern了,
一方面可以驗證你的想法,
也可以知道別人如何優雅的解決這些問題,
譬如前一部份的Adapter就是一個經典的Design Pattern。
書本的話網路上很多推薦的了,
我自己是參考這些網址:
我自己也有練習用自己的話去解釋哪些Design Pattern是什麼意思,
不過還在練習當中(遮面)。
OOP(Object-oriented programming)
其實我自己是寫程式的過程中慢慢去體會了解這個東西的,
我也不知道我算不算是很懂OOP了,
但應該比一般人好一點點,
簡單來說就是把寫的程式都物件化,擬人化,
這樣在解決問題的時候就會非常的直覺,
而不會覺得很複雜或是很讓人思考起來很不舒服。
這個東西我比較建議去看市面上的書學習,
網路上的東西東一塊西一塊,
看著看著可能還是不懂他的涵意,
未來有機會我再整理一套我自己對OOP的看法…
DI (Dependency Inversion Principle 依賴倒轉原則)
我以前寫程式的時候也不是很懂這個東西,
一直到我後來系統寫得越來越複雜後,
發現測試開始很麻煩的時候,
才開始接觸這個概念。
program to an interface, not an implementation
寫介面,而非實作。
少用繼承,多用介面。
這部分我還不知道如何清楚的描述,就不多說,
下面列出我在理解的時候看的一些網路資源:
Android 有些Framework就是為了方便這個概念而實作的,
譬如Dagger
我自己覺得OOPDI是對立且需要兼具的能力,
對立的原因是因為為了顧及DI,寫程式的時候要考慮的比較多,
(可能是我還不熟悉,會寫比較慢XD)
而需要兼顧的原因是因為,
良好的OOP設計可以讓架構非常的完善跟修改快速,
而良好的DI可以讓測試時非常的清楚跟測試方便。
這兩者都具備的系統架構,我覺得是目前的我在這部分仍需努力的。

2016年8月23日 星期二

Android 從無到有(1)

大家好,我是Teng,
我從事Android App Development已經有三年經驗了,
分享一下我從無到有的學習路程認知。
如果你是新入行的朋友,可以參考參考,
也希望如果我哪裡走偏了可以被指正,感謝。
上次提到測試跟寫Code兩個區塊,如果有遺漏的朋友可以去之前的文章看看。

Code:

當你有了Java底以後,
你也可以先從Code開始了解,
我將Code這部分分為三個部分,
你可以在學習的過程同時產出成果,
然後循序漸進學習更深入的程式,
可能你之前學過一些相關語言,
那你就只有一開始入門的工具比較不熟悉,
或在做某些課題的時候可以直接跳過。

第一部分


首先,
你應該要先了解四大元件的基本,
包括生命週期,如何建構,以及其用途,
深入一點可以探討他是如何被實作出來的,
是從哪繼承來的,可以做到哪些事情。
也可以順便看一看Fragment是什麼,他的生命週期是如何的。

UI Widgets/Container/Layouts

當你對基本的元件熟悉以後,
你可以去理解程式的一些物件用法,
如Relative Layout,Button,EditText…
隨著工作你會慢慢的理解越來越多的元件跟他如何使用,
值得一談的是如果程式比較理解的話,
可以慢慢的往基礎元件看下去,
譬如幾乎所有的元件都繼承自View,
那麼View是怎麼被實作做出來的呢?
他又是如何處理觸碰事件等等的。

Adapter/ListView/Recycler View

他是Android裡面一個蠻重要的Design Pattern,
至於Design Pattern是什麼,要了解到什麼程度,
在了解程式的當下,
我覺得這個階段的你可以先不用花時間理解,
後續的部份我們會再談到這塊,只要先搞懂Adapter的概念即可。
為何要先理解Adapter呢?
因為Android有一個蠻重要的元件ListView,
在Android 5.0以後, Google出了RecyclerView,
但不論如何都需要學習Adapter,因為他是這些元件的核心單元。

Thread

因為Android幾乎都會碰到網路傳輸,
而在Android理面是限制UI Thread去使用網路的,
所以你還是要花時間理解多執行緒的,可以的話也多看相關的文章。

Animation

Android許多漂亮的過場畫面跟元件表現,
都是理解整個Android Layout架構後刻出來的,
如果有機會的話務必投資這塊,
可以讓你的App美觀程度大幅提升。

Call back

Android 幾大元件包括Click Event以及與網路溝通等等,
都使用Call back機制,徹底了解Call back機制,
可以讓你的程式不會出現讓人啼笑皆非的架構。

Else

其他的 Coding style
團隊合作用的Git
Android Studio Plugins
Coding tips
以及Clean Code等等的知識都能幫助你在寫程式的時候,
更好的跟團隊合作,以及擁有更高效率的產出。
林林總總打了一堆,
很多東西網路上都有相關資源,
可以自己去搜尋,
這部分的學習也是學不完的,
不過大致上就這些,一定程度理解了這些,比較好進入下個部份的學習喔!

Android 從無到有(0)

大家好,我是Teng,
我從事Android App Development已經有三年經驗了,
分享一下我從無到有的學習路程認知。
如果你是新入行的朋友,可以參考參考,
也希望如果我哪裡走偏了可以被指正,感謝。
首先看下這張圖:
我認為Android程式分為測試跟寫Code兩個區塊,
但如果完全沒有程式底子,
建議先從Java語法開始看起,
我自己是k了一本螞蟻書 <<JAVA程式設計藝術>> ,
就開始看Android的官方文件了。
但因為我以前有學過C家族語言,
因此還要看個人情況去選擇要不要多看幾本書。
十分建議打好JAVA底,這樣在後續學習到比較奇怪的程式碼時,比較不會卡關。

Test:

先介紹Test的原因是因為我覺得學習跟寫程式時,
如果先有測試的概念,
在未來寫程式的時候會減少一些技術債。
我自己測試這塊的經驗是相對少的,
因為沒有人帶,
後續摸到測試這塊的時候才發現有很多要補充的知識…
一樣,先看圖:
就我來說,Android測試分成3個部分,
分別是持續整合環境、UI/UX test跟Unit test,
這三塊分別代表不同的事情,但整合起來剛好可以完整包覆整個專案程式的內容。
Unit test:
最小單元測試,
一般來說就是測非UI的功能,
譬如API或是計算等等的。
這部分的網路資源很多,
以下條列幾個幫助我在學習測試的時候,
省去很多工夫的網頁,
在了解單元測試的時候,
你也會學習到程式撰寫如何Dependency inversion,
以及如何撰寫程式架構才好讓後續測試簡單,方便測試。

UI/UX test:

前一陣子,讀書會的貓大分享了這個UI/UX test的工具,
覺得很有用,但仍抽不出時間去學習,不過在測試中蠻重要的。
(要多學一個語言Ruby…)
簡而言之,
這一些工具可以讓你撰寫測試腳本,
然後讓程式自己去測試你寫好的動作,
這樣就不用人工機械系的反覆去做同樣的動作,
在系統越來越大跟上線給使用者測試跟回饋Bug的時候會越來越重要。
Calabash的好處是可以跨平台測試,
而且他的函式庫在跨平台的機制寫的蠻完整的,
缺點根據貓大說是某些時候Android的函式有多一個s,iOs的沒有s…
不過瑕不掩瑜就是。
持續整合環境:
目前我在摸索Jenkins,
持續整合環境的好處是你可以寫一些腳本,
讓指定Git上的程式固定時間跑個測試腳本,
了解目前程式版本測試覆蓋度如何,
有沒有Bug,如果都沒有的話可以直接上傳Git server,
或是直接包成Apk上架等等的。
可以把一些你覺得很機械式又很浪費時間的動作都交給他去使用。
不過我還沒有摸索完成,覺得Jenkins很多地方都不是很懂!
會接觸到的東西大約有Gradle、Groovy語法,跟一些Script。
了解測試跟知道一些測試相關的原則,
會讓你在寫程式的時候減少一些彎路,
但由於這些概念比較抽象,建議有個大概思路即可,
畢竟你是學習寫Android的,
如何兼顧程式產出跟後續測試等等的尺度要由自己拿捏,
免得一頭栽進寫測試程式,程式都沒進展,
被公司覺得沒有產出就糟糕了。

2016年8月18日 星期四

Android free and open-source Android applications 列表(Part I)

wiki 連結在此

身為碼農的我們,有時候會想要藉由參與一些大型的免費開放程式碼專案,
來建立自己的信心,而且藉由看這些code也可以學到很多想法,當然最終就是期望能做出一些回饋給社會。

查了一下wiki 發現還真有不少這樣的專案,等待更多人的加入及開發。

因為英文不好,所以看過內容以後,用我的理解將這些App內容,
大致上做什麼翻成中文,讓跟我英文一樣不好的人,
快速的了解這些app是在做些什麼,也許可以讓有些有興趣的人投入也說不定。

AdAway
Adblock Plus
顧名思義,擋廣告的app。

ConnectBot
手機版的SSH shell,供資安的人連線至server查看資料。

CSipSimple
Sipdroid
使用SIP建立的VoIP,就是免費的網路電話應用。

Linphone
Jitsi
Videoconferencing and instant messenger,視訊電話應用。

K-9 Mail
信箱應用,可以用這個去收各大信箱的內容。

WordPress
文字編輯應用。

APG
Android Privacy Guard,有在防code被反組譯的應該都很熟悉。

2016年3月25日 星期五

Json 錯誤格式用Regular Expression修正(Android的一百種奇技淫巧)

有時候會遇到 Backend 在Response data 的時候吐出一些錯誤格式的json,
如下:

{
"AAA": "YES", 
"BBB": [  
     { "CCC": "1", },
     { "CCC": "3", }, 
     { "CCC": "5", }, 
   ]
}


可以看到結束前的中括號前多了一個逗號,
一般而言會跟 Backend 說並等他修正,
但如果app是online的,或Backend很忙改很慢的時候,
問一些前輩們得到這樣的解決方式,
可以先Regular Expression修正。

Regular Expression 語法:reg_replace(",\s*\]", "]")

Android 語法:

public String responseFix(String response) 
return response.replaceAll(",\\s*\\]", "]");
}

2016年3月22日 星期二

你應該知道的那些Android小經驗

連結在此

https://mp.weixin.qq.com/s?__biz=MzA4MjU5NTY0NA==&mid=404388098&idx=1&sn=8bbbba7692dca68cdda2212dec4d86c0&scene=1&srcid=0320gXPloap70ixGeYnNUaAW&key=710a5d99946419d972fe638b34e38edcf7064c302f8526f10b927c7e27886585b83b5b60bc342db482d2a7846e24c284&ascene=0&uin=MTYzMjY2MTE1&devicetype=iMac+MacBookPro10%2C1+OSX+OSX+10.11.3+build(15D21)&version=11020201&pass_ticket=pvdhfR4lRer%2FtYDsP5cnFux5OK0GM%2FUQMgt5TOvHlpQ%3D

2016年1月5日 星期二

Android夜间模式最佳实践

如何优雅地实现夜间模式?

連結在此
https://mp.weixin.qq.com/s?__biz=MzA4MjU5NTY0NA==&mid=401740657&idx=1&sn=8e6727fbe094ea42d5fd80b185a49395&scene=1&srcid=01042xVJNz7KY68UKWpt6hv3&key=41ecb04b05111003cc9f6c04989d4f60e7b6241f3865700c7cb5510015a444599ca898fb06d5fbfc6363ab952e9316c8&ascene=0&uin=MTYzMjY2MTE1&devicetype=iMac+MacBookPro10%2C1+OSX+OSX+10.11.2+build(15C50)&version=11020201&pass_ticket=o%2FTSzpu0SSmOb7T9xPBrU0Rpqhpr4qF1AdRauuFWC4M%3D