五年.net程序員Java學習之路

大學畢業後筆者進入一家外企,作企業CRM系統開發,那時候開發效率最高的高級程序語言,毫無疑問是C#。恰逢公司也在擴張,招聘了很多.net程序員,筆者做爲應屆生,也樂呵呵的加入到.net程序員行列中。前端

C#.net很是容易上手,以前在大學裏,作過winform和webform開發,也曾經在老師那裏承接太小項目,賺點外快。因而在工做崗位上得心應手,很容易就上手了企業開發框架,僅一年多,筆者就成爲公司的開(jia)發(ban)骨(feng)幹(xian)。java

C#.net的網評比Java要差,筆者曾經在知乎上看到一個國外華裔程序員的文章,內容主要是國外的清閒不加班的生活,文末一句:「忘了說 我是作.net的」引起了討論的高潮。知乎程序員中,寫Java、python、go、JavaScript幾乎成了政治正確,做爲.net程序員的筆者不多在相關討論中活躍,但對java的印象已經有了改變。那時筆者所在的外企仍在大規模使用C#.net,筆者也就拒絕去接受網上的喧鬧的聲音,專心寫好代碼,學習設計模式和前端技術等等。python

恰逢互聯網行業發展勢頭正勁,筆者天然順勢而爲,加入了一家規模稍大的互聯網公司,固然仍是寫C#。因爲以前在外企不辭辛苦,什麼活都願意攬過來幹,積累到很多頗有用的研發知識和經驗,因而在跳槽過程當中順風順水,基本人家問什麼,我都能答出來,因而相對輕鬆地加入了新公司,開啓了互聯網研發之路。正是親眼鑑證了互聯網研發模式,才讓筆者肯定了轉型Java的決定。ios

新公司的框架很老舊,那時還在用.net framework2.0,業務代碼很是複雜龐大,某個十年業務的項目裏的一個方法,竟然有一千多行,單是閱讀代碼,就讓筆者心累,更心累的是,這一千行代碼的方法名,竟然被叫做「外觀模式」(facade)……很難想象公司最核心的業務,跑在這麼臃腫煩複的代碼裏。性能和效率都被看重的互聯網研發模式,終於開始和C#.net產生了矛盾:.net framework和iis不開源。系統在運行過程當中遇到了以下幾個問題:程序員

一、接口服務項目的訪問效率遇到瓶頸,基本只能上負載均衡加機器。web

二、某些大項目要數十臺機器去承載平常訪問,運維難度加大(後續上了持續集成和平滑發佈,運維方便了不少)。面試

三、較少數狀況,系統會出現一些疑難雜症,當產生問題的代碼在閉源工具包裏,調試人員幾乎一籌莫展。(反編譯的代碼真難看囧……)算法

四、不斷增長機器,成本增長,這可不僅是機器成本,人家不開源,收費也不便宜……spring

五、可定製化較差。某些極端場景下,咱們但願程序可以更大程度的消耗服務器硬件資源,而服務器程序都是別人的,人家爲了安全都設定好「最佳閾值」了,很難更進一步壓榨服務器資源。編程

六、缺少開源社區支撐、大數據相關研發乏力……

七、國內部分互聯網公司提供的開放平臺工具,竟然不提供C#的SDK……(根據http請求本身寫SDK)

諸如此類,不勝枚舉。

 

轉Java吧。

技術轉型的陣痛在所不免。公司內的接口研發和後臺管理系統研發是分開由不一樣人員負責,可以同時開發接口和後臺系統的人並很少。筆者技術體系相對完善,在團隊中得到很多尊重。也曾親自帶團隊作研發,寫完接口又帶兄弟研究ckeditor源碼並作定製化修改,忙的不亦樂乎。然而轉Java成了筆者當時的心病:本職工做作得很好,團隊不會容許貿然改用Java技術棧這種冒險行爲。筆者已經私下學習了許久,卻不能直接上項目實際操練,很是惋惜。

精誠所至金石爲開,筆者終於等來了一個機會:成爲公司新項目的主程序員,負責整個項目的後端架構、設計和研發。新項目人員很少,但都是各種技術中的優秀人才,包含ios、Android和H5研發人員,筆者爲他們提供接口,並開發後臺管理系統提供給產品和運營同事。

獨立負責設計和研發,工做量雖大,自由度卻大了很多,因而筆者決定用Java來完成整個開發任務。項目leader對筆者的技術功底非常信任,不過仍但願團隊用C#.net追求穩健,但看在筆者執着堅持,也就贊成了。爲了下降技術轉型對新項目帶來的風險和進度影響,筆者仍是作了必定妥協:用Java研發接口服務,後臺管理系統仍用C#.net。

接口研發期間筆者着實吃了很多苦頭,項目框架搭建問題層出不窮,spring的運用不純熟,致使常常在框架層面報錯。新項目的座位與公司Java開發團隊座位不在同一樓層,筆者幾乎天天都要爬幾回樓梯去Java研發團隊取經。好幾回遇到問題解決不了,都想放棄而後用回C#.net。項目leader屢次看到此情景曾屢次施壓,筆者跟項目經理坦(zhuang)言(bi):「若是Java搞不定,我會在兩天內用C#.net把活幹完,不拖項目進度。」靠着這份堅持和韌勁,還有屢次對Java研發團隊的叨擾,項目框架終於搭建完成,筆者也藉着屢次的取經,弄清楚框架的原理,完成了對spring的實踐。擁有依賴倒置、控制反轉的編程思想和設計模式的運用經驗,理解Java框架的設計思路是很簡單的,在框架搭建結束後,業務代碼的輸出幾乎是行雲流水,在項目完成之際,筆者都忘記本身曾是個.net程序員。項目最終順利上線,而且僅用兩臺機器就抗住了較高的併發,筆者對Java有了更多的信任和喜好。

有.net的編程基礎,學習Java會相對容易,但必須逃離幾個陷進:

一、對基礎知識務必要重視:C#是一門很是出色的語言,它提供的語法糖讓複雜的業務表達起來也十分優雅,搭配伶俐的lambda表達式和linq,數據結構的基本原理在大部分場景下都被弱化,而數據結構和算法正是編程的精髓。

二、對原理的渴望和求知慾:用C#編程,沒法查看大部分程序集內的方法,只能本身上論壇找或反編譯,求知慾可能會逐漸弱化。而寫Java後,常常會本身ctrl+鼠標進入方法查看源碼。這一點Java真是很是性感。

三、懶人思惟不可取:C#.net對於鏈表數組等數據結構的排序和查詢都作了高度封裝,幾個表達式就能獲得想要的結果,而Java的表達式則沒這麼伶俐。在Java世界裏,本身弄明白原理,本身寫是更高效、更對得起本身的方案。

 

使用Java完成商用項目的開發,只是技術轉型的開始,只能算踏進門,算不得轉型成功。筆者仍花了不少時間學習Java的數據結構;學習Apache的公共工具包,偶爾點進去看看實現源碼;繼續學習設計模式及其應用。在一些評估用C#研發更容易的項目,筆者仍然堅持用Java去完成。爲了能有更多Java項目練手,筆者申請進入了搜索引擎研發部門,經過了Java團隊架構師的技術面試,加入了渴望已久的團隊,最終能專職寫Java作搜索引擎服務。固然,離開了當初的部門,也就拋棄了在老團隊中的地位和榮譽,但筆者以爲很值。

 

在多年開發經歷中,筆者確實感悟 語言是互通的,萬變不離其宗。學習新語言只要下決心並付出努力,基本都能辦到。然然後續的挑戰則是更大規模的項目的設計思路,設計模式的運用,架構設計策略,代碼堆疊方案,甚至是不一樣功能模塊的技術選型。這些都須要仰仗厚重的經驗、紮實的功底和日積月累的技術實力。

將來大數據和機器學習的熱潮已經如火如荼的展開,手握Java這一門利器,運用storm、elasticsearch、Hadoop、lucene等絕技的Java程序員,必然能更好的適應潮流。

相關文章
相關標籤/搜索