1. 程式人生 > >研究生,請你拒絕C++的愛(下)

研究生,請你拒絕C++的愛(下)

 扯了這麼多,再次回到開始,C++有那麼重要麼?
 是或者不是,這個答案並不重要,而我也不能正確地給出答案。如果真要說我只能刷刷奸猾,告訴大家“因人而異”。
 重要的是,我們用什麼樣的思路,用什麼樣的態度來衡量、評價、解決這個問題。
 下面一段又是個老生常談,隨便到哪個搜尋引擎上都能搜到一堆的話題:C++是怎麼來的,它為什麼而設計的,實際上人們又拿它來做什麼,它有什麼優缺點。我接觸程式設計6年,其中C++佔到4年,而且是我用的最好,也是最喜歡的語言。每次說到歷史這個話題我總是有一大堆羅嗦的話要說。但是實際上我對C++的感覺到的最大的特點,卻是書多,相關的書非常多,經典的著作相比較其它語言而言也算得上是最豐產的了。書多不外乎三種原因,一是流行面廣,而是流行時間長,三是難度大。C++就那一點點編譯器規則,一本ISO C++的手冊搭配其發明者Bjarne Stroustrup的《The C++ Programming Language》就把語言機制講的很清楚了,為什麼它又有那麼多的書來闡述一些所謂的Advanced Topics呢?因為靈活。C++極度靈活,這種靈活並不是動態語言的那種靈活,而是在於它承載了太多的需要,導致它變得極度靈活化,靈活的負面意思就是太多,太複雜,使得人們太容易混淆與各種語言機制的Chaos中。似乎南師大的榮耀教授在採訪BS的時候還是BS在什麼地方說過,如果C++要像現在的老師們這樣教他自己都不會去學。
 然後BS就舉了一個Hello World的例子來說明他所認為的啟蒙C++與一般授課使用的C++差別在什麼地方,並以此說明C++其實並不複雜。好吧,我們就承認純正的C++並不難學。但是不能忘了,我們的C++的對與錯不是由我們決定的,而是編譯器。工程上用的C++編譯器絕對不會說不支援單純的,蹩腳的C-Style(不是說CStyle蹩腳,而是說C中蹩腳的部分),不會不讓你使用指標訪問記憶體(指非必要的訪問,例如動態陣列),甚至不會拒絕你使用一些類似於Hacker的程式碼來完成一些極具技巧性和挑戰性的工作。好吧,既然C++都支援,那麼便不能拒絕你寫出有此類特性的程式碼。更加致命的事情是,它的很多高階機制,都是建立在底層機制基礎上。最明顯的例子就是Boost和STL。一旦編譯出錯,那麼它的提示可能出在任何層面上,為了解決這些問題便又需要去學習那些較為底層的知識。C++的大坑就是這樣一點一點挖出來的。
 C++可供選擇的東西太多。所以BS就出了一本書,叫《The Design and Evolution of C++》,專門討論了每種機制在C++當中被採納的背景、他們當時的考慮、這些機制的適用範圍。雖然說這本書屬於“入門教材”的行列,但是實際上我更加傾向於將這本書看成是在你品嚐了C++大餐後的甜點。也就是說,儘管看起來有道理,但是作為預備知識同樣不適合,於是你只能一邊牢記大量的語言機制,一邊應用,一邊體驗,一邊讀那些專著來糾正你的錯誤並填補你的不足,不可能有機會讓你只走你需要走的路,大量的知識構成了一個扁平的知識框架,為了達到相對自由運用的水平,你需要學習的知識、需要獲得的體驗、需要彌補的弱點太多了。
 
 如果說,只有C++可選的話,那麼也就沒什麼辦法了,大家只能去學那個能讓人死去活來的東西。但是實際上我們並不如我們自己認為的那樣無奈。大量的語言,總有比C++更加適合一般學生的。靈活的指令碼語言Python/VBSP/JSP/Perl/Ruby/Lisp,半動態的(我是這麼叫的。。。)Java/C#/VB/VB.NET/CLI,高效的 Ada/Fortran,桌面開發用功能強大的Delphi(人家的語言叫Object Pascal,但是也就那麼一個編譯器,所以無所謂了),這其中的絕大部分語言學習難度都要低於C++。
 一般來說,有不少學校對於除了與電子和資訊相關的專業都選擇的是VB(以下說的VB均不指.NET)/VFP作為計算機二級的突破口。而這點教學,往往就成為了一個工科研究生僅有的程式設計基礎。VFP這種被淘汰的使用範圍狹隘的環境不討論,VB作為RAD來說著實是個不錯的選擇。但是為應付計算機二級所教授的課程來看,並不能教會除了語法外的什麼,況且所使用的VB6嚴格來說是Message Driven兼Object Based的一個開發環境,這都不利於學生從程式結構的高度(不是資料結構)去思考所撰寫的程式碼。在短暫的學習以後我們會誤認為介面框架就是軟體的構架,於是我們便可以看見在畢業設計時候,那數百行可憐的程式碼都擁擠於Command1Click這樣的字裡行間。Object Based的語言既不能教會我們用過程的方式開發,也不能支援面向物件的程式設計方法。這些都是VB對進階學習的最大障礙。
 但是畢竟我們熟悉了VB的語法,知道了程式設計語言是怎麼一回事。這已經花費了沒有接觸過程式設計的同學的相當長的時間,如果說我們還要去牽扯入C++那可怕的記憶體海洋中,還要被C++那恐怖的前後++所威脅,但是實際上我們不需要它也能過得很好,我們是不是有些冤大頭了?
 實際上,對於研究生階段,最重要的就是要讓我們學到的那一點點東西在儘可能少學別的東西的情況下發揮最大的價值。
 前面我把VB一通好臭,我想VB都會不理我了。那麼我們就另結新歡吧。找誰呢?

 VB的弱點已經有點數了(很有數的話你我就不會在這兒瞎混了,早被M$請去了),那麼便要去找一門結構性比VB好,概念又不比VB艱深太多的語言(不是說它不能艱深,而是說,不理解那些艱深的東西我們一樣能用的挺歡,最主要的是用起來要舒服,什麼亂七八糟的記憶體管理問題,讓編譯器和RTL/VM去替你擦屁股吧)。JAVA/C#/Delphi/VB.net都算是不錯的選擇。雖然從我的角度來說,很不喜歡,非常不喜歡,特別不喜歡微軟,但是我仍然將C#作為我的第一建議。
 因為C#的開發環境好,速度也還算不錯,桌面開發、企業級開發都很方便,微軟的支援也很到家,但是對面向物件的支援有些強迫性了,可能初期會有些難度。
 JAVA跨平臺,工業基礎好,從嵌入式到大型的分散式系統都能拿來做,但除了和C#一樣的不利因素外,開發環境和程式庫要比C#難用一些。
 Delphi對物件和過程的程式設計方法都能支援良好,語言乾淨利索,檢測嚴格,能培養出一個人好的程式設計習慣,但是它以後用途偏窄。
 VB.NET就不用說(人家都叫VB了),跟VB比較接近,語法跨越小,但是太小了會有學習惰性,會低估語義和程式設計方法上的差異,弄點不倫不類的東西出來。

 C++在程式控制上的能力,基本上都有了,而在在企業級開發方面,C++的弱勢也得到了新語言不錯的彌補。C++的另一個優勢,效率方面呢?
 MATLAB。這個工具生來就是為了計算。作為研究生的工程運算來說,無論效率上還是功能上來說,通常都是夠用的,而且也非常方便,避免了自行程式設計所面對的極為複雜的演算法選擇、編寫、除錯的問題(工程計算程式的除錯難度是很大的)。
 再加上VBA/VBSP。為什麼要帶上VBA/VBSP?其實很多你需要完成的功能,往往都在軟體中可以通過呼叫某些元件來完成。除了離線編寫完整的應用程式以外,對於大部分的問題的解來說,都可以直接使用系統所提供的環境方便的完成。使用這個環境所採用的語言,就是軟體的指令碼巨集,而現有很多的軟體所採用的巨集語言都是VBA/VBSP。它的語法、架構、程式的設計都與VB非常接近,用來快速的構造原形或為編寫實驗提供幫助的程式來說,都能比較好的完成任務。

 好了,在一門通用語言+VBSP+MATLAB的幫助下(VBSP基本上是白送的,MATLAB經常是必須掌握的,如果你不需要掌握MATLAB,那麼你的工作很可能也用不到C++的高效率),你還需要C++麼?
 如果你的答案是肯定的,那麼我只能相信這個世界真的有愛情存在。我欽佩你的執著。那麼請允許我告訴你我走過的路。
 《The C++ Primer》/《The C++ Primer Plus》  不是一本書,但是都是入門的。別為它的厚度嚇倒,能看多少算多少,不難的。
 《The C++ Programming Language》   手冊。隨身必備,供查閱。
 Platform SDK       MSDN是個不錯的選擇,講解相近,查閱方便。
 
 《Thinking in C++》      從C++開始,接觸OOP的深入解析
 《Effective C++》《More Effective C++》
 《Exceptional C++》《More Exceptional C++》  技巧、技術和技藝,編寫C++程式必須注意的若干事項。
 
 基本上到這裡就差不多了,後面的就是諸如泛型、併發、超程式設計、模版、設計模式一類的話題了,不同的話題都有不同的問題背景和應用範圍,這些往往對於大部分語言來說都是相同或者類似的。恭喜你,你們的愛情長跑到站了。
 從此以後,研究生和C++過著磕磕碰碰卻幸福的生活。