撇清一层歧义:标题中的阿里不是指阿里巴巴集团,喜马拉雅也不是指那个做音频频道的公司,文中所及内容以及我本人都与他们没有任何关联。依照地理正式名称:阿里指的是西藏西部阿里地区,喜马拉雅指的是青藏高原地球最高山脉。
从前我在博客园不叫这个名字,今天很多自己的早期文章我都屏蔽了,这些系列作为回忆形式,再回博客园来发布,这里没那么多事。我的编程经历都是不正规的游击战,不具备参考价值,正式职业是喜马拉雅自然风光摄影师,作品发表于国家地理、星球研究所、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 2001。 她肯定要给我换,我是她的财路,不敢得罪我(这种事我也就只做过这么一次)。 当时我们系有几个装机佬勾结商家,骗同学去买奔腾4 1.6 + 微星技嘉845pe主板 + ddr256 + mx440 + 优派或三星液晶显示屏(显示器3500-4000块左右,商家回扣可以拿100块), 同样的价钱我自己装的电脑是 奔腾4 1.6 + 华硕850主板+ Rambus 256 + ATI 8500 + 索尼特丽珑显示器, 我拿回这套 3d mark 2001, 全流程满速运行, 完整的 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 2001 的分数打下的江山, 再加上他们看到我现在天天刷显卡, 比起那些骗同学回扣的装机佬,这是膜拜级的碾压, 请不请我吃饭无所谓了, 我只要你们拿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块钱买来的光盘用料特别好,背面文字印制得相当精美,这字体一看就是出自大师手笔,拿在手上沉甸甸的肯定是正规货,光面的反光比太阳还亮,晚上可以当夜明珠。
待续第二篇
最后附注至博客园