前言:
這個專欄 Code & Programming 編碼與程式開發,是整理我這門外漢進入資訊領域的自學資料,畢竟不是本科出生,只是幸運生在資訊時代,網路上一堆善心人士提供很多免費的資訊,讓所有有興趣的人都可以進入程式開發的殿堂,我的學習過程是很沒有秩序的,東撿西撿才慢慢理出個頭緒,我想正規學習會有一套更完整的訓練方法,但我也沒打算在這裡當名師,而且這些資訊也是免費的,大家有興趣就自己加減看看吧,有幫助的就拿去,不用錢。畢竟我其實也發現,程式開發真正值錢的,其實還是應用的創意。放在這裡的資料,對初學者來說,頂多就是個符號表而以,連字典都稱不上。但有一些入門的過程,認識這個知識領域的方法,或許多少對像我這種自學的人可能有幫助,我是說,可能吧。我沒有什麼教學的熱情,我覺得學習這種事是很私人的,我一直覺得國民教育只要完成六年的小學教育就好了,就是好好地把孩子的基礎知識教好,有生活能力即可。剩下的,放他們多一點時間去自我探索,可能會比坐在教室來的有效,我自己是很支持自學教育的。而程式語言,我覺得就是非常適合自學的一門領域。 歡迎大家交流。
我小學五年級的時候,姑姑買了家裡第一台電腦,那是我第一次看到螢幕鍵盤滑鼠,系統還是Win 3.1的時代,要用DOS指令進入電腦的執行畫面然後才會切到有所謂的桌面的操作平台。我在講的這些東西,可能跟我同年次的才會知道,畢竟已經是二十年前的骨董了。那時候的我不算是真正進入資訊世界,因為就只是拿來打電動而以,而且電腦也不是我的,又非常昂貴,姑姑買了電腦和印表機跟一大堆安裝磁片,身為家庭主婦的她花很多錢去學習新東西,也意外打開了我對資訊世界的探險。我跟她借了很多資訊的書,照著書上用鍵盤輸入英文字和數字,電腦會跳出東西,覺得好興奮,電腦會回應我,當時就已經顯露了科技阿宅的特質,只是我不自知。
前面那些話要表達的就是我本來就有興趣,但我想一般人並不想聽我個人的興趣,我這個比較直白,我也不想說那些高大尚的廢話,單刀直入地說,學程式開發其中之一的好處就是收入還行。看右圖2020年的某網站軟體工程師的薪資分布[2],軟體工程師就是有程式開發能力的科技人才,在舊金山的這個地方,以Level 5的職及,薪資中位數年薪大概是18.9萬美金.,折合台幣差不多五百六萬吧,扣完稅應該還是有四百多萬台幣可以花,這筆錢可以讓你買車,買房大概也只要差不多十年一定可以清償房貸,而且事實上,這些應該只是底薪,不包含公司給的股票和其他獎金等福利。Apple, Google這,Facebook些大公司,給有五年經驗的工程師, 年薪都超過千萬台幣,我想這樣的數據,應該夠直白了吧。為什麼要學? 除了有興趣之外,我想收入是一個誘因。好處是這些工作可以遠端在家產出,也能因應疫情後的世界趨勢。
圖1-1[1] 舊金山的軟體工程師薪資中位數
所謂編碼(Code),就是要跟電腦溝通的一種文字符號或指令,讓電腦去根據這些文字符號或指令做出相應的動作。舉個最簡單的例子,大部分的程式語言都有一個叫做「Print」的指令,就是印出來的意思。
至於什麼是演算法(Algorithm),我想用圖2-1來做一個概略的解釋可能會比較清楚,演算法是一個把我們手上有的資料(data)輸入一套有邏輯的編碼做運算,這些資料(data)經過運算後會根據這套運算邏輯產出結果。例如下面這個例子:
a=3
b=8
c=a+b
d=a*b
我們告訴電腦說,a=3,b=8,a跟b在這裡就是一個資料(data)的概念,然後我們指定給電腦一個運算邏輯,說c = a + b(a加上b) 或 d=a *b (a乘以b),c 和 d 因為這樣的編碼運算,跟a 和b產生了關係,而c = a+b 或 d =a x b,我們也可以說這是一種很基本的演算法(Algorithm)。 因此經過這樣的演算法,我們輸入了a=3, b=8,c就會等於a+b ,也就是c =3+8 =11,11就是經過演算法輸出的結果。
而程式設計(Programming),就是將有秩序,有組織的資料從存放的電腦裡面拿出來,讓電腦依照演算法的流程去運行,做出我們期望電腦執行的完整動作。例如:
a=3
b=8
c=a+b
print c
我們已經從前面知道c=3+8=11 ,這裡又多了一行print c,就是命令電腦依照這行指令去執行印出 c 這個結果的動作,最後電腦會顯示11這個數字。上面四行編碼的整個過程,就可以說是一個非常簡單的程式設計了,圖2-2簡單的說明資料和演算法與程式設計的關係。然而程式設計有許多不同的程式語言(Programming Language,見圖2-3),不同的程式語言有時候是具有同樣的軟體開發功能,也有不同的指令碼,概念上有點像是畫畫可以用不同性質的畫筆但都可以畫出同樣的風景,只是表達同樣的素材,用哪一種畫筆或塗料最適合就看畫家想怎麼去建構這個作品,畫國畫最適合用毛筆,但你要用水彩筆也不是不行,只是筆觸的用法會有一點不同。不同的程式語言大概就像是不同的畫筆這樣的概念。
圖2-1 演算法(Algorithm)
圖2-2程式設計(Programming)
圖2-3 程式語言(Programming Language)
筆者本身不是電腦科學工程出身,第一次接觸所謂的編碼code,看到一堆英文字組成的指令,胡亂的複製貼上然後看到這些編碼經過有邏輯的排列後產生效果,是從網頁設計編輯開始。當年還是高中生的我,對於這些符號一知半解,但網路上已經陸續有了一些免費的教學資訊,那個時代還是Windows 95的光輝時代,Google搜尋引擎才開始熱,那時候我只單純的接觸網頁設計,開始進入所謂的編碼工程。但都是很粗淺的編碼,網頁設計初階入門其實不需要太深入的程式設計,但透過編輯個人網頁,可以幫助初學者了解所謂的編碼性質。等到網頁功能需要更進一步的完備,比方說需要導入一些訪客計數器,留言板,報名表,討論區,甚至像是線上訂餐系統這樣的功能,需要有統計,報表,自動回覆這類的數據管理的時候,就會開始進入程式設計進階領域。我認為學習程式設計需要一個動機,從網頁開發這個地方入手,去建造自我學習成果的展示平台,是一個很好的開始。搜尋的關鍵字是HTML網頁開發,我想在Google上 搜尋這個關鍵字,應該可以找到許多題材和教學網頁,這些資料會帶領初學者了解網頁的架構,從使用者,到前端,後端開發,我們就會由淺入深的從標記式語言進入真正的程式設計領域,而平常耳熟能詳卻又不了解的程式語言名稱諸如JavaScript,Python等等,就會透過這樣的開發目的,慢慢接觸到,下面用圖3-1來解釋網頁前端後端以及所應用到的程式語言之間的關係,對我來說,前端就是把最直觀的資訊建構出來,後端就是當我們除了直觀的資訊,如留言,圖片等等以外的資訊,需要做後續的資料處理的,就需要進一步的架構後端的系統,圖3-2概列了一般網頁建置會需要用到的程式語言,前端程式語言諸如HTML,CSS等,對初學者來說其實算是容易上手的低階語言,後端程式語言如JAVA,PYTHON等,也廣泛使用在網頁以外的其他領域,大家可以上網查詢這些關鍵字搜尋自己需要的,其他的這裡就不贅述。
圖3-1 網頁架構關係
圖3-2 架構網頁可能需要學到的程式語言
一個熱愛音樂的人,就算沒有念過音樂系,沒有學過鋼琴,給他一部鋼琴一本生日快樂歌的琴譜,如果他願意用心去推敲每個琴鍵,然後回憶自己曾經聽過的生日快樂歌,再回頭看看琴譜,我相信只要不是音癡,一定會在這個反覆練習和推敲的過程中學會看懂琴譜,並進而了解每個高低音符號,之後就會閱讀其他的琴譜,對應鋼琴的琴鍵位置,然後模仿彈奏新樂曲,熟練之後,甚至可以自行創作編輯新的樂譜。程式學習也是一樣的概念,只要不是白痴,能看得懂文字,網路上有無限的學習資源可以參考,跟你念什麼科系,有沒有背景都沒關係。如果一個人可以靠念四年大學取得一個專業學位,那你現在靠四年不間斷學習應該也可以成為電腦資訊領域的專家。
程式在科技領域被定義在軟體範疇,電腦滑鼠等設備被定義在硬體設備,硬體和軟體的關係,就像是鋼琴和樂譜。鋼琴是硬體,就像我們用的電腦,樂譜是軟體,就像上面所描述的各種程式語言製作出來的軟體工具,經過電腦的執行,可以展現這些軟體的功能。我會建議沒有電腦科學基礎的人,可以先了解關於電腦計算機的基礎知識,這裡推薦台大教育發展中心開設的計算機概論,是一套網路開放的教學課程,從電腦如何儲存資料開始介紹,中間可能有許多生硬的資訊字眼如二進位,邏輯元,運算子,但這些就是上網google大概查找一下就可以慢慢理解。下一章我會詳列一些我覺得可以幫助初學者進入程式學習的參考資料。
除了第四章所提到的台大線上免費課程,下面的幾個連結是我覺得可以自學參考的資訊,因為我個人實在不喜歡複雜的廢話,所以下面這些免費的付費的資料,都是我自己有接觸了解過,認為花時間下去聽講和學習不會損失太多初學者的時間。如果英文不錯的人,也可以從史丹佛大學提供的免費課程下手,下面這個連結是他們放在線上的影片學習資料,老師從影像處理的角度去帶領學生認識電腦科學和程式設計的奧妙。你可以修習免費課程不用繳錢,也可以繳錢去上然後學完通過認證拿到一份學習證書。這是一套在美國蠻有名的入門學習課程。
如果你是一定要老師邊講邊帶一步步細講,還要跟老師做學習後互動的,可以付費學習下面這個課程。這個講師劉彥劉嚥全帶領的教學風格深入淺出,基本上很難學不會。而他這套課程是Python,是時下蠻廣泛應用的程式語言。我基本上花一周左右的時間上完後就可以完成一套測試程式開發。
在我學習程式設計的過程,我發現很多人都不是電腦科學畢業的專科領域,表示這門知識,其實就像早期智慧手機剛出現的時候,就算是阿公阿嬤,教他們使用,他們發現好用,習慣去用,也就上手了。這裡推薦一個叫做YC的軟體工程師,他是哲學系畢業的,現在也是老手,我想應該夠證明文科畢業也能學習程式。人家哲學系畢業也是軟體開發箇中翹楚。另外我也推薦Mike的網站,他也算是自學成精的程式開發工程師,在他的網站也分享了許多功能是我在製作我需要的功能過程中常常可以找到答案的地方。
當程式學習到一定的基礎,我會建議大家建立自己的Github帳號來管理自己開發過的程式,那會是專屬於你個人的程式開發履歷,也是程式版本管理非常好用的工具。所有學習程式從入門到進階的開發者幾乎都會使用Github做程式開發的管理。可以參考這篇文章: 工程師必懂的版本控制技術。
關於編碼與程式設計開發這個專題我就先講到這邊,相信光是上面提到的資料,也足夠有興趣的朋友學上一段時間,我的目的是從網路上琳瑯滿目的資訊裡挑出我覺得最不浪費時間的學習資源去著手,至於能領略多少,也就看每個人投入的熱情和時間。我是一個支持自主學習的人,也支持資訊分享,靠著主動學習,假以時日,從新手成為專家不是難事。