太阳是黑色的

少年听雨歌楼上,红烛昏罗帐.壮年听雨客舟中,江阔云低断雁叫西风. 而今听雨僧庐下,鬓已星星也! 悲欢离合总无情,一任阶前点滴到天明.

Archive for the ‘在键盘上冥想’ Category

实习感言(二)

上周就实习的初步印象抛出了一些感性认识,其实后来我仔细思考以后,还是发现了一些深层的东西。

就整个开发流程和工具来看,公司还停留在上个世纪70-80年代的思路。当然,有人对这种满屏字符,只用VIM、Emacs的方式推崇至极。然而就效率性而言,我还是看不到这样做的意义。有一个强大的集成开发环境已经是80年代以来大多数语言开发能否普及与否的共识。比方说,因为代码深处某个地方的拼写错误,在集成环境下可以不费任何力气找出,而纯文本环境,也许就是一上午的时间。这一点和是不是熟练的开发者关系不大,因为代码量上去以后,再熟悉的人也需要合理的工具。

公司的环境和语言虽然落后,但是我却深深感到了这种方式对于公司发展的合理性。一个能够生存30年的公司,技术的稳定性是最重要的。在早年的时候,关系数据库还没有成形,SQL的国际标准还没有制订,Java还要等上十多年才被发明,一切当然只能自己做。那么现在呢?那天,我带着同样的疑问问了公司的老板,SQL那么成功,公司的数据库软件居然不原生支持,让我有一些不可理解。然而,老板却说了这么一句话:SQL的标准形成才10年,Java也不过流行了10多年,我们有30年的历史,在这30年里,流行的东西来来去去,而我们的技术却稳定了下来

这是一句实话。20年前,最红火的语言和开发平台现在已经无人知晓。谁能保证Java的未来和SQL的未来呢?30年,技术变换风云,唯有客户的需求是永恒的。满足客户的需求是最关键的业务。而要随时都能够去满足客户的需求,技术的稳定性就尤为重要。所谓稳定性就是说,版本的升级、功能的加入要非常平滑。不能上一个版本是C++,下一个版本是Java,然后又想换Python。这其实没有意义。换技术需要成本,况且在实际开发中,特别是已经积累了大量代码的软件公司眼里,语言,的的确确不是最重要的东西。

尽管开发环境丑陋,但是产品只要能够达到客户需求,产品只要能够延续,就是胜利。这一点,我们国内的开发者通常看不清楚,经常爱陷入各种技术平台的论战,而忽略了讨论需求本身。

于是,公司使用一个完全不支持对象的开发语言从1970年代直到现在。所有的产品都能够非常完美的衔接。这不得不说是一个奇迹。

—————————————————————————–

然而,我还是很不理解Linux下开发的一些“习惯”。因为要配置某个运行环境,我的一位同事在我的机器上满屏幕字符的飞快配置了足足4个小时!Emacs和Shell屏幕交相辉映,快捷键用得我眼花缭乱。但是,我一方面佩服这位仁兄的技术水平,另一方面,我着实不明白那么多配置文件和脚本的是为了什么。说到易用性,我不得不佩服微软。在微软的平台下开发程序真的是享受,用过Visual Studio的人,很难认同缺乏那么多功能的开发环境。

实习感言

已经实习了一个星期了,最大的感触还是上课和搞科研的自由度大一些。工作的压力还是比较大。

目前还没有开始做正式的项目,但是到这个小公司的实习却给了我很多启发。有管理方面的,有技术方面的。管理方面的我可能还需要观察一段时间才能看出一些名目,不过这一个星期的开发学习,让我对于这个公司技术方面的感想还是逐渐清晰起来。

这个公司的产品大多数是和报纸出版有关,也就是排版和印刷相关。此公司虽然人数不多,不过客户群体还是很大,目前最近的客户是基于旧金山的全美最大的华人日报《星岛日报》。如此小规模的公司,成立于1975年,已经在淘汰率极高的软件行业摸爬滚打了30多年,不能不说是一个小小的奇迹。

第一天去公司把我吓一跳。公司的开发语言是公司自己开发的语言,编译器是公司自己开发的,调试器是公司自己开发的,数据库是公司自己开发的,网络服务器是集成Apache并且经过改写的。公司10个左右的产品均是又自己的开发语言所编写。这种情况已经持续了将近20年。然而,公司本身的技术人员,特别是开发人员并不多,核心的开发人员也就3-5个人!

吓一跳之后就是痛苦的持续到现在的开发经历。公司的语言是类Pascal语言,我在1997年到2002年有过几年Pascal的开发经历,然而没有集成环境的开发,仅仅依靠编译器,开发进度非常之慢。命令行的调试器对于大型程序来说根本就太过于原始。最后,仅仅是Emacs的语法高亮都成为了唯一能够帮助的奢侈品。整个工作的感觉就像是上个世纪70-80年代。因为没有语法提示和高级开发工具(如Visual Studio、Netbeans和Eclipse)的成员提示功能,根本就不清楚语言库内提供了什么功能。经常为了一个简单的函数要去查询浩如烟海的文档。注意,那些文档的编写都非常差,基没有例子,就仅仅写了一下函数的功能,更何况所有的开发手册有4-5卷本,两三个牛津字典那么厚。没有索引和指导在这样的文档里面找一个函数的使用,简直就是大海捞针。

网络开发环境和一般的Web开发环境,比如PHP、ASP.net、JSP都非常不一样,有一点类似模板外加控制代码的意味。然而整体的流程确实在后台的服务器组件中完成的。这一切都是公司自己的语言编写的。尽管现在有很庞大的软件在这上面编写完成,但并不意味这这套东西就没有问题。首先,后台的服务器组件不能区分POST和GET,有点匪夷所思。并且对于Session的支持也非常有限。没有事件的概念,更没有什么URL重写这些现代的东西。

数据库就更是夸张。首先,公司的数据库都不是严格意义上的关系数据库,而是自己写的数据引擎。并且与SQL不兼容!数据库查询不能使用强大的SQL,这在今天看来很不可思议。然而,整个公司的存储方案都是类似于结构文件的方式。因为没有SQL,关系数据库所带来的一切便利这里都用不上。而很多基础的东西明显缺失。比方说,没法生成唯一的递增序列作为数据的标识,只能使用很丑陋的方法模拟。更严重的局限在于,索引的字段的长度只能是255个字符,单个索引的字段长度不能长于127。常常一个简单的功能都让人困扰半天。

我的同事在另外一个项目中工作,那个项目使用了非CVS也非SVN的自己编写的原始的代码管理工具,效果是,可能还不如没有版本管理。大家经常覆盖相互写的东西。

看我写了那么多抱怨的话,是因为我这几天真的被磨得有一点没有脾气了。我一方面很佩服一个这么小的公司居然能够维持这么复杂的软件体系,一方面我的确非常不理解这样做的真实意义所在。如果说20年前,开发工具、调试工具、数据库工具都没有成熟的话,那么时至今日,市面上随便都能够找到开源的免费的好的替代产品。

最要命的还是编程语言的问题,此开发语言不能和现有的很多语言集成,比方说C,C++,或者Java。再加上人力物力的原因,语言库的开发又跟不上,文档就更旧,让人整个在浪费时间。

另一方面,对于团队开发,不使用开发工具,那完全就是自欺欺人。完全依靠一个简单的文本编辑器和原始的调试器,开发编译器是可行的,开发应用软件,那就是扯蛋。

不过,唯一让人钦佩的是,国内哪个40-50人的小公司想过开发自己的编程环境或者是数据库?考虑到这个公司存在了30年以上,不能不说还是有一些值得借鉴的地方。

我们的计算机教育

那天和朋友聊了一下目前国内的计算机教育的一些问题。这些问题主要体现在这几个方面,首先是课程比较老,一些课程的教材严重过时,比如我目前在学习的“计算机体系结构”主要介绍的体系结构就是上个世纪70-80年代的结构,不少体系结构已经过时,应该采用国外的最新原版教材。第二个问题就是老师照本宣科,这主要还是因为老师自己的水平所决定了。一些老师可能稍微要好一些,基础知识没问题,可是完全脱离现在最新的科技前沿,学生自然也不可能接触到比较新的技术。

最重要的问题是,目前不少学习计算机的学生严重缺乏实验的机会。不少学生几年以来都没有进行过开发工作,不仅没法继续进行科研深造,就连在社会上工作也显得不太可能。

总之,我对目前我所学习的计算机感到十分失望。我希望能够在研究生阶段换一个环境。

一个时代的结束

Borland公司终于出售包括Delphi、JBuilder、C++ Builder、C# Builder一系列响当当名字的IDE产品线。很多人一看到这则消息就知道,一个时代结束了。的确,以IDE为核心的Borland公司走到了尽头。IDE逐渐不再是一个高端的核心技术,而成为了一项常规技术。Borland公司在开发者心目中的地位应该来说无容置疑。各个层次的开发者基本都使用过Borland公司的不同类型的产品。

记得初中的时候开始接触到Pascal,就是使用的传奇的Turbo Pascal编译器,最开始的时候觉得这门语言比Basic要复杂多了。关键是定义特别严谨,甚至觉得麻烦。但是用久了以后发现了其强大的功能,便有一些爱不释手,当然主要还是因为要参加竞赛。后来听说了基于Object Pascal的Delphi,便毫不犹豫地想向这个领域进发。不过遗憾的是,因为很熟悉Visual Basic,总觉得Delphi的开发有一些繁琐,主要还是因为不懂得面向对象的很多东西。所以,我曾经好几个下午站在书店看Delphi 3.0的书,也能用Delphi搞一些简单的开发,但是还是没有把这个工具作为开发的首选。

2000年以后,开发和兴趣逐渐转移到网络平台上,对Borland公司的产品也基本是关注的状态,其他的产品使用得非常少。但是这仍然不能阻止我认为Borland公司是一个伟大的公司。遗憾的是,在.NET和Java逐渐夹逼的岁月中,Borland,这一商业公司终于做出了利于整个公司重组的决定。这不能不说十分艰难和痛苦。但是,这也是必须的。眼下,单纯的IDE已经越来越不能适应全面的开发工作了。大多数开发需要一些列的工具与解决方案,产品开发的周期工具正成为一个趋势。如果不转移公司的重心,Borland公司就没法在新的形势下生存。

也许就是这样,IT产业中有很多悲情,而Borland公司则总是悲剧中的主角。但即便如此,这个英雄式的人物赢得了大家的尊敬和崇拜。愿Borland公司走好。

IA-32 Intel Architecture 读书笔记(1)

IA-32 Intel Architecture 读书笔记

IA-32架构的简要历史
Intel微处理器的架构历史其实并不长,而每一代的分界也十分清楚。唯一需要我们去理解的就是,微处理器的分代和微处理器的产品编号并没有本质上的联系。也就是说,几个不同型号的微处理器也许是一代产品,使用的是同一个架构,而少数相同型号的微处理器,则完全使用了不同架构。
第一代微处理器
第一代Intel的微处理器当然就是著名的8086和8088了。这一代微处理器的技术指标主要有以下几个方面。
8086拥有16位寄存器和16位的外部数据总线,20位的地址总线,使得可访问的内存达到了1MB。8088和8086非常相似,不过只拥有8位的外部数据总线。从第一代微处理器开始,Intel就加入了对分段内存管理的支持。4个16位的段寄存器可以让8086和8088支持每一个内存段都达到64KB大小。通过一个段地址和一个16位的偏移地址,可以组成一个20位的地址访问整个1MB的内存空间。
保护模式的引入
Intel 286芯片引入了跨时代的“保护模式”,这一个模式成为了今后数十年程序运行的主流模式。保护模式降低了内存中任务之间的干扰性,保护了各个任务的流畅运行。同时对分段内存管理的进一步加强,使得可以形成24位的地址访问16MB的内存空间。
32位微处理器
Intel 386是IA-32家族的第一款32位处理器。它拥有32位寄存器和32位的地址总线,可以访问4GB的物理地址空间。对于每一个任务进程都享受独立的4GB物理地址空间。
从386起,处理器开始支持分段和分页两种内存管理模式。对于分段,还支持了“扁平”(Flat)模式,所有的段寄存器都指向同样的地址,也就是说一个32位地址就可以访问整个4GB的物理空间。对于分页,则使用4KB作为一个页面的大小,并且支持虚拟内存管理。
Intel 486微处理器
486处理器主要在并行处理能力上进行了改进,增加了8KB的一级缓存,集成了x87浮点运算芯片。以往,浮点运算器并不是微处理器的一部分。同时486还开始支持电源管理用于笔记本电脑市场的开拓。
Pentium微处理器
Pentium处理器增强了数据处理速度和能力,一级缓存增大到了16KB,其中8KB用于代码,8KB用于数据。尽管寄存器依旧是32位,但内部数据总线已经增加到了128位或者是256位。其后,Intel MMX的引入则极大的扩展了Pentium多媒体的处理能力,其中SIMD使得数据可以在64位的MMX寄存器上并行执行。
P6家族处理器
在Pentium之后,Intel微处理器的内部硬件结构发生了很多变化,在没有改变Pentium的整体架构的情况下,性能的提升主要来自很多细微的地方。P6家族的处理器包括:Pentium Pro,Pentium II,Pentium II Xeon,Intel Celeron,Pentium III,Pentium III Xeon。
Pentium Pro增强了缓存的能力,一级缓存有8KB,而二级缓存达到了256KB。同时,地址总线达到了36位,这样就可以访问64GB的物理地址空间。
Pentium II的一级缓存有16KB,二级缓存分别支持256KB,512KB和1MB大小,并且加入了MMX技术。
Pentium III引入了流水SIMD(SSE)技术,并且新增了128位的MMX寄存器。
Pentium 4 处理器
增加流水SIMD扩展2指令集(SSE2),扩展支持128位浮点数的运算。扩展了一系列的硬件特性,支持超线程技术。

以上就是IA32 架构的粗略的发展史,我主要是侧重软件编程方面的介绍,重点关注对软件编程会产生影响的重大变化。我们发现,IA32这么多年的变化,从软件的角度来讲并不是特别大,原因之一就是要尽可能得与以往的代码兼容。在这一点上,Intel无疑是十分成功的。很多8088和8086代码都可以运行在非常现代的Pentium4的处理器上,最大可能的减少了软件的迁移代价。然而,因为硬件条件的逐渐变化,尽管内存的段页式管理从386就基本确立下来,但是内存的访问空间却是不断在增大。这里就隐藏着整个32位系统最大的矛盾,寄存器的位数和地址线的位数一直不统一,当然,这一方面为段页式内存管理提供了方便,但一方面则使代码显得不优雅。到了P6家族,除了寄存器的位数还维持在32位,所有的处理位数都大大多于32位。这在很大程度上也阻碍了处理器性能的继续提高。所以,64位时代的到来肯定是毋庸置疑的。

虚拟机的研究工作

这两天沉迷于虚拟机的研究工作。最初对虚拟机的认识要追溯到2003年了。心中一直以来隐隐觉得虚拟机是一个非常重要的技术。特别是因为Java和.NET的原因。最近查阅资料才发现,国外的虚拟机技术已经有了很多重要的突破,包括剑桥大学的Xen项目。而在商业公司中,虚拟机的应用则是更加广泛。且不说像微软、IBM这样的大公司在研究虚拟机技术,光是不少移动设备的小公司都展现出了对虚拟机的浓厚兴趣。

虚拟机技术的发展也间接说明了兼容性和互操作性成为了当今计算机的很大问题。正是因为这些问题才会出现虚拟机技术。而当今的虚拟机技术无疑都是和操作系统紧密结合的。不管是硬件虚拟、软件虚拟,还是半虚拟技术,都脱离不了操作系统。这说明,操作系统的互操作性已经非常引人关注了。

未来几年中,虚拟机和操作系统还会有很新的发展。我会逐渐把最近的研究成果逐步公布出来。希望能够引起更多人的兴趣和讨论。

Web 2.0?

说实话,自从2000年来,我的开发中心就一直是网络开发,虽然没有太大的成绩,不过对网络开发还是可以说几句体会。网络开发和桌面程序开发的最大区别可能就在于,网络开发的程序员需要知道很多杂乱无章的东西,比如HTML、CSS、JavaScript、XML、DHTML和各个浏览器的令人烦恼的差别。同时,作为网络开发的开发平台,ASP、PHP、JSP到后来的ASP.NET、Ruby On Rails都并不是那么优雅,需要非常多额外的工作。

那么现在很多媒体叫嚣的Web 2.0是不是就能解决这一切呢?可笑!如果稍微有一点技术背景的人就会知道,Web 2.0根本就不是一个合理的解决方案,甚至完全就是一个圈套。用AJAX这样的丑陋框架,只能解决一时的问题,但是客户端和服务器端的编程模型的差异造成了没法更好的表达业务逻辑和数据。同时,浏览器也制约了更好的用户交互。用JavaScript去控制页面,本来就是一个笨拙的方法。令人费解的是,那么多人为Web 2.0歌功颂德,真不知道这些人怎么想的。

不统一网络开发和桌面开发,永远就没法做到更加合理和优雅的网络开发。

值得一提的事,微软的XAML似乎是一条解决道路。

《MSDN开发精选》停刊了

突然看到这个消息,我有一点失落。这个杂志我是从创刊号一直买到了最后一期,18元一本,一个并不便宜的价格。说起来,这不是第一本我从创刊号买到最后一刊的杂志了,《开发高手》是上一本。我还记得自己前年12月份拿着最后一本《开发高手》,站在德胜门地铁站的时候,泪流满面。我难过得不是一个杂志的停刊,而是中国软件业居然容不下一本介绍技术的杂志。后来,多出了《MSDN开发精选》,虽然都是介绍微软的技术,而且大多数技术并不是当前的主流技术,还是未来的一些技术的介绍,但是我觉得仍然是不可多得的资料,可以扩宽很多思路。遗憾的是,一年多,这个杂志又停掉了。

中国偌大一个国家,就只剩下《程序员》一本专注软件业的杂志了。这怎么让别人国家的人去想象?很多人抱怨,《程序员》不合大家的胃口。可是大家有没有想过,就只有这么一本技术杂志,编辑们肯定也想在尽可能的篇幅内多介绍内容。很多人喜欢说这说哪,可大家有没有想过环境是依靠所有人去创建的。

没有技术杂志,没有技术的交流平台,我们国内的IT产业怎么成长?互联网是一个平台,但是更需要有很多的渠道。

这真是全中国软件业的耻辱。

新的开发环境

经过几个小时艰苦安装的安装过程,终于把开发环境进行了升级。以前的开发环境如下:

Visual Studio.NET 2003
SQL Server Developer Edition 2000
.NET Framework 1.1 SP1

现在的开发环境如下:

Visual Studio 2005 Team Suite
SQL Server 2005 Express Edition
SQL Server Management Studio Express CTP (November)

安装这样的环境并非赶时髦,主要还是想体验一下新的开发环境带来的便利性。不过,这几个产品的安装也的确颇费一番周折。特别是SQL Server,本来准备安装Professional Edition,无奈对内存的要求特别高,也就作罢。

把以前的项目导入VS 2005中,发现编译的时候生成了100多个错误,看来微软C++的编译器都有了一些变化,还得把这些错误给更正了。

以后的开发就在这个新环境下了。

开始查阅资料

今天开始看一下我想搞的一些东西的资料,确切地说就是虚拟机和编译器方面的。那天在剑桥大学网站上看了比较详尽的XEN的介绍,想必半年前我在CSDN上看到的一点点信息来说无疑是丰富了不少,不过还没有细看。

根据彭老师的一些建议,我还是打算把虚拟机构建成能够生成Java字节码或者是CLI字节码的机器。这样也许兼容性要好得多。虚拟机在国内大学中无疑不是重点课程和研究方向,但是国外的很多大学都有这方面的研究。其中,今天查到资料,斯坦福大学的一个博士就构建了一个虚拟机??Joeq。而这个虚拟机已经成为了斯坦福大学计算机系编译原理课程的一个基础。另外提一句的就是,斯坦福大学的编译原理课程的教授者就是龙书的作者,Jeffrey Ullman!

另外,找到了Flex(Lex的快速版本)的源代码,正好可以研究一下,扩充这学期的成果。也可以用于构建编译器。

目前的任务就是好好看看Java虚拟机和CLI的规范。不过,阅读量比较大。还好,已经找到了几篇比较这两大虚拟机系统的论文。