臧萌:保值的不是技術,是運用技術的能力 | AMA集錦

極客時間2週年特邀100位在產品、架構、測試、運維、人工智能、管理、編程語言、運營等各個領域的專家,在 App 內與用戶交流互動。

InfoQ 特別整理了《Java入門》圖書作者臧萌(Mark)與用戶的互動和問答集錦,分享給大家。

我是臧萌,《零基礎學Java》的視頻課講師,之前寫過《Java入門1·2·3》一書。從事一線工程師工作13年有餘,當前工作是PayPal 數據處理組技術負責人。工作中主要涉及的技術棧包括Java,分佈式,消息隊列,Spring,DevOps,監控,DSL等等,對Hadoop,HBase,Aerospike,Storm,Spark,Esper也有一些研究。

極客時間已經2歲了,今天我來部落和大家聊聊,大家關於「編程學習,工作,軟件開發設計」問題都可以問我,我會盡我所能逐一回答,希望能和極客時間一起,把部落打造爲行業內最好的技術交流社區,大家燃起來。

Q1:Java未來走勢會如何,當今開發語言較多,Java未來的趨勢如何?

Mark:現在還沒有一門語言有替代Java的決定性優勢或者說明顯的趨勢。當然各種語言的市場份額都在起起落落。我覺得沒必要把語言和語言之間看成是對立的關係。有新的語言出現,說明行業在發展,有了新的點,新的問題需要解決。學習一門新的語言,也不是什麼難事兒。在有一門語言的基礎下,在工作中需要頻繁用到另一門語言的場景下,學會一門語言需要的時間大概是幾個月,達到熟練掌握另一門語言的程度需要的時間可能就是一兩年年。

聊聊Java前景的個人看法:

Java的前景其實還是可以的。Java的市場佔有率一直是波浪線,上上下下的享受。從找工作的角度來說,Java還是市場需求量足夠大的。這是一個行業和生態問題。比如說,一個技術總監,負責一塊新的業務,老闆甩給你X百萬,說,半年給我高出個XXX來。那麼現在做XXX的大都是用的YYY技術,你會選擇用ZZZ技術嗎?大概率不會,因爲YYY成熟,好招人,有現成的解決方案,坑少,資源多,確定性大。除非是ZZZ有很優秀的功能,對於新產品來說不可或缺,否則是不大會有管理者純粹爲了追求技術革新而嘗試這種變化的。簡言之,選擇一個語言(注意是語言,不是工具),八分以上看生態和背景,不到兩分看功能/技術優勢。

Java 怎麼流行起來,成爲編程語言第一把交椅的常客,這個故事我就不說了。都是事後諸葛亮。簡單一句的話,就是出現的時機對,Sun公司的策略對,語言的功能對。

Java GC是個問題,Java 耗內存比較多是個問題,語法不夠炫,寫代碼的效率有時候比較低。爲什麼 Java 能常坐江湖老大地位呢?我隨便說說自己的想法,想到哪裏說到哪裏:

- Java 的生態完整,成熟,開放,持續發展。太多公司在Java上投入了太多的資源。包括代碼資源,研發積累,人才儲備,比如阿里巴巴在JVM上就有很多的積累,自己也推出了龍井牌JDK。Java的人才也多,好招人。Java的坑也少(同樣的坑,趟的人多了,就更不容易踩坑,有坑也更容易更快的填平)。JVM也是一個開放的平臺,虛擬機絕對是Java的制勝法寶(內存自動回收,跨平臺,運行時優化,支持多語言/語法,面向標準發展,太多了)。Java是由標準定義的,並非某個公司獨自把持,讓更多的公司可以參與進來,(我認爲)這是維持生態的基石,也是促使生態發展的前提。

- Java 的功能和學習成本的平衡的拿捏的不錯。世界上大部分人還是普通人,很難的東西,很難普及。單從技術上說,後起之秀比Java做的好不難,難就難在“拿捏好功能和學習成本”的平衡點

- 面向對象的設計思路和“中庸”的語法,適合大規模協作編程。面向對象的設計思想,還是比較簡單容易理解的。很多編程語言功能豐富,條條大路通羅馬。這可以說是“鼓勵”程序員隨時隨地來個free style。但是這樣的問題在於,別人看這段free style的時候,就要花去更多的時間成本。別說別人,就算是自己,回頭看的時候,也難說不皺眉:what am I 弄啥嘞 ?有些技術就是這樣,學學可以很爽,但是太靈活不一定是好事情,真的大規模用起來不一定一直爽。

當然,Java 肯定是不完美。沒有一門編程語言是完美的,每種編程語言都由其活躍的空間,編程語言百花齊放,互相借鑑和發展,是一個好事兒。

Q2:二師兄你好,我是你的小粉絲,畢業一年半,您的專欄我已經看了很多講,感覺彌補了很多基礎知識,有空就去翻翻看,我現在是一個Java業務增刪改查程序員,你說的那些消息隊列,分佈式工作中接觸不到,但是自己又想學,確有不知道從何下手,很迷茫?

Mark:業務增刪改查也是很有技術含量的。只是現在的框架封裝的很好,把很多細節都封裝在裏面了。從業務用到的具體技術入手,可以學到不少東西。

有個簡單的問題:請你描述一下Java程序啓動的過程。這個問題的答案,全看回答的人掌握的深淺。學的深入了,可以聊一個小時,一知半解,可能只能回答一句話。我隨便說幾個問題:Spring是怎麼工作的?如果讓你寫一個依賴反轉框架,你會怎麼做?Spring是怎麼決定和組織Bean的初始化順序的?Spring是多線程的嗎?Transaction是怎麼做的?SQL精通了嗎?Tomcat啓動過程是什麼?太多了。如果能把工作中接觸到的,實際用到的技術吃透,是最好的。工作中能用得到的,學起來才起勁兒。除非有別的目的,否則沒必要刻意追求工作中確實用不到的技術。可以初步瞭解一下,但是深入學習的話, 還是要找和工作能有關係的東西。

Q3:請問老師,應屆生第一家公司總覺得不順心,公司氛圍不喜歡,同事之間也很冷漠。最主要的平時的任務也接觸不到什麼難點,可能和做的業務比較邊緣有關。只能自己平時去看一些博客或者視頻去了解一些不懂的技術。需不需要去考慮跳槽,但是第一份工作沒得到什麼提升盲目跳槽我覺得也得不到好的結果。希望可以得到關於應屆生提升自己和第一份工作換公司方面的建議。十分感謝。

Mark:一般來說,大家對工作經驗不少很豐富的同學,面試主要還是看基礎。工作三五年之內,如果能夠做到Java基礎非常牢固,編程能力和工作經驗匹配,能熟練使用常用工具(Maven,Git,DB等),不需要什麼特殊的專業技能(比如精通Kafka),offer基本上隨便拿,只是待遇問題。應屆生的話,我建議打好Java和編程的基礎(Core Java,Java的集合類,GC,內存堆棧,ClassLoader,IO,JVM,同步,數據結構,多線程等等),如果工作中用到Spring,可以好好學學Spring。用心工作,肯定會有提升。不要放過工作中遇到的問題,遇到一個,解決一個。遇到不會的,就學一個,不需要刻意去找學習的方向,也會有合理的成長的。

Q4:老師你好,我是一名前端工程師,想請教一個問題:前端工程師有必要學習Java嗎?因爲我瞭解到阿里很多大牛用Node.js做中臺,但很多業務場景還是不能滿足,有前端同學還是要去學Java才能實現特定場景的需求。之前聽過winter老師的公開課,他也表達了類似的觀點,說在阿里能把Node.js玩轉的大佬屈指可數,而且對這個技術的推進也很艱難。對此我想問問老師的看法,謝謝。

Mark:首先可以參考我在Q1下面說的關於 Java 爲什麼流行的回覆。

單獨從“已經掌握了NodeJs,要不要再繼續學Java”的角度,我不敢妄言,因爲我不大會NodeJS,也不太瞭解JS的生態。。。單純從技術和趨勢上講,大型的項目會趨向使用強類型的語言。這是經過了很多實例驗證的。所以如果繼續學習NodeJS,我能給出的一個淺淺的建議是,可以學一下TypeScript。因爲後端的複雜業務邏輯,用TypeScript的機率會比JS要大一些。NodeJS開發後端的優勢我覺得是全棧。拋開技術特點,我從錢的角度說說我的理解。如果前端用JS,後端用Java,可能需要三個人。但是有人忙,有人閒。如果都用JS,那麼可能兩個人就夠了,兩個人一直忙就可以。而且技術儲備只要一個技術棧,環境也只要一個環境,so easy。這樣可以快速且省錢的把一個事情搞起來。如果規模越來越大,對人的技術要求越來越高,一個人的工資頂好幾個人的,可能就會考慮後端用Java寫。同時,Java在大規模項目開發中的生態還是比較完整的。當然這只是一點淺薄的觀點……

如果你工作中有可能考慮使用Java做一部分後臺,學一點Java做好準備也無妨。

Q5:老師您好,我這裏有幾個問題困惑了很久。

1.最近總是焦慮,感覺Java領域的知識點太多,自己的知識深度和廣度都很欠缺。學習某一領域知識的時候總是不夠專一,每當學習了一部分的時候又覺得其他的領域也不懂又開始學習其它領域。多個領域一起抓這種學習方式是不是不好,因爲來回切換學習容易忘記之前學過的,是我太焦慮了麼,應怎麼改進。

2.最近想專心研究消息隊列,就目前工作4年的我,如果太過於鑽研一個領域會不會偏科?應該怎麼權衡?因爲Netty,Zookeeper,Redis,MySQL,Dubbo,虛擬機,這些領域我都還只是簡單會用,感覺跳槽面試完全不夠。

3.看書讀源碼時會看代碼的每一個細節,明知道不太好,就是不能夠說服自己改掉這個毛病,很枯燥,求老師指點一二。先在此謝過老師了。

Mark:喜歡學習是個好事情。

關於1)和2),我的看法是,學習的東西,尤其是深入學習的東西,還是要和自己日常工作能夠有關係。可能是可以直接用在生產上,比如說消息隊列,或者能夠開發一個獨立的小工具。這樣纔有學的動力和目的。能解決實際的問題。純學的問題在於,無法通過解決實際問題,產生實際價值的方式,驗證自己學的怎麼樣,屬於紙上談兵。我能感受到你是個不喜歡紙上談兵的人,可能這也是你焦慮的原因之一?

所以我的建議是,新技術學肯定是要學,選擇學習的新技術前,先評估一下哪些技術可能可以幫助到自己的工作。然後慢慢在工作中展開使用,邊用邊學。強調一下,生產無兒戲,在生產上用新東西要謹慎小心,步步驗證,慢慢推進,想好回退策略。如果是開發一個獨立的工具,對線上生產沒影響,是最好的。

關於3),可以從用入手,用熟了,再深入架構,理解了架構,再深入代碼細節。或者通過一些講解開源項目的書/課程來學習。

Q6:我是Ruby on Rails棧滿足業務需求的水平,有限的時間有兩個選擇:繼續深挖Ruby on Rails,那麼應該注重什麼方向以保證技能的通用性?如果跟隨老師撿起Java-Spring棧,以我的背景應該多關注哪些模塊?PS我未來感興趣的業務方向是雲服務提供商。

Mark:Ruby on Rails不熟,不敢妄言。拋出之前回復的一個觀點吧。保值的不是技術,而是使用技術解決業務問題、支撐業務發展的能力。說回Java。如果你有確定的職業方向,可以重點關注這個方向的技術趨勢呀。我倒是碰巧n年前做過一段時間的雲開發。當時做的是資源管理系統,用的是Spring+MySQL。典型的一個系統。但是雲計算裏現在方向很多很多了。不同的方向的技術棧差別很大。

Q7:老師您好,用過Java但是總感覺用的不得不好。很多細節不懂。前陣子又看了Java核心技術這本書。但是感覺還是很迷。所以老師,想要提升Java應該看哪裏?或者說看您的課程應該重點關注哪些部分?謝謝老師。

Mark:對於之前學過一些同學,重點當然是之前沒學會,感覺比較迷的啦。比如你如果覺得數組比較迷,就重點看看數組那一節。如果你覺得類和麪向對象比較迷,那整個第二篇你都要好好看。

Q8:老師,最近一直在努力學習Java,但是總感覺沒有找到技巧,很慢,對很多東西都無從下手,很是着急,有沒有什麼好點的方法?

Mark:Java學習沒有太多技巧。如果是基礎語法的話,可以順着我的教學視頻學,有問題歡迎隨時交流。如果是某個具體的技術,可以看官方文檔的入門demo,這個過程我在第六章的“160 | 一個從pptx文件中抽取文字的小工具”也有講述一個大概的過程。看文檔,看demo,寫代碼是必不可少的。也要好好利用搜索引擎和StackOverflow。

Q9:臧老師,您好,請問在開發過程中,用的比較多的Java知識點有哪些?平時提升Java技能需要關注哪些方面?

Mark:用的比較多的知識的,就是你不會的知識點 :-)平時提升Java技能,最需要注意的就是,遇到不會的知識點不要繞開,有計劃的刻意學習這些,Java水平自然會提升。從刻意學習知識點的角度來說,比較普遍的有:數據結構(視工作性質看要學多深入),Java的concurrent包比較值得學,apache common的很多包,用到的話值得學一下。Spring的用法,思想,要學。雖然很俗,但是Java的面向對象的思想要理解,平時工作可以多想想,類爲什麼要這麼設計,以後方便擴展否,別人用我設計的類,會不會罵這些類設計的太爛不好用。

Q10:身邊有些同事從Java轉去大數據了,還有一些工作沒幾年的大數據人比同級別的Java工程師公資要高不少。一方面覺得心裏不平衡,一方面又不想放棄已有的Java計數棧,請問臧老師關於Java和大數據的一些看法。(就是從Java開發轉到數據工程師,又轉到大數據開發。)

Mark:從數據處理系統的角度來說,大數據已經是必選項了,這顆技能樹是肯定要點的。如果你說的大數據開發工程師僅限於會用這些大數據平臺,做一些系統,那我覺得還好。使用這些大數據平臺的學習成本並不是很高。但是根據我的見聞,做這個除了要對技術有感覺,還要對數據有感覺,有折騰數據的衝動。

轉行做大數據平臺的開發工程師,那就是另一回事兒了。與使用大數據平臺相比,這是在一棵樹下乘涼,還是和一棵樹綁定的區別。大數據開發工程師要求對某個或者某幾個大數據平臺有深入的學習和研究,比如Hadoop,HBase,Storm,Spark,Flink等等。現在大數據平臺還沒有絕對的勝利者,所以如果深入研究一個系統,以後如果這個系統不主流了,可能之前的積累就有些浪費了(當然這些經驗對學習其它的大數據系統肯定是有幫助的,但是畢竟可能要重新學)。即使是同一個大數據平臺,它的的技術更新也是比較快的。做這個方向,要確定自己是持續學習新知識的動力,而且要有深挖技術興趣,比如針對自己公司的業務,對平臺的調度或者資源分配算法進行優化等。

最後,學習新東西總歸是好事情。即使用不上,也是拓寬了視野,鍛鍊了能力。

Q11:歡迎臧老師,能指點下從其他語言到Java的一個學習線路圖麼?謝謝

Mark:你這是曲線讓我做廣告麼。如果是有了一門別的語言的基礎,那麼我的零基礎學Java的第一章可以輕鬆愉快的學一下,後面的內容組織是我精心安排的,略有囉嗦,但是沒有廢話,建議要上手實操,跟着裏面的大小例子學起來。學完之後,Java的語法是沒有問題了。剩下的是熟悉Java的生態環境。我又要提Spring了。Spring基本上是Java學會之後下一個必須學一點的東西。不僅僅是從技術上,學好Spring對理解面向對象,程序設計也有幫助。再然後,就看具體做的東西了。Java生態大,每個領域都有值得學的東西。要根據自己的工作/興趣展開。

Q12:老師,您好!我目前從事PHP開發,已經使用PHP兩年多了,想問下,Java的技術路線,技術棧都是什麼?

Mark:如果是做網站的話,現在應該是用SpringBoot的比較多。Spring生態完整的覆蓋了網站開發的各個層,包括http,數據訪問,事務支持等等。Swagger可以方便的幫忙生成API和框架代碼。當然,上手之後還是要深入學習的。

Q13:Mark 你好,管理信息系統的實現一般是 Java/PHP/Python/Go => 數據庫。業務上升之後,變成 Java/PHP/Python/Go => cache => 數據庫。在往後增加搜索,讀寫分離;主要的業務就是對存儲進行更新和檢索。是不是說管理信息系統的宿命就是面向存儲編程。選取合適的存儲服務程序,進行數據的編輯。這時候,工程師的價值就是存儲程序的熟悉程度?

Mark:說一點我的感受。雖然做技術的內心的小驕傲可能很難放下。但是遲早絕大多數的技術人都會認識到這一點:技術是爲業務服務的。做技術的第一齣發點是解決業務的問題。而不是追求技術本身的的高度或者說複雜度。當然,第二齣發點就是追求技術的精進,(以爲了更好的服務業務)。“服務好業務”和“把技術做精進”有時候是一致的,有時候是不一致的。

當然,現在還有一種更高遠的說法,是要用技術驅動業務。這個對於很多公司來說,太過高遠。即使是在有這種能力的公司,也不是每個人都有這種機會參與這種項目。所以技術驅動業務,還是不能算主流。至少現在的主流,還是技術服務業務。

那麼再說一點詩和遠方。技術服務業務,是一個螺旋上升的循環。如果你對現在處理的業務已經重複到無聊的程度,那麼就多花心思去讓業務自動化,讓代碼生成代碼。而不是甘心的去重複的堆砌代碼。這樣,即能服務好業務,也能精進技術。但是落腳點要找對,業務第一,業務賺錢,技術不賺錢。純玩技術誰給發工資呢?

Q14:大佬好,我想詢問一下,Java的未來前進方向是怎麼樣的呢,以及有什麼知識是比較有保值意義的呢?!據我所知道的,中國程序員裏面Java的分量其實是很足的,但在外國好像其比例略微有着下降的趨勢,我不知道後面國內的前進方向是否會跟隨着外國,但假設會的話,那我們如何去把學習和對待這些改變呢,再多學種語言的基礎上,Java知識體系中有什麼是較爲重要或者說對我們以後的道路是會有着更大,更深遠的影響呢?!

Mark:其實有保值的技術,是不存在的。請收起你的搬磚聽我慢慢忽悠。保值的是能力,而非技術。技術是能力的一種,但不是全部。技術存在的意義,是解決業務問題。幫助公司賺錢和發展。所以真正保值的能力,是活學活用技術,用技術解決業務問題的能力。而不是技術本身。

再聊聊Java本身的前景:

Java的前景其實還是可以的。Java的市場佔有率一直是波浪線,上上下下的享受。從找工作的角度來說,Java還是市場需求量足夠大的。這是一個行業和生態問題。比如說,一個技術總監,負責一塊新的業務,老闆甩給你X百萬,說,半年給我高出個XXX來。那麼現在做XXX的大都是用的YYY技術,你會選擇用ZZZ技術嗎?大概率不會,因爲YYY成熟,好招人,有現成的解決方案,坑少,資源多,確定性大。除非是ZZZ有很優秀的功能,對於新產品來說不可或缺,否則是不大會有管理者純粹爲了追求技術革新而嘗試這種變化的。簡言之,選擇一個語言(注意是語言,不是工具),八分以上看生態和背景,不到兩分看功能/技術優勢。

再聊聊學習:

首先,Java的基礎要學牢固。Java現在不同的領域技術棧還是有差別的。就我接觸到的面來說,Spring是Java知識體系當之無愧的必選必學必會。拋開語言,可以學一些更通用的東西,比如Linux,網絡等。這些技術其實是比較值得積累的,因爲它們的變化比較少,而且用的又非常廣泛。Java生態對很多領域都有滲透。我的建議是,根據你自己現在工作所在的領域,選擇幾個Java項目的翹楚,深入研究一下。工作以後,學習還是要和工作結合在一起的,這樣方便實踐,也更有學習的動力,不容易放棄。

回到最初的觀點,對“以後的道路是會有着更大,更深遠的影響”的,還是學習用技術解決問題的能力。單純的談一個技術,意義不大。現在的而技術都對學習者很友好了,各種配套工具和資料都有。學會不難,用好不易。


2 年時間,極客時間已經爲用戶交付了 94 門課程,涵蓋產品、架構、測試、運維、人工智能、管理、編程語言、運營等多個領域。9月「部落」上線後,用戶又有了新的思考和討論的聚集地。歡迎你加入「部落」,和大咖們共同探討技術問題,和我們一起探索新的學習方式。

相關文章:
《10年Java工程師:如何開發控制3500臺機器人的系統》
《2019 中國 Java 發展趨勢報告 | 深度調查》
《Java:下一個 COBOL?》
瞭解更多請搜索:臧萌Java

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章