Tuesday, May 31, 2011

Customize the Default Error reporting

Customize the Default Error reporting

go to "Admin" > Error Reporting > Set "Default 403 (access denied) page:" to:

access_denied

<?php
/**
 * Implementation of hook_menu().
 */
function myModule_menu() {
  $items = array();

  $items['access_denied'] = array(
    'title' => '',
    'page callback' => 'myModule_default_403_access_denied_page',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
  );

  return $items;
}


function myModule_default_403_access_denied_page() {
  // Customize error reporting message for some URL.
  // Note: you should use $_REQUEST['destination'] instead of $_GET['destination'].
  if ($_REQUEST['destination'] === 'user/register') {
    $title = '';
    $str = t('You have been signed as our member. Thanks for your interest.');
  }
  else {
    $title = t('Access denied');
    $str = t('You are not authorized to access this page.');
  }
  
  drupal_set_title($title);

  return $str;
}
?>

Monday, May 30, 2011

check all / uncheck all checkbox drupal

<?php
function myModule_batch_add_opp_form($form_state) {
  $form = array();

  $nid_contactCheckUncheckAll_js = <<< EOD
    Drupal.behaviors.nid_contactCheckUncheckAll = function(context) {
      $('#edit-nid-contact-').click(function(event) {
        $('#myModule-batch-add-opp-form').find('input[@type=checkbox]').each(function() {
          this.checked = $('#edit-nid-contact-').attr('checked');
        });
      });
    };
EOD;

  drupal_add_js($nid_contactCheckUncheckAll_js, 'inline');

  $form['nid_contact'] = array(
    '#type' => 'checkboxes',
    '#title' => 'Select Contacts',
    '#options' => array('' => 'Check / Uncheck All') + myModule_nid_contactArr(),
    '#required' => TRUE,
  );

  return $form;
}
?>

How to update a module's weight

How to update a module's weight

In Drupal, the order in which a module's hooks get called is dependent on the weight of your module in the system table. You can set a low weight (including negative numbers) to get your module to execute before others. Or, you can set a high weight to execute after other modules.

Note: In Drupal 7, modules can vary the weights of their hooks to be more flexible.

Code to update weight

You will want to modify and then place this code into your module's modulename.install file in a modulename_install function. See more details on the hook_install in the hook_install API documentation.

UPDATE system SET weight = [yournumber] WHERE type = 'module' AND name = 'yourmodulename';

Reference:
http://drupal.org/node/110238

Saturday, May 28, 2011

這才是人生 (曹興誠)

這才是人生 (曹興誠)

曹興誠在台北演講時,有學生問他關於生涯規劃。他答說一生從不生涯規劃 ,只做好眼前一、兩年內的事
十歲的我,面對天真的隔壁小女孩,她說:「大哥哥,長大後我要嫁給你,我會對你好,以後你就會知道。」

二十歲的我,面臨聯考的挫折,只聽見父親說:「大頭,不努力考上好學校,將來怎麼找到好工作,現在貪玩,以後你就會知道。」

三十歲的我,第一次相親,媒人告訴我:「小嬋是個好女孩,聰明、孝順,會煮一手好吃的飯菜,娶了有幫
夫運的她啊,會好運一輩子,以後你就會知道。」

四十歲的我,收到滿是紅色的體檢報告,醫師告訴我:「大頭先生,你應該少應酬,少抽煙喝酒,少吃肉類
和生猛海鮮,多運動,作息要正常。你要再不好好保重自己的身體,以後你就會知道。」

五十歲的我,喝了自己兒子的喜酒,鄰座的阿尚告訴我:「親家!呷你恭喜呵!娶一個水媳婦,啊嗯哥(可
是)欠腳的媳婦派管(能幹的媳婦難管),以後你丟摘啊啦(以後你就會知道)。」

六十歲的我,參加了同學的葬禮。看到浮雲蒼狗,它彷彿告訴我:「......以後你就會知道.......。」

現在的我,只擁有一本相本夾著幾張泛黃的照片;幾張忘記要寄出、也不記得要寄給誰的情書;幾件參加
過無數喜喪的西裝;一紙成績單包著數十年努力後的退休金;還有一直陪在自己身邊的老伴。我告訴我自
己:「其實,你很富有;所以,把握當下,珍惜一切,努力為人群去付出,至於以後,你根本不須知道。」

忙的時候,想要休息;渡假的時候,想到未來。窮的時候,渴望富有;生活安逸了,怕幸福不能長久。
該決定的時候,擔心結果不如預期;看明白了,後悔當初沒有下定決心。

不屬於自己的,常常心存慾望;握在手裡了,又懷念未擁有前的輕鬆。

「生命若不是現在,那是何時?」「能隨心所欲的去過生活,這才是人生!」

路已盡頭,該轉彎了

今天在報紙上看到一篇女生寫的文章,讓我感觸很深,她因為初戀的失敗,一直離不開失戀的痛苦而有
輕生的念頭,在她想自殺的那一剎那,她看到了公車上有的一小段詩,詩的內容就有這麼一句:『不是路已
走到盡頭,而是該轉彎了!』而讓她拋棄了輕生的念頭。最後她寫說:大二的我,被一個不速之客擾亂了
平靜的生活卻也不經意的被另一個不速之客救贖了。

生命中總有挫折,那不是盡頭,只是在提醒你,該轉彎了。

『不是路已走到盡頭,而是該轉彎了!』 這句話其實很有意思!

當你遇到一件事,已無法解決,甚至是已經影響到你的生活、心情時,何不停下腳步,暫時的想一想是否
有轉闤的空間,或許換種方法,換條路走事情便會簡單點。但通常在那一刻,我們並來不及想到這些,是
一昧的在原地踏步、繞圈,讓自己一直的陷在痛苦的深淵中,生命中總有挫折,那不是盡頭,只是在提醒
你:該轉彎了!

放手不代表承認失敗,放手只是為自己再找條更美好的路走! 『做好手邊的事,這就是人生。』

活在當下才是最好的選擇!把握每一個美好的當下!每一件事情都是美好的!

zip compress file with password protected encryption protection for Mac

zip -e mytest.zip mytest.txt

Thursday, May 26, 2011

Few ways to validate drupal node and node form

Few ways to validate drupal node and node form

Method 1: drupal form
<?php
function moduleName_sample_form($form_state) {
  $form['comp_name'] = array(
    '#type' => 'textfield',
    '#title' => 'Company Name',
  );
}

function moduleName_sample_form_validate($form, &$form_state) {
  if (strlen($form_state['values']['comp_name']) < 3)) {
    form_set_error('comp_name', 'company name must be more than two characters.');
  }
}
?>

Method 2: hook_nodeapi()
<?php
/**
 * Implementation of hook_nodeapi().
 */
function moduleName_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  if ($op === 'validate') {
    if (empty($node->field_start_date[0]['value'])) {
      form_set_error('field_start_date', 'Start Date must not be empty.');
    }
  }
}
?>

Method 3: hook_form_alter()
<?php
/**
 * Implementation of hook_form_alter().
 */
function moduleName_form_alter(&$form, $form_state, $form_id) {
  if ($form_id === 'contact_node_form') {
    moduleName_reset_contact_node_form_fields($form);
  }
}

function moduleName_reset_contact_node_form_fields(&$form) {
  ### validate start date and end date.
  $form['#validate'][] = 'moduleName_validate_field_start_end_date';
}

function moduleName_validate_field_start_end_date($form, &$form_state) {
  if (empty($form_state['values']['field_start_date'][0]['value'])) {
    form_set_error('field_start_date', 'Start Date must not be empty.');
  }
}
?>

make CCK field required

make CCK field required

Since CCK field shared the same global "required" setting, we can hook_form_alter() to make the field required in some situations.

<?php
/**
 * Implementation of hook_form_alter().
 */

function test_form_alter(&$form, $form_state, $form_id) {
  ### make nid_contact field required.
  ### Note: you need following both lines in order to make it work properly.
  $form['field_nid_contact']['#required'] = TRUE;
  $form['field_nid_contact'][0]['#required'] = TRUE;
}
?>

difference between Remain unchanged Remained unchanged

Remain unchanged -- not changed at any time
Remained unchanged -- was/were not changed in the past
Remain to be changed -- hasn't been changed yet
Remained to be changed -- hadn't been changed yet

Reference: http://www.english-test.net/forum/ftopic37754.html

Monday, May 16, 2011

“日”字加一筆,你最先想到什麼字?

1、變成‘甲’字;此類型的人具有敏銳的觀察力及特殊的才能,一生可能只為了追求
一件事而努力;喜歡助強扶弱,打抱不平;渴望在社會上與人群中有作為,並擔當他們
的領導者,個性衝動,權威自信,有正義感,自強不息,愛出風頭,喜歡替他人作主和
發號施令。關注權利、獨斷,並且控制空間和領域否認弱點和缺陷充滿活力,嚮往刺激
和精彩憤怒爆發直接、面對面相信“強權就是公理”,別人會覺得專橫霸道喜歡控制大
局和授權給別人的樂趣,但卻不喜歡被控制會保護、支援自己的朋友、家人和下屬很難
聽從別人的意見喜歡被人尊重而不是被人喜愛是一個堅強、自信、果斷和會馬上採取行
動去解決問題的人。比較適合開創性、冒險性的工作,因為其前進行動力是比較明顯的
。性格傾向:外向、主動、樂觀、衝動、專制、有正義感。在感情上相對可能會比較平
淡。他們在年輕時的境遇可能較辛苦,所以他們的心境大半保持冷靜;談戀愛時也一樣
,即使是在熱戀期也會理性大於感性。

  2、變成‘由’字;此類型的人在團體中,通常是大家能夠信賴依靠器重的人材,
具有強烈的責任感,重視自己的道德、價值觀,但是喜歡出風頭,有些狂妄自大。渴望
事業有成就,以目標為主導,重視自我形象,希望被人肯定,受人注意和羨慕。他們能
在每一刻中都適當地表現出該有的反應,善於掌握每一個機會,務求達到成功。渴望被
肯定、讚賞、被他人羨慕。這類人比較適合穩定性、規律性的工作,因為比較偏好穩扎
穩打。性格傾向:外向、主動、擅于交際,注意力集中在結果,而非過程,經常會疏忽
自己的感受,堅持自己的目標,達不到目標就惱火,會強迫自己,因此顯得比較急躁,
有時會為了求效率而犧牲完美走捷徑,精力充沛、熱愛工作、奮力追求成功、以獲得地
位和讚賞,為了事業成功、聲望、財富,有時犧牲情感、婚姻、家庭或朋友是一個受人
欣賞、有能力、出眾的人。與他們談戀愛是最好的,因為他們很會照顧人,且對伴侶忠
貞,不會有複雜的異性關係;但有些人會認為他們有思想上的潔癖,而且跟他們在一起
經常會因為工作很忙而經常無法正常交往,容易出現感情分離。

  3、變成‘申 ’字;此類型的人性格內向、被動、樂觀、隨和、順從。通常給人親
切、善良、人際關係好的感覺,在團體中是非常受歡迎的人物,渴望人人能和平共處,
怕引起衝突,怕得罪別人,怕左右為難,不爭名逐利,性格溫順,與世無爭,愛好大自
然,寫意隨和,但往往給予人一種懶洋洋,沒有個性,慢條斯理和滿不在乎的感覺。但
是因為其性格的原因,容易耽擱事情,別人會覺得其被動和優柔寡斷,雖然不喜歡命令
別人,但當別人命令自己時,會反感和變得倔強對於不同觀點的分歧和爭論。而有時為
了人際關係的圓融,推卸責任和善於説謊也變成他們的特質。有著良好的事務協調能力
,很懂得察顏觀色。不過,此類型的女生會把婚姻和愛情擺在第一位,視野也因此受限
;男性則是太受歡迎而容易有外遇的情況發生。

  4、變成‘田’字;此種類型的人喜歡思考、追求知識、渴望比人知得多,懂得快
,喜歡運用自己的智慧和理論去駕馭他人,他們冷靜,機智,分析力強,好學不倦,善
于理性,有邏輯地去處理問題並將情感抽離,不喜歡自己的空間受到騷擾。性格傾向:
內向,被動,自我,喜歡思考,關注探究,喜歡尋求孤零感覺,不喜歡自己的空間受到
騷擾,不擅長對他人説好聽的話,喜歡獨自解決問題或獨自計劃並執行一項計劃,喜歡
一個人獨自思考、觀察、並找尋生命的意義,是一個理解力強、重分析、好奇心強、有
洞察力的人。感情方面相對比較保守,但是成功率反而更高,而且幾乎沒有感情方面的
糾紛和外遇。

  5、變成 ‘舊’字;此類型的人相當特立獨行,他們的人生計劃是那種“孤軍奮戰
”型的,他們非常有自信能達成他們的計劃,所以們喜歡聽人家的稱讚。渴望受到保護
和關懷,為人忠心耿耿,但多疑過慮,怕出風頭,怕生事端,怕自己力不從心,怕人虛
偽,口是心非,怕事與願違。時時需要防範被人利用和陷害,所以喜歡尋求權威的庇護
,但對權威有著不信任感。所以內心深處常隱藏著恐懼和不安,對人和事缺乏安全感。
性格傾向:內向、主動、保守、忠誠。關注潛在的傷害、危險、威脅。但容易放大危險
、災害,而且生性多疑,不會輕易相信別人,可是內心深處卻希望得到別人欣賞和肯定
常問自己是否有做錯事,因為害怕犯錯誤而被責備要求公平,期望付出和所得想得到對
事情通常想的太認真。但卻是是一個忠誠、值得信賴、勤力的人。對於感情方面,喜歡
標新立異,與從不同,因此也不太安定。而且在談戀愛時,他們不是那麼在乎對方的情
緒,因為他們常滿足於自我的情緒中而忽略了對方。

  6、變成‘白’字;此種類型的人自我意識很強,在美感方面有獨特的見解,不會
盲目追求流行,而自尊心也比較高,擁有與眾不同的理想,且會為實踐理想而努力不懈
怠。覺得這世界充滿了刺激的事物和體驗,人生的目的在於追求快樂,而“好玩”更是
其做事的動力。對於愛情他們可以馬上選擇出他們所要的,而且絕對忠貞,但這也意謂
他們的佔有欲極強,而且因為他們通常在心中已有一個理想的情人模型,所以想擄獲他
們的心,最好的方法就是徹底的了解他。性格特點:外向好動,活潑開朗,精力充沛,
興趣廣泛,時常想辦法去滿足自己想要的,愛玩,貪新鮮而怕作承諾,渴望擁有更多,
傾向逃避煩惱,痛苦和焦慮。外向、主動、樂觀、貪玩、缺乏責任感。多才多藝,興趣
廣泛,不喜歡被限制,樂於探索,貪圖享樂,對有興趣的事很入迷,喜歡上餐館、娛樂
、旅行或同朋友談天説地的美好享受,但不善於處理繁瑣和細節的任務,是一個快樂、
熱心、思想正面的人。

  7、變成‘目 ’字;此種類型的人,你可以説他具有協調性,也可以説他優柔寡斷
、沒原則。他們非常害怕自己受到傷害,所以自我防衛心很強,有時還會因過度防衛而
傷了對方。他們希望每件事都做得最完美、使自己和世界變得更完美,但卻經常有些急
于求成反而沒有如願以償。做事力求正確完美,有原則,有標準,常有自我批判並要求
他人按自己標準去做事情的傾向,理性正直,時常壓抑自己人性中不理性的一面,怨而
不宣。性格傾向:內向、被動、批判。關注錯誤,糾正錯誤,有責任、獨立、勤奮工作
,有理性、成熟、有目標,有原則、有標準、且看中效率,但是喜歡批評別人,吹毛求
疵,做事沒有耐性、喜歡先工作,後享樂,喜歡壓抑衝動和渴望過度剛性,是一個合理
、實際、腳踏實地的人。但是在愛情路上,他們很容易受到**而轉移目標,雖然不是故
意的,卻因此傷了很多人的心。

  8、變成‘電’字;此類型的人個性非常複雜,有多方面的特質,只要一不小心就
很容易迷失自我,因為搞不清楚自己到底是怎樣的一個人。喜歡把焦點放在關係和感覺
上,不開心時,喜歡獨自一人來處理,和不熟的人交往時,會表現沉默和冷淡,特別容
易被人生哀愁、悲劇所觸動,認為被他人誤解是一件特別痛苦的事,但是其創造力、熱
情和豐富的感情卻非常地吸引人,所以在其身邊從不缺少朋友!當遭到拒絕、挫折時,
便會退縮,變得沉沒、害羞,當別人面臨危機時,會很支援及同情他們,有很豐富及活
躍的想像力,喜歡把事物重組一個新的模式。是一個直覺、敏感、有創造力的人。在愛
情方面,他們因為擁有多方面的特質,所以很容易吸引到異性。

  9、變成‘旦’字;這類人常常非常喜歡幫助他人,渴望被愛,受人感激和認同,
善解人意,有同理心,熱情地去滿足他人需要而又希望不被察覺。性格傾向:外向、主
動、感情豐富,關注去滿足重要的其他人,樂於付出,希望努力滿足他人需要,成為他
人不可缺少的人,喜歡壓抑或疏忽自己的感受,不喜歡向人直接表達自己的真實感受,
缺乏自主和想法,喜歡與朋友相處,並樂於傾聽他們的事情,對人熱情、友善、有愛心
和有耐心,重視人際關係,是一個關懷、樂於助人、慷慨的人。其感情生活非常地細膩
,所以能與這類人談戀愛,會讓你活得更愉快。但是因為不善於拒絕別人,所以有時候
也會把自己搞得很累,給自己增加了許多不必要的麻煩。 、

  10、無法組成字此類型的人常覺得自己和別人不同,是不平凡和獨特的人。我覺得
自己是一個感情豐富的、浪漫的、有品位、有個性和喜歡我行我素的人。渴望自我了解
和他們的內心感受被人認同,喜歡我行我素,不媚俗,感情豐富,思想浪漫有創意,擁
有敏銳的觸覺和審美眼光。性格傾向:內向,被動,多愁善感、感情豐富,喜歡把焦點
放在關係和感覺上,不開心時,喜歡獨自一人來處理,和不熟的人交往時,會表現沉默
和冷淡,特別被人生哀愁、悲劇所觸動。認為被他人誤解是一件特別痛苦的事,當遭到
拒絕、挫折時,便會退縮,變得沉沒、害羞。當別人面臨危機時,會很支援及同情他們
,有很豐富及活躍的想像力,喜歡把事物重組一個新的模式是一個直覺、敏感、有創造
力的人。感情方面有些過分小心而經常受到挫折,而且也容易失戀,其感情生活要嗎就
一生只有一個,要嘛,就可能經常更換其身邊的女朋友。

Saturday, May 14, 2011

畢業三年,同學基本都辭職了,大部分人看完很有同感

下面這篇文章,是我剛到公司不久時,收到公司同事的轉寄信。
從工作到現在快滿一年了,這篇文章我也陸續回顧了好幾次,每次都有不同的領悟,
真是一篇神奇的文章,所以也寄給你看看....:D


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[文章分享]畢業三年,同學基本都辭職了,大部分人看完很有同感~


當時公司招了大批應屆本科和研究生畢業的新新人類。平均年齡25歲。那個新的助理,是經過多次面試後,我親自招回來的一個女孩。名牌大學本科畢業,聰明,性格活潑。私下裡我得承認,我招她的一個很重要的原因,除了她在大學裡優秀的表現之外,還因為她寫了一手漂亮的字。女孩能寫一手好字的不多,尤其像她,看起來長髮飄飄,多麼女性化的一個姑娘,一手字卻寫的鏗鏘倜儻,讓我對她不由多了很多好感。


手把手的教。從工作流程到待人接物。她也學的快。很多工作一教就上手。一上手就熟練。跟各位同事也相處的頗融洽。我開始慢慢的給她一些協調的工作,各部門之間以及各分公司之間的業務聯繫和溝通讓她嘗試著去處理。


開始經常出錯。她很緊張,來找我談。我告訴她:錯了沒關係,你且放心按照你的想法去做。遇到問題了,來問我,我會告訴你該怎麼辦。仍然錯。又來找我,這次談的比較深入,她的困惑是,為什麼總是讓她做這些瑣碎的事情?我當時問她:什麼叫做不瑣碎的工作呢?


她答不上來,想了半天,跟我說:我總覺得,我的能力不僅僅能做這些,我還能做一些更加重要的事情。那次談話,進行了1小時。我知道,我說的話,她沒聽進去多少。後來我說,先把手頭的工作做好,先避免常識性錯誤的發生。然後循序漸進罷。


半年以後,她來找我,第一次提出辭職。我推掉了約會,跟她談辭職的問題。問起辭職的原因,她跟我直言:本科四年,功課優秀,沒想到畢業後找到了工作,卻每天處理的都是些瑣碎的事情。沒有成就感。我又問她:你覺得,在你現在所有的工作中,最沒有意義的最浪費你的時間精力的工作,是什麼?她馬上答我:幫您貼發票,然後報銷,然後到財務去走流程,然後把現金拿回來給您。


我笑著問她:你幫我貼發票報銷有半年了吧?通過這件事兒,你總結出了一些什麼資訊?

她呆了半天,答我:貼發票就是貼發票,只要財務上不出錯,不就行了唄,能有什麼資訊?

我說,我來跟你講講,當年我的做法吧:98年的時候,我從財務被調到了總經理辦公室,擔任總經理助理的工作。其中有一項工作,就是跟你現在做的一樣,幫總經理報銷他所有的票據。本來這個工作就像你你剛才說的,把票據貼好,然後完成財務上的流程,就可以了。


其實票據是一種資料記錄,它記錄了和總經理乃至整個公司營運有關的費用情況。看起來沒有意義的一堆資料,其實它們涉及到了公司各方面的經營和運作。於是我建立了一個表格,將所有總經理在我這裡報銷的資料按照時間,數額,消費場所,連絡人,電話等等記錄下來。


我起初建立這個表格的目的很簡單,我是想在財務上有據可循,同時萬一我的上司有情況來詢問我的時候,我會有準確的資料告訴他。通過這樣的一份資料統計,漸漸的我發現了一些上級在商務活動中的規律,比如,哪一類的商務活動,經常在什麼樣的場合,費用預算大概是多少;總經理的公共關係常規和非常規的處理方式。等等等等。


當我的上級發現,他佈置工作給我的時候,我會處理的很妥貼。有一些資訊是他根本沒有告訴我的,我也能及時準確的處理。他問我為什麼,我告訴了他我的工作方法和資訊來源。


漸漸的,他基於這種良性積累,越來越多的交待更加重要的工作。再漸漸的,一種信任和默契就此產生,我升職的時候,他說我是他用過的最好用的助理。

說完這些長篇大論,我看著這個姑娘,她愣愣的看著我。我跟她直言:我覺得你最大的問題,是你沒有用心。在看似簡單不動腦子就能完成的工作裡,你沒有把你的心沉下去,所以,半年了,你覺得自己沒有進步。她不出聲。但是收回了辭職報告。


又堅持了3個月,她還是辭職了。這次我沒有留她。讓她走了。

後來她經常在MSN上跟我聊天。告訴我她的新工作的情況。一年內,她換了三份工作。每一次都堅持不了多久。每一次她都說新的工作不是她想要的工作。05年的時候,她又一次辭職了。很苦惱,跑來找我,要跟我吃飯。我請她去寫字樓後面的商場吃日本料理。吃到中途,忽然跟我說:我有些明白你以前說的話是什麼意思了。


所謂的職業生涯,其實你很難預測到你將來真正要從事什麼工作,將來所要從事的工作,是否跟你在大學裡學的專業有關。大多數人,很有可能將來所作的工作,跟他當初所學的專業一點關係都沒有。從22歲大學畢業在26歲之間這四年,重要的不是你做了什麼,重要的是你在工作中養成了怎麼樣的良好的工作習慣。這個良好的工作習慣,指的是:認真,踏實的工作作風,以及是否學會了如何用最快的時間接受新的事物,發現新事物的內在規律,比別人更短時間內掌握這些規律並且處理好它們。具備了以上的要素,你就成長為一個被人信任的工作的人。


人都有惰性,也都願意用那些用起來順手的人。當你具備了被人信任的基礎,並且在日常的工作中逐漸表現出你的踏實,聰明,和細緻的時候,越來越多的工作機會就會提供到你面前。原因很簡單,用一句話就能交代清楚並且能被你順利完成的工作,誰願意說三句話甚至半小時交待一個怎麼都不明白的人呢?溝通也是一種成本,溝通的時間越少,內耗越少,這是作為管理者最清楚的一件事。


當你有比別人更多的工作機會去接觸那些你沒有接觸過的工作的時候,你就有了比別人多的學習機會,人人都喜歡聰明勤奮的學生,作為管理者,大概更是如此。

一個新手,大多數新手,在這四年裡,是看不出太大的差距的。但是這四年的經歷,為以後的職業生涯的發展奠定的基礎,是至關重要的。很多人不在乎年輕時走彎路,很多人覺得日常的工作人人都能做好沒什麼了不起。然而就是這些簡單的工作,循序漸進的、隱約的,成為今後發展的分水嶺。


漫不經心的對待基層工作的最大的損失,就是將看似簡單的事物性處理方式,分界成為長遠發展的能力問題。

聰明的人,總是不認為自己的能力有問題。時間長了,他會抱怨自己運氣不好,抱怨那些看起來資質普通的人,總能比自己更能走狗屎運。抱怨她容貌比自己好,或者他更會討領導歡心。等等等等。慢慢的,影響心態。所謂的懷才不遇,有時是這種情況。


工作需要一個聰明人,工作其實更需要一個踏實的人。在聰明和踏實之間,我更願意選擇後者。

而踏實,是人人都能做到的。和先天條件沒有太大關係。

這是無意間在同學空間看到的一篇文章,覺得說的很好。就COPY了過來。描述的都是現代社會新人對工作的態度,或者心理。包括我自己在內,看著看著孔乙己的感覺就出來了。如果想向前邁進,不要覺得是大才小用了自己,也不要去計較,更不要去嫉妒。請放下心裡的疙瘩,用心的做吧!!

我的回憶和有趣的故事 - C/C++ 聖戰篇

[長篇] 我的回憶和有趣的故事 - C/C++ 聖戰篇

Author Topic
Gordon Li
班長


Taiwan
346 Posts Posted - 11/01/2001 : 18:26:48
--------------------------------------------------------------------------------

Borland C/C++的反擊

當Microsoft Visual C++ 1.0 在C/C++開發工具市場獲得了空前成果的之後,Borland 才從Borland C/C++ 3.1的勝利夢中驚醒,思考如何面對Visual C++的猛烈功勢。事實上當時的Borland如果腦袋清醒一點,好好看清當時C/C++開發工具的市場,那麼Borland應該會發現雖然 Visual C++ 經過2年多的整軍經武,實力已經大不前。不過Borland C/C++ 3.1仍然在許多方面可以和Visual C++一爭長短的。例如其時Visual C++的最佳化編譯器仍然落後Borland C/C++ 3.1一些,第2點是MFC仍然沒有完整的封裝Window API,而且MFC是以較低階的方式封裝Window API,並不是很物件導向,也不是很容易使用。事實上以我的觀點來看,我認為就是因為 MFC 不好用,因此 Visual C++ 才需要在整合發展環境中提供以視覺化方式產生 MFC 程式碼的功能,第3是Visual C++當時並沒有很好的封裝資料結構的Container Class,而Borland C/C++卻有非常好用的BIDS類別庫。第4,也是最重要的,Borland C/C++ 3.1仍然擁有絕大的市場,而且幾乎所有的週邊公用程式,Shareware等都是使用Borland C/C++ 3.1開發的。因此如果Borland不要急,好好的開發下一代的C/C++開發工具,即使Microsoft Visual C++能夠掠奪一些市場佔有率,但是如果下一代的Borland C/C++能夠像Borland C/C++ 3.0一樣立刻拉開和Visual C/C++的距離,那麼Borland在C/C++市場仍將擁有王者的地位。

可惜的是,也許Philippe Kahn在和Microsoft的FoxPro For Window一役中被嚇到了,因此急於在Visual C/C++ 1.0之後立刻推出新的Borland C/C++以扳回顏面。但是Philippe Kahn忘了,在這段時間之內Borland失去了許多的人材,Eugene Wang也離開了,更重要的是在過去近3年的時間之內,Borland幾乎沒有持續的開發下一代的Borland C/C++,在短時間之內如何能夠倉促的推出產品呢?

但是Philippe Kahn可管不了這麼多了,急忙找來了Carl Quinn等人便要求立刻開發出下一代的Borland C/C++,於是Borland C/C++ 4.0就在這麼鴨子趕上架下匆忙的開發了。Borland在開發Borland C/C++ 4.0時犯了許多的大忌。首先在這麼短的時間內Borland決定全新發展整合發展環境,第2是把OWL完全重寫,第3是大幅修改最佳化編譯器,第4是整合當時棘手的VBX,Borland居然讓16位元和32位元的程式能夠同時使用16位元,醜陋的VBX。
上面所說的每一項都是大工程,Borland早應該在Borland C/C++ 3.1之後便開始做這些工作,現在要在短短的一年多的時間內重新開發一個這麼複雜的C/C++開發工具,幾乎是不可能的工作。但是在Philippe Kahn的要求之下,這些Borland的工程師還是硬著頭皮做了出來。

不過我必須很沈痛的說,當時我在Beta測試Borland C/C++ 4.0時便和台灣Borland的人說,如果Borland倉促推出Borland C/C++ 4.0的話,那麼不但不會對Visual C++產生任何的影響,反而是自殺的行為,因為臭蟲實在太多了,整個整合發展環境的反應也很緩慢,它的最佳化編譯器更是笑話,錯誤百出,真是像當時惡名昭彰的Microsoft C 4.0一樣。我還開玩笑的說,是不是因為Microsoft從Borland挖了大量的Borland C/C++人才,因此好勝的Philippe Kahn也還以顏色,從Microsoft反挖Microsoft C的人,卻不幸的挖到了Microsoft C 4.0的人。

但是很顯然的Borland並沒有聽到我的,或是其他Beta測試人的心聲,在Visual C++ 1.0推出後的1年多,Borland C/C++ 3.1後的4年,Borland終於推出了新一代的Borland C/++ 4.0,這個肩負和Visual C++ 1.0對抗的C/C++開發工具。
在Borland C/C++ 4.0剛推出之際,Borland確實為4.0做了極大的造勢,我記得在當時所有重要的電腦雜誌中,例如Byte,PC Magazine,Dr. Bob等,都有4.0整頁的廣告。這個廣告的內容是以一個巨大的貓頭鷹為主,再搭配藍色底色系的Borland C/C++ 4.0為主,選用巨大的貓頭鷹當然是因為OWL的原因,只可惜我現在找不到那幅廣告了。


痛失江山的Borland C/C++ 4.0


當時Borland使用了如下的廣告用詞 :

『Visual Is Only A Facial Facade』

來諷刺Visual C/C++只提供了產生MFC程式碼的基本精靈,而Borland除了也提供相對應的AppExpert精靈能夠提供類似的功能以產生使用者選擇的OWL程式碼之外,Borland C/C++ 4.0的整合發展環境還提供了視覺化的3面版視窗,能夠讓程式師完整的掌握整個專案的情形。
例如在下圖中便是當初令人眼睛為之一亮的AppExpert:


還記得Borland提供的AppExpert嗎?


下圖則是當時Borland C/C++的註冊商標,3面版視窗開發環境。看到下圖又令我想起當初使用C/C++寫程式的日子,下方程式碼面版清楚的顯示了我在1995年於鼎新工作時寫的智慧型Window排程系統,時間過得是真快啊。


令人懷念的Borland C/C++ 4.0整合發展環境,三面版視窗


當時Borland C/C++ 4.0的3面版整合發展環境真是開創了一個新的局面,因為這個整合發展環境允許程式師知道每一個應用程式定義的視窗訊息,並且能夠立刻的顯示在下方的程式碼視窗中,的確是非常的方便,也比當時Visual C/C++的整合發展環境來得先進。再加入Borland較為先進的編譯器技術和架構更好的C/C++ Framework-OWL,照理說Borland C/C++ 4.0應該會獲得極大的勝利,那麼為什麼最後會以失敗收場呢?

沒錯,在Borland C/C++ 4.0剛推出之後訂單的確如雪片般飛來,銷售情形非常好,因為這畢竟是Borland在睽違了數年之後的大作,許多Borland的用戶都迫不及待的昇級,就像當初我也是拚命的要求台灣Borland要第一個給我Borland C/C++ 4.0。但是在Borland C/C++ 4.0推出一段時間之後,市場的反應就急速的冷卻下來,因為各種負面的批評不斷湧現,這主要的原因當然是因為Borland C/C++ 4.0的品質實在不好,就像前面我在Beta測試時說的,由於Borland太急於推出4.0,因此並沒有在最後階段修正許多的錯誤,又沒有經過最後系統微調的工作,又太大膽的加入太多先進的技術,造成了整個產品的不穩定,而造成了大錯。下面幾點應該是造成當初Borland C/C++ 4.0滑鐵盧的主要原因:

*整合發展環境方面-臭蟲太多,容易當掉而且反應速度緩慢
*編譯器方面-最佳化玩得過火,產生錯誤的編譯程式碼
*OWL方面-採用全新的多重繼承架構,雖然是正確的做法,卻和Borland C/C++ 3.1中的OWL不相容,造成許多程式師無法昇級C/C++專案
*VBX方面-大膽的採用在16/32位元都能使用VBX的技術,造成一些VBX無法順利的在Borland C/C++ 4.0中使用


我想其中最可惜的就是OWL了,因為OWL 2.0在各方面都有一流的表現,實在是MFC強勁的競爭對手,OWL 2.0也獲得了各方一致的肯定和稱讚。無奈的是由於OWL 2.0做了從基本架構的改變,這是為了解決當初OWL 1.x使用了不標準的C/C++編譯器技術的問題,但是這造成了原本Borland C/C++程式師極大的困擾,因為昇級不易。對於新的C/C++使用者來說又因為Borland C/C++ 4.0本身不穩定的因素而卻步,因此造成了OWL 2.0叫好不叫座的下場,真是可惜了 OWL小組的努力。

我記得當時我的專案有使用FarPoint的SpreadSheet VBX元件,由於一直無法順利的在Borland C/C++ 4.0中使用,並且會造成應用程式的當掉,最後追蹤執行程式碼卻發現應該是Borland C/C++ 4.0的問題,因此最後只好在咒罵中放棄使用4.0,而回到Borland C/C++ 3.1。我當時想,對於我這個長期使用Borland產品的人都無法忍受4.0的品質,其他的程式師又怎能使用這個產品。我想這就是為什麼後來4.0全面潰敗的原因,因為Borland推出了根本不堪用的產品。

在我於Borland工作的時間,有一次在新加坡和現在Borland開發者關係部門的副總裁David Intersimone談起這一段往事,David也很感慨這一段往事,David直呼『We screwed it up!』,『It’s a mess』。David並且說當時整個Borland C/C++開發小組都很混亂,和以往Borland C/C++ 3.0/3.1的開發小組比起來實在是差太多了,除了因為一些重要的人物相繼離開Borland,而且Microsoft也挖走一大票人之外,Philippe Kahn的直接介入,造成人事不和也有很大的原因。


David I.說『We Screwed it up!』 ,『It’s a mess』


在Borland C/C++ 4.0快速失利之後,Borland也體認到問題的嚴重性,因此立刻的著手開發Borland C/++ 4.0的Patch,當時是稱為Service Pack。但是在稍後的4.01版中並沒有完全的解決問題,一直要到4.02才稍為解決一些嚴重的問題,無奈時不我予,拖的時間太長,市場已經起了巨大的變化。

在Borland C/C++ 4.0失利之後,立刻造成了嚴重的後果,首先是Borland C/C++的市場大量且快速的流失,讓Visual C/C++快速的成長。第二點是當初Borland C/C++ 3.1在公用程式市場打下的江山也拱手讓人,原本許多硬體廠商也使用Borland C/C++ 3.0/3.1撰寫驅動程式也開始轉換到Visual C/C++,而嚴重的是在應用程式市場方面由於4.0的品質以及稍後OLE的關係,也開始大量的開始轉為使用Visual C/C++來撰寫應用程式。
Borland在3個主要的應用市場接連敗退,C/C++的江山注定將易主,其勢已不可挽。


Borland C/C++,Visual C/C++,Watcom C/C++和Symantec C/C++的纏鬥


自Borland C/C++ 4.0一役大敗之後,Borland在C/C++市場上建築的巨大堡壘似乎再也不是牢不可破了。Visual C/C++固然在不斷的接收Borland C/C++失去的市場,此時在C/C++市場上也加入了另外兩個堅強的對手,那就是Symantec C/C++和Watcom C/C++。


Symantec C/C++的發展史

說起這兩個對手也都是個個來頭不小,先說Symantec C/C++吧。它的Think C/C++在Macintosh上便是非常有名的編譯器,因此早在C/C++領域便有深厚的基礎。在Symantec併購了PC上第一個C/C++編譯器Zortech C/C++之後,Symantec進入PC的開發工具市場也是箭在弦上了,只可惜的是其時Symantec還未找到一個在PC上有豐富經驗的開發工具領導者。
也許是上天注定要引起稍後的C/C++編譯器大戰吧,此時Borland C/C++ 3.1的幕後支柱Eugene Wang剛好和Philippe Kahn鬧翻,離開了Borland。Symantec見此時不可失,立刻重金延攬Eugene Wang到Symantec,為Symantec推出第一個C/C++開發工具。在1993年左右吧,Symantec C/C++在Eugene Wang的掌舵之下推出了第一個Symantec C/C++版本,立刻便獲得了市場的好評。自此之後Symantec C/C++軍心大振,不斷的繼續改善,也逐漸的獲得了不小的C/C++市場,隱然成為可以對抗Borland C/C++,Visual C/C++的另一山頭。當時Symantec C/C++是以最華麗,先進的整合發展環境獲得市場的高度認同,在C/C++編譯器最佳化方面的表現也不會輸給其他的編譯器。

當時我在RUN!PC上寫C/C++的文章,因此Symantec C/C++也有和我連絡,並且送給我一套最高檔的Symantec C/C++,希望我除了為Borland寫C/C++的文章之外,也能夠為Symantec C/C++寫一些東西,我想這就是做為寫技術文章的一個好處之一,那就是可以拿到許多最Hot的開發工具。我還記得在當時安裝Symantec C/C++之後,的確被它的整合發展環境吸引的說不出話來,因為實在是太棒了,Borland C/C++和Visual C/C++的整合發展環境和Symantec C/C++的整合發展環境比較起來,立刻的就變成索然無味,平凡無奇了,到現在我仍然必須豎起大拇指對Symantec C/C++的整合發展環境說聲『讚』。我想Eugene Wang在這麼短的時間內把Symantec C/C++打造的好此之好,除了證明他的不凡功力之外,也有向Philippe Kahn示警的意思。證明Philippe Kahn讓他離開Borland是錯誤的決定。我之所以如此說是因為其時Symantec C/C++最喜歡點名挑戰的對象便是Borland C/C++了。
對我的感覺而言,Symantec C/C++就像是一個技藝精良,又裝備華麗的C/C++軍團。


Watcom C/C++的發展史


真是非常有趣的是,Watcom C/C++走的路子和Symantec C/C++幾乎是完全相反的。當時出品Watcom C/C++編譯器的是一家加拿大的小公司,不過這家公司卻對最佳化編譯器有深入的研究。當時Watcom C/C++是以在DOS下能夠產生最好的最佳化程式碼聞名於世的,在其時有許多寫遊戲和DOS Extender的廠商都是指名要使用Watcom C/C++,因為不論是Borland C/C++或是Visual C/C++產生的最佳化程式碼都比Watcom C/C++的最佳化程式碼差上一截。再加入當時最有名的DOS Extender廠商PharLap公司也是使用Watcom C/C++,因此Watcom C/C++在專業的C/C++程式師以及系統程式師心中是第一品牌的C/C++開發工具。

不知道還有多人記得PharLap這家公司,或是有沒有人記得Andrew Schulman這位偉大的軟體技術人員。當時Andrew Schulman的Undocumented Windows一書紅遍了半邊天,也惹得Microsoft要告Andrew Schulman。而Andrew Schulman便是PharLap公司的首席工程師,也是當時最著名的『The ANDREW SCHULMAN Programming Series』的總監,例如當時由Matt Pietrek撰寫的Windows Internals也是轟動一時的巨著。而PharLap公司是當時出版DOS Extender軟體最成功的軟體公司。

談到Matt Pietrek,熟悉Window Programming的人應該很少有不知這位大師級人物的。Matt長期在Microsoft System Journal撰寫Under The Hood專欄,專門寫一些深入系統的程式設計技術,在數年前便和Andrew Schulman,David Maxey成為Widow System Programming的三大巨頭之一。Matt也是著名的Window除錯工具SoftIce,BoundsChecker的主要研發工程師。Matt本身也是從Borland出道的,當Matt初至Borland工作時便是在Turbo Debugger小組中研發除錯工具。當時Borland的Turbo Debugger是DOS下最強的除錯工具,即使是Microsoft也無法推出能夠和Turbo Debugger抗衡的除錯工具。Matt在這個小組中吸收了大量的知識,並且快速的成為這個領域的專家。後來Turbo Debugger小組的部份成員被Microsoft挖走,讓Microsoft掌握了Borland的核心除錯技術,以致後來也能夠推出不錯的除錯工具。而Matt也出走到NuMega公司成為開發SoftIce,Bounds Checker的關鍵人物。寫到這裡還是不禁要佩服Borland,因為當今許多名滿天下的重量級軟體工程師都是由Borland培養出來的。

在Watcom C/C++於DOS市場佔穩了腳步之後,由於Window已經逐漸成為市場的主流,DOS勢必將被逐漸淘汰出局,因此Watcom C/C++要繼續的生存下去,也一定要推出Window平台的C/C++開發工具。大約也是在1993,1994年左右Watcom終於推出第一個Window的開發工具。
不過當時Watcom C/C++在Window推出的C/C++開發工具實在是平凡不已,其整合發展環境和另外三個對手比較起來簡直像是遠古的產品,一點特色都沒有,不過Watcom C/C++仍然是以它的最佳化編譯器做為號召。因此在當時發生了一個非常有趣的現象,那就是許多軟體公司會同時買Borland C/C++,或是Visual C/C++,Symantec C/C++之一,再搭配一套Watcom C/C++。在開發應用系統時使用其他三套開發工具之一,最後要出貨時再使用Watcom C/C++來編譯以產生最佳的程式碼。

在Watcom C/C++推出了Window平台的開發工具之後,仍然吸引了一群使用者,雖然Watcom C/C++的市場比起其他的三家來說是最小的,但是也在一方撐起了一片天,成為四大C/C++開發工具之一。稍後Watcom C/C++被Sybase併購,並且成為後來Sybase的Optima++的前身。

對我的感覺而言,Watcom C/C++就像是一個穿著樸素,但是卻擁有最佳訓練的白色C/C++軍團。


關鍵的時刻-MFC Or Not


在Symantec C/C++和Watcom C/C++逐漸的站穩了腳步之後,四大編譯器決戰的時刻也逐漸逼近了。在1994年未的決戰之前,Symantec和Watcom同時面對了一個非常嚴厲的考驗,那就是C/C++ Framework的選擇。

雖然Symantec和Watcom都以各自的特色佔得了市場,不過在當時對於一個C/C++開發工具來說,最重要的因素之一就是C/C++ Framework。因此Symantec和Watcom也都必須提供使用者一套C/C++ Framework。不過這對於Symantec和Watcom都是一個難以解決的問題,因為當時的C/C++ Framework已由Borland的OWL和Microsoft的MFC所佔領,如果要自己發展新的C/C++ Framework,那麼Symantec和Watcom並沒有如此雄厚的資源,也無法在短時間之內完成。因此Symantec和Watcom必須下一個決定到底是要使用MFC或是OWL做為它們的開發工具C/C++ Framework。

在1993年初Symantec和Watcom分別和Microsoft簽約License MFC做為它們的開發工具的C/C++ Framework。至此大勢以定,在C/C++ Framework的市場已經形成三家夾擊一家的形式。當時許多人便預估Borland將成為輸家,因為市場已經成為一面倒,MFC看起來已經是勝券在握了。在當時於Borland的內部也展開了激烈的辯論,討論是否也要License MFC做為C/C++的Framework,停止繼續開發OWL。不過後來Borland還是決定繼續開發OWL,而不使用MFC,因為Borland的C/C++技術小組認為MFC不論是在架構上或是設計上都比不上OWL。而且由於Visual C/C++在當時對於C/C++的標準支援不如Borland C/C++,因此在MFC內部使用了大量的Macro以及不標準的語法,因此如果Borland C/C++要使用MFC,那麼還需要修改編譯器來編譯MFC。

對於這一點我認為Borland還是做了一個正確的決定,因為如果當時Borland也License MFC,那麼不但在氣勢上便輸了一截,而且當MFC的發展是完全掌握在Microsoft的手裡,那麼就等於脖子是掐在別人的手裡,動彈不得了。可惜的是Symantec和Watcom並沒有看清這一點,以為有了和Microsoft一樣的Framework,就可以在其他地方和Microsoft以及Borland一決雌雄,Symantec和Watcom卻沒有想就是這一點決定讓後來的決戰一敗塗地,終究完全推出PC的C/C++開發工具市場。

時序到了1994年未,C/C++開發工具的四大天王決戰的日子終於愈來愈近了。


OLE的攪局


不知道是時運不濟或是Microsoft的刻意如此,在1994年Borland C/C++和Visual C/C++決戰的前夕,Microsoft推出了OLE(Object Linking And Embedding)技術。OLE是Microsoft為了對抗Apple的文件技術以及IBM OS2的Workplace和文件技術應運而生的。OLE可以讓Window平台的文件能夠內嵌在不同的應用程式中並且能夠讓文件在應用程式中被即地編輯(In-Place Editing)。說實在的,Microsoft的OLE和Apple以及IBM的技術比較起來實在是差多了,OLE在稍後也被證明是失敗的技術,不過不管是Microsoft的OLE或是Apple/IBM的文件技術也都是失敗的技術,都沒有造成巨大的成功。雖然這些文件技術都沒有成功,但是OLE卻足以成為Borland,Symantec和Watcom失敗的重要因素。

我還記得當時OLE似乎成為了一個令人趨之若鶩的時髦功能,因為Word的文件能夠內嵌在Excel之中,並且可以點選此Word文件,應用程式又立刻成為Word來編輯它,實在是令人覺得非常的神奇。不過在其時所有的軟體廠商中只有Microsoft的應用程式有如此的功能,其他的廠商例如Lotus,WordPerfect等都無法實作出這種功能。這造成了不公平的競爭,因為OLE技術是由作業系統廠商Microsoft推出的,但是卻讓它的應用程式部門同步擁有這種技術,而其他的軟體廠商都無法獲得第一手的OLE技術來實作,這是為什麼當時其他的軟體廠商如此火大的原因。

雖然後來其他的軟體公司在取得了OLE的技術資訊之後也推出了具備OLE功能的應用程式,但是畢竟是慢了Microsoft許久,市場也流失了許多。不過我也很奇怪的是在當時內建OLE功能的應用程式之中,幾乎所有的軟體廠商推出的應用程式在啟動數個應用程式而且使用OLE之後,就非常容易的當掉,只有Microsoft的應用程式不太會發生這種情形,因此許多人便認為Microsoft有隱瞞一些技術沒有讓其他的廠商知道。

由於OLE是如此的複雜,因此Borland無法立刻在OWL之中實作出這種功能,於是就造成了市場上負面的影響。至於Symantec和Watcom雖然是License MFC,但是在其時它們License的是MFC 1.x的版本,Microsoft並沒有把OLE實作在MFC 1.x中,而是在實作在MFC 2.0之中。在MFC 2.0推出時最重要的功能就是Microsoft加入了20000多行支援OLE的程式碼,但是MFC 2.0卻僅限於Visual C/C++使用,就是這關鍵的一點讓其他三家廠商吃了虧。
對於OLE這個關鍵技術的影響,Borland是深知在心的,因此在計劃在Borland C/C++ 4.5的OWL 2.5中支援OLE。當時Borland推出的解決方案便是OCF(Object Component Framework)。

Borland當初在設計OCF時有幾個重大的目標。這些目標包括了: 一、如何能夠使得OLE瑣碎 、複雜的介面能夠單純化; 第二、如何能夠使得OLE在視窗環境下寫程式的思考方式 一致化--即使用「事件驅動」的方法。第三、如何能夠在微軟佔盡天時、地利(未必人和) 的情況下使得Borland的產品具備OLE的功能。第四、如何能夠讓大多數C++的程式師都能夠享受OLE的功能而不侷限於OWL的程式師。由於上述的設計目標, 而造就了典雅而具有彈 性的OCF。由於OCF本身是一完整而獨立的Framework, 因此它可適用於各種應用程式發展Framework。

不曉得各位使用過Borland C/C++的朋友們是否還依稀記得下圖OCF的架構圖之一,以及下面的OCF範例程式碼,這些可是我把1994年寫的文章挖出來之後找到的,真是令我感慨,也回想起了當時的情景,也讓各位回憶一下OWL和OCF。對於不熟悉OWL和OCF的朋友,也可以從下圖和程式碼中觀察一下當時的技術以及設計的概念。基本上我現在看這些圖形架構,會發現它們並沒有落後現在太多,可見當時設計者的功力(Carl Quinn Again)。


//
// Insert an OLE object into the view
//
void TOleWindow::CmEditInsertObject()
{
001 PRECONDITION(OcView);
002 TOcInitInfo initInfo(OcView);

003 if (OcApp-> Browse(initInfo)) {
004 TRect rect;
005 GetInsertPosition(rect);
006 SetSelection(new TOcPart(*GetOcDoc(), initInfo, rect));

007 OcView-> Rename();
008 InvalidatePart(invView);
}
}

程式1 OWL的TOleWindow支援OLE插入物件之成員函數

//
// Handle left double-click message
//
void TOleWindow::EvLButtonDblClk(uint modKeys, TPoint& point)
{
PRECONDITION(GetOcDoc() && GetOcView());
TOleClientDC dc(*this);
dc.DPtoLP(&point);

TOcPart* p = GetOcDoc()-> GetParts().Locate(point);

if (modKeys & MK_CONTROL) {
if (p)
p-> Open(true); // Ctrl key forces open editing
}
else {
SetSelection(p);

if (p && p == GetOcView()-> GetActivePart()) { // resync the active flag
p-> Activate(false);
}

GetOcView()-> ActivatePart(p); // In-place activation
}
}


程式2 OWL的TOleWindow支援左鍵雙擊之成員函數


雖然Borland及時的在OWL 2.5中加入了OLE的支援,無奈Microsoft隨後又在OLE中加入了許多其他的功能,因此讓OCF並無法完整的支援OLE所有的功能,Borland又無法不斷的延後Borland C/C++的推出,因此在1994年未,Borland終於推出了決戰的4.5版本。


C/C++開發工具的最後聖戰


『雖然已經過去了許久的時間,但是我仍然忘不了那場最慘烈的戰役!』


1994年未, 1995初Borland在痛定思痛之後,終於清除了Borland C/C++ 4.0中所有的問題,也開發出了自Borland C/C++ 3.1以來最穩定,最快速的Borland C/C++ 4.5的版本,準備和Microsoft決一死戰。我還記得當時在書籍市場中許多有關Borland C/C++和Microsoft C/C++的書籍都是使用十字軍的封面,而Borland C/C++的系列叢書都是以藍色為色系,而Microsoft的則是以紅色為色系,仿佛兩大軍團終將決戰似的。


C/C++四大天王決戰一役的Borland主將-Borland C/++ 4.5


不過這次的戰役不光是Borland的藍軍和Microsoft的紅軍相對抗,在Symantec的華麗軍團經過了經軍經武,Watcom的白色勁旅枕戈待旦,而且都從Microsoft License了MFC之後,藍,紅,花,白四大軍團決戰的日子終於到了。首先當Symantec和Watcom分別取得了MFC之後,Symantec便推出了C/C++ 7.x的版本,和Watcom C/C++混戰了起來。兩個使用系出同門的C/C++ Framework產品戰得不亦樂乎,隨後Borland C/C++ 4.5和Visual C/C++的新版本也加入了這場最重要的決戰。但是讓Symantec和Watcom C/C++大吃一驚的是Microsoft使用的MFC居然比它們的版本高出了一個版本(1.x對2.x),而且新版本的MFC包含了完整的OLE支援能力。而Borland雖然也有OCF,但是仍然不敵新版MFC中的OLE能力。由於當時幾乎所有的應用程式都需要支援OLE,但是卻只有使用Visual C/C++最新的版本才能夠開發完整OLE能力的應用程式,因此不管OLE到底有沒有用,反正先加入再說。因此市場上的情勢很快的就發生了巨大的變化,幾乎大部份的應用程式開發因為OLE的原因都選擇使用Visual C/C++,Symantec和Watcom軍團很快的就敗陣下來。

至於Borland C/C++ 4.5雖然是一流的產品,如果沒有OLE的因素,Visual C/C++新版本真的並沒有比4.5好。雖然4.5也有OCF,但是在市場上只有Borland和Novell,WordPerfect選擇使用OCF,在和Microsoft的Visual C/C++經過將近一年的纏鬥之後,其他大部份的廠商都選擇了Microsoft的MFC 2.x版,真是形勢比人強。基本上OCF的架構真的是個好東西,只是OCF無法完整的支援OLE,因為OLE的發展是掌握在Microsoft手中,因此雖然OCF的架構良好,終究在功能上不及對手。Microsoft結合作業系統,開發工具和應用程式的手段真是無往不利。擊敗Lotus,Borland是如此,殲滅Netscape也是如此。

對於Symantec和Watcom來說,這場戰役就如同『長平之戰』,秦軍坑殺40多萬趙軍一樣。殺得Symantec和Watcom全軍覆沒,大敗而歸,至此Symantec棄受PC的C/C++開發工具市場,轉而開始研發Java開發工具,進而在稍後推出了著名的Visual Cafe, 至於Eugene Wang則離開了Symantec,自此也離開了PC開發工具的領域。

而Watcom則是更為悽慘,整個公司在DOS的市場逐漸式微,而Window平台的開發工具又大敗而歸,兩頭落空。不久之後Watcom便被新興而起的Sybase併購,從此消失於競爭激烈的市場。

歸納Symantec和Watcom失敗的原因是C/C++的Framework MFC掌握在Microsoft手中,在決戰時刻Microsoft居然手握比Symantec和Watcom更新的MFC利器,而且在Visual C/C++精進最佳化的技術並且改善整合發展環境之後,Symantec和Watcom訴求的重點功能完全被Microsoft封死。因此在產品,技術,市場和氣勢上完全不如對手的情形下,自然只能任人宰割了。

對於Borland而言,雖然沒有像Symantec和Watcom那麼潰不成軍,但也是再次敗下陣來。雖然平心而論Borland C/C++ 4.5的確是一個非常好的產品,無論在OWL,最佳化編譯器,整合發展環境方面都有一流的表現,和Borland C/C++ 4.0比較起來簡直有如脫胎換骨一般,到現在Borland C/C++ 4.5仍然是我最喜歡的版本之一。但是無奈當初Borland C/C++ 4.0給人揮之不去的負面印象,以及無法完整支援當時如火如荼的OLE技術,因此還是在決戰之中敗了下來。好在藍色的Borland大軍畢竟是訓練有素的,雖然自此讓Microsoft佔據了超過50%的市場,成為C/C++開發工具的老大,但是Borland仍然掌握了超過30%的市場,稍做喘息,並且支撐Borland在各重要戰役失敗之後維持公司的運作,等待Delphi的浴火重生,再重新出發。

經過這一役之後,Microsoft終於清除了大部份的對手,對於Microsoft而言程式語言開發工具的戰爭已經結束,這個市場注定將被Microsoft佔據大部份的市場。在Microsoft手握作業系統,Office軟體和開發工具三大獲利市場之後,Microsoft也開始將矛頭對準下兩個競爭目標,關連資料庫以及主從架構開發工具。在Microsoft正式進軍這兩個市場之後,當然也展開了連番的好戲,尤其是在主從架構開發工具方面又開啟了VB,PowerBuilder,Gupta/Centura和Delphi的驚天動地大會戰。另外一個意外開啟的戰爭則是Microsoft在1995年和Netscape的挑起的瀏覽器大戰。

對於Borland而言,在C/C++最後一役之後,基本上我認為開發工具的聖戰已然結束,Borland也正式開始走下坡。更嚴重的是我認為自此之後Borland不但喪失了C/C++的江山,也失去了對於C/C++開發工具的創意,這是我感覺最遺憾的地方,到現在為止我仍然認為Borland尚未重拾當初在Borland C/C++ 3.0/3.1時代獨領C/C++創意風騷的精神。也許,也許,要看看C/C++ For Kylix或是C++ Builder 6是否能夠重新找回這個失去已久的精神,不要再讓我失望了。


雄霸數年的C/C++的世界冠軍-Borland C/C++ 3.1-永遠的懷念


永不成氣候的C/C++開發工具-IBM VisualAge C/C++


IBM在C/C++開發工具扮演的角色一直令人啼笑皆非,因為在C/C++編譯器戰爭最激烈的時刻,IBM這個全球資訊大廠卻一直是缺席的。一直到了1995之後,C/C++編譯器市場大勢已定之後才慢慢的加入戰局,推出VisualAge C++ 3.0,企圖進攻此市場。但是此時市場早已由Microsoft的Visual C/C++稱雄。IBM的VisualAge雖然以創新的視覺化設計家能夠定義物件之間的關係,但是在其他方面卻乏善可陳,整個整合發展環境也緩慢如蝸牛,需要非常高檔的硬體配備才能夠順利的執行,和Visual C/C++以及Borland C/C++等工具比較起來就像是恐龍一般,因此幾乎沒有在市場上引起任何的反應。

在IBM推出VisualAge 3.0並沒有在PC的C/C++開發工具市場獲得任何的明顯成果之後,IBM又再次的集中了許多的資源,開發下一代3.5的版本,希望能夠在此市場佔有一定的比率。我知道IBM在VisualAge投注了大量的資源,因為從Beta版開始台灣的IBM便有人和我接觸,希望我也在RUN!PC上為VisualAge 3.5寫一些文章。因此在1996年的6月我寫了一篇C/C++編譯器的比較文章,下面的資料便是數年前當時還在Beta版的VisualAge 3.5和其他編譯器的比較:

從上面的數據中可以看到其實VisualAge 3.5的表現還不錯,只是對於當時還在使用AMD DX4-100/32M RAM機器的我來說,實在是跑不太動VisualAge 3.5。後來台灣IBM負責VisualAge的產品經理請我吃飯,在此飯局中這位李經理同時請了賀元(後來為資迅人的總裁),薛曉嵐(後來為資迅人的副總裁)以及其他兩位作者,希望大家在電腦雜誌中繼續的為VisualAge 3.5寫寫東西,一起Promote此產品。在這個飯局中我是第一次和賀元,薛曉嵐見面,當時賀元在中文PC Magazine有一技術專欄。記得當時我向這位李經理提起我的機器幾乎無法跑VisualAge 3.5,他還立刻一口答應願意借我一台當時IBM最高檔的PC,同時每寫一篇VisualAge的文章,除了RUN!PC原本的稿費之外,IBM會再付一字2.5元的稿費。乖乖,IBM真是大手筆,我算算當時我的產能,寫一篇文章就能夠賺2到3萬,又有免費的最高檔機器可用,真是太好康了。不過後來我還是覺得IBM在此市場可能不會深耕,在不願意違背自己寫作習慣和得罪Borland的顧慮下,最後還是沒有答應。現在想想當時真是太笨了,放著好賺的稿費不賺,嘻。

IBM的C/C++開發工具之所以在市場無法成功是一是因為並不瞭解在此競爭激烈的市場中使用者到底要什麼。另外一個原因則因為IBM並不以PC上的開發工具軟體為重要的事業,即使無法競爭對於IBM來說也沒有什麼影響,不像Borland這可是生命之爭。因此IBM只是興起玩玩,隨即放下。所以我覺得在PC平台使用IBM的工具是很危險的,因為IBM可能隨時會放棄此市場。例如不知道現在VisualAge C/C++到底如何,是不是還在3.5或是4.0版,已經數年沒有任何的維護和改善了。

稍後IBM為了想在OS2和Window平台上推出能夠和Microsoft相抗衡的Basic工具,因此秘密的研發了一個Object Basic。我也曾看過這個工具,但是Object Basic跑起來慢得跟烏龜一樣.後來不知道是不是一直無法改善這個問題,因此IBM從沒有推出此產品,現在IBM似乎只對Java有興趣,VisualAge For Java還算發展的不錯,希望不會有一天IBM對VisualAge For Java的態度會和VisuaAge For C/C++以及Object Basic一樣才好.


快速殞落的潛力之星-Sybase的C/C++ RAD工具Optima++


在1996年吧,Sybase併購了Watcom之後,終於推出了石破天驚的C/C++開發工具,Optima++。Optima++是當結合了Watcom的最佳化編譯器以及類似Delphi的元件拖曳開發環境的第一個RAD C/C++開發工具,更棒的是Optima++的元件架構(類似Delphi的VCL)完全是以純正的C/C++程式碼撰寫的。這可不得了,因為這代表Optima++是一個融合了Visual C/C++和Delphi兩大王者開發工具為一身的超級賽亞人工具。

在我知道這個工具,並且取得實際的使用之後,令我極為震驚。因為這個工具對於我這個使用了C/C++ 5,6年的人來說,是比Delphi還具有吸引力。因此在當年我立刻的在RUN!PC上介紹了此不可置信的工具。果然,Optima++很快在開始風捲市場,雖然沒有立刻的佔據很大的市場量,但是已經造成了一股氣勢,開始為Visual C/C++和Delphi帶來了壓力。
我記得當時台灣Sybase辦的產品發表會也吸引了數百人與會,不可一世。在我的RUN!PC文章出版之後,台灣的Sybase立刻和我連絡。由當時的余協理和我見面,也是希望我繼續為Optima++寫文章,台灣Sybase也提供額外一字加2元稿費的待遇。但是我告訴余協理,Optima++ 1.0雖然很棒,但是仍然有一些臭蟲,而且和中文環境相衝突,無法處理中文,需要立刻的解決問題才能夠在台灣的市場成功。她答應我立刻的向總公司反應。我也老實的告訴她在問題沒有解決之前我無法寫一些不確實的東西。後來台灣Borland的總經理方先生也找我去詢問有關Optima++的事情,我告訴他Optima++是好東西,但是中文有問題。如果中文問題能夠解決,那麼將對Borland的產品有很大的影響,當時我還不知道Borland由於Optima++的影響,已經開始準備發展C++ Builder。
在1996年底左右吧,Optima++ 1.5終於進入Beta的階段,但是在我拿到Beta版時仍然非常的失望,因為中文的問題仍然沒有解決。後來台灣Sybase又找我去,這次和我見面的是台灣Sybase總經理郭俊男先生,以及Sybase的新加坡技術總裁,不過我忘記這位先生的名字了。我們見了面之後,我立刻的把Optima++ 1.5中文的問題以及許多的臭蟲告訴他們,希望他們能夠解決,如此Optima++ 1.5才能夠在中文市場成功。可是出乎意我意料的是,他們似乎並不急著這些問題,反而詢問我是否有意願為Sybase工作,做PowerBuilder的產品經理。

也許是因為我為Delphi寫了太多的東西,讓PowerBuilder受了很大的影響,因此他們希望我到Sybase工作,以打擊Delphi並且Promote PowerBuilder。當時他們提出的待遇條件實在是非常,非常的誘人,比我當時的薪水高出一倍左右(我當時在資策會工作)。不過由於我對PowerBuilder實在沒有什麼興趣,因此我告訴他們如果是做Optima++的產品經理,那麼我將會考慮並且接受。

沒有想到Sybase的新加坡技術總裁告訴我Optima++在1.5推出之後就可能會停止,因為Sybase要把資源移去為當時愈來愈紅的Java研發一個新的Java RAD開發工具,那就是後來的PowerJ。於是他問我如果不願意做PowerBuilder的產品經理,那麼是不是願意做PowerJ的產品經理?由於當時我已經知道Borland開始了Open JBuilder的研發,而我對Open JBuilder的興趣遠大於PowerJ,因此並沒有答應Sybase。果然,在Optima++ 1.5推出之後,不但中文的問題沒有解決,Sybase也沒有繼續的對Optima++研發下去。一個如此有潛力的產品就這樣消失了,真是令人遺憾,Optima++應該有很好的機會可以成功的,我相信如果當時Sybase知道C++ Builder後來的成果,可能就不會放棄Optima++了。而C/C++的RAD工具一直要到後來的C++ Builder來完成這個夢,又是Borland成功的進入這個工具市場。

C/C++的開發工具之爭到此算是告一段落了,雖然後來Borland繼續推出了Borland C/C++ 5.0但是品質仍然不夠好,市場反應也不佳,後來Borland終於在Borland C/C++ 5.02之後宣佈停止此條產品線的開發,Borland C/C++的光榮歷史也就從此打止,真是令人不勝感嘆,而Visual C/C++從此在C/C++開發工具市場中再也沒有對手。不過沒有競爭的市場的確會讓人鬆懈的,後來的Visual C/C++進步的幅度愈來愈小,MFC也數年沒有什麼大進步,不像當時和Borland C/C++競爭時每一個版本都有大幅的改善。看來寡佔的市場的確是不好的。

As Promised-李維
Edited by - Gordon Li on 11/01/2001 18:53:06

程式設計師懺情錄(下)

發信人: xeon.bbs@bbs.tnfsh.tn.edu.tw ()
日期: Fri Mar 29 12:05:03 2002
標題: [轉貼] [轉錄]程式設計師懺情錄(下)

作者: erictsai (連備取都沒有的白痴!) 站內: TFcis
標題: [轉錄]程式設計師懺情錄(下) --eric要我轉的
時間: Thu Mar 28 20:54:37 2002

※ 本文轉錄自 [erictsai] 信箱

作者: eric (認真的艾瑞克)
標題: 程式設計師懺情錄(下)
時間: Thu Mar 28 20:52:31 2002

王森專欄> 不賣雞排也可以 - 程式設計師真情懺悔錄(下)

續上期

所以從今天開始,如果你對程式設計有一股熱愛,那麼我們一起努力,
做個真正的程式設計師,而不要做一個雜碎且破壞別人的程式設計師.
做一個真正寫的出有用軟體的工程師,不要做一個只會寫程式的程式
設計師.當然,如"意外的電腦王國 / 聯經出版社"一書所言,很多技
術都是用來原本沒有預料到的地方而大行其道.許多科學研究無法有
立即的貢獻,但是影響深遠,我們也期許有意從事基礎研究的科班研究
生,認真的作研究,不要老是研究一些別人已經研究過的研究,不要老
是冀望騙國科會等研究機構的經費,到了最後計劃結案時,才匆匆忙
忙交出另外一篇騙更多錢的計劃書,或是拿不出檯面的研究.

最後,我們反省自己是不是也是一個只會"寫程式"的程式設計師呢?
請自行測驗底下幾個問題,這些問題都不可能有客觀的答案,所以每
個問題都附上筆者主觀的答案,作為筆者自己的反省.

Q1: 你尊重專門技術嗎? 換句話說,你認為術業有專攻嗎?
當你接受外面的教育訓練課程時,你總是崇拜看起來什麼都懂的老師?
換句話說,你認為那些遇到課外問題就跟你說他不懂的講師是爛老師?

-你老覺得真正的高手應該精通各門各派的技術,如果你會XML,他不會,
你就覺得你比他厲害.你覺得他的履歷上寫的技能太少,證照太少,所以
你認為你比他優秀?

有人老是覺得自己蠻會用MFC開發軟體,所以直覺認為那些只喜歡,或是只
會用VB的人程度應該不高.問題是,有人會用VB,當他覺得元件不好用,所
以自己寫程式處理HTTP,因為他懂HTTP協定的運作方式.工具裡附的瀏覽
器太爛,就自己用功能語法不是很頂尖的Basic來寫parser.相反的,有人
號稱會用MFC,但是除了靠Help找出名為Cxxxxx的類別來用,再自己補上事
件處理的部分之外,其他什麼事都做不出來.

有人認為寫Java程式應該善用工具,用UltraEdit根本是重新造輪子的行
為,所以一開始就學JBuilder的使用,其實他用JBuilder寫了老半天GUI
程式,哪天回頭叫他用文字編輯器寫個簡單的Frame + Button他卻寫不
出來,因為他從沒弄懂過Java的事件處理模型. 他只會不斷地: 選擇元
件->放在容器裡頭->調整位置和大小->調整屬性->按兩下->填寫事件處
理函式,成為一個名副其實的"程式女工".

有人覺得他精通各家廠商的資料庫,所以看不起那些只會下SQL指令或是
只會寫store procedure的人,因為他可是精通ODBC, JDBC, ADO, ADO.NET
各種程式的寫法.問題是,一個精通SQL的專家和只會寫SQL指令的人,在資
料庫表格交互參考,資料量很大的時候,要從中取出我們需要的資料,所下
的指令在效率上是幾秒鐘和幾個小時的差別.SQL也是個專門學問,要能夠
巧妙的操作它,必須下非常多功夫做研究,而且一研究可能就是十幾年.如
果貴公司的專案老是苦於資料庫存取的效能不夠,你猜老闆會花錢找一個
有能力徹底改善所有SQL命令之中效能問題的稀有專家,還是再找一個號稱
他什麼都會,結果一點用場也派不上的"資料庫女工" ?我們常常看到某人
列出他的履歷,好像會很多就是很厲害.但是當我們完全深入一項技術時
(喔,我是說你真正下工夫的時候),通常我們會越來越感覺到自己的渺小.

蔡學庸先生就是一個非常尊重專業技術的例子.
我們看到他在 http://www.csdn.net/expert/cxy/ 上寫的,他說他只精通
lots of Java APIs.我和學鏞聊過三次,有一次,我聽他說:"幹麻叫我搞
Linux,我又不懂Linux!"如果是你聽到這句話,你會不會真的以為他玩起
Linux來肯定比你遜色?筆者突然想起神雕俠侶裡頭的獨孤求敗,晚年只會
拿樹枝和別人比武,可是你拿再厲害的刀劍就是無法打敗他.所以,請尊重
專業技術,不要以為人家沒說他會,你就比他厲害.真正厲害的人很多都不
在檯面上,而是躲在後面偷偷笑我們呢!而我們一輩子也不知道我們被別
人偷偷取笑了.中國文化數千年都是文人相輕的歷史,夠了,大家尊重專業吧!

Q2: 你覺得演算法和資料結構無三小路用,因為你從沒使用過?

-我們承認"無招勝有招"是內功心法的最高境界,但是在信手拈來之際,後
面所代表的是對各家武功路數的徹底了解.由於台灣幾乎只有應用軟體的
開發需求,沒有系統軟體的需求,所以大多數的程式設計師都是站在"程式
女工"的角度看世界,只要有元件,有什麼搞不定的. 但是今天如果你想設
計一個XML parser,不懂資料結構和演算法可以嗎? 好吧! 你說我們不該
重新造輪子,我們應該站在巨人的肩膀上看世界,如果什麼都自己硬幹,世
界是會退步的. 那麼試問,當你在使用Java提供的Collection Framework
時,你了解ArrayList, LinkedList, TreeSet, HashSet之間的差別嗎?
你知道他們的優缺點嗎?你知道他的特性嗎? 不了解ArrayList和LinkedList
的差異,用哪種去寫程式執行結果都一樣,可是效率差很多. 大多數的人
連了解特性都談不上,更別說很多每天想發展自己的語言,自己的編譯器,
自己的作業系統的人,沒有基礎學問的了解,如何去設計一個Collection
Framework或STL?你說資料結構和演算法沒有用,你去做看看現在IDE中普
遍有的code insight功能看看?以Borland C++ Builder來說,要在短時間
內搜尋所有的標頭檔並找出某函數的prototype,如果沒有對資料結構和演
算法有充分了解,一樣做的出來,只是產品會賣不出去罷了.我在課堂上常
常舉一個scalability的例子給學生看:我希望寫一個1+2+3 ... + 100的
程式,大多數的人都是寫

int sum = 0 ;
for(int i = 1 ; i < 101 ; i++)
sum = sum + i ;

而真正受到數學觀念薰陶的人會寫成

int sum = 100(100+1) / 2

前者是O(n),後者是O(1),當項數很多時,運算時間是不是差很多?這些都是
我們的教育所產生的問題(當然筆者也是受害者之一),但是從今天開始,我
們可以認真思考每行程式.

想想發展MP3演算法的人和寫WinAmp的人,哪個比較厲害? 你會說都很厲害,
可是沒有前者就沒有後者,前者搞不好還可以坐收權利金,後者只能苦哈哈
的賺些小錢或等人購併.我們停留在崇拜應用程式技巧的階段,而真正值得
崇拜的是那些難得一見的創意.

筆者遇過一個朋友,叫他撰寫一個費式數列的小程式,比請他寫一個可以瀏
覽資料庫表格內容的程式還難.(請不要與我討論費式數列的小程式沒有實
用價值的問題,這裡討論的重點不是這個)前者需要稍微動點小腦筋,後者
只要會拖拖元件,設定property就搞定. RAD本身不是罪,但是沒學好九陽
神功就妄想幾小時練成乾坤大挪移.最後只會走火入魔而死,徹底變成一個"
程式女工".


Q3: 你常常以科班和或非科班自居?

-你是科班生,瞧不起非科班生? 因為你是正統?你是非科班生,瞧不起科
班生?因為你覺得會的東西比科班生的還多.爛學校會出現好學生,好學
校也會有爛學生.因為比例一樣多,所以我們不能以偏概全.

如果仗著受過幾年正規教育,自己又從未好好深入學習,就自己為是正統
,比較學術的說法這叫做"陽具文化".有些創新的idea是一般制式腦袋的
科班學生很難想出來的,因為專家是訓練有素的狗.如果你是學電信的朋
友,你發現交換機是一個葬儀社的老闆因為生意被別人搶走而發明的,那
你會不會氣死?如果自學有成的程式設計師仗著自己會的東西比較多,你
說你精通Java的各種技術,但是卻沒想過發展Java的Games Golsing博士
是一個正統出生的科班生,知道了這件事情,會不會讓你更加尊重專業?

Q4: 你是學計算機科學的,可是邏輯能力並沒有比較好,還常常受騙?

Q4-1:你會被潮流所鼓動嗎? 你常常被別人的思考牽著走?人家鼓吹Linux
多好多好,你的腦袋連轉都沒轉過就發憤努力地考Linux認證 ?

-別人把公司裡的server全換成Linux,用戶端也都改成Linux,公司仍然
正常地運作,結果你學了Linux之後,看到電視上BSA同法務部做的廣告嚇
的你冷汗直留.深怕明天去住套房.

Q4-2:Sun跟你說Java跨平台,你沒試過也跟人家說跨平台的優點?

-Borland已經可以做到一份光碟裡同時附上Solaris、Linux、Windows、
MacOS X的JBuilder,你卻為了EJB無法deploy到不同公司的Application
Server忙的像無頭蒼蠅.

Q4-3:之前一窩峰人鼓吹XML,結果你盲目追求流行,做出來的東西tag比
data還多?

-會用的人徹底了改變了公司裡資料交換的流程,而你整天只會SAX來,DOM
去的寫XML資料庫(用XML來儲存資料的資料庫)

Q4-4:微軟的廣告告訴你XP和IE將不支援Java,你都還沒試過就跟別人嚷嚷
Java已死?

-套句BBS上moga先生的名言:"那我現在在Windows 2000上跑的Java程式是
神跡?"現在一票人每天宣傳web service的好處,你連想都沒想過就急著想
要把公司的舊系統全部改成web service來做,結果浪費一堆錢,糟糕的速度
讓你每天被客戶臭罵 ?

Q4-5:Web service當然是美好的前景,但是並非適用於每個角落,目前世界
上並不存在完美的solution.人家說不能寫程式一輩子,寫程式的人生命週
期很短,你也跟著別人開始往SA/SD前進 ?

-如果世界上每個工程師都可以經由經驗就成為優秀的SA/SD人員,那麼
理論上咱們應該有些像樣的軟體產品才對. 有些人寫了幾十年,還是一
個優秀的程式設計師,你問問他,如果沒有遇到糟糕的老闆,糟糕的待遇
和糟糕的制度,他願不願意寫一輩子程式?

我願意.

Q4-6:顧問告訴你要多用RAD,不該重新造輪子,所以你努力的問how而不問why ?

-結果真正賺到錢的都是那些像JReport做軟體元件的軟體公司.微軟說
J2EE Blueprint的Pet Store,用.NET技術做比用J2EE做還要快許多,然
後你就相信了,最近, IBM和Oracle重新加強Java版的Pet Store,讓它比
.NET版的還要快18%~22%,你又改口說Java比較好.

Q4-7:一個系統在設計的時候有很多考量,有人以擴充性為主,有的以安
全性為主,有人以效能為主.如果沒有設計理念,大家程式裡頭的function
全部改成inline就好了,管他編譯出來的執行檔有多大.系統只以效能
做考量,我們還需要Design Pattern做什麼?

-那些王八蛋數據和我們選舉時的民調一模一樣...對一個腦袋清楚的人
完全沒有參考的價值.當然,以情感因素來看民調的人例外.如果你沒有經
過自己的自主判斷就盲目的跟隨潮流,那麼下次當你看到有人排隊買米酒
,買蛋塔,搶購衛生紙的時候,請不要投以排隊的人們奇怪的眼光.

Q5:你尊重老前輩嗎?

我們都相信,世界上唯一不用努力就可以獲的東西就是老.所以吃過的
鹽巴比你吃過的米還多的人,沒有任何值得尊重的.我們更相信,資訊業
永遠是年輕人出頭,而英雄少年也長在心裡想:"李杜詩篇萬口傳,至今
已覺不新鮮,江山代有才人出,各領風騷數百年."

但是我們認真想想,從Apple 2的時代到現在隨便一顆CPU都是1 GHz的
時代,計算機的本質有什麼改變嗎? 不就是一台不斷對記憶體作處理
和I/O動作的機器.你笑那些只會用Fortran或COBOL的老前輩,那你學
的Java或C#比起這些老語言又高明到哪裡去?寫程式不過是 宣告,迴
圈和函式三大要素.時間久了,產生了一堆新名詞,配上一些新的發展
理念但本質上沒有改變.如果你是推倒前浪的後浪,當你看到李維先
生撰寫的 "[長篇] 我的回憶和有趣的故事"或侯捷老師最近兩期在
Run!PC撰寫的"侯捷觀點"這些老前輩寫的文章,你有把握寫出比它們
更高明,更有深度的東西嗎?

最重要的問題,

Q6:你騙過老闆嗎?

-你在履歷上寫的十八般武藝樣樣精通,結果是梧鼠技窮(註:比喻技能
雖多,而不能專一),一錄取之後什麼東西都做不出來,筆者至少聽過
20個老闆跟我講過這件事情.

Q6-1:你以為你的身價比較高,只因為你從事"軟體研發"的工作?
-然而現實的生活中,"獲利"是真正決定成敗的關鍵.除非你的東西幫
老闆賺了錢. 如果沒有,你憑什麼要求更多薪水,憑什麼要求50張價
值數千萬元的股票?如果你寫的東西品質很差,bug超多,客戶抱怨不
斷,老闆賺不到很多錢,你還老是在外頭痛罵老闆不尊重技術人員.如
果把行業換成色情行業,那老闆不就等於被乾洗?這樣看來,程式設計
師和詹惠華(黃顯洲3P案女主角)幹的事情有什麼兩樣?如果這樣的人
多了,真正要去賣香雞排的,不是寫程式的人,而是僱用了這些雜碎的
老闆才對.

............全文完

程式設計師懺情錄(中)

發信人: xeon.bbs@bbs.tnfsh.tn.edu.tw ()
日期: Fri Mar 29 12:05:03 2002
標題: [轉貼] [轉錄]程式設計師懺情錄(中)

作者: erictsai (連備取都沒有的白痴!) 站內: TFcis
標題: [轉錄]程式設計師懺情錄(中) --eric要我轉的
時間: Thu Mar 28 20:54:26 2002

※ 本文轉錄自 [erictsai] 信箱

作者: eric (認真的艾瑞克)
標題: 程式設計師懺情錄(中)
時間: Thu Mar 28 20:51:59 2002

王森專欄> 不賣雞排也可以 - 程式設計師真情懺悔錄(中)

(續上期)

再來就是台灣軟體市場需求所引發的問題.
一般我們把軟體分成系統軟體(System Software)和應用軟體(Application Software).
編譯器,組譯器,除錯器,作業系統,驅動程式,都是屬於系統軟體的一部分.
台灣除了硬體廠商,IC Design House之外,甚少有撰寫驅動程式的需求.
前幾年Linux被炒的熱時,也有許多高手投入作業系統,編譯器以及簡化標準函式庫的研究.
而台灣所需求的軟體,極大多數是屬於應用軟體,這些需求的應用軟體其中很大比例
是和資料庫有關係的(其實不只是台灣,其他地方也是約略相同的情形).
所以VB,Delphi和PowerBuilder這類IDE大行其道,因為他們容易上手,可以快速開發資料庫應

用程式,相關入門書籍很多,會的人更多. 因此符合我們前面所說的:"會的人越多,價值就越
低"的理論.

但是別忘了,系統軟體有部分是偏向應用軟體的,比方說開發軟體用的JBuildr和Visual Stud
io;
製圖用的AutoCAD;一套IC Design用的Xilinx或Altera;做OOA/OOD的Rational Rose和Togeth
erJ,
筆者習慣稱這些軟體叫做"軟體的軟體"(Meta Software).
在一般程式設計師眼中,這類軟體"理所當然"地認為都是由國外所發展.
這類軟體有極高的進入門檻,所以國外這類軟體公司的獲利率很高,所以該公司的
程式設計師可是身價非凡. 要知道,先前在媒體上有報導過,能夠讓Microsoft買軟體來用的 膝q,
只有Rational Rose(當然,不可能只買Rose來用). 如果做IC Design的人沒有你的軟體就沒 鴘k
做事,身為一個程式設計師,你會覺得你的身價和地位比做IC Design的人低嗎? 如果你做的 n
體像SoftICE或DriverWorks那樣被做硬體的工程師大量地倚賴,你會覺得搞硬體的人比你厲 `嗎?
問題是,知道該如何設計一套這類軟體的人,恐怕才是真正的異數. 而且需要跨領域的專才.
要不是許多OpenSource的project(例如:KDeveloper)正在進行,恐怕很少人知道該如何設計 @套
IDE. 既然會製作這類軟體的人在國內少之又少,那麼他們的身價高嗎?
很抱歉,台灣沒有公司發展出足以和國外大廠競爭的開發工具.
舉IDE為例,國內早期有家公司開發出一套名為DBtools的產品勉強可以算的上是這類產品,
旗標也曾為它出版過入門手冊,可是使用這套軟體的人好像...沒看過
(如果該產品有不錯的佔有率,請原諒我是井底之蛙),
沒有市場,公司無法賺錢,即使你是少數能做製作某類型產品的高手,公司最後關門大吉了,
您也只能算是"少數能讓公司賠錢的程式設計師"罷了.
所以我大膽假設, Games Golsing或Anders Hejlsberg如果學李敖一樣50年不離開
這個小島,大概早餓死了.

以上的討論,真正優秀的高手看了之後,或許會產生有時不我予,不得已必須
遠渡他鄉的想法. 程式設計師的價值就如同書的價值一般,國內和國外有不
同的看法.國內教科書比較便宜,應用的書比較貴.國外教科書比較貴,應用的
書比較便宜. 國外重內容,薄薄一本How Debuger Work可以賣44.99美金.而國
內,都是看頁數來計價(侯俊傑先生的書有努力在打破這個頁數的迷思,也做的
蠻成功).有很多原因導致這兩種文化之間的差異,但是,市場因素肯定是其中重
要的一項.

好了,程式設計師價值低落的原因討論過了,如果您同意筆者的論點,
那麼不禁疑惑,大家彼此毫不保留地讓知識得以流通,技術得以擴散,本意是好的,
結果反到造成自己和別人身價的低落,這樣我們是不是從此不再和別人分享我們
的心得? TAHO先生看過本篇上半部之後,發表了底下內容:
--------------------------------------------------------
發信人: TAHO.bbs@bbs.nhctc.edu.tw (癡人)

> 哈 恭喜TAHO兄上Java週報了...
> 通常至少會有熱心人士願意留下一個URL,讓我們可以找到參考文件,更
> 具熱誠的,如新竹師院BBS站Java版的TAHO先生,還擅用很多生動的比喻讓初學
> 者體會技術的真義。

@@".....
光看這一段 好像是褒獎
不過看了整篇文章...
突然發現......
原來我是讓程式設計師不值錢的兇手之一....
真是罪該萬死啊....
--------------------------------------------------------

但是mue先生接下來的發言,說卻命中本文真正的核心價值觀:

--------------------------------------------------------
發信人: mue.bbs@bbs.im.tku.edu.tw (閒人)

: @@".....
: 光看這一段 好像是褒獎
: 不過看了整篇文章...
: 突然發現......
: 原來我是讓程式設計師不值錢的兇手之一....
: 真是罪該萬死啊....
不會啦..要是每個程式師都死守自己所會的..讓所謂的專業門檻更高的話..
就很難進步了..就是讓本來難的變簡單..自然就會有更難更深入的東西出現..
這樣社會才進步的快丫..
--------------------------------------------------------

做應用軟體的人真的沒價值嗎? 有些靠應用軟體賺了不少錢的朋友開始偷笑了.
軟體必須加上專業知識,才能夠發揮價值. 換句話說,如果您真的只會"寫程式",
那,卻沒有配合各種領域的專業知識,"寫程式"這項技能本身根本毫無價值可言.
就很像你的電腦裝了瀏覽器,可是卻沒有對外連線的網路一樣,如果沒有網路本身,
瀏覽器一點價值也沒有,更不需要一家公司大費周章地利用平台優勢去整倒另外一家公司.
我們可以把程式設計師比喻成架子上滿滿的資訊相關書籍,而顧你的老闆就是前來買書的讀
你不能否認這麼一堆書裡頭,有好書,也有爛書,你也不能否認你心中的爛書是一本書,
但是你卻不能否認書裡面教你如何寫Java程式的內容是錯的.
可是,購書的讀者壓根兒根本覺得某幾本書一點價值也沒有.
我們只能說,太多只會"寫程式"的程式設計師打爛了市場,就像一牛車的爛書一樣,
你不能說爛書沒有價值,可是爛書會讓你對架上其他書籍的價值大打折扣.
除非,你之前看到別人口耳相傳這本書是好書.
大家或許不相信"只會寫程式"的程式設計師存在於這個世界上,所以筆者舉個
簡單的例子說明之:很久以前, BBS上有人發表了post,內容大該是說某公司在
整理舊的程式碼時,發現了一則奇文,奇文內容如下:
-----------------------------------------------
//底下是一個判對某個整數是不是奇數的程式碼
public static bolean isOdd(int n)
{
while(true)
{
if(n==1) return true;
else if(n==0) return false;

n=n-2;
}
}
------------------------------------------------
您說撰寫這個程式碼的人不會寫程式,他又好像會寫,
你說他會寫程式,你又不服氣,覺得這個傢伙根本在胡搞一通.
看過這則奇文軼事之後,當您下次聽到某公司抱怨他們的程式設計師
做出來的軟體一堆bug,速度出奇的慢,產品永遠賣不出去,害公司快經營不下去了,
所以他們認為程式設計師一點價值都沒有,只是一堆勞碌命的雜碎時,
您會不會更加懷疑,是一堆莫名其妙的程式設計師,把你的行情給搞爛了?

待續....

程式設計師懺情錄(上)

發信人: xeon.bbs@bbs.tnfsh.tn.edu.tw ()
日期: Fri Mar 29 12:05:03 2002
標題: [轉貼] [轉錄]程式設計師懺情錄(上)

作者: erictsai (連備取都沒有的白痴!) 站內: TFcis
標題: [轉錄]程式設計師懺情錄(上) --eric要我轉的
時間: Thu Mar 28 20:54:12 2002

※ 本文轉錄自 [erictsai] 信箱

作者: eric (認真的艾瑞克)
標題: 程式設計師懺情錄(上)
時間: Thu Mar 28 20:48:21 2002

不負責講座> 程式設計師真情懺悔錄(上) (Sun教育訓練中心 王森)
前言:

不久前,蔡學庸先生發表了兩篇分別叫做"程式與香雞排","再論香雞排" 的文章,受到的迴響之大,據說連作者本人都接到該文的轉寄。足以見 得該文的內容道出了台灣程式設計師心裡最深處的想法。所以,本文想針 對台灣程式設計師來做討論,看看身為一個程式設計師,究竟犯了什麼 過錯,導致大家寧願賣雞排也不願再繼續寫程式。璩美鳳小姐為自己驚 動台灣社會的行為寫了真情懺悔錄,我們也該真誠地檢討一下自己。

本文:

在台灣,大部分的人都有個認知,就是"搞硬體的比搞軟體的要好賺", "做SA/SD比coding地位要高"。那些做ID Design的傢伙待的公司所發的 股票,永遠比搞Software Design的人待的公司發的還多,股價也高出好 幾倍。搞SA/SD的人,在公司地位好像也比單純寫程式的人高。於是我的 父親有一次問我:"是不是搞硬體的人智商比較高?","是不是搞分析設計 的人比較有地位?"

事實上,在學生時期我就認識不少人,有的人因為程式寫不過別人,所 以轉換跑道專攻硬體;也有人覺得每天面對示波器和邏輯分析儀讓他們頭 痛,工程數學也學不過人家,所以轉行搞軟體。到了實際上面對許多前 來接受教育訓練的學員之後,發現有人是因為寫了十幾年BIOS和driver, 覺得乏味而沒有前途,所以想試看看應用程式的開發;有人則是因為受不 了客戶每天改需求,而且寫BIOS和driver的人好像比較少,價格比較高, 因此想學習如何撰寫系統軟體。詢問那些上高階課程的朋友,有的人發 現自己只會胡做SA/SD唬爛老闆和客戶,所以希望重新打好基礎,從基本 的coding做起;有的人則因為寫程式寫太久,覺得應該往上走向SA/SD的路 子,畢竟老了程式就寫不動了。這個世界上什麼樣的人都有,絕對不能以 小羨大。就很像搞政治的老是騙我們台灣只分成外省人和本省人;搞幫派的 人告訴我們警察是帶著槍的流氓。實際上,每個族群大家在沒有被分化之 前都相處的和樂融融,而雖然有警察擄妓勒索,上班時間跑去聚賭,但是 也有開我們罰單時酌情輕罰的警察,和保護我們身家性命的警察。

即使如此,身為一個程式設計師還是要問,那為什麼寫程式的好像地位就 是比較低? 筆者認為,這是進入門檻的問題。會做相同事情的人多了,就 會削弱那樣技能的價值。就很像考過MCSE/MCSD證照的人,通常比起考過 SCJP/SCJD證照的人要來的沒價值,前者因為考過的人實在太多,而後者考 過的人少,僅是如此而已。但是絕不是代表考過MCSE的人,素質就比考過 SCJP的人要差,也不代表考過SCJP的人,實力真的比較高段。相信求學的 時候您一定遇過一種人,他實力也不怎樣樣,可是考試的時候他x的就是考 的比我們高,怎麼我們心裡就是不服,可是大多數老師偏偏就是比較喜歡 分數高的人。因此,滿坑滿谷的人自稱會寫程式,老闆不愁找不到可以做 project的人,你要求的薪水和價格很高? 沒關係,找個學校剛畢業的小子 ,寫的比你快,寫的比你好,用的技術比你新,更重要的,價格比你這個 老屁股便宜一半。所以程式設計師在雇主心中的地位日益低落,自然有跡 可循。

"那麼,為什麼寫程式的進入門檻比較低?"

在各位資訊從業人員的身邊,非科班出生的比率非常高(當然沒還賣雞排的 高),科班出生的學生,搞不好在老闆眼中的地位,還比不上一個半路出家 的自學者。那位自學者會ASP、JSP、PHP、C++、C+、Java、Linux、Windows 、Oracle...等,十八般武藝樣樣精通。而我們科班出生的學生,只會離散 數學、資料結構和演算法,Visual Basic搞不好沒有用的沒人家熟,網站的 架設搞不好也沒人家熟,更何況科班出生的學生,他的基礎學問搞不好根基 也不紮實(問看看您身旁的科班學生),難怪最常見的就是很多非科班的"高 手"看不起科班的學生,覺得他們無三小路用,連個Windows操作都比他們差 ,甚至有的還大言不慚的說:"我這輩子寫程式從沒用過書上的資料結構和演 算法,讀那些幹啥?"。 長期下來,科班的學生也開始質疑自己的所學,甚 至考慮轉行,當然,也有曲高和寡,孤芳自賞之人。 總之,沒辦法受到老闆 垂青,薪水永遠那麼少,想賣雞排的念頭就開始萌生。

之所以會有這種情況,筆者個人認為有兩種主要原因,一是技術的流通性, 二是台灣軟體市場的需求。為什麼技術的流通性可以產生大量半路出家的非 科班生? 這都要感謝台灣大量作者,寫出大量的入門書籍,大幅減低的進入 程式設計領域的門檻。即使在各位眼中,繁體中文的爛書很多,而且非常。 但是,大家眼中的爛書,常常是再版多次的入門書,對某些人認為是垃圾的 東西,常常是另外一批人進入資訊業的最佳踏腳石。不信各位到書店看看, 是"24小時學C++"、"快快樂樂學Java"的書比較多,還是"輕輕鬆鬆學微分方程 式"、"21天學複變"、"電子學不求人"的書多? 兩者的差距是 N:0。是微分方 程式和複變比C++,Java難學嗎?筆者兩個都學過,至少我可以發誓,就一個有 基本學習能力的人來說,難度是一樣的,學成所需要的時間和功夫也是一樣的 。再看我們的公開討論區(BBS或Forum),我們可以看到大量的軟體技術討論區 ,卻看不到硬體技術討論區(喔,請別跟筆者說那些每天問哪家主機板比較好, 哪台燒錄器較穩定、或者說CPU時脈越高速度就越快越好,或是說x86的Out-Of-Order Executon是"故障執行" 這一類渾話的討論區和我說的硬體技術討論區是一樣 的喔!)書籍和討論區促進知識的流通,造成了大量的軟體人才,更何況,學習設計 軟體只要一台PC就能寫出好用的軟體,而學習硬體設計,需要的設備更是天價。 更重要的一點,就是學軟體的人,充分發揮儒家分享的精神,只要不是在BBS上 冒充小妹妹想要騙取大哥哥的同情來幫你寫程式作業,只要不是很差勁的亂問 一通,通常至少會有熱心人士願意留下一個URL,讓我們可以找到參考文件,更 具熱誠的,如新竹師院BBS站Java版的TAHO先生,還擅用很多生動的比喻讓初學 者體會技術的真義。在這種知識充分流通的環境下,當然產生出非常多的資訊 從業人員,每買一台PC,上頭各種軟體的需求是無窮無盡的,每天都有各行各 業的人需要各種軟體,所以程式設計師的需求有一定的量。難怪有人說:"寫程 式的人餓不死,但是也不會發大財。"

待續....