為何要寫這篇文章?
寫這篇文章,主要的目的是總結和展望。現在我只能算入門水平,不過只要我堅持下去,總有一天能夠窺見一些門道。我希望記錄自己的成長歷程,日后再看,能夠有一些感悟。因此,這篇文章寫給未來的我。
2016.12.27
我從上Web課程開始自學安卓,到2016年1月11日找到第一份實習,算起來將近1年開發經驗了。
這一年下來,確實學習了不少東西。現在的我,能夠使用大部分第三方庫,對安卓SDK有一定了解,知道如何追蹤和解決bug,知道MVP架構和一些簡單的設計模式。
當然,這篇文章不是談論我會什么,而是要探討安卓開發到底有哪些重要的東西,以及如何進階。
Java
Java是安卓采用的語言。我個人覺得安卓對Java的要求并不是很高,Android Studio的各種自動完成和提示也很好用。當然,對Java的基礎語法還是必須要掌握的,Core Java這本書就可以選擇性地看一看基礎的內容,我覺得寫的很不錯。
輪子
在碼農界,一直有這么一個爭論:到底要不要自己造輪子?
在我看來,不造輪子,但得知道輪子的原理。假如沒有現成的,自己要能夠造出來。或者能拿別人的輪子來修改。
所謂輪子就是現成的庫或者別的工具。一般而言拿過來就用,很方便省事。但是假如到此為止,不去讀源碼搞清楚實現原理,等到自己有需求又沒有現成的東西,就無計可施了。
一般自己從無到有造一個庫比較困難,而對他人的庫進行修改以滿足自己的需求相對而言更為可行。第三方庫的學習和分析是一個費時費力的過程,但回報也同樣豐厚。
而自己做庫是一個非常耗時耗力的事情,再牛逼的人也不可能說所有輪子都自己造。
所以,結論就是不強求自己做庫,但是在能使用第三方庫的基礎上,要有修改第三方庫滿足自己需求的能力。
源碼
在讀第三方庫的過程中,當然會遇見很多問題。一個非常明顯的問題就是缺乏對安卓源碼的了解。說到安卓的源碼,又是一個坑。因為安卓的源碼可不小,有各種類和函數,更別說更加底層的東西和安卓的快速發展變化。總而言之這個東西很重要,但要學會取舍,不可能眉毛胡子一把抓,而是要重點學習那些常用的東西。
經驗
安卓開發的經驗是一個很玄的概念,可能有些人3年經驗就和一些人的5年經驗差不多水平,因此用經驗判斷水平是不太可取的。
話雖如此,要是說1年經驗能強過5年經驗,這個概率還真的蠻小的。找工作的過程中我發現大部分安卓全職工作都要求至少3年經驗,這明顯是一個分水嶺。
為什么我選擇安卓開發呢?因為看到自己的app會有一種成就感,尤其當這個app被用戶認可的時候。當然要是有人指責這個app,不免有點跳腳。app就像自己的作品一樣。
回到經驗這個話題,年份是一個因數,而干了什么又是另外一個因素了。大學4年自己自學安卓,畢業了就可以聲稱有4年經驗嗎?工作和自己自學完全是兩碼事情。
總的來說,是要積累經驗,但同時也不能不學習,重復干一些工作來堆年份。現在技術發展日新月異,如果沒有不斷學習的能力,二十年經驗也白搭。
技術與進階
假設有了可觀的經驗,保證不會在簡歷就被刷下去的時候,就可以來看看那些待遇優越的安卓崗位都要些什么東西,可以向這些方向努力,雖然說到時候肯定會變,但總有不變的東西。
算法和系統設計,這兩個是進大公司必須的東西,和安卓開發說實話關系不算很大,算是額外要求。
登上玻璃門,看看三番的一些高級安卓工程師崗位的要求和報酬:
Imgur - Rating 4.7 - Senior Android Engineer $130k-160k
What You Bring To The Table:
- B.S. or higher in Computer Science, or equivalent in work experience
- Minimum of 3+ years Android development experience
- 5+ years of general software development
- Enthusiasm for Android development
- A passion for beautiful, pragmatic code paired with a strong sense of product design
- Love for the Imgur product
這個公司的要求屬于比較寬松的那種,其實就一個工作年限。5年的general SDE是什么鬼,真的有人轉行安卓嗎?
當然,符合要求不代表就能進去,人多位置少,bar自然就高了,但是至少有過機會。
RideCell LLC - Rating 4.4 - Senior Android Engineer $140k-160k
About You:
- B.S. or M.S. Computer Science or related experience
- 3+ years of object-oriented software development experience
- 2+ years mobile application development at the user interface and system levels
- Proficient knowledge of the android SDK
- Gradle build system expert & ability to maintain multi flavor project
- Java OOP expert
- Proficiency with Google API's (maps, places, gcm most important)
- knowledge of RESTful implementation in android and communicating with backend API's
- Proficiency with android lifecycle events in activities and fragments
- At least 1 application deployed in the play store
- Must be willing to work on-site in our San Francisco office
Great to Have:
- Knowledge with 3rd party injection libs (android annotations, butterknife, dagger etc...)
- Knowledge of android development patterns, preferebly MVP or MVVP
- Knowledge of websockets
- Other languages to know (python, js, cocoa, swift, c++)
這個工作總算提出一點實質性的要求了。經驗相對而言寬松一些,2-3年的完全夠了。要求會谷歌的一些API,這些說實話不是很難,都是拿來就用的東西;然后加分項有依賴注入庫,MVP,websocket,還有一些其他語言。這些東西倒是值得注意。
更多的也不再貼上來了。當然,要明白這里的要求很可能不是完全準確的要求,因為有些公司可能要求喜歡寫的寬松一些,但是實際上Bar很高;或者有的公司要求寫一堆,但很多都是可有可無的。
很多知識,假如沒有遇到過,說實話并不好去學習,因為太寬泛了。比較靠譜的就是安卓相關的一些東西,然后擴展一些就是ios開發可以了解一下。至于個別公司的一些特殊要求,沒有必要特意去追求,因為適應面太窄。
總結與展望
CS的領域如此廣闊,現在大熱的一個是Machine learning,還有Big data,安卓和ios開發也還可以。對于初出茅廬的我來說,太多選擇卻相當于沒有選擇,先在一個領域里面積累足夠的經驗,做到站穩腳跟,生存下來,才能再談其他。因此未來幾年之內,我會選擇繼續干安卓開發。好在我個人而言還算喜歡這個工作。至于以后的事情,現在說很多也沒有用,只能說多多努力吧。