[技术帖]透过现象看本质

刚才猎手在QQ群里问了一个关于auto_ptr的问题:

如何从一个

std::auto_ptr<TMemoryStream> MyStream;

里取得一个“TStream *”类型(VCL中TMemoryStream派生自TStream)的变量?

令狐道:试试 &(*MyStream) 看看

猎手一试:果然可以。令狐,(TStream *)应该也可以的吧

令狐:不行

猎手:为什么

猛禽:运算符重载

令狐:MyStream实际上是一个auto_ptr的Object,不是一个真正的指针。我刚刚给你的操作利用了auto_ptr的operator*重载,而auto_ptr没有也不可能重载 operator (TStream *)

BTW:偶曾经干过为auto_ptr增加重载 operator( T * ) 的事,后来看了Andrei Alexanderscu的《MCD》(其中关于Smart Pointer的那个章节)才发现,这正是一个昨天被我批过的“小技巧”。-_-|||

=====重载的分割线======

C++里像运算符重载这样的东西是很妖的,这也是为什么后来的JAVA/C#都不再提供这样的功能。

因为作了重载,所以我们所看到的这个运算符、以及我们所设想它实现的功能,很可能已经不是它实际上的效果了。

很多问题并不是我们看上去的那个样子——不只是C++,也不止是技术。

[技术帖]开源与用户成本

mike_shi的BLOG那里看到CSDN上的这篇《“开源”亮最后底牌》,作者以Compiere、SugarCRM、Asterisk这三个软件为例,说明“开源”已经进入了高端商业软件领域,已经不再局限于专业开发人员中了。

但这不论是与像Linux/Apache/MySQL之类的开源软件相比,还是像mike_shi那与微软相比,都是不合适的。

对于ERP/CRM这类本身定制化程度很高的软件来说,代码本身并不是最重要的,关键在于服务。

SAP的系统标准程序的ABAP源代码也都是可以查看的(只要上SAP NET申请一个License Key即可),是不是可以说SAP也是开源的?

文中说到:

那些下载“开源软件”的人员大体可以分为三类,一类是该软件的技术爱好者、另一种是潜在用户,最后就是该产品的竞争对手。

其中技术爱好者一项是没有疑问的。潜在用户也基本可以肯定——因为没有服务的支持,光有软件是没有用的,SAP的MySAP也是可以下载到的,但好像没听说有人就这样自己装起来用。最后是竞争对手的问题,这最多只能是给别人提供一点参考,不能照抄。

问题在于中国可就不是这样了。在盗版的养育下很多人没有意识到:开源也是有版权的。GPL/APL/MPL都是有法律作用的License。

评论里有人说:这是自断后路的发展模式

我只能说在这样一个法制观念淡漠的环境中,开源的精神遭到了怎样的曲解啊。

用户选择软件最重要的是考虑之一是“总拥有成本”(TCO)。一般商业软件,其售价就是TCO,如盒装的Windows。而对于像ERP/CRM这样的企业应用软件来说,软件采购成本只是一部分,更多的是定期(比如每年)向软件服务商(不一定是开发商)支付的服务费,以维护系统的正常运行,以及随公司业务的变化作调整等。

换到开源软件呢?除非用户有很强的技术实力,但更大多数的用户是不具备这样的技术实力的,那么就必然是通过这个开源软件的拥有者或者别的软件商为其提供服务。这就成了开源软件商的收入来源,并对用户来说构成了一笔成本支出——不一定就会比商业软件便宜。而如果是由第三方提供服务的话,按大多数开源软件的License来说,将其作为商业用途的话,此第三方服务提供商必须取得所有者的合法授权——这笔授权费用同样是开源软件商的收入来源,并同样是用户的成本支出。用户另外还要向服务提供商支付服务费。

考虑到开源软件商的规模通常较小,这也通常意味着质量风险。风险也是成本的一部分,并且有时可能会是很大的一部分。另外还有法律问题要担心。如果提供服务的公司以违反License的方式使用开源软件,则用户可能还存在着法律上的风险。

所以,在法制环境下,所谓的“自断后路”纯属无稽之谈。法律同样保障开源软件的权益。

当然,在法制纯属空谈的环境下,则我上面说的纯属无稽之谈。开源不过是给某些人以“合法盗版”的机会罢了。同样,在这样的环境下,对开源的种种FUD都会很有效。

(本文写于昨天,mblogger的图片功能还未恢复,继续等待ing)

[技术扯淡]大技巧与小技巧

又要扯谈了。

在昨天那篇《杂而不精》中,老方在回复里提了一个技术问题,其实这个问题出自于大富翁论坛最近出版的一本书《Delphi编程专家门诊》,见帖子(请用IE打开)。

因为DFW论坛不支持FireFox(用了非标准的XSLT),所以我现在已经很少去了,曾经发过帖子向soul提意见,有人回复说他最近忙,我也就没再说这事,看来改天还得想办法联系上他再说说这事。

前两天QQ群里有人提起这本书,所以我还是开了IE上去看了一下,结果便看到有人就书中的一个话题与soul争论开了。不可否认,书里用“懒惰想少写点代码,结果却花费了大量无益的思考时间”这样的话的确有点矫枉过正。但作为一本类似技巧集的书却要特别指出这一点也是很难得的。

老子云:大巧若拙(第45章)。老子又云:人多伎巧奇物滋起(第57章)。

对后面一句,我的理解是:伎巧者,小技巧而已。奇物者,奇异而脱离实用之物。

常常会有这么一种情况,碰到一个问题,马上想到了一个解决方案,那个方案是最直接的,但需要写很多代码,不愿意,于是拼命思考如何构造一个精巧的方法使得能花费很少的代码解决这个问题。

作为一名职业程序员,最重要的是完成客户的需求。所以我们最需要的就是直接的办法,也许这个代码会比较长,但也许它恰恰是一种若拙的大巧。花费大量的时间和精力去追求少量的代码减少或有限的一点CPU时间的节约,在更多的情况下,都会是“伎巧”,这样的代码也不过是“奇物”罢了。

zhengdehei对谭浩强的代码大加赞赏,说他的代码“里面的每一行都非常的精简”。问题在于他是教育者,写的是教科书,所写的代码是为了说明相关的知识点,这样的代码是不能投入实用的。这是实验品与产品的区别,是一种本质上的区别。

网事如风提到重构,可惜他并没有完全领会Martin.Fowler在书中表达的意思。对于重构这件事来说,重构的技巧和方法并不是最重要的,重要的是发现“Badsmell”并消除之。“精巧”的代码不是重构的目标——在很多情况下,过于“精巧”的代码反而包含着不可容忍的“Bad smell”。

虽然soul在回复里试图说明他的一些大技巧观——比如精巧的设计,但这本书终归还是一本讨论技巧——而且相当一部分算是小技巧——方面的书。所以书里这段话应该说还是一剂很有必要的预防针。

(注:本文写于昨天。另,因mblogger的相册功能有问题,贴图最后一集——TP篇改在明天发表)

PP文字D

这两天到哪都能看到关于“头文字D”的消息。看得偶有点不良反应了,如同前一段天天看到FRJJ那样。-_-|||

起先我是一直闹不明白这个莫名其妙的题目是什么意思。难道是说某个人的头上有一个文字“D”么?还是安替比较厚道,难得8挂一篇,解开了我这个疑问。

头文字D,英语是Initial D,翻译就是“以D字母打头的(运动)”,也就是Drifting,飘移飚车运动,指的是赛车甩尾过弯的技术动作(就是“飘移”),是今年在美国和日本风行的新运动

真不知道是哪个白痴翻译译的。

以后要出续集的话,推荐一个新的题目:

PG文字D

绝对醒目。^O^

此行图记之七:19日——在路上

这天下午从松柏车站乘长途汽车回老家……

(以下照片均为隔着车窗玻璃拍摄,效果略受影响)

已经进入漳州

快到高速公路漳州出口时,旁边一座山上的寺庙

路边的香蕉园,漳州是国内最主要的水果产区之一。此外还有水仙花和二十年前五连冠的女排。^O^

路边的稻田。当时车速约100KM/H。

“前方5公里塌方,改道缓行”
幸好我不是乘火车回去,不然就麻烦了
另,返程时因手机快么电,故关机。开机后收到短消息一枚,与上图略有关联,故收录如下:
大叔不在服务区?…暴雨…山洪…泥石流…塌荒…不在人间?ToT各么天堂有信号伐?”——含错别字一枚。^O^

山雨欲来

突如其来的暴雨

车窗上的雨水

雨后的小山村

雨后的群山,云烟氤氲

山崖上的石刻

在山谷中蜿蜒的高速公路

[有点技术含量]杂而不精

18日傍晚玩回来,便到康乐小区边的一家饭店和同学一起吃水煮活鱼。好大一脸盆啊,哈哈哈。三个人吹着空调喝着啤酒,不亦乐呼。

照例跟他们扯起技术八卦,比如TDD,重构,MVC……貌似我已经变得越来越经常扯淡而少干实事了。

其间主要说了一些如测试先行、小步迭代、DUnit、TestSuite、TestCase等等,然后把JAVA下的那些MVC模式的Web开发框架吹了一通——其实我几乎都没有试过。-_-|||

然后把MVC的理论大加赞扬了一下,再批了一通RAD,最后大致说了一下偶最近刚想到的关于用MVC模式来改进GUI应用设计的一些想法,基本思路就是改善GUI应用的可测试性——只是一个思路,真要实践还是很麻烦的。

同学M这两年在做CallCenter,用DELPHI/COM+搞开发。其间也常在MSN上问偶一些问题,说实话,这方面的应用我只做过一些简单的。所以当他问到一些诸如改进中间层性能的技术细节问题时,我还是答不上,只好让他去参考李维的书。或是踢给MSN上的另一个朋友——“蛋蛋”。”蛋蛋”做这方面的应用已经有很多年了,相当的专业,在他的帮助下,我同学那个CallCenter还算完成得相当不错。

这天我们聊到这个方面的事时,同学M感慨说:在实际应用中碰到的问题远比想像的要多得多,这些靠扯淡是不行的,必须有实践,就连李维的书在一些关键问题上也是没有搞清楚。

我说:还好咱们有“蛋蛋”。

他说:是啊,我们公司原来做这个CallCenter的那几个程序员也是,很多问题搞不定,然后就只会说COM+技术不好。

我说:那是因为他们没有“蛋蛋”。

貌似偶好像很不厚道。-_-|||

扯得太远了,回到正题上来。

我发现我虽然对各种前卫的技术、概念、理论知道得很多(所谓的“知道分子”便是如此),但却未能对任一种技术作相当深入的研究,就像“蛋蛋”研究COM+这样。而实际上在国内软件业中,这些不知道TDD,不知道重构,不知道MVC,不知道AOP……但却专注于某一个特定方面技术的软件开发者却往往是实际开发工作的主力——特别是在非JAVA语言的软件开发中。

我以前说过,了解一项技术的关键不是知道它能干什么,而是知道它不能干什么。这才有可能真正地把这项技术用好,只有用好了才有可能做出好软件来。

看来我有必要适当减少扯淡,多做点实际的事。计划把前几个月尚未完成的动态代理继续下去,另外,关于用MVC模式改进GUI应用设计的方面要也继续研究一下,可测试的GUI应用还是很吸引人的。

每天一日–世界禁毒日–另8一下郎咸平

上周刚在厦门看到满街关于反毒品的宣传时,还以为一年多没回来,毒品问题已经到如此严重的地步了。后来才想到是因为这个“世界禁毒日”要到了。作为中国第六大最忙城市的上海,和中国第四大最懒城市的厦门,一样面临着毒品问题的严峻考验。

昨天看了郎咸平在上海财大的讲话视频,这家伙果然很有意思。其间他讲了股市的起源和发展,讲了信托责任,他对英美法系(他所说的“普通法”)相当赞赏。特别是讲到美国在股市崩盘后,为了不重蹈英国关闭股市的覆辙,罗斯福总统任命了当时股市最大的庄家肯尼迪(他儿子是后来的美国总统肯尼迪)任SEC(美国的证监会——安全交易委员会)首任主席。后来在SEC的强力监管之下才造就今天成熟的美国股市。而其核心就是:

有罪推定和严刑峻法

我想到前不久在《他改变了中国》一书中,老江在几年前也曾经谈到过这样的问题:

我也想任命中国股市最大的庄家来做证监会主席,但问题在于我不知道谁是中国股市的最大庄家。
——注:凭印象复述,没有电子版不便查询准确的说法。

但是这里的问题我觉得有几个方面。首先是在中国,庄家这样的事情属于只可意会,不可言传的潜规则的范畴,只要愿意找,还是可以找出向个庄家来,但是却难以找出一个最大的庄家。而如果要在中国股市进行有罪推定——凡是可疑的交易,如果交易者不能证明自已的清白,那就可以被定为内部交易进行处理——那又有人会担心影响到中国经济的发展。

我有时候不禁会想:“经济发展”会不会就是一剂毒品?用它掩盖了一切的问题——如同九年前的那部英国电影《Transpotting》中所说的那样:

在吸毒前,烦恼的问题有很多——没钱,没工作,没异性……;吸毒后,就只剩下一个烦恼——没钱。

在《他改变了中国》P515中提出了一种“拐点”的说法——这里不转述了,太敏感。现在也许已经快到一个拐点了,但是将会向哪个方向拐,却还不能确定。

我还是继续去看那部十七年前播过的电视专题片去。

关于域名的BT事

最近芙蓉JJ实在是太走红了,本来是一个因为“审美疲劳”而产生的新鲜事物,没想到竟能在短短的时间里红遍互联网。-_-|||

紧接着什么芙蓉GG,菊花JJ之类也纷纷出笼,一时之间,整个互联网都要被染成芙蓉色了。

下午跟色色商量着给本帮找一个NB的域名。ZTM系列是肯定不行了,都已经被人注册掉了。我们查过已经被注册的域名计有:

ztmnb.com
ztmsz.com
ztmbt.com
tjjtds.com
btjr.com
frjj.com
frgg.com
jhjj.com
……

色色说:这TMD什么世道啊都是。。。