2017年2月21日 星期二

程式設計的第 01 堂課:程式 + 設計 = 程式設計

李侑青, 程式設計, 雞排, 捷運永春站
學程式不懂炸雞排,也要懂得挑選好吃的雞排店啊!
網路上常流傳著一句話:「程式寫得好,要飯要到老。」接觸本篇文章的讀者們,見到這句話是否考慮打消學習寫程式的念頭呢?也或者,您還沒有充分資訊可供決策,想先多看、多聽、多瞭解。又或許,您在身份上有著學習程式設計的必要。那麼,我在這個章節中分享個人對於「程式設計」這四個字的理解,希望可以為您的程式設計之路展開一些可能性

首先,要把「程式設計」四個字拆開來理解:


程式是「工具、語言所構築的」實在流程
設計是「將抽象化為現實的」邏輯、藝術。
程式設計,就是以某些策略來使用工具,讓一些構想化為現實的藝術。

就拿「炸雞排」來講,炸雞排是一系列流程,可能要先將肉切片、醃漬,再裹粉、油炸,起鍋前開大火逼油,最後灑上胡椒鹽才完成名為「炸雞排」的流程。這一套流程,如果是安裝在電腦裡頭,讓電腦反覆執行的程序,我們就特別稱為程式(Program)。

假設我們開了一家雞排店,要教導員工炸雞排這個流程,我們一定要考慮員工聽不聽得懂我們講的話。因為如果員工是美國人,他不一定聽得懂「炸雞排」三個字,你要跟他講「Fried Chicken Fillet」他才聽得懂。所以,我們在腦中有一套炸雞排的流程,若要將這套流程實踐出來,需要透過語言來表達。相同的流程,可以用英語、用中文、用日文......來表達,只是當我們在選擇哪種語言之前,要考慮至少兩件事:(1) 我們自己熟不熟悉這套語言?(2) 聽這套語言的對象,有沒有一些特殊背景,可以簡單地執行我們想做的複雜概念?

我們要叫別人做事,總要懂得說人家聽得懂得語言吧!所以,叫電腦做事,就要使用電腦聽得懂的語言:程式語言(Programming Language)。每種程式語言都有它的特性與使用族群,好比說英文的人比說日文的人多,但是無論是英文或日文,都很難直接表達中文「道」的概念。因為真實世界的情境豐富而多元,為了在某些情境下能快速給電腦下達指令(寫程式),目前在電腦界已有超過 600 種程式語言!舉例來說,網頁排版用的語言如 Html,非常不適合用來做工程計算;而工程計算的語言如 Matlab,非常不適合用來呈現網頁。所以,叫電腦做事之前,一定要慎選適合的程式語言,才能方便讓電腦執行你想讓它做的事。

在許多程式設計的論壇中,幾乎每隔一陣子就會有新手詢問:「學哪種程式語言較好?」甚至更直接一點地問:「學哪種程式語言比較賺錢?」從我開始學習程式設計以來,到現在二十個年頭,這兩個問題一直沒有停過。顯然地,表示這個問題長年以來未被資訊界重視!所以多年來持續有人問著相同的問題。因此,我選擇把這個問題放在「程式設計的第 01 堂課」當中討論,希望大家在選擇要學習的程式語言時,心裡清楚明白。

有個網站叫 TIOBE,該網站提供目前程式語言被使用的熱門度排名。你可以一眼就知道目前最多人使用的程式語言是哪一款。如下圖所示:


TIOBE 程式語言熱門度排名
TIOBE:程式語言熱門度排名


看到各種程式語言,對新手來說大概要瘋掉了吧!難道要一種一種深入了解嗎?這樣子的學習途徑未免也太沒有效率。所以我的建議是,先從瞭解自己對「好」的定義開始。畢竟,每一種程式語言都是為了適應某些情境而產生的工具,如果沒有談論情境,就無法比較語言的優劣。如同前文所舉例,網頁排版與工程計算,兩個是完全不同的情境,所以「好」的程式語言也不同。因此,「學哪種程式語言較好」這個問題,可以加上情境來詢問:「我想做某某事,請問使用哪種語言較好?」加上情境的詢問法,能幫助有經驗者掌握你的需要,告訴你使用哪種程式語言「在該情境」較好。

接著談到「學哪種程式語言比較賺錢」這個問題。我覺得這個問題一樣可以加上情境來詢問,讓問題更清楚一點,比如說:「你想從誰身上、靠做什麼賺他的錢?」如果加上這個情境,那麼大家就能把「哪種語言較賺錢」這個問題,轉化為「哪種語言在你的賺錢目標上,較有效率、較省成本」這個問題。比如,C 語言有免費的開發平台,而 Matlab 很貴;但是 Matlab 有方便又豐富的工程計算功能可以使用,而 C 語言則無。就商業考量來說,我很難回答你「哪個對你來說比較賺錢」,只能幫忙評估你的情境,由你去規劃較可能賺錢的選擇。

再比如說炸雞排,可以只提供黃金比例,也就是固定不變的口味,這樣對生產與品質管理的成本最低。若能讓客人選擇大辣小辣,甚至選擇辣椒粉的品牌、產地、年份,你提供越大的彈性,代表你要付出更大的管理成本,且有的客人喜歡簡化選擇、有的客人喜歡彈性選擇,到底炸雞排要提供怎樣的服務才賺錢,這問題已經與語言無關,而是另一層次的商業考量。

此外,對學習者而言,總是希望有多一點免費工具可以用;然而,當開始學習之後會發現:工具要錢。然後,如果你想開發要錢的工具,有些人寧可盜版再用錢跟你打法律戰,也不願意讓你賺錢。這世界上不存在免費的雞排攤子,也不會有攤販免費教你他們炸雞排的配方,無論你選擇去炸雞排,還是選擇來寫程式,你所面對的都是殘酷的競爭市場。你會看到全球連鎖的炸雞公司、軟體程式公司,你也會看到一個又一個收攤的雞排店、一位又一位低薪高工時的程式設計師。因此,就我來說,可能沒有「比較賺錢的程式語言」,只有「比較賺錢的商業策略」。想賺錢,要思考的不是學哪種程式語言,而是你的商業策略。

回過來談設計。俗話說:說話是一種藝術。話講得好,溝通沒煩惱;話講不好,給自己惹煩惱。對於寫程式來說,就是用程式語言說話給電腦聽。所以學程式設計,不僅要學程式語言,更要學習設計的藝術,讓你想表達、或命令電腦執行的任務,能有效地、正確地派任給電腦執行。

在生活用語中,如果懂得成語、應用文,可以有效簡潔地陳述我們想表達的事情。然後在某些專業領域中,有領域內的專有名詞,如醫學、會計,各有各的專業術語。對應到程式設計來說,有些課程如「資料結構」、「演算法」就像是成語和應用文,雖然不是必須,但往往能讓程式變得有效率。然後將程式應用到各行各業,網路有網路的技術,人工智慧有人工智慧的技術,即使你「會說話」,也要入行學到專業知識才有辦法「說行話」。

程式是一套流程,可以是服務人的流程,也可以是傷害人的流程(如病毒)。程式設計,是從構思、規劃、實做、測試、到上線的整個創作過程。它的價值不僅限於寫程式,而在於創造新穎的服務。我認為,程式設計師應該把自己定位在創新的藝術家,而不是死板的作業員。我們知道,人腿不適合長距離快速移動,那就交給汽車嘛!人手不適合高精密反覆工作,那就交給機械嘛!人的價值提升,在於把腿用在更踏往幸福的方向,把手用在更迎接幸福的展望。同樣的道理,人腦的記憶模糊又有限,圖畫與書籍才能大量長久地精確地保存。人腦的演算緩慢,人腦適合聯想、關連,跳躍性地整合資源。人腦應當用於創造、發明,而非用於演算、記憶。所以程式設計的核心,不在於「寫程式」本身,而在於將人類的演算、記憶、學習、服務等工作,透過創造,變成一套能交給電腦執行的程式。那麼,如何辦到呢?這就是藝術(技術)了。

對於你要實現的服務,想好之後,就能決定要選擇哪一種程式語言來加速實現你的夢想。在我們進入下一堂課之前,先為自己想一想,要為誰提供什麼樣的服務吧!


考試主導的教育,逼你背誦無法改變的過去
程式設計的課程,教你開創無限可能的未來


作者資訊
李侑青
國立中央大學資訊工程博士
第七屆台灣省藥用植物學會理事長
田徑隊運動傷害防護教練
臉書:李阿青 (fcrdxesz@hotmail.com)

有著作權,侵害必究
本網站內所有資料之著作權、所有權與智慧財產權,包括內容、文字、圖片、聲音、影像、程式碼等均為李侑青所有或經作者同意合法使用。

沒有留言:

張貼留言