對程式設計師說點實在話

foreach_break發表於2015-06-21

  我個人是一個程式設計師,關注web、分散式和資料處理。

  我將web看做最流行的、天然跨平臺的展現和視覺化技術,將分散式看做程式協作、協作程式的最適架構,將資料處理看作需要基礎、技巧、認知、視野以及領域知識兼而有之的事,所以做資料處理,會提升基礎、技巧、認知、視野以及領域知識。

  這些都是廢話,還挺繞,但理解廢話,對我來說,不是那麼簡單的事。

 

  我認為能力的提升來自厚積,所以對於基礎的東西,應該保持持續的熱情。

  認為基礎應該包括但遠不限於

  資料結構和演算法

  演算法

  網路(tcp/ip、p2p、http等等)

  計算機體系和作業系統(記憶體管理、高速緩衝與快取、執行緒與併發、資源與爭用、CPU週期、區域性性原理等等)

  認為以上基礎永遠沒有精通一說,至少在我這個智力層次看來。比如你看到嚴蔚敏資料結構了,挺好,你又看了演算法導論了,更好,能看看普林斯頓的演算法,你挺不錯,你又看了些論文,而你確實又用vim、emacs、vs、eclipse或者sublime敲了,那你應該可以一眼就看出滿世界的部落格的演算法文章中的紕漏和層次,那你還是有點功力了。

 

  知識結構的重要性與專案經驗會相互影響。同樣的專案,類似的角色,因為知識結構的不同,帶來的提升和總結也會不同,這種提升對於下一個專案或者更復雜的專案帶來的裨益也會有所差別,更長的時間之下,這種差別巨大到值10W還是100W。

  有十年工作經驗,還是一件事重複了十年,差別可能就在這裡。

 

  認為類似“精通java”之類的說辭是存在的,但不談JVM是耍流氓。類庫和框架的熟悉來自工程和專案,可以熟悉一個簡單的API,也可以追著理解AOP,可以應用地很簡單也可以很複雜。如果關注效能的場景,那麼應該自覺地關注JVM。但是JVM是浩大的工程,所以理解它是一個長期的過程,所以精通是一件比較困難的事。但是很多常用的場景,比如BufferedReader和FileChannel、mmap都可以是I/O的一種選擇,何者更加適合,往往要看虛擬機器裡面和作業系統做了些什麼,才會理出最佳實踐,附帶的,對Xss、Xmx、directMemory之類的簡單配置也會有更深的理解。同時有助於看到基於虛擬機器的語言的侷限,比如HBase的BlockBuffer本身是提高讀取的效率的設計,但因為JVM的堆和GC機制,這個設計可能會拖垮HBase。

  這一點同樣應該適用於C#&CLR。

 

  工作了多年的人都會認為或者自恃自己在某些方面達到精通的水準,有的人的確達到了,但附帶著會有些裝、虛偽和極愛抖機靈,他不會和你好好地探討問題。這種人可能會存在於朋友、同學、同事、上司當中,一個程式設計師不會活在獨立的容器之中,除了在實力方面要保持自信和謙遜以及付出更多的努力之外,還要注重堅持自己的一些原則而不受一些不夠正能量的企業文化、圈子文化影響,做自己,才能更好的對待技術,才能給僱主帶來更佳的氣場感受和實際價值。

  這個世界不缺乏噴子,有的噴子本身也很厲害,甚至比自己厲害的多,這是他們活著的方式,情緒控制不是什麼技巧,你理解的越透徹,你就越能看清什麼是噴子,什麼是恨鐵不成鋼。

 

  關於技術實用論,總有一種觀點是沒去過美國就不應該知道星條旗。比如,不是每個公司,每個程式設計師都會接觸到大資料,但是人類在沒有飛天的遠古,就已經通過圖騰和壁畫來開啟文明的探索和解讀了,這種東西,其實是信仰的力量,說俗一點就是興趣所在,再俗一點,就是機會總是留給有準備的人,願意不願意準備看態度和理解,準備了能不能夠將來用得上,看機遇,實力和運氣都挺重要,但運氣你控制不了。

 

  人類的大部分知識來自間接渠道,比如閱讀書籍、觀看媒體、道聽途說,離開了學校,但並沒有離開知識的媒介。好的知識來源,比好的學習方法更加重要,這通常也是牛逼的院校和不牛逼的院校的主要區別。有的學校的老師在微博還在成長的階段就開始講授社會計算了,如果你沒有這個知識渠道,應該不會認識到ETL、資料探勘和倒排索引的意思,可能你已經熟練的修改、新增、編譯lucene了。

  但是,再好的知識,離開了實踐,均不會得到昇華,認為一個好的程式設計師,應該關注程式碼和實現,但應該摒棄簡單copy原則,雖然copy大多數情況下對付工作夠用了。私下裡,一段關鍵程式碼寫個十來遍真傻,挺蠢的,但如果每種寫法有個思考和理解在裡面,有選擇地這麼做了,再看設計模式和重構,哦,真是這麼回事,用茴香豆的方式當傻子不是那麼不堪忍受的事,至少理解了什麼是錯誤,什麼是差別,也給你創造了工作之外的提升場景。

 

  很多人持這種觀點,中國人,技術都是差的,也是寫不出hadoop的,掙錢最重要,但自己又覺得自己很厲害。

  其實將寫出hadoop和掙錢作為標準,這個觀點本身就太侷限了,人這輩子,錢當然重要,寫出能用的hadoop還是寫出mini作業系統還是mini虛擬機器,都不必太當回事,閱讀原始碼和自己實現所營造出的理解深度天上地下,這種愚公移山的做法,更多在於逼迫你去了解更多、更準、更深刻。大部分hadoop專家,其實都是僅僅看了原始碼而已,就已經能出書了,事實上很多公司在實際中也只是跑一些很簡單、很成熟的挖掘演算法,愛奇藝的工程師做線性迴歸也是實用即可,大部分公司還是在處理日誌,有時候想了很牛逼的演算法,還沒有換成SSD重要,所以沒那個環境,沒那個條件,就不研究了?我想不是的。

  關於掙錢,我覺得,只要興趣所在,能把事做好,錢自己就會來。收入上不去,往往是做的事情就不在高收入的那個區間,寫程式很難出富翁。說實話,外圍一天的消費可能就是你工資的好幾倍,不用說外圍的收入了。夜總會想玩的high一點不開兩瓶路易十三,可能還會被小姐罵偽土豪,你不送你喜愛的紅、藍、綠牌花束,你都不好意思和她回小區或者賓館探討遺傳演算法。

  那麼和外圍一起探討遺傳演算法的王總、李工的收入更不是寫程式的可以比的了。

  所以不要太刻意地把寫程式這件事和掙錢掛起來,侷限了你掙錢的本事。

相關文章