不久前,蔡學庸先生發表了兩篇分別叫做"程序與香雞排","再論香雞排"的文章,受到的回響之大,據說連作者本人都接到該文的轉寄。足以見得該文的內容道出了臺灣程序設計師心里最深處的想法。所以,本文想針對臺灣程序設計師來做討論,看看身為一個程序設計師,究竟犯了什么過錯,導致大家寧愿賣雞排也不愿再繼續寫程序。璩美鳳小姐為自己驚動臺灣社會的行為寫了真情懺悔錄,我們也該真誠地檢討一下自己。
本文:
在臺灣,大部分的人都有個認知,就是"搞硬件的比搞軟件的要好賺","做SA/SD比coding地位要高"。那些做ID Design的家伙待的公司所發的股票,永遠比搞Software Design的人待的公司發的還多,股價也高出好幾倍。搞SA/SD的人,在公司地位好象也比單純寫程序的人高。于是我的父親有一次問我:"是不是搞硬件的人智商比較高?","是不是搞分析設計的人比較有地位?"
事實上,在學生時期我就認識不少人,有的人因為程序寫不過別人,所以轉換跑道專攻硬件;也有人覺得每天面對示波器和邏輯分析儀讓他們頭痛,工程數學也學不過人家,所以轉行搞軟件。到了實際上面對許多前來接受教育訓練的學員之后,發現有人是因為寫了十幾年BIOS和driver,覺得乏味而沒有前途,所以想試看看應用程序的開發;有人則是因為受不了客戶每天改需求,而且寫IOS和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。是微分方程序和復變比++,Java難學嗎?筆者兩個都學過,至少我可以發誓,就一個有基本學習能力的人來說,難度是一樣的,學成所需要的時間和功夫也是一樣的。再看我們的公開討論區(BBS或Forum),我們可以看到大量的軟件技術討論區,卻看不到硬件技術討論區(喔,請別跟筆者說那些每天問哪家主機板比較好,哪臺燒錄器較穩定、或者說CPU時脈越高速度就越快越好,或是說x86的Out-Of-Order Executon是"故障執行" 這一類渾話的討論區和我說的硬件技術討論區是一樣的喔!)書籍和討論區促進知識的流通,造成了大量的軟件人才,更何況,學習設計軟件只要一臺PC就能寫出好用的軟件,而學習硬件設計,需要的設備更是天價。
更重要的一點,就是學軟件的人,充分發揮儒家分享的精神,只要不是在BBS上冒充小妹妹想要騙取大哥哥的同情來幫你寫程序作業,只要不是很差勁的亂問一通,通常至少會有熱心人士愿意留下一個URL,讓我們可以找到參考文件,更具熱誠的,如新竹師院BBS站Java版的TAHO先生,還擅用很多生動的比喻讓初學者體會技術的真義。在這種知識充分流通的環境下,當然產生出非常多的信息從業人員,每買一臺PC,上頭各種軟件的需求是無窮無盡的,每天都有各行各業的人需要各種軟件,所以程序設計師的需求有一定的量。難怪有人說:"寫程式的人餓不死,但是也不會發大財。"
再來就是臺灣軟件市場需求所引發的問題.一般我們把軟件分成系統軟件(System Software)和應用軟件(Application Software). 編譯器,組譯器,除錯器,操作系統,驅動程序,都是屬于系統軟件的一部分.
臺灣除了硬件廠商,IC Design House之外,甚少有撰寫驅動程序的需求.
前幾年Linux被炒的熱時,也有許多高手投入操作系統,編譯器以及簡化標準函式庫的研究.而臺灣所需求的軟件,極大多數是屬于應用軟件,這些需求的應用軟件其中很大比例是和數據庫有關系的(其實不只是臺灣,其它地方也是約略相同的情形).所以VB,Delphi和PowerBuilder這類IDE大行其道,因為他們容易上手,可以快速開發數據庫應用程序,相關入門書籍很多,會的人更多. 因此符合我們前面所說的:"會的人越多,價值就越低"的理論.
但是別忘了,系統軟件有部分是偏向應用軟件的,比方說開發軟件用的JBuildr和Visual Studio;制圖用的AutoCAD;一套IC Design用的Xilinx或Altera;做OOA/OOD的Rational Rose和TogetherJ,筆者習慣稱這些軟件叫做"軟件的軟件"(Meta Software).
在一般程序設計師眼中,這類軟件"理所當然"地認為都是由國外所發展.
這類軟件有極高的進入門檻,所以國外這類軟件公司的獲利率很高,所以該公司的程序設計師可是身價非凡. 要知道,先前在媒體上有報導過,能夠讓Microsoft買軟件來用的公司,只有Rational Rose(當然,不可能只買Rose來用). 如果做IC Design的人沒有你的軟件就沒辦法做事,身為一個程序設計師,你會覺得你的身價和地位比做IC Design的人低嗎? 如果你做的軟體像SoftICE或DriverWorks那樣被做硬件的工程師大量地倚賴,你會覺得搞硬件的人比你厲害嗎?
問題是,知道該如何設計一套這類軟件的人,恐怕才是真正的異數. 而且需要跨領域的專才.要不是許多OpenSource的project(例如:KDeveloper)正在進行,恐怕很少人知道該如何設計一套IDE. 既然會制作這類軟件的人在國內少之又少,那么他們的身價高嗎?
很抱歉,臺灣沒有公司發展出足以和國外大廠競爭的開發工具. 舉IDE為例,國內早期有家公司開發出一套名為DBtools的產品勉強可以算的上是這類產品,
旗標也曾為它出版過入門手冊,可是使用這套軟件的人好象...沒看過(如果該產品有不錯的占有率,請原諒我是井底之蛙),沒有市場,公司無法賺錢,即使你是少數能做制作某類型產品的高手,公司最后關門大吉了,您也只能算是"少數能讓公司賠錢的程序設計師"罷了.所以我大膽假設, Games Golsing或Anders Hejlsberg如果學李敖一樣50年不離開這個小島,大概早餓死了.
以上的討論,真正優秀的高手看了之后,或許會產生有時不我予,不得已必須遠渡他鄉的想法. 程序設計師的價值就如同書的價值一般,國內和國外有不同的看法.國內教科書比較便宜,應用的書比較貴.國外教科書比較貴,應用的書比較便宜. 國外重內容,薄薄一本How Debuger Work可以賣44.99美金.而國內,都是看頁數來計價(侯俊杰先生的書有努力在打破這個頁數的迷思,也做的蠻成功).有很多原因導致這兩種文化之間的差異,但是,市場因素肯定是其中重要的一項.
好了,程序設計師價值低落的原因討論過了,如果您同意筆者的論點,那么不禁疑惑,大家彼此毫不保留地讓知識得以流通,技術得以擴散,本意是好的,結果反到造成自己和別人身價的低落,這樣我們是不是從此不再和別人分享我們的心得?
王森:程序設計師真情懺悔錄(下)
(2002.03.28)
所以從今天開始,如果你對程序設計有一股熱愛,那么我們一起努力,做個真正的程序設計師,而不要做一個雜碎且破壞別人行情的程序設計師.做一個真正寫的出有用軟件的工程師,不要做一個只會寫程序的程序設計師.當然,如"意外的計算機王國 / 聯經出版社"一書所言,很多技術都是用來原本沒有預料到的地方而大行其道.許多科學研究無法有立即的貢獻,但是影響深遠,我們也期許有意從事基礎研究的科班研究生,認真的作研究,不要老是研究一些別人已經研究過的研究,不要老是冀望騙國科會等研究機構的經費,到了最后計劃結案時,才匆匆忙忙交出另外一篇騙更多錢的計劃書,或是拿不出臺面的研究.
最后,我們反省自己是不是也是一個只會"寫程序"的程序設計師呢? 請自行測驗底下幾個問題,這些問題都不可能有客觀的答案,所以每個問題都附上筆者主觀的答案,作為筆者自己的反省.
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命令之中效能問題的稀有專家,還是再找一個號稱他什么都會,結果一點用場也派不上的"數據庫女工" ?
我們常常看到某人列出他的履歷,好象會很多就是很厲害.但是當我們完全深入一項技術時(喔,我是說你真正下工夫的時候),通常我們會越來越感覺到自己的渺小.
蔡學鏞先生就是一個非常尊重專業技術的例子.我們看到他在 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),當項數很多時,運算時間是不是差很多?
這些都是我們的教育所產生的問題(當然筆者也是其中一位受害者),老師只叫你寫好作業,助教只叫你run出正確的結果,認真一點的還會測試你是不是抄來的. 卻從來沒告訴你程序中不能只有一個main函式,程序代碼不能第一行寫到第一千行從不切割成其它子程序. 你的程序代碼看起來不堪入目,老師助教從沒告訴你,你的.class檔被decompiler反編譯之后,長的比你寫的還漂亮.
但是從今天開始,我們可以開始認真思考每行程序,不要再做一個雜碎程序設計師.
試想發展MP3算法的人和寫WinAmp的人,哪個比較厲害? 你會說都很厲害,可是沒有前者就沒有后者,前者搞不好還可以坐收權利金,后者只能苦哈哈的賺些小錢或等人購并. 我們停留在崇拜應用程序技巧的階段,而真正值得崇拜的是那些難得一見的創意.
筆者遇過一個朋友,叫他撰寫一個費式數列的小程序,比請他寫一個可以瀏覽數據庫表格內容的程序還難.(請不要與我討論費式數列的小程序沒有實用價值的問題,這里討論的重點不是這個)前者需要稍微動點小腦筋,后者只要會拖拖組件,設定property就搞定. RAD本身不是罪,但是沒學好九陽神功就妄想幾小時練成乾坤大挪移.最后只會走火入魔而死,徹底變成一個"程序女工".
Q3: 你常常以科班和或非科班自居?
你是科班生,瞧不起非科班生? 因為你是正統?
你是非科班生,瞧不起科班生? 因為你覺得會的東西比科班生的還多.
爛學校會出現好學生,好學校也會有爛學生.
因為比例一樣多,所以我們不能以偏概全.
如果仗著受過幾年正規教育,自己又從未好好深入學習,就自己為是正統,比較學術的說法這叫做"陽具文化".有些創新的idea是一般制式腦袋的科班學生很難想出來的,因為專家是訓練有素的狗.
如果你是學電信的朋友,你發現交換機是一個葬儀社的老板因為生意被別人搶走而發明的,那你會不會氣死?
如果自學有成的程序設計師仗著自己會的東西比較多,你說你精通Java的各種技術,你看不起從沒寫過JSP的科班學生.
但是有人告訴你發展Java的Games Golsing博士是一個正統出生的科班生,知道了這件事情,會不會讓你更加尊重幕后認真打拼的科班生?
Q4: 你是學計算器科學的,可是邏輯能力并沒有比較好,還常常受騙?
你會被潮流所鼓動嗎? 你常常被別人的思考牽著走?
人家鼓吹Linux多好多好,你的腦袋連轉都沒轉過就發憤努力地考Linux認證 ?
-------------------------------------------------------------------
別人把公司里的server全換成Linux,客戶端也都改成Linux,公司仍然正常地運作,結果你學了Linux之后,看到電視上BSA同法務部做的廣告仍然嚇的你冷汗直留.
深怕明天去住套房.
Sun跟你說Java跨平臺,你沒試過也跟人家說跨平臺的優點?
---------------------------------------------------
Borland已經可以做到一份光盤里同時附上Solaris, Linux, Windows, MacOS X的JBuilder,
你卻為了EJB無法deploy到不同公司的Application Server忙的像無頭蒼蠅.
之前一窩峰人鼓吹XML,結果你盲目追求流行,做出來的東西tag比data還多?
-----------------------------------------------------------------
會用的人徹底了改變了公司里資料交換的流程,而你整天只會SAX來,DOM去的寫XML數據庫(用XML來儲存資料的數據庫)
微軟的廣告告訴你XP和IE將不支持Java,你都還沒試過就跟別人嚷嚷Java已死?
--------------------------------------------------------------------
套句BBS上moga先生的名言:"那我現在在Windows 2000上跑的Java程序是神跡?"
現在一票人每天宣傳web service的好處,你連想都沒想過就急著想要把公司的舊系統全部改成web service來做,結果浪費一堆錢,糟糕的速度讓你每天被客戶臭罵 ?
----------------------------------------------------------------------
Web service當然是美好的前景,但是并非適用于每個角落,目前世界上并不存在完美的solution.
人家說不能寫程序一輩子,寫程序的人生命周期很短,你也跟著別人開始往SA/SD前進 ?
---------------------------------------------------------------------------
如果世界上每個工程師都可以經由經驗就成為優秀的SA/SD人員,那么理論上咱們應該有些象樣的軟件產品才對. 有些人寫了幾十年,
還是一個優秀的程序設計師,你問問他,如果沒有遇到糟糕的老板,
糟糕的待遇和糟糕的制度,他愿不愿意寫一輩子程序? 我愿意.
顧問告訴你要多用RAD,不該重新造輪子,所以你努力的問how而不問why ?
---------------------------------------------------------------
結果真正賺到錢的都是那些像JReport做軟件組件的軟件公司.
微軟說J2EE Blueprint的Pet Store,用.NET技術做比用J2EE做還要快許多,然后你就相信了,最近, IBM和Oracle重新加強Java版的Pet Store,讓它比.NET版的還要快18%~22%,你又改口說Java比較好.
--------------------------------------------------------------------------------------------
一個系統在設計的時候有很多考量,有人以擴充性為主,有的以安全性為主,有人以效能為主.
如果沒有設計理念,大家程序里頭的function全部改成inline就好了,管他編譯出來的執行檔有多大.
系統只以效能做考量,我們還需要Design Pattern做什么?
那些王八蛋數據和我們選舉時的民調一模一樣...對一個腦袋清楚的人完全沒有參考的價值.
當然,以情感因素來看民調的人例外.
如果你沒有經過自己的自主判斷就盲目的跟隨潮流,那么下次當你看到有人排隊買米酒,買蛋塔,搶購衛生紙的時候,請不要投以排隊的人們奇怪的眼光.
Q5:你尊重老前輩嗎?
我們都相信,世界上唯一不用努力就可以獲的東西就是老.
所以吃過的鹽巴比你吃過的米還多的人,沒有任何值得尊重的.
我們更相信,信息業永遠是年輕人出頭,而英雄少年也常在心里想:
"李杜詩篇萬口傳,至今已覺不新鮮,江山代有才人出,各領風騷數百年."
但是我們認真想想,從Apple 2的時代到現在隨便一顆CPU都是1 GHz的時代,
計算器的本質有什么改變嗎? 不就是一臺不斷對內存作處理和I/O動作的機器.
你笑那些只會用Fortran或COBOL的老前輩,那你學的Java或C#比起這些老語言又高明到哪里去? 寫程序不過是 宣告,循環和函式三大要素.時間久了,產生了一堆新名詞,配上一些新的發展理念但本質上沒有改變.
如果你是推倒前浪的后浪,當你看到李維先生撰寫的 "[長篇] 我的回憶和有趣的故事"或侯捷老師最近兩期在Run!PC撰寫的"侯捷觀點"這些老前輩寫的文章,你有把握寫出比它們更高明,更有深度的東西嗎?
最重要的問題,
Q6:你騙過老板嗎?
你在履歷上寫的十八般武藝樣樣精通,結果是梧鼠技窮(注:比喻技能雖多,而不能專一),一錄取之后什么東西都做不出來,筆者至少聽過20個老板跟我講過這件事情.你以為你的身價比較高,只因為你從事"軟件研發"的工作?
然而現實的生活中,"獲利"是真正決定成敗的關鍵.除非你的東西幫老板賺了錢.
如果沒有,你憑什么要求更多薪水,憑什么要求50張價值數千萬元的股票?
如果你寫的東西品質很差,bug超多,客戶抱怨不斷,老板賺不到很多錢,
你還老是在外頭痛罵老板不尊重技術人員.如果把行業換成色情行業,那老板不就等于被干洗?
這樣看來,程序設計師和詹惠華(黃顯洲3P案女主角)干的事情有什么兩樣?
如果這樣的雜碎程序設計師太多了,真正要去賣香雞排的,不是寫程序的人,
而是雇用了這些雜碎的老板才對. 不過很遺憾,真的很多軟件公司的老板要改行了,雞排太多人賣了,我建議某位感同身受老板寫篇"程序員的老板與蚵仔煎",
請踴躍投稿.
............全文完
Sun計算機教育訓練中心 王森 (moli@pchome.com.tw)