看板 Soft_Job 關於我們 聯絡資訊
我不是要發表什麼新的觀點,只是想問 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
Ommm5566: 你問的問題都是沒意義的 因為所有語言都是turing等價 01/02 10:41
Ommm5566: 因為現在語言最後都是變成Von Neumann架構 所以核心就 01/02 10:43
Ommm5566: 只有每次至多一筆資料去執行指令 01/02 10:43
Ommm5566: 你如果要說subset那就是原本的分類像是funtional prog. 01/02 10:44
Ommm5566: object-oriented 之類的Programming paradigms 01/02 10:45
Ommm5566: 所以根本就不存在A語言能解的問題但B語言不能解 01/02 10:49
fayhong: 你要這麼說真的是沒錯,這樣 Assembly與C便統一天下了 01/02 10:50
fayhong: 程式語言最終也是轉成 machine code 執行,但它提供的抽 01/02 10:51
fayhong: 象機制,目的我認為是要提高語言的可讀性 01/02 10:51
fayhong: 因為可讀,所以可以傳達,因為可以傳達,所以可以合作 01/02 10:52
fayhong: 的確不存在A語言能解,而B語言不能的問題,除非B語言的 01/02 10:53
fayhong: 設計有本質上的問題 01/02 10:53
lachtchlee: 板大獨漏Self 01/02 12:24
NoNameL: 的確不存在A語言能解,而B語言不能的問題 <= 我想到一種 01/02 12:26
NoNameL: 狀況,那這樣是不是在努力之後,可以用javascript或是lua 01/02 12:27
NoNameL: 之類的東西去寫BIOS以及韌體之類的? 01/02 12:27
pttworld: 臉書有社群號稱js在寫作業系統 01/02 13:00
dnabossking: 抽像是抽像,可讀是可讀 01/02 13:02
bcew: 只要實現組語產生器,還有各專案的變數記憶體配置表 01/02 13:07
bcew: 高階語言就能碰底層,但如果不是研究或好玩就沒必要 01/02 13:09
Argos: 不能因為最後都轉成機器碼就都說這都一樣阿?不然人跟狗都 01/02 13:19
Argos: 原子組成反正都一樣 這樣邏輯對嗎? 01/02 13:19
Argos: 為何要有高階語言就是因為用低階語言寫某些東西會搞死人阿 01/02 13:20
Argos: 不然程式語言都可以扔了大家回去組語 不然寫機器碼好了 XD 01/02 13:20
Argos: 一堆程式語言和平台架構的最終目的是在做什麼?先搞清楚來 01/02 13:24
Argos: 因為人類對於過度複雜的東西無法全面掌控 所以才使用切割並 01/02 13:25
Argos: 且模組化的策略 高階語言也是模組化低階部份功能來的 真正 01/02 13:26
Argos: 為的是簡化重複出現的問題 以面對更複雜的真實世界需求 01/02 13:26
Argos: 整個資訊技術事實上都在努力化繁為簡 努力的切割模組 努力 01/02 13:27
Argos: 的讓後人不要再造輪子 難道這些都沒意義? 01/02 13:27
fayhong: 樓上所言甚是,程式語言常是為了某些領域的問題所造 01/02 13:44
fayhong: 以減化問題的解決過程,並重複那些好的practice與paradigm 01/02 13:44
※ 編輯: fayhong (180.217.137.115), 01/02/2018 13:55:06
stosto: 我選給我兩百萬年薪的工作要寫的語言 01/02 14:09
freeunixer: 用 C 刻個 web framework,就能丟掉 ror, node 了(~誤 01/02 14:41
robber1234: 還好你沒提到Scala 不然先噓再說 01/02 15:02
fayhong: 糟,我竟壓根地把它忘了..... 01/02 15:35
Argos: 其實除了切割模組外 黑暗面是商業考量 甚至我覺得商業考量 01/02 17:55
Argos: 的影響還多過於業界真正想解決問題呢 XDDD 01/02 17:56
youngce: R大這麼討厭scala哦 01/02 18:48
xxxorc: 我在剛轉行時也覺得scheme很棒,學這個才是cs正統 01/02 20:23
xxxorc: 但現在只求做出有那麼一點點價值的產品就好 01/02 20:24
xxxorc: 成功或淘汰都是有歷史因素 就跟人類文明一樣 01/02 20:25
xxxorc: 而且要比簡單 R5RS 應該沒人比得過吧 01/02 20:26
fayhong: 我現在只希望能用一個沒那麼多弱點,但可能特性也不多的 01/02 21:24
fayhong: 語言,能夠搭建出具有時間價值的東西,Java 有很多 3rd 01/02 21:24
fayhong: party 的東西,ecosystem 極為龐大,雖然用起來很方便, 01/02 21:25
fayhong: 但我更希望能夠慢慢地自己能建構更深的東西, 01/02 21:26
fayhong: 用更簡潔的方法來做事,Scheme、Haskell、OCaml都是很值 01/02 21:27
fayhong: 得一學的語言,不一定能用在真實場景,有時候是因為旁邊 01/02 21:28
fayhong: 的人沒辦法接受太跳tone的語法,但真的可以重新建構寫 01/02 21:28
fayhong: 程式的觀點 01/02 21:29
cybermeow: 推OCaml Haskell 01/02 21:40
cybermeow: 不過最近也蠻喜歡Rust的 01/02 21:47
genius945: 推這篇,感謝原po的分享 01/03 00:41
kaifrankwind: 第6點那句話最後翻得不太對 沒有"好使得" 就只是移 01/03 01:00
kaifrankwind: 減少看似需要加入新特性才能彌補短處的缺陷 01/03 01:03
changyuheng: 最後一句翻得怪怪的。原意白話是:語言設計的考量點 01/03 02:03
changyuheng: 不該是如何在既有特性上追加更多能力,而是要反其道 01/03 02:03
changyuheng: 而行——移除那些造成要追加功能才能使語言更加完善 01/03 02:03
changyuheng: 的弱點和限制。 01/03 02:03
cobrasgo: 跟大家講個翻譯的觀念,不要侷限在原本的句子而是要把 01/03 07:31
cobrasgo: 它的意義翻出來。 01/03 07:31
cobrasgo: 若設計的語言存在不足與缺陷,我們該做的是移除這些缺 01/03 07:36
cobrasgo: 陷而不是新增功能來彌補這些缺陷 01/03 07:36
fayhong: 謝謝樓上的修正,我一直不知道怎麼翻比較正確.... 01/03 07:43