iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 2
9
自我挑戰組

計算機概論X30天系列 第 2

Day2:[心得]一個語言如果不改變你的思考方式,就不值得學?談程式語言的本質

  • 分享至 

  • xImage
  •  

閱讀前,建議可以參考Day1:閱讀指南&為何選擇這個題目?

▌挑戰簡介

  • 題目:計算機概論X30天

  • 挑戰內容:連續30天紀錄計算機概論、離散數學、演算法、資料結構等課程的學習內容。

  • 本篇性質:適合任何對程式語言有興趣的人閱讀

一個語言如果不改變你的思考方式,就不值得學?

Alan Peris(首屆圖靈獎的獲得者)曾說過「一個語言如果不改變你的思考方式,就不值得學」 (A language that doesn’t affect the way you think about programming, is not worth knowing.)

初次看到這句話時,我的反應是這樣的:

  • 「這種說法也太嘴砲了吧?」
  • 「程式語言不是都差不多那樣嗎?」
  • 「為什麼一個語言能夠改變你的思考方式?」

究竟——「一個語言是否能夠改變你的思考方式?」
要回答這個問題,可能要先從程式語言的本質開始談起

究竟什麼是程式語言?

什麼是程式語言?是說C/C++、Java、JavaScrpt、Phython、Haskll ....嗎?
沒錯,這些都是程式語言的其中一種,可是我想問的不是「程式語言有哪些?」
我想問的是「程式語言的本質究竟是什麼?

程式語言語言是由什麼組成的?
不就是一堆符號嗎?(像是if、while、int、1、2、3)?

沒錯,說穿了

程式語言的本質,其實就是一堆符號組成的符號系統

那現在來問,究竟什麼是「符號」?

最初會有符號的出現,是因為我們有想要描述的東西。
比如說一個原始人第一次看到牛
https://ithelp.ithome.com.tw/upload/images/20181016/20112011awxURvj0VY.jpg

他很驚訝,於是就把牛畫在紙上拿回去給其他人看(不要糾結以前怎麼會有紙還有筆),並且指著牛的圖案跟他的家人說「你看!外面有這種奇怪的動物。」。

https://ithelp.ithome.com.tw/upload/images/20181016/20112011MIDGWG3lEa.png

備註:這個牛是原始人畫的,絕對不是我。

那這個故事中,「牛的圖案」就是一種符號,它是為了表述「牛」這個現實物件。可是我們會說「牛的圖案」完全等於「牛」嗎?不會,因為所謂的「牛的圖案」,只是是原始人對牛進行抽象化的結果。

什麼是「抽象化」?

抽象化是什麼?抽象化就是一種「選擇」
比如說,當原始人把牛畫下來的時候,他就已經做出了選擇

咦!?有嗎?什麼時候?他做了什麼選擇什麼?

他在繪畫的時候,選擇了要保留or刪除什麼資訊

當原始人在畫畫的時候:

  • 牛身上的有「多少毛」、牛的「顏色」、牛的「重量」....這些資訊,重要嗎?不重要
  • 牛的「輪廓」、牛的「線條」,這重要嗎?重要

這個原始人其實是從一個完整的牛身上刪除了大量資訊(重量、顏色、毛),抽象出了他留下最重要的資訊,也就是線條與輪廓。

https://ithelp.ithome.com.tw/upload/images/20181016/20112011MIDGWG3lEa.png

完整的牛被抽象成了線條、輪廓(這是原始人畫的)

因此,我說抽象化式是一種選擇,

並且,抽象化是對現實資料做重要、不重要的選擇

抽象化很常見,我們在日常生活幾乎每天都會「抽象化」的取捨,只是我們沒有意識到而已。

數學就是一種抽象化

有天,小A、小B、小C、小D去餐廳吃飯,於是服務生邊數著邊說「1、2、3、4」(請原諒服務生算數能力比較差,要慢慢指)「一共4位嗎?好的,請跟我來。」

但仔細想想看,這件事很奇怪。這四個人是如此的不同,他們到底要如何「加在一起」?

(以下是ABCD的個資)

  • 小A是個170cm/55kg/20歲的男性,興趣是唱歌/寫作
  • 小B是個165cm/72kg/22歲的男性,興趣是追劇/喝酒
  • 小C是個160cm/54kg/22歲的女性,興趣是看書/喝茶
  • 小D是個155cm/47kg/18歲的女性,興趣是寫程式/打電動

這四個人從身高、體重、年齡...都相當不同,他們到底要如何「加再一起」?但服務生做到了,為什麼他做到了?

因為他捨棄了除了「數量」之外的所有資訊維度。

在服務生用「1+1+1+1=4 」這套符號系統進行運算時,
這裡的「等號(=)」具有一個神聖的地位,它宣告了

在這個情境中最重要的資訊是「數量」這個資訊,而不是其他任何東西(身高、體重)

為什麼數學的交換率可以成立?

小學的時候老師就教過我們交換率。老師說「1+2=2+1」,但可能有一些人曾經想過

  • 「咦?憑什麼1+2可以等於2+1?」
  • 「奇怪!他們的位置明明就不一樣!」

沒錯,事實上他們位置就是不ㄧ樣。因此交換率致所以可以成立,因為背後存在一個預設,這個預設也做了對資訊選擇

當我們說「1+2=2+1」時,這裡的,「等號(=)」具有個神聖的地位,它宣告了一件事,那就是

在這個公式中,重要的「數量」這個資訊,至於「位置」是不重要的。

抽象化到底多常見?

(以下舉一些例子)

  • 繪畫經過抽象化:當原始人把牛畫下來時,他捨棄了牛身上的有多少毛、牛的顏色、牛的重量....這些資訊。

  • 語言經過抽象化:當我們說「殺人是(等同)錯誤的」,這裡的等同(=)也是一種選擇,他反映了一種對特定價值觀的選擇——也就是的「不可以殺人」的這個道德規則比「個人的喜好」來得更重要。

  • 紀錄經過抽象化:我平時會在電腦記下每時段在做的事情。當我做記錄這個動作時,我其實也做了選擇。比如說我可能在10~11點寫上「認真上課」但我在這個時段當中其實不只做了這些事情,我還做了「喝水」、「呼吸」、「坐著」這些事情。但是我不會把這些事情記上去

不同的符號系統,反應的是不同的「資訊選擇」

開始進入正題「一個語言如果不改變你的思考方式,就不值得學?」嗎?

小時後,語言老師也常說類似的話「每種語言,背後反映的是不同的價值觀」(這個老師可能是個日文、英文、法文老師...之類的)。

可是為什麼語言可以反映不同的價值觀?

以前我不懂,只覺得老師在說一些很空虛、不明覺厲的東西。但是,當我理解抽象化是一種對現實資料做重要/不重要的選擇時,我就明白了。

因為每種語言「覺得重要」的資訊不ㄧ樣,因此,每種語言反應的價值觀當然也不太ㄧ樣。

不同系統關注重點不同——以邏輯系統為例

(沒修過邏輯的人可以跳過這個例子,因為你不知道我在說什麼,但其實我也不知道我在說什麼)

我們日常生活中常常使用「邏輯」這個詞,可是如果去研究「邏輯」這門學科,可以發現邏輯系統「不只一種」。

  • Propositional logic(語句邏輯):就是我們最常見的「p->q,非q則非P」的那種邏輯(大家多少都看過)

  • Predicate logic(述詞邏輯):覺得語句邏輯可以描述的東西太少了,因此多了存在所有這些資訊維度。

  • Modal logic(模態邏輯): 引入了可能或許可以一定必然的概念

(還有許多其他的)

為什麼會分為這麼多不同的邏輯系統?

因為每個系統想要強調的概念都不一樣

不同系統關注重點不同——以程式語言為例

回到程式語言,程式語言本身也是一堆符號組合的符號系統。而是每個程式語言抽象化的重點都不ㄧ樣

比如說:

  • 在純物件導向程式語言的世界中,一切都是物件!
  • 在純函式導向程式語言的世界中,一切都是函式!(例如Haskll)

PS.大部分的語言其實都不是純物件、純函式

為什麼一個語言可以改變你思考的方式?

所以回到最初的那個問題「為什麼一個語言可以改變你思考的方式?」

Alan Peris(首屆圖靈獎的獲得者)「一個語言如果不改變你的思考方式,就不值得學」 (A language that doesn’t affect the way you think about programming, is not worth knowing.)

理解了「抽象化」、「程式語言的本質後」我們可以得出答案
——因為不同語言對重要不重要資訊選擇不同,看待世界的方式不同。因此在撰寫該語言的過程中,自然就能改變你的思考模式。

每一種語言,其實都是一種對資訊的選擇
每一種語言,都是一種看待世界的方式

總結知識點(附錄)

  • 什麼是符號?符號是主體對「現實」進行「抽象化」的結果,例如:牛(現實)VS牛的圖案(符號)

  • 什麼是「抽象化」?抽象化是對眾多資訊進行重要、不重要的選擇過程。例如:把牛畫成圖的過程中就經過了抽象化(捨去了主觀認為不重要的資訊)

  • 什麼是程式語言?「程式語言」其實就是一堆符號組合的符號系統。(常見符號系統包含:中文、英文、數學、邏輯)

  • 不同程式語言差在哪裡?其實都是描述的一種方式,只是不同語言關注的重點、描述的方式不ㄧ樣。

推薦閱讀


上一篇
Day1:閱讀指南&為何選擇這個題目?
下一篇
Day3:[心得]心得體悟:學習程式的方法
系列文
計算機概論X30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
小碼農米爾
iT邦高手 1 級 ‧ 2018-10-20 20:02:54

「一個語言如果不改變你的思考方式,就不值得學」

被這句話吸引進來,哈哈哈
覺得蠻有道理,除了第一個語言,第二個之後都是學概念,如果第二個語言沒有特別的地方,那就只是花時間熟悉語法而已,不會有很大的收穫。
/images/emoticon/emoticon37.gif

少了問號(?), 會變成直述句

0
逮丸逮丸
iT邦大師 1 級 ‧ 2020-01-31 12:34:14

好欣賞這篇對「程式語言」的本質的思路及論述過程,
對於一個概念的確認,
用更多的基本而有共識的實例及概念鋪陳架構起來。
可以把哲學上的基本概念,
來檢視程式語言的基本議題,
實在是少有這樣的視角來看待日常習以為常的事務。

最後一個連結無效,重追一下是:
https://www.codenewbie.org/blogs/object-oriented-programming-vs-functional-programming
原來是句號被寫入了URL裡。

0
bluegreenking2
iT邦新手 5 級 ‧ 2020-09-09 18:53:58

才剛看完第二篇各種喪志...
程式學不好是不是因為自己沒有改變思考方式==
可是要怎麼改變思考方式?
思考方式又不是參考指南書
看一看做一做可以有成效的
感覺只能打掉重練QQ

0
liuc7722
iT邦新手 4 級 ‧ 2022-09-19 23:52:44

第一次看到這種抽象化角度的思維
一直覺的計算機科學(CS)原始的精神就是這樣XD

感恩!

我要留言

立即登入留言