Re: [請益] 程式語言的學習 誰的說法正確???????

看板Soft_Job作者 (恰似飛鴻踏雪泥)時間6年前 (2018/01/02 10:08), 6年前編輯推噓14(14051)
留言65則, 18人參與, 6年前最新討論串6/7 (看更多)
我不是要發表什麼新的觀點,只是想問 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://www.ptt.cc/bbs/Soft_Job/M.1514858911.A.78D.html

01/02 10:41, 6年前 , 1F
你問的問題都是沒意義的 因為所有語言都是turing等價
01/02 10:41, 1F

01/02 10:43, 6年前 , 2F
因為現在語言最後都是變成Von Neumann架構 所以核心就
01/02 10:43, 2F

01/02 10:43, 6年前 , 3F
只有每次至多一筆資料去執行指令
01/02 10:43, 3F

01/02 10:44, 6年前 , 4F
你如果要說subset那就是原本的分類像是funtional prog.
01/02 10:44, 4F

01/02 10:45, 6年前 , 5F
object-oriented 之類的Programming paradigms
01/02 10:45, 5F

01/02 10:49, 6年前 , 6F
所以根本就不存在A語言能解的問題但B語言不能解
01/02 10:49, 6F

01/02 10:50, 6年前 , 7F
你要這麼說真的是沒錯,這樣 Assembly與C便統一天下了
01/02 10:50, 7F

01/02 10:51, 6年前 , 8F
程式語言最終也是轉成 machine code 執行,但它提供的抽
01/02 10:51, 8F

01/02 10:51, 6年前 , 9F
象機制,目的我認為是要提高語言的可讀性
01/02 10:51, 9F

01/02 10:52, 6年前 , 10F
因為可讀,所以可以傳達,因為可以傳達,所以可以合作
01/02 10:52, 10F

01/02 10:53, 6年前 , 11F
的確不存在A語言能解,而B語言不能的問題,除非B語言的
01/02 10:53, 11F

01/02 10:53, 6年前 , 12F
設計有本質上的問題
01/02 10:53, 12F

01/02 12:24, 6年前 , 13F
板大獨漏Self
01/02 12:24, 13F

01/02 12:26, 6年前 , 14F
的確不存在A語言能解,而B語言不能的問題 <= 我想到一種
01/02 12:26, 14F

01/02 12:27, 6年前 , 15F
狀況,那這樣是不是在努力之後,可以用javascript或是lua
01/02 12:27, 15F

01/02 12:27, 6年前 , 16F
之類的東西去寫BIOS以及韌體之類的?
01/02 12:27, 16F

01/02 13:00, 6年前 , 17F
臉書有社群號稱js在寫作業系統
01/02 13:00, 17F

01/02 13:02, 6年前 , 18F
抽像是抽像,可讀是可讀
01/02 13:02, 18F

01/02 13:07, 6年前 , 19F
只要實現組語產生器,還有各專案的變數記憶體配置表
01/02 13:07, 19F

01/02 13:09, 6年前 , 20F
高階語言就能碰底層,但如果不是研究或好玩就沒必要
01/02 13:09, 20F

01/02 13:19, 6年前 , 21F
不能因為最後都轉成機器碼就都說這都一樣阿?不然人跟狗都
01/02 13:19, 21F

01/02 13:19, 6年前 , 22F
原子組成反正都一樣 這樣邏輯對嗎?
01/02 13:19, 22F

01/02 13:20, 6年前 , 23F
為何要有高階語言就是因為用低階語言寫某些東西會搞死人阿
01/02 13:20, 23F

01/02 13:20, 6年前 , 24F
不然程式語言都可以扔了大家回去組語 不然寫機器碼好了 XD
01/02 13:20, 24F

01/02 13:24, 6年前 , 25F
一堆程式語言和平台架構的最終目的是在做什麼?先搞清楚來
01/02 13:24, 25F

01/02 13:25, 6年前 , 26F
因為人類對於過度複雜的東西無法全面掌控 所以才使用切割並
01/02 13:25, 26F

01/02 13:26, 6年前 , 27F
且模組化的策略 高階語言也是模組化低階部份功能來的 真正
01/02 13:26, 27F

01/02 13:26, 6年前 , 28F
為的是簡化重複出現的問題 以面對更複雜的真實世界需求
01/02 13:26, 28F

01/02 13:27, 6年前 , 29F
整個資訊技術事實上都在努力化繁為簡 努力的切割模組 努力
01/02 13:27, 29F

01/02 13:27, 6年前 , 30F
的讓後人不要再造輪子 難道這些都沒意義?
01/02 13:27, 30F

01/02 13:44, 6年前 , 31F
樓上所言甚是,程式語言常是為了某些領域的問題所造
01/02 13:44, 31F

01/02 13:44, 6年前 , 32F
以減化問題的解決過程,並重複那些好的practice與paradigm
01/02 13:44, 32F
※ 編輯: fayhong (180.217.137.115), 01/02/2018 13:55:06

01/02 14:09, 6年前 , 33F
我選給我兩百萬年薪的工作要寫的語言
01/02 14:09, 33F

01/02 14:41, 6年前 , 34F
用 C 刻個 web framework,就能丟掉 ror, node 了(~誤
01/02 14:41, 34F

01/02 15:02, 6年前 , 35F
還好你沒提到Scala 不然先噓再說
01/02 15:02, 35F

01/02 15:35, 6年前 , 36F
糟,我竟壓根地把它忘了.....
01/02 15:35, 36F

01/02 17:55, 6年前 , 37F
其實除了切割模組外 黑暗面是商業考量 甚至我覺得商業考量
01/02 17:55, 37F

01/02 17:56, 6年前 , 38F
的影響還多過於業界真正想解決問題呢 XDDD
01/02 17:56, 38F

01/02 18:48, 6年前 , 39F
R大這麼討厭scala哦
01/02 18:48, 39F

01/02 20:23, 6年前 , 40F
我在剛轉行時也覺得scheme很棒,學這個才是cs正統
01/02 20:23, 40F

01/02 20:24, 6年前 , 41F
但現在只求做出有那麼一點點價值的產品就好
01/02 20:24, 41F

01/02 20:25, 6年前 , 42F
成功或淘汰都是有歷史因素 就跟人類文明一樣
01/02 20:25, 42F

01/02 20:26, 6年前 , 43F
而且要比簡單 R5RS 應該沒人比得過吧
01/02 20:26, 43F

01/02 21:24, 6年前 , 44F
我現在只希望能用一個沒那麼多弱點,但可能特性也不多的
01/02 21:24, 44F

01/02 21:24, 6年前 , 45F
語言,能夠搭建出具有時間價值的東西,Java 有很多 3rd
01/02 21:24, 45F

01/02 21:25, 6年前 , 46F
party 的東西,ecosystem 極為龐大,雖然用起來很方便,
01/02 21:25, 46F

01/02 21:26, 6年前 , 47F
但我更希望能夠慢慢地自己能建構更深的東西,
01/02 21:26, 47F

01/02 21:27, 6年前 , 48F
用更簡潔的方法來做事,Scheme、Haskell、OCaml都是很值
01/02 21:27, 48F

01/02 21:28, 6年前 , 49F
得一學的語言,不一定能用在真實場景,有時候是因為旁邊
01/02 21:28, 49F

01/02 21:28, 6年前 , 50F
的人沒辦法接受太跳tone的語法,但真的可以重新建構寫
01/02 21:28, 50F

01/02 21:29, 6年前 , 51F
程式的觀點
01/02 21:29, 51F

01/02 21:40, 6年前 , 52F
推OCaml Haskell
01/02 21:40, 52F

01/02 21:47, 6年前 , 53F
不過最近也蠻喜歡Rust的
01/02 21:47, 53F

01/03 00:41, 6年前 , 54F
推這篇,感謝原po的分享
01/03 00:41, 54F

01/03 01:00, 6年前 , 55F
第6點那句話最後翻得不太對 沒有"好使得" 就只是移
01/03 01:00, 55F

01/03 01:03, 6年前 , 56F
減少看似需要加入新特性才能彌補短處的缺陷
01/03 01:03, 56F

01/03 02:03, 6年前 , 57F
最後一句翻得怪怪的。原意白話是:語言設計的考量點
01/03 02:03, 57F

01/03 02:03, 6年前 , 58F
不該是如何在既有特性上追加更多能力,而是要反其道
01/03 02:03, 58F

01/03 02:03, 6年前 , 59F
而行——移除那些造成要追加功能才能使語言更加完善
01/03 02:03, 59F

01/03 02:03, 6年前 , 60F
的弱點和限制。
01/03 02:03, 60F

01/03 07:31, 6年前 , 61F
跟大家講個翻譯的觀念,不要侷限在原本的句子而是要把
01/03 07:31, 61F

01/03 07:31, 6年前 , 62F
它的意義翻出來。
01/03 07:31, 62F

01/03 07:36, 6年前 , 63F
若設計的語言存在不足與缺陷,我們該做的是移除這些缺
01/03 07:36, 63F

01/03 07:36, 6年前 , 64F
陷而不是新增功能來彌補這些缺陷
01/03 07:36, 64F

01/03 07:43, 6年前 , 65F
謝謝樓上的修正,我一直不知道怎麼翻比較正確....
01/03 07:43, 65F
文章代碼(AID): #1QIkcVUD (Soft_Job)
討論串 (同標題文章)
文章代碼(AID): #1QIkcVUD (Soft_Job)