2020年11月26日 星期四

程式匠雜談一二


忽然間起了興致,翻翻過去在其他格子裡的留言,發現有些文章刪了,有些連格子都沒了,我自己的留言當然也就一同陪葬啦!儘管多數只是練肖話,偶而也有值得敝帚自珍的,在家裡重貼,算是留底。

這篇主要關於當一輩子碼農的經驗談,多數是與「鄉下老師」張博士的對話。其實我自己的格子風花雪月,很少提工作上的事,正好作為補充。小標附上引文出處,免得片面之言摸不著頭腦。順祝張老師的格子長長久久,永遠有得參照😀。

以簡馭繁,大巧若拙

想起若干年前,和某主管談到如何替軟體工程師打考績的事。台灣很多非工程背景,特別不是軟體出身的主管甚至老闆,容易陷入以工作量來設定KPI的迷思。像是寫了多少行程式(現在應該沒有人這樣算了吧),解了多少隻bug,等而下之的,還有用加班時數來算。

我說這些其實都是反指標。同樣功能或效率的程式,你覺得用一千行或一萬行寫出來,那個比較厲害?一個系統跑上一年不出毛病,和三天兩頭出狀況需要救火,你覺得誰的思慮比較週全?高竿細密的工程師,早就可以下班看電影,那有人需要加班!這種人如果加班,不是在玩遊戲,就是在做一些你想都沒想過的事情。如果拿那些指標打考績,你大概很難留住這種人;你的軟體就會愈來愈肥,臭蟲愈來愈多,最後每個人都加班到天亮。

至少會一樣,加上自行解決問題的能力!

確實如此。過去我當RD主管應徵新人,學歷證照通常隨便翻翻,最在意的,還是他實作過什麼。老實說,那怕是氣泡排序這種課本習題(真有人敢提這個),只要說得出口,有一番道理,就可以繼續談下去。只會唸書考試的,就請回罷,別浪費彼此時間。

至於列出特定程式語言,我想告訴新人,通常意義只不過是:敝公司目前內部使用的,是這(幾)種語言。既非充分,亦非必要條件,會了有加分而己。千萬不要因為沒學過,而不敢來應徵。誠如老師所說,用人單位注重的,是你的「實力」;程式語言,只是工具罷了。

以我自己為例,畢業應徵第一份工作,有主管問會不會C語言?我說學校沒教,自修學過,但平日不用,因為編譯要換磁片很麻煩(當年聽這句,就知道巷仔內的);雖不算熟,我有把握一星期上手。結果當場就錄取了。

針對問題才能解決問題

哈,職場上還有一種常常令RD翻白眼的人,典型口頭禪是:啊這不是把A跟B兜起來就好了咩!

問題A是圓柱、B是方孔哩。

你要的是看起來很酷?還是真的會做很多事?

眼睛只盯著酷炫技術如「機器學習」的人,有時會忽略產品化過程中一些現實因素。分享一段失敗經驗。

90年代初我出道未久,接過一單半公家技研單位的委託案,將他們研發的技術商品化並中文化。那玩意兒當時在軟體圈也是震天響,熱度不亞於今天的「機器學習」,年輕的我十分著迷,一頭栽進去。

然而商品化有個障礙:當年主流仍是DOS,PC記憶體僅有640K,他們的技術核心吃掉一半,再加上中文系統、應用軟體,系統就跑不動了。當然有人會說:加裝記憶體就好了嘛,換個OS就好了嘛。但市場很現實,不會因為技術名稱酷炫而買單,必須真正為客戶帶來實質效益,至少不能平白增加成本。落伍技術在640K機器跑得嚇嚇叫,酷炫技術功能強大,但核心太肥了,無法在不增加硬體成本的前提下,達到與落伍技術相同的效率。如果不能帶來耳目一新的變革,很難說服客戶每台機器多掏個五千一萬來加裝記憶體、升級OS,特別是終端客戶實務上未必需要酷炫。這案子是我出道以來頭一場敗績,因為核心無法瘦身,折騰大半年勉強驗收,結案後直接打入冷宮,連廣告都沒得打,一套也沒賣。

至於核心無法瘦身是何道理,我後來急了,直接找該單位主事者(學長)情商,能否開放原始碼,我來幫他們減肥。學長支吾一陣才透露,核心來自美國某單位授權,其實台灣這邊沒有原始碼。美國人不跑中文,他們自身沒有迫切需要,所以改程式要另外收錢,於是乎,嗯哼。

那套酷炫技術無論在台在美,都未曾獨立商品化。倒是在幾年後,Windows成為主流,由原採用落伍技術的當道公司,整合進新一代產品。年輕人崇拜尖端科技,覺得領先潮流便可睥睨一切,在市場跌撞幾年才會慢慢瞭解,核彈未必打贏小米步槍。正如老師所說:藥不是最貴的好,而是要對症才會好。

程式設計課該教甚麼?

雖然我本人不從事教學,但看法和張老師相近。家裡兩個小孩,國中時代經由老師推薦,到大學暑期班修程式設計,起手式便是C++,結果雖常懷敬畏之心,卻從此提不起興趣。後來嘗開導他們,發現、解決問題是實力,過程是樂趣,程式語言只是工具。不過老爸開口只能共樂樂,嚴肅的事通常被當耳邊風。

如果C++像玉山,C#或Java可比陽明山,難易不可以道里計。初學者實在不必搬座大山擋在門口,只能崇拜,卻施展不開。即使在實際工作,也應該因時因地制宜,考量工期效率、環境需求(例如跨平台,或硬體驅動程式)而選擇不同的語言工具,精通一二,旁及其他可也。至於初學者,以C++入門而能產生興趣的,大概百中無一。我覺得循序漸進會是比較理想的做法。
 
(這則當初寫完忘記貼。嘿!真是老了)
 
我自己卅年的從業經驗,程式語言只是因時因地制宜的工具,沒有優劣之分。因此對於孩子中小學階段參加電腦研習營,老師執意要教 C/C++,一直感覺不可思議。對初學者不會太過困難而倒胃口嗎?然而實際上有此堅持的老師還不少,大概教出的學生,也免不了會有獨尊 C/C++ 的想法。

卅年前剛出道時,電腦效能和容量不及今日萬一,使用 C/C++ 甚至組合語言,確實能夠提昇效率兼減肥。廿年前組合語言先淡出,到十年前連我都不用了。近十年來,即使在嵌入系統,常常也用高階語言來加速開發搶時效。真是的,產品的生命週期長不過程式語言的話,想那麼多幹嘛。

前幾天跟女兒討論演算法,就說到假如演算法差勁,複雜度達到 O2 之類,光靠語言或程式技巧是很難救的,硬拼也只是白耗電,加上浪費自己時間而已。反之,優美的演算法,用高階語言也可以解得漂亮。

至於現在還用 C/C++ 的唯一理由,大概只有「為往聖繼絕學,為萬世開太平」吧!只有 C 語言,五十年前就存在,未來半世紀應該也死不了;不論是承接歷史包袱,或希望自己能成為歷史包袱, C/C++ 是不錯、有時候也不得不的理由。

 (臉書答客問,因為U值媒掛點,「客問」已經佚失了)

2020.12.18 11:13:26
排版錯誤。原文有上標,搬過來自動消失,又沒注意。發表後就石化,改不得了。呵呵!

2020.12.04 12:45:07
言之有理啊!C/C++ 寫在一起,似乎在教學領域比較常見,起碼我家小孩去上的課程是這麼寫的。事實上教的是 C++,大概覺得 C 太簡單,沒什麼好教;然後對小朋友講一堆「繼承、多型」,唬得一愣一愣的。 :-D

2020.12.20 補充

關鍵不在硬體,而在軟體。DOS只支援 1M 定址空間,用到其中 640K。超過 1M 部份,要透過third party的 EMM 記憶體管理。重點在於,EMM 廠商規格不同,且必須由 AP/Driver 個別處理,並沒有什麼統一系統介面,因此軟體開發初期,不見得想去惹這麻煩。文中令人無可奈何那塊,就沒有支援EMM,旁人也無法代勞。

遠距教學隔空抓藥 ── 陪女兒寫作業

哈哈!學生時代為求過關各顯神通,什麼把戲都有。

記得有一門課要寫組合語言,學期作業居然不收電子檔,要求把程式印出來。當年的報表紙印了幾十頁,我猜老師大概想用風扇吹。

有位同學跑來求救,說期末考必當,得靠作業補救,可是寫不出來啊!問我能不能替他寫一份交差?喂!那是組合語言耶!寫起來多累你知道嗎?(肯定不知道)

我說多寫一份沒辦法,可是我賭老師不會看,所以把我自個兒的程式前後抖亂,照樣印出幾十頁給他交差。結果不但過關,分數還不低,顯然風扇吹不動的贏😎。
 


 

沒有留言:

張貼留言