顯示廣告
隱藏 ✕
看板 Programming
作者 mikelue (路燈)
標題 Re: [分享]國外資工對於程式語言的看法
時間 2012年05月10日 Thu. PM 05:24:29


程式語言其中一個主要的功能是抽象化我們要計算的內容。

但因為一個語言只能在有限的語法範圍內,去定義語義;
所以利用多個程式語言來達到不同的目的,是程式設計必然的過程。

以 Web 開發為例,Client 需要 JavaScript, jQuery, CSS 等語言組合起來,
建構互動性高使用者介面。
在 Web 的 Server 端,無論是 Java, PHP, Ruby on Rail,這些都是當今常用的
動態 HTTP 技術。
在 Data 端,SQL 則是運作最廣,通用性最佳的資料操作語言。

以 Android 開發為例,除了 Java 本身語法外,尚需熟悉 XML 的運用,
以便設定 Android 開發中的 Metadata。

雖然 CSS 或 XML 是屬於 Declarative Language,但由於前面所提到的,
一個語言的功能有限,所以當下我們會稱這些有特殊用途的語言為 Domain Specific Language(DSL),
像 SQL, CSS, YAML 這些都算是 DSL。

上述關於 DSL 的區分與定義只是用來方便大家解釋與溝通,不需刻意去區分哪種語言是 DSL,哪種不是。
例:JavaScript 只在 Web 運用時,它就算是一種 DSL;但當你使用 Node.js 在伺服端開發時,它又是
相當通用的程式語言。

因此,到底要學什麼語言,並不在於何種語言比較好,而是在於你要製作的程式,需要多少語言來配合。
在 PC 的遊戲,除了 C/C++ 為主外,有的遊戲會使用 Python + XML 作為遊戲自訂的語言。
在 Web 的程式,除了前端標準(HTML, CSS, JavaScript) 外,後端可能是異質系統的整合,可能混合了
Java, PHP, Ruby On Rail 等常見的 Web 伺服端語言。

在社會上工作,會遇到的語言或工作內容相當多樣化,因此依需要學習語言將會是常態,
誰能保證你在學校學 Scala 以後一定不會用到呢?

對於一些應用開發,有時候某些特定語言是必備的,
例如你想寫 Driver,C/C++ 是必備的,你想寫 ERP,.Net 或 Java 選一即可。

========== ==========

像 C/C++ 對於物件導向/非物件導向的區分,是屬於 Imperative Programming 這一類的語言;
另一類語言,也是這幾年因分散式運算(一部份也是與雲端運端有關)的需求,Declarative Programming 也逐漸成了顯學。

但使用 C 語言是否就無法達到 C++ 的效果?雖然 C++ 的作者有提到,C++ 語言是 C 語言的 Superset;
簡化地來說也就是 C 語言的功能,C++ 都有;但物件導向的設計哲學,並非一定要使用物件導向的語言才做得到,
例如 Inverse of Control 的作法,像 C 語言就可以利用 Function Pointer 來達到類似的效果。

當然,物件導向語言的設計模式與組成比非物件導向語言還豐富,但也更複雜。
不過透過不同的設計技巧,可能讓你目前正使用的語言,模仿其它語言的功能。

而程式語言除了邏輯語法上的共通外,許多設計上會遇到的問題,也是類似的。
例如:一個已經被許多地方用到的 Function(C) 或 Method(Java),因為名字取得不好,你想要改名字,要怎麼改,
才能確定原有的程式可以繼續執行?Deprecated 可以用來處理什麼的狀況?

這些設計上會遇到的問題,才是真正需要去努力學習的地方。
就好像如果你要問學英文還是學日文比較好(這裡不討論現實的因素),
更重要的是,你能不能對於自己要表達的東西,正確去組合思考的邏輯與內容的組織
再用需要的語言,去表達出來。

因此試著在 IT 領域中去學習與語言無關的技術,才是真正的重點所在,
語言只是幫助我們用更貼切的方式,去實現/體會那些抽象的東西。

========== ==========
哪些東西是與語言無關的東西?就是那些學校裡最硬的理論課程,
資料結構、演算法、作業系統、編譯器、資料庫理論。

上述的課程又乏味又難懂,而且又好像似懂非懂。我的建議是,請不要期待你在大學四年,
就可以弄清楚這些東西,學校只是開一扇窗,告訴你這個領域大概是什麼樣子,
等你到社會上工作,遇到各種千奇百怪的問題時,你才會慢慢體會到這些抽象玩意兒的真正價值。

舉例來說,Multi-Thread 的用途是什麼?Multi-Thread 如果程式寫不正確會發生什麼事?
Deal-Lock 什麼時候會發生?為什麼 Android 要設計 UI(Main) Thread?在 OS 書中 Multi-Thread
的特性與你在寫 Multi-Thread 程式所遇到問題像不像?Message Queue 如何解決 Multi-Thread 的問題?
Queue 是什麼?Two-Phase Lock 如何解決 Multi-Thread 的問題?為什麼當今關聯式資料庫系統大都會實作
Two-Phase Locking? 關聯式資料庫系統會不會也有 Dead-Lock 的問題?

Multi-Thread 在開發所遇到的問題,不是程式語言,或是物件導件可以直接幫你解決,它們只提供各種的解決方案,
但你必需選擇合適你的方案,就好像到特力屋買槌子,槌子有木槌、鐵槌、膠槌等等,應該要用哪一種?才不會把你的椅子敲出洞來。

為了選擇合適你的方案,你所要培養的是這些基礎理論的融會貫通。

如果你想寫 Web,URL/URI/HTTP 這些觀念要清楚。
如果你想寫遊戲,各種遊戲常用的演算法要清楚。

學習程式語言就像學降龍十八掌或落英神劍掌,那是外功;
但外功打出去要有力量,就需要九陰真經或九陽神功,
但這些的學習往往是最困難,最有挫折感的。

真正的學習並非像學習 printf(),知道怎麼下語法格式化,這只是看家電的說明書而以;
真正的學習就像學游泳,你會換氣,你會打水,你會划水,三個動作分開都會,但合在一起,
身體就是會沈下去;需要經過練習與體會才能搞懂。

========== ==========

有趣的是,雖然 IT 進步的速度很快;學校學的程式語言,到社會工作一定要再學新的,
但這些基礎理論,反而不斷重覆出現在新東西中,成為新東西的核心,
例如 Python 是用 Hash 來實作出物件導向的功能。

上述有誤或不正確的地方,還請不吝指正,謝謝。

--
※ 作者: mikelue 時間: 2012-05-10 17:24:29
※ 看板: Programming 文章推薦值: 9 目前人氣: 0 累積人氣: 4240 
分享網址: 複製 已複製
( ̄︶ ̄)b Knuckles, a0972727920, x-finite, sean3381212, uefangsmith, csf0427, id128, tails, WenWang 共 9 個人 說讚!
uefangsmith 轉錄至看板 uefacool (使用複製) 時間:2012-09-30 11:31:27
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇