Tag Archives: 電腦

Seven Databases in Seven Weeks 2nd Edition – Luc Perkins

很多年來我一直只懂SQL,沒有學習其他database,早十年NoSQL還是剛冒起,我還有點看輕它,覺得它冇用。俗語有云,當你手拿著鎚子,所有的問題都變成釘子。只懂SQL,很自然習慣把所有問題都用Relational Database去解決,儘管要花更加多的氣力,有時殺雞亦要用牛刀,因為只得一把刀。

這本書2018年出版,已經是第二版,很多年前第一版時已經想看。只不過是短短三年,書中有些code已經過時了,新版本database的syntax有點不一樣,不過基礎理論沒有改變,仍然合用。NoSQL有太多選擇,想學習也老鼠拉龜無從入手。這本書介紹最熱門的七個database,從傳統SQL的Postgres為起點開始,然後逐一講解其他NoSQL DB的優劣trade-off,什麼情況適合應用。比起每次只教一種database的書,讓讀者有宏觀的視野。

因為一本書要教七個DB的關係,這本書的內容非常壓縮,簡單的基本操作甚至略過不談,直接叫讀者去看官方document。每個DB的教程分為三部份,讓讀者可以連續七個星期,每個週用三日學完。我一口氣一次過看完,一章大約要用四個小時,不過我只是跟著example打code玩下個DB,沒有個每日的功課,若果做埋功課,大約要兩倍時間。

第一章Postgres是溫習SQL,我以前用開MySQL同SQLite,也算是學新野。第二章教HBase是columnar database,沒有隨意search的功能,要靠index去讀data,但是非常scalable,是Google Cloud Bigtable的開源版。第三章教MongoDB是document DB,search JSON的功能很強大,不用寫schema很方便。第五章教couchdb,與MongoDB一樣都是寫JSON object,但couchdb的read要事先建立views,另外監視change的功能也很好用。

第六章教是我最有興趣的Neo4J,但書中教了graph DB的很皮毛,連Cypher語法如何閱讀也沒有教,我要上網再找資料自學。Graph DB同SQL很大分別,完全是另一個類型的應用,學了大開眼界。第七章教AWS DynamoDB,個database本身很平平無奇,強大是AWS後台的支援,連著AWS其他功具一起教,學習寫data pipeline,提升用DB的另一個層次,真正的big data。最後一章教redis,簡單易用夠方便,我認為redis應該早些教,in memory key-value store都啱做一些quick and dirty job。

這是一本不適合新手的入門書,教的東西很廣闊但很膚淺,主要是給讀者一個perspective,之後讀者就要靠自己去看document了。若果要看完一本書就能立即上手揼project,拖著一步步教導如何建站,這本書並不適合你。反而這本書更像是sampler,淺嚐每種DB的味道,並例一起觀察它們的異同,然後覺得那個DB有用,就再上網去找資訊深造。讀這本書有一個好處,讀完後基礎理論打了底,讀official document快很多,可以直接跳過不用看其他書,反正去到最後都係要翻查參考official document。

Introduction to Computer Theory – Daniel I.A. Cohen

9788126513345_1

在很多大學中,電腦系不是附屬於工程學院,便是附屬於科學院。我以前讀的大學很奇怪,電腦系是附屬於數學院,當年我不明白原因,電腦可以用來計數,但電腦和數學有什麼關係呢?我是讀電腦工程系出身的硬件人,當年與電腦科學的同學談起,聽他們說電腦理論很難明高呼救命,天真的我以為讀電腦科學不就是學寫程式嘛,有多難?直至很多年以後,某次去印度工幹買了這本《電腦理論入門》,丟在書架上又過了幾年,然後某天心血來潮打開來看看,前後繼繼續續花了兩年多才看完,終於我明白原來電腦理論不等於電腦,而是數學上如何械械式解答問題的定律。

這本Daniel I.A. Cohen的《Introduction to Computer Theory》,是電腦理論的經典課本。某種意義上,這本書非常沉悶,全本書就好似中學讀數學不停學proof。從最簡單的regular expression開始proof,一路到finite automata,到context-free grammer和pushdown automata,最後就是頂頂大名的萬能電腦原形Turing Machine。證明什麼類形的電腦可以接受什麼類形的language,某notation又可以如何與某graph等同互換。最精彩的章節是詳細解釋Turing Machine,以前上堂聽過這個term,記得教授說過TM是萬能電腦,看完這本書後,終於明白為什麼TM可以計到任何可以計得到的數,即可以解答任何能找出答案的問題。再一次佩服Alan Turing的天材,TM的構造極其簡單,可是沒有任何機械能超越TM的解題能力。

最初開始讀這本書時,我不明白language同電腦有什麼關係,不就是一串串不同的string,起個state machine去判斷一個input是否屬於language之內,程序上是有點麻煩不過也不是很複雜,要用咪call library囉。去到context-free grammer開始看到有點關係,至少寫compiler的第一步就是要parse個syntax tree。一直以無比的耐心閱讀著,逐步逐步follow書中的proof,然後有一天開竅了,忽然間看到language和solve problem之間的關係,任何能夠解答的問題都是一個數學題,電腦就只是從機械化地處理input,然後給一個output的系統,output可以是答案,但更多時間只是一個yes/no answer,又或者更基本的halting problem。找出一個問題的答案,只是最表面那層,找出一問題有沒有可能有答案,如果有答案的話,有限時間內能否找到,那些bounding的meta問題,才是電腦理論的核心。至於如何寫個行得快些慳位些的algorithm去解題,已經是應用層面上技術性的次要問題。

若果不打算理會那些proof,這張圖表大慨是全書內容的總結。老實說那些proof讀完大部份都忘記了,能夠記得大慨就只有這圖表的內容。不過讀proof的最大得著,是讀proof會潛移默化你腦袋的思路,看完知道的東西和未看差不多,但再遇同類問題時會有一份直覺。

初版pdf下載,我看的是第二版實體書。

Mobile Unleashed – Daniel Nenni and Don Dingee

mu

考考你,你知道你手機入面的CPU是那間公司製造的嗎?多得Intel多年來咚咚棟冬的廣告,一般人都知道電腦的CPU主要由Intel製造,但說起手機,只會聯想起蘋果和三叔,完全沒有聽過ARM這間公司。現今的智能手機,甚至早年的2G手機,手機CPU市場佔有率,ARM差不多是百份百,可說是獨市生意。《Mobile Unleashed》這本書,講述ARM的發跡史,如何從十二人的小團隊,三十年間發展至二百億市值的高科技王國。這本書不單是ARM的歷史,更加是整個手機業界的歷史。

ARM全名Advanced RISC Machine,原本個A字代表Acron電腦公司,ARM只是其研發部的一個實驗項目。當年IBM如日中天雄霸整個電腦市場,其他電腦公司一邊抄考IBM電腦賣錢,另一邊則希望開發新產品打破IBM的壟斷。RISC就是這樣的環境下開發出來的CPU架構,與Intel的x86系列CISC CPU完全不同的設計概念,犧牲複雜的功能換取精簡的指令架構。當Intel搶佔商用家用電腦市場,其他RISC晶片廠商如SUN和MIPS,則憑著RISC架構的高運算速度,在server市場開拓出另一片天空。而ARM的RISC晶片,論功能不夠x86強,論速度不及其他RISC廠商,只有一項優點就省電。

不過當年電腦不能移動,反正都是插著電源,省電完全不是賣點,ARM晶片完全沒有生意。Acron準備解散團隊止蝕,這時命中註定的救星出現,蘋果要開發平板手提電腦(還不是iPad,二十年前那個叫Newton),需要開發更省電的CPU,於是找上門來。商討後ARM從Acron獨立出來,蘋果佔一半股權,Acron和VLSI佔另一半。雖然新公司有蘋果這個大客支持,可是實際上還是窮得要命,相傳ARM的初代CEO上任第一個工作,就是四出尋找平價二手家俱。Newton是蘋果第一次後教主時代的滑鐵盧,走得太前技術完全未成熟,功能未如人意成本天價,最終全球只賣出六萬部。

Newton雖然失敗了,但為ARM爭取多幾年的時間,繼續改良CPU的技術,終於等到流動電話時代的來臨。最初1G電話用Analog技術,上了年紀的都記得當年大大舊的水壺電話。2G GSM改用Digital技術,對於CPU的需求增加了,但手機的電池容量有效,省電便成為最重要的決定性因素。ARM的第一個大客是Nokia,雖然Nokia現在執了笠,當年可是手機的一哥,比今天蘋果還厲害,高達過半的市場佔有率。之後ARM逐一攻陷其他手機廠商,差不多所有手機都是用ARM。與Intel自已生產CPU不同,ARM其實是一個IP智識產權公司,ARM開發CPU的程式,然後授權給其他公司生產,每台電話都收取專利稅。每粒CPU的利潤雖然不如Intel多,但與廠商共同建立開發生態環境eco-system,在有錢齊齊搵的大前提下,各手機廠商都樂於和ARM合作。雖然人人都用ARM,但有不少生產商可供選擇,不怕有像Intel壟斷市場後,獨市生意抬高價值的問題。

蘋果今日貴為全球最有錢公司,但當年教主第一次出走後幾乎破產。教主回歸蘋果重新掌舵,展開救忙大行動,賣掉了ARM的全部股份,把資金投放在iPod開發上。當年蘋果出手救了ARM,現在輪到ARM救蘋果。蘋果手提開發部早對ARM十分熟悉,iPod很自然源用ARM的晶片。iPod取很空前成功,然後就是Newton的終極完全版,遲來了二十年的iPhone,從此改寫了手提電話的歷史。三星與ARM亦很有淵源,早在2G手機年代便已用ARM,更把ARM用自家mp3機和DVD機上,從低能手機過渡至智能手機,很自然繼續便用ARM。有玩開Andriod旗艦機的朋友,都聽過Qualcomm的Snapdragon晶片,裏面的程式都是ARM授權生產。當年Qualcomm發明CDMA通訊技術,是整個3G/4G手提通訊的理論基礎,它從radio晶片做起,一路從外至內把radio與CPU整合。

說來諷刺,最初Qualcomm是原本與Intel合作,不過Intel嫌手機市場太細,賺不到錢索性退出市場,把Qualcomm拱相讓給ARM。當年蘋果整初代iPhone,同樣也是打算和Intel合作,Intel亦用同一個理由推掉,結果Intel白白錯過整個手機市場。不過看ARM的歷史,學懂了一件事,在高科技行業的世界中,技術實力固然是必要的本錢,但一間公司最後能否成功,最重要還是要講運氣。ARM轉捩點的幾單大生意,不論是蘋果還是Nokia,基本上ARM都不是首選。可是首選交不出貨,ARM冷手執過熱煎堆,然後一切才成為歷史。今年九月日本軟銀集團,宣告全面收購ARM,目前還等候政府批準合併,不知道ARM的未來會如何,一代手機王朝會否從此衰落?

21st Century C, 2nd Edition – Ben Klemens

這本書不適合學寫程式的初心者看,不過今時今日有更多更新更易學的語言,相信沒有初學者會揀學從C開始下手。這本書寫給兩類人看,一類是我這種十幾年前學過下C,放低很久現在要更新知識,另一類是有其他程式語言底子的人。這本書與我初學寫程式那個年代的課本很不同,其編排完全輕視C語言的文法和格式(syntax)。其他傳統C課本大半本書講syntax,呢本書就用最尾一個附錄單簡介紹下就算。反正那些東西不用死背,可以落手落腳時才邊做邊學,有IDE auto-complete又有網上參考,又真係唔應該浪費墨水。

這本書一開始花三分一本書講與C沒有直接關係的東西,不過現今寫C程式一定有用的工具軟件,如gcc,git,makefile等,還有一些更深入的Linux題材如整package,乜野係process,點寫dynamic library等。以前學寫C,課本連如何compile個program也不會教你,一開始老鼠拉龜不知如何下手。學這些東西說難不難,說易不易,不過這本書把它們放在一起,有齊從零到軟件出街一條龍所有必要步驟,十分方便。課本講的主流opensource應用工具,不過知道工具的類別和名稱後,不艱search更加好用的point tool。

好了,論到主菜上碟,終於入正題講C。一黎就出最堅係,講pointer。夫pointer者,C之上乘內功心法也,只要精通了pointer,你就等於學了C的精髓,可以寫出超快的程式,pointer是其他程式語言所沒有,最接近assembly的存在。接下來作者講新一代C-99的語法,主力指出上古時代那些課本教壞人的寫法。嚴格來說不可說教壞人,只是當年的compiler有技術限制,不能不那樣寫code,現在的compiler強勁多了不再有那些限制,不求甚解的人照跟舊寫法,其他有更方便更易讀的寫法。最後三分一本書不知作者玩野定show off,教了大一堆超強macro,可以讓C模仿新一代高階程式語言,連OOP都可以在C做到,只能寫個服字給他。不過我始終是舊時代的C人,對macro十分抗拒,因為macro好鬼死難debug。其實點解要用macros寫那麼複雜的語法呢,為什麼不索性用C++算數?

讀過了這本書,就升級成為新一代的C人,識寫新C。

Programming Linguistics – David Gelernter and Suresh Jagannathan

早前因工作上的需要,要設計一個新的程式語言,在網上找參考資料時,遇上了這本早已絕版的奇書。差不多每篇有關程式語言設計的論文,必定引用這本書。這引發我的好奇心,於是我大學的圖書館中,找來這本書借來一讀。不看猶自可看罷方知自已井蛙觀天,雖然自中學以來寫了程式超過二十多年,卻從來沒有思考過何謂程式這個最基本的問題。一直還以為自已寫程式功夫不錯,原來不過是學到幾個招式套拳的外功,這本書說的卻是寫程式的易筋經心法。讀過這本書,面對任何程式語言,也都可以一理通百理明。

一般教寫程式的書藉,通常從程式的文法和應用例子作教材,學生跟著練習題去學,慢慢便可以寫出像樣的程式,可是始終有點兒像鸚鵡學舌,沒錯能夠寫程式,但卻不明白程式是什麼。但這本書沒有教任何一種特定的程式語言,而是從語言學的角度,去分析歷史上重要的程式語言,到底新的文法帶來什麼的轉變,而同時亦指出不論什麼轉變,也都是萬變不離其中的基本觀念。

書本一開始便澄清什麼是程式,程式不是軟件或硬件的分別,甚至電腦本身是否存在也不重要,程式是一個抽像的機器,只是知訊的某一種狀態。程式語言只是代表程式的符號,任何程式語言在抽像的層面也是共通和等同的,只是不同語言設計的重點取向,有意無意左右了程式編寫員的思考模式。整本書的靈魂便是第二章中,提出的完美程式機器的模型。不論任何程式,也可以用時間(函數)和空間(記憶)去表達,而這兩者是可以互相轉換。靜止的程式源碼和運行中的程式,在抽像層面是同一樣東西,不過是時間和空間的關係改變了。

接下來的所有章節,都是回顧程式語言的發展,把每一個重要里程碑的語言,用完美程式機器去分析作比較。書中提及的程式語言,隨了做學術研究外,現今已沒有什麼人用。反觀現在最流行的幾種語言,本身並沒有獨創性可言,只是在走前人開發出來的路。這本書寫於一九九零年,超過二十年前。可是過去二十年,程式語言的發展卻停滯不前,只是不斷建立更多的程式庫,但最在基本的程式語言的思考方法上,與二十年前比較沒有多少突破。

始終這是一本大部頭的學術書,我很難在此以有限的文字,用三言兩語把書中慨念表達清楚。我特別想說的是,當我讀到完美程式機器的理論,我感到叮一聲開竅的感覺,多年來寫程式不明所以的地方,就在這一刻豁然領悟了。若果寫程式也有禪的話,這無異便是頓悟的境界。讀電腦的朋友,靠寫程式維生的朋友,這是一本會改變你想法的書。這書本學校不會教亦無法教,因為要寫程式多年,心中產生無數問號,才可以看懂程式的玄妙。