美國國家標准化協會ANSIAmerican National Standard Institute)和國際標准化組織ISOInternational Standards Organization)一起對C++程序進行了標准化工作,下面就進行學習切磋吧。
首先重復一句Bjarne的話:“我們的系統已經是極度復雜的了,為了避開C++的復雜性而干脆不用C++Linus的做法),無異於因噎廢食。”在所有可用C和C++的領域,C++都是比C更好的語言。
當我說“更好的”時候,我說的是C++程序擁有比C更安全的類型檢查、更好的抽象機制、更優秀的庫。當然,凡事都有例外,如果你做的項目1)不大。2)編碼中用不到什麼抽象機制。
甚至ADT抽象數據類型,例如std::complex這種不含多態和繼承的)也用不到,RAII也用不到,異常也用不到。3)你連基礎庫如,簡化資源管理的智能指針、智能容器)都用不著。那麼也許你用C的確沒問題;所以如果你的情況如此,不用和我爭論,因為我無法反駁你。我們這裡說的領域大致是Bjarne在“C++應用列表”裡面列出來的那些地方。
底線是:如果把C++中的諸多不必要的復雜性去掉,留下那些本質的,重要的語言特性,簡化語言模型,消除歷史包袱。即便是C++的反對者也許也很難找到理由說“我還是不用C++”。在我看來,一個真正從實踐意義上理性反對使用C++的人只有一個理由:C++的復雜性帶來的混亂抵消乃至超過了C++的抽象機制和庫在他的特定項目中)帶來的好處。
值得注意的是,這裡需要避免一個陷阱,就是一旦人們認定了“C++程序不好”,那麼這個理由就會“長出自己的腳來”,即,就算我們拿掉C++的復雜性,他們可能也會堅持還是不用C++,並為之找一堆理由。
我假定你不是這樣的人。不過,也許最可能的是他會說:“問題是我們今天用的C++並非如此簡潔),你的假設不成立。”是的,我的假設不成立。但雖然我們無法消除復雜性,我們實際上是可以容易地避開復雜性,避短揚長的。這也是本文的要點,容我後面再詳述。
當然,到現在你可能還是會說。我還是不用C++,因為我可以用D;或者如果你本來做的項目就不需要C++,你則可能會說,我用Python。首先,如果你的項目能用Java/Python乃至Ruby做,那麼用C++是自討苦吃。
因為能用那些語言代表你的項目在效率上本身要求就不高,那麼用一門效率上討不到太大好處,復雜性上卻綽綽有余的語言,有什麼價值呢?其次,如果你的項目效率是很重要的,你可能會說可以用D。然而現實是D在工業界尤其是國內被運用得非常少,幾乎沒有。而C++卻有大量的既有代碼,已經使用C++去做他們的產品的公司,在很長一段時間之內幾乎是不可能用別的語言重寫代碼的,正如Joel所說,決定重寫一個非平凡的代碼基==自殺。所以,我們至少要注意以下兩個明顯的事實:
事實1:C++在工業界仍有穩定的核心市場。
這個事實大概不需要多加闡述,很多大公司的核心技術還是要靠C++程序來支撐的見Bjarne主頁上的C++應用列表)。所謂事實,就是未必是大家最願意承認的情況,但又不得不承認。C++積累了龐大的代碼基。
這個代碼基不是一朝一夕能夠推翻的。D從語言角度來說的確優於C++程序,但最關鍵的就是還沒有深入工業界也許根本原因是沒有錢支持,但這不是我們討論的重點)。而C呢,根據Bjarne本人的說法,他的觀察是主流工業界的趨勢一直是“從C到C++”的,而不是反過來,至少在歐美是如此。在國內我們則可以通過CSDN上的招聘情況得到一個大致類似的信息。
事實2:C++程序員往往能享受到有競爭力的薪酬。
是的,這不是一篇不食人間煙火的技術文章。這個事實基於的邏輯很簡單:物以稀為貴。Andrei Alexandrescu這次來中國SD2.0大會的時候,在接受采訪時也說過:“最賺錢的軟件如MS Office)是C++寫的”。
孟巖也在blog上提到這麼個事實,我想他作為CSDN的技術總編,業界觀察肯定比我清晰深刻。所以我這裡就不多廢話了。 當然,以上邏輯並不就意味著在慫恿你去學C++,一切還要看你的興趣。所以如果你志不在C++程序身處的那些應用領域,那這篇文章並非為你而寫。