我们的高科技明天

当计算机已经普及到连手表都有完整的ARM平台的时候,洗衣机居然还不能自动洗衣领,真的让人有点失望。当然,也有类似的小发明(衣领净小机器http://www.idea78.com/06/22/683.html),但无法组合成一个完整的系统。

 

其实我对可编程性一开始就很感冒。微软费了那么大的功夫,终于让他们的一些大型应用程序具备了可编程性。如Office可以通过VBA(Visual Basic for Applications)来编程,甚至可以由第三方应用程序通过它的COM接口来编程(比如C、C++、Delphi、C#、VB、VB.Net等,注意,COM是支持C语言的,不一定要用C++)。Microsoft Forefront防火墙也支持可编程性。Hyper-V支持可编程性。VMware和Virtual Box也同样支持可编程性。

 

传统的命令行程序,只要不是交互性的,一般也都可以通过程序来调用。如sort、uniq、cpsio(剪贴板复制)、tee、wget、wput、copy、move、gvim、python3、winrun(启动窗口应用程序)、7z、adjvol、mencoder等等不胜枚举。

 

最大的可编程性在于程序库。无论是C语言的标准库、C++的标准模板库、python的标准库,或者第三方的库如fmod多媒体库,每个函数都是可编程的。有些语言还支持与其他语言的接口,进一步拓展其性能,比如,可以为python编写C语言的模块,也可以让C#调用C语言的函数。

 

有了可编程性和可组合性,就能够真正地做成一个应用系统,而不只是单个应用程序。将来,再加上灵活的机器人技术和一定程度的人工智能(可控程度的,如输入法和语音识别、语意分析这样的人工智能)就可以做很多事情了。

 

说实话,我虽然是2004年本科毕业的,但我早在1993年就接触计算机了,接触的第一门计算机语言BASIC则是早在1991年,通过看我爸读夜校时的那本教材。计算机这行业是随着计算机性能的提高才逐步降低其入门的技术门槛的。如果放在1990年的样子,样样编程都要用Turbo C、Turbo Pascal在DOS上面写,估计没几个人能学会。通俗易懂的BASIC当年都不是正规军,现在即使是功能强大到和C#平齐的Visual Basic .NET都还是让人觉得使用它来编程的程序员仍低人一等。

 

想当年,由于C语言在中国还比较新,那时清华大学的谭教授写的书都漏洞百出。BASIC的处境毕竟要好得多,因为它简单易学。

 

1998年的时候,我在念高中。那时学校里计算机课上教FoxBase,但我却对DOS感兴趣。那时无论是学校还是家里都没有网络,吸收课外计算机知识的途径并不多,主要靠的是书籍。一本《MS-DOS 6.22》使用手册,清华大学出版社出版,作者是郑全战,成秀珍。郑全战后来去了微软,2004年Tech Ed的时候我参会时看到过他,他当时正在介绍时新的Windows XP SP2中的新功能。后来他去了腾讯做了首席架构师。我当时还去学校图书馆看《电脑爱好者》合订本。《电脑爱好者》里面有很多有趣的软件介绍和使用技巧,甚至还有一些完整的C语言小程序。当时我并不懂C语言,曾经抄过一个在DOS中使用鼠标的程序下来,但在我懂C语言的时候,抄有那个程序的纸张已经被我扔掉了。

 

那年还读过一本《The road ahead》中译本。这本书是比尔盖茨在1995年写的。讲的是互联网。说实话,那时我对互联网并不太懂。所以看了半天还是云里雾里。我对于互联网这种大杂烩一样的东西是不太感冒的。经过了好多年,我才觉得我对互联网有了一些理解。

 

当年还有一个炫酷的东东叫iMac G3,这是我有史以来最喜欢的苹果电脑造型,没有之一。后面的Mac的设计真的是无以望其项背。

 

还有一个臭名远扬但又令人爱不释手的东西,叫Windows 98。它功能十分好用,但是就是老是要死机。无论是当年流行的哪样软件,JetAudio、WinAmp、WinZip、WebZip、Get Right、Irfan View、Photoshop、ACDSee、Microsoft Frontpage、Macromedia Flash、Macromedia Authorware、Acrobat Reader等等,都跑得很欢。然而,死机时间在十分钟到四小时不等。死机时有时有蓝屏出现,有时则是整个系统失去响应。后来在我们这样一个D版大国终于找到一个救国的神器,它叫Windows NT,后来就变成了Windows XP及其子孙后代。

 

而我个人的经历,大学时代当然学了好多好多课程,基本上每学期10~15门左右(有的课程延续多个学期),当然大四的课程少了很多。学了好多课程,有数学的(线性代数、数学分析 [章仰文老师版]、工程数学、抽象代数、数理逻辑等)、物理的(大学物理及其实验课)、化学的、生物的、语文的、英语的、制图的(工程制图)、金工实习等等。有一些电子的(电工实习、装配收音机、数字电路)。当然大头是计算机方面的:硬件方面有数字逻辑、计算机组成与系统结构(胡越明老师版)、微机原理(8086汇编)、微机原理实验(8086微代码编写和系统连线)等;编程语言有C语言和C++,而Java没有正式教过,但却让我们用它来做编译原理的大作业;其他课程有五大:数据结构与算法、操作系统、编译原理、计算机网络、数据库管理系统,以及计算机图形学、人工智能、自动控制、模糊逻辑、语音识别,以及毕设时学的一点自然语言处理。当初学的算法都是比较基础的算法,动态规划和贪心法听说过但没有仔细学过,后来自学了一下动态规划的两个关键点:主问题分成同构的子问题来求解,子问题的解可以被缓存在一个字典里(这个技术叫memoization),这样,同样的子问题可以不必算两遍。

 

大学时候的网络大作业做了一个HTTP Server,能服务静态网页,里面实现了完善的与浏览器配合的静态网页缓存机制。图形学大作业做了一个Graphics Conclusion。下图是Graphics Conclusion的渲染效果图。这个程序可以说是我大学时代做过的最复杂的程序了,总共160KB代码,6000多行。不过还是羡慕那些更牛的同学,做了一个杀毒引擎出来,但最牛的同学都研究理论,比如后来斯坦福博士毕业的大牛Qiqi Yan。

 

 

Java太令人讨厌了。我把我的计算机内存好不容易升级到256MB,没想到跑一个Java就吃掉50多兆。而且启动速度巨慢(比后来认识的C#还慢不少)。这大概也就是为什么我没有走上Java之路的原因。直到现在,还是不太高兴开Eclipse写安卓程序,就因为Eclipse是跑在Java上的。

 

04年我刚工作,那时新学C#,觉得它功能怎么那么弱,性能又比不上C++,感觉像是在玩一个玩具。后来才明白,C#和Java这样的“玩具”语言存在的价值就是,让你编程时不容易出错——所有错误在编译时和运行时都有严格的检查,除非是逻辑错,否则那些内存越界啊、野指针啊、重复释放啊之类的问题要么不可能发生,要发生就马上抛出异常。后来到了09年才意识到C#可以通过Platform Invoke(平台调用)很方便地调用C语言的函数,以前对C#的“玩具”看法真的是误解了。在单位,也有机会做一个C++程序,完全基于Windows API的一个抽奖程序(不知道下次请客吃饭有没有可能拿来用用)。还做了一个C++的ActiveX控件,能在IE里面用,可惜的是没有数字签名,每次都要被警告说不安全。

 

06年,我C#已经用得很熟了,07年我还做了一个当时很著名的——上海国际电影节网站(SIFF.com)。最复杂的一个C#项目还数广播电视信息管理系统,花了两个人一个半月的时间才做出来。后来又去做了一个Managed C++的天气、交通和财经编码程序,按照一个二进制编码协议把数据分包发送,通过无线网络,再让移动终端接收。这大概是我第一次接触移动终端吧,可是我做的不是移动终端上的编程。对此我现在看来,也不觉得后悔——因为小内存的移动终端编程最多就像DOS那样,内存要省着用,而大内存的编程,在应用程序的逻辑上则和Windows没太多区别了,只是界面是触屏或按钮罢了。

 

Linux玩过一些,Fedora Core、CentOS、Ubuntu、Slackware。玩的过程中了解到,Linux上的程序要不是UTF-16兼容的(或至少是UCS-2);要不就是UTF-8兼容的,要不就是ASCII兼容的(ASCII兼容的一般都是些古董程序,现在很少了)。很少有DBCS(如GBK)兼容的程序。而Windows里面则新的程序大多数是UTF-16兼容的,老的程序有很多是DBCS兼容的。这样一来,Linux的配置和Windows就会不一样,一开始我老是想把Linux配成GBK(主要是LC_CTYPE,但也可以用LANG或LC_ALL),结果老是出问题。后来配成UTF-8以后就好了。Linux和Windows之间交换压缩包的时候,为了避免乱码,最好用7-Zip或RAR这样用UTF-16格式的,而不要用zip或tar,因为它们用UTF-8——到了Windows上就用DBCS解释了,非ASCII的文件名就变乱码了。

 

08年和09年,我终于工作于大的软件上了——之前的小项目代码量都不超过500KB。这次接触的两个软件都是10MB规模的。发现对于这样规模的软件,要注意一点,就是查找某个函数的引用时,要观察它是从哪个包(或哪个名字空间)过来的。因为查看函数的扇出时,大软件和小软件是一样的。但查看它的引用时,一个常用函数在大软件里面有时会有数十乃至数百个引用。所以一定要注意查找自己想要看的地方。而且不能不用编译软件或IDE来查找引用——用grep是会不准的。

 

10年,我又了解到Windows上大型C/C++程序的一些特点。其中一个很重要的点,就是用Application Verifier来验证程序,比如没有访问越界啦之类的问题。另一点,就是C/C++的变量,除了全局变量和静态变量外,其他的默认都是没有初始化的。new/malloc得到的变量,在debug版本里面每个字节会被初始化为0xCC这样(烫烫烫烫烫烫烫B,嗯,GB2312,你懂的),但release版本里面为了性能考虑,真的不会初始化,导致所在位置可能就是垃圾数据。还有就是64位C/C++程序里面,long还是32位。只有long long或者__int64才是64位的,或者用DWORD_PTR类型也行。

 

业余时间里开始做一个C#库,里面都是些常用的数据结构封装以及实用工具类,如数据库方面的、Web方面的等等。还包括一个B树。还没做完,做完了开源共享出来。另外,包含众多命令行功能的python库的一个程序包叫cmdtools,也在做,但正式版还需要一段时间。

 

曾经发明了一个叫AceTree的东东,但没有时间做完。以四年后的今天来看,它的思想类似于淘宝的商品分类(英雄所见略同):不仅仅是标签(tagging),而且每个标签有自己的大类,比如“季节”大类里面有春、夏、秋、冬四个标签。这样一来,就不再需要目录分层(目录可以只是按照大类的一定排列来构成的一棵树),其灵活性会比目录要好很多,也十分方便用户查找。

 

高中时候(1998年左右)也设想过一个安全的操作系统。以今天的眼光来看,它类似于iOS的安全模型(所有操作都需要用户设置为允许,或单独批准)。又一次见到我当初的想法是多么的超前:-P

 

10年到14年做了好多服务器端的应用软件。软件相当有年头,而且越做越完善。其中有一个值得称道的地方,就是那么多年来,在工作中还首次用了一下算法设计,设计了一个优化算法,把一个原本O(n^2)的算法优化成了O(n * log n),具体还是相当需要思考的,两个星期在思考这个问题,某天突然灵感发现才写了出来。

 

BAT?百度,阿里,腾讯。从最终用户的角度讲,百度以搜索引擎起家。阿里是做电子商务的。腾讯是做即时通讯的。百度什么都做,知道,贴吧,Hi。目前最看好的是百度轻应用,它是HTML5应用平台化的一次不错的尝试,如果做好了可能很有市场。阿里也开始做即时通讯。而腾讯也做了电子商务。总之,现在不比以往了。但是从技术积淀来说,腾讯的IM也确实特别好用。

 

金山毒霸?毒霸突然出现,难道它的实时防御做得真就那么好?杀毒软件不是光看引擎好就好的。查杀病毒只是它的一部分能力。Windows 95/98/Me上,根本就没有绝对的安全可言。即便是NT(通俗来讲就是WinXP系)和Linux(嗯,我们可爱的小企鹅Linux)上面都有rootkit,何况没有自主访问控制功能的Win98系。这代表了金山也开始做一些其他的尝试了。虽然金山WPS才是最经典的软件,但在这D版横行不以为耻的国度,再经典的软件也经受不起啊。

 

中国的软件产业其实就毁在D版手里了。都已经几十年了,还在流行D版。用正版为荣,但用D版不以为耻,甚至还有人嘲笑用正版的人。难道就是因为那些软件不是国产的就应该用D版吗?那些用D版的人,难道不是即使是国产软件,也喜欢用D版的吗?所以正是D版害苦了中国的软件产业(我是这样说的,xchilde是这样说的,tinyfool也是这样说的)。现在说IT行业不景气,是因为人员过多。但是,另一方面来看,再不景气,美国的软件产业依然比中国发达许多。即使是德国,也有SAP那么大的软件公司。中国的软件公司呢?金山连BAT里面都排不上。BAT一个是掌握了用户的使用习惯(百度),一个是掌握了用户的网上交易(阿里),一个是掌握了用户的数据(腾讯)。没有一个是纯靠软件来赢得用户的(当然,它们的软件做得都还不错;但始终只说明,软件本身不创造利润,必须依附在它们的平台上才行;或许这也就是为什么云计算将在中国大行其道的原因吧)。

 

IBM玻璃硬盘——美好的理想,无奈的现实。IBM在197x年发明的温彻斯特技术硬盘本来是非常可靠的。玻璃也是个美好的事物。但是做成硬盘之后,玻璃的脆弱才显现出来——坏道频现。最后,当年75GB风靡一时的玻璃硬盘不得不停售。IBM的硬盘部门也卖给了Hitachi,而Hitachi也不再生产玻璃硬盘,还是回到老路,做铝合金盘片。

 

360简直是笑话中的笑话。啊哈,周总不要打我。但我说的是,这东东有两个问题:一是它和3721上网助手有点渊源。上网助手一开始的面貌是个不错的软件,但出了一些版本之后就变成了流氓软件——怎么也卸载不掉,系统里面怎样也都有残留,而且还会运行。这让用户怎么想?怪不得后来用户都改用苹果iOS——只有这样的控制严格的系统才没有流氓软件(安卓似乎都不能完全防范流氓软件)。二,360一开始的角色就是给盗版XP系统打补丁的!微软早就有Windows Update了,而自动更新是自Windows 2000开始就有的功能,为什么还要这么一个第三方软件来搞这事?原因只有一个——盗版系统Windows Update会不知不觉装上微软的反盗版补丁,而360会跳过这些更新。正因为这个原因,360的东西看起来特别diao丝,就是后来出现一个360安全卫士的杀毒功能,都让我觉得是不是皇帝的新装那样子——能查杀极少量病毒(几千个?漏过几百万……),而又排挤竞争对手产品(金山毒霸、瑞星、腾讯电脑管家等)。还有着流氓软件、泄露用户数据隐私等骂名。

 

锤子手机?嗯,干得漂亮!它说,我们不生产iPhone,我们是苹果的搬运工。他们把苹果对等的硬件和一些实用的软件特性实现在他们的手机上面,并在硬件的某些特性上做得更好。其实这就是2.0公司的体现之一。当然,他们也必须小心不要侵犯专利。

 

苹果iPod Shuffle?不务正业。说实话要不是SONY的MP3卖得太贵,我也不会去买三星的,但是苹果的iPod Shuffle我看了以后立马就拒了——又贵又不实用,没有显示屏,怎么用得舒服?iPod Nano和iPod Classic还都可以,就是小贵。iPod Touch是个不错的设备,iPhone也做得可以。但是iPad是我不会给自己买的东西——对于平板,我要它能运行以前的PC软件,我会考虑像华硕Transformer Book T100那样的平板,但不会是iPad。而且,iPad上的软件也的确在实用性上远不及桌面程序。也就是说,我要的平板还是要跑桌面操作系统的。目前市场上这样的平板只有Windows平板(Linux平板也有听说,但中国买不到)。

 

SONY?真正过硬的数码硬件厂商。想当年,Sony和Philips联合开发了划时代的设备——CD唱片。这正是后来电脑上应用的CD-ROM的前身。没有它,那后来的DVD、蓝光设备都不会出现。当年JVC联合了Matsushita(松下)、HITACHI(日立)等公司而推广的VHS格式录像机在普通用户之间得到了普及,但是专业视频拍摄者最钟爱的还是参数更高、画质更好的Sony Betacam。Sony的Mini Disc也是对磁光盘(MO)技术的一次不错的尝试,让用户早在磁带时代就能够拥有这种先进的无磨损的数码录音设备(虽然卖得相当贵)。如今,Sony把Sony Ericsson收购以后,它的安卓手机也照样做得很扎实。而它的那些高端视频设备、摄像机、照相机等也都很靠谱。

 

嗯,神马语言都是图灵完备的,所以什么语言都是一样的吗?只有在终极意义上才是一样的。从实际使用来看,就是不一样的!举个例子,传统BASIC,比如GW-BASIC,你用它来写函数调用看看?什么?没有函数?怎么办?用数组来模拟栈。什么?没有结构体?用多个数组来模拟一下。什么?多个函数使用的变量各异?自己想办法用多个变量解决。什么?没有malloc?你自己写一个?用数组实现的内存池?还得每个类型分别一个数组?或是自己搞序列化?你疯了吗?于是Dijkstra说的已经脑子坏特勒的程序员就是这样诞生的。

 

又如Visual Basic,它的继承和多态完全得靠ActiveX来实现。本身根本不支持继承和多态,连函数指针(函数引用)都不支持。VBScript都有函数引用,都比VB先进。还好VB.NET另起炉灶搞了一套,否则又得残害多少苦逼程序员?

 

还有C、C++。这两个明明是中级语言,但又有多少用惯Java的程序员想要转过来?这两门语言要用好,没有捷径,好好学,把书看完,多编点练习程序,理解透彻,就学会了。不认真看书的,想照着Java里面依样画葫芦的,没门!嘿,我说你呢!学C#的也一样,要学好C/C++得好好看书做练习。

 

还有PHP,这个被调侃为“拍黄片”的PHP,不知道从多少门语言里面吸收了语法,Perl是一个,Javascript又是一个,搞出来的语法极为混乱。早就该被废弃了。情愿用Node.JS也不要用PHP的。PHP虽然也支持什么闭包,什么协程(状态机),但是这就像是在一坨屎上面放点糖,还是不能吃。

 

ABAP,这个语言的能力已经达到(乃至在某些方面超越)Java了。但是要用它来做并行编程,要取得好的性能,真的是特别困难。

 

好在大多数现代语言都具备了常用的基本功能。终于不至于太头大。

 

Fabrice Bellard是牛人啊!

 

Andre Victor做了FreeBASIC,真是有才。不过我的想法更为夸张。拭目以待。

 

展望未来:
home云。什么?私有云布置在家里?不,我们不是传统的云厂商,我们就是做家庭云的。我们没有公用云。您的家庭的电子设备就构成一个云。每个设备的容量各异,您可以按照需要部署数据。可以有一台核心的存储服务器,或者用您的多个移动SSD组合亦可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值