要去西南出差了,卻從本身的書架上和Kindle中找不出感興趣的書來,臨出發前去老SUN屋裏尋摸一圈,選中了《代碼的將來》這本書。選中它的緣由有幾條:Ruby之父寫的書,做者是日本人,日本人寫的書通常比較實用、也想了解一下Ruby、翻目錄時發現有Go、Dart、CoffeeScript、Lua幾個新語言的對比分析、老SUN說網上對此書評價不錯。php
飛機上看了一路,一口氣讀了前2章,90多頁,對各類語言中的關鍵特性分析得至關到位,對語言的發展歷史有了歸納性的瞭解。出差後白天忙工做,晚上把剩下的部分快速讀完了,後面三章的內容對我來講吸引力就不夠了,多是技術性太強了,咱們不會研究到這麼深,只會去用別人寫好的現成的框架。html
一開始做者從編程的本質入手,編程就是創造出一種人類和計算機都可以理解的語言(編程語言),並經過這樣的語言將人類的意圖傳達給計算機,這樣的行爲就叫作編程。天然語言的歧義性太強,未來的用戶界面確定是全面的語音輸入應該沒有問題,但用語音把問題所有說出來,交給計算機去實現,如今看來仍是至關有難度,假如未來實現了,那麼程序員是否是要下崗了?仍是都轉入到更底層的代碼的編寫中去?node
編程是一項創造性的工做,可以按照本身的意願來創造世界,正是編程的最大魅力所在。想起高中時錄入的幾行BASIC代碼,可以完成繁瑣的計算,就想着本身編寫一個小遊戲會是什麼狀況呢?從而愛上了編程這項工做而一發不可收拾。程序員
計算機語言的發展與摩爾定律也有很是大的聯繫,但計算機的算法改變得並不大,特別是一些古老的基礎算法仍在大量使用。摩爾定律如今基本還有效,但CPU主頻的提升已基本到了極限,未來多核技術、內存容量增大、硬盤向SSD轉變將會成爲主流。咱們的程序和算法須要如何適應這些變化呢?正則表達式
這時想起當孩子小的時候,我啓蒙性地讓她看了看LOGO語言,讓她操縱小海龜在屏幕上畫出奇妙的圖案,她確實感受很是神奇,但對動手創造新的世界並沒有太大的樂趣,可能女孩子的天性並不喜歡這些東西吧,難怪女程序員如此之少。我也不想強行給孩子灌輸什麼編程技術,畢竟軟件開發還是一件很是辛苦的工做,仍是別讓孩子成天面對代碼過日子吧。算法
做者也大膽地對將來進行了預測,IT技術變化日新月益,5年就會發現很大的變化。價格降低、性能提升、容量增大、帶寬增長,並且這些項都是按指數關係發展的,這些構成了IT技術預測的基礎。在這些增加方面,存儲容量的增大好像更快,而數據傳輸速度增長並無那麼快,這些發展的不平衡也會左右咱們的將來。數據庫
編程人員的思路果真離不開編程,做者採用極限編程XP的思路來預測一下將來。當把幾項指標都調到極大,世界會是什麼樣子?編程
計算機價格低得跟白菜同樣,如今的智能家電已經看出一些趨勢了。未來的世界確定佈滿了芯片,物聯網看來真是大勢所趨。地板是智能地板、手錶是智能手錶、燈是智能燈、杯子是智能杯子、智能箱子,這些都在出現,未來的術語確定再也不使用「智能」這麼俗的字眼,默認就是帶計算機芯片的設備,便地都是計算機了,看來程序員事情更多了,任務更復雜了。數組
計算機性能很是強會發生什麼?未來個人筆記本配置會是1024核?多核CPU並行編程確定要有新的發展,若是哪項編程語言有這種特色,應該是須要重點關注的語言。可能做者把Go語言排在比較靠前就是這個緣由吧。瀏覽器
容量很是大?個人筆記本電腦會配置1EB硬盤?不,硬盤已經沒有了,內存與硬盤已經合2爲1了,由於內存也已是白菜價了,配置1TB內存?其它東西都存在雲端了,不必管什麼容量問題了,由於帶寬不成問題,從網絡上讀寫10G數據也是幾秒的事情?malloc()你就盡情地分配個八維數組吧,別去管什麼內存溢出之類的異常,哈哈。如今以SSD爲基礎的數據庫系統和大數據分析技術已經出來了。
網絡帶寬1Gbit/s?計算機剛問世時,那是一箇中央集權的時代,一臺大型計算機,周圍只有一些終端。當人手能夠有一臺計算機時,出現了C/S系統。當WWW瀏覽器在全世界普及時,B/S方式的中央集權開始復辟。如今JavaScript在瀏覽器上大行其道,實際上又是C/S換個馬甲復活了。若是B/S是趨勢,那你配置那麼強大的我的電腦又有什麼用處呢?不,每臺電腦自己也是網絡雲計算中的一個節點,你必須提供計算資源,才能訪問別人的服務?
這裏提到了打孔紙帶、巴貝奇的差分機、女程序員Ada、第一臺計算機ENIAC,至於到底誰是真正的第一那是歷史學家的事了。計算機語言主要介紹了FORTRAN、COBOL、LISP、SNOBOL語言,而後講到了當前的主流語言。
100年後的編程語言會是什麼樣子?變化不大?使用編程語言來編程的這個行爲已經不存在了?發明了更高抽象度寫法的編程語言?反正俺是看不到了。
20年後的編程語言是什麼樣子?確定會在多CPU協做和多機分佈式處理方面更增強大。當前的線程編程模型實在太讓程序員痛苦了。
外部DSL是由專用的語言引擎來實現的DSL,能夠高度自由的定製,但學習成本比較高。 YAML、JSON、正則表達式均可以稱爲外部DSL。XML很是通用,但描述冗長,不適合閱讀和程序編寫,未來會如何改進?
內部DSL則寄宿在某一編程語言的基礎上,這樣就不須要再學一門新的語言,宿主語言的語法等均可以拿來使用,節約了大量的程序開發時間。
實際上設計一堆API的過程,就是一種設計DSL的過程。
我也曾經想把工區底圖和剖面程序DSL化,核心程序員開發好組件庫,其餘程序員只須要這樣寫就好了:
a = Basemap.New
a.AddImage(image, 0, 0, 1, 1)
a.AddSurvey(...)
survey.Hide
SeismicLine.Show zxcVolume inline 200
......
惋惜在C#裏實現內部DSL仍是至關辛苦,只能暫時用API了。
做者認爲Lisp、Smalltalk和Ruby適合用做內部DSL的語言,這可能與它們的元語言編程特性有關吧。
DSL 設計的構成要素:上下文、語句、單位、詞彙、層次結構,這些概念我還暫時領會不了。
用程序來編寫程序就是元編程Metaprogramming。這時又想到了數字油田中成天都說到的元數據,存儲這些元數據當然重要,但脫離應用的元數據確定收集不上來,必無生存之地。若是元數據和元編程都實現了,程序員獲取數據的邏輯應該就是像well1.GetWellLog(「AC」)這樣?你既不須要寫SQL,也不須要寫ORM映射關係,也不須要寫實體類,寫起來是方便了,但好像學習起來難度更大了。
在Java和C#中主要都是經過反射Reflection來獲取和變動程序自己的信息,而Ruby的元編程至關強大,能夠用幾行代碼生成100個方法,而在Java和C#中就只能經過編寫專門的代碼生成器了。
Lisp中的程序是用S表達式來表示的,其程序和數據是徹底等同的, 因此元編程已經深深融入到Lisp中了。
元編程很強大,但也不能用得太多,不然理解源代碼就很困難。
垃圾收集GC的三種方式:標記清除、複製收集、引用計數。引用計數方式的原理和實現雖然簡單,但缺點也不少,所以最近基本上再也不使用。想一想Qt中的內存管理也是採用引用計數,讓程序員去決定什麼時候增一、減1真是一種痛苦。
新的垃圾收集算法有:分代回收、增量回收、並行回收。
還有一位IBM的學者將物理學上的大統一理論(Grand Unified Theory,簡稱GUT)用於垃圾收集,統一爲跟蹤回收和引用計數。
如今的高級語言都有異常處理機制,讓程序員能夠更方便地處理異常。傳統的用特殊返回值的方法,容易讓原來正常的程序被錯誤處理代碼所埋沒。
Java 的檢查型異常強制讓編譯器檢查異常,有時確實不方便。異常之因此被稱爲異常,原本就由於它很難事先預料到。明知如此,還非要在代碼中強制性事先對異常作好聲明,以免產生編譯錯誤,這實在是太痛苦了。
Ruby中的ensure、rescue和retry參考了Eiffel語言的保留字。
學Haskell語言時,我之前認爲閉包Closure就是指高階函數,能夠把函數當參數傳遞給函數。
C語言中函數指針的最大弱點是沒法實現對外部局部變量的訪問。可以對外部變量進行訪問(引用、更新),是閉包的構成要件之一。
在這一章中做者主要介紹四種編程語言Go、Dart、CoffeeScript和Lua。看到這裏我打開了TIOBE關於軟件編程語言的排行榜(截止到2014年11月),Go語言排名在20名以外(排名46),Dart排名22,CoffeeScript沒看見,可能合併在JavaScript中了,Lua排名41。
Java穩居第2,JavaScript躍居第7,Ruby有點降低,處於第18名,而發展最快的R和Swift沒有出如今做者的書中。
靜態類型的語言編譯期間就能發現更多的BUG,更容易閱讀和理解。而動態類型語言的優勢在於其簡潔性和靈活性。
鴨子類型Duck Typing:若是像鴨子同樣走路,像鴨子同樣呱呱叫,則它必定是一隻鴨子。
能夠稱之爲現代版的C語言。聲稱爲New(新的)、Experimental(實驗性的)、Concurrent(併發的)、Garbage-collected(帶垃圾回收的)、Systems(系統級)的語言。做者最看好它,可能主要是由於它內置支持併發編程,再就是它系出名門吧。
Dart想取代JavaScript,但後者已經擁有了大量用戶,看來Dart的前途並不光明。
JavaScript被投入了大量資金進行不斷髮展,其速度已經愈來愈快。既然JavaScript地位愈來愈重要,能不能既不拋棄JavaScript,又克服其缺點呢?CoffeeScript就是這種思路,它的編譯器實現上就是JS寫成的,CoffeeScript程序會徹底編譯爲JS代碼去執行,其發展值得期待。
Lua重點在嵌入式領域,以輕量、高速和響應快爲特點。
從這一章開始,讀起來興趣不大了,簡單瞭解幾個概念吧。
從簡單的二分法查找,講到散列表和布隆過濾器,又講到了分佈環境中的DHT(分佈式散列表)、Roma(鍵值存儲數據庫)和MapReduce。
C10K是Client 10000 Problem的縮寫,指「在同時鏈接到服務器的客戶端數量超過10000個的環境中,即便硬件性能足夠,依然沒法正常提供服務」。epoll、libev和EventMachine,這些就不明白了。
不感興趣。
看Ruby 實現的網絡服務器代碼是至關的簡潔,之後有機會能夠一試。
不感興趣。
這章已經超出了個人理解範圍,列幾個術語吧,CAP、NoSQL、MongoDB、OD Mapper、VoltDB、memcached、Redis。
這章中提到了UNIX中的管道功能,真是至關的優美和強大,相比之下,Windows中的管道倒是經過臨時文件模擬實現的,至關的垃圾。
其它關於非阻塞I/O、node.js 、EventMachine的內容暫時在個人興趣以外。
關於進程間通訊,做者提到了ZeroMQ,是一種爲分佈式應用程序開發提供進程間通訊功能的庫。有機會能夠一試。