作者fayhong (恰似飛鴻踏雪泥)
看板Soft_Job
標題Re: [請益] 程式語言的學習 誰的說法正確???????
時間Tue Jan 2 10:08:29 2018
我不是要發表什麼新的觀點,只是想問 mega salary 的各位幾個問題。
1. 各位可能都學過 C/C++/Java/Obj-C/JS/PHP/Python/Ruby/Swift/C#,
但有人研究過像 OCaml/Prolog/Scheme&Racket/Lisp/Erlang/Haskell/Algo/Agda&Coq
之類的語言嗎?
2. 如果撇開 ecosystem 的大小不論,各位心裡最鍾愛的語言,心裡認為設計最完美的
語言是什麼呢?
3. 如果各位認為最完美的語言,是像 C/C++/Java/PHP/JS/Python/C# 這樣有龐大
ecosystem 的語言,那這個問題不適合你,但如果不是,你認為為何這些語言
有那麼龐大的 ecosystem 與 API,但你的完美語言沒有呢?
4. 假設,你要把你現在在使用的語言抽出一些核心元素,形成一個 subset,足以完成
你現在所做的工作,你認為至少應該要有哪些語言特性需要被抽取出來呢?
5. 補充一個,假設你已經會一個語言,Java/C#/JS/Python/C 都好,讓你接觸一個新
語言,解決一個原有的問題,你會怎麼思考呢?
-----
拋磚引玉,我先回答自己提出的問題:
1. 我會 Java/JS/C#,研究過 Scheme/Racket
2. 如果撇開 ecosystem 不論,我認為最好的語言是 Scheme
3. 但為何 Java/JS 的 ecosystem 卻大過 Scheme 幾個數量級,因為這些語言簡單、
夠用、最重要的是多人用。
4. 如果要把 Java 的核心元素抽離出來,能夠建構現在的工作,大概需要基本的物件
導向(函式與資料抽象)、函式、資料綁定、區域變數定義與 lexical scoping、
條件判斷、for 迴圈、行程控制(Thread)、Reflection 機制,還有最重要的:
型別系統,這些大概可以 cover 絕大部份的工作。(補充: self-identification
應該可以算是物件導向的核心特性)
5. 現在我一邊學 Python,一邊寫 Java,有時候要解決一些問題,用 Java 可以解,
但包成 jar 檔挺麻煩,還要 compile,所以用 Python 來解,例如登入資料庫,查
資料、印成網頁,那我大概需要想: Python 怎麼做模組管理,引用別的模組,怎麼
做字串處理,怎麼處理資料庫與 Python 之間資料型態的對應,Python 的基礎資料
結構怎樣操作、怎麼做 IO,怎麼跑迴圈與判斷邏輯。如果 HTML 比較複雜,是否要
用 Jinja 做樣版引擎。最後,clean code 是共識,如何重構成清晰的代碼,如何
轉變語法方式,用 Python 的語言精神來詮釋,如何進行測試與建置與部署。大概
如此。
-----
我要說的是
1. 程式語言本身,目的在探討如何表示抽象的邏輯概念,並且讓電腦可以正確解讀,
因此真正關鍵的東西,在程式語言提供了什麼特性,並用什麼樣的語法來體現它,
而在它內部又是用什麼方式來實作這些特性。
2. ecosystem 大,是因為使用的人多、領域廣,因此你在學那些龐大的 library 時,
究竟是在學那個領域的邏輯與知識表達方式,還是在學語言本身?
3. 如果想學一門知識就能夠快速應變到其他程式語言,這門知識叫
Programming Languages,在這個世界,變化不快,現在那些很潮的語言、五花八門
的特性,很多都是從很早期的語言借去用。(真希望 Java 可以借 first-class
Continuation 與 Pattern Match 來用...)
4. 如果想追求新潮的各種變化,我認為也能從 Programming Languages 這門學問中受
益,事實上,再新潮的各種開發概念,最終也需要 PL 來實現它,而常是 PL 的概
念應用而來。再者,說到應用,繁而眾是必然的結果。
5. 所以我的結論是 A 與 B 是站在 either-or 的角度看事情,但工人智慧不應當如此,
或許這問題的本質,是 neither-nor,或 inclusively
6. 最後套句 Scheme 規格書開宗明義說的一句話:程式語言不應當在語言特性上疊床
架屋地堆積,而是應當致力減少缺陷,好使得加入的特性顯出它的必然。
(Programming languages should be designed not by piling feature on top
of feature, but by removing the weaknesses and restrictions that make
additional features appear necessary.)
----
電腦排版,手機閱讀者請見諒。
※ 引述《Sidney0503 (Sidney0503)》之銘言:
: ※ 引述《dragoncfe168 (梅長蘇)》之銘言:
: : 請問下面兩種說法,誰說得對??
: : =====================================
: : A男:程式語言雖然技術變化快,語言工具多,
: : 但只要先學會一種,之後要再學會其他語言或技術是很快上手的,
: : 所以根本不需要擔心在職涯上,不斷追著技術跑
: : 與學習各種語言會很費精力的問題!
: : B男:屁啦!只會說幹話!那是你自己天份高,
: : 其實大部分的程式人都深陷水深火熱中,OK?
: : IT知識更新遠遠快於一般的行業,比如內科醫生,
: : 他的知識大多是不變的,只不過東西很多,所以醫生越老越值錢,因為經驗豐富。
: : 而軟體開發(尤其是C# JAVA這種高級程式語言)的知識變化極快,
: : 從我上大學到現在,不到10年,C#的主推技術從Winform到WPF到UWP
: : ,一套換一套,哪怕別人再怎麼說:“程式語言都是相通的”,
: : 我也依然需要花大量時間精力去學習新技術!
: 不管經過多久都會有人問這種菜鳥問題
: 建議去看以下幾篇
: 為什麼成為一名工程師這麼難 —— 從程式新手到準工程師的必經之路
: 縮https://goo.gl/4nG6Wr
: 完整https://www.inside.com.tw/2015/03/27/why-learning-to-code-is-so-damn-hard
: 程式初學者的失落之鑰 - “Computational Thinking”
: 縮https://goo.gl/mKe1cQ
: 完整https://orangeapple.co/articles/%E4%BB%80%E9%BA%BC%E6%98%AF%E9%81%8B%E7%AE%97%E6%80%9D%E7%B6%AD
: AB都錯
: A會那樣說是因為舊語言feature和framework不多
: B會那樣說是因為新語言feature和framework多到你會哭
: 軟工和寫程式是兩回事 軟工的經驗可以傳承 但是還是一直推翻舊的觀念
: 演算法也是在慢慢演進
: 可以真只學一次的僅有純數學(ex:二次規劃 複變 離散線代)
: 軟體設計師也是越老越值錢的 板上大大們也是從沒破百爬到年薪三百萬的
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.217.137.115
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Soft_Job/M.1514858911.A.78D.html
1F:推 Ommm5566: 你問的問題都是沒意義的 因為所有語言都是turing等價 01/02 10:41
2F:→ Ommm5566: 因為現在語言最後都是變成Von Neumann架構 所以核心就 01/02 10:43
3F:→ Ommm5566: 只有每次至多一筆資料去執行指令 01/02 10:43
4F:→ Ommm5566: 你如果要說subset那就是原本的分類像是funtional prog. 01/02 10:44
5F:→ Ommm5566: object-oriented 之類的Programming paradigms 01/02 10:45
6F:推 Ommm5566: 所以根本就不存在A語言能解的問題但B語言不能解 01/02 10:49
7F:→ fayhong: 你要這麼說真的是沒錯,這樣 Assembly與C便統一天下了 01/02 10:50
8F:→ fayhong: 程式語言最終也是轉成 machine code 執行,但它提供的抽 01/02 10:51
9F:→ fayhong: 象機制,目的我認為是要提高語言的可讀性 01/02 10:51
10F:→ fayhong: 因為可讀,所以可以傳達,因為可以傳達,所以可以合作 01/02 10:52
11F:→ fayhong: 的確不存在A語言能解,而B語言不能的問題,除非B語言的 01/02 10:53
12F:→ fayhong: 設計有本質上的問題 01/02 10:53
13F:推 lachtchlee: 板大獨漏Self 01/02 12:24
14F:推 NoNameL: 的確不存在A語言能解,而B語言不能的問題 <= 我想到一種 01/02 12:26
15F:→ NoNameL: 狀況,那這樣是不是在努力之後,可以用javascript或是lua 01/02 12:27
16F:→ NoNameL: 之類的東西去寫BIOS以及韌體之類的? 01/02 12:27
17F:→ pttworld: 臉書有社群號稱js在寫作業系統 01/02 13:00
18F:→ dnabossking: 抽像是抽像,可讀是可讀 01/02 13:02
19F:→ bcew: 只要實現組語產生器,還有各專案的變數記憶體配置表 01/02 13:07
20F:→ bcew: 高階語言就能碰底層,但如果不是研究或好玩就沒必要 01/02 13:09
21F:推 Argos: 不能因為最後都轉成機器碼就都說這都一樣阿?不然人跟狗都 01/02 13:19
22F:→ Argos: 原子組成反正都一樣 這樣邏輯對嗎? 01/02 13:19
23F:→ Argos: 為何要有高階語言就是因為用低階語言寫某些東西會搞死人阿 01/02 13:20
24F:→ Argos: 不然程式語言都可以扔了大家回去組語 不然寫機器碼好了 XD 01/02 13:20
25F:→ Argos: 一堆程式語言和平台架構的最終目的是在做什麼?先搞清楚來 01/02 13:24
26F:→ Argos: 因為人類對於過度複雜的東西無法全面掌控 所以才使用切割並 01/02 13:25
27F:→ Argos: 且模組化的策略 高階語言也是模組化低階部份功能來的 真正 01/02 13:26
28F:→ Argos: 為的是簡化重複出現的問題 以面對更複雜的真實世界需求 01/02 13:26
29F:→ Argos: 整個資訊技術事實上都在努力化繁為簡 努力的切割模組 努力 01/02 13:27
30F:→ Argos: 的讓後人不要再造輪子 難道這些都沒意義? 01/02 13:27
31F:→ fayhong: 樓上所言甚是,程式語言常是為了某些領域的問題所造 01/02 13:44
32F:→ fayhong: 以減化問題的解決過程,並重複那些好的practice與paradigm 01/02 13:44
※ 編輯: fayhong (180.217.137.115), 01/02/2018 13:55:06
33F:推 stosto: 我選給我兩百萬年薪的工作要寫的語言 01/02 14:09
34F:→ freeunixer: 用 C 刻個 web framework,就能丟掉 ror, node 了(~誤 01/02 14:41
35F:→ robber1234: 還好你沒提到Scala 不然先噓再說 01/02 15:02
36F:→ fayhong: 糟,我竟壓根地把它忘了..... 01/02 15:35
37F:→ Argos: 其實除了切割模組外 黑暗面是商業考量 甚至我覺得商業考量 01/02 17:55
38F:→ Argos: 的影響還多過於業界真正想解決問題呢 XDDD 01/02 17:56
39F:推 youngce: R大這麼討厭scala哦 01/02 18:48
40F:推 xxxorc: 我在剛轉行時也覺得scheme很棒,學這個才是cs正統 01/02 20:23
41F:→ xxxorc: 但現在只求做出有那麼一點點價值的產品就好 01/02 20:24
42F:→ xxxorc: 成功或淘汰都是有歷史因素 就跟人類文明一樣 01/02 20:25
43F:→ xxxorc: 而且要比簡單 R5RS 應該沒人比得過吧 01/02 20:26
44F:→ fayhong: 我現在只希望能用一個沒那麼多弱點,但可能特性也不多的 01/02 21:24
45F:→ fayhong: 語言,能夠搭建出具有時間價值的東西,Java 有很多 3rd 01/02 21:24
46F:→ fayhong: party 的東西,ecosystem 極為龐大,雖然用起來很方便, 01/02 21:25
47F:→ fayhong: 但我更希望能夠慢慢地自己能建構更深的東西, 01/02 21:26
48F:→ fayhong: 用更簡潔的方法來做事,Scheme、Haskell、OCaml都是很值 01/02 21:27
49F:→ fayhong: 得一學的語言,不一定能用在真實場景,有時候是因為旁邊 01/02 21:28
50F:→ fayhong: 的人沒辦法接受太跳tone的語法,但真的可以重新建構寫 01/02 21:28
51F:→ fayhong: 程式的觀點 01/02 21:29
52F:推 cybermeow: 推OCaml Haskell 01/02 21:40
53F:→ cybermeow: 不過最近也蠻喜歡Rust的 01/02 21:47
54F:推 genius945: 推這篇,感謝原po的分享 01/03 00:41
55F:推 kaifrankwind: 第6點那句話最後翻得不太對 沒有"好使得" 就只是移 01/03 01:00
56F:→ kaifrankwind: 減少看似需要加入新特性才能彌補短處的缺陷 01/03 01:03
57F:推 changyuheng: 最後一句翻得怪怪的。原意白話是:語言設計的考量點 01/03 02:03
58F:→ changyuheng: 不該是如何在既有特性上追加更多能力,而是要反其道 01/03 02:03
59F:→ changyuheng: 而行——移除那些造成要追加功能才能使語言更加完善 01/03 02:03
60F:→ changyuheng: 的弱點和限制。 01/03 02:03
61F:推 cobrasgo: 跟大家講個翻譯的觀念,不要侷限在原本的句子而是要把 01/03 07:31
62F:→ cobrasgo: 它的意義翻出來。 01/03 07:31
63F:推 cobrasgo: 若設計的語言存在不足與缺陷,我們該做的是移除這些缺 01/03 07:36
64F:→ cobrasgo: 陷而不是新增功能來彌補這些缺陷 01/03 07:36
65F:→ fayhong: 謝謝樓上的修正,我一直不知道怎麼翻比較正確.... 01/03 07:43