撇清一層歧義:標題中的阿里不是指阿里巴巴集團,喜馬拉雅也不是指那個做音訊頻道的公司,文中所及內容以及我本人都與他們沒有任何關聯。依照地理正式名稱:阿里指的是西藏西部阿里地區,喜馬拉雅指的是青藏高原地球最高山脈。
從前我在部落格園不叫這個名字,今天很多自己的早期文章我都遮蔽了,這些系列作為回憶形式,再回部落格園來發布,這裡沒那麼多事。我的程式設計經歷都是不正規的游擊戰,不具備參考價值,正式職業是喜馬拉雅自然風光攝影師,作品發表於國家地理、星球研究所、Getty Image,程式設計是眾多興趣愛好之一,程式設計風格和技術選型隨心所欲,屬邪門歪道,與正規院校程式設計專業價值觀違背,請勿仿效。
這個系列分為三篇,在第三篇連載完成時,會同時釋出一個最新的基於AOT的專案。
- 一,從井到Sharp
- 二,安納普爾那的雨季
- 三,喜馬拉雅山中的AOT
一,從井到Sharp
1990年, 小縣城郵局門口書攤, 這一期的《少年科學》說了一個故事:70年代的美國車庫裡誕生了很多公司, 那是計算機崛起的年代, 在矽谷經常有一些技術青年聚會,有搞無線電的,有搞民間軍事技術的,有自制計算機的, 通常都是一個做技術的和一個搞投機倒把的組合,創造了後來的新時代,其中, 一對叫比爾和艾倫的組合, 還有一對兩人都叫史蒂夫的組合。這一期雜誌說了比爾和艾倫一邊寫basic,一邊建立了新時代的公司,於是我越看越覺得有趣。 (另外那兩位史蒂夫的故事,十年後才在另一本書中得知更為精彩)
1994年,小霸王學習機, 附帶有一本非常有價值的說明書,很厚的,說的是basic語言, 但是當時沒有能力看懂,大家都說這是“電腦”的語言, 當時不叫計算機, 而是叫電腦、 腦! 我打 print "helow" 的時候,它給了我期望的回答, 然後我想當然的打了一個 print "what's your name?" ,它卻沒有給我期望的回答。那麼這樣一來,好像這個電腦也就是個大型計算器,比爾就是個賣計算器的,只不過把事情搞得稍微複雜一點,看起來更高階一些,就來錢了。 (basic的列印命令是不是叫print,現在也想不起了。但是這個 what's your name, 直到16年後才由 siri 給出了回答)
1995年,《電子遊戲軟體》做了三期連載,叫《世嘉五代與超級任天堂的對比報告》,有一個作者投稿反常識的說到世嘉五代要優於超級任天堂(第一期他贏了,第二期一位辯方把兩者提升到中立,第三期另一個辯者終於把他披得體無完膚),三篇文章兩個作者在技術方面都相當專業,說世嘉五代是用C編寫遊戲, 超級任天堂用匯編語言編寫遊戲,於是重點就是:我知道了專業的程式語言有C和彙編兩個東西。 好像大型計算器的說法也不對,還是有點東西在裡面的。
1996年,我在桂林新華書店買到一本書,叫C語言程式設計,16塊錢,那時候一碗粉5角錢, 可以吃32頓。 終於可以見識一下什麼叫C語言, 原來有常量、變數、指標、指標的指標 這麼幾種概念,語法也和basic不一樣, 苦於當時電腦比毒品還貴,沒有條件上機實踐,後面的結構、迴圈 等,難以理解和體會,沒關係,腦子裡面有了點概念指標可以用少的東西操作多的東西,有很多一般人看不懂的符號,和電影裡看到的那種有點像,這叫高階貨。
陸陸續續的,在1997-2000年間,各地都開辦了電腦遊戲室,那時候不叫網咖,沒有網, 就叫電腦遊戲室,玩的是區域網紅色警報聯機,我經常逃學,並且教唆同學和我一起過去玩,一去就是整個宿舍,通宵呆在裡面,最後和老闆混得有多熟呢, 他後來送了我一輛山地腳踏車,那輛車值700塊錢。
我們是組隊來打的,3 vs 3 ,我最常用的套路了一開局,就半分鐘內能造多少兵是多少兵,然後把主機兵營礦廠什麼的全都賣了,彙集所有人光棍上去衝,因為這時候我已經沒有了電力消耗,可以看見地圖,朝著大致的方向找到敵人,彙集所有火力打他的電廠,幾秒鐘他就沒電就瞎了,因為大多數人都是傳統建造方法,這時候他沒有兵,空擁著一堆沒用的建築,只能眼看著我打爆他的礦廠, 然後我就跑,不再和這個殘廢耗時間了,馬上找下一家繼續同樣的辦法,這麼一來他們那邊經常有兩家在五分鐘內被我幹成殘廢, 第三家我就不打了,因為這時候對方第三家應該發展得有點規模了,但是這時候我有雷達地圖,我就指揮同僚:你們兩個彙集一起,朝著尚未殘廢的那家集中火力同時轟過去 ………… 最後他們都不和我玩了,我就自己玩系統,把windows95的控制皮膚裡面所有的功能全部一一開啟來研究都是些什麼東西,因為當時我有一本很厚的書叫《windows95作業系統》,那是1996年我寫信委託遠方的表哥給我買的,每天我就拿這本書去電腦室裡面一一對照著操作,有時候也開啟系統內建的basic來玩一下,當然也有很多看不懂的東西,藍色畫面更是家常便飯。 最後系統玩得有多熟呢,那時候學校裡也有電腦課,年少蒼狂,我號稱去上課純粹就是給電腦老師面子了。(後來才知是誰給誰留了面子,在老師講解多個進位制之間怎麼轉換的演算法時,這是掃地僧與遊坦之的差距)
2001年9月, 在南寧新華書城看到一本書,叫 《C井程式設計語言》, 這個字讀井,蒼井的井,好奇這是什麼東西,好歹我之前也聽說過c語言家族的各種變體,翻開一看,似懂非懂的東西, 說指標不安全,什麼亂七八糟的, 鑑於從沒聽說過這東西, 敢一下時髦,咬咬牙買回去,22塊錢, 食堂一碗粉8角錢,也接近28頓了。
後來大學幾年,我大概瞭解到這個c井是執行在一種叫.net framework的外掛上的, 開發工具在五張一套的光碟裡,但是這幾年下來我一直沒法執行 hellow world. 當年的basic好歹還會原樣返回"what's your name.", 好幾次嘗試,我一度懷疑自己是不是買的光碟有問題, 一套光碟25塊錢,陸陸續續買了好幾套都嘗試不成功。 這什麼破東西,靠外掛來執行,一看就不是什麼正規貨,最簡單的hellow world都執行不起來,你們另外那幾張光碟的什麼 j井、Vb井、C++井什麼的也全都不是什麼上得了檯面的貨色。 騙我起碼花了200塊,我一個月的伙食費就400塊。 書裡面還說了不裝那些光碟也可以, 命令列裡面敲打 csc test.cs 也可以執行, 可是為什麼我的電腦總是提示說沒有找到csc命令? 看來這也是個假貨。這本《C井程式設計語言》就一直放在旁邊,時不時不甘心了拿出來研究一下,但是沒有一次是成功的。
平時我每月都會省錢少抽幾支煙,買《電腦自做DIY》來看,這本書的硬體知識非常專業,看多了,也就成就了以下:
我和那個賣光碟的混得比較熟,經常帶同學去照顧她生意, 那麼現在我自己的事情找她,說有一套visual studio .net 光碟有問題,換了好幾個光碟機都讀不出來,你給我換一套3d mark 02。 她肯定要給我換,我是她的財路,不敢得罪我(這種事我也就只做過這麼一次)。 當時我們繫有幾個裝機佬勾結商家,騙同學去買奔騰4 1.6 + 微星技嘉845pe主機板 + ddr256 + mx440 + 優派或三星液晶螢幕(顯示器3500-4000塊左右,商家回扣可以拿100塊), 同樣的價錢我自己裝的電腦是 奔騰4 1.6 + 華碩850主機板+ Rambus 256 + ATI 8500 + 索尼特麗瓏顯示器, 我拿回這套 3d mark 02, 全流程滿速執行, 完整的 directX 8.1 支援,有一片海洋的畫面和另外兩個陽光穿透的畫面,那是三個畫素渲染專案,必須dx8.1硬體支援才能看見,電腦城的裝機店老闆員工都圍過來,說從沒見過,12000分, 你們 6000分連流程都跑不完,臉都不知往哪放,我主機甩你們500條街、我顯示器甩你們1000條街(那時候的液晶顯示器確實是要被甩的),瞬間我在大一就成了全年級最專業的硬體專家,每天跑測試、刷顯示卡、做3D渲染、什麼裝機、買防毒軟體、系統重灌、全都來找我、我不拿商家回扣,只帶同學裝最高效能的主機,一傳十 十傳百,我裝的電腦跑分是最高的, photoshop是最流暢的,我放DVD的時候那個畫面美啊,放的都是 珍珠港、臥虎藏龍、角鬥士、鋼琴師、兄弟連、拯救大兵瑞恩 …… 沒有金像獎不要進我的光碟機,加上特麗瓏顯示管的那個畫面,每次都必須有一群人來我旁邊圍著看,反觀你們的液晶顯示器那個一片慘白死黑。 幫同學裝機的好處是什麼呢,有人請飯吃,有飲料喝,平時同學見面各種學業問題也好說話。 兩年後, ATI 8500顯示卡可以刷成 ATI Fire GL,Maya 可以100萬多邊形實時貼圖渲染,這是又一輪高潮。 這麼好的生活, 編什麼程呢, 什麼 hellow world 和我一點關係沒有。這種體會,不知道你懂不懂。
但是不程式設計不行,事情是這樣的:
我們是藝術院校,當時除了做設計作業、畫油畫、學Maya 3D渲染、吃酸菜魚、還有另一個心中的秤砣沒落地,我接任了某個動漫專業網站的站長, 我在尚未接任前兩年就一直和各位前輩以及同僚吹風說,我們需要建立自主可控的自動化會員註冊,雖然我們目前依託在動網論壇程式上,但那不是自己可控的技術,實際上我們自身的內容系統全是依靠html+ftp來更新,這樣內容一旦增多,可能維護不過來的。 這個心病一直每隔幾天就發作一次, 但是不知道怎麼辦, 沒人會, 資料庫我們買不起,而且就算是買了也不知道怎麼弄, 後來我就一次次跑書店技術專欄去看, 就是瞎看, 沒有頭緒的瞎看, 至少要建立起一個網站程式是怎麼執行的這樣的概念, 皇天不負苦心人, 我看到了一本 dreamweaver 程式設計,裡面有一個簡單的拖來就能操作access資料庫,可以儲存一些東西的例子,還有一個叫資料集的東西, 能讀取資料庫中的表格, 而我們的網站也是動網論壇5.0+access, 空間肯定是支援的,然後我就在空間上執行起這個小例子,果然成功了,這個東西叫asp程式,好的,我們的會員註冊系統可以實現了,以後我們就以asp為基礎做大。
那麼接下來,動網論壇的一些置頂、精品帖子、現在要怎麼同步到我們網站首頁,怎麼開啟資料庫看一下里面是什麼東西, 這點常識我還是有的, office 2000 就可以開啟了,但是看不懂,看起來就像是表格一樣的, 它和SQL又是什麼關係。 光碟老闆娘的生意又來了,三張一套的SQL2000,15塊錢,我一週的煙錢。 SQL這個名字那麼高大,還是大寫的,有點腿發軟, 電腦報上面報價80000塊錢的東西,我這15塊有沒有白花。(事後結論是白花了,但這是學費)
現在的問題有三個: asp程式、動網論壇同步內容、 資料庫操作, 這三個問題解決的話, 困擾我們網站的事情就能解決了, 但是目前對於三個問題的認知都是0,只會在dreamweaver裡面拖一些小工具。
幸運的是,我們論壇有一位已經在外做程式設計工作的會員,我時不時向他請教一些關於asp的問題, 一開始,牛頭不對馬嘴,我連提問都不知道怎麼提, 用白話來描述問題, 而他的專業術語回答我是根本就看不懂。 什麼叫資料庫伺服器, 我們的動網論壇算不算資料庫伺服器, 什麼叫資料集、怎麼連線Access,還有一個叫OBBC的是什麼東西, windows2000控制皮膚裡面有一個叫資料來源的東西,裡面看起來像是各種各樣的資料庫,有哪些是我們的空間當前可以使用的。
(在那個年代,我們這些小網站是執行在“空間”上的,支援力度非常有限,是商家從IIS中隔離出來的一片程序和指定容量的一片磁碟空間,並且當時因為一傳十十傳百的說IIS某些功能不安全,於是商家們就把IIS能關的功能都關得快乾淨了, 那是一種連虛擬機器都不如的東西,記憶體256M算是海量的2002年,今天的虛擬機器放到當時是不可想象的高價物品,對於我們這些學生來說,可以理解為無)
當時隨處可以下載到的一份SQL語言入門chm檔案,看了一個星期,原來也並不是電影裡面那種看不懂的符號,select * from table where id = 10 可以解決很多困擾眼前的問題了。再加上好幾個月過去了,SQL入門chm配合他給我徒手寫的一份OLEDB 操作Access的就200多字的簡單asp程式,我也把每一行程式碼表示什麼意思都研究透了,原來是這樣,我終於可以擺脫 dreamweaver的控制了。(他是至今唯一教過我程式設計的人,那份200字左右的asp程式碼,也就是我唯一的敲門磚)
我開始了記事本寫asp的時代,那時候,每天寫很多遍,當時已經熟練到可以徒手寫完 conn.open(......."那個什麼=4.0的那一長串"......) OLEDB資料庫連線字串,網路也漸漸變得普及了,我一上網就翻看各種asp詳細知識,那個叫資料集的東西,正式名稱是recordset, 但是有時候僅僅透過conn本身也能實現簡單的查詢。
各行各業都有賊船,一旦上去,就下不來了,程式設計也是這樣,正是因為ASP越看越深,出了一個插曲:有一個人在某個技術社群說到:asp 也是可以使用 class 的,但是這是一種“假”的class。(今天已經想不起怎麼寫了,有一點印象是類似 IF -- END IF 這樣的包含語法)那麼什麼才是真的class? 以及什麼是class? 賊船就是從這時候開始遠航了。
這時候我才逐漸加深了認知: asp 不是語言名稱,它是一個iis的功能平臺名稱,我們正在編寫的語言, 準確名字叫 vbscript, 相應的,還可以用 jscript、perl 來編寫asp。 如果使用jscript,這個語法很像我多年前僅在書上見過的高階貨:C. 這種風格看起來更有前途,而且它可以前後端共用一套語言,豈不美哉,於是我嘗試把編寫過的程式全部用 jscript 重寫,順便能夠學習到第二門語言,說幹就幹。(“前後端共用”是今天打這篇文章的時候才會用這個詞彙,當時哪有什麼前端後端的認知)
時間來到2003年,jscript重寫變得更加高效,可以用更少的程式碼做更精簡的檔案模組, 我在各處都晃眼看到asp無論是vbscript還是jscript都不支援完整的物件導向, 那麼,什麼是物件導向? 這是一種聽起來既時髦,又可以顯得很有學問的感覺。有一種感覺是暫時先把事情停下來,以現在打下的基礎,重新認知一下程式設計的世界,以及我們的程式需要怎麼樣的語言來做重寫, 走過的vbscript 彎路不能再重蹈。 (今天我不認為那是彎路,asp-vbscript是一個很好的小型平臺解決方案,至今都是)
英特爾釋出了超執行緒cpu,一個cpu可以變成兩個cpu, 電腦廣場都做大型露天活動來宣傳, 但我認為Athlon 64 更優秀, amd同樣有超執行緒平臺, 但更重要的是 amd有64 位cpu,64位是未來,也是時代正在變革。 於是我把更多的精力花在新同學裝機要他們首選 Athlon 64 ,作業系統也換做 windows xp 64位版本, 我說話還是有用的, 3d mark 2002 的分數打下的江山, 再加上他們看到我現在天天刷顯示卡, 比起那些騙同學回扣的裝機佬,這是膜拜級的碾壓, 請不請我吃飯無所謂了, 我只要你們拿64位cpu + 64位系統讓我也時不時在你們的機器體驗一下各種資料的快慢。 (當時英特爾雖有超執行緒,但仍屬32位cpu,他們的64位重心在安騰和至強, ddr平臺能夠發揮奔騰4全頻寬的865和875晶片組尚未面世, 殘廢的845系列我是堅決不會推薦的, 至於我正在用的850晶片組,rambus記憶體雖然發揮了p4全頻寬,但是32位的時代已經是落日餘暉了)(那時候我裝機裝到可以背誦下 j2mv9-jyyq6-jm44k-qmyth-8rb2w,今天有誰能一眼看出這是什麼東西的序列號嗎)
體驗時代變遷的同時,我暫停了jscript重寫網站,先花兩個月再認識一下程式語言的過去和未來,跑書店,看網站,兩個月過去,雖然很多年前接觸過C的概念,但是一直沒接觸過C++, 只知道老闆娘那裡有一種visual c++ 6.0 的光碟很好賣,但是視窗裡拖動控制元件做桌面程式那是與我們的網站需求天各一方。 C井的hellow world 始終無法執行,我手頭還有另一本書,叫《Java 程式設計入門》,物件導向三個語言: C++ JAVA C#,我的物件導向,是從 JAVA 這一脈開始走開的。
不管面向誰家的物件,java有一點它能吸引我去看的,是一次編寫,隨時隨地執行,它是真正跨平臺(至少官方文字是這麼宣稱的),雖然我執行不起c井,但是我多多少少也從各種渠道瞭解到.net是假的跨平臺(那時候尚未有Mono,那是OS/2、Solaris、MAC OS 7,Windows 2000 的時代,java 把它們全實現了,而微軟所謂跨平臺的 windows ce,windows iot, .net micro framework、電視機頂盒,人盡皆知這些都是什麼貨色,沒有意義),但是我有一種感覺:1999年,摩托羅拉L2000www手機上市,它內建一個wap瀏覽器,並且內建調變解調器,拿著手機就能訪問網站,當時各大雜誌鼓吹:我們即將進入僅靠手機就能移動辦公的時代。 如今4年過去了,移動辦公的概念是一根毛都看不見。 那麼這個叫java的東西今天說一次編寫到處執行,是不是四年後同樣也一根毛都看不見?先初步學一下再說,當初研究dreamweaver的時候,裡面有一個叫jsp的東西,好像就是和這個java相關的,能不能用java這樣的“正規語言”讓我們的網站也執行在既正規又高階的平臺上。 以及它看起來和asp的jscript,瀏覽器小動畫裡面的小指令碼javascript,似乎是有關聯的。
又是幾個月過去, 高階貨的class寫法果然和vbscript的class不一樣,透過構建器可以複製很多獨立的副本,透過繼承可以精簡很多重複的程式碼,這就叫物件導向?那麼我用 prototype.XXX = YYY 也可以實現繼承, new function 也可以實現獨立副本, 這不就是蘋果換個名字叫蛇果,葡萄換個名字叫提子可以多賣一些錢嗎。直到有一天我在新華書店裡面遇到個人,他看到我站在java相關書籍前面,就問我有沒有見過BEA什麼組建相關的書籍, 我說我剛入門, 還不知道這些是什麼東西, 他的解釋我也聽不懂, 在於他很好說話, 我也就向他問起了物件導向的疑惑, 而他的耐心解答我還是聽得懂的: 你還沒學習多型。 而在你完成了封裝、繼承、多型後, 可以更上一層樓進入泛型的領域,並且他從頭到尾和我流暢解釋了一遍物件導向三要素, 那是個神人,有資格去尋找BEA什麼我聽不懂的東西, 感謝他的耐心指教,我回去惡補java知識,把那些很難看的章節硬是灌輸下去,三要素學全了,目前能夠直接發揮用途的就是繼承,要不要先用jsp來重寫一遍試試? 這時候我也不敢那麼快就下結論,或者再考慮幾天再說。(多型的使用需要配合介面繼承,在大型專案上做功能隔離,實現某些功能的熱切換,這樣才能體會到意義所在,要不然只會書中例子裡的 object a = 1, object b = "abc", 這是自欺欺人,當時那個小網站,不具備大型結構來使用多型,也就體會不到)
當時和我一起同租一棟房的鄰居養了一個小狗,那小狗經常跑到我屋子裡面來玩,於是我們人之間的話也多了起來,他也是個做程式設計工作的,我說我也在學習程式設計,他問我用什麼語言,我說用asp, 他說哦,那是vb小指令碼,我好奇問到,你呢? 他說我們公司最近用.Net,已經做了.Net開發一年了,平時用C#開發。我又和他求證了一遍: 你剛才說C什麼? "C-Sharp"。 原來那個字不念井。
無論是念井還是念Sharp,重要的是我好幾套光碟白買的事情,世面上有一套新的 visual studio 2002, 我咬牙再買一套回來,hellow world 總應該可以執行了吧。
當我把 visual studio 2002 開發環境裝完,照著書裡面的例子重新敲一遍 hellow world. 果然不出預料的的依舊報錯沒法執行, 比爾蓋茲你這個騙子騙我買了第五套光碟,難怪美國國會要拆分你們公司,難怪你當ceo要下臺,你這個四眼仔印堂發黑看你那張臉就不是個什麼好東西,你什麼新官職技術長, 你家的爛東西狗屎不如,難怪 sun 公司的 java 把你打得不分東南西北 ....... 省略一百罵字 (見識有限,罵人都不知道應該罵誰,如果罵得專業一點的話應該罵安德斯.海斯爾伯格)
當時已經有了QQ群,我也加入了幾個群,上去照樣一通罵, 有個通情達理的人讓我把程式碼發出來看一下,一發過去,晴天霹靂: 你那是最早的2000年初測試版程式碼,現在你應該把Microsoft 換成 System 就可以了。 這個五雷轟頂的訊息促使我不睡覺也要重試一遍 hellow world. 果然,Microsoft 換成 System 就成功執行 hellow world 了。(微軟的這個把頂級空間改名的習慣在2013年k演變到vNext的過程中同樣再次發生)
之前罵錯人了,我本來想罵的是保爾蓋茨,不小心說成了比爾而已,人家比爾蓋茲本來就是個有為青年,我怎麼可能會罵他呢,金絲眼鏡顯得文質彬彬又有學問,年紀輕輕一表人才,16歲就會程式設計開公司,人家躋身全球幾位,被國會拆分也是國會看得起它,以後一定前途無量。
這本《C井程式設計語言》,2001年初出版的,作者寫書的時候是2000年。從那天開始它成了我擦桌子的原料, 吃一頓飯就撕一頁下來擦,有時候小狗過來撒尿,就多撕幾頁下來擦。印有作者名字的那一頁,我貼在門背上,用來當飛鏢把子。
拿出那些 visual studio .net 、 2002、 2003,細看,發現那幾套25塊錢買來的光碟用料特別好,背面文字印製得相當精美,這字型一看就是出自大師手筆,拿在手上沉甸甸的肯定是正規貨,光面的反光比太陽還亮,晚上可以當夜明珠。
待續第二篇
最後附註至部落格園