致青春__轉載

致青春

還記得本身那年考清華失敗,被調劑到中科大軟院,當初有幾個方向能夠選,軟件設計、嵌入式、信息安全等等,絕不猶豫地選擇了信息安全。javascript

爲何選信息安全?這四個字聽起來多牛多有感受,我本科是學物理的,記得作一個光學實驗的時候,一個老師看我作的結果,說,學物理不是什麼人均可以的,這個是須要一點智商的。php

好吧,當初其實並不是對我一我的所說,但我確實感受到受到了鄙視,同時,我沒有任何在物理上的精湛技藝能夠反擊個人老師。css

因爲整個大學期間,我都在沉迷遊戲和小說,以致於輔導員說,如今找你都得預定。html

而個人同窗基本在學期開始和考試前能見到我,當時爲了應付考試,我不得不學習複雜的物理公式和推導,有一門課程是激光原理,老師是雙博士學位,大概是很厲害的,在我考試時,過來看個人卷子,說你的」背功「很厲害。前端

考試時如期經過,但老師大概都對我評價不高。天然,我是感到不愉快的。java

回到個人畢業論文,大概是作一個電離層特徵參量的反演,其實就是用迭代法解病態方程。python

這個論文基本是沒有人選的,由於題目自己可能相對比較難,也須要編程實現,好吧,當時下載的是盜版的matlab,參考的是一個日本學者和我導師的論文,鏗鏗鏘鏘地寫出來了。還作了個所謂的參數優化,以使得結果看起來更平滑。mysql

當時以爲很得意,我女友(如今的老婆)也很驚訝,我一個月作完了。linux

其實這不是第一次領略程序的魅力,在好久以前,高中時期,爲了追一個女生,我作過flash,當時我就以爲拖來拖去很麻煩,但苦於沒有基礎,看不懂 actionscript,因此難以深刻體會編程的精妙,若是看到網上有一些相似雪花飄落、旋轉字等效果,都是直接拷貝修改到完工。c++

如今回到,爲何選擇信息安全上來,由於在大學時,很喜好遊戲,尤愛單機,國情你們是清楚的,並且我沒有錢,也不知道哪裏能夠買到正版,這個猥瑣了,呵呵。

仙劍、上古、火炬之光、火焰紋章,各類類型都喜歡。也很喜歡生存類遊戲。給一個單機遊戲作的exe補丁和用lua拓展的mod至今看來仍讓我懷念。

討厭網遊是由於本身沒有錢,搞不過RMB玩家,並且砸裝備總失敗。
惟獨一個,2006年時,我玩完美世界,後來玩它的SF,爲了砸裝備,我 第一次想到寫封包外掛,因爲當時已經有一些socket、tcp/ip的概念了,雖然C++玩不轉,仍是各類參考,寫hook、寫字節轉換,同時完美當時 打擊WG很厲害,遊戲基址容易變,又加了不少防調試的功能。

但爲了避免手工砸裝備(SF裏的石頭幾乎免費,就是砸上去的概率過低),我慾望那個強啊,因此用OD調試找網絡發送的函數地址, 而後C++寫代碼hook。

程序最終工做很好,我還分享給了幾個玩友。

後面也寫過一些相似跳舞自動擊鍵的WG,主要也是爲了自娛自樂,由於我真的反應不過來屏幕上瞬間出現太多的key!

與程序爲伍的日子不多,但每一次接觸,彷佛都是爲了達到本身的一些目標。

因此凌亂的編程體驗,雖然不繫統,不精湛,卻讓我快樂。

再次回到爲何選擇信息安全上來?也許答案已經很清楚。

當時以爲虛擬機加密過高深了,聯網解密也難搞定,因此以爲信息安全必定是能解決個人問題的!

後來你猜到了,就是C,就是彙編,就是linux,我當時是多麼反感linux,當時還用的是ubuntu,但爲了課程,實在是沒有辦法,爲了考 研,本身系統自學了數據結構、計算機網絡、操做系統、組成原理,當時在考研論壇上還和一個清華搞計算機體系的探討問題,刷了好幾頁的帖子,如今看來,多幼 稚!但,快樂也是固定在那個過程之中了。

我討厭彙編,我討厭C,我討厭linux,但他們強大,可以知足需求,這就夠了。

java仍是 c#?

其實這不該該是咱們真正的主題,並且入了行的也不多會java仍是c#這麼比,但初學的,java和c#每每就表明了兩大流派,java代替了j2ee,c#代替了.net,ok,沒有關係,這麼做爲title,不影響咱們說事。

若是從語言的角度上來說,c#毫無疑問勝出,易用、門檻低、優雅、較爲簡潔。但java和c#的語言特性是類似的。

在不少類的命名上,它們都一模一樣:

//java System.out.println("java比C#強!j-a-v-a!"); //C# System.Console.WriteLine("你沒看到#是4個+嗎,我比c++還強2個+,你就歇菜吧!");

c#出現的時間比java晚,因此天然吸取、借鑑,同時又有它的創新,好比很早就支持lamda表達式、好比event和委託,好比var,好比linq。

但若是從面向接口來說,java一樣能夠作到event和listener,只不過對象引用的傳遞比較直接。

而.Net的類庫和jdk則各有千秋。

若是從應用的角度來看,javaee和.Net體系幾乎都涵蓋了主流的開發方向:

桌面、Web、服務端、數據庫、網絡、移動端、中間件。

哪一個方向,哪一個更強?這個留給讀者本身體會吧。

微軟給.Net一個宇宙最強的IDE,也給了各個方向統一而平滑的編程體驗,不得不說,微軟的上手要容易的多。

而java則一開始就和開源分不開,多如牛毛的框架、引擎、包,blabla,用java開發,程序員要懂得東西更多一些。應爲你大部分狀況下得本身整合。但整合的好了就是很強大的,好比SSH。

在近幾年很熱的大數據和雲計算領域,hadoop、spark、tez、leveldb、mongodb、mariadb、hive、hbase,還有oracle,都各自在本身不一樣的層面發力,大部分的這些都對java是極爲友好的。

不少java程序員,都以爲搞.net開發的,就是拖拖控件而已,其實我能夠告訴你,說出這種話的java程序員通常都還比較小白,若是你是搞.net的,你也能夠說搞java的都是拷貝別人的開源軟件的代碼,而後改改而已。

固然改改沒什麼問題,誰都不喜歡重複造輪子,好比,google裏面也並不是所有是創新,常常」拿「別人的東西本身改吧改吧,淘寶就很不用說了,招了一些能改c、會點編譯的程序員,常常拿各類開源框架開刀,而後代表是本身的東西。好比雙11的那個問題。

固然不是說淘寶找的人有問題,而是這個企業的文化就是銷售和廣告文化,後來的google也如此。

回到正題,wpf和silverlight(雖然已經EOL)中最大的創新莫過於xaml技術,若是你認爲wpf只是winform的簡單升級,或者說你只會在wpf中拖控件,說明你仍是一個很是初級的.net程序員,無論你工資上w沒有,或者你已是項目經理了。

xaml天生就是爲mvvm模型而生,這一點,搞前端的同窗,應該熟悉,即便你不懂wpf,js和html怎麼作mvvm,你也應該體會過它的好處。

wpf中在xaml中佈局控件,並支持INotifyPropertyChanged接口,能夠很是容易的實現界面和數據分離,作出一個mvvm模型出來。

說到標記性語言,咱們看看jsp的jstl、struts2的tags,還有asp.net mvc3以後的razor引擎:

jstl和aspx的標籤相似,自由、強大,能夠很容易的穿插交織到html標記中;

struts的標籤就是個另類,我我的反感這種既不遵循主流標準也不簡潔的東西,雖然好多人會說好用,那是個習慣問題,我這麼說,不是說這東西難學難掌握,只是比較一下和razor引擎中的標籤語法,弱爆了。

razor,強大、簡潔、優雅。

你確定以爲我是微軟.net的粉絲,其實我想告訴你的是,最強的標籤語言只有兩種,html和xml,穿插動態語句到服務端頁面上,而後刷出 html,歷來都不是好的作法,由於不僅你一我的寫代碼,後面可能會有其餘人維護這個頁面,原本這是須要由web designer來作的事情,可是有了語句,他的維護成本就很高。

規範的頁面開發,程序員是不會染指一個css、style的,動態語言在aspx、view、jsp上面應該儘可能少用。不然你不如使用php和asp。
這一點,你會在工做中會深有體會的。

青春的你,怎麼選擇?

看看如今的招聘吧,動不動就是

精通j2ee,精通struts、spring mvc、hibernate或者mybatis,對mysql、oracle有深刻理解,精通webservice、精通多線程,能處理高併發,有的還得懂jvm,最好有hadoop等開發經驗。最後再來個211以上。

.net方面呢?

精通.Net,精通mvc3-五、精通wpf、wcf、多線程,mssql等等等等。

我如今處於離職狀態,因此天天收到獵聘上的一些推薦,都很鬱悶,由於沒有一項是我精通的。

可是不妨礙我在2012年實習中,就拿到了13K的月薪,比一些正式員工可能還要高。

並且,仔細想一想,代碼中常常講到要容易維護、這個設計模式、那個AOP,這個大併發,那個高性能,我我的沒有見到容易維護的代碼。學習一個新公司的 一套模式,一套老產品,比學習一門新技術須要的時間長得多,你會發現,99%的狀況下,你最須要的,不是什麼代碼,模式,而是對產品的理解、對業務的理 解,不少狀況下,除非太菜過小白,你們的代碼都差很少,誰有時間重構代碼?程序員又爲什麼加班?

這是行情,一個項目接一個項目,公司須要掙錢的,這是大部分公司的現狀。

爲了回答java仍是c#的問題,我會從的經歷提供一些參考,既然是個人,那就不會是全面的和準確的,你本身判斷。

仍是從故事開始吧!

在科大軟院(蘇州),由於老婆想和我一塊兒在外面過個年,我不得不去臨時找實習,當時c和彙編不行啊,因此得選個流行的,什麼流行呢,當時是web。

因此我遇到了java仍是c#的問題,確切的是我遇到了j2ee仍是.net的問題。

由於常用windows,又由於.net門檻如此低,因此絕不猶豫選擇了.net,當時是不會寫SQL的,可是卻系統學習了數據庫設計原理。

進入公司就接觸mvc3,以爲好,外企的技術確實比較新呢,比我學習.net時學的aspx優雅,那個時候開始接觸並嘗試理解mvc模式和ddd的概念。

當時,時薪25人民幣。

6個月的實習,基本能玩javascript和c#,而後sql仍是不行,當時記得一個高級開發跟我說,他之前作delphi開發的時候,團隊寫sql寫的好就牛,我深覺得然。

只會用Entityframework + mvc3 + javascript,開發網站的我,用理解很淺的.net的web技術體系,支撐了我和老婆在上海的生活費用,當時10年,咱們租的拎包式入住公寓1500一個月,不算生活費、水電費。

再一次,經過一項技術,達到了個人目標,支撐了個人計劃,當時對技術的理解,可是偏執於.Net,對java陣營是不屑一顧的。

後來很快離開了科大軟院和蘇州,考取了中科院,到了北京,房租是1580一個月,照樣不算生活費、水電費。

沒辦法,學校發的補貼根本不夠押2付3的。

找實習,作過什麼呢?office編程,並且當時的老闆是從IBM下來的工程師,項目主要是java開發,jsf作頁面,招我過去,作word編程,還不能使用.net,你猜到了,我用的是vba。

沒作多久,公司發錢就開始拖延,兩週後,我沒有積蓄,只能被迫離職,後來加入一家公司,從4K到10k,用了8個月,在這裏,我完善了程序員生涯中 sql能力的快速成長,而且普遍地使用了silvelight、aspx、oracle、mssql技術。記得當時一個北郵畢業的同事,作了6個月的 office文檔在web展現,由於涉及到了com編程,因此運行很是不穩定也難於調試,更重要的是,拉一個頁面到展現,須要20秒。

老闆是中科院軟件所的博士,架構很厲害,但對於這個技術細節並不擅長,問我有沒有辦法,我說作過vba,大概瞭解word的dom結構,我試試。那個同事說,若是你能作到穩定、快速的實現,你能夠拿這個作你的畢業論文了。
我說,我試試。

臨危受命,我猥瑣地查找資料,研究百度文庫如何實現等等,後來爲了.Net環境的一致性和可維護,因此拋棄了pdf + flash。
經過大量看老外的東西,我選擇了aspose.Net框架 + 一個能把word轉爲Xaml的框架 + silverlight實現,惋惜這兩個框架都收歐元,公司鐵定不會出錢,因此我猥瑣地對其進行了破解,也開始接觸IL碼。

docx文檔在線編輯 + 展現的功能完成,給老闆run了一下,老闆點了個贊,顯示時間縮短到5秒左右。

後來作了數據庫的靜態,顯示時間縮短爲1秒內。老闆又點了個贊。

後來帶領團隊,從mssql遷移代碼oracle,至今還記得和老闆並肩一塊兒寫存儲過程的情形,並感嘆微軟自身的數據庫外遷還得依靠三方工具的搞笑。

時光很快,當時回想,.Net是多麼的強大,是麼?
在工做的同時,學業,爲了湊夠4個成天來實習,也爲了本身的將來,我選擇了數據挖掘、計算機圖像處理、天文數據處理、文本檢索、分佈式計算、高性能計算等全部聽起來很牛的東西。

不求甚解,一段一段的代碼和註釋,將能掌握的注入到本身的技術骨頭裏去。

還記得在學校週一開組會,同一個組的基本都是博士了,我放棄碩博連讀,由於我實在年齡大了,得養家餬口。

後來一家西二旗的距離oracle很近的公司面上了,記得最後一輪面試是小屋子壓力面,從董事長到個人小組領導都在,沒有水。

首席架構師是科大少年班的,博士在網絡所讀的,問了一個問題:
你如何實現google的負載均衡?

那個問題我答的很差,其實即便不理解負載均衡的實現,也該從組成原理的總線仲裁知識中窺的一點參考。

因此那次又被鄙視了。但那次拿到了13K的月薪,當時的總監是漢王之前的副總裁,評價是,基礎紮實,思惟靈活,實習階段就參與公司重大項目研發,值得培養。

直到如今,我,相信也還有不少程序員,遇到了數不清的技術,我常常會茫然,到底我該何去何從?

一些疑問:

訪問數據庫,隨便找個高效的connector或者driver就好了,通常提供數據的廠家,誰不提供connector?ORM是很必要,可是追求性能和反框架氾濫的公司不在意ORM帶來的那點便利性,用一個jdbc + sql照樣寫穩定高效的數據訪問。

作web前端,真的須要本身寫一個框架出來?真正須要這種開發的項目有幾個呢?jQuery和d3,原生的javascript就夠了,你寫的也許不叫框架,最多就是個wrapper。

數據庫的惟一性索引、聚合索引、輔助索引都沒搞清楚,就開始搞hadoop、spark、hbase、mongodb,用人單位也一再這麼要求的,你的項目中真的有那麼大的數據量?在傳統的rdbms下解決不了?

你開始知道輪子的概念了,而且知道不要重複造輪子。但是你快不是程序員了,而是框架員了。

因此,回到java仍是c#,這個問題,要比我遇到的技術分裂要簡單的多。

一些建議

個人意見是,忘記java或者c#的對立,若是要作一個開心、有自我追求、同時知足就業的程序員,你須要重視如下方面:

  1. 函數調用棧,這個不少高級程序員只知其然不知其因此然。你能夠不懂的彙編、函數入口、返回地址、寄存器,但你須要調試,你得深入理解函數調用棧,不管是在dev模式調試struts開發的jsp頁面,仍是debug模式調試aspx頁面,你得看懂調用棧的信息;

  2. 基本的數據結構和算法,數據庫中索引的組織方式,是B+樹仍是Hash,仍是堆,你的公司有Web、桌面、移動用戶,有社區,有產品,你可能要作個推薦什麼的,或者研究個社交圖譜什麼的,這門技術能夠幫助你。

  3. 一門動態語言。lua、python、javascript,均可以,你須要隨時和系統進行交互,或者實現一個原型,或者用程序的方式來畫點界面、數據圖什麼,它們夠輕量、夠快捷。

  4. 一門重量級語言。好比java或者c#。你靠它們吃飯。

  5. 理解跨平臺的含義。掌握一些基本的跨平臺技術,好比xml、c、html、json。

  6. 重視網絡編程的練習和理解,在你使用URLConnection或者MySqlConnection或者WebRequest的時候,你是 否理解它們的生命週期和底層實現,用什麼語言無所謂,你要記住tcp/ip協議和http的基本特性。這樣不至於你寫了幾年程序,還不知道 method=post是什麼原理。

  7. 找一個順手的IDE,我我的不是CLI控,雖然不得不CLI,一個順手的IDE真的能夠提升生產效率。搞.Net推薦vs + resharper,搞java推薦intellij IDEA.

  8. 關注一些熱門而經典的領域,好比機器學習、圖像處理、數據挖掘,即便已經有了mahout,不表明你不須要了解這些領域,你可能永遠不會在工做中使用它們,但它們的思想值得你擁有,由於你選擇了作程序員,而不是哪一個公司的程序員。

剩下的,就是你的解決問題的思路和你實現的硬功夫(編碼能力),我相信,不少看這篇文章的人,不可以輕易寫出一個ftp服務器,不可以不參考、不聯網查詢資料寫出一個簡單的快速排序,也不可以輕易寫出一段通用分頁SQL,但他們依然能夠正常工做。

因此外面的功夫容易忘記,有網絡就能拾起,內功纔是入骨的東西。
架構不是學出來的,是你的理解到位了,剛好工做中有這麼個需求,你就開始整合你的已知,而後開始選擇輪子。

最重要的是,你千萬不要成爲一個只會熟練使用框架的程序員,那樣,你會疲於奔命,你也許永遠只會使用hadoop,而寫不出一個hadoop,你只是一個hadoop程序員,而不是一個分佈式程序員。
你也許永遠只會使用struts,而忘記了本身寫filter,你只是一個ssh程序員,而不是一個web工程師。

後記

人言三十而立,現在二十有九,反反覆覆,雖然買房買車(俗了~),依然一事無成。

結婚5年,老婆再次懷孕,她很興奮,我也很開心,因爲時常加班,對她很抱歉。

目前離職,有些感觸,特撰此文。

【版權全部@foreach_break】 【博客地址 http://www.cnblogs.com/foreach-break】 能夠轉載,但必須註明出處並保持博客超連接
相關文章
相關標籤/搜索