1. 程式人生 > >來自知乎的Android學習總結

來自知乎的Android學習總結

之前寫了一篇部落格 Android學習之路 被瘋狂轉發,帶起了一陣學習Android的大風,我不曉得具體影響了多少人,但是這篇部落格已經成為Android新手學習必備的資料。很多人問我是怎麼一路過來的,姑且借這個機會說說我的故事吧。

===============================
內容有點長,大家姑且當做勵志小說來看吧,對這些經歷不感興趣的可以直接看最後“如何自學Android”部分
===============================

  • 大學
大學上的是全國二流本科,專業主要就是數學專業。大學的總結就是:逃課、掛科、籃球、泡妞、Dota。

目前為止可以說我的大學是我這輩子過的最爽的時期,大一開始就逃課,好點的理由是我對大學那些課程完全沒興趣,其實本質上是因為高考太壓抑了,大學之後沒人管了,開始無止境的放縱自己。毫不誇張的說大學四年上的課應該沒有逃的課多。逃課最直接的影響就是掛科,從大一掛到大三,專業課數學分析特麼每年都掛,後來聽說補考考不過要重修,還得交錢,這特麼讓家裡人知道還了得,於是發憤圖強,最終補考每門都以優秀的成績過了。

相信英語四級應該是大學必考吧,英語四級這輩子我都忘不了,我考了三次才過,每次考試說是裸考都褒獎了,大學英語全是吃高中的底子,第一次沒過,少了十幾分,第二次他媽睡覺睡過了,就沒有去考,現在想想當時的自己真是腦殘,終於在第三次勉強過了。現在想想幸虧當時過了,之後畢業找工作時英語四級是最低要求。做程式設計這行,英語真的挺重要的,大學的時候一定得想辦法把四級給過了。

現在想想大學和程式設計唯一相關的課程就是C語言了,但是對於我們專業是屬於全校公開課,最終這門課雖然考過了,但是連i++ 和++i我都弄不明白,可想而知你們應該能猜到我是怎麼過的。

由於高中就開始打籃球,大學時毫無疑問就入了學院籃球隊,而且擔任隊長,所以大一、大二過來基本就是一大半是在籃球場度過的,也是因為籃球征服了我現在的老婆。大二下學期周圍的人都在玩Dota,於是也開始了遊戲之路,籃球也基本放棄了,那時候玩的瘋狂,記得最長的一次和同學在網咖連續包夜兩星期,不過白天是回來睡覺的,不然估計早猝死在網咖了。

轉眼間大四了,這一年終於在我老婆的監督下不再掛科了,而且在畢業前的最後一次評比竟然拿到了三等獎學金,真是受寵若驚啊,後來錢也被狐朋狗友們拿去腐敗了。周圍的同學都在準備考研,我卻唯獨對考研沒興趣,自始至終都沒有為考研花過一分錢,買過一本書。後來證明我的決定是正確的,周圍的小夥伴放棄的放棄,考不上的考不上,考上的後面也沒見混的有多好,當然如果能考上好的學校還是很有幫助的。

  • 畢業
又一轉眼畢業了,去參加了學校幾個招聘會也是醉了,全是沒聽過的小企業,一去參觀都是各種廠房,根本不需要任何學歷,是個人出點力都可以乾的那種,要麼就是各種電話銷售。。。那時候真的有點急了,大學四年,畢業一份像樣的工作都找不到,回去怎麼面對鄉親父老。

三月份的時候一家IT測試培訓機構來做宣講會(具體什麼名字我就不說了,免得認為是廣告),聽完之後就說培訓之後包就業,培訓地點在大上海的最中心,當然是自費,但是可以工作之後分期付款。那時候哪知道測試是幹嘛的,更不懂IT是幹嘛的,回來就查了下這個機構確實存在,網站也有的,知道不是騙子遍決定來上海試一試。當時下定決定要來上海培訓之後,幾個狐朋狗友毫不猶豫的跟著我一起來了,總共應該是7個人,決定之後沒幾天便毅然而然的揹著大包小包來到上海,我們之中一部分是一次性付費,另一部分是分期。後來證明我們當時來上海的決定是正確的。

  • 培訓之路
這裡並不是宣傳大家去培訓,只不過被工作所逼,學校不好,大學也沒學啥真本事,稍微有點出路都不會去培訓!

培訓的日子還是蠻輕鬆的,一週就上四天課,朝九晚五,畢竟大家家庭都不富裕,家裡辛苦攻讀了四年大學,畢業還要再交錢去培訓,打心裡大家都很愧疚。一開始卯足了勁要好好學習,但是堅持了沒多久就有點放鬆了,但是好歹也是都有學習的。

培訓的時候算是接觸了點程式設計吧,課程有C語言、Oracle、Linux,然後其他都是軟體測試的理論,其實都是非常基礎的東西,算是帶你入行吧,Orace就學習一些基本SQL語句,Linux就學了幾個命令,但是起碼知道原來電腦可以幹這麼多事,之前還一直以為電腦就是用來看電影、聊天、打遊戲的呢。現在回頭看給我一週的時間我可以看完整個培訓課程,但是當時的培訓週期要四個月。

  • 第一份工作--SunNet

7月份拿到畢業證書就直接來了上海,四個月的時間對於我來說實在太漫長了,我等不及了,於是在課程還有最後一個月的時候我提前出來單獨找工作,當時培訓老師說工作後的工資大多是3500左右,我覺得我學的比別人好,所以必須要比別人高,做好了長期準備面試的過程。沒想到面試第一家就直接錄取了(後來才知道原來是公司的測試懷孕在家,急需測試),公司名叫SunNet,中文名山諾,工資4000。收到offer的時候欣喜若狂!

  • 真正接觸程式設計
之後便在SunNet正式入職,工作就是測試,但是就在SunNet我才真正的接觸了什麼是程式設計。SunNet是一家小型外企,總部在休斯頓,上海這邊主要是研發部。研發人員總共不到10人,主要業務是以web為主,使用語言是.NET。當然我的職責就是web測試了,工作倒是沒什麼難點,主要測試就我一個,一進來就有好幾個專案等著我測試,還好自己是數學專業,邏輯思維能力還不錯,加加班總算能按時完成任務。

三個月的時間順利轉正,之後的某一天偶然得知公司一開發人員工資比我高2000,其實也就比我早畢業一年而已,才知道原來開發和測試工資差距這麼大,於是當時就下定決心要轉行做開發,所以說起我從測試轉行開發的原因是因為錢,一開始說因為興趣堅持下來的都是扯淡。。。

  • 程式設計之路
由於在公司我的主要任務仍然是測試,任務也挺多,基本每天要9點能到家。下定決心之後只能利用業餘時間來學習,由於公司主要業務是.NET,很自然我一開始學習的方向便是.NET,後來才瞭解到.NET是基於C#的,學習.NET之前必須要先學習C#,於是像公司借了一本C#學習資料,就這樣學習了大概兩週吧,還仔仔細細做了一大堆筆記。之後覺得語法學的差不多了,便又借了本.NET的書開始學習web開發。

但是web開發遠沒有學習一門語言這麼簡單,後來才知道web開發涉及到html, css, javascript, ajax, database等,範圍太廣了,於是為了效率,我只能每一項掌握住基礎,於是網上搜索找到w3school 線上教程 這個好東西,裡面的東西都是基礎的,我把教程整理到手機裡,每天上下班的地鐵上,吃飯的時候,回家的時候等等利用一切時間來學習,也是差不多大概2周的時間掌握了html, css, js的一點基礎,接下來準備正式學習.NET的時候,被我們老大知道我正在學習開發,我們老大叫Aaron,是一位典型的程式設計師,比較胖,人品超好,知道後不建議我學習.NET,說.NET出來都十來年了,已經很成熟了,很多人在學校都有.NET教程,現在學習已經比別人晚了。現在移動開發剛嶄露頭角,也沒多少人會,建議我直接學習移動開發。真是一句點醒了我啊!!

  • 移動開發
聽了老大的建議,於是放棄了.NET,開始準備學習移動開發。那時候是12年初,整個移動網際網路也是剛起步階段,iPhone4還是非常火的時候,毫無疑問我把目標鎖定在了iPhone開發上。

這次有經驗了,知道了iPhone開發首先肯定得有一門程式語言的,瞭解到是Objective-C,於是又從公司借了一本OC的書(公司書很多,老大每月都會買來好多書,雖然看的人很少),又花了將近一週的時間來了解了基本語法,因為之前學了C#,這次沒完全看完的情況下想直接上手實踐。正打算學習的時候,才知道iOS開發必須得在mac上才可以,也就是說我得自己有臺mac電腦,雖然當時公司是有的,但是回家的時候不能繼續學習練習,肯定影響效率的,一臺mac對於當時的我簡直是奢侈品,雖然現在也依然是奢侈品,但當時根本不可能買得起。於是只有放棄iPhone開發轉向Android(後來才知道有虛擬機器這東西。。。)

  • Android學習之路
幾經波折,終於才確定自己的方向,這期間已經耽誤了不少時間,走了不少彎路了,但是仍然阻擋不住我轉行開發的腳步。公司關於Android的書竟然沒有,於是我自己親自買了一本Android書籍,叫《瘋狂Android講義》,作者是李剛!!不說這本書有多好吧,這本書比較厚,非常厚,所以講的一些基礎比較細,新手按照上面的完全可以看懂,現在不知道這本書內容更新了沒,之前內容對於現在來說有點老。這個時候應該是12年的3月份,說起來也巧,這個月公司剛好接了個移動端專案,iOS有人來做,但是公司上下沒有會Android開發的,其他人都有自己的專案在忙,老大看出我的興趣,就問我想不想試一下,我當然欣然同意了,只此就開始正式的邊做邊學習Android。

那個時候的測試任務仍然很重,於是我只能擠出時間來做這個專案,基本是每晚以及週末都會自動加班來完成這個專案,現在看來那個專案真是太簡單不過了,快的話一週都不要就可以搞定了,但在當時我摸爬滾打了一個多月總算搞定了。

做完這個專案自己有了點信心,但當時自己的主要任務還是測試,自己開發的時間是少之又少,於是下定決心離職找一個專門做Android的工作。說明原因之後老大很理解,也是建議我想做開發的話就放手去找一個專門做開發的職位,這樣進步會比較快。

第一份工作能遇到我的老大Aaron,真是我的福分!

  • 薄荷
12年4月底離職之後,我便開始在家裡準備面試,投簡歷,由於自己的基礎很薄弱,之前的Android經驗也非常少,那時候說是招聘Android職位,但是很多公司面試基本全是Java內容,而且我能感受到工作內容和Android相關的也比較少。來薄荷面試的時候感覺很好,包括CTO、CEO的面試都感覺不錯,果然沒幾天就收到offer,來之不易的機會,非常珍惜。

12年5月中入職薄荷,你們以為我到了薄荷之後Android之路就一帆風順?錯了,路更艱難。我是薄荷入職的第一位Android工程師,薄荷在那時候只做iOS平臺的App,事實證明這種做法不可取,包括BOSS後面也親自說投資人來投資的時候一看資料這麼少,後面做了Android平臺之後使用者資料才慢慢上來,畢竟還是Android使用者基數大。

來薄荷的第一個任務是做聯想TV的一個視訊App,很蛋疼,折騰聯想的SDK,遙控器等,好歹App功能比較簡單,試用期間完成的還不錯,就這樣順利轉正了。轉正之後做了第一個Android App,叫減肥食物庫,功能與頁面全部Copy iOS版的App。這個時候一大堆沒做過的東西全部湧來了,網路庫、http、api對接、元件定製等等,那個時候沒有像現在各種資料、開源庫一大堆,公司也沒人能給指導,只有硬著頭皮慢慢來,為了能把進度趕上去,上線前夕曾經連續在公司通宵三天三夜,累了就在公司趴一會,這輩子就經歷過這一次,雖然專案最終也拖延,但總算在接受範圍之內上線,這在當時是第一個試水Android平臺的App,可惜的是上線之後表現不好,沒有達到預期的效果。

  • Ruby、Rails
這個App試水錶現不好之後,公司決定暫停Android業務,主攻iOS平臺。我的位置就變得很尷尬,CTO找我談話希望我能轉做Ruby,Android業務會暫停,我們後端的api全部是基於Ruby語言的,雖然當時心裡有點不情願,但是沒辦法,為了不丟掉工作我只得硬著頭皮做下去,於是就開啟了我的Ruby之旅。

學習Ruby以及Rails是我目前為止遇到的最大的困難。Ruby是一種動態語言,Ruby On Rails是一種流行快速開發web的框架。學習ruby不同地方在於要學習Linux,程式碼基本全是在終端進行,沒有IDE,沒有編譯檢查,習慣各種命令列。這對於一個剛開始進行開發的人來說真的是太困難了。那個時候從內心也有抵觸,學習領悟能力也超差,我能感覺到公司領導層對我已經不是很滿意了,現在想想那時候公司沒能開除我真是得感謝我們的CTO,一個很有耐心、敢於給新人機會的人。中間遇到非常大的困難,還好得到薄荷ruby工程師小夥伴們的幫助,一直鼓勵我,遇到問題總是不厭其煩,在基礎、經驗、能力不行的情況下,我總得克服這種困難,讓別人看出我的態度。於是學習Ruby、Rails的那段時間我每天都是做最後一班公交車回去,我記得好像是11:40. 這個狀態持續一個月,包括週末,從未間斷。

這一個月我在公司的主要任務就是學習,沒有給安排任何事情,偶爾幫同事修修電腦,調下電話線,為此我非常感謝薄荷,感謝我的CTO Vincent,恐怕這在任何一家公司都不能這樣給一個人單獨的學習時間吧。一個月之後,學習的終於有點起色,開始實際做Rails專案,做後臺,寫api,雖然效率很低,程式碼很爛,但是在做Ruby的過程跟著我們CTO學了不少設計上的東西,面向物件的思想,設計模式等都在這個階段接觸的,自此我已經習慣各種終端操作,熟悉一些Linux基本命令,喜愛Ubuntu,參加了Ruby Conf 2012大會,喜歡Sublime,接觸Git,GitHub,搭建了自己的Blog。我感謝做Ruby的這段時間,他讓我接觸了不一樣的世界,心態完全變了,變得更開放,更樂於分享。

  • 迴歸Android
做ruby的這段時間很是快樂,付出了這輩子最艱辛的努力,換來了點小小成果,我喜歡ruby語言,到現在為止都認為ruby是最優雅的語言。但是Android在我心裡一直都有一個位置,從未放棄過。直到13年5月的時候,這個時候Android份額近乎瘋狂的增長,公司不得不開始注意Android市場,於是公司打算推出Android版app,於是作為公司唯一的Android程式設計師,CTO再次徵求我的意見,問我想繼續做ruby還是做Android,雖然我更喜歡ruby語言,但是從心底我更喜歡客戶端開發,和語言無關,客戶端是使用者最能感知的一部分,做出的東西更有成就感一點,我就在等待著這個機會,這一刻我毫不猶豫的選擇繼續做Android。

迴歸Android開發的我一個人開發新的App,單槍匹馬,經過之前的一系列挫折,突然感覺再沒有更困難的了,一個人摸索架構、克服難題,App一推出便一直快速瘋狂的增長,目前薄荷App總使用者數已經破千萬,公司也順利融資,業務發展越來越好。

  • 後話
由於一個人一步步過來,我深知這其中的不易,之後自己一直堅持寫部落格,除了自己的積累外,還希望幫助更多的人,所以現在你們可以看到不管是我的GitHub,部落格,微博還是微信公眾賬號都很樂於分享,希望自己走過的這些彎路你們能少經歷,雖然最終我也到達了終點,但是如果能有直路可直達最好不過了。

  • 總結
上面囉囉嗦嗦的敘述我的這些陳年經歷,看似和題主的問題無關,其實有很大關係:

1. 如果你是非科班畢業想要轉行程式設計,看了我的經歷你一定很有信心與動力,我能,你一樣能,何況我中間走了這麼多彎路;

2. 如果你接觸過一些資料結構、程式語言之類的,想要學習程式設計,想題主這種,你更應該有信心,你比那些非科班的人已經多了一些基礎,你要做的只是堅定信念,堅持走下去;

3. 不要感慨上天的不公平,一路走來很悲催,走了太多的彎路,遇到了太多的困難,都是我這輩子難以忘記的坎坷,但同時我是幸運的,我的前任老大Aaron以及現任CTO都深深的影響著我後來的職業發現,我在薄荷的一些小夥伴們對我的幫助,我女朋友無數個日夜的理解與支援,上帝在給你製造坎坷的時候總會對你有些眷顧;

4. 如果你準備或已經在做開發的人員,沒有信心或動力,又或是對未來迷茫的時候,姑且當做一篇勵志小說來看,你要做的就是做好你當下在做的事,相信你的付出一定能有所收穫;

  • 建議
評論裡有人說是在校生,想要給點建議,那就以一個反例的身份給出事後的一些建議吧:

1. 每天花1小時看書,難的不是1小時,難的在堅持;
2. 最好不要掛科,因為掛了你還是得花時間補回來;
3. 英語對程式設計來說很重要,試著習慣英語閱讀;
4. 資料結構和演算法要學好,這算是對程式設計來說最重要的課了,以後不見得能用得上,但用的時候起碼你有印象;
5. 大三或者大四一定要去實習,對於程式設計來說經驗還是比較重要的,實習經歷比你那些理論要有效的多;
6. 找個女朋友吧,不是說工作了你就找不到了,而是工作之後從事程式設計很少有時間和精力去接觸別的女孩,所以可以的話在畢業前找個可以同甘苦的女朋友吧;
7. 第一份工作很重要,因為你會受一些周圍同事、公司氛圍的影響,我為自己遇到Aaron、Vincent而感到幸運,他們倆是我目前為止最尊重的兩個人;

  • 如何自學android程式設計
最後才應該是題主最需要的:

1. Android學習之路 前面說過我的這篇部落格是Android新手必備資料;

2. 書不在多,適合你就好,這裡推薦一本Android和兩本Java書籍吧;
《第一行程式碼》:郭霖大神的著作,我是看過郭神部落格過來的;
《Thinking In Java》:Java經典書籍,不必說;
《Effective Java》:Java進階必備書籍;

3. 有些人一開始看書也有困難,沒關係,那就去網上看視訊,結合視訊和書一起看,邊看邊敲,推薦下Mars老師視訊,包括java基礎以及Android篇都有:Java4Android.zip_免費高速下載
極客學院的視訊:Android安卓開發環境搭建
口味不同的人可去各大網站自行搜尋適合自己的教學視訊。

4. 多去混GitHub,目前最流行的開源社群,多參與開源專案,慢慢試著讀牛人們的程式碼,時機到的時候自己也可以為開源社群貢獻力量,可以這樣說在GitHub上認真混一年,比你在大學四年學的東西要多的多;

5. 關注一些Android界不錯的部落格:
我(stormzhang)的部落格:Storm's Blog
Trinea的部落格:Trinea
程式碼家的部落格: 程式碼家

6. 善於利用搜索引擎,從用Google做起,學會英文關鍵字搜尋,有問題第一時間想到去搜索而不是去請教別人;

7. 關注我的微博和微信公眾賬號,我也會在上面分享一些最新動態與技術前沿資訊,忙起來的時候偶爾會暫停,望理解,賬號均是: googdev

大家都有了以上相同的教程,但是人和人之間的區別在於:別人有顆更強大的內心,可怕的是比你聰明的人比你還要更努力!!

當你下定決心,準備前行的時候,剩下的只有堅持了。。。



===============================
我是華麗的分割線
===============================
我是很少在知乎上正經回答問題的,沒想到這個回答引起這麼多人關注,引起了很多人的共鳴,收穫了這麼多點贊,這裡針對很多人的私心以及評論做點補充吧:

1. 回答中提到了培訓之路,很多人要推薦培訓機構,其實一方面當時沒有經驗,也比較迷茫,迫不得已才去培訓試一試的,後來過來後其實培訓學不了什麼東西,我後來轉行Android完全是自學,和培訓一點關係都沒,所以不推薦去培訓,最終得靠自己;

2. 有人問我單獨開發的app是什麼,我現在公司名是薄荷科技,app也叫薄荷,你可以去各大市場搜尋“薄荷”,排名第一的應該就是,從架構到實現一直都是一個人在做,總使用者現在差不多過千萬了,當然現在已經不是一個人在開發了,現在帶領一個小團隊在做,你可以下載體驗下,不過現在依然有很多不足之處,我們一直在努力改進;

3. 文中提到我學習了很多語言,很多人比較疑問,是都需要學這些語言麼?當然不是,我是因為走了不少彎路,有些語言為了工作不得不去學的,不過後來證明學的這些東西對自己是有很大幫助的,但是如果你確定了方向建議你直奔主題,現在社會需要一門精而不是門門通的人才,現在有很多“全棧工程師”的概念,其實都是在建立在一門精的基礎上才去別的領域發展的,所以不要妄想一開始就成為“全棧”,還有如果你對當前做的事很抵觸,覺得一直糾結在功能上,但是又沒法去改變的時候,不妨竭盡全力把當前做的事做好,後面你會發現有事情做自己不知不覺總是會進步的;

4. 很多人找到我部落格,搜尋到我被Facebook邀請,具體見這篇部落格 被Facebook邀請的前因後果 , 雖然這算是對自己技術能力的一個認可吧,但是在技術上遠沒有大家想象的那麼牛逼,我一直在努力提升自己的技術,但是仍然有很多需要學習的,自己也一直在堅持學習,現在也一直想靠自己的技術來改變自己的生活,起碼不拼爹(主要是拼不了),但是後來才感覺到技術並不是一切,千萬別陷進無止境的技術坑裡,有很多事情比技術更重要,這個就等待大家自己慢慢發掘領悟吧。。。