一位10年Java工作經驗的架構師聊Java和工作經驗

十年的職場之路堅持不易,分享下我的「IT 職場」經驗。

時光飛逝,我事業中第一個十年已然結束了。在這十年裏,讓我收穫了很多,跟大家分享一下我在 IT 職場方面的一些個人經驗,不一定對每個人都實用,請大家僅作參考吧。

Java 會在很長的一段時間內是主流

爲什麼開發Java Web都要用框架?

我個人覺得框架有以下幾點作用:

  1. 讓開發更加高效,屏蔽底層技術細節,讓開發人員關注在具體業務上。
  2. 框架實際上也是一種規範,可以讓每位開發人員保持同樣的編碼風格。
  3. 會使用主流框架的開發人員,在人才市場上比較好獲取。

現在做Java Web開發都用哪些框架呢?

常用的比如Spring MVC、Struts2 等,國內的 JFinal、Nutz 等也不錯,當然Smart 也是一個很好的選擇。

有一定Web前端開發經驗的人,很多都會有這麼個想法:那些寫框架的人好厲害,什麼時候我才能寫一個自己的框架呢?有時候看看別人的框架代碼,又覺得很複雜,對此我有一些建議以及新人學習需要什麼基礎?分享一些好的方法。

對於接觸 Java 不太久的朋友,建議按照以下幾個步驟來學習:

  1. 學習 Java 基礎語法與核心技術,包括 Servlet、JSP、JDBC 等。
  2. 熟練使用流行開源框架,包括Spring、MyBatis 等。
  3. 研究開源框架源碼,並吸取其中優秀的架構。

此外,在學習的過程當中,建議做學習筆記,最好能通過博客的方式來記錄自己的收穫。

使用 Python、Perl、PHP、Ruby 等腳本語言開發 Web 程序,跟使用 Java 開發 Web 程序相比有什麼不同或者優劣?

前者屬於動態語言,無需編譯,可通過解釋的方式來運行,而且 Java 需要首先通過編譯,將源文件轉爲字節碼,且載入 Java 虛擬機才能運行,相對來說,Java 對環境的要求較高,但 Java 具備更強的面向對象能力。此外,Java 還擁有較廣的開源社區以及流行的開源中間件。因此,如果是做大型系統,建議使用 Java 來開發,而並非那些腳本語言。

針對 Web,Java、PHP、Python、.NET 之中未來發展前景最好的會是什麼?

我認爲 Java 在未來還會有一段很長的路,需要在語言本身上做到更加輕量級,用最少的代碼來實現目標功能;PHP 相對來說會比較平穩,它的特點非常突出,上手快且易於開發 Web 項目;Python仍然不會有太大的用戶羣體;.NET 加入開源社區太晚,且較 Java 而言並沒有太強的優勢,可能會走下坡路。

在軟件開發中有很多的設計模式,也有一些很高冷,談談我對軟件設計的理解,以及讓一些設計原則接地氣。

瞭解設計模式的朋友們,想必都聽說過“六大設計原則”吧。其實最經典的 23 種設計模式中或多或少地都在使用這些設計原則,也就是說,設計模式是站在設計原則的基礎之上的。所以在學習設計模式之前,很有必要對這些設計原則先做一下了解。

GoF(四人幫),傳說中的四位大神們,他們聯手搞出了一套設計模式,堪稱 OOD(面向對象設計)的經典之作!震驚了整個軟件開發領域。但這四個老傢伙非常怪異,總是喜歡顯擺一些高深的理論,甚至有時候不說人話,十分讓人費解。

除了最經典的六大設計原則以外,還有一些其他的設計原則也非常重要。我將儘可能地解釋這些晦澀的理論,希望看完之後,會讓您對這些設計原則稍微加深一些理解。若有不正確的地方,懇請大家指正!

  • 六大設計原則

先看一幅圖吧:

這幅圖清晰地表達了六大設計原則,但僅限於它們叫什麼名字而已,它們具體是什麼意思呢?下面我將從原文、譯文、理解、應用,這四個方面分別進行闡述。

1. 單一職責原則(Single Responsibility Principle - SRP)

原文:There should never be more than one reason for a class to change. 譯文:永遠不應該有多於一個原因來改變某個類。 理解:對於一個類而言,應該僅有一個引起它變化的原因。說白了就是,不同的類具備不同的職責,各施其責。這就好比一個團隊,大家分工協作,互不影響,各做各的事情。 應用:當我們做系統設計時,如果發現有一個類擁有了兩種的職責,那就問自己一個問題:可以將這個類分成兩個類嗎?如果真的有必要,那就分吧。千萬不要讓一個類乾的事情太多!

2. 開放封閉原則(Open Closed Principle - OCP)

原文:Software entities like classes, modules and functions should be open for extension but closed for modifications. 譯文:軟件實體,如:類、模塊與函數,對於擴展應該是開放的,但對於修改應該是封閉的。 理解:簡言之,對擴展開放,對修改封閉。換句話說,可以去擴展類,但不要去修改類。 應用:當需求有改動,要修改代碼了,此時您要做的是,儘量用繼承或組合的方式來擴展類的功能,而不是直接修改類的代碼。當然,如果能夠確保對整體架構不會產生任何影響,那麼也沒必要搞得那麼複雜了,直接改這個類吧。

3. 里氏替換原則(Liskov Substitution Principle - LSP)

原文:Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it. 譯文:使用基類的指針或引用的函數,必須是在不知情的情況下,能夠使用派生類的對象。 理解:父類能夠替換子類,但子類不一定能替換父類。也就是說,在代碼中可以將父類全部替換爲子類,程序不會報錯,也不會在運行時出現任何異常,但反過來卻不一定成立。 應用:在繼承類時,務必重寫(Override)父類中所有的方法,尤其需要注意父類的 protected 方法(它們往往是讓您重寫的),子類儘量不要暴露自己的 public 方法供外界調用。

該原則由麻省理工學院的 Barbara Liskov 女士提出,她是美國第一位獲取計算機博士學位的女性,曾經也獲得過計算機圖靈獎。

4. 最少知識原則(Least Knowledge Principle - LKP)

原文:Only talk to you immediate friends. 譯文:只與你最直接的朋友交流。 理解:儘量減少對象之間的交互,從而減小類之間的耦合。簡言之,一定要做到:低耦合,高內聚。 應用:在做系統設計時,不要讓一個類依賴於太多的其他類,需儘量減小依賴關係,否則,您死都不知道自己怎麼死的。

該原則也稱爲“迪米特法則(Law of Demeter)”,由 Ian Holland 提出。這個人不太願意和陌生人說話,只和他走得最近的朋友們交流。

5. 接口隔離原則(Interface Segregation Principle - ISP)

原文:The dependency of one class to another one should depend on the smallest possible interface. 譯文:一個類與另一個類之間的依賴性,應該依賴於儘可能小的接口。 理解:不要對外暴露沒有實際意義的接口。也就是說,接口是給別人調用的,那就不要去爲難別人了,儘可能保證接口的實用性吧。她好,我也好。 應用:當需要對外暴露接口時,需要再三斟酌,如果真的沒有必要對外提供的,就刪了吧。一旦您提供了,就意味着,您將來要多做一件事情,何苦要給自己找事做呢。

6. 依賴倒置原則(Dependence Inversion Principle - DIP)

原文:High level modules should not depends upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions. 譯文:高層模塊不應該依賴於低層模塊,它們應該依賴於抽象。抽象不應該依賴於細節,細節應該依賴於抽象。 理解:應該面向接口編程,不應該面向實現類編程。面向實現類編程,相當於就是論事,那是正向依賴(正常人思維);面向接口編程,相當於通過事物表象來看本質,那是反向依賴,即依賴倒置(程序員思維)。 應用:並不是說,所有的類都要有一個對應的接口,而是說,如果有接口,那就儘量使用接口來編程吧。

將以上六大原則的英文首字母拼在一起就是 SOLID(穩定的),所以也稱之爲 SOLID 原則。

只有滿足了這六大原則,才能設計出穩定的軟件架構!但它們畢竟只是原則,只是四人幫給我們的建議,有些時候我們還是要學會靈活應變,千萬不要生搬硬套,否則只會把簡單問題複雜化,切記!

  • 補充設計原則

1. 組合/聚合複用原則(Composition/Aggregation Reuse Principle - CARP)

當要擴展類的功能時,優先考慮使用組合,而不是繼承。這條原則在 23 種經典設計模式中頻繁使用,如:代理模式、裝飾模式、適配器模式等。可見江湖地位非常之高!

2. 無環依賴原則(Acyclic Dependencies Principle - ADP)

當 A 模塊依賴於 B 模塊,B 模塊依賴於 C 模塊,C 依賴於 A 模塊,此時將出現循環依賴。在設計中應該避免這個問題,可通過引入“中介者模式”解決該問題。

3. 共同封裝原則(Common Closure Principle - CCP)

應該將易變的類放在同一個包裏,將變化隔離出來。該原則是“開放-封閉原則”的延生。

4. 共同重用原則(Common Reuse Principle - CRP)

如果重用了包中的一個類,那麼也就相當於重用了包中的所有類,我們要儘可能減小包的大小。

5. 好萊塢原則(Hollywood Principle - HP)

好萊塢明星的經紀人一般都很忙,他們不想被打擾,往往會說:Don't call me, I'll call you. 翻譯爲:不要聯繫我,我會聯繫你。對應於軟件設計而言,最著名的就是“控制反轉”(或稱爲“依賴注入”),我們不需要在代碼中主動的創建對象,而是由容器幫我們來創建並管理這些對象。

  • 其他設計原則

1. 不要重複你自己(Don't repeat yourself - DRY)

不要讓重複的代碼到處都是,要讓它們足夠的重用,所以要儘可能地封裝。

2. 保持它簡單與傻瓜(Keep it simple and stupid - KISS)

不要讓系統變得複雜,界面簡潔,功能實用,操作方便,要讓它足夠的簡單,足夠的傻瓜。

3. 高內聚與低耦合(High Cohesion and Low Coupling - HCLC)

模塊內部需要做到內聚度高,模塊之間需要做到耦合度低。

4. 慣例優於配置(Convention over Configuration - COC)

儘量讓慣例來減少配置,這樣才能提高開發效率,儘量做到“零配置”。很多開發框架都是這樣做的。

5. 命令查詢分離(Command Query Separation - CQS)

在定義接口時,要做到哪些是命令,哪些是查詢,要將它們分離,而不要揉到一起。

6. 關注點分離(Separation of Concerns - SOC)

將一個複雜的問題分離爲多個簡單的問題,然後逐個解決這些簡單的問題,那麼這個複雜的問題就解決了。難就難在如何進行分離。

7. 契約式設計(Design by Contract - DBC)

模塊或系統之間的交互,都是基於契約(接口或抽象)的,而不要依賴於具體實現。該原則建議我們要面向契約編程。

8. 你不需要它(You aren't gonna need it - YAGNI)

不要一開始就把系統設計得非常複雜,不要陷入“過度設計”的深淵。應該讓系統足夠的簡單,而卻又不失擴展性,這是其中的難點。

一個成功的項目,離不開每個人的努力,分享下我曾經的項目管理經驗。

給大家提出以下 10 點建議及其目標:

  1. Sprint 第一天,需要將目標定義清楚,並讓團隊所有人都知道「確保建立一致的目標並使之明確」;
  2. 若出現需求變更,則優先排到下次迭代,特殊情況需特殊處理「確保本次迭代可以按時完工」;
  3. Scrum Master 將迭代中的需求分解爲任務,每個任務只能有一個任務負責人,且不超過一個人天「確保每日任務可評估」;
  4. 讓 Product Owner 直接與相關開發人員確定需求,Scrum Master 需一同參與「確保需求與實現不會發生偏差」;
  5. 每日定時站會,時長不超過 15 分鐘,規模不要太大「確保任務完成情況與計劃保持一致」;
  6. 每日進行一次代碼評審,由 Scrum Master 負責,並在次日將評審結果通知給相關開發人員「確保代碼質量不要下降」;
  7. 各個團隊的 Scrum Master 保持每日溝通一次,時間不要超過 15 分鐘「確保項目管理不會出現風險」;
  8. 每次迭代結束,讓大家稍微放鬆一下,可提供一些團隊活動,比如聚餐「確保團隊能夠更加凝聚」;
  9. Scrum Master 需要給團隊一些承諾,比如項目獎金或特殊福利等「確保團隊更加有激情」;
  10. 對於情緒異常的員工,Scrum Master 需及時與其溝通「確保不要讓一個人的情緒影響整個團隊」;

此外,作爲項目管理者,需要不斷在團隊中加強以下 5 點文化:

  1. 方向一致
  2. 當面溝通
  3. 全情投入
  4. 充分信任
  5. 說到做到

真正的開源並非只是代碼的開源,而是思想的開源

談談我對「開源」的看法,國內的開源的現在如何,對比國外呢?

我個人認爲,真正的開源並非只是代碼的開源,而是思想的開源。在做開源項目之前,建議能將自己的想法共享出來,而不是 埋頭閉門造車。我不反對“重造輪子”,因爲我們需要更好的輪子,輪子好了車子才能跑得快。凡是有利也有弊,我們也不能盲目地選擇開源技術,因爲並不是適合 別人的技術就適合自己,而是需要根據自身的需求,選擇最適合的開源技術,搭建恰如其分的架構。

有大量的新技術,我首先會去關注它,瞭解它是做什麼的,可以解決什麼問題,但我一開始絕不會去深入研究它,更不會去看它的源碼,因爲一旦遇到這方面的需求場景,我就會從這個“知識庫”中去尋找最好的解決方案,如果仍然尋找不到最合適的開源技術,我纔會嘗試自己去實現。

技術人的歸途

走技術這條路,歸途是什麼?是否轉型又該如何抉擇呢?

至少有好幾條路線是可以走的,比如:深入技術、轉型做產品、轉型做管理等,需要根據自己的特長和性格來選擇,做自己喜歡的事情。

從技術轉管理,對自身的要求比較高,說具體點,需要看自己的情商,爲人處世的經驗,與人溝通的技巧,自己也需要有足夠的胸懷,去包容一些事情,還需要自己有足夠的人格魅力去吸引別人,讓別人願意跟着你一起做事。管理有些東西是很難從書本上學到的,但一些經典的管理理論是必須要去學的。

相比較而言,繼續深入技術或者從技術轉產品會容易一些了,因爲很多時候都不太需要與人打交道。

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