《編程人生:15位軟件先驅訪談錄》是一本訪 談筆錄,記錄了當今最具個人魅力的15位軟件先驅的編程生涯。作為軟件領域的小菜,在閑暇的時候會拿來讀讀,感受一下大師們的編程風范,給自己懶散的大腦 洗個澡。目前只讀了一部分,也做了一些筆記摘要和我的簡單體會,與大家分享,后期若有機會會繼續補充,引領大師編程智慧。
1. 一個用C++寫的庫,Python程序員可以用SWIG封裝它,而Java程序員可以用JNI封裝,但是這很讓Java程序員感到不爽,因為若JVM崩潰了,我們根本不會知道是為什么。
體會:隨着編程語言的發展,越來越多的語言之間可以相互嵌入,出現了很多混合編程,比如Java與C++、C#與C++等,Java平台上的多語言混合編程正 成為主流,在實際應用中,每種語言都可以針對自己擅長的方面更好的解決問題,這是好的發展方向,但隨之帶來的也有很多麻煩與惱人之處,比如Java中混合 了C++,當JVM崩潰了,還真不知道是Java出了問題還是嵌入的C++出現了問題,所以不能一味追潮流,而應具體情況適當選擇。
2. 為什么要學習多門語言?
因為只懂一門語言如Java的話,他們解決問題的思路被局限在他們的知識范圍內,他們不會全面地思考問題。
體會:毋庸置疑,現在優秀的程序員不可能只會一門編程語言,程序員多元化或最近流行的“全棧工程師”(來自知乎上很熱的話題“怎樣成為全棧工程師(Full Stack Developer)?”)才是社會未來的發展趨勢,所以為了能趕上社會潮流,不被淘汰,我們不能局限在一門編程語言里,學的語言多了,你的思維也會更加廣闊,也許能給你的棘手問題帶來靈感。
3. 如何閱讀別人的代碼?閱讀代碼是為了全面了解它是如何工作的,還是自己想要對代碼做些修改?
如果你崇拜某個程序員,也可以去讀讀他的代碼,也許你會意識到他們也是凡人,不該成為你崇拜的對象。你也可能會從他們的代碼中學到一些東西。
如果閱讀代碼是為了想要修改一些東西:第一步,找個原始的tar文件或者從SVN檢出代碼,試着把工程構建起來。你一定要跨過那道坎,那對多數人來 說是最大的障礙——構建系統時的依賴或者開發者假定你已經安裝了這個庫。我希望這些大項目都能自帶一個虛擬機,也就是它的構建環境。一旦你有了一個干凈 的、可工作的構建版本,干掉它,做一個修改,比如把標題欄改成“”。改變一些東西,即使沒什么實際意義,只要動手開始去改變就好。然后把你的補丁發出去, 我發現這是最好的開始對話的方法。
如果只是想簡單了解:大致地看一下,試着去了解目錄結構。然后如果有東西吸引你的注意,或者我對什么東西不太理解,就隨便選個文件,邊構建邊讀代碼,這是可以並行的,讀代碼會發現新的模式,也許會對你有幫助。
體會:我也是最近幾個月才開始閱讀別人的源碼的,我第一個閱讀的是Google工程師寫的代碼,雖然沒有完全看懂,但的確學到了很多東西,比如他們代碼的構建模式、編程風格(比如Google Java編程風格指南中文版)、采用的測試方案(從Google開源RE2庫學習到的C++測試方案)等, 非常規范,這是Google所有工程師都有的風格。雖然每個公司都有自己的一套編程規范,但從他們的風格里還是能學到很多你沒有注意到的東西。當然,如果 你只是為了學習,那么不用完全一個個文件的細看每個函數,只需要大致了解它們的整體模式即可;如果你是為了修改,那么就需要按需細看某些文件,在此基礎上 實現自己的需求。
4. 怎么強迫自己不去逛那些浪費時間的網站?
可以用iptables重定向這些網站到你自己的web服務器,上面寫着“你正在工作,不是嗎?”
體會:這貌似是geek們的做法。如果你覺得該方法有效,那么可以施行。對於吾等普通程序員,我的做法是將一天中最重要的事情列個清單,工作的時候把清單放在鍵盤上,強迫自己先把這些事情做完了,有剩余時間才有機會去放松一下。我最近在使用一款時間收集工具“RescueTime”,可以詳細的記錄到你在電腦上使用任何一個應用所花費的時間,如果是瀏覽網站可以詳細的記錄到你在某一個網站上停留時間,然后做個報告呈現給你。很多人推薦,我也不知道怎么樣,正在試用期。
5. 對程序員來說什么才是最重要的技能?
像科學家那樣思考,一次改變一樣東西。
有耐心,試着去了解問題的本質。尤其是在調試或者設計不太正常的東西時更應該這樣。我看到過年輕程序員在那里抱怨:哦,見鬼,這個東西運行不了。然后就把它徹底重寫了。其實應該停下看看究竟發生了什么。
要學會增量地開發,這樣每一步你都能進行驗證。
體會:“耐心”真的是很重要也是很難的技能,隨着社會快節奏的發展,人們越來越不淡定,非常心浮氣躁,我們程序員這行亦是如此。遇到個難解決的bug就氣憤的想要砸掉鍵盤,維護上屆員工寫的老代碼,恨不得重寫也不想在他們基礎上做修訂,因為沒耐心。我自己也是的,看書看到不懂的地方就合上書本看不下去,也沒想借助網絡慢慢搞懂它,不能認清問題的本質。我只能說,沒有耐心,這是社會的通病,得治。
6. 你為什么極力反對C++?
使用C++,一切變得臃腫不堪,另外還引入了大量兼容性問題,因為用C++編程時,沒人能斷定C++哪部分是可以安全使用的。有個家伙說他要用模板,結果你會發現,沒有哪兩個編譯器實現模板的機制是一樣的。最后,C++不能跨平台。
體會:這種說法當然很片面。每種語言都有其極度擁護者和極度反對者,我們不能偏向任何一方,而應該全面看待,在這里我們可以學習到C++的缺點:安全問題、兼容性問題、跨平台問題等。但C++的優點也是不少的:面向對象、更多封裝的庫、類型更加安全等。前段時間看了個視頻“C++之父 Bjarne Stroustrup 9月4日在 GoingNative 2013 大會上長達1個半小時的主題演講《The Essence of C++: With Examples in C++84, C++98, C++11, and C++14》”還是挺不錯的,我個人才疏學淺,不能對它們做很好的評價。
7. 軟件領域也有很多工程方面的問題。有這么一個笑話:如果用造軟件的方法來蓋摩天大樓,那第一只啄木鳥就能毀掉文明世界。
體會:第一句毋庸置疑,軟件工程師不就是用來解決工程問題的嗎?當然也有非工程問題,否則學數據結構、學算法是干嘛用的。后面這個笑話很具有諷刺意味,寓意我們軟件工程師對工程方面的問題解決的一直不令人滿意。