如何自學程式設計第二部分
前言
這部分是接著「第一部分」而寫,主要的目的是針對
與
兩個部分做比較深入的介紹,並且談到針對不同的開發項目在不同語言程式語言的情況。
雖說通用性程式語言 (general-purpose programming language) 能夠做各類應用,包括常見的 C 、 C++ 、 C# 、 Java 、 JavaScript 、 Objective-C 、 Perl 、 PHP 、 Python 、 Ruby 、 Swift 等等,不過能做各類應用只是種概念,真實情況則須看該程式語言實際的發展。
以 C 為例, C 是早期流行的高階語言之一,因此很多前輩都從 C 開始學,對 C 也非常的嫻熟,可是 C 也非常地接近硬體,實際寫 C 程式需要做非常多的記憶體管理,像是同樣寫 GUI ,用 Python 寫個 5 行2就能寫出個非常簡單的 Hello World! , C 的話,起碼超過 20 行3,還有別忘了,這當然包括 C 需要的記憶體管理部分。
原因出在語言風格跟程式庫上,懂得記憶體管理的觀念不是不好,可是每次寫程式都要寫記憶體管理的部分就顯得異常累贅跟繁瑣,所以新近的程式語言,如 C# 、 Java 、 Python 、 Swift 等,記憶體管理的部分就交給編譯器 (compiler) 或直譯器 (interpreter) 4 ,讓程式設計師能快速開發他們心中想要發展的程式功能。
快速開發在軟體界變成了顯學之一,另一個顯學則是讓完全初學者更容易學習及上手寫程式,無論如何都得先準備開發環境,這也是下個部分的主題。
準備開發環境
所謂開發環境就是指寫程式需要用到的工具,這些工具就是指某些電腦中的軟體,包括文字編輯器、編譯器、直譯器、整合開發環境等等,以上是基本的工具,如果要開發伺服器相關或網頁程式,那就需要需要額外準備伺服器軟體跟瀏覽器等等。
其中文字編輯器是指能將檔案儲存成純文字編碼5像 UTF-8 檔案格式的軟體,通常作業系統會內附文字編輯器,例如 MS-Windows 有記事本、 Mac OS 有文字編輯之類,程式檔案都是以純文字的方式儲存在電腦系統中,然而記事本或文字編輯對寫程式的功能並不充足,例如沒有行號也不能顯示語法高亮度6等,通常習慣用文字編輯器的開發者會去找對寫程式好用的文字編輯器,下表列出一些受歡迎的免費文字編輯器7。
名稱 | 支援平台 |
---|---|
Atom8 | MS-Windows, Mac OS, Linux |
Emacs9 | MS-Windows, Mac OS, Linux |
Notepad++10 | MS-Windows |
vim11 | MS-Windows, Mac OS, Linux |
以上這些文字編輯器都有語法高亮度跟行號顯示,語法高亮度對於判斷是否打錯關鍵字或程式庫內容很有幫助,行號可以幫助在編譯器或直譯器在除錯時找到錯誤發生的第幾行。
總之有非常多種文字編輯器可供選擇,找到一款自己用的順的就好。
然而文字編輯器只是用來打程式碼用的,程式執行還需要直譯器或編譯器,直譯式程式語言可由直譯器一行接一行去執行程式檔案的內容,以下為常見直譯式程式語言的列表
- JavaScript
- Perl
- PHP
- Python
- Ruby
- Swift
以 Python 為例, Python 的程式檔案副檔名為 .py ,假設已經有個寫好的 hello.py 程式,在命令列執行就簡單地打指令 python 加上檔名即可,如下
$ python hello.py |
編譯式程式語言則要用編譯器將程式檔案編譯成平台專屬的執行程式,以下為常見編譯式程式語言的列表
- C
- C++
- C#
- Java
- Objective-C
- Swift
以 C 為例,下面用開源免費的 GCC 編譯器編譯假設已經寫好的 hello.c 程式, GCC 編譯 C 程式使用指令 gcc
$ gcc hello.c |
然後在相同路徑下會產生執行檔, Linux 或 Mac 系統的預設檔名為 a.out , MS-Windows 系統的預設檔名為 a.exe ,這時候只要輸入該檔案名稱即可執行該程式,例如
$ a.out |
按下 return 或 Enter 鍵後,就能在命令列看到執行結果了。
由上可看出,直譯式程式語言跟編譯式程式語言最大的差別是少了編譯成平台專屬的執行程式,這是許多新興的直譯式程式語言如 Python 、 Ruby 、 Swift 等受到歡迎的主要原因之一,不外就是為了避免掉開發程式還要不斷加入編譯的動作,因為編譯頗耗時間,所以對程式若有要修改的地方,直接去修改原始碼即可,再直接用原始碼進行測試,如此可以省去不少時間。
可是沒有編譯成平台的原生執行程式也不是沒有缺點,因為得由直譯器執行程式,所以執行速度變成跟直譯器相關,若直譯器本身沒有設計好,像是解析語法上有缺陷,很可能會嚴重拖慢程式執行速度,相較編譯式程式語言能編譯成平台的原生執行程式,這是直譯式程式語言的主要的缺點之一。
其中特別注意到 Swift 這個新程式語言,官方提供直譯器跟編譯器兩種方式,也就是除了能夠用直譯器直接執行原始碼之外,也能用編譯器編譯成平台的原生執行程式,也就兼顧了開發及執行兩方面的要求,其他像 PHP 、 Python 也都有第三方開發編譯器,使之用其開發的程式能最終更快地去執行,因此就直譯式程式語言這項大缺點,近年來已慢慢有所改善了。
至於整合開發環境就是把文字編輯器、直譯器、編譯器跟基本的文字顯示結果整合在一圖形視窗軟體中,藉由該軟體便可直接進行編譯或執行等動作, Mac 或 Windows 都有官方提供的整合開發環境,例如下圖為 Mac 的 Xcode 12
如上圖可以看到 Xcode 跟文字編輯器一樣有行號及語法高亮度,按下左上角的執行鍵後,中間下方右側就會顯示執行結果13。至於每一種整合開發環境設置每個部分的方式可能不盡相同,所以無論選擇哪一種整合開發環境,都需要特別去熟習該介面。
雖說整合開發環境對初學者比較友善,通常整合開發環境也都整合好編譯器或直譯器等,這讓初學者不需要額外分開去找文字編輯器、編譯器、直譯器等,也不需要學習命令列操作等等,不過一旦用了整合開發環境,連帶就得要學習專案開發,因為在整合開發環境中,程式檔案多是以專案的模式來組織,另外繁雜的介面都需要花時間學習,當然使用整合開發環境也得好好學習下個部分的重點 ---------- 除錯。
除錯
除錯是準備好開發環境後,著手寫程式後的重點,一般而言,程式中的錯誤可分為以下三種
- 語法錯誤
- 執行期間錯誤
- 語意錯誤
直譯器或編譯器會直接檢查出語法錯誤跟執行期間錯誤。語法錯誤如打錯識別字或關鍵字等等,總之是直譯器或編譯器解析原始程式碼碰到不合乎常規的地方,就會暫停,直譯式程式語言會停止執行,編譯式程式語言會中斷編譯,進而顯示錯誤發生的地方。
例如以下的 hello.c 在原始程式碼中少打了分號,用 GCC14 編譯結果如下
$ gcc hello.c |
hello.c:4:28: error: expected ';' after expression |
printf("Hello, World!") |
^ |
; |
1 error generated. |
$ |
簡單講, GCC 告訴我們在第 4 行第 28 字元的地方少了一個分號,錯誤因此發生。
執行期間錯誤則是在執行期間發生的錯誤,像是要開啟檔案可是檔案不存在或是伺服器程式邀網址可是該網址無資源等等,這些都有可能會造成執行期間錯誤。
大部分程式語言把執行中可能會發生的錯誤視為例外,因而用例外處理來控制例外發生的情況,例如以下的 Java 程式
import java.io.*; public class FileDemo { public static void main(String[] args) { try { FileReader f = new FileReader("hello.txt"); BufferedReader b = new BufferedReader(f); String line = ""; while (line != null) { line = b.readLine(); System.out.println(line); } catch (IOException e) { System.out.println(e); } } }
Java 用 try 及 catch 進行例外處理,上例中所有檔案處理的程式碼都放在 try 後面的大括弧,如果有例外 IOException 發生,像是檔案不存在的情況,就會執行 catch 後面大括弧的程式碼。
至於最後一種語意錯誤是最麻煩的,因為程式會執行成功,執行完畢卻得到錯誤的結果,像我自己最近開發的程式把 += 只寫 + ,少寫了等號,其實本來是想要寫物體在座標系統中移動,這樣寫完反覆測試程式,物體完全沒有移動,結果花了我好多時間才找到錯誤,話說這就是語意錯誤最麻煩的地方。
註解及文件
註解是程式中附加說明的部分,用來簡要說明程式碼的功能,每一種語言都有專屬的註解方式,最常見的就是 C-Style 的註解模式,藉由 C 及稍後的 C++ 廣為流行後, C-Style 被後來的程式語言採用,分成跨行及單行的兩種方式,以下為跨行註解的方式
/* 這是跨行的註解 跨行註解可以用任意文字及編排 註解內容不會被編譯 */
也就是說,跨行註解是用 /* 及 */ 來標記,凡是在 /* 及 */ 之間的內容都是註解,編譯器不會把註解內容被當成程式碼解讀。
以下為 C-Style 單行註解的方式
// 這是單行的註解 a = 11; // 單行註解可以放在程式碼之後
簡單說,凡是 // 之後的內容都是註解,直到那一行結束為止。
除了 C 及 C++ 之外,採用 C-Style 註解方式的熱門程式語言有
- C#
- Java
- JavaScript
- Objective-C
- PHP
- Swift
C-Style 是最常見的註解方式之一,另外還有一種常見的註解方式,這種方式可稱為 Perl-Style ,顧名思義, Perl 流行後這種註解方式繼續被後來的程式語言沿用,以下為簡單例子
# 這是單行的註解 a = 11 # 單行註解可以放在程式碼之後
簡言之, Perl-Style 的註解方式就是單行用 # 。
除了 Perl 之外,採用 Perl-Style 註解方式的熱門程式語言有
- PHP
- Python
- Ruby
用什麼符號當註解的第一個字元,也就是用什麼符號標示註解的起始字元,這全都是該程式語言的規定,像 Visual Basic 用單引號當起始字元,以下是 Visual Basic 的註解寫法例子
'這是單行的註解 a = 11 '單行註解可以放在程式碼之後
每一種程式語言可能都不太一樣,這裡僅列舉些熱門程式語言的註解方式。
正因為註解是對程式碼的說明,每個開發開發團隊也都會有共通的註解方式,好讓團隊中的每一個人及後來新進的人能快速掌握程式碼的用途,不可否認註解的編寫在程式設計中是相當重要的一環,像是 Java 就提供了 Javadoc 的工具,讓程式設計師直接將 Java 原始程式碼中的註解轉化為文件。
閱讀程式文件同樣是相當重要的事情,編寫亦同,因為程式文件除了程式碼的功能說明外,通常會附帶簡單範例,幾乎所有程式語言都提供線上文件,可以在網路上直接查閱,例如以下為 Python 文件網站的截圖
Python 另外用三引號字串讓程式設計師直接在程式原始碼中編寫文件,這跟 Java 用註解不太一樣,示例如下
"""程式語言文件 第二行結束"""
每一種程式語言都有各自註解跟文件的模式,無論從哪一種程式語言開始入門學習,註解跟文件的編寫也是重要的一環。
程式碼撰寫風格
由於 C 是自由格式的程式語言,這是說程式碼編寫只要符合順序、識別字命名符合規範即可,其他想要怎麼編排都是寫程式者的自由,這讓承接 C 的程式語言如 C++ 、 Java 、 C# 等都沿襲這樣的自由格式。
自由格式當然好,問題是太過自由會造成團隊內或不同團隊間在溝通上的障礙,所以開發團隊往往會選擇一致的程式碼撰寫風格,除了縮排格數、命名習慣等等外,還包括了怎麼寫註解跟文件, Google 提供了他們建議的風格指南,如下連結網址
https://github.com/google/styleguide
裡頭包括 C++ 、 Objective-C 、 Java 、 Python 、 R 、 Shell 、 HTML/CSS 、 JavaScript 、 AngularJS 、Lisp 等各種電腦語言,這些文件採用創用 CC 授權,大部分都可在網路上找到中文版。
資料結構與演算法
如果是完全自學程式設計,沒有讀資訊相關科系,也沒有去上補習班的話,學到一定程度後,或多或少會聽說資料結構與演算法很重要,這兩者的確是真的非常重要,不過需要先了解到底什麼是哪個地方重要了。
先來談談演算法好了,所謂演算法是指解決特定問題的一系列特定步驟,像是摺紙或做菜都可以拆解成特定步驟逐步完成,這是說折一艘紙船就需要一套演算法,同樣的,煎一個荷包蛋也是一套演算法。
倒是演算法偏向是數學用的詞,畢竟裡頭含了一個「算」字。事實上絕大多數的演算法都沒有名稱,有名稱的通常是很有名的或流傳已久的,例如輾轉相除法的英文名為 Euclidean algorithm , 可以算出兩個整數的最大公因數。
換作程式裡的演算法,因為程式就是依序要求電腦執行的指令,每一道指令都能看做演算法中的一個步驟,也就是說,單獨一個程式就能當作一個演算法,甚至一個程式往往包含多個演算法。
以初學最常見的 Hello World 程式為例,以下是用 C 寫的程式
#include <stdio.h> int main() { printf("Hello, World!") return 0; }
簡單講,上面程式的作用只在命令列上印出字串 Hello, World! ,完成這項演算法需要三個步驟,其一
#include <stdio.h>
這是從標準程式庫中引進標頭檔 stdio.h ,其目的是為了使用 printf() 函數。其二
printf("Hello, World!")
這是呼叫 printf() 函數,利用此函數將參數字串印到命令列上。其三
return 0;
最後回傳作業系統整數 0 ,意思就是告訴作業系統這個程式已經執行結束。
這個 Hello World 程式本身就是在命令列上印出 Hello, World! 的演算法,此演算法用到了程式庫中的函數 printf() , printf() 則是另一個演算法,其目的是傳送參數字串到作業系統,由作業系統將參數字串顯示在命令列上。
也就是說,一個演算法中可以包含其他的演算法,單一程式可能由非常多種演算法組成。
既然程式就是演算法,那演算法的課程究竟在學什麼呢?有兩大重點,第一個重點是複雜度,第二個重點是策略,前者估算演算法的效率,後者的目的則是尋找最有效率的演算法。
總而言之,效率是程式設計中的一大課題,寫出有效率的的程式固然很重要,然而並不代表哪一種程式語言就能保證一定能寫出最有效率的程式,因為這牽動到採用哪一種演算法,除了演算法之外,資料結構也很重要,而且做同一件工作,像是排序好了,往往不同資料結構就需要不同的演算法。
什麼是資料結構呢?資料結構就是電腦儲存資料的模式,基本上每一種程式語言都有提供各自常用的資料結構,像是 C 提供陣列,舉例如下
int a[5] = {0, 1, 2, 3, 4};
這樣就有了名之為 a 的陣列,裡頭放五筆整數資料,每一筆資料都可以隨意更改,但都必須是整數,例如
a[1] = 34;
上面的程式碼是把索引值為 1 的整數換成 34 ,也就是原本的第二個整數 1 會變成 34 。
C 的陣列不可更改大小,這是說如果要儲存的整數變成 10 個話,就要用一個新陣列來存放數字,所以後來新興的程式語言如 Python 提供的串列,就提供了完全不通的操作方式,例如
a = [0, 1, 2, 3.0, "4"]
這樣就建立了名之為 a 的串列, a 中有 5 個元素,每一個元素都可用不同的資料型態,也可新增元素,例如
a.append(5)
利用串列的 append() 方法,整數 5 會直接附加到 a 之後成為第 6 個元素,下面則是在索引值 2 之前插入浮點數 1.5
a.insert(2, 1.5)
串列 a 就變成
[0, 1, 1.5, 2, 3, 4, 5]
雖然 Python 直接內建串列的用法,可是對其他程式語言來說,多半把好用的資料結構放到官方的標準程式庫中,因此學習使用程式庫的確是學習程式設計另一個重點之一。
使用程式庫與開發程式庫
大部分的教材或是前輩都會要初學者學一門程式語言,直到學完怎麼開發程式庫之後才開始學習使用程式庫,對初學者的真實情況卻是在剛入門的半年到一年間,因為搞不懂開發程式庫的部分,就是不知道為什麼要這樣做而一直撞牆,反而要到了學會使用程式庫之後,才慢慢懂得開發程式庫的道理。
有哪些是開發程式庫的部分呢?其實任何可重複利用程式碼都算是程式庫的部分,像是 C 的函數,例如以下的 sum() 函數
int sum(int a, int b) { return a + b; }
sum() 函數的功能非常簡單,就是回傳兩個參數的相加值,之後只要有需要都可以呼叫 sum() 來使用需要相加兩個整數的功能,甚至繼續把 sum() 寫進標頭檔,讓 sum() 成為自定程式庫的一部分。
C 中除了函數外,利用關鍵字 struct 定義的結構、 union 定義的聯合等都是可以重複利用的部分,因此這些都算開發程式庫的部分,不過由於 C 非常簡單,就算一開始就學這些似乎也不會嚴重撞牆,可是如果 C 跟 C++ 不分,學 C 的目的是為了接下來 C++ 的類別、樣板、命名空間等等,那就真的不太妙了。
C++ 之後發展的 Java 及 C# 為了讓程式設計師第一腳就踏入物件導向的領域,所以把程式當成物件來設計,這是說,任何 Java 或 C# 程式都得用類別來包裹,起手式就是類別,類別也就是物件導向程式語言程式庫中重要的組成,也就是說,初學者一開始就在學習開發程式庫。
從類別開始是 Java 或 C# 的設計哲學,本來沒有什麼好壞,倒是這種模式是否適合當成完全初學者的第一個程式語言,我相信已經有很多程式語言提出了不同意見了,像是 Python 、 Ruby 及 Swift 等都把很多功能直接內建,讓程式設計師能夠直接使用,相對於完全初學者而言,也就是先學會用這些程式功能,至於怎麼定義程式庫具備的功能,總之不急,後面慢慢再學就可以了。
簡單講,對任何工具都一樣,學會開發工具前都得要先學會使用工具,還不會使用工具就要先學會開發工具,就真的有點強人所難了。所以我對自學者的建議是先去摸索工具怎麼用,如果一開始是學 Java 或 C# 也沒關係,知道哪些是基本程式必要的,然後摸熟程式庫,無論是標準程式庫或第三方程式庫。
標準程式庫與第三方程式庫
標準程式庫是直譯器或編譯器官方隨附的程式庫,所以在使用直譯器或編譯器之時,標準程式庫已經包含在內,無需額外安裝。第三方程式庫係指不是由直譯器或編譯器官方開發支援的程式庫,換句話說,第三方程式庫是非官方開發團隊的自訂程式庫,他們通常會利用某些分享平台15釋出,例如知名的有
- SourceForge
- Git
使用第三方程式庫的主要缺點是需要自己下載安裝,不像標準程式庫在安裝好直譯器或編譯器之後就可使用,然而第三方程式庫的目的不外是為了延伸或補足標準程式庫中所沒有的功能,像是 Python 標準程式庫中內含的 GUI 程式庫為 tkinter ,這是跟 Tcl/Tk 連結的 GUI 程式庫,簡單易學,卻是有點早期的技術,換句話說, tkinter 大多只能做些簡單的桌機圖形介面。
所以對初學者而言,先要熟悉標準程式庫提供的功能,接著就是依需要去嘗試其他廣大的第三方程式庫了,真的沒有自己需要的,才著手開發自己需要的程式庫。
開發桌機圖形介面
幾乎所有熱門程式語言都有開發圖形介面的程式庫,因此如果想要開發圖形介面就需要去找相關程式庫,多數程式語言在標準程式庫內也都內建好可開發桌機的圖形程式庫,也有廣大的第三方程式庫供支援。
下表整理各熱門程式語言可以使用的內建桌機圖形程式庫
程式語言 | 內建圖形程式庫 |
---|---|
C# | .NET |
Java | AWT, Swing, JavaFX |
Objective-C | Cocoa |
Perl | Tk |
Python | Tk |
Ruby | Tk |
Swift | Cocoa |
下表整理各熱門程式語言可以使用的第三方桌機圖形程式庫
程式語言 | 第三方圖形程式庫 |
---|---|
C | GTK+, libui... |
C++ | Qt, wxWidgets... |
PHP | PHP-GTK, wxPHP... |
Python | wxPython, PyQt, Kivy... |
Ruby | wxRuby, Visual Ruby... |
各種第三方圖形程式庫都很多,族繁不及備載。在第三方桌機圖形程式庫中也能看到一個共通的現象,像是由 C 先開發出 GTK+ 這個好用的圖形程式庫,後面很多程式語言都是做對 GTK+ 的連結,其他像是由 C++ 先開發出的 Qt 、 wxWidgets 也有類似的情況。
簡言之,每一種熱門程式語言都有超過一種以上的圖形程式庫,其中需要注意一點,像 Visual Studio 或 Xcode 都有提供圖形視窗的設計工具,能夠用拖放的模式在視窗中放置視窗元件,例如下圖為 Xcode 的 Storyboard
實際上過去寫 GUI ,從視窗到視窗元件都是要自己寫程式才會產生,現在建立視窗元件的方式已逐漸改成用 XML 的方式,也就是用 XML 的方式來標記,再藉由 IDE 提供的工具來查看實際產生出的視窗,像是 Qt 用 QML , Kivy 用 kv language 等等。
其實 HTML 就是 XML 的一種簡化版本,如果略懂 HTML ,那要熟悉 XML 也不會是太難的事情。不管用哪一種程式語言開發桌機圖形介面,總之先找到自己想要的圖形程式庫,接著就是學習怎麼使用該程式庫囉!
開發行動 App
現在有兩大行動平台,分別是 iOS 及 Android 。
對開發 iOS 而言,理想情況是用 Mac 電腦及 Xcode ,程式語言可以選擇 Objective-C 或 Swift ,而對開發 Android 的理想情況則是用 Android 官方的 SDK 或是直接使用 Android Studio 。
話說行動 App 跟桌機應用程式的英文都叫 application ,換言之行動 App 跟桌機應用程式最主要的不同點是套用的作業系統不同,因此某些需要用到的系統服務也不一樣。以 MVC 開發模式來講, M 在兩者間可以完全一模一樣,差別就在 V 跟 C 需要依個別需求來設計。
某些程式語言的圖形程式庫也能開發 iOS 或 Android 系統,像是 Python 有 Kivy , C# 有 Xamarin , C++ 有 Qt 等等,這些程式庫就是做了橋接到原生 iOS 或 Android 程式庫的功能,因此能夠用這些語言及程式庫來開發行動 App 。
說來沒有哪一種方式一定好,總之開發行動 App 也存在多種選擇就是了。
網站前後端
除了桌機應用程式跟行動 App 外,開發網站常常也是學習程式設計者感到興趣的部分,需要認識的是開發網站分成兩個部分,第一個部分是使用者看到的客戶端,第二部分則是網站經營者需要掌握的伺服端。
客戶端又稱為前端,這部分由網頁瀏覽器來執行,主要由 HTML 、 CSS 及 JavaScript 交織而成,所以如果要學習開發前端部分,就需要分別學習 HTML 、 CSS 及 JavaScript 。
基本上兩者裡只有 JavaScript 是程式語言, HTML 是網頁呈現的標記語言, CSS 是樣式表語言,由 HTML 及 CSS 控制網頁的樣貌,而 JavaScript 可控制 HTML 及 CSS 之間的互動,例如滑鼠游標移到某個圖片上,該圖片呈現放大效果之類的情況,另外就是網頁跟伺服端的互動也可由 JavaScript 控制。
那除了這三者之外有沒有其他技術呢?有的,微軟先後推過 VBScript 、 JScript 及 TypeScript ,但都遠不如 JavaScript 的普及,換言之,諸如 VBScript 、 JScript 或 TypeScript 等大都只在微軟的瀏覽器上支援。
另外還有像 Flash 或 Java 、 ASP 之類的網頁,這需要依賴相關外掛程式來執行,嚴格說 Flash 因為安全性是快要被淘汰的技術,至於後兩者其實沒有算很普遍,即便採用 Java 或 ASP 開發網頁,仍是需要學習 HTML 、 CSS 及 JavaScript 的相關知識。
所以 HTML 、 CSS 及 JavaScript 是構成 HTML 5 技術的主要成分,HTML 5 也是現在網頁設計的主流。說起來 HTML 、 CSS 都很簡單,怎麼樣的美感設計是重點,而 JavaScript 由於是程式語言,如果不想每一個地方都自己從頭開發(自己發明輪子),也能找到龐大的各類程式庫可供利用。
至於伺服端又稱為後端,這部分就有很多種程式語言可供選擇了,像 PHP 原本就是以開發伺服器聞名的程式語言,其他像 Python 有 Django 、 Ruby 有 Rails 等,這些都是能快速開發網站伺服器的框架,也就是程式庫。
需要了解的是後端跟前端是很不一樣的,前端的舞台是瀏覽器,後端的舞台則是伺服器軟體,所以想要學習開發後端,也得要學習架設好伺服器軟體,有些程式語言如 Python 在標準程式庫中提供了簡單的伺服器應用,可以在命令列打以下指令
python -m SimpleHTTPServer |
這樣打開瀏覽器輸入以下網址
http://127.0.0.1:8000 |
瀏覽器就會自動尋找並開啟相同目錄下的 index.html 了。
把前後端合稱就變成全端,想當全端工程師嗎?以上列出的僅僅是最基本的認識,前端有一大堆 JavaScript 程式庫需要認識,後端也有各種開發技術,就需要好好花時間研究唷!
平台問題
很多程式設計自學者學到一個程度後,或多或少會有個疑問,就是我能在 MS-Windows 開發 Mac 的應用程式嗎?或是我能在 Mac 開發 MS-Windows 的應用程式嗎?畢竟無論在 Mac 或 MS-Windows 上都能開發 Android App 。
一般的認識是在任何桌機平台上只能開發該桌機平台專屬的應用程式,如果想要在某一桌機平台開發其他平台的程式,就得看有沒有程式庫支援了,像是 Android 就是官方提供編譯器及模擬器,所以在 Mac 或 MS-Windows 上都能開發 Android App 。
所以關鍵是有沒有支援的程式庫了,就我所知,目前任一的桌機作業系統,常見的如 MS-Windows 、 Mac 、 Linux 等,除了 Linux 大都可互通外, MS-Windows 或 Mac 都需要專屬的程式庫,這專屬的程式庫只能在 MS-Windows 或 Mac 上使用,因此如果同時要開發 MS-Windows 及 Mac 、 Linux 的應用程式,最好還是各種作業系統都準備囉!
結語
學習程式設計到一個進度後,可能會覺得很無奈,主要原因不外是程式庫的選擇太多,新技術或新的程式庫又不斷的冒出來,讓人無所適從,不知道是不是該全部都學呢?
這問題的答案很簡單,先認識有哪些東西就好,至於要不要精熟則看需求而定,像是加入某個開發團隊後,需要學習該開發團隊編寫文件及註解的風格,也需要使用該團隊用的開發工具及程式庫等。
就拿開發遊戲來說好了,幾乎各種程式語言都有專門開發遊戲的 2D 或 3D 程式庫,例如 Python 有 Pygame 、 Swift 有 SpritKit 等,若是從 Python 或 Swift 起步學習程式設計,對遊戲開發有興趣的話,自然就能直接接觸這些相關的程式庫。
然而很多手遊團隊用的是 Unity 或是 Unreal 等遊戲引擎,主要使用的程式語言前者是 C# ,後者則是 UnrealScript ,這是說,使用 Unity 就需要懂得寫 C# 程式,同樣使用 Unreal 就需要懂得 UnrealScript ,問題是如果起步初學的程式語言不是 C# 或 UnrealScript 的話,例如 Python 或 Swift ,那想要使用 Unity 或 Unreal 就得要學會 C# 或 UnrealScript。
所以有需求再學就好囉!或是對不熟的程式語言、陌生技術或程式庫有興趣也能學,總之有興趣都可以學,然而不管怎麼樣,新的硬體會不斷的出現,新的軟體技術也會不斷的冒出來,時代會一直演進下去,科技日新月異,軟體相關方面不外是進展最快的技術之一。
不怕犯錯,願意不斷持續學習,我想就是程式設計這條路所需要最重要的心態了。
中英文術語對照 | |
---|---|
編譯器 | compiler |
直譯器 | interpreter |
通用性程式語言 | general-purpose programming language |