2020年10月27日

【程式學習】哈佛CS50x學習筆記_Week1:C語言

that wanaka tree
寫了第一個C語言程式後,感覺自己都變得像是專業駭客一樣聰明了

 *本文是CS50x的中文學習筆記,是原課程的筆記補充,建議先看完課影片,將原課程筆記與本文對照閱讀。由於是學習筆記,裡頭記載的知識可能有誤,請小心服用。

Week0的課程只是小菜,Scratch雖然是完整的程式語言,但是大部分被拿來當教學用,要學真正的程式語言,還是得從基本學起。
所以這週從C語言開始,據聞如果能夠理解C語言,基本上學什麼語言都能夠快速上手,一起來學吧!
不過如果你是超新手,在這個階段會面臨很大很大的挫折,你會無法理解,然後開始懷疑人生。這都是很正常的,因為有太多資訊要記,所以放寬心,一點一點地接觸,熟悉了就不會再害怕了。基礎的程式語言真的非常非常簡單,只是量太多你一下子記不住而已。所以雖然cs50x是9週課程,但是其實你大可以花12週、16週、18週(我自己也打算這麼學),重點就是靜下心,大量練習
此外,我建議練習時,不要複製貼上課程筆記裡面的語法,請自己一個字一個字打上去,增加熟悉度。如果遇到有不懂的語法,請先自行Google。在初學者等級時遇到的問題,基本上都能在網路上找到答案。
你可以參考胡立的在2017年的解說影片,內容可能與2020年的課程有些不同,但是大致上概念相同。
C語言
如果你有好好地玩過一次Scratch,對於C語言就不會那麼陌生。因為兩者其實很類似。
that wanaka tree
點擊綠旗會說hello, world

這段程式碼是同樣的行為。
程式碼最上方的#include <stdio.h>是一個工具箱,它稱為前置處理指令 (preprocessing directive),所以就是把 stdio.h 這個工具箱(在安裝編譯器的子資料夾下) 放在原始程式的最開頭,那麼電腦就可以執行stdio.h定義的指令。比如說你的電腦不認識什麼叫做printf函式,執行#include <stdio.h>,你的電腦就會去找stdio.h工具箱裡的工具,然後它就會知道printf的意思,是要把括弧裡面的字串印出來。
在Scratch裡面,要點下綠旗才開始執行程式積木。這個動作有一點類似int main(void)這串,每個C語言程式的開頭都會有這串,可視為程式的進入點。int就是整數integer的意思,意思是程式執行完後,會回傳一個整數給系統。
那main(void)裡的void是什麼意思呢,void就是虛無、空白的意思,意思是在main()裡面不要放入任何參數。
printf指print,f是formatted的意思,就是會按照格式印出來。最後結尾會用一個 ; 符號,代表程式結束了。這個結尾符號超級容易忘記放,所以執行程式發生錯誤,要趕快檢查一下是不是忘記放結尾符號。
在Scratch平台,可以透過圖形化執行你的程式。我們如何執行C語言呢,CS50x提供了一個C語言沙盒,你可以不用在你的電腦安裝C語言環境。
*裝語言環境這件事,一開始也是讓我感到疑惑,語言環境到底是什麼意思呢。我現在對於此事的理解是,因為電腦只懂得2進位,所以我們必須告訴電腦C語言每一個符號代表的意思,電腦該如何執行。這個東西就叫做語言環境。所以不管是C語言、Python,或是JavaScript,都要安裝對應的語言環境。你也可以直接安裝IDE,也就是整合開發環境,把常用的語言環境一口氣裝一裝。例如Visual Studio、Visual Studio Code、Sublime Text、ATOM、Jupyter。因為這裡你要學C語言,所以如果你要在你自己的電腦執行C語言,我推薦Visual Studio。至於要怎麼在Visual Studio執行C語言,可閱讀這篇文章
進入CS50沙盒後,首先看到底下畫面。

that wanaka tree
直接按create就好

that wanaka tree
要開啟一個新程式,就在上方按+

that wanaka tree
新創一個C語言檔案,副檔名就叫c,然後按「Create File」
that wanaka tree
輸入程式碼之後,按一下旁邊資料夾圖案

that wanaka tree
可以看到這裡有一個檔案叫hello.c,接著我們在底下的終端機(terminal)編譯這份檔案,不然電腦看不懂
that wanaka tree
首先我輸入ls,確認這裡有一份檔案叫hello.c,輸入clang hello.c 會產生一個a.out的檔案,clang意思是c language,a.out意思是組合輸出(assembly output)的意思。這裡面的檔案就是2進位的檔案,專門給電腦讀的。接著你輸入./a.out,就會執行這個檔案。

*你在終端機輸入的這些指令叫做command line,如果你使用的是Windows 10,可以在下方的搜尋欄直接輸入power shell,按下Enter,這就是你電腦裡的終端機,你可以在這裡直接跟電腦溝通。你之後勢必要學習command line的,不過現在可以先跳過。
噠啦,你寫了你的第一個C語言程式。
你可能會注意到printf("hello, world\n");,裡面的\n不知道是什麼意思。\n就是換行的意思。如果沒換行,游標會停在hello, world後面。要注意\n必須在引號""裡面。
在終端機使用clang hello.c會自動產生a.out的檔案。如果你想取新檔名呢?每次都叫a.out,這樣會搞混。簡單,你可以輸入clang -o hello hello.c,意思是編譯成hello這份機器碼,然後把來源檔案hello.c放在最後。你也可以直接輸入make hello,就是要把hello.c編譯成hello機器碼。
*由於C語言是編譯式語言,所以每次都要要依賴編譯器(compiler)將程式編譯成機器碼。這樣的好處是執行速度比較快。我第一個學會的語言Python是直譯式語言,不需要編譯器,在執行時會一行一行編譯,速度會稍微慢一點,好處是可以馬上測試,就會知道有沒有哪邊打錯。
接著試試看另一個常用的scratch程式積木

that wanaka tree

這個積木會詢問你叫什麼名字,當你輸入名字後。你的名字會儲存在answer這個變數裡。如果我輸入我的名字Kai,接著會印出hello, Kai。
我們把上面的積木改為C語言。
首先你會注意到多了一個cs50.h,這是因為課程在教學時,教師發現可能會需要使用一些常用的函式,所以乾脆都寫在cs50.h這個工具箱裡面,你在沙盒裡面可以直接使用,但是如果在本地端就無法使用哦!所以先用沙盒學習就好了。
string是指要把name這個變數定義為string。提了這麼多次變數,變數(variable)是什麼意思?變數就是一個記憶體空間,可以把它視為一個盒子。string name就是說我要把這個記憶體空間取名叫做name,然後這個空間我要拿來放string,也就是專門用來儲存文字符號。
*要注意如果把整數定義為string,電腦也會視為string。例如我們若把 5 定義為string,要把這個 5 跟 3 相加,就不會變成 8 。因為這邊的 5 視為文字。
這裡的=不是「等於」的意思。在程式語言裡,=是指將右邊的值,賦值給左邊。如果我們把=右邊的get_string("What's your name?\n");,視為一個物體,然後把=左邊的name,視為標籤,則=就是把name標籤貼在物體上的行為。那如果要表示「等於」怎麼辦,那就直接用兩個等號:==。
在printf()函式裡面的範例,長得跟前面的範例不太一樣。%s叫做placeholder,它有各種型態,如%c、%f、%i,對應到不同的資料型態。使用方法就是放在引號裡面,然後在引號外面逗點,再寫上你要放的變數。
*資料型態是學習程式語言必須要知道的知識,程式語言裡,記憶體可以儲存的資料型態有下列幾種,例如string(文字)、bool(True或False)、int(整數)、float(含有小數的數字),其他還有好幾種,請見原課程筆記。
因為我們有加入新的前置處理指令cs50.h,C語言預設沒有這個,所以要在終端機編譯的話,得在命令行裡輸入 clang -o get get_string.c -lcs50 ,最後面的-l,是for link的意思。就是要把cs50.h跟此檔案連結起來。不過也可以直接輸入make "檔名",就會自動連結。
加數字
接著來說說一個對新手很疑惑的語法(至少我當初很疑惑)。

that wanaka tree
將變數counter設為0

that wanaka tree
counter每次迴圈都+1

如果你仔細閱讀過上面的文章,第一行的int counter = 0;應該不難理解,就是把一個記憶體取名counter,定義為int整數,然後賦值為0。可是第二行是什麼東西?
基本上你比較少會看到counter = counter + 1;的呈現方式,一般來說你會看到counter +=1;或者counter++。這個意思是把counter+1的意思,通常是搭配迴圈一起使用,所以counter才會一直+1,就可以數數啦。
迴圈與條件運算式
接著介紹幾個常用的迴圈與條件運算式。
無窮迴圈:
要關掉無窮迴圈,直接按ctrl+c即可。
這個迴圈的意思就是,當while裡面定義的事情為真,就會一直執行裡面的程式。那如果裡面定義的事情為假呢?就會停下來。
while迴圈也可以寫為有限迴圈。
while()裡面要放布林值,也就是問True或False。當某個情況為真,裡面的程式就會不斷執行,所以每次迴圈都會先檢查是否為真,再執行。while迴圈可以用在你根本不知道要跑幾次迴圈的情況
do-while迴圈
跟上面的迴圈很像,他會執行大括號裡面的程式,然後確認while裡面的布林值是否為真。
兩者有何不同呢,至少do-while迴圈會執行一次,一般的while迴圈,如果檢查為假,就不執行了。do-while迴圈用在你至少想跑一次迴圈的情況
接著示範上面說的加數字,在程式碼裡是這樣寫的。
while裡面是布林值,因為我一開始設i=0,然後每次都會檢查i是否小於50,答案當然不是嘛,所以就會執行程式。程式第二行的i++,意思是i要+1。接著程式會回到while去檢查布林值。反覆這樣50次以後,當i=50,程式就會停止。
for迴圈
for迴圈跟while迴圈很像,兩者也能混用。不過主要是用在你已經知道要跑幾次迴圈的情況。for裡面的函式,意思是把一個記憶體空間取名為i,i宣告為int整數,i小於50,每次執行完,i+1。所以這一個迴圈,也會跟上面的while迴圈一樣,列印50次hello, world。
if...else條件運算式
if...else條件運算式,用中文念起來就是:如果怎樣,就執行某程式,反之如果怎樣,那就執行另一段程式。else if專門用在if後面,如果if裡面的布林值為假,就跳到else if,看看裡面的布林值是否為真,假設還不是,那就執行else。else都是放在最後,代表說上面的都沒有的話,那就執行最後的式子。
課程筆記中有許多範例使用了上述的迴圈及條件運算式,請盡量去試著做看看。
巢狀迴圈
對於新手來說,巢狀迴圈(nested loop)會有點棘手,不太好理解,這部分得花一些時間。
巢狀迴圈,就是指在一個迴圈裡,還有一個迴圈。
課程舉的例子其實很好理解,所以在這邊我不用課程舉的例子,另外用台灣人熟習的九九乘法表示範給大家看。
結果如下:

that wanaka tree

在第一層迴圈裡,i會從1跑到9。
在第二層迴圈裡,j也會從1跑到9。
所以當i = 1時,i會分別乘上1、2、3...9;當i=2時,i繼續分別乘上1、2、3...9,以此類推。
這部分一定要試試看才知道,建議多練習幾次。
不精確的浮點數
電腦需要仰賴記憶體來儲存資料,然而記憶體的容量是有限的,因此程式語言在設計上,也會限制儲存容量。這個問題導致浮點數運算時,在小數點後會有奇怪的數字。
例如底下這個例子:
首先說明一下%.50f,意思是那裡將取小數點後50位。
如果我們設x = 1, y = 10時,執行結果如下:
x: 1
y: 10
x / y = 0.10000000149011611938476562500000000000000000000000
奇怪,電腦壞了嗎?x / y不是應該是0.1嗎?後面那串是什麼?如果是取小數點後50位,也應該是0.10000000000000000000000000000000000000000000000000啊。
這裡就要先來談基本的數學概念了。浮點數是什麼意思?
整數我們都知道什麼意思,例如12塊蛋糕,這個12就是整數。
我們拿出其中一塊,切成4等分,每份就是0.25塊蛋糕,如果我們切成8等分,就是0.125塊蛋糕。理論上我們能夠無限制一直切下去。
然而就像是前面提到的,電腦的記憶體有容量極限,可是浮點數卻可以無限地分下去,那怎麼會有空間容納所有浮點數呢?
所以就有了一個IEEE 754的浮點數運算標準,就是一個大家說好的標準,透過這個標準,大家有一個準則來計算浮點數。
詳細要解釋IEEE 754太複雜了,況且我也不是很清楚,還是回頭來講為什麼浮點數運算會有不精確的情況。根據我閱讀相關文章的理解,浮點數運算的問題,出在10進位與2進位之間的轉換。
比如,5的2進位計算方式是2² + 2⁰,表現為101。
that wanaka tree

那5之後如果有小數點,例如5.5呢?計算方式必須將小數點乘以2,一直乘到小數為0,且依序由上往下取出整數。用說得太模糊了,直接計算在下面給大家看。
that wanaka tree

0.5換算成2進位,其運算方式為0.5*2=1.0,取小數點前的數字1,做為2進位小數點後的第一位。
因此,5.5的2進位是101.1
再來一個,5.25

that wanaka tree

小數點後的第一位:0.25*2=0.5,取0
小數點後的第二位:0.5*2=1.0,取1
5.25的2進位是101.01
那5.7呢?
that wanaka tree

小數點後的第一位:0.7*2=1.4,取1
小數點後的第二位:0.4*2=0.8,取0
小數點後的第三位:0.8*2=1.6,取1
小數點後的第四位:0.6*2=1.2,取1
小數點後的第五位:0.2*2=0.4,取1
...
...
可以看出0.7在轉換成2進位的過程中,會變成無限循環的小數。所以這就造成了在電腦裡運算浮點數,會造成錯誤的原因。
整數逸出
整數逸出(integer overflow)跟浮點數計算出錯的問題很相似,都跟記憶體不足有關。我們先看課堂的示範。
如果你有照著課程示範,自己實作一次,會發現這個語法就是把數字以等比級數的方式,不斷地乘以2上去,sleep函式就是讓程式停一秒,避免一下就爆掉結果你不知道發生什麼事。
所以這個程式不斷執行,到了1073741824就出錯了。請記得按ctrl+c終止。
怎麼會這樣?前面說到小數點後的數字因為能夠無限切下去,所以如果有循環小數就會出錯。同樣的整數也無法無止盡地加上去,記憶體也無法容納。你可能覺得不太對勁,不是啊,我的電腦記憶體明明就有32G,好啦扣除系統、Spotify或者一些其他零零總總在背景執行的程式,至少還有16G以上吧。結果跑到1073741824就給我當掉了,怎麼回事?
原因是C/C++語言是以32位元來設計的,不管你系統是不是64位元,或者記憶體有多大都一樣。所以如果數字超過32位元可以容納的範圍,程式就會出錯。
假設我有一台電腦是4位元的,數字最大只能從-7到+7,然後我用等差級數的方式,計算數字,直到7。
that wanaka tree
算到7,剛好每個位元都填滿
那8呢?
that wanaka tree
8無法正確地轉換成4位元的有號數(有正負符號的),所以就變成0。

作業
作業有兩個,一個是畫馬利歐兄弟裡面的磚頭,一個是檢查信用卡是哪一家的,然後是不是有效的卡片號碼。
他們的難易度又分成簡單與困難兩種,我挑困難的來寫,畢竟都學了快一年的Python了,總是有點基礎。
如果你真的想好好地練習,建議您最好別參考我的答案,試著自己寫看看。
但是如果你已經卡了好幾天了,那就試試看我的答案,然後自己想一次。
此外,課程提供了檢查程式style50,由於程式不只是要轉譯給電腦看,更是要給人閱讀的。所以style50會檢查你有無留空白,有無加註comment之類的。建議最好是讓style50檢查一次。
Mario

Credit Card
Happy coding!

2020年10月26日

【程式學習】哈佛CS50x學習筆記_Week0:Scratch

that wanaka tree

哈囉,文組。
你對於電腦科學、程式語言、網頁製作有興趣嗎(當然,不然你就不會在這裡了)?那麼,你極有可能會在網路上找到哈佛大學開放式課程CS50x的資訊。
CS50x是一門簡介電腦科學的課程,簡單來說就是台灣的計算機概論。然而,這門課程的深度、廣度,據說是要來得深刻許多。我在此也不多做介紹了,想知道CS50x的課程背景及簡介的人,可以閱讀底下數篇文章:
我的知識背景
對於想要轉職程式設計,但是在大學期間,並非就讀資工甚至理工科系的人來說,技術文章的作者背景是相當重要的。比如一個從電機系轉職程式設計的人,他所寫的文章,可能對於純文組的人幫助不大。因為他曾經學過相關數學,甚至在電機系裡也學過C語言,對於程式語言並不陌生。他能夠克服的困難,對於純文組學生而言不一定容易克服。
我本身是歷史系出身,純文組,所以我並沒有學過微積分、線性代數、統計學等等數學或相關應用學問。
研究所畢業後,我覺得所學不足以應付工作所需,於數年前參加了臺灣大學資訊系統訓練班,在短短數週內,硬生生地把HTML、CSS、JavaScript吃進去。雖然學習JavaScript跟數學程度無關,但是到最後,我卻只能製作靜態網頁,完全無法理解JavaScript。後來想說JavaScript可能對我太難,所以又去學了PHP,結果還是學不會。總之當時遭受很大的打擊,覺得自己是智障。
大概在一年前,對於程式語言學習仍不放棄的我,決定自學Python及SQL。我試了好幾種方式,例如買了一本《精通Python》,看書看到大腦都快融化了,讀到第七章決定放棄。最後找到Cadecademy這個程式學習網站,總算有系統地將Python學過一次,並且學會如何應用套件,練習資料視覺化、SQL資料清理、資料分析、爬蟲等等。原本按照課程路線,要接著學習機器學習,不過這部分需要數學及統計背景,所以我就先暫停,回頭打好資料結構與演算法的基礎。
本篇文章是我的第一篇學習筆記,CS50x規劃了九週課程,從Week0到Week8,不過此系列文章不會分成九篇。因為課程難度頗高,會有很多補充資料。如果你也正在看CS50x課程,歡迎您跟著我一起學習。有任何問題請在下方留言,我會盡力回覆您。
*如果你不知道去哪裡看CS50x,可上EdX.org觀看,如果不需要證書的話,這是免費的課程。你也可以全部上完後,再決定要不要花錢買證書。
2進位
馬蘭教授(David J. Malan)認為電腦科學是一種問題解決的方法,他以下圖表示,從輸入(input)到輸出(output),中間那塊就是電腦科學的位置。

that wanaka tree

就我的理解,電腦科學就是處理資料的科學,對我來說不難理解。本身歷史系出身,其實歷史學也是處理資料的學問,不過電腦科學在工具的掌握上,要遠勝於歷史學的工具。大概就是iPhone跟石斧之間的差異吧。
在電腦中處理資料的是電晶體(transistor),電晶體能夠傳達的資訊只有利用電源開與關,也就是0跟1這種2進位方式。如果有在高中學過計算機概論應該會知道這個小常識。
2進位的換算方式很簡單,我們可以從2、4、8、16、32、64、128、256,從右到左排序。
假設我們要把數字85轉2進位,答案就是1010101。
that wanaka tree
計算方式就是64*1+16*1+4*1+1*1
或者把104轉成2進位,答案是1101000。
that wanaka tree
計算方式為64*1+32*1+8*1
上面一個0或1,叫做1 位元(bit)
1 Byte = 8 bits,所以1 Byte可以表示從0~255,一共256個數字。
資料呈現
即使電腦能用2進位計算數字,但是怎麼呈現非數字以外的資料呢?當然就是大家先討論好,什麼數字可以代表什麼符號。所以很多年前,人們就共同決定了用數字來表現英文符號,例如65就是A的意思,B當然就是66,以此類推。這些符號表示的方法,叫做ASCII( American Standard Code for Information Interchange),不過現在大部分都不採用了,因為這套系統能夠代表的符號太少了,只能用於英語。現在都採用Unicode,中文叫萬國碼。
顏色呈現的方式也是如此,目前電腦採用RGB系統,R代表紅色,G是綠色,B是藍色,每個顏色有從0~255的色階,混在一起就會呈現新的顏色。
演算法
上述的都是一些小常識,真正超級重要的東西來了。
演算法是找尋、計算資料的方法,假設我們想在電話簿裡找到Mike Smith,我們可以有下列3種方法:
  • 從第一頁開始翻,翻到最後一頁
  • 每一次跳兩頁地翻,但是如果翻過頭,就得回頭
  • 翻開頁數的中間,確認Mike Smith是在左邊還是右邊的電話簿,如果在左邊,就可以把右邊丟棄。然後再翻開剩下電話簿的中間,再確認一次是在左邊還是右邊。如果電話簿為1024頁,最多只要10步驟,就能找到任何要找的人名。
把上述的3種方法,將所需時間當作y軸,所搜尋頁數當作X軸,可畫成下圖:
that wanaka tree
第一個方法為紅線,所花的時間最多,第二個方法為黃線,雖然只需要紅線的一半,但是隨著頁數的增加,也會大量增加解決時間。只有第三個方法,綠線所耗費的時間最短,因為僅有10個步驟,不管頁數再怎麼增加,也不會增加太多時間。
注意這裡談到解決問題時,是以步驟來決定演算法的好壞。假設電話簿有1024頁,第一個方法要一頁一頁找,最多需要花1024個步驟;第二個方法最多也需要1024/2個步驟;只有第三個方法,可在10步驟內完成。
程式邏輯
所以什麼是寫程式呢,寫程式就是把上述找人名的演算法過程,用一套邏輯寫下來,再把這套邏輯編譯成電腦能懂的2進位去計算。上面找人名的第三個方法,用英文寫起來就會像下面這樣:
Pick up phone book Open to middle of phone book Look at page If Smith is on page Call Mike Else if Smith is earlier in book Open to middle of left half of book Go back to line 3 Else if Smith is later in book Open to middle of right half of book Go back to line 3 Else Quit
如果英文程度有基本程度,應該很容易能懂得上述這串虛擬碼(Pseudocode)。
Scratch
Scratch是麻省理工大學開發的一套電腦程式開發平台,就算你不懂任何程式語言的語法,只要透過簡單的操作訓練,很快地就能上手。平台畫面如下:
that wanaka tree
最左邊的積木就是程式碼,都已經圖形化了所以不用去寫。最右邊則是你可以操縱的人物,叫做sprites,是由數張圖片湊在一起的,透過程式操作可以變成動畫。中間部分就是撰寫程式的區域,操作方式很簡單,拉左邊的積木來中間拼就可以了。
that wanaka tree
上圖是課程中介紹的一段程式碼,寫成中文的話就像下面這段
1 當綠旗被點擊
2 詢問「What’s your name?」and wait
3 說「Hello!」
4 說 answer
Scratch也有迴圈可以使用,如計次迴圈、條件迴圈、無窮迴圈,底下為無窮迴圈。
that wanaka tree
上圖的程式,寫成中文如下:
1 當綠旗被點擊
2 將counter這個變數(variable)設為1
3 在這底下不斷執行:
4 說 counter 1秒 #counter = 1
5 等 1 秒
6 將counter + 1
因此這隻羊就會不斷地數數字,一開始counter設為1,程式末端將counter+1,所以就變成2,再迴圈一次又變3,數到程式中斷為止。
至於計次迴圈就是只會迴圈固定次數。
that wanaka tree

1 當綠旗被點擊
2 在這底下執行3次:
3 說 cough 1秒
4 等 1 秒
這個程式很簡單,只會說cough三次。
因為有Python的基礎,Scratch的功能我大概都知道了,由於這是學習筆記,所以關於Scratch的介紹就不再贅述。然而即使你沒有學過程式語言,Scratch也很好懂,摸索一下,很快就能知道怎麼操作,非常好玩。我發現這個圖形化程式雖然簡單,但是也能做出很複雜的遊戲,如這個馬利歐遊戲。我自己是做了一個大金剛對戰機器黃蜂的小遊戲,bug挺多的,不過是很好的練習。
Happy codding!!!

在資訊爆炸的時代裡,重新習得放空的實踐過程

首先來回答底下幾個問題:

  1. 你是否曾經要寫作業,打開電腦後,一個小時後才默默關掉臉書或Youtube?
  2. 你是否在社群媒體上發了一篇動態,過幾分鐘後就迫不及待想看看有沒有人回應?
  3. 你是否三不五時就想查看社群媒體?
  4. 你是否跟另一半去餐廳吃飯,還是會看著手機呢?
  5. 你是否曾經花了一整晚,瀏覽臉書或Youtube上的短片?
  6. 你是否在等待公共交通工具,或者在乘坐的當下,就會習慣拿起手機?

如果以上6個問題都是肯定的,你也許是一個網路成癮患者。不過你並不孤單,畢竟在這個年頭,誰不是網路重度使用者呢?尤其在智慧手機發明後,從小孩到老人,只要有能力負擔,幾乎都人手一台。

英文程度不好,卻需要寫英文文章,怎麼辦?

Photo by Christian Erfurt on Unsplash

Photo by Christian Erfurt on Unsplash

職場上,難免會遇到需要使用英文的時候,這時候該怎麼辦呢?你說把工作推給其他同事?那麼,如果你已經是同事之間英文程度最好的,或者這份工作本來就屬於你,想推也推不掉,你該怎麼辦?

用Google翻譯?

Google翻譯是很好用的工具,但是如果直接把整段文章丟入,結果就是悲劇。英翻中可能還可以,中翻英肯定是不行的。Google工程師要能夠駕馭中文,還得有很長的路要走。在此時此刻,我們仍得自立自強。

我前幾天被指派了一項工作。我們是學校單位,仰賴中華民國教育部的計畫餵養,他們給錢,我們提交計畫書與KPI。教育部要求我們得把計畫書的亮點翻譯成英文,工作就這麼落在我的頭上,只因為我的英文程度相對比較好。

我的英文程度好嗎?我實在不敢這麼自稱。幾年前考過多益跟雅思,多益滿分990,我考了850分,雅思滿分9分,我考了6分。不能算太差,但是也僅是堪用。

可是就是做翻譯工作啊,該怎麼辦呢?幸好我最近很閒,有好幾天可以摸索。於是我找出了一些方法,這裡分享給各位。

影響我一生的一本書:小王子

 

雖然我的人生還沒過完,不過要說到影響我人生的書籍,第一個躍入腦海的就是聖修伯里(Antoine de Saint-Exupéry, 1900-1944)的《小王子》(Le Petit Prince)。這本書有多有名應該不需要我多做介紹了,它被翻譯成超過250種以上語言,販售冊數超過兩億本以上,相關資料大家可以逕自到維基百科上查詢,我就不複製貼上了。

如果你真的沒讀過《小王子》,我幫你做個基本簡介。本書以一個在撒哈拉沙漠迫降的飛行員為第一人稱口吻,描述他遇到一個來自B612小行星的孩子(外星人?)。作者透過飛行員與小王子的對話,談什麼才是人生的價值。故事裡大量描述成人世界的可笑,並且讚揚只有孩子才懂得真正的快樂。

我第一次閱讀《小王子》時,大約是在我18歲左右。當時的我經歷父親自殺,家庭幾近破碎,未來一片茫然。

自主學習能力評估指標建構的前導研究

本文是我與王千文博士(就是我老闆),為建構自主學習能力指標,針對東吳大學校內的自主學習社群的前導性研究,是一篇口頭發表的論文摘要。本文在「2020國家教育研究院 自主學習資源的發展與應用國際學術研討會」發表,此研究非常粗糙,還有待後續整理及研究。

自主學習能力評估指標建構的前導研究:以東吳大學自主學習社群為例

一、 研究背景與目的

台灣自教育部2017年推廣「大學學習生態系統創新計畫」後,教育界興起推動大專生自主學習能力培養之風潮。過去數十年來以自主學習能力為主題的學術研究論文所在多有,然至今對自主學習概念的界定仍莫衷一是。再者,我們也注意到台灣目前高教在推動自主學習的當下,似乎較缺乏對該項能力進行評估的指標建構。學界最新提出的自主學習成效的評估構面與指標的相關研究,聚焦在以語言學習作為評估指標建構之個案,這對於要推至其他領域的自主學習的評估來說,在一些指標的操作上將較顯得有窒礙難行之處。因此,本文在理論與實務方面亟欲探討的是:作為一般性自主學習成效的評估應包括哪些構面與指標?藉由本研究的執行,預計未來主要達成目標有三:1.自主學習概念的深入瞭解;2.型塑自主學習運作成效的評估架構與指標;3.植基自主學習成效的評估架構與指標,反饋至高教領域推動自主學習時制度建構的參考。