對Android工程師來說,2017年是怎樣的寒冬

本文出自扔物線的知乎Live。

一、對Android工程師來說,2017年是怎樣的寒冬

起因:這次大家都感覺工作比較難找了,這是怎么發生的呢,又是什么導致的呢?

初創公司倒閉,大公司裁員,這些人就會閑下來,所以工作會變得比較難找。由于這個原因,所以這次的寒冬是有特點的,靠等是等不過去的,只能是主動出擊。

因為這不是現實中的冬天,只是一個比喻而已。實際上是因為人員過剩,導致的競爭加劇。以前由于大家都在創業,所以大家都往這個行業涌,工資高又缺人嘛,那么就必然出現新手很多的局面。創業公司對此事是不在意的,或者說不得不在意。因為由不得你挑,人不夠用啊,而現在市場冷靜了,創業的人少了很多,那他們之前的員工就被剩了下來,另外任何事情它的結果,總是要比起因慢一步反應,在互聯網市場變冷的時候,工程師的數量并沒有相應減少。之前為市場提供了很大幫助的培訓機構,他們還在繼續的量產初級工程師,而且當年報考了工作比較好找的“計算機專業”的大學生,他們也還在一屆一屆的畢業,有些還沒畢業,他們就一屆屆的出現在市場上。這就加劇了人員過剩的狀況。人多羹少怎么辦,競爭唄!

這種狀況就是大家遇到了一個共同的檻,檻相當于一個篩選器,垮過去的人就垮過去了,沒垮過去的人就被淘汰了。當這波篩選過程結束,“冬天”就結束了。這個過程可能不會很快,可能一兩年吧,但你是不能靠等的啊!想著熬過這段艱難期就行了,這樣不行,因為這次相當于是一個末尾淘汰的競賽,就像高考一樣,如果熬的話對你自己是不利的。

這就是前面所說的,靠等不行,必須主動出擊,自己去擊破這個點。

二、什么樣的人能在這個冬天能輕松舒適的生存下來?

實際上列舉這些人,沒有什么指導性的意義,但你可以感受一下自己在不在這個行列,或者離他們有多遠。

一個詞概況——強人!前面說了這是一個末尾淘汰的事。所以強人是不怕這個冬天的,他們甚至感覺不到冬天的到來。可能你找一個這樣的人問一下,現在的工作好難找啊,你感覺到了嗎?他肯定說,有嗎?沒有啊。換句話說,這個冬天是有針對性的,他只針對經驗相對少的工程師,對于高級人員來說感覺不到。事實上現在還有很多團隊,不管是大公司還是小團隊,都還在四處尋覓中高級工程師,但是找不著。

強人是我說的一個詞,那么強人是怎么強法呢。主要就是兩點,一個是能做出別人做不出來的東西;另外他做出別人能做出的東西時,他比別人做得快。

他們具體是誰呢,主要有這么幾類人:1、大公司的多數人,你別覺得BAT的人都很平庸,他們多數人的水平還是很不錯的,因為畢竟大公司篩選人是有它的標準的。2、第二類是那些在小公司但比較精的公司,小而精的公司的人。其它這兩類人是很相似的,都是被公司的招聘標準已經衡量過的人。他們的水平一般來說都是足夠的。3、除此之外還有一些小型創業微型創業公司的人,他們可能對自我提升比較注重,并而掌握了自己的方法,然后他們就在不停的進步。

這幾類人,他們在這個冬天就會很舒坦的生存下來,或者說他們感覺不到。

前面我說了,列舉這些人并沒有什么指導性意思,我說這個主要是你可以給自己大概定個位,心里大致有個譜我是什么位置,我和他們是一個行列不是比他們差點差多少。

這個問題就到這了,就是有哪些人能比較輕松舒適的生存下來。

三、怎樣可以成為這樣的 Android 工程師呢?

這個可能是今天的重點。我先來個概況,主要有三點,一點是你有提升的意識,一點是你有好的時間安排,第三就是你要有具體的合適的計劃。

第一點意識,連想法都沒有別人怎么幫你啊,不過你們既然來了,明顯都是有提升的意識,所以這個我也不多說。

第二點時間安排,這個每個人都不太一樣,有的人朝九晚五正常上班,有的人996,有的人單身,有的人要陪男朋友、女朋友,有的人已經有家有孩子,時間花的多就提升的快,花的少就提升的慢,只要花時間就可以。

接下來第三點,具體的規劃。這個是我要重點說的,因為這是最關鍵的也是最難的。而且我想大家來,主要是沖著這點,我想變強,我愿意花時間,花精力,但我不知道該怎么辦。很多個甚至不是剛剛發現這個問題,很多人發現自己不能像當年剛剛入行那樣,每天都在學到新東西,每天都在進步,而是不知道從什么時候開始,自己慢慢進入了停滯狀態。沒有技術的進步了,有的人經歷這種狀態甚至已經兩三年了。但是感覺沒什么辦法,好像自己遇到了瓶頸一樣經常嘗試學習很多天,甚至很多次下來都發現自己并沒有什么實質性的進步,怎么辦呢,我告訴你們怎么辦。在說怎么辦之前,我必須得先說一下為什么,我得說這是正常的這非常正常,因為你進步了,初入門的時候學的東西很簡單,什么都是知識比較容易有提升的感覺。而在達到一定水平之后學習知識就會變得困難,這是很正常的。但這就是所謂的瓶頸,你不是好像遇到了瓶頸,你是真到了瓶頸,如果你突破了,你就會進入新的高速提升的階段,就會在一段時間內行云流水的學習進步,但能不能突破瓶頸怎么突破往往是最大的問題。

接下來說怎么辦,每個人都有技術瓶頸大家各不相同,我也沒有辦法解決每個人的問題,但是對于這次所謂的寒冬,感受到了冬天的人,感覺冬天到了也就是發現現在競爭壓力變大了,工作很難找,對這些人來說要突破瓶頸,在人群中脫穎而出,最關鍵的只有一點——補基礎。

先說下基礎是什么,有很多人經歷過大公司面試,大公司面試就是考基礎,考數據結構考算法什么的,為什么?基礎到底有什么用,有人會覺得我們是做事的,要這么多基礎干什么,能把事情做出來不就行了。

我舉個例子,我小時候喜歡跟我爸媽去廣場上玩,我在廣場上有一段時間會看見一個武術教練帶著一幫小孩教武術,他們怎么學的呢,先練扎馬步練好幾天,然后練基本拳法,然后是各種格斗的招式,那么扎馬步和基本拳法這兩個是比較基本的東西和打架基本的招式哪個有用呢?你這么想如果兩個人,每個人只學一天,一個學扎馬步,一個直接學格斗,第二天讓兩個人面對面打,誰贏?肯定是那個學格斗的。但是如果學一年,同樣是兩個人,一個先學扎馬步再學習基本拳法,然后再學習更高級的招式,而另外一個人一年都在學習高級招式,這個時候兩個人再打誰能贏呢,那就第一個人。這就是基礎的作用,基礎本身并不能給你帶來看得到的能力,但它能夠讓你再學習更高級的東西,有更高的效率、更快的速度。而且基礎的強弱雖然不能給你一個可見的高度,但它在一定程度上決定了你能達到的高度。

我再說回 Android 開發。數據結構和算法能有什么用。再你連一個有界面的軟件都寫不出來的時候,沒有任何作用,真的沒有任何作用。但當你有了一定的水平,它就會越來越有用。我有個朋友給我講過一件事,他是做后端的,有一次他要做一個新的模塊,這個模塊在他看來規則很簡單,但是邏輯有點復雜,他想了半天都想不出來,然后他就喊他的一個同事來,說你有空嗎,來幫我一起看一下這個問題。他同事聽完,想都沒想,說這不就是寫一個什么什么查找算法嗎?我來吧,你不用管了,然后悶頭兩個小時就寫出來了。這就是基礎,當你沒有你應該有的基礎的時候,你甚至很難想像到它的作用,但當你有了,那種能力的提升真的不是一個等級的。

剛才說了基礎是什么,接下來說,我們為了過冬需要準備什么基礎?

對于感受到冬天來了的人,你要提升什么基礎呢。主要是和 Android 相關的幾個基礎,UI、網絡、線程。如果你說別的方面,另如數據結構、算法,或者說操作系統、計算機原理,你如果說這些都重要,當然不能說這些是錯的。但就當下來說,為了過冬,明確一下是為了過冬,那么最終就是要的就是這么幾個,Android 相關的東西:UI、網絡、線程。

對于這三點,我分別說一下:

1、首先說UI,也就是界面,一般的界面我們都會做,一些流行的效果也可以通過Google 的 support 包,以及一些第三方庫來解決。但如果設計師給你一個很新穎的效果,或者對某個第三方庫進行一些細節的調整。如果發生這種情況,如果你不懂UI的原理,你只能跟設計師說聲,不好意思太難了,我實現不了。設計師可能不會怪你,公司可能也不會怪你,因為他們發現不但你做不了,其它人也做不了。但你和別人沒有區別,你怎么脫穎而出。

至于UI具體要學習的方面,要提升的方面,主要是和View相關的那三點,View的繪制、View的布局、View的觸摸反饋。

繪制就是你怎樣讓界面畫出你想要的內容;布局就是讓所有的控件他們之間有一個你想要的排列關系,按照你想要的方式排列;觸摸反饋就是怎么滑怎么點,然后他們按照你想要的方式來反饋。其實UI最關鍵就這么點東西,但學起來還是挺難的,所以很多人看一看也就不看了,但你真突破這一點,真把它學過去了,改變非常大,它對你的作用很大。

2、第二是網絡,我們現在都會用 okHttp、Retrofit,你使用OkHttp、Retrofit能夠實現大部分的網絡需求,但如果你們的Web 接口的設計和你所期望的不太一致,導致你不太會用,或者你們的接口出現在一些只在Android 上有 iOS上沒有的問題。這可能很多人遇到過,如果你不懂 Http 的原理你怎么辦,你是讓后端的人幫你解決問題嗎,就算人家愿意和你一起解決一個由于你一個人水平不足所導致的難題,你也起碼要把問題描述清楚,但如果由于你對原理的不清楚,導致你都不知道問題出在哪。這時候大家都等著你把問題拋出來,然后一塊解決,但你說不知道我找不出來,多尷尬。我說的這些都是很常見的問題,很多公司都會遇到的問題。

在網絡方面,我們迫在眉睫需要補的基礎是什么呢。Http、TCP/IP的原理,知道原理就行,大致是怎么回事就行。例如,http各個方法 get是什么 post是什么,之間的區別是什么,web接口一般會怎么設計,然后http的header是什么意思,就是這些大致明白就行不需要了解得多深。在 Android 上面Http、TCP/IP它們是怎么用的。了解得越多越好,但對目前來說了解這些是必須的。

3、第三點是線程,前面兩個說的都是功能方面的,你不會你就做不出來,第三個我說的是線程,是性能和穩定性方面的。Java和Android對于線程的封裝已經是比較好用了,用 Thread、Handler、AsyncTask都能很快的上手來使用,而且看起來也沒什么問題。但很多時候,程序的內存泄露,程序的卡頓很多時候都是因為線程的不規范操作引起的,你可以在網上搜到最常見的解決方案,你一搜他也遇到了,并且他解決了,把他的代碼給拷過來,但更多的問題并不是那么普遍的,你們公司的運營人員只會告訴你,用戶反饋軟件太卡了,或者說我們軟件經常崩潰,這時候面對運營不斷施加的壓力,你怎么辦。

我們現在比較緊要的需要了解的是什么呢,線程、線程池的原理,Handler的原理,AsyncTask的原理。多了解一些,對你很有幫助。

上面這三個我所總結的,對于多數感受到冬天來臨的Android工程師來說最需要關注的技能點,這三個技能點你掌握了,你就會發現你比以前厲害多了,你屌的不行,但這僅是相對以前來說,很多人他們各方面都非常厲害的,你要真正的成為高手還有很多的路要走,但是把這三個掌握了,你就能實現一個跳躍。你會發現你比大多數人強了,這當然還不夠,這是通用的關鍵技能點里面最要緊的,就是現在就要去掌握它們的。至于一些和公司相關的,例如斗魚的工程師你得多掌握一些視頻相關的技術;相機的公司你得多掌握一些相機相關的技術。這些你們比我清楚,我就不多懟了。

我再總結一下我的建議,學基礎但不是非常基礎的數據結構什么的,這些很重要,但不是現在最關鍵的,最關鍵的是我說的這三個,和Android相關的基礎:UI、網絡、線程。

另外關于新技術,我覺得選擇性的了解吧,不要跟風,不然你會發現光是學新東西都學不完,精力白白浪費了。

其它我知道啊,說的輕巧動動嘴,我說這三個很重要,你們去學吧。但是學起來是很難的,而且這些往往是卡著一些人的地方。并不是說我沒有學過,而是說我各方面都學了,就這三個沒有過去,或者說就這十個我沒過去,其中這三個你提到了,今天直播中你提到了。不是我不學,而是我學不會,所以很多人,你能手把手,你多說點具體點告訴我怎么學怎么做。關于這個我確實在準備,不是目前我還拿不出什么實質性的東西。所以我不多說了,過一段時間我會公布的,在這之前你們自己想想辦法吧。

四、5年之后還需要 Android 工程師嗎?

我要說的是也許需要,也行不需要,需要的可能性大一點,但是這不重要,我知道你們真正關心的問題是,怎么保持越爬越高,并且不會突然墜落。主要是兩點:保持嗅覺、持續提升。這個說起來有點像廢話,不過可能更多的人是不知道這兩點應該怎么做到。

首先是嗅覺,也就是在感覺到自己的技術方向即將要不行,即將要墜落的時候,及時轉型。這個誰都知道,這很淺顯嘛,眼看要不行了我就轉型,關鍵是什么呢,你要有判斷力,不要別人說啥,哦,對對對。這個是需要判斷技巧的,可能有的人有自己的技巧,我的技巧是什么呢。預演式的推測,就是什么呢,有人說這個事情要怎么發展了,要出大新聞了,要出大事了。那么我會想如果真的像他說的那樣要發生了,那么接下來會有什么事,以及他說的這個事會怎么實現,那么其它人市場啊、人員公司、用戶啊他們會有什么反應,是不是真像他說的那樣發展,往往你這么一想,你會發現他說的這些站不住腳。

我順帶的說一下我自己對于Android的判斷,我目前是沒有看到Android會在短期內滅亡的跡象,塞班當時的快速消亡不太會被谷歌重現。現在格局太穩定了,除非出現什么顛覆性的新對手,不然Android、iOS都不太可能快速消亡,如果出現,我們應該非常強烈的感受到,到時候只要不求一時的舒服,我現在拿多少多少工資,到時候我一轉型轉到一新系統上面沒有人要,我不轉吧,只要別這樣就行。不過有一句說一句,這種情況短期內真的不太可能發生。

接下來說一下第二點持續提升,關于持續提升有一個很簡單的原則就是,長期來看針對下層的基礎去提升;近期來看針對上層的那些最表面的東西來提升。實質上最高效的策略,是先把底層的都學了,然后再學上層你會覺得學什么都超級輕松,我遇到過這樣的人,但是這樣做在多數情況下有它的不現實性。例如時間緊迫,我現在已經迫在眉睫了要改變改變了,你讓我把下層學了,已經兩年過去了。還有什么呢,堅持不住。堅持不住這個事,大家都不會說,其實多數人他的毅力都是有限的,你可能感覺只有你堅持不住,其實大家都不說而已,這是很現實的問題。它不是一個自尊心競賽,我非要不說我堅持不住。這是事實:時間緊迫、堅持不住。這就是兩個很現實的問題。所以先把下層全學完,再學上層,是一個理想性的少數人能做到的事情。但是比較現實的是分兩部分,長期來說針對下層,近期來說針對上層。

具體的做法,怎么在近期學習上層,學什么上層。怎么計劃遠期的下層以及怎么分配時間。我也在想辦法總結,不確定什么時候能總結出來。如果我總結出來,在今后會陸續把后面的總結放出來,可能會放在知乎、微博。今天我準備的內容就是這樣的,接下來回答下大家的問題。

Q:什么樣的程度才叫掌握?

A:例如,我舉個例子,我給出一個正常的界面,不是為專門難為你的界面,它有什么動畫,有什么布局間的關系,顯示什么畫面效果,我給出一個界面你不能跟我說你做不到。前提是我不是出了一個專門為難你的界面,是個正常的界面。我就認為你的View算是掌握了,另外的兩個差不多是同理。

Q:大三了,明年春招想拿到BAT級別的Offer,需要從哪些方面發力呢。以及Android方面怎么進階學習?哪些新技術可以學習下?

A:關于大公司的校招,一般看重的是基礎能力,你把在學校的基礎學好了,幾乎是隨便闖天下,例如對于做Android的來說,把Java、數據結構算法以及網絡學好了最重要,其它的專業知識,操作系統,離散數學,多多益善。有了這些技能,再配上點Android的技能,那大公司的Offer會相對容易很多。關于第二個問題,進階學習前面說過了。至于新技術,還是我說的那個,其實自己判斷就好了,不要盲目追新。例如 Rxjava 雖然是我寫了那篇文章,React Native這些,你覺得它對你沒有用,你就先別看了,有個簡單的原則如果一樣東西你只要看它流不流行,而不是好不好,但你手頭又有重要的基礎技能需要學習,那么可以先不理這些新技術,如果某個新技術對你真的很有用,當它找個門讓你學的那天再學也不遲。

Q:Android 底層需要怎么去學習呢,代碼太多如何找合適的內容進行學習?

A:其實這個問題,應該很多人都想問。實質上Android底層這個詞是很大的,很少有人能把Android底層這個概念學全了。你應該是想掌握一些更深入的東西,但你最好先確定要學習的底層這個底層是什么。把它明確成具體的任務,例如我想了解WebView是怎么工作的,或者我想知道Activity的工作原理,然后你根據你的習慣來做就好,具體到底是看文檔、看你信任人的博客或者是看源碼,取決于你對深度知識的要求,把大詞換成小詞,往往你就知道你該怎么做了。

Q:前端技術越來越成熟,客戶端需求感覺在減少。

A:另外還有一個相似的問題,Android 好像在被前端擠。這個其實是個老生常談了,就是今年這個火,明年這個火,大家好像被這種新技術擠來擠去的好痛苦啊。其實就像我今天講的被擠的只是一部分人。你進級了就不會被擠了。而進級的方式我剛剛已經說過了。另外說一下,我說的這種被擠和剛剛說的那個某項技術會不會被淘汰是否會過時,是不一樣的。如果你真的感覺它過時了,不是一些初級人員被擠出去了,那么它是另外一個話題就是怎樣提前跳出來。

Q:Android程序員,如何權衡其他技術棧的積累,如前端、后臺開發。又或者說有沒有必要學這些,程序如何?

A:這個其實其它領域你稍微了解一下會比較好,沒有必要太多了解,主要是對合作同事的了解方便你們溝通合作,以及有觸類旁通的作用,就是你了解了這個它會輔助你學那個。那么你了解其它的一個東西,它會反過來輔助你了解當前你主力在做的這個東西。主要是輔助作用,稍微了解一下會比較好,前提是你有空,如果沒空,只能二選一的話,我的建議是選擇當下不去觸類旁通。

Q:Android + H5 一起搞得話會不會多加點競爭力。

A:這個問題可能和我前面說的問題比較相似,但有些人可能認為不一樣。就是H5這個非常火的東西,它該不該學,該不該會。還是那個問題就是,新技術我到底學不學。還是我說的那個,如果你只是聽說一個東西很火,你先別理它,當你感覺到一東西很火了,就是你公司或者你自己不用它不行了,那么你需要“浪費”一段時間,來學這個你必須要掌握的東西來做它。是否需要“浪費”?需要!但如果你只是聽說一個東西很火,學不學?不學!

Q:怎么看小程序對Android開發的影響?

A:其實這個倒不是對Android開發的影響,而是微信的小程序對Android APP 有什么影響。應該是沒什么影響,我自己的意見。有很小很小的影響,可以認為是被忽略的影響,我認為是這個級別。所以因此所導致的Android崗位減少,對于Android開發的影響可以忽略不記,這是我的理解。

Q:一般作為中層級別的開發是公司業務開發的骨干,時間非常有限,凱哥有什么方式可以讓知識的獲取效率更高么。

A:對于我自己來說,我怎么提升呢。我從網上找東西,免費的收費的我都看,我傾向于收費的,由于收費會花很多精力去做,比我自己去找快很多。

Q:假設對于今天擔的三點有一定基礎了,接下來的學習方向和規劃有什么建議嗎?

A:這個問題我前面簡單說了一下,就是長期來看針對下層。至于具體的方案,今天沒有準備,我也沒有想太多,因為這個其實是比較針對個人的了,下層的東西大家的差異是很大的。

Q:個人覺得Android的單元測試不應該過分看重,但如果寫的話,怎樣寫出可測試的代碼?

A:單元測試主要是為了防止做項目的時候,半路出現一些之前沒有出現的Bug。例如,你登錄的時候輸入密碼你有做檢查,但做著做著你可能不知道什么地方一改,密碼檢查沒了,單元測試可以防止這樣的問題。同樣需不需要單元測試,你自己來判斷,根據不同的需求來判斷,它就是為了項目的穩定,不會因為之前沒有的問題后來出問題了。

End.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,462評論 25 708
  • 30個月入托的還呆萌著的弟弟。 從開院第一天就肺炎,于是隔兩天去一次學校。上午嘻嘻哈哈的親子游,下午哭哭啼啼的吊針...
    跟著寶寶一起成長閱讀 333評論 0 1
  • (文/犬君 圖/Gary Rosenberg) 古人有云:橘生淮南則為橘,生于淮北則為枳。 意指事物好壞與環境有關...
    犬君閱讀 3,599評論 0 8
  • 三十年后,我問王城:村頭二柱子的玩具飛機你到底弄到手了沒有? 王城:你大爺的。。。。。。 接著王城沉默 哥哥把王城...
    西門社長閱讀 282評論 0 0
  • 函數函數定義與調用變量作用域全局變量方法高階函數閉包箭頭函數$generator$ 函數 函數定義與調用 定義函數...
    染微言閱讀 629評論 0 5