這兩年接觸了不少語言, 感觸最深的是每個語言都有它獨特的運用場景捻爷。
而且未來的開發(fā)趨勢不是只是用一種語言疑苔, 而是基于多語言的開發(fā),這樣可以充分利用每個語言的特性開發(fā)不同的任務傲须。
接下來蓝牲, 我想談談我使用過的語言和我對這些語言的看法。
最先接觸的一門語言是C泰讽。 那是在進入大學之后例衍,大一上學期就會教的一門語言昔期。 C 語言學起來一點都不簡單。 C 語言最難的一部分就是對指針的理解肄渗, 我想說這是C語言的精華之一镇眷。 因為要充分理解指針,我們就得理解計算機系統(tǒng)的內(nèi)存結(jié)構(gòu)翎嫡, 如 棧 和 堆欠动, 所以學習指針, 我們必須得更深入的了解計算機系統(tǒng)惑申。 而且指針也是數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)具伍, 數(shù)據(jù)結(jié)構(gòu)中的鏈表和樹都是基于指針來實現(xiàn)的。 C語言的特點是高性能 和 可移植性高圈驼, 所以C語言通常是系統(tǒng)開發(fā)的首選語言人芽, 如 redis, nginx绩脆, lua萤厅。 但是C語言的缺點是需要手動分配和回收內(nèi)存, 并且對復雜數(shù)據(jù)類型的封裝比較少靴迫, 如 C語言中沒有string類型惕味, 所以基于C語言的開發(fā)效率會比較低。
既然學過了C玉锌, C++當然是少不了了名挥。 C++ 是在大二學的, 當時覺得C++是個非常難的一門語言主守, 可能當時是第一次接觸面向?qū)ο螅?很多概念都不理解禀倔。對C++最大的印象就是 STL 庫, 封裝了很多復雜的數(shù)據(jù)類型和算法参淫, 可以快速提升開發(fā)效率救湖。
緊接著, 在大二也開始學習java了涎才,java也是我后面工作的主要語言捎谨。 java最大的特點就是面向?qū)ο蟆?所以對一些大型的復雜項目, 面向?qū)ο罂梢詫I(yè)務完成很好的封裝憔维。 如果要說面向?qū)ο笞詈糜玫囊粋€特性涛救, 我會選擇多態(tài)。 多態(tài)在業(yè)務開發(fā)中占據(jù)了重要的角色业扒, 并且可以提供非常好的擴展性检吆。 面向?qū)ο笞铍y用的特性, 我會選擇繼承程储,因為如果一個父類被很多子類繼承蹭沛, 修改父類的代碼可能會牽一發(fā)而動全身臂寝。
Python 是最近兩年才開始學習的語言, 不得不說我真的很落伍摊灭,這么火的語言咆贬, 我居然學習的那么晚,得自我反省一下了帚呼。 我用Python的初衷是刷算法題掏缎。 以前我是用java刷, 但是發(fā)現(xiàn)java刷題太費勁了煤杀。 用了python刷題以后眷蜈,我發(fā)現(xiàn)刷題的速度快了一半。 所以選擇正確的語言干正確的事情是多么重要啊沈自。 后面去公司實習酌儒, 主要是負責devops, 都是用python寫一些自動化的腳本枯途。 也用python 開發(fā)過一些自然語言忌怎, machine learning 和 deep learning 的 項目。 python 的學習給我打開了一個語言的新世界酪夷, 后續(xù)我就不斷的學習一些新的語言去解決不同的問題呆躲。 python我最欣賞的一個特性就是讓高級數(shù)據(jù)類型符號化(當然這也是腳本語言的標志之一)。 其次就是python提供了很多語法糖捶索,很多復雜的代碼一行就可以搞定。 另外python也支持函數(shù)式編程灰瞻,一行代碼不是夢腥例。總之酝润, python是一門特別好的語言燎竖, 可以用它做web, 如有flask 和 Django 兩大web 框架要销, 也可以做devops去寫自動化的腳本构回, 當然現(xiàn)在最火的一個方向就是數(shù)據(jù)分析和人工智能,python 有很多優(yōu)秀的庫疏咐。
Javascript 是最近學習的一門語言纤掸。 上了一門web system的課,? 主要是學習前端開發(fā)浑塞。 隨著web的爆炸式增長借跪, javascript 已經(jīng)成為了一門不可替代的語言。 javascript最值得學習的特性就是異步編程酌壕, javascript就是為異步而生的語言掏愁, web的交互性注定了javascript要通過異步來提升性能歇由。 javascript 的另外一個特點就是面向原型(prototype),理解javascript就必須得好好的理解原型果港。javascript 需要掌握的一個數(shù)據(jù)類型就是 obeject沦泌, 這也是javascript的核心之一。 另外就是得理解javascript的閉包 以及函數(shù)的context辛掠, 這些不理解的話谢谦, 開發(fā)會踩很多坑。
接下來我想聊一下linux底下的小眾語言 sed 和 awk公浪。 這兩門語言在處理字符串方面是非常強大的他宛, 如果涉及到字符串的自動化工作, sed 和 awk 是很好的選擇欠气。 sed 可以實現(xiàn)字符串增刪改查的自動化厅各, 并且支持強大的正則表達式 , 通常會和 awk, grep一起使用预柒, 可以實現(xiàn)oneline 編程队塘。 awk 也是處理字符串, 但是偏向于 csv格式的數(shù)據(jù)宜鸯, 可以進行數(shù)據(jù)的提取憔古,統(tǒng)計, 聚類等操作淋袖。 在實現(xiàn)期間鸿市, 我曾經(jīng)用這兩門語言 很簡單的完成了一些自動化的腳本, 通常一行代碼可以完成很復雜的功能即碗。 所以如果做一些devops的工作焰情, 需要好好的去學習者兩門語言。
講了sed 和 awk剥懒, 當然要講perl内舟。 perl我基本沒用過。 但是 perl 在處理字符串方面是最最最強大的初橘。 sed, awk支持的功能验游, perl 統(tǒng)統(tǒng)支持。 并且sed, awk,grep 的正則表達式語法有些不兼容保檐, 但是直接使用perl就沒有這個問題了耕蝉,并且perl的正則表達式是所有語言中最強大的, perl的正則表達式語法也是語言界的標準夜只。 所以如果要涉及文本自動化工作赔硫,perl是個不二選擇, 當然perl的學習需要費點心思盐肃, 因為perl會用到很多反人類的字符@_$_!@$#
接下來爪膊, 我要講一下我非常喜歡的一門語言权悟, 那就是 ruby。 ruby是一門純粹的面向?qū)ο蟮恼Z言推盛, 但是我更喜歡ruby的函數(shù)式編程峦阁。因為用ruby去刷算法題, 很多情況下一行就可以搞定耘成。 當然ruby也是因為ruby on rails 這個web 框架而開始流行的榔昔,有不少著名的項目是基于ruby開發(fā)的, 如github 瘪菌。 在web開發(fā)方向撒会,? ruby 也是一個不錯的選擇。
現(xiàn)在师妙,我要談到一門上古語言了诵肛, lisp 要登場了。我是在學習人工智能課程中了解了listp默穴。? lisp 是一門純粹的函數(shù)式編程語言怔檩,如果要學習函數(shù)式編程 和理解函數(shù)式思想, 一定要學習一下lisp蓄诽。 在lisp薛训, 一切皆函數(shù)。 當然lisp中無數(shù)的括號()仑氛, 可能會把人折磨瘋了乙埃, 并且要寫一個嵌套的for 循環(huán), 在lisp也不是那么簡單啦锯岖。 Lisp是一門學術(shù)性語言介袜, 偏向于人工智能, 如果要說現(xiàn)在lisp 現(xiàn)在的用途嚎莉, 可能就是編寫emac的插件了。
除了Lisp沛豌, 我還學習了另外一門非常有意思的語言趋箩,prolog。 prolog這個語言算是領(lǐng)域?qū)S谜Z言了加派, 可以用于邏輯推理叫确。 也就是prolog可以定義一個推理規(guī)則, 可以基于規(guī)則芍锦, 進行事實的推理竹勉。
語言有面向?qū)ο螅?有函數(shù)式, 有面向過程娄琉,有混合式次乓, 也有領(lǐng)域?qū)S茫?沒有一個語言可以解決所有問題吓歇。 所以開發(fā)的趨勢是多語言的開發(fā),在架構(gòu)設(shè)計票腰,系統(tǒng)維護和業(yè)務建模城看, 要充分的利用不同語言的特性。 語言是工具杏慰, 開發(fā)效率才是王道测柠。 所以我個人永遠不會在乎語言排行榜, 也不會去爭論缘滥, 只要好用就好轰胁。