吾所到之處,君亦可至

>>>  名人論史——近當代作家的史學觀點  >>> 簡體     傳統

1997.05

我再次整理了一些來函,與大家分享。這些信件經過「依媚兒」的往返,展現出一問一答的形式。我想在此對讀者們說,有不少問題您其實可以寫到 BBS programming 版上,會有許多熱心的前輩提供經驗。如果寫給我,難保什麼時候收到回信。

這一次我談到一些十分基本的觀念。也許電腦高手們會說我浪費篇幅。可是,我和林振輝主編很早以前就發現到,這些基本的觀念問題存在於許多許多面對繁重資訊茫然無措的資訊新人身上。我希望這幾頁篇幅能對他們有點幫助。

送件者: Hsin-Ji Wang
主旨: Thank you very much!!
日期: 1997年3月17日 PM 08:30

侯俊杰先生您好:
我是臺灣大學工學院的學生。最近我讀了RUN!PC上您回答李松輝先生的文章。在文章中,您提到要把基礎打好,程式語言要從 C/C++ 學起。

我是指科班學生。不一定其他科系也都得研究基礎科學。

我想請問您,倒底 C,C++,TURBO C 有什麼分別沒有?我之所以問這樣的問題,是因為我想學 C 已經很久了,只是分不清楚這三者之間的分別。希望您可以告訴我他們的分別。又,如果我想學 C,應該先學哪一種呢?可不可以請您推薦幾本書給我。謝謝。P.S.我學過的程式語言有 BASIC 和 FORTRAN。

C 和 C++ 都是一種程式語言。C 是結構化語言,它的動作是一行行執行,但可以把一群動作包裝在一起,稱為函式。函式有一個入口,和一個(正常情況下)出口,程式主架構就是由一個個的函式構成。這是結構化的基本精神。

C++ 則架構在 C 之上,也就是和 C 的所有指令、關鍵字都相容,再加上物件導向的能力。它的一切物件導向性質,都是從 "class" 這個關鍵字開展。程式架構是由一個個 classes 構成。也許有人會說是由一個個 objects 構成,其實大家的意思是一樣的,class 是屬性,object 才是沿用該屬性的真正實體。

關於物件導向,說來就話長了。物件導向的精髓(像多型、虛擬函式)并不容易,但學會了之後,使用別人寫好的 class library 卻很方便,你可以輕易站在別人的肩膀上。MFC 或 OWL 或目前的當紅炸子雞 C++Builder 便都要求使用者先有 C++ 能力。

所謂 Turbo C,只是「使用 Turbo 工具來學習 C」如此而已。Turbo 工具是 Borland 公司的產品。一般而言前面冠上公司名稱的,就表示和「產品」有關,而不是一種通用性的、一般性的學門或技術,例如Borland C++、Microsoft Foundation Classes(MFC)、Symantec C++、Borland C++Builder。

若論電腦語言,只能說 C 和 C++,沒有所謂 Turbo C 或 Turbo C++,或Visual C++。「學習 Turbo C」就是「以 Turbo C 這套工具學習 C」的意思。

Turbo 工具(Borland 公司)常喜歡自己創造更新更前衛的機能,逸出標準的語言范圍,所以面對這些特殊部份要特別注意,以免同一個 C 程式在不同的編譯器產品上不能夠順利編譯。如果你不在乎這一點,倒是可以放心大膽地使用更新更前衛的機能。

C 語言的學習過程,對我是遙遠的回憶。晚近這方面的書籍看得不多,所以我沒有什麼關於書籍的建議可以給你。

非常謝謝您的回答,使我對於 C/C++ 有了些了解。
您提到 Turbo 工具是 Borland 公司所
研發的,他們喜歡創造更新更前衛的機能,而這些機能需要特別注意。
如果是這樣,那麼我學習 C 時,應該用什麼工具學習比較好呢?

我所謂要注意,意思是你自己得留心是否用了些「非語言標準的功能」,以後移植(換工具)時才知道哪里可能有問題。更新更前衛的東西可能是個正因素,也可能是個負因素,端看你的考量和需求。好比說 Borland 的 Object Pascal 遠遠超出標準 Pascal 的范圍,你在學校學習 Niklaus Wirth 博士發明的傳統 Pascal 語言,面對 Object Pascal 一定傻眼。但是 Object Pascal 功能強大。

用哪一種工具比較好,難說。若為了單純的 C/C++,任何產品都能勝任,因此學生可以從售價上考量。若為計久長,C/C++ 之後還要學習 Windows 程式設計,那麼又有兩種考量,一是以純粹的 raw API 寫 Windows 程式,那也是任憑哪一種工具都能夠勝任,而且原始碼彼此相容。對於學生我還是認為價格是最實際的考量因素。但如果要以 application framework(一種威力強大的 C++ class library)來發展 Windows 程式,你就面臨抉擇了,因為不同的 application framework(如 MFC 和 OWL)完全不相容。最近幾版的 Borland C++ 宣稱可以吃 MFC 程式碼,我想這是沒有什麼意義的事情,第一,它通常不能夠吃最新版的 MFC 應用程式碼,第二,你把 MFC 程式拿到 Borland C++ 環境下繼續開發,意義何在?一時吃進去了,又能保證日後(你總是還要繼續發展的)相敬如賓嗎?還是會相敬如冰?相敬如兵?

對於工具的選擇,工業界的考量點復雜得多,包括所謂主流性(市場占有率)、價格、穩定度、速度、後續支援性。我不是說學生不在乎穩定度和速度,而是畢竟學生能寫出多大的程式呢?如果有同學不服氣我這一點,我問各位:你寫過十萬行的大案子嗎?(寫過的同學不必回信給我,基本上你已經是專業程式員了)

另外還有一個問題,最近好像很流行 Visual C++,不知道這東西與 C/C++ 有何關系,可否請您告知?

近年來凡 Microsoft 的開發工具,都冠以 Visual 之名,如 Visual C++、Visual Basic、Visual FaxPro。Visual C++ 的意義就像 Borland C++ 一樣,只不過是某家公司出的一套 C++ 軟體開發整合環境套件。

學習 Visual C++ 或 Borland C++,其實要學的是三樣東西:

1. C++ 語言。
2. 整合環境(Integrated Development Environment,IDE)的使用。
3. 一套 class library(在 Borland 為 OWL,在 Micorsoft 為 MFC)。這套東西讓你很容易寫 Windows 程式(但我可沒說它們的學習很簡單唷)。

送件者: Evan
主旨: 小生怕怕
日期: 1997年4月4日 AM 03:42

侯先生您好:
我是您的忠實讀友(自從看 RUN PC 之後),自覺自己對電腦有相當的興趣,但是總是抓不著正確的學習方向,總覺得資訊一日千里,坊間又有許多令人目不暇給的書籍。想學的很多卻沒有目標,所以總有些失落感。自從在 RUN PC 拜讀您的文章後,深深被您對資訊專業及筆鋒所吸引,迫不及待的想將您所有的大作全都買回家,但發現你所著有很多。所以希望您能提供我您到底出了多少本書及它們的書名。對於想了解 Windows 作業系統及發展 Windows 程式的我,盼望能獲得您的指導,我該以何種方式或順序來學習您的大作呢?至於程式發展的語言該學習哪一種呢?雖然,略懂一些語言但總是不專,盼您也能提供我意見。謝謝!

在雜志上列出全部著作,有廣告之嫌。此項請免。我想回答您的第二個問題。

要使用哪個語言來學習 Windows 程式設計,這不是一翻兩瞪眼的事兒,請叁閱RunPC 1997 二月份的「到此躊躇不能去」一文。如果想走 C/C++ 這條路線來學習程式設計,并且最終要進入 Windows 領域,那麼我認為首先你要在 Console(DOS-like)模式把 C/C++ 的基本功練好,千萬別這時候就接觸 Windows 程式設計。西諺有云「太多的廚子壞了一鍋湯」,我要說「太多的配料也會搞壞一鍋湯」。由簡入繁還是一般人比較能夠接受的方式。

C/C++ 基本功練好之後,學習一點點 Windows SDK 程式設計(也就是使用 raw API 寫程式)。不一定要完全動手寫,可以多看書并且嘗試動手改一兩個程式,經歷一下編譯聯結的過程。這時候也還不要用整合環境,宜使用命令列模式下的編譯器和聯結器。編譯聯結的過程可寫成makefile,不會寫 makefile 的人可以寫 batch 檔。雖然不精致,有什麼關系呢,只是過渡期而已。

再來就真正進入會影響你日後工程師生涯的動作了。你可以挑選 Visual C++ 或Borland C++ 或 C++Builder 或 Optima++ 或 IBM Visualage C++ 或Symantec C++...,學習比 raw API 更高階的程式設計方法。說穿了其實是選擇一個 application framework(MFC 或 OWL 或 VCL 或 Open Class Library 或...),那才是程式設計主戰場。整合環境雖然也需要一些時間去學習熟練,但困難度不高啦。

學習這種 application framework,你必須把程式主軸搞得很清楚,才有辦法游刃有馀地添骨添肉、解決問題。等到主軸的東西都清楚了,其他應用則泰半只是看范例、查手冊的功夫而已,因為現成好用的 classes 會愈來愈多。想寫個簡單的 Internet server 程式?簡單,MFC 的5個 classes 保送你上壘。想寫個資料庫應用程式?簡單,MFC 的 DAO 和 ODBC classes 讓你輕輕松松快快樂樂。

遺漏了一個大重點:Windows 作業系統。要把應用程式寫得好,作業系統的基礎一定要有,否則遇到問題就可能像...像蒼蠅面對玻璃窗一樣,近距離貼著玻璃亂飛亂舞,看起來很忙碌,卻不知道退一步看,原來旁邊有一個窗口可以飛出去。

作業系統的知識一定要在程式設計過程中不斷地進修,與程式設計相配合。RunPC 1997.03 的 <無責任書評/侯捷> 中介紹了三本很棒的 Windows 作業系統書籍

送件者: Mcfee Woo
主旨: 請給一位非本科的忠告!
日期: 1996年3月13日 AM 01:39

侯老師,您好:
拜讀您幾本有關於 C++ 的書之後,又碰巧在這期 RUN!PC 看
到您所寫的一篇文章,文章中提到 "足夠用就好"。碰巧
本人是那種不務正業的學生(本科是電機,興趣卻是電腦),
且學的是 C 語言,正努力向 C++ 及 JAVA 挺進,但讀完文章後,深
覺恐慌,畢竟非本科的學生總是少了那麼一點點專業知識,是
否應該立即放棄艱深難懂 C++ 而改學習 Visual Basic,使得學
習起來也許會快樂一點(C 的指標至今仍是我的惡夢)。不知侯老師
有何意見提供,畢竟老是舉棋不定還不如痛下心決定,蹉跎青春
也不是辦法。一位主觀意識不是很強的少年留。

關於學什麼東西才好,我仍是那句話:夠用就好。但是作為學生的你,又怎麼知道是不是夠用了呢?這就困難些了,好好和師長同學們聊一聊吧,雜志上意長紙短難概敘。但是,切記,為自己的後路留一些馀裕,把自己壓緊一點,是眼光更遠規劃更長的人的作法。

「快樂地學習」的確是一件非常重要的事。如何才能夠快快樂樂地學習呢?你需要反省你的不快樂在哪里。我有一些朋友,他們專挑高難度的東西做:翻譯要翻奧秘級的書,寫作要寫核心層架構,做專案則不只價格是個考量,有沒有挑戰性更是要點。他們希望自己在那種情況下成長進步。感受自己一天天成長進步,是那種人莫大的快樂。我自己,每天,睡覺前如果覺得「傳不習乎」,一定懊惱 24 小時白過了(不過覺還是睡得香甜就是)。有種人馬上就譏諷像我們這種人:『干嘛,人活過得那麼痛苦』。哼哼,子非魚,焉知魚之樂?但也不必反唇相譏:『整天醉生夢死只知享樂,活著的意義在哪里』,因為「子非彼,焉知彼之不知魚之不樂」?基本上人從生物學劃分為紅黑黃白棕五色人種,沒有人企圖把這五種人的生理結構、遺傳基因做平頭平等的比較(海地人是 AIDS 的高危險群,黑人的身體密度不適合游泳競賽...),如果我們承認這五種人不一樣(我們都這麼承認,不是嗎),我們也不必去說服不同人生觀與價值觀的人,因為那是思想上的紅黑黃白棕。

說遠了。我意思是,你應該甚清楚你的性向。那麼,不快樂是因為確實不喜歡那些很傷腦筋的東西,還是因為基礎不夠常常碰壁?如是前者,當然要痛下決定避免蹉跎青春。如是後者,你需要好好徵詢師長的經驗,為你指出好的學習順序,於是「觀古今於須臾,撫四海於一瞬,選義按部,考辭就班」,也就不覺痛苦了。

如果你以為我認為 C/C++ 才有高難度,學習它人生才有意義,那誤會就大羅。任何領域都有入門、進階、精專等等不同層次。C/C++ 之路的確特別坎苛些,又因正是你的遭遇,所以提出做為例子。

送件者: b83125@ccstudent.ee.ntu.edu.tw
主旨: Dear jjhou!
日期: 1997年3月14日 PM 06:52

杰哥:
近來網路上討論熱烈 MFC 將被放棄。
我才剛學 MFC 就遭此打擊。我覺得從你的「深入淺出 MFC」的角度出發,最大收獲在於了解 class library 的實作以及Window 程式設計的方法及其歷史演進。至於BCB,可以讓人非常有成就感,滿足現代人的速食需求。但我懷疑它是否將像各種 Wizard 或 Expert 一樣,產生出一堆號稱會 Windows 程式設計,卻也不過是點點滑鼠拉拉物件罷了。
不知您對這種 RAD 產品的看法如何。

BBS 上的許多消息,只能夠看看就罷。BBS 於我,就像報紙影劇版一樣,最大的功能是提供一些話題娛樂,與某種叁考。對於純消息面而無技術面支撐的東西,消息純粹只是一種話題。

Visual C++ 5.0 將於五月七日推出。其程式設計主軸,也就是 MFC,仍維持在 4.2 版(我偶而從文件中看到 4.21 這個號碼)。你知道我以及我的不少朋友看到這個情況的心情嗎?喔,我們都松了一口氣!

你說我們這些「老一輩」的工程師是抗拒進步、不求長進嗎?我說呀,實務經驗還嫩得很的學生的想法,和工業界老鳥的想法,中間有一道大峽谷。

如果你已經有產品上市賣了一兩個版本,有成千上萬的人在用你的軟體,你絕對不會希望你所仰賴的程式主軸有什麼大變化。穩定中求發展的最理想情況,以 class library 來說,就是不斷有新的、功能更強、涵蓋范圍更大、并且與既有架構相容的 C++ 類別不斷加進來。主架構的東西不能夠三天兩頭大變動,那會被人罵死,而且慢慢流失客戶。

所以即使 MFC 成長到 5.0、6.0、7.0,我判斷它的主軸仍然不會有變,只是累加新類別而已,就像 MFC 從 2.5 進展到 4.0 再到 4.2,只是增加了一些Internet 類別一樣。加的類別愈多愈重要,版本號碼就跳得愈遠一些。

回溯相容是實戰市場上最最重要的一件事。即將擁有戰場的尖兵們,這是你們的教戰守則第一條。

主架構會變動的情況只有一種,那就是原本客戶不多(所以包袱不大)。這時候就有必要嘗試一下大破大立,看能不能夠扭轉乾坤。OWL 的市場占有率不高(這和它是不是好東西沒有關系),所以Borland 乾脆靈活擺尾,推出新架構的 C++Builder。老客戶呢?罵就罵吧,沒辦法,公司獲利比較重要,公司不獲利,橫豎是個倒,大家也別玩了。再說,推出 C++Builder 可并沒有要把 OWL 回收,老客戶還是可以繼續以手上的 OWL 開發產品。只是在「沒有新版,就是退步」的觀念下,老客戶大概都會加入咒罵的行列。罵就罵吧,沒辦法。

誰能夠接受新(而且優秀)的產品?沒有包袱的人是也,學生是也,新專案是也。當學生進入工業界,遇到新專案,又遇到幾個志同道合的同事,新開發工具的機會就來了。新產品唯有打入工業界,才有生命可言。教育市場再大,必會受工業界影響。誰要學將來碰不到同好的技術?多寂寞!餓死人!

若要我比較 C++Builder 和 Visual C++,我覺得前者所使用的Properties-Method-Event(PME)元件結構比較理想,容易做出視覺化開發環境,得進 RAD(Rapid Application Development)之殿堂。這話聽起來好像 Visual C++ 所使用的元件是什麼史前怪物似的。也不是,Visual C++ 所支援的 OCX 元件(OLE controls,現在叫 ActiveX controls),也是 Properties-Method-Event(PME)結構。只不過 Visual C++ 的整合環境沒有能夠把 PME 結構落實到程式設計過程與整合環境工具的互動上,而 Visual Basic、Delphi、C++Builder 有。

C++Builder 的確很快給人成就感。但當你要為你所使用的 VCL 元件之間建立一些些關聯時,「拖拉點放」四字訣就不管用了,你就要開始寫碼了。關鍵在這里。雖是短短三行,基礎不夠的話,挫折感可能會和先前的成就感一樣深唷。開發工具的優劣不是看誰需要寫的程式碼少來決定,否則大家都去看無字天書 -- 字最少,最好學。

工業界朋友老神在在,用什麼開發工具,他自有判斷能力,不會因為BBS 上的消息而惶惶顫栗。學生則要加倍努力 -- 在此百花齊放的年代。沒辦法,誰叫你們生長在資訊爆炸的時代。我雖然也「不幸」生長在此時代,但是在我的人生剛從黑白變成彩色的時刻,電腦科技也才剛要開始它的璀燦,我有機會與它一起成長,我有足夠的時間深植我的基礎,以接受它的驚人爆炸。

生得晚,生得早,都不如生得巧呀(呵呵,就讓我這種老人開心一下吧)。

這一個月來涉及 C++ 和 Windows 程式設計頗多,發現許多人
對此兩個領域的概念大多不清不楚,又胡亂寫書亂講話。使入門者喪失
了認知 C++(ANSI C++)的藝術與威力,又造成對 Windows
程式設計一知半解。

2500 年前就發生過這種事情,於今尤烈。論語述而篇,子曰:「蓋有不知而作之者,我無是也。多聽擇其善者而從之,多見而識之,知之次也」。意思是說「有些人往往對事理一無所知,竟胡亂創作,我就不這樣。多聽別人說,多選擇好的去依從,多看多記以備叁考,這樣其實就可以算是次知了」。(孔子以生而知之為上智,學而知之為次智)

我們的電腦書籍在創作方面有點問題,但情況不算荒謬,頂多是大家慨嘆技術書籍和使用者入門書籍數量差距過大;早期有些抄襲現象,在市場機能之下自自然然地浪淘盡千古人物。翻譯方面則嚴重多多,因於許多高階技術的確需要大大倚賴翻譯書,而我們長久對於翻譯存著不正確的態度(現在還有那種沒寫過 Java 卻可以包兩章 Java 回來代工的情況),以及不肖出版人的撈錢心態(一本書拆十個人譯,沒人愿意掛名於是抓瞎來掛。到處找廉價學生代工,又沒有人統籌全書技術與文字水平。負責任的譯者想要校稿卻遭拒,原因是會延誤商機...哎,血壓有點升高)。

現在還流行一種講敘電腦王國內部秘辛的書籍,基本上內容偏向管理文化、企業文化。中譯本都不是由電腦書籍出版公司制作,而是由讀者群更大眾化的圖書公司負責。其中爆笑內容亦頗具殺傷力,像視覺培基(Visual Basic)、班級圖書館(Class Library)等等。我不知道為什麼出版者對翻譯的態度如此。既然牽涉到專業領域,稿子起碼要給專業人士看過,難道他們連這一點常識都沒有嗎?

三天前,我和一群朋友午餐。朋友丟出一個尖銳的題目:你認為近年來的電腦書籍品質有沒有進步?呃,談進步要看全局。好書的比率如果下降,就是沒有進步。

有沒有進步呢,親愛的朋友?

我也只能拾孔子的牙慧說:『多聽擇其善者而從之,多見而識之』。「侯子」的意思是:「多聽聽別人對書籍的評語,口碑好的才買;多增加知識,以便自己也有良好的判斷能力」。讀者、作者、譯者、出版社,都應該常常逛 BBS 上的電腦書訊版(各 BBS 有轉信功能,我本身是從清華大學的 140.114.87.5 進去)。最好有人設計一些票選活動,把書訊版炒熱,讓它成為一個重要的輿論工具。如此,我想任何從事寫作和出版的人都會有所警惕與鼓舞。

不過,網路票選好像可以做假。算了!

依我的看法,要成為一個優秀的 Windows 程式設計者
是急不得的!他應該先對 C++ 有徹徹底底的認知,
雖然剛開始只可能先寫寫 console mode 程式,但對日後的幫助非常大。
此後,再觀看各種工具,從中選擇一個最適合自己的整合開發環境,
便能夠一舉踏入 Window 程式設計領域。中間的努力雖不足為外人道,
但終有一天一定會明白努力沒有白費。畢竟 No pains, no gains!

總結到基礎面來,是的,不管怎樣,基礎打好最重要。C++ 先學好,再來學 MFC 程式設計或 C++Builder 程式設計。作業系統的觀念要有,而且常常補注新血。我以為,先在 console 模式(DOS-like 程式)中厚植 C++ 的功力,然後才進入 Windows 程式設計領域,乃天經地義的事。難道有人不是這麼想嗎?沒有人告訴各位正確的路線嗎?老師和學長都在做什麼呢?還是我們不知道問?由 C 到 C++ 到 Windows 程式設計,要開一個完整豐富不急就章的學程,以學校上課的松散度而言,我想至少需要三學期 9 學分。有一所大學,資訊系大一新生一進來就開始學 C++,而且是 Windows 程式設計(采用 MFC)。天,我為那些同學祈禱(也為老師祈禱)。

最後,嗨,新新人類,我有點不能夠適應你叫我杰哥。叫杰叔比較符合我們的年齡差距。昨天一位年輕貌美的女的朋友說我愈來愈年輕了,我沒有薰薰然。你也不要認為這樣會讓我高興。聽到別人說自己年輕而會感覺高興的人,表示他真的老了。 :-)

送件者: chilong@csie.ncu.edu.tw
主旨: 請問[元智的開課時間地點]...
日期: 1997年4月16日 AM 03:41

學生三年級起,便覺自己在電腦
各方面的領悟力真的很差,尤其程式更是要花人家的 2~3倍的
時間來鉆研,若是跟強到變態的人比更是差了10倍以上...
常有強烈挫折感。有時會鼓勵自己說:"電腦只有後進與先進,
我只是比較慢學而已..."。雖然偶爾寫出了個小程式便雀悅不已,
但是與寫不出來的次數比較實在是小巫見大巫...。好玩的是,
每當我想放棄寫程式,偏又有一兩個寫出來的程式讓我再度向前,
如此停停走走...有些矛盾...實在很想知道似侯先生的電腦強人
的程度,甚至任何有關電腦的學習歷程到底是如何??
曾經問過系上老師,得到了個妙答:就是"突然頓悟,突然就會了"...
哇~~太高深...就如同老和尚在讓小沙弭玩動動腦猜猜看游戲一般。
不知侯先生對於這個問題的看法如何呢?? 學生真的很想知道。

「程式設計」當然也有天份的成份在(和任何其他領域一樣),不過,任何資質平庸的人都可以經由努力而達到相當的水準。問題是「努力」的程度。我念研究所的時候,半夜出沒在系館中的絕大半都是老師。現在我自己當了老師,我也覺得我比絕大半學生都用功。

我不是電腦強人,也沒有什麼天份,我只擁有和絕大部份人一樣的「中人之資」而已。吾所到之處,君亦可至 

 


侯捷 2010-09-10 08:29:16

[新一篇] Programming 不必是自我虐待

[舊一篇] 選義按部,考辭就班
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表