Hello World
Spiga

李笑来激起千层浪,赵姐夫力拒众强敌

2010-02-03 00:49 by 老赵, 14582 visits

昨天晚上,李笑来@xiaolai)老师的无心之语却引起了推特上一次前后长达1个多小时的讨论——当时他似乎只是随手发了一句“Apple告诉我们的铁律是:表面功夫一定要做足”便不见了踪影,但是这句话立即引起了众果粉的共鸣。此后,我(@jeffz_cn)的一句评论又引起了众人对微软开发平台的批判之声。在这次讨论中,几乎只有我孤军奋战为.NET平台进行辩解。因此事后有人给出一副对联为此次争论作出总结:

上联:李笑来激起千层浪

下联:赵姐夫力拒众强敌

横批:全民扯谈

自然,无论是我还是其他人,在参与讨论的时候都抱有明显的个人倾向性。不过与常见的吵架不同,虽然大家观点向左,但是并没有任何谩骂的成份,同时也没有假惺惺的客套话。可以说所有人从头到底都保持着就事论事,据理力争。因此从旁观者的角度来看,这次讨论并非只是意气之争,其中还是包含了比较丰富的内容。

参与讨论的霍炬(@virushuo)和郝培强(@tinyfool)都是老程序员,他们在上世纪末也都是微软平台的开发人员,但是因为难以忍受微软在那时候“毫无克制”的技术更迭(如VC => COM => .NET),最终一前一后都转投了*nix平台。我昨天谈到,我加入水果党的主要原因之一是想了解苹果机的妙处究竟在哪里,而他们两位便是让我产生这一想法的重要因素。而我,由于入行较晚,虽然“从理论上”说也经历过这一历史阶段(如VB,Delphi,以及Java开发环境混战的那一时期),但是在真正全身心投入微软平台时已经是.NET时代了,因此对于霍郝两位的观点并没有切身体会,而我坚持的观点便是:.NET平台发布至今并没有“革命性”的改变,而目前也可以看出微软已经在.NET平台上投入了未来5年甚至10年的心力,因此如今.NET程序员并不用担心遭遇当年的悲剧。

从这次讨论中可以了解到一些老程序员对(当年)微软开发平台的一些典型看法,这些看法放到现在究竟正确与否我认为并不重要,重要的是我们能够从中总结出哪些信息,这些信息又可以如何对我们将来的发展产生借鉴意义。因此,我详细地总结了这次讨论的完整内容——不过毕竟是人肉整理,不排除遗漏少量条目的可能。因此,我建议您可以上一下推特,follow一些人,这样下次再出现有价值的讨论也不会遗漏了。

由于讨论内容较多,我还是把它们放在下面的链接中了。其中,缩进代表了“回复”关系,但是由于推特的谈话性质,条目的上下位置并不表示发表时间的先后。

http://docs.google.com/View?id=dgpjrmdf_141cgbw5gfx

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

170 条回复

  1. 我是一只小老虎 喵!
    *.*.*.*
    链接

    我是一只小老虎 喵! 2010-02-03 01:03:00

    嫖悍的小老虎抢到杀花...

    劫匪哥,还没睡啊.

  2. xiaotie
    *.*.*.*
    链接

    xiaotie 2010-02-03 01:23:00

    @我是一只小老虎 喵!
    先把你给劫了

  3. 辰
    *.*.*.*
    链接

    2010-02-03 01:56:00

    看了最后的那个google doc才看到了内容。。博客园都成了你的铺垫了。

    搞得我想发表些意见都有点怪。

    按照讨论里面的思路,我也算是个幸运儿了,05年正式接触编程,系统化学习。之前都是自己小打小闹,学些qbasic、汇编之类的,由于没有积累,所以就算现在不用了也影响不大。

    不过,如果微软明天突然说,2012年,windows8将不再支持.net框架,微软将全力推出他具有战略性的 .sns 语言,估计我现在也会崩溃了。

    如果要把现在手头的类库移植到java,估计80%是没问题的,毕竟从开始积累的一刻我就压根没有想过使用第三方或者.net的高级功能(比如亲爱的linq / lambda之类的)。

    但是移植orm部分、还有其他一些细节会很麻烦。所以现在我也开始把自己的业务架构构造在一个中间语言——XML!至少XML不会说微软淘汰就淘汰。

  4. 辰
    *.*.*.*
    链接

    2010-02-03 02:05:00

    说着说着。。突然也觉得为什么BEA之类的公司会主推基于xml的业务流、比如bpel / bpmn 了。

    估计bea之类的也觉得自己的东西压在java上也不保险。

  5. RednaxelaFX
    *.*.*.*
    链接

    RednaxelaFX 2010-02-03 02:24:00

    > @jeffz_cn: 所以微软的客户端做得不够好。之前微软提出在客户端搞一个Client Profile,这样只需要下载独立的几个程序级就行了,不过这一点也闷掉了,现在放到了.NET 4中。为此,我觉得mono很不错——因为它就是个绿色的.NET环境啊!

    话说3.5 Client Profile是存在的嘛,
    http://www.microsoft.com/downloads/details.aspx?FamilyId=8CEA6CD1-15BC-4664-B27D-8CEBA808B28B&displaylang=en
    http://www.microsoft.com/downloadS/details.aspx?FamilyID=992cffcb-f8ce-41d9-8bd6-31f3e216285c&displaylang=en

    只不过client profile的offline installer居然也有快300M,这真是情何以堪……

    最近正好收集了这么一组数据:
    JDK 1.1.8 8.36MB
    JDK 1.2.2 19.4MB
    JDK 1.3.1 31.8MB
    JDK 1.4.2 49.4MB
    JDK 1.5.0 53.1MB
    JDK 1.6.0 76.3MB

    要是拿.NET FX的体积增长速度来比的话那就更有趣了……

  6. xiaotie
    *.*.*.*
    链接

    xiaotie 2010-02-03 02:28:00

    今天骂了m$一下午 我愣是搞不懂为啥有个目录删除不掉 啥权限都有 却告诉我权限不够 可能是因为那个程序目录是我将Administrator改名之前安装的 最后还是跑到安全模式下才删除掉的 *nix下就没这些问题 一些知识点 虽说第一次接触有些困难 但接触了之后 几乎可以通杀一切。
    还有现在用微软的一些东西心中感觉别扭,就拿sl来说,这个东西的未来很难说,不是怀疑ms在技术上的一些问题,主要怀疑万一这东西发展起来,威胁到windows之后,微软是不是会干些恶心人的事情,万一它发展不起来,又不知会是怎么样了。下一步要开发个产品,现在主要是技术选型,到底选flash还是silverlight?选flash,安装率高,放在web上也可,放到桌面,air即可跨平台。选silverlight,就担心上面那些问题。用了一段时间as3,开发效率也挺高的,运行效率也不比.Net低。
    再说另一个技术选型。Google App Engine 还是 Windows Azure。申请完 Google App Engine 到上传个 hello world demo,很快就搞定了。申请Azure,在几个页面之间跳来跳去,把我都跳晕了,结果是,搞了几小时,我还没把hello world搞出来。考虑到GAE有免费的限额,网速也快,最好还是决定选择GAE。
    晚上又骂了M$一次。live msger不想让它开机启动,不知他咋搞的,动不动还是自己跑出来了,烦都烦死了。

    感觉M$现在越来越僵硬。

  7. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-03 02:32:00

    貌似那些说被微软qj的人, 其实准确的说,是被COM以及它衍生出的一些东西给qj了……


    微软搞出COM这么恶心的东西, 确实有他错的地方。

    本来C++就不适合做binary兼容的事情。 C++对其特性的规定太少。 在源代码级复用是很好的, 要在二进制级复用…… 那就只能产生COM这样恶心的代码……

    要想二进制复用, 要么就用C —— 没太多特性可用,大部分功能都是由自己控制。
    要么就更进一步, 搞出CLR这样的东西, 由CLR来保证特性是二进制兼容的。

    个人觉得微软推出CLR是一种正确的思路, 而COM是这个正确思路前的失败的尝试。


    话又说回来…… 微软走错了, 该骂; 而盲从那部分同学…… 难道就一点错都没有? 微软就真拿刀架到你脖子上qj你了么? 其实你自己也原意不是……
    搞不懂那种说VC浪费了他6、7年的同学, 6、7年耗费到哪去了……
    花个3、4年, 把基本功学扎实; 那不还想用啥, 就用啥……

  8. xiaotie
    *.*.*.*
    链接

    xiaotie 2010-02-03 02:43:00

    @OwnWaterloo
    微软走的,从奸商的角度来说,没有错。像sun那样把自己搞挂了,才是大错。

  9. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-03 03:00:00

    @xiaotie
    无奸不商嘛…… 商人总是从自己的利益出发的……

    虽说.net 有将开发人员绑定在特定平台上的嫌疑……
    但在这个特定平台上, .net还是支持相当多语言相互交互的吧, 而没有用一些其他平台上都不存在的古怪语言……
    而且, 还有mono这样的项目……

    windows mobile、 或者android, 都不用开发个什么东西还要先付100刀吧……

    反感某公司以及其粉丝那自命不凡的清高的态度, 以及仅仅为了体现自己与众不同而做出一些xx举动。

    一个iphone居然可以让一门语言的使用排名直线上升, 使用该语言的同学, 在赞美的同时, 请思考 : 这究竟是不是正常现象, 会不会发生COM一样的悲剧?
    到底是这些商业公司的商业行为将自己推向了"技术换代太快跟不上", 还是自己没看清这些技术的前景, 太相信那包药了……

  10. xiaotie
    *.*.*.*
    链接

    xiaotie 2010-02-03 03:14:00

    @OwnWaterloo
    这个关乎产业链的问题。mono虽能跑,但跑不了wpf。我最近在琢磨air代替wpf的可能性——毕竟跨平台是一个很好的嘘头,且mac 的用户舍得花钱。iphone是把一个产业链带动起来了,Object C 用户才多起来。前些天和一个程序员聊天,中间谈了我的观点:技术分为产品技术和通用技术。COM这种,属于产品技术。产品技术过时是正常的。选择产品技术,好处是可以搭产品的快车,坏处就是缺乏控制力。他是要自己开发CMS,我说开发CMS本身这属于通用技术,而选择一个或两个CMS熟悉它再进行二次开发,这属于产品技术。对于他这种技术不咋样资本又不雄厚的情况来说,应该投资产品技术而不是通用技术。

  11. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-03 03:25:00

    @xiaotie
    嗯, "产品技术"和"通用技术", 好词。

    搜到以前一篇文章:《由C#风潮想起的-给初学编程者的忠告》
    http://www.kuqin.com/dotnet/20090315/40188.html

    抛开文章里面谈的具体的东西(他的个人经历, 他推荐的语言、课程、书籍), 这些可能不是对每个人都适用的。
    但他的文章(好像已经出现很久了)我认为直到现在应该都算是对每个人(至少是在校学生而言)具有价值: 就是你点出的"要区分产品技术和通用技术"。 而且, 不要浮躁, 既然是在校, 就安安心心踏踏实实的研究那些更基本更稳定的通用技术。


    而公司怎么选择…… 我就不清楚了…… 我也才毕业……


    只是看到推特上那些留言, 觉得那些抱怨被微软qj的人, 部分印证了文章的观点。
    从个人而不是公司的角度, 希望后后辈(嗯, 我是后辈……)能吸取点经验…… 不要让悲剧重演……

  12. birdshome
    *.*.*.*
    链接

    birdshome 2010-02-03 03:33:00

    看了原文,感觉这是要鼓励一下不同背景差异下的非不和谐争论?

  13. xiaotie
    *.*.*.*
    链接

    xiaotie 2010-02-03 03:36:00

    @OwnWaterloo
    不从技术人员角度思考就行了。技术虽然变化快,但搞业务的那些变化更快,客户领导换了,什么的,又得重头再来…… 我们可以做的是去适应变化。Object C 无非就是一层壳嘛。
    还有就是游击战·运动战和阵地战的选择问题。像我这种soho技术员,最喜爱的就是游击战。IPhone活了,而Object C掌握的人又不多,从技术角度想——TMD,你苹果搞什么玩意啊。从业务角度想——市场大、竞争者少,肥啊!
    前一阶段介入Flash开发,进去后发现,竞争真tmd少,只会一点东西,就可以拿1W+的报酬。进一步发现,这东东还可以开发客户端软件,性能还不错。
    再一个,“与众不同”是个很好的卖点啊,从技术角度可能鄙视这个,但,人追求的是什么?衣食无忧之后不就追求那些吗?
    mac 的粉丝为什么会有点自命不凡?俺有一点点体会——ipod刚上市那阵,俺搞了一个戴着上街。即使是俺这种比吴孟达还猥琐的男人,走在街上,也得到了不低的回头率。“与众不同”说起来轻松,做起来很难很难的,这几乎是竞争的最高境界。

  14. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-03 03:40:00

    @xiaotie

    xiaotie:
    不从技术人员角度思考就行了。
    ...
    从业务角度想——市场大、竞争者少,肥啊!
    ...
    前一阶段介入Flash开发,进去后发现,竞争真tmd少,只会一点东西,就可以拿1W+的报酬。进一步发现,这东东还可以开发客户端软件,性能还不错。
    ...
    再一个,“与众不同”是个很好的卖点啊,从技术角度可能鄙视这个,但,人追求的是什么?衣食无忧之后不就追求那些吗?



    学习了!
    离校后, 心态得换换~_~

  15. xiaotie
    *.*.*.*
    链接

    xiaotie 2010-02-03 03:41:00

    @OwnWaterloo
    孙子上有句话:“以正合,以奇胜”。对一般的程序员来说,通用技术属于正,产品技术属于奇。我个人在以前重视通用技术,但现在,我觉得产品技术更值得投资——前提是,掌握基本的通用技术。在掌握基本的通用技术之后,对产品技术的投入产出比对通用技术的投入产出要高,甚至高得多——这个结论的前提是“对一般的程序员”。

  16. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-03 03:48:00

    @xiaotie
    前辈能否指点一下,web开发领域(呃, web开发到底有几个领域…………)有哪些通用技术值得学习的?

    也请老赵不吝赐教哦~

    没事偷着学……

  17. xiaotie
    *.*.*.*
    链接

    xiaotie 2010-02-03 03:59:00

    @OwnWaterloo
    不擅长web开发 ... 汗 ... 目前主要做client, ria, server。 做web的多了,反而做这些的少了。

    照我的理解,web 通用技术无非就是 html, http, css, js 那些,然后就是在这之上的抽象了,这些抽象,《设计模式》和《企业应用架构模式》这两本书都总结得七七八八了。

  18. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-03 04:08:00

    @xiaotie
    谢谢~~~

  19. CityWalker
    *.*.*.*
    链接

    CityWalker 2010-02-03 05:06:00

    4点多还有没睡的,真是强悍!! 老大 上次问你的问题貌似还没收到你回复,还想再问问。
    问题描述:如何用C#动态生成解决方案和项目?
    我想做个工具来动态生成解决方案和项目,并把这些项目添加到这个解决方案中,主要是配置一些项目的属性,如程序集信息、输出目录、引用项等等,他们让我直接拼xml文件,感觉这个不太高级,我看了看资料发现.NET类库中好像是提供这个类的,好像有个Solution2接口,不过不太会用,还请老大指点一二,谢谢啦 ↖(^ω^)↗

  20. 超晨
    *.*.*.*
    链接

    超晨 2010-02-03 07:28:00

    加吧加吧,我也加入水果,.NET和水果两条船,呵呵

  21. 温景良(Jason)
    *.*.*.*
    链接

    温景良(Jason) 2010-02-03 08:16:00

    呵呵,纯技术的公司很难活长的,微软走的路不一定对,但是他生存下来,只有生存下来才有机会做得更好.

  22. liulun
    *.*.*.*
    链接

    liulun 2010-02-03 08:22:00

    劫匪这个名字比姐夫要好听!
    也更具赵劼的彪悍特性!

  23. 装配脑袋
    *.*.*.*
    链接

    装配脑袋 2010-02-03 08:36:00

    实在不知道VC6和VC10有什么本质区别啊。。除了VC10更标准,并且多支持一些C++1x的特性而已。

  24. LeoXing
    *.*.*.*
    链接

    LeoXing 2010-02-03 08:38:00

    当时有幸欣赏到了讨论的过程,也让我了解了很多老程序员的经历和想法。

    不过看时间,应该是前天晚上,而不是昨天晚上吧。

  25. LeoXing
    *.*.*.*
    链接

    LeoXing 2010-02-03 08:43:00

    不过我坚信老赵说的一句话:“技术是相通的,这句话不假。所以我其实一直觉得就算微软倒了我也不怕,我很快去搞Java,Ruby,Python,Unix。”
    我认为如果不能这样的话,那就不算是程序员,只是一个纯粹的代码工人。

  26. Steven Chen
    *.*.*.*
    链接

    Steven Chen 2010-02-03 08:44:00

    OwnWaterloo:

    本来C++就不适合做binary兼容的事情。 C++对其特性的规定太少。 在源代码级复用是很好的, 要在二进制级复用…… 那就只能产生COM这样恶心的代码……

    要想二进制复用, 要么就用C —— 没太多特性可用,大部分功能都是由自己控制。
    要么就更进一步, 搞出CLR这样的东西, 由CLR来保证特性是二进制兼容的。

    个人觉得微软推出CLR是一种正确的思路, 而COM是这个正确思路前的失败的尝试。




    看到这么牛的评论马上就去翻您的blog,结果发现您的blog一片空白,大牛能否写点东西指点一下虾米阿

  27. Windie Chai
    *.*.*.*
    链接

    Windie Chai 2010-02-03 08:44:00

    老赵你太有闲了……

  28. 1-2-3
    *.*.*.*
    链接

    1-2-3 2010-02-03 08:48:00

    > @virushuo: 我当年挺关心的,似乎也没见谁不操心这个。至少我就挺操心的。VC6废了,我之前7,8年都浪费了。
    要想把MFC这么臃肿怪异的东东搞明白确实要花费许多精力,只能同情ing……

  29. 蛙蛙王子
    *.*.*.*
    链接

    蛙蛙王子 2010-02-03 09:13:00

    C是通用语言,好好学学,C#是吃饭家伙,也得深入学,其它的用到在学,这两门语言学好了,别的学起来应该能触类旁通。

  30. 老赵
    admin
    链接

    老赵 2010-02-03 09:18:00

    辰:如果要把现在手头的类库移植到java,估计80%是没问题的,毕竟从开始积累的一刻我就压根没有想过使用第三方或者.net的高级功能(比如亲爱的linq / lambda之类的)。


    Java语言和Java平台是两码事情,别用Java语言,估计你麻烦不了。

    辰:但是移植orm部分、还有其他一些细节会很麻烦。所以现在我也开始把自己的业务架构构造在一个中间语言——XML!至少XML不会说微软淘汰就淘汰。


    你这个其实和XML没有关系,XML又不是C#这种语言的东西,你其实也只是用一种通用的纯文本格式进行交换而已,呵呵。
    从你的角度出发,这里的关键不是XML死不死,而是纯文本一定死不了,至于纯文本里你写些什么自然不受任何人影响了。

  31. 老赵
    admin
    链接

    老赵 2010-02-03 09:19:00

    @RednaxelaFX
    毕竟.NET的程序集,不同的版本是不一样的,所以在依赖关系上处理的会很容易,JDK这方面就要混乱一些了。

  32. Clingingboy
    *.*.*.*
    链接

    Clingingboy 2010-02-03 09:19:00

    好像MFC好像也没被抛弃,COM也没抛弃,.net开发人员用着.net
    vc用户依然还是MFC.
    两者没有影响,只是微软平台不同应用而已.
    为何很多人用了.net退回了MFC,为何像qq,淘宝,msn等客户端不用.net.
    然后大家看到vs2010了吧,是不是感觉性能不好.既然采用新技术就会有风险,但这种进步的思想是可取的.技术的进步是不止步的,一切事物都是从复杂到简单.这是很正常的事,只是人累死了...

  33. 老赵
    admin
    链接

    老赵 2010-02-03 09:24:00

    xiaotie:
    再说另一个技术选型。Google App Engine 还是 Windows Azure。申请完 Google App Engine 到上传个 hello world demo,很快就搞定了。申请Azure,在几个页面之间跳来跳去,把我都跳晕了,结果是,搞了几小时,我还没把hello world搞出来。考虑到GAE有免费的限额,网速也快,最好还是决定选择GAE。


    GAE是程序员友好的,*nix也是程序员友好的,因此它们在程序员眼中很友好。
    在我看来,Windows是企业友好的,什么东西最好通过向导等等来完成。微软卖的产品有共性,就是用起来不费脑子。
    打个比方,互联网行业一直在用的memcached,其实对程序员来说配一个很容易。但是微软搞一个AppFabric,就是可以连机器一起卖,一连,然后直接用,什么复制、Failover云云,全部一套搞定。
    于是企业欢喜,卖的出去。你让企业用memcache……许多老大们是不愿意的……

  34. 老赵
    admin
    链接

    老赵 2010-02-03 09:28:00

    xiaotie:
    这个关乎产业链的问题。mono虽能跑,但跑不了wpf。


    话说,其实我不清楚mono如果把精力放在UI库上是否值得,我认为mono应该搞好的是运行时,以及基础类库,编译器等等。UI是放在下一步的,因为似乎本来.NET在UI上的投入也不多。要说起来,WCF更值得投入,呵呵。

  35. 老赵
    admin
    链接

    老赵 2010-02-03 09:31:00

    OwnWaterloo:
    @xiaotie
    前辈能否指点一下,web开发领域(呃, web开发到底有几个领域…………)有哪些通用技术值得学习的?

    也请老赵不吝赐教哦~

    没事偷着学……


    我觉得传统Web开发,无论是什么平台,都不会学歪的。

  36. 老赵
    admin
    链接

    老赵 2010-02-03 09:38:00

    温景良(Jason):呵呵,纯技术的公司很难活长的,微软走的路不一定对,但是他生存下来,只有生存下来才有机会做得更好.


    看Borland传奇,只为Borland犯的各种错误惋惜。
    当年dBase,JBuilder,InteBuilder都是翘楚,慢慢都废掉了。

  37. 老赵
    admin
    链接

    老赵 2010-02-03 09:39:00

    birdshome:看了原文,感觉这是要鼓励一下不同背景差异下的非不和谐争论?


    这是一定要的。

  38. RednaxelaFX
    *.*.*.*
    链接

    RednaxelaFX 2010-02-03 09:42:00

    Jeffrey Zhao:
    @RednaxelaFX
    毕竟.NET的程序集,不同的版本是不一样的,所以在依赖关系上处理的会很容易,JDK这方面就要混乱一些了。


    不过那不是体积增大的理由。毕竟3.5里只有1份2.0 runtime,而不是说把1.0和1.1也包含了进来……

  39. Mainz
    *.*.*.*
    链接

    Mainz 2010-02-03 09:43:00

    什么技术和平台不能一概而论,要看你用来开发哪方面的东西了
    各种技术和平台都有其适用场景

    作为技术人员,自然有其偏好,但我想不应该局限在微软一棵树上。
    所以争吵毫无意义

  40. 韦恩卑鄙 alias:v-zhewg
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 2010-02-03 09:50:00



    我觉得 .net是那些玩win32和 com到深层的人为了改善当时怨声载道的状况,欢天喜地的作品,而且真正服务到了很多用到深处的人。

    那种平台更迭的抱怨仍然是没有底气在新的平台写hello world的人发出的。

  41. Ivony...
    *.*.*.*
    链接

    Ivony... 2010-02-03 09:51:00

    老实说我真的不懂。

    记得是N久以前看的MFC的书,侯捷翻译的《深入浅出MFC》,里面介绍的Document/View模型就好像是昨天的事情一样,到今天还在用。所以我真的不懂那些学MFC的到底学啥去了?怎么就像是被工业革命了一样。

    更别说今天搞数据库的不知道有几个知道几十年前的关系模型。

  42. 韦恩卑鄙 alias:v-zhewg
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 2010-02-03 09:51:00

    OwnWaterloo:
    话又说回来…… 微软走错了, 该骂; 而盲从那部分同学…… 难道就一点错都没有? 微软就真拿刀架到你脖子上qj你了么? 其实你自己也原意不是……
    搞不懂那种说VC浪费了他6、7年的同学, 6、7年耗费到哪去了……
    花个3、4年, 把基本功学扎实; 那不还想用啥, 就用啥……


    说滴太好了

  43. 韦恩卑鄙 alias:v-zhewg
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 2010-02-03 09:52:00

    Jeffrey Zhao:

    xiaotie:
    这个关乎产业链的问题。mono虽能跑,但跑不了wpf。


    话说,其实我不清楚mono如果把精力放在UI库上是否值得,我认为mono应该搞好的是运行时,以及基础类库,编译器等等。UI是放在下一步的,因为似乎本来.NET在UI上的投入也不多。要说起来,WCF更值得投入,呵呵。


    我认为mono UI第一步 moonlight 比WPF务实多了

  44. Ivony...
    *.*.*.*
    链接

    Ivony... 2010-02-03 09:54:00

    Jeffrey Zhao:

    xiaotie:
    再说另一个技术选型。Google App Engine 还是 Windows Azure。申请完 Google App Engine 到上传个 hello world demo,很快就搞定了。申请Azure,在几个页面之间跳来跳去,把我都跳晕了,结果是,搞了几小时,我还没把hello world搞出来。考虑到GAE有免费的限额,网速也快,最好还是决定选择GAE。


    GAE是程序员友好的,*nix也是程序员友好的,因此它们在程序员眼中很友好。
    在我看来,Windows是企业友好的,什么东西最好通过向导等等来完成。微软卖的产品有共性,就是用起来不费脑子。
    打个比方,互联网行业一直在用的memcached,其实对程序员来说配一个很容易。但是微软搞一个AppFabric,就是可以连机器一起卖,一连,然后直接用,什么复制、Failover云云,全部一套搞定。
    于是企业欢喜,卖的出去。你让企业用memcache……许多老大们是不愿意的……




    看与什么比较,如果拿微软与W3C这种NC组织比,我觉得微软显然是程序员友好的。

    其实微软在开发工具方面一直做的不错。每个产品都有其针对性,微软卖给企业的产品当然是企业友好的。

  45. RednaxelaFX
    *.*.*.*
    链接

    RednaxelaFX 2010-02-03 09:57:00

    Ivony...:
    老实说我真的不懂。

    记得是N久以前看的MFC的书,侯捷翻译的《深入浅出MFC》,里面介绍的Document/View模型就好像是昨天的事情一样,到今天还在用。所以我真的不懂那些学MFC的到底学啥去了?怎么就像是被工业革命了一样。

    更别说今天搞数据库的不知道有几个知道几十年前的关系模型。


    那本侯捷先生是作者啦,不是译者…… >_<|||

    话说我也想起一些年代事。很小就有了自己的电脑,系统是DOS,老爸千叮万嘱说关机前要先park然后halt然后按电源键关机。
    想想现在直接用鼠标点个“关机”就完事了,易用性真是提高了不少orz ...

  46. 麒麟.NET
    *.*.*.*
    链接

    麒麟.NET 2010-02-03 10:12:00

    话说这些人我都follow了,但是,twitter却上不去了……

  47. 游吟男孩
    *.*.*.*
    链接

    游吟男孩 2010-02-03 10:17:00

    有些时候觉得.Net的确更新得太快了,但是我觉得至少他在不断完善,在进步~,这点还是让人欣慰的。

  48. 老赵
    admin
    链接

    老赵 2010-02-03 10:27:00

    RednaxelaFX:

    Jeffrey Zhao:
    @RednaxelaFX
    毕竟.NET的程序集,不同的版本是不一样的,所以在依赖关系上处理的会很容易,JDK这方面就要混乱一些了。


    不过那不是体积增大的理由。毕竟3.5里只有1份2.0 runtime,而不是说把1.0和1.1也包含了进来……


    还是dll太多了,其实用到的没几个,所以绿色版,绿色版……

  49. Sunny Peng
    *.*.*.*
    链接

    Sunny Peng 2010-02-03 10:32:00

    老赵,那个doc我看了。还有你那副对联也不错,有时候大家一起扯扯淡也是不错的。

  50. 装配脑袋
    *.*.*.*
    链接

    装配脑袋 2010-02-03 10:38:00

    .NET FX安装包变成这么大都是.NET 3.0害的。。。

  51. 老赵
    admin
    链接

    老赵 2010-02-03 10:56:00

    装配脑袋:.NET FX安装包变成这么大都是.NET 3.0害的。。。


    其实依赖它们的应该不多吧,所以Client Profile希望可以小些。

  52. Ivony...
    *.*.*.*
    链接

    Ivony... 2010-02-03 11:09:00

    RednaxelaFX:

    Ivony...:
    老实说我真的不懂。

    记得是N久以前看的MFC的书,侯捷翻译的《深入浅出MFC》,里面介绍的Document/View模型就好像是昨天的事情一样,到今天还在用。所以我真的不懂那些学MFC的到底学啥去了?怎么就像是被工业革命了一样。

    更别说今天搞数据库的不知道有几个知道几十年前的关系模型。


    那本侯捷先生是作者啦,不是译者…… >_<|||

    话说我也想起一些年代事。很小就有了自己的电脑,系统是DOS,老爸千叮万嘱说关机前要先park然后halt然后按电源键关机。
    想想现在直接用鼠标点个“关机”就完事了,易用性真是提高了不少orz ...




    按一下电源按钮就可以了(Windows会接到关机指令),连关机都不必点。。。。Wintel联盟还是为人类做出了不朽的贡献的。。。。

  53. liucr
    *.*.*.*
    链接

    liucr 2010-02-03 11:21:00

    其实,他们完全没有意识到学习和使用技术也是有风险的,技术是会淘汰的,当风险来临后,他们只是不能接受这个风险造成的损失,而去指责那个技术,那个技术是没有过错的啊。

  54. hoodlum1980
    *.*.*.*
    链接

    hoodlum1980 2010-02-03 11:28:00

    @OwnWaterloo
    不要胡言乱语。讨厌你们这种不负责任的随意评论。从你的结论来看你根本就不懂COM,还评论什么。

  55. hoodlum1980
    *.*.*.*
    链接

    hoodlum1980 2010-02-03 11:36:00

    @Clingingboy
    两种语言(平台)的追求宗旨不一样。.NET 的设计本身就不是为那种高效的windows程序而设计的。 .NET的假设就是硬件资源不是限制和问题。所以和VS这个软件的发展一样,把资源往死了用。

  56. Rickey Hu
    *.*.*.*
    链接

    Rickey Hu 2010-02-03 11:45:00

    我看到@tinyfool和@jeffz_cn关于"强奸"的那段比喻,终于忍不住笑了.

  57. 鹰的翅膀让我翱翔
    *.*.*.*
    链接

    鹰的翅膀让我翱翔 2010-02-03 11:56:00

    其实现在这种多平台争战的时间段,反而让我有一种百花齐放的感觉!正是因为这些平台大佬们在每个领域不断地进行交涉才使得现在的开发技术飞速的挺进!先不管说哪个平台造成了多少的伤亡(开发公司),就看现在开发同样复杂程度的系统,不管是在性能和开发效率上都已经天上地下了!

  58. JimLiu
    *.*.*.*
    链接

    JimLiu 2010-02-03 11:57:00

    windows门槛低,*nix门槛高……这还是比较普遍的共识吧。
    有人说学微软技术主要就是学工具的使用,这是现象,不是原因。究其原因,还是微软做平台和其他厂商有不一样的哲学,微软力求把东西做的简单化、自动化,这是人家的哲学,但是把这个当微软的不是,那就是我们自己的不是了。更不应该让自己被牵着鼻子走,我06年年底开始接触.NET,从2.0到4.0,我从来没觉得微软变化太快过,学习微软技术不是只学API怎么用,工具怎么用的,同样是技术,换个API,换个工具,就能叫全丢光了、全废掉了吗?所以我还是想趁着年轻多读书,毕竟基础的东西,什么时候都不会丢。API永远都只是API,工具也永远都只是工具而已;但基础却远不止是基础,还是一种理论层面能指导工作和学习的东西。学习微软的东西就是轻视基础了吗?我认为这是一种误区。.NET社区的高人,不也都是视野很开阔的吗?

  59. 老赵
    admin
    链接

    老赵 2010-02-03 12:00:00

    hoodlum1980:
    @OwnWaterloo
    不要胡言乱语。讨厌你们这种不负责任的随意评论。从你的结论来看你根本就不懂COM,还评论什么。


    说这样的话没有意义的,要给出你的看法,以及支持你看法的理由。

  60. 老赵
    admin
    链接

    老赵 2010-02-03 12:01:00

    hoodlum1980:
    @Clingingboy
    两种语言(平台)的追求宗旨不一样。.NET 的设计本身就不是为那种高效的windows程序而设计的。 .NET的假设就是硬件资源不是限制和问题。所以和VS这个软件的发展一样,把资源往死了用。


    .NET从来没有说过自己不是为了高效程序而设计的,它还是在不断优化,不断生成native code等等,如果它们还不为了高效,你让那些其他一些语言/平台情何以堪……

  61. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-03 12:27:00

    我蛇年的,当年也啃过《Inside OLE2》,绝对痴迷。OLE/COM是Windows的基石,15年来一直没变。Office到2007,Object Model还是COM(2010应该也是),DirectX,ADSI等等,上层也许被托管代码化了,下层还是COM。其实CLR就建立在COM上。VS 2005 SDK,虽然被托管代码化了,但“风味”还很COM。在VS中建立一个Office项目,Word或Excel什么的会嵌入到VS中,底层技术——OLE。flash player,Silverlight能跑在IE中,依靠的是ActiveX,OLE/COM/ActiveX其实是一个东西——90年代的ms的市场人员太时尚了。被淘汰的有MFC,DCOM/COM+,托管代码的remoting,Winform...总的来说,有变有不变。那群说被ms qj的人,一看就是老菜鸟,分不清哪些是ms的宣传,哪些是实打实的技术

  62. lhking
    *.*.*.*
    链接

    lhking 2010-02-03 13:03:00

    群英会嘛

  63. 韦恩卑鄙 alias:v-zhewg
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 2010-02-03 13:42:00

    hoodlum1980:
    @Clingingboy
    两种语言(平台)的追求宗旨不一样。.NET 的设计本身就不是为那种高效的windows程序而设计的。 .NET的假设就是硬件资源不是限制和问题。所以和VS这个软件的发展一样,把资源往死了用。


    这个论调
    vb6的时候有人bs vb6用过
    .net出来马上扣给.net了
    1.1时代也许说得通啊 可是已经5 6年过去耶

  64. 韦恩卑鄙 alias:v-zhewg
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 2010-02-03 13:44:00

    zzfff:我蛇年的,当年也啃过《Inside OLE2》,绝对痴迷。OLE/COM是Windows的基石,15年来一直没变。Office到2007,Object Model还是COM(2010应该也是),DirectX,ADSI等等,上层也许被托管代码化了,下层还是COM。其实CLR就建立在COM上。VS 2005 SDK,虽然被托管代码化了,但“风味”还很COM。在VS中建立一个Office项目,Word或Excel什么的会嵌入到VS中,底层技术——OLE。flash player,Silverlight能跑在IE中,依靠的是ActiveX,OLE/COM/ActiveX其实是一个东西——90年代的ms的市场人员太时尚了。被淘汰的有MFC,DCOM/COM+,托管代码的remoting,Winform...总的来说,有变有不变。那群说被ms qj的人,一看就是老菜鸟,分不清哪些是ms的宣传,哪些是实打实的技术


    顶,我实在没敢说老菜鸟这个词。
    小吐槽:
    .net和com本来就没有不兼容,com/ole只是一个二进制接口规范嘛,.net各种方式包装实现起来都是很完备的
    MFC,DCOM/COM+也不算淘汰啦,在.net 库低下跑的还是这些东东啦。

  65. rad
    *.*.*.*
    链接

    rad 2010-02-03 13:48:00

    其实我想问大大们都是用什么翻墙工具上twitter的....求........

  66. 韦恩卑鄙 alias:v-zhewg
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 2010-02-03 13:49:00

    rad:其实我想问大大们都是用什么翻墙工具上twitter的....求........


    懒得上 专门看老赵八卦转播的飘过

  67. Ivony...
    *.*.*.*
    链接

    Ivony... 2010-02-03 14:07:00

    又详细的看了一遍。。。。

    我不知道我算不算老程序员啊,反正写程序七八年了,要算上小时候玩BASIC,那历史就久远了。。。。。


    从C、C++、PHP、C#这么一路走来。语言都换了N次,就更别说平台了。要说操作系统内核,微软的确是没有*nix阵容稳定,但事实上自从NT后,到现在和可预见的将来,操作系统的内核都不会有太多改变了。要说API,我是不明白.NET到底改变了什么?如果说Vista不支持原来的WIN32的API了,那还情有可原,但那样估计微软已经被口水埋掉了,显然绝大多数的应用程序将无法运行。。。。直到我今天装的最新的Windows 7,他的Windows\System32目录下还一大堆MFC的DLL。所以我不知道那些所谓的老程序员到底被强奸了什么?

    如果说是UI,如果说是原来的那些所谓的技巧在新的技术面前变得一文不值,那我非常乐意他们投身开源界,在那里没有微软这样的财团雇一堆程序员抢他们的饭碗。

    要说被QJ,现在的.NET程序员哪个不是天天在被QJ呢?ADO.NET才出来多久?现在就有了Entity Framework。WinForm眼看就要被WPF取代,你今天才研究LINQ,昨天老赵就在写F#了,你怎么不被技术QJ呢?水果取消的项目比MS多多了,水果玩的跳票也不见得比MS少多少。无非是找个借口掩饰自己腿脚不灵便罢了。。。

    据说以前的马拉松比赛,总有些人能从小街小巷、疏于防范的地方找到小路抄到别人前面,然后沾沾自喜。但这个比赛终归还是要看谁跑得快的。

    我记得.NET刚出来的时候,原来的COM程序员泾渭分明的分为两派,一部分人赌咒骂娘说被微软QJ,另一部分人说盼星星盼月亮终于有了完美的COM。其实每次技术的跃迁都是这样,技术的发展道路不是微软的员工决定的,而是那些聪明的、拥抱变化的程序员所决定的。

    事实上现在不也有WinForm程序员骂娘么?好吧我搞Web的确有点站着说话不腰疼。但是ASP.NET 2.0与1.1几乎全部代码都重写了,我Reflector的几万行代码一下成了历史,但我还是很喜欢ASP.NET 2.0甚至不惜在VS 2005还是beta的时候就重写自己的类库。

    反倒是,我现在觉得.NET 4.0改的太少了,闲着没事干。

  68. 韦恩卑鄙 alias:v-zhewg
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 2010-02-03 14:12:00

    @Ivony...
    "ADO.NET才出来多久?现在就有了Entity Framework。"
    这个例子不合适啊,被束之高阁的只有Dataset而已 其他的还都辛勤的在EF下面努力呢~~~

    你的意思我是完全赞同的,一部分人的"被做爱" 往往是另一部分人的"不被做爱"造成的

    土地改革叫苦的都是地主富农 但是劳动人民站起来了

  69. Ivony...
    *.*.*.*
    链接

    Ivony... 2010-02-03 14:14:00

    韦恩卑鄙 alias:v-zhewg:
    @Ivony...
    "ADO.NET才出来多久?现在就有了Entity Framework。"
    这个例子不合适啊,被束之高阁的只有Dataset而已 其他的还都辛勤的在EF下面努力呢~~~




    但是以前要DataTable、DataAdaptor啊,现在只需要关心Entity就可以了。。。。。

    API不一样的是天翻地覆么?

  70. 韦恩卑鄙 alias:v-zhewg
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 2010-02-03 14:16:00

    Ivony...:

    韦恩卑鄙 alias:v-zhewg:
    @Ivony...
    "ADO.NET才出来多久?现在就有了Entity Framework。"
    这个例子不合适啊,被束之高阁的只有Dataset而已 其他的还都辛勤的在EF下面努力呢~~~




    但是以前要DataTable、DataAdaptor啊,现在只需要关心Entity就可以了。。。。。

    API不一样的是天翻地覆么?


    所以才有Entity DataReader啊, 其实还是扩大了的东西 没谁扔下谁啊
    ADO。net更好更强大啦~~~

  71. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-03 15:18:00

    至于是否被qj,这算yin者见yin的问题。很老土的话:唯一不变的是变化。不拥抱变化,没积极的心态,最好别在业界混,很痛苦。(上面说DCOM/COM+,remoting,winform被淘汰也许有点煽情,现实很残酷:比如你想做.net下的桌面应用,你仅熟悉winform,但又想产品在未来10年内保值,你不得不学WPF。同理,可以把“COM+/ES/remoting”换成“WCF”)

  72. 别爱上哥,哥只是个传说!
    *.*.*.*
    链接

    别爱上哥,哥只是个传说! 2010-02-03 15:27:00

    声明:本人所说的话都是来源于网络,请勿跨省!也请不要删,也请不要对号坐!

    SB年年有,今年特别多!

  73. 老赵
    admin
    链接

    老赵 2010-02-03 15:31:00

    @Ivony...
    即使变,提高生产力是实打实的。
    其实我不知道mac的情况如何,所以我不好发表意见。
    但是我了解Java的一些情况,没发现它和.NET有什么区别,但也没见Java程序员感觉被qj了吧……

    对了,你了解mac的情况吗?水果的折腾情况有哪些,能具体说说吗?

  74. JimLiu
    *.*.*.*
    链接

    JimLiu 2010-02-03 16:07:00

    Jeffrey Zhao:
    @Ivony...
    即使变,提高生产力是实打实的。
    其实我不知道mac的情况如何,所以我不好发表意见。
    但是我了解Java的一些情况,没发现它和.NET有什么区别,但也没见Java程序员感觉被qj了吧……

    对了,你了解mac的情况吗?水果的折腾情况有哪些,能具体说说吗?


    所以非常期待老赵的mac和mono体验后的文章

  75. Ivony...
    *.*.*.*
    链接

    Ivony... 2010-02-03 16:08:00

    Jeffrey Zhao:
    @Ivony...
    即使变,提高生产力是实打实的。
    其实我不知道mac的情况如何,所以我不好发表意见。
    但是我了解Java的一些情况,没发现它和.NET有什么区别,但也没见Java程序员感觉被qj了吧……

    对了,你了解mac的情况吗?水果的折腾情况有哪些,能具体说说吗?




    我不太了解水果的情况,但我想从众所周知的情况来说,水果都不是一个很好的借口。。。。

    这个公司曾经因为内讧自己把自己玩死,尽管不是第一个把创始人踢出去的公司,但是又把他找回来是第一个。这个公司近几年来业务从电脑切换到MP3播放器、机顶盒、手机、电纸书。。。。
    我不知道如果微软这样玩会被说成什么,令人发指的LJ?

    相较而言,微软同学操作系统一个产品做了几十年,Office也是,面向企业和后来的操作系统虽然使用了新的WinNT核心,但事实上也并非是颠覆式的改动。某水果公司连CPU的架构都可以换,微软这又算得了什么呢?

    从历史的观点看来,将来被水果QJ的可能性绝对远大于被微软QJ。毕竟微软的头头已经全身而退去度假了,水果的头头最近身体不太好。




    水果公司著名的忽悠人事件123:

    发布手机,公司从苹果电脑更名为苹果公司。

    使用Intel架构CPU。

    使用Mac OS X。

  76. xiaotie
    *.*.*.*
    链接

    xiaotie 2010-02-03 16:22:00

    韦恩卑鄙 alias:v-zhewg:
    @Ivony...
    "ADO.NET才出来多久?现在就有了Entity Framework。"
    这个例子不合适啊,被束之高阁的只有Dataset而已 其他的还都辛勤的在EF下面努力呢~~~

    你的意思我是完全赞同的,一部分人的"被做爱" 往往是另一部分人的"不被做爱"造成的

    土地改革叫苦的都是地主富农 但是劳动人民站起来了



    劳动人民站起来了,又向后走了两步,坐下来了

  77. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-03 16:47:00

    我觉得看问题一定要深入本质。比如,winform的本质是什么?——USER32.DLL/GDI32.DLL的托管代码封装。USER32.DLL/GDI32.DLL以及它们的16位老兄,少说也有17、8年了吧。不管raw win32 programming,MFC,WTL,还是winform,本质是一样的,命令式GUI:在WM_PAINT中指示画这样,画那样。WPF属于呈现式GUI:申明object tree,WPF包办其呈现,如同浏览器呈现HTML tree。呈现式GUI对命令式GUI是革命的,天啊,从85年windows 1.0到05年的WPF,20年啊20年,ms才革命令式GUI的命,ms完全是不思进取嘛!:)
    (对GUI研究不深,随口说的,请高手指正)

  78. 陈梓瀚(vczh)
    *.*.*.*
    链接

    陈梓瀚(vczh) 2010-02-03 16:47:00

    不知道为什么每一次遇到技术更迭的时候我都会很爽,又有新东西可以学了。

  79. 幸存者
    *.*.*.*
    链接

    幸存者 2010-02-03 16:48:00

    老实说,Joel Spolsky那篇《微软如何输掉API之战》还是有些道理的。
    微软现在的做法是当它认为现在的机制解决不了问题或者很难解决问题时,就会引入一套新的机制并试图以新的机制解决问题,不过很多时候这样只会让问题变得更加复杂。
    并且微软解决问题的方式让微软的技术体系背着沉重的包袱,win32 api为了兼容win16 api已经显得比posix笨重,再往后的com和.net则更甚。
    其实看看C# 4就知道了,C#只发展到第4个版本就已经显出老态(当然,很多语言标准十几二十年才发展两三个版本,而且改动非常小),或者说C#已经开始老化,老化的特点就是不得不为了平衡新特性和向后兼容而加入丑陋的设计,例如C# 4.0的协变/逆变中那个著名的菱形歧义,还有命名参数在父子类中的不同行为。我想,大部分无法自我扩展而只能通过加入语法或语义元素来引入新特性的语言都存在老化的问题。

  80. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-03 16:56:00

    话虽这么说,但学习是有成本的。不过我觉得学习成本只占总成本的很小一部分——大头是问题域本身的成本。比如,你从龙书、Programming language pragmatics等书中活了出来,炼成一身盖世武功,至于用lex&yacc或ANTLR或Oslo中的M语言做剑,以及学用这些剑,不是小菜一碟么?!

  81. 辰
    *.*.*.*
    链接

    2010-02-03 16:59:00

    @韦恩卑鄙 alias:v-zhewg

    似乎涉及到了政治了。这个比喻不好,毕竟真实情况可能和你说的正好相反。所以还是不用zz打比喻。

  82. 孙长宇
    *.*.*.*
    链接

    孙长宇 2010-02-03 17:00:00

    还能上Twitter啊,幸福啊。

  83. 麦穗
    *.*.*.*
    链接

    麦穗 2010-02-03 17:09:00

    看完google的内容
    心里蹦出几个字:可怜的老赵

    其实有时候觉得,英雄总是孤单的。
    在Tech Ed 2009上,看着老赵一个人坐在问答区,孤单的背影。

    我只是个菜鸟,学.net也是完全不明白jave写个从控制台输入需要用到stream(好久不看了,说错了别鄙视哈),而c#只需一个Console.ReadLine()。

    我算是微软的铁杆
    但是论战上我帮不了老赵,我是菜鸟
    但是,从我看来
    支持一个公司,跟爱一个人一样
    没有理由的。
    如果你发现你爱一个人有了很多理由
    那么就是你不爱他(她)的时候了。

    技术都是相通,
    无论.net,java,c++。
    我们学的一种思路,而不是语言。
    但是任何一种的封闭
    都会葬送自己的。
    在我看来
    微软的优势就是让你很容易的入门。

    好比找老婆,
    别的技术,好比那种你喜欢,但是你要付出很多才能得到的女人
    而微软,很容易答应做你的女朋友
    当然,想结婚,也得付出心血

    与其费半天劲去追一个女人
    我更愿意去找个答应做你女朋友的人
    两个人慢慢去创造爱情,创造幸福。

    我喜欢微软,但是我也在研究google app engine,
    也在看Apple SDK

    不要把自己封闭在一个平台上。

    所以说,请大家也不要难为老赵了。
    学到本领
    找到老婆
    就好了。

    也许你的老婆不如别人的好
    但是,你爱她,她爱你,就好了。




  84. Ivony...
    *.*.*.*
    链接

    Ivony... 2010-02-03 17:27:00

    幸存者:
    老实说,Joel Spolsky那篇《微软如何输掉API之战》还是有些道理的。
    微软现在的做法是当它认为现在的机制解决不了问题或者很难解决问题时,就会引入一套新的机制并试图以新的机制解决问题,不过很多时候这样只会让问题变得更加复杂。
    并且微软解决问题的方式让微软的技术体系背着沉重的包袱,win32 api为了兼容win16 api已经显得比posix笨重,再往后的com和.net则更甚。
    其实看看C# 4就知道了,C#只发展到第4个版本就已经显出老态(当然,很多语言标准十几二十年才发展两三个版本,而且改动非常小),或者说C#已经开始老化,老化的特点就是不得不为了平衡新特性和向后兼容而加入丑陋的设计,例如C# 4.0的协变/逆变中那个著名的菱形歧义,还有命名参数在父子类中的不同行为。我想,大部分无法自我扩展而只能通过加入语法或语义元素来引入新特性的语言都存在老化的问题。




    菱形歧义是啥?

  85. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-03 17:31:00

    “C#只发展到第4个版本就已经显出老态”——天啊,我等C# 5.0都要等得发狂了,因为Anders同学许诺compiler as a service!

  86. 陈梓瀚(vczh)
    *.*.*.*
    链接

    陈梓瀚(vczh) 2010-02-03 17:48:00

    @Ivony...
    菱形奇异的这个词让我想到了C++的多重继承,难道指的是
    IEnumerable<Derived> -> IEnumerable<Base> -> IEnumerable<IAnimal>

    IEnumerable<Derived> -> IEnumerable<IDog> -> IEnumerable<IAnimal>

  87. 幸存者
    *.*.*.*
    链接

    幸存者 2010-02-03 18:01:00

    class Base { }
    class DerivedA : Base { }
    class DerivedB : Base { }
    
    interface IFoo<out T> {
        void Bar();
    }
    
    class MyClass : IFoo<DerivedA>, IFoo<DerivedB> {
        void IFoo<DerivedA>.Bar() {
            Console.WriteLine("DerivedA");
        }
        void IFoo<DerivedB>.Bar() {
            Console.WriteLine("DerivedB");
        }
    }
    
    class Program {
        static void Main(string[] args) {
            IFoo<Base> x = new MyClass();
            x.Bar();
        }
    }
    
    

    猜猜会输出什么?当然,代码是我随手写的,可能会有错。

  88. 别爱上哥,哥只是个传说!
    *.*.*.*
    链接

    别爱上哥,哥只是个传说! 2010-02-03 18:08:00

    会输出结果!人人都知道

  89. 幸存者
    *.*.*.*
    链接

    幸存者 2010-02-03 18:10:00

    关于C#4中协变/逆变的歧义问题,可以去这里看看,不过要翻*墙。
    那个博客之前有一系列文章都是讲这个的,有时间的话我推荐都可以看看。

  90. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-03 18:16:00

    @Steven Chen
    随便瞎说的, 勿怪~

  91. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-03 18:22:00

    @韦恩卑鄙 alias:v-zhewg

    韦恩卑鄙 alias:v-zhewg:
    .net和com本来就没有不兼容,com/ole只是一个二进制接口规范嘛,.net各种方式包装实现起来都是很完备的
    MFC,DCOM/COM+也不算淘汰啦,在.net 库低下跑的还是这些东东啦



    虽然思路差不多, 但就像你说的:

    韦恩卑鄙 alias:v-zhewg:
    我觉得 .net是那些玩win32和 com到深层的人为了改善当时怨声载道的状况,欢天喜地的作品,而且真正服务到了很多用到深处的人。



    .net的出现, 真的是大快人心。 极大的提高了生产力(从商业角度说), 以及代码的美感(从技术角度说)。

  92. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-03 18:23:00

    hoodlum1980:
    @OwnWaterloo
    不要胡言乱语。讨厌你们这种不负责任的随意评论。从你的结论来看你根本就不懂COM,还评论什么。



    分享下你的高见?

  93. szwe
    *.*.*.*
    链接

    szwe 2010-02-03 18:27:00

    编译所有程序还在用2.0的路过。
    毕竟给公司做事,还是要考虑用户的系统环境的说。
    如果win7普及了,或许会转向3.5,但是除了wcf以外,也不觉得有什么特别需要引入的东西。
    单就.net来说,这10年间,除了1.1到2.0时,泛型的增加和命名空间结构的一些改变以外,改进一直不都是挺平滑的么?
    何况就算linux,虽然市面上的发行版都是kernel 2.6,但是还不是分debian和freeBSD等很多派系么?有的时候想找到能直接在自己机器上跑得安装包也很麻烦。

  94. 韦恩卑鄙 alias:v-zhewg
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 2010-02-03 18:28:00

    幸存者:
    关于C#4中协变/逆变的歧义问题,可以去这里看看,不过要翻*墙。
    那个博客之前有一系列文章都是讲这个的,有时间的话我推荐都可以看看。


    匹配第一个符合的接口 倒还可以理解啊

  95. szwe
    *.*.*.*
    链接

    szwe 2010-02-03 18:36:00

    <out>是4.0新增的关键字吧?类似于List<int>和List<object>的转化问题那种。

  96. 幸存者
    *.*.*.*
    链接

    幸存者 2010-02-03 18:38:00

    @韦恩卑鄙 alias:v-zhewg
    反正我是觉得靠顺序来匹配接口实在太不直观了,像有两个以上可匹配的重载方法时编译器就直接报错了,不会按顺序来匹配。
    不过,这个问题恐怕也很难有更好或者更合理的解决方案。

  97. 韦恩卑鄙 alias:v-zhewg
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 2010-02-03 18:44:00

    幸存者:
    @韦恩卑鄙 alias:v-zhewg
    反正我是觉得靠顺序来匹配接口实在太不直观了,像有两个以上可匹配的重载方法时编译器就直接报错了,不会按顺序来匹配。
    不过,这个问题恐怕也很难有更好或者更合理的解决方案。


    我是觉得实现接口的时候要注意一些就可以了
    搞不好这个还能“不是Bug是feature呢” 当成职责链用 哈哈哈


  98. szwe
    *.*.*.*
    链接

    szwe 2010-02-03 18:53:00

    幸存者:
    @韦恩卑鄙 alias:v-zhewg
    反正我是觉得靠顺序来匹配接口实在太不直观了,像有两个以上可匹配的重载方法时编译器就直接报错了,不会按顺序来匹配。
    不过,这个问题恐怕也很难有更好或者更合理的解决方案。


    我觉得这样使用泛型是有问题的,泛型应该本身是对实体类进行切入的,而这个例子明显是把泛型作为实体使用了,就比如class A:IEqualtable<B>这种,写法上是允许的,但是用法是怪异的。

  99. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-03 19:02:00

    @Jeffrey Zhao

    Jeffrey Zhao:
    我觉得传统Web开发,无论是什么平台,都不会学歪的。



    比如, xhtml vs html?
    其实我也是支持比较严谨的前者。
    但基于xml的技术都有一个毛病…… 对机器友好, 对人…… 要欠缺一些……
    如果是机器生成xml, 那当然没什么问题。
    如果是手写……

    举2个例子:
    有篇介绍rst的文章, 拿了一段rst的代码和docbook使用的xml的代码作对比; 前者90%是内容, 后者至少30%是标签。
    标签具体多少都不是很重要了, 关键是给人的整体感觉是:虽然前者没有那些结构化的标签, 但相比后者, "人"更容易看出文档的结构。
    代码在这里:
    http://www.ibm.com/developerworks/cn/xml/x-matters/part24/index.html

    还有, 手写xhtml的时候…… 对于一些小文档,body部分只占整个文档的2/3甚至1/2 ……
    html好像连body标签都可以省略?
    虽然不够严谨, 但那些多余的标签真的是很伤眼睛, 让人一眼看不出内容。

    它们再加上 html5呢?这个没太关注…… 老赵有什么看法与建议?


    还有js那些hack…… 是尽可能采用各浏览器的交集? 还是尽可能利用各浏览器的特点?

  100. 老赵
    admin
    链接

    老赵 2010-02-03 19:14:00

    @麦穗:所以说,请大家也不要难为老赵了。


    靠,我都没觉得我被为难了,我觉得很爽啊……

  101. 老赵
    admin
    链接

    老赵 2010-02-03 19:17:00

    @OwnWaterloo
    原来你说的是前端开发啊,这是我的弱项,我给不了好的建议。
    我刚才说“学任何平台都不会学偏”是指服务器端,因为客户端就不分平台了……

  102. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-03 19:23:00

    @Jeffrey Zhao
    我不懂应该怎么分类…… 我弱……
    因为xiaotie提到这些了, 所以就问问……

    如果是说前端开发不会学偏还好理解一些,搞来搞去大家都是用的那些东西……
    那么, 服务器端的技术又包含哪些呢?

  103. 韦恩卑鄙 alias:v-zhewg
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 2010-02-03 19:51:00

    @OwnWaterloo
    数据写成http流 完毕

  104. 老赵
    admin
    链接

    老赵 2010-02-03 19:56:00

    @OwnWaterloo
    每种技术都可以开发Web的,.NET,Java,Ruby,Python等等。
    感觉现在除了php不建议学外,其他都差不多,呵呵。

  105. 超晨
    *.*.*.*
    链接

    超晨 2010-02-03 20:19:00

    是不是有点偏了?
    你们觉得软件开发技术有银弹吗?
    汽车不就四个轱辘就可以开了吗?
    打个比方,40年前的汽车,和现在的技术相比,你觉得变化不大吗?
    你可以狡辩:但至少基本原理没变啊!
    是,基本原理没变,同理可证,学软件就是要增大基础投资,软件工程投资上,学好一门编译语言,加上软件工程。成了,以不变应万变。

    可能你会拿出上面什么COM之类的投资浪费出来给我找碴,我想问问。你觉得给你一把老实来复枪射击还是给你一把AK47更容易集中目标?
    告诉你,如果你是神枪手,哪把枪都是一样的,别人稍微熟悉一下枪的性能,别人就比你打得准!
    看明白没?永远要找你的“枪法”来投资,学好枪法,走遍天下都不怕。套用个老话,一招鲜,吃遍天!
    朋友,你找到什么是你要学习的“枪法”了么?

  106. cesium
    *.*.*.*
    链接

    cesium 2010-02-03 20:39:00

    要是有wave就好了,还可以录播。

  107. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-03 21:21:00

    @Jeffrey Zhao
    谢谢~

  108. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-03 21:22:00

    @韦恩卑鄙 alias:v-zhewg
    请求呢? 请求也需要先从某种协议流中分析? 然后将请求结果转化为某种协议流发送取出?

  109. msolap
    *.*.*.*
    链接

    msolap 2010-02-03 23:50:00

    OwnWaterloo:

    hoodlum1980:
    @OwnWaterloo
    不要胡言乱语。讨厌你们这种不负责任的随意评论。从你的结论来看你根本就不懂COM,还评论什么。



    分享下你的高见?



    Hi OwnWaterloo, 我也同意hoodlum1980的看法,你真的不懂COM。说句实话,不懂COM没什么关系,毕竟现在大多数人都不懂,而且不是有.net嘛。

    不过我鼓励你花两个小时读一下DON BOX的《Essential COM》(别读潘爱民翻译的那本),读第一第二章就够了。对理解CTS/CLI绝对有帮助。如果看明白了的话,你就明白为什么会有第二个人跳出来说你不懂了。;)

    -msolap

  110. Star Peng
    *.*.*.*
    链接

    Star Peng 2010-02-03 23:58:00

    @virushuo: 当年可不是这么说的来着。但是现在已经找不到什么当年的宣传资料了。当年还说WINDOWS内核要CLR化,这现在也没实现吧?当年说longhorn要完全使用CLR...
    @jeffz_cn: 炒作,炒作……其实这些都是1.0时期的炒作了,.net 2.0时微软自己也不炒作这些了,炒作别的了,比如winfs啥的。可惜jim gray一失踪,没人搞得定这东西了……


    李开复的书中说道当年微软确实是这样做的,不过最后发现根本不能实现,最后放弃了。

  111. 老赵
    admin
    链接

    老赵 2010-02-04 00:09:00

    @Star Peng
    深表怀疑,当年看到这句话我就觉得是炒作了,我真不信有人会这么想啊。
    就算技术可行,微软可能重写windows内核吗?这是什么样的代价啊,不可能的。

  112. 幸存者
    *.*.*.*
    链接

    幸存者 2010-02-04 00:40:00

    @Jeffrey Zhao
    内核倒是不用重写,事实上clr也无法代替内核的作用,clr还得构建在内核之上呢。作为对比,可以参考google的android,其实android可以认为是构建在jvm上的一个操作系统,但是内核仍然是linux。

    我猜windows完全使用clr大概是指像android一样仅提供.net的api,windows所有的应用都使用.net编写,不过那样仍然不现实,这样等于完全放弃windows平台所有构建在win32 api上的软件,这和自杀没什么区别。

    不过微软有个代号为Singularity的实验性质的操作系统就是完全建立在托管代码之上的,甚至连设备驱动也可以用托管代码写。

  113. RednaxelaFX
    *.*.*.*
    链接

    RednaxelaFX 2010-02-04 01:09:00

    幸存者:
    @韦恩卑鄙 alias:v-zhewg
    反正我是觉得靠顺序来匹配接口实在太不直观了,像有两个以上可匹配的重载方法时编译器就直接报错了,不会按顺序来匹配。
    不过,这个问题恐怕也很难有更好或者更合理的解决方案。


    嗯这问题是让MSR的人看了写了论文还是没辙,现在就这样的了……

    @幸存者
    hmm... .NET Micro Framework是可以跑在裸机上的,底下有操作系统并不是实现VES的先决条件。

    Android的话,Dalvik及其之上的更像是“应用平台”而不是“操作系统”。Bionic更底层些,然后下面是Linux内核,那才是“操作系统”。

    当年说Windows要大量是用托管代码是真的要用很多……不记得是不是这段访谈了,记得以前看Patrick Dussud的访谈视频时听到他描述当年跑去跟Windows team吵到底有GC的托管环境放在底层能不能行。虽然过程我们很难知道,但结果很明显,Windows team不肯把CLR放下去。

    Singularity、传说中的Midori,还有Cosmos和SharpOS,Java的JNODE等,托管代码写的操作系统倒也不少,呵呵。

  114. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-04 03:13:00

    @msolap

    msolap:
    不过我鼓励你花两个小时读一下DON BOX的《Essential COM》(别读潘爱民翻译的那本),读第一第二章就够了。对理解CTS/CLI绝对有帮助。


    你怎么就知道我没看过呢?
    不巧啊, 我还就是看的《COM本质论》, 怎么办呢?


    msolap:
    我也同意hoodlum1980的看法,你真的不懂COM。


    我也觉得你们是一路人。 抛出一个观点, 然后走人。
    你还好一些, 列出一个论据:

    msolap:
    如果看明白了的话,你就明白为什么会有第二个人跳出来说你不懂了。;)


    不过这算论据吗? 姑且放下"看明白了的话" —— 你怎么知道我没看明白呢 —— 人多==有理, 是吗?


    msolap:
    我也同意hoodlum1980的看法,你真的不懂COM。说句实话,不懂COM没什么关系,毕竟现在大多数人都不懂,而且不是有.net嘛。


    我也没觉得我多懂。 我确实不了解COM的很多细节。 而且我很坦然的:
    —— 我在面试的时候就曾明说: COM那玩意, 我不(屑)会。
    括号里的字实在不好意思说出来, 显得太高调。


    但是我说到的那部分, 我没觉得有说错,或者欠妥的地方:
    —— COM用了一种非常丑陋的方式去实现一种OO的二进制协议, 这种思路是错误的。

    我在学完C/C++之后, .net是早就出现了。那时候我就预感COM肯定会被淘汰 —— .net才是一种正确的OO的二进制协议。
    如果要求使用COM, 我会劝说不要使用这种恶心的技术; 如果劝说失败,我可以去学(而且在我看来也没什么复杂的)。
    但我绝对不会主动的在这种丑陋的技术上浪费我的时间。


    如果上面的观点有错误的地方, 请不吝指出。
    如果仅仅是因为这些论调侵犯了COM在你们两位心目中那"圣洁的地位" —— 我接触过一些对COM无比崇拜的家伙, 什么东西都想实现为一个COM组件才安心 —— 也请指出, 我会考虑顾及你们的感受, 说得委婉一些。

    否则,随你俩怎么说去吧, 我的时间可不像浪费在这种人身上。

  115. msolap
    *.*.*.*
    链接

    msolap 2010-02-04 09:31:00

    @OwnWaterloo
    所以说你没看懂嘛,另外是建议你看《Essential COM》,不是潘爱民翻译的《COM本质论》。

    我并非在和你讨论COM和.net孰优孰劣。即使是今天也依然有COM/COM+适用而.net不适用的场景。相信我,相比COM/COM+,我绝对更痴迷于.net。自从2000年夏天听了DON BOX做的一个培训《Essential .net》后,就爱上了.net。(当时还不叫.net,叫NGWS,C#叫cool语言,asp.net叫asplus。本来是去听DBOX的COM+,结果他老人家神秘兮兮地掏出了一个没有题目的课程,连讲了两天。)


    搞技术的,怎么轻轻拍一下,就反应那么激烈呢?
    你自己在面试的时候都说不懂COM,和别人说有什么区别呢?一个事实自己说可以,别人说不得,是吗?这哪里是做好技术应该有的心态呢?

    -msolap

  116. 老赵
    admin
    链接

    老赵 2010-02-04 09:58:00

    幸存者:
    @Jeffrey Zhao
    内核倒是不用重写,事实上clr也无法代替内核的作用,clr还得构建在内核之上呢。作为对比,可以参考google的android,其实android可以认为是构建在jvm上的一个操作系统,但是内核仍然是linux。


    android还是个纯粹的linux,只是上面提供了一个jvm,和Singularity还是大不同……
    而且,android还是可以写native c/c++的,这也是开发人员强烈要求下做出的让步。

  117. 老赵
    admin
    链接

    老赵 2010-02-04 10:00:00

    Galactica:
    @OwnWaterloo
    关于COM,我罗列了下面的问题:
    1,COM组件能运行在Unix下吗?
    2,JavaScript能调用COM组件吗?
    3,标准C能调用COM组件吗?
    4,Java能调用COM组件吗?
    5,标准C能调用Java Bean 吗?
    6,c/c++/Java/JavaScript能调用一般.Net 程序集吗?
    7,如何在您公司的Java项目组中复用C++/C#项目组已编译程序集?


    不好意思,你的回复破坏版式了,所以我删掉了……

  118. Ivony...
    *.*.*.*
    链接

    Ivony... 2010-02-04 10:44:00

    我最后插句嘴,我虽然不太懂COM技术,但我知道COM的全称是什么:

    COM = Component Object Model
    即组件对象模型。

    那么从这个名字就可以看出来,COM要解决什么问题?组件对象化。后来微软发现,不同语言技术写出来的组件不能通用,COM的目标又增加了语言无关化。

    好!我们现在看看.NET,运行在CLI上的各种高级语言,在统一的规范下,所有的组件都是面向对象的,语言无关的。这不是COM的理想大同世界么?真正的大同世界到来的时候,那些所谓的先锋烈士随便找个借口说不玩了,这种行为实在令人费解。

    从OLE到COM最终的.NET,尽管Application从最开始的文档处理演变到现在复杂多变的软件。思想却是一脉相承,组件化,组件化,组件化。。。。

  119. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-04 12:30:00

    @OwnWaterloo
    说.net实现二进制协议,也许没错,但很外行:)。可以像Don Box那样“忽悠”——CLR as a better COM——COM是个physical contract,CLR是个virtual contract。COM可分为狭义与广义,狭义COM就是个二进制协议,即实现IUnknown,遵从特定的vtable规定,认为狭义COM就是COM的精髓,虽然没错,但头脑似乎简单了点:)。我喜欢广义的COM,因为它们是用来建设世界的:IDL,marshal/unmarshal,connection point,structured storage,IMoniker,IDispatch,,IDataObject,IOleObject,IViewObject,IOleInPlaceObjectWindow...................................。最后,你可以去看下CLR hosting,大把大把赤裸肮脏丑陋恶心的COM细节啊!

  120. 韦恩卑鄙 alias:v-zhewg
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 2010-02-04 13:03:00

    Ivony...:
    我最后插句嘴,我虽然不太懂COM技术,但我知道COM的全称是什么:

    COM = Component Object Model
    即组件对象模型。

    那么从这个名字就可以看出来,COM要解决什么问题?组件对象化。后来微软发现,不同语言技术写出来的组件不能通用,COM的目标又增加了语言无关化。

    好!我们现在看看.NET,运行在CLI上的各种高级语言,在统一的规范下,所有的组件都是面向对象的,语言无关的。这不是COM的理想大同世界么?真正的大同世界到来的时候,那些所谓的先锋烈士随便找个借口说不玩了,这种行为实在令人费解。

    从OLE到COM最终的.NET,尽管Application从最开始的文档处理演变到现在复杂多变的软件。思想却是一脉相承,组件化,组件化,组件化。。。。


    小学数学奥林匹克竞赛学深了 发现初中根本不用那些玩意用方程式,一怒之下再也不爱数学了,改从文科。

  121. 吴峰
    *.*.*.*
    链接

    吴峰 2010-02-04 14:31:00

    韦恩卑鄙 alias:v-zhewg:

    Ivony...:
    我最后插句嘴,我虽然不太懂COM技术,但我知道COM的全称是什么:

    COM = Component Object Model
    即组件对象模型。

    那么从这个名字就可以看出来,COM要解决什么问题?组件对象化。后来微软发现,不同语言技术写出来的组件不能通用,COM的目标又增加了语言无关化。

    好!我们现在看看.NET,运行在CLI上的各种高级语言,在统一的规范下,所有的组件都是面向对象的,语言无关的。这不是COM的理想大同世界么?真正的大同世界到来的时候,那些所谓的先锋烈士随便找个借口说不玩了,这种行为实在令人费解。

    从OLE到COM最终的.NET,尽管Application从最开始的文档处理演变到现在复杂多变的软件。思想却是一脉相承,组件化,组件化,组件化。。。。


    小学数学奥林匹克竞赛学深了 发现初中根本不用那些玩意用方程式,一怒之下再也不爱数学了,改从文科。



    小学数学奥林匹克竞赛学深了 发现初中根本不用那些玩意用方程式,一怒之下再也不爱数学了 这句话年看了有感觉啊....不过相信大都喜欢数学的,很少真的改文科了..

  122. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-04 17:14:00

    @msolap

    msolap:
    所以说你没看懂嘛,另外是建议你看《Essential COM》,不是潘爱民翻译的《COM本质论》。


    理由就是因为那是翻译过的?
    因为你看过"ECOM"而我没看过, 所以你就觉得你的眼界比较高?
    这样?



    我并非在和你讨论COM和.net孰优孰劣。即使是今天也依然有COM/COM+适用而.net不适用的场景。相信我,相比COM/COM+,我绝对更痴迷于.net。


    .net不适合的地方多了去了。 有人打算什么都让.net做的吗?
    .net不适合的地方, 就是COM的天下了?

    而我在上面的讨论, 是为了一个什么观点, 我估计你也没看懂。



    自从2000年夏天听了DON BOX做的一个培训《Essential .net》后,就爱上了.net。(当时还不叫.net,叫NGWS,C#叫cool语言,asp.net叫asplus。本来是去听DBOX的COM+,结果他老人家神秘兮兮地掏出了一个没有题目的课程,连讲了两天。)


    没看懂也来留言? 就为了来秀秀你的"资历"?

    msolap:
    搞技术的,怎么轻轻拍一下,就反应那么激烈呢?
    你自己在面试的时候都说不懂COM,和别人说有什么区别呢?一个事实自己说可以,别人说不得,是吗?这哪里是做好技术应该有的心态呢?


    我没说你说不得啊 —— 你怎么又看不懂中文了 —— 我哪句说的是“别说我不懂”? 我说的是“说我不懂时,请同时出示你的理由”。
    再次强调, 你倒是说说我哪说错了?

    搞技术的, 怎么思维这么混乱呢?
    说话没头没脑, 扯东拉西。
    你是搞开发的么? 还是搞seals或者marketting的?

  123. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-04 17:40:00

    @zzfff
    在批评别人外行, 头脑简单时, 请理解别人到底在说什么。

    你是不是找到一个机会就想来摆弄你的COM和.net学识?
    还真逗, 狭义COM、广义COM。


    说.net实现二进制协议,也许没错,但很外行:)


    .net是否是实现了二进制协议?
    请注意下面两句话的区别:
    ".net实现了二进制协议" vs ".net仅实现了二进制协议"。

    btw: 如果你觉得你很内行, 你很想show一下你的学识,你也可以分享一下.net除了实现二进制协议还实现了什么。



    认为狭义COM就是COM的精髓,虽然没错,但头脑似乎简单了点:)。我喜欢广义的COM,因为它们是用来建设世界的:IDL,marshal/unmarshal,connection point,structured storage,IMoniker,IDispatch,,IDataObject,IOleObject,IViewObject,IOleInPlaceObjectWindow.......


    谁在说"狭义"COM是COM的精髓? 我吗?

    你的中文能力还真是够外行的, 头脑能再灵光一些么?

    我说的只是COM实现(你所谓的)"广义COM"的手段太龌鹾 —— 当然, 这是口味问题。

    也许在你看来, 它无比优美? 也许"COM构建的世界"在你看来也很优美?
    我只能说, 你的审美观很别致。


    最后,你可以去看下CLR hosting,大把大把赤裸肮脏丑陋恶心的COM细节啊!


    哪又怎样? .net上的语言不恶心就行了。
    boost内部也很恶心, 但是只要它内部实现恶心的代码不会流散到客户代码中就可以了。
    但是COM做不到, 它就是要让客户的代码变得四不像。

  124. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-04 18:10:00

    @OwnWaterloo
    首先我得认个错,上面那一段有些不是针对你的,完全是我在自言自语在显摆。其次,佩服下你的彪悍,难道你是传说中的肖老师的学生?

  125. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-04 18:19:00

    @OwnWaterloo
    还得佩服你剽悍的逻辑思维,我喜欢COM,难道就意味着我排斥CLR?Waterloo同学,狂是好事,我喜欢狂人,因为我也是个狂人,年轻人不狂,和咸鱼有什么区别?关键是:狂完之后自我反省是否狂得很SB?
    regards

  126. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-04 18:26:00

    @zzfff

    zzfff:
    其次,佩服下你的彪悍,难道你是传说中的肖老师的学生?


    我觉得0 bug在某些方面可以做我的学生。

    zzfff:
    还得佩服你剽悍的逻辑思维,我喜欢COM,难道就意味着我排斥CLR?


    我也很佩服你, 我哪句话说了你排斥CLR了???
    我表达的只是对"你喜欢COM这样丑陋的东西"感到十分不理解。

    zzfff:
    Waterloo同学,狂是好事,我喜欢狂人,因为我也是个狂人,年轻人不狂,和咸鱼有什么区别?关键是:狂完之后自我反省是否狂得很SB?


    你先照照自己 —— 至于使用什么方式就看你的审美观了 —— 是否应该补习语文? 是否显摆得很SB?

  127. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-04 18:33:00

    @zzfff
    我还真奇怪。

    我说".net 实现了oo二进制协议",为什么你为认为我说的是".net 仅实现了oo二进制协议"?

    我说"COM实现oo二进制协议的手段太龌鹾", 为什么你为认为我在说"你排斥CLR"?

    为什么你把"你自认为的一些东西" 栽赃到我头上?

    我的思想是否你代表了?
    逻辑帝, 你能给我一个合乎逻辑的解释吗?

    你是宣传部的还是外交部的?

  128. 老赵
    admin
    链接

    老赵 2010-02-04 19:46:00

    @OwnWaterloo
    @zzfff
    两位冷静

  129. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-04 20:02:00

    COM,或我所谓的“广义COM“,或更广义的,Win32 API,对现在的Windows开发者来说很尴尬很鸡肋。一方面,它们的性(投入)价(产出)比很低,而.net framework library基本上提供了对它们的封装;另一方面,当“你”跳出,或不得不跳出CLR这个温暖舒适的matrix时,“你”不得不面对它们,向它们“下跪”。纯CLR的操作系统,我悲观的认为未来10年,乃至15年内,不会出现。现实总是这样的不完美,如同你我也不完美一样:)

  130. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-04 20:10:00

    ...它们的性(产出)价(投入)比很低...

  131. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-04 20:40:00

    @zzfff

    zzfff:COM,或我所谓的“广义COM“,或更广义的,Win32 API,对现在的Windows开发者来说很尴尬很鸡肋。



    1. 你所谓的"广义", 我真的无法理解……
    你指的是更底层? 没有托管环境?

    2. 我没觉得我很尴尬啊
    虽然Win32 API有设计得不好的地方(可以说是很多)。 但总体思路是没错的 : 想要二进制兼容吗 —— Windows一个很重要的目标 —— 那老老实实用C。
    2.1 OO不是万灵药, OP也不是绝对应该被淘汰的东西
    想想前2天首页上还出现一个约瑟夫OO解在哪…… 脑子坏掉了。

    2.2 C里面实现OB是很容易的, 简单的OO也可以

    3. 我真正感到尴尬的时候
    是我不得不使用dshow, 不得不去写COM客户端代码的时候。
    COM的代码 —— OO的思想, OP的实现 —— 一切都那么不自然。
    COM是在技术准备不成熟的情况下, 强行推出的一个二进制OO协议。

    小结:
    要想二进制兼容, 用C api不好吗?
    同时想要OO(以及你觉得.net环境提供的其他功能), 用.net不好吗?

    COM夹在中间怎么都是不伦不类, 高不成低不就。



    一方面,它们的性(投入)价(产出)比很低,而.net framework library基本上提供了对它们的封装;另一方面,当“你”跳出,或不得不跳出CLR这个温暖舒适的matrix时,“你”不得不面对它们,向它们“下跪”。


    1.
    性价比是商业公司的选择。 我在上面的留言里也说了: 我的言论更多是从个人角度, 希望后后背分清什么是产品技术, 什么是通用技术。


    2.
    我从来都不在"CLR这个温暖舒适的matrix中" 。 我是C/C++程序员。
    C/C++开发慢确实是实情, 所以我也曾考虑过深入学习C#。 可后来接触python后, 就对C#没爱了。


    3.
    对产品中使用COM, 我上面也列举过我的态度。
    同时, 在这个回复中也提到有不得不使用COM的时候。

    但是你的逻辑存在错误 —— 从利益角度权衡后决定采用某种技术, 并不能成为这种技术很优美的理由 —— 相反的是, 这通常说明该技术非常龌鹾, 否则就不需要权衡了。

  132. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-04 21:28:00

    又想了下,如果真会出现纯CLR的OS的话,我觉得并不是把Win32 API/COM赶尽杀绝,而是把它们深深的打入冷宫,如同把汇编语言打入冷宫。现在CLR/.net framework library并没有一统江湖(企业开发好点,消费娱乐开发很糟),只能说明它不够强大,以及硬件不够快,还有老赵传道不够积极。

  133. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-04 22:17:00

    全民扯淡,名不虚传。“参与讨论的霍炬(@virushuo)和郝培强(@tinyfool)都是老程序员,他们在上世纪末也都是微软平台的开发人员,但是因为难以忍受微软在那时候“毫无克制”的技术更迭(如VC => COM => .NET)”——我怎么觉得越想越奇怪,微软发展新技术,但并没有拒绝老技术啊,m$的技术的向后兼容性,在这个星球上应该没哪个公司做得比它更好。“你”老技术用得好,用得绝,用得难以替代,自然有“你”的一席之地,还怕什么?又怨个what?难道是人笨怪刀钝?

  134. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-05 00:22:00

    虎年将至,怎么牛人们一点霸气也没有了呢?给刚入门的小弟小妹提个醒:那些看起来很牛的人通常不怎么牛,因为他们把大部分精力花在如何让众人觉得他们更牛上。
    我呢?叫我职业扯蛋犯,谢谢。千万别人肉搜索我啊,虚拟世界就玩虚拟世界的规则。

  135. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-05 00:53:00

    @zzfff

    zzfff:
    给刚入门的小弟小妹提个醒:那些看起来很牛的人通常不怎么牛,因为他们把大部分精力花在如何让众人觉得他们更牛上。


    这个说法很有意思, 应该能够解释一些问题。

  136. 韦恩卑鄙 alias:v-zhewg 致力于提高回复平均水…
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 致力于提高回复平均水平 2010-02-05 02:07:00

    有点插不上嘴了

    Com丑并不是底层实现上丑 是众多组件封装的不漂亮
    大量com的开发权掌握在vc++程序员的手中 而这些开发com的vc++程序员带有大量win32api和vc非标准/安全/公共/托管类型的习惯,导致市面上的com带有大量语言特性和平台特性,可以说是vc++对api的垄断地位导致com那一代组件丑的非常丑!非常丑!

    所以 ADO没有人说丑 Fso没有人说丑 htmldom xmldom 也没有人说丑

  137. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-05 12:37:00

    "所以 ADO没有人说丑 Fso没有人说丑 htmldom xmldom 也没有人说丑"——因为它们实现了IDispatch接口,或者说实现了双接口,或者说实现了自动化接口,数据类型仅限于VARIANT能表达的,所以脚本语言可以调用。
    而下面的IDL:
    HRESULT Method([in]long cMax,[in,out]long *pcActual,[in,out,size_is(cMax),length_is(*pcActual)]short *rgs);
    基本上只有C/C++ client啃得动了,COM的变态有时赶超老学究。
    COM组件实现自动化接口,如同.net组件声明CLSCompliant(true),是强烈强烈强烈推荐的。

  138. msolap
    *.*.*.*
    链接

    msolap 2010-02-05 19:38:00

    @zzfff

    zzfff:
    "所以 ADO没有人说丑 Fso没有人说丑 htmldom xmldom 也没有人说丑"——因为它们实现了IDispatch接口,或者说实现了双接口,或者说实现了自动化接口,数据类型仅限于VARIANT能表达的,所以脚本语言可以调用。
    而下面的IDL:
    HRESULT Method([in]long cMax,[in,out]long *pcActual,[in,out,size_is(cMax),length_is(*pcActual)]short *rgs);
    基本上只有C/C++ client啃得动了,COM的变态有时赶超老学究。
    COM组件实现自动化接口,如同.net组件声明CLSCompliant(true),是强烈强烈强烈推荐的。



    :),看起来倒是zzfff比那些看起来很牛的人更懂COM(不过上面的IDL不只是C/C++才能啃得动,Delphi啃起来也不费劲)。

    同感,国内很多搞技术的太浮躁,在自己根本没弄明白前,就咆哮着说这平台不好那系统很烂。学COM的,以为读过《Essential COM》和《Inside COM》就懂COM了,他们不知道还有一本书叫《Essential IDL》。玩了两下COM玩不动,就说被伤了,他们大概连Apartment/Context都没搞明白。出了问题搞不定,就说平台烂。

    那些所谓上世纪末玩微软平台的先烈们,在我看来就一句话:上世纪他们根本就没入门(抱歉)。真正的“大家”从不贬低任何技术,正所谓见多识广、得道其中。

    -msolap (国内技术论坛充斥着骂声,满目浮躁,叹!)

  139. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-05 20:55:00

    @msolap
    握手。嗯,C#也啃得动。上论坛,基本上随口说,没怎么去考证,最尴尬的是,当初学COM认知不深,现在又n久没用。Don Box最招牌的两句话应该是:COM as a better C++,CLR as a better COM。诚然,COM有很多令人不爽的地方,但它是为解决实际问题而生的,它早已与Windows融合在一起,更是component-oriented programming的无冕之王。
    回首历史,C++->COM->CLR,技术在多么和谐自然的进化。让人唏嘘的是:art is long,life is short。

  140. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-05 21:07:00

    哈哈,白头宫女话天宝:)
    谈到Context,我立马想起了Tim Ewald的大作《Transactional COM+:Building Scalable Applications》,读起来大呼三声不亦快哉!我亲切的称它为"Essential COM+"

  141. msolap
    *.*.*.*
    链接

    msolap 2010-02-05 22:31:00

    zzfff:
    哈哈,白头宫女话天宝:)
    谈到Context,我立马想起了Tim Ewald的大作《Transactional COM+:Building Scalable Applications》,读起来大呼三声不亦快哉!我亲切的称它为"Essential COM+"



    你不说这本书我倒是忘了。DevelopMentor在COM年代出了不少好书,几乎本本都是精品,当时只要有DevelopMentor出的书一定找来看。但自从DON BOX的《Essential .net》这本书出了后,几乎就成了分水岭,DevelopMentor就再也没见过什么好书了。Don Box这本《Essential .net》写得实在不敢恭维,我的总结是书没有思想也就没了生命。最要命的是他老人家在书里花了大量篇幅介绍一个要命的东西CBO(ContextBoundObject),以至谋杀了N多人的时间去用CBO搞AOP。

    COM在1993年就诞生了,那个时候中国有什么?记得当时流行的是DOS/Win3.1+Turbo C+软盘。局域网是凤毛麟角,而且还是同轴电缆。互联网更连影子都没有。大学里大多还是DEC的VAX机。我们单位有钱,买了一台COMPAQ的486机,花了5万大洋(以现在的眼光看来是在抢钱)。最有意思的是那时候搞微软平台算是时髦的,UNIX根本算不得什么,绝对不像现在那帮所谓的先烈们眼里成了香饽饽。因为遍地都是UNIX,DEC有OSF/1,SGI有IRIS(SGI出的Indy/Indigo蓝色工作站堪称计算机经典),PC机上有XENIX(后来成了SCO UNIX)。知道XENIX是谁弄的吗?呵呵,是微软。一想到这里,我就觉得COM在当时简直是神来之笔。

    很多现在觉得理所当然的事情在当时根本是天方夜谭,我想这也是很多人觉得有些技术很丑陋的原因,他们没有经历过那个年代,不知道很多技术的前因后果和历史变迁。这当然怪不得他们。

    很怀念过去的时代,当时搞程序的碰到一起都是相互交流相互仰慕。哪像现在各各都觉得自己很牛气,相互踩来踩去。可笑的是,现在IT业早已迈过了让人引以为傲的年代。既然都是程序员,都在IT圈,都为了自己的梦想,为什么还不相互抬举、相互促进呢???

    -msolap

  142. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-05 23:11:00

    @msolap
    受教。关于.net中的context,我的理解就是拦截器,pre-及post-process messages(method call),目的,嗯,AOP。AOP这个东东,理论上很美,但我没什么实践。AOP是remoting的基石。说到这,我不得不抱怨微软,因为从应用层面上看,WCF与remoting是重叠的,ms的东西很复杂,人的精力有限。理性的说,这不怪ms,WS-* protocol stack在大概在04年才基本成熟,indigo才启动。
    也许,深挖WCF的实现,会发现它使用了System.Runtime.Remoting里的内容,除非是redmond的人,感兴趣的应该不多。
    抱怨都是主观原因。不过人是感性动物,抱怨是正常。说到这,我是不是该假惺惺的给霍炬和郝培强两位道个歉呢?算了,我信奉人性本恶,圣人不是我的奋斗目标。
    下一秒作恶。

  143. msolap
    *.*.*.*
    链接

    msolap 2010-02-06 02:22:00

    @zzfff

    :),context不是拦截器,不过拦截器是context/apartment的衍生物,或者说是一部分。COM+中的context其实和传统我们说的context(比如thread context)概念是一样的。如果我们把COM对象比喻成一位大家闺秀,那么可以把context想象成她的闺房(这也正是'apartment'名字的来源。实际上context是COM对象声明的一组基本属性以及COM system维护的一些高级属性)。Thread Context包含寄存器属性,thread没有这些context是存活不了的。类似的,COM object离不开赖以生存的context属性,大家闺秀也离不开她的闺房。同一个闺房里的人可以直接对话(方法调用),因为她们属性一致。不同闺房的人则未必能直接对话,除非两者的属性兼容。如果不能直接对话,那么必须要通过翻译才行。这个时候proxy/stub就出现了,也就是你说的拦截器,拦截器把一个闺房里的语言翻译成另一个闺房能接受的语言(这里的语言并非只是指编程语言)。在COM的世界里,IDL是世界语。

    在.net的世界里,context依然存在,每一个appdomain都有一个default context,由于.net对象大多都在一个appdomain的default context中,他们可以直接对话,因此context也就不太引人注目了。但必要时还是会出现的,比如ContextBoundObject、remoting,还有跨appDomain。其实从这里就可以看出.net骨子里流的依然是COM的血,因为COM的理念从来就没有过时。COM+的对象可以设置它需要的属性(attribute),因为COM+的一个梦想就是面向attribute的编程,我想这也是为什么.net里面会有大家熟知的attribute。

    当然Context现在没人关心有其更重要的原因,回到COM时代,COM是不同子系统之间的粘合剂,一个大的应用可以分成很多子系统,某个子系统可能是C++写的,而另一个子系统可能是VB写的。某个子系统是运行在应用服务器上的,而另一个子系统是跑在客户端的。COM充当了重要粘合加翻译的作用。反过来COM又是一个应用系统的分割器,将一个大系统分成了一个个子系统。子系统内部用什么语言,什么OO的方法实现都可以,COM不关心。但如果子系统间要对话,就得遵守COM法则,用IDL说话。这就是为什么谈到COM,必然要谈到接口谈到IDL语言。COM接口才是COM的本质,COM不是better C++(语言),COM是better C++ interface。Don Box的一句COM as better C++把大家都带到沟里去了,那显然不是他老人家的本意,呵呵。

    在.net世界里,大家都说CTS语言(Common Type System),语言部分接口问题(不是全部)消失了。所以Context没人关心是一件好事(但不等于Context没有了,不等于COM is dead)。

    写了这么多,也是顺便告诉楼上那位仁兄,他的理解错在哪里。COM从来就不是以一种面向对象的语言或框架出现的。再告诉那位仁兄,为什么建议他读英文版:1)语言的障碍是很大的。2)当时潘爱民翻译《Essential COM》的时候,“传闻”微软GTEC COM support team集体写信抗议潘爱民他老人家不要糟蹋了那本书。:D,可能完全是个误会。

    -msolap

  144. 韦恩卑鄙 alias:v-zhewg 致力于提高回复平均水…
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 致力于提高回复平均水平 2010-02-06 12:26:00

    @msolap
    老兄知识真系统啊
    虽然个人理解和你一样 但是多是道听途说 经验产物,不能像老兄你这样有根有据娓娓道来啊


    <在.net世界里,大家都说CTS语言(Common Type System),语言部分接口问题(不是全部)消失了。>

    也不能说是在.net世界里啦,.net所在的时代决定了CTS,或者说托管数据类型必须存在,

    不然让每一个想写出漂亮com接口的c++程序员 都要实现“IDispatch接口,或者双接口,或者说自动化接口” 光一个string / safe array 就要花上好长时间调试 对他们来说实在是一种折磨啊

    我没那么懂com内部的东西
    我一直是一个享受团队中com开发者成品的vb6/脚本用户,那些为我写com的兄弟们在和我联调时候的痛苦 我一直是很难忘怀的

  145. 韦恩卑鄙 alias:v-zhewg 致力于提高回复平均水…
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 致力于提高回复平均水平 2010-02-06 12:37:00

    zzfff:
    @msolap
    受教。关于.net中的context,我的理解就是拦截器,pre-及post-process messages(method call),目的,嗯,AOP。AOP这个东东,理论上很美,但我没什么实践。AOP是remoting的基石。说到这,我不得不抱怨微软,因为从应用层面上看,WCF与remoting是重叠的,ms的东西很复杂,人的精力有限。理性的说,这不怪ms,WS-* protocol stack在大概在04年才基本成熟,indigo才启动。
    也许,深挖WCF的实现,会发现它使用了System.Runtime.Remoting里的内容,除非是redmond的人,感兴趣的应该不多。
    抱怨都是主观原因。不过人是感性动物,抱怨是正常。说到这,我是不是该假惺惺的给霍炬和郝培强两位道个歉呢?算了,我信奉人性本恶,圣人不是我的奋斗目标。
    下一秒作恶。


    WCF 本来就不应该remoting放在一起啊兄弟
    WCF应该看作是 “WS和remoting重叠的地方太多了,分别实现很丑陋,做了一个新版本更NB的超集”才对哦

    <深挖WCF的实现,会发现它使用了System.Runtime.Remoting的内容>
    这个有点怪 依赖公共的序列化还说的过去 可能是有写 支持wcf的remoting binding实现,并不构成wcf的基础
    基础应当不会使用 remoting内容

  146. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-06 12:40:00

    @msolap
    再admire一下。嗯,context是abstract的概念,“拦截器”是physical的实现。模糊记得Don在99年的MSJ上有篇对COM+ ctx的深入思考,找了半天,找不到,罢了。.net下的ctx更进化更透明且完全可定制。我突然羞愧自己没勇气再温当年长征路,给自己找了个理由,兴趣方向变了,compiler,DSL。
    关于“XX as a better YY”,我觉得,除了刚入门的同学,有点经历的人都认为这是句煽情的话。再罗嗦一下:煽情!=错了

  147. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-06 13:39:00

    @韦恩卑鄙
    我觉得System.Runtime.Remoting.*与remoting是有区别的。有点古怪。前者可以看作是,如msolap所言的,ctx,.net中的ctx。后者可以看作是DCOM的托管代码版。后者被WCF替代了,或者说,RPC被XML Web Services替代了。

  148. 蛙蛙王子
    *.*.*.*
    链接

    蛙蛙王子 2010-02-06 14:46:00

    学的多就是有争论的资本,呵呵。
    我想插句话都不知道说啥捏,呵呵。

  149. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-06 15:08:00

    为了消除不必要的误会,申明一下。我所谓的“替代”、“淘汰”什么的全是煽情说法,是不严谨的。只能说明这项技术已不是主流,淡出了公众视线。《国产零零漆》里说:就算是一条底裤,一张厕纸,都有它的用处,更何况一项汇集了无数智慧心血的技术?

    @蛙蛙王子
    难道你不知道半罐水,响叮当么?(说自己啊,别对号入座)

  150. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-06 15:19:00

    @韦恩卑鄙
    .net中的ctx,或《Essential .NET》的chap7,Advanced Methods,我认为毫无淘汰的可能,它是.net中的一部分。我只是猜测,WCF的内部实现使用了它们。
    (把这一堆东东叫做ctx也许太武断太牵强,叫做“Advanced Methods”又不通俗,就叫这一坨吧!)

  151. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-06 16:53:00

    读书多,没有穷尽;扯蛋多,身体疲倦。

  152. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-06 17:57:00

    冒泡:)
    我说context是抽象的、虚的,也许msolap同学会说它很具体很实在。yes,我还隐约记得IObjectContextInfo,CoGetObjectContext等等,ctx as object确实有点清晰具体了。但,除非去redmond把COM+的source code读个底朝天,即便把《Transactional COM+》读5遍,它都是虚的——心里虚。
    .net中的ctx,当然可以去读SSCLI弄个明明白白。但,在现实世界,一切要讲性价比,或功利性。把SSCLI读个底朝天的人的功利性很明显:去redmond。
    想起一个很酷的标题:《雷德蒙与世界的距离》

  153. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-06 18:28:00

    @msolap
    我引导你思考3个问题

    msolap:
    回到COM时代,COM是不同子系统之间的粘合剂,一个大的应用可以分成很多子系统,某个子系统可能是C++写的,而另一个子系统可能是VB写的。某个子系统是运行在应用服务器上的,而另一个子系统是跑在客户端的。COM充当了重要粘合加翻译的作用。反过来COM又是一个应用系统的分割器,将一个大系统分成了一个个子系统。子系统内部用什么语言,什么OO的方法实现都可以,COM不关心。但如果子系统间要对话,就得遵守COM法则,用IDL说话。这就是为什么谈到COM,必然要谈到接口谈到IDL语言。COM接口才是COM的本质,COM不是better C++(语言),COM是better C++ interface。Don Box的一句COM as better C++把大家都带到沟里去了,那显然不是他老人家的本意,呵呵。



    问题1:在COM出现之前, 是否不存在不同系统之间的粘合剂技术
    错, 无论是COM技术出现之前还是之后, 不同系统之间的粘合剂技术一直存在 —— C语言的api。



    写了这么多,也是顺便告诉楼上那位仁兄,他的理解错在哪里。COM从来就不是以一种面向对象的语言或框架出现的。再告诉那位仁兄,为什么建议他读英文版:1)语言的障碍是很大的。2)当时潘爱民翻译《Essential COM》的时候,“传闻”微软GTEC COM support team集体写信抗议潘爱民他老人家不要糟蹋了那本书。:D,可能完全是个误会。



    写了这么多, 显摆一下即将过时的大量经验; 如果你觉得很光荣, 请你继续。


    问题2:既然在COM出现之前, 已经存在不同系统间的二进制粘合剂, 那为什么还要搞出COM?

    问题3: 结合问题1,再结合与COM通信的语言,你再想想OO是否是COM的一个目标?

    可惜这个目标它完成得很烂。

    COM确实还趁这个机会(推出COM的机会)将许多其他设施一并实现了。
    这部分我确实没有深入了解, 因为我觉得这种过时的技术不值得我花时间去学习, 更不值得花时间去看《ECOM》。
    直觉告诉我, 如果抛弃OO这个目标, COM提供的其他设施:
    1. 要么C api已经提供了
    2. 即使没有提供, 也不需要COM这样复杂的协议。

    如果你原意, 可以举出一些COM提供的你认为的优秀设施;
    而我可以试着告诉你这些设施中, 我认为优秀的那部分应该如何在非c api的环境下达成。
    然后我们在回到原来的问题: COM是否是被OO协议所拖累,才会实现得如此丑陋。


    同时, 给你一个建议: 深究技术是好事, 国内缺乏(大部分人)缺乏这样的精神 —— 这也是我订阅老赵blog的原因 —— 但别陷进去了! 要思考这种技术究竟解决了什么问题; 它解决问题的方式的优势与缺陷; 以及它解决的问题, 究竟是否真的是一个问题。

  154. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-06 18:52:00

    @msolap
    仔细看了看阁下的评论, 确实对COM了解很深入。
    同时我也想请教一个问题: 是否对某技术不如你了解深入, 就没有任何资格评论这种技术了?

    我一开始的观点 —— COM的路线是错误的。 理由:
    做底层? 它太复杂。
    做高层? 使用COM的代码所做的事, 究竟是fighting with the requirement 还是fighting with the protocol of COM
    COM的代码是在用编写底层代码的都不需要的复杂度去编写上层逻辑, 两边不讨好。

    这个观点, 有错吗? 负责任吗? 是否需要对COM研究到如同你那样的深度, 才有资格评论?

  155. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-06 19:00:00

    @OwnWaterloo
    补充一下, 上述"复杂度"特指"COM的OO协议所带来的复杂度"。
    底层用不上, 高层受不了。

  156. OwnWaterloo
    *.*.*.*
    链接

    OwnWaterloo 2010-02-06 20:55:00

    说实话, 和ls各位的讨论引发了我"去深入了解COM"的冲动。 仅仅是冲动,吃过饭后就打消了这个念头。

    我还有其他更重要的事要做, 不包括为一种过时的技术逞口舌之快, 也不包括教育他人"非COM的环境下会更美好" —— 从讨论的角度说, 这是几乎不可能完成的任务(原因见下); 从自私的角度来说, 关我啥事?

    关于我在这篇贴里回复, 做个总结。 该贴我会继续关注, 回复可就没那么勤快了。


    —— —— 关于"COM的思路是错误的":

    对某种产品技术而言, 如果它在短时间就沦为小众技术, 是否可以说明这种产品技术的思路是错误的?
    COM是否已经沦为(或者是否会沦为)小众技术? 它沦陷的时间和.net相比如何?
    我打算留给历史去见证了, 我只希望没有gates的ms能够挺过那一天, 别让这成为悬案。
    也希望那些痴迷COM的人能扪心自问: COM是真的好, 还是你们在自我陶醉?
    但是我对此不抱希望: 要承认自己学的东西是废物, 对任何人来说都是痛苦的 —— 学得越多, 越是如此。

    各位COM粉如果打算继续讨论COM的优势, 请随意。 如果其中有新颖的观点, 我会跳出来说一句感谢。
    甚至, 如果有能够扭转我思想的观点, 我会站出来说一句"oh,对不起,我说错了"。
    如果需要, 我还可以在cnblogs首页上发道歉贴。


    —— —— 关于"批评COM的资格":

    再次强调, 在下对COM的了解确实不如ls某些同学深入。
    但是, 这足以成为"不能评论COM"的理由吗?
    说出"他不是什么都没穿嘛"的小孩, 不正是因为那小孩不懂人情世故吗?


    —— —— 关于"负责任的评论":

    确实评论不够负责, 所以我在这里更正一下:
    我在该篇评论里的所有留言, 都是个人观点, 而且也许是错误的 —— 别听我的!
    没有人拿着刀架在你脖子上说: 你必须用COM!
    同样, 也没有人拿着刀架在你脖子上说: 你必须不用COM!
    请各位看官自己擦亮眼睛: 生活是美好的, 也是有限的; 不要把美好有限的生命浪费在学习无用的东西上(注意, 并不指COM)。


    —— —— 关于装大牛嫌疑:

    "说一种技术的思路是错误的" vs "对某种即将沦为小众的技术津津乐道"
    究竟哪种更有装大牛的嫌疑, 各位看官自己掂量吧。

  157. zzfff
    *.*.*.*
    链接

    zzfff 2010-02-06 21:19:00

    恶善交加,亦悲亦喜——人生的最高境界
    华丽丽的匿
    ----------------------------------
    看来某位秀才遇到兵了,不,是会讲人话的黑猩猩!
    持续围观 秀才PK黑猩猩

  158. msolap
    *.*.*.*
    链接

    msolap 2010-02-07 11:51:00

    韦恩卑鄙 alias:v-zhewg 致力于提高回复平均水平:
    @msolap
    我没那么懂com内部的东西
    我一直是一个享受团队中com开发者成品的vb6/脚本用户,那些为我写com的兄弟们在和我联调时候的痛苦 我一直是很难忘怀的


    恩,理解这种痛苦,不同编程语言间的调试本身就是一件痛苦的事情。
    你最后的这句话触动了我,程序员间的情感正是在日以继夜地Fighting with XXX protocol时建立了(借用OwnWaterloo的话,hehe)。任何技术都会被自己遗忘,让人难以忘却的往往是与自己一起走过一段的兄弟和当时的痛苦。唉,暮然回首,才发现程序员编写的其实是背后的人和自己的人生。如果希望自己写的程序/应用能上一个境界,就请多考虑程序背后的人和人性。

    -msolap

  159. msolap
    *.*.*.*
    链接

    msolap 2010-02-07 12:12:00

    zzfff:
    冒泡:)
    我说context是抽象的、虚的,也许msolap同学会说它很具体很实在。



    其实你说的没错,我前面说的都是逻辑上的概念。在运行时,Context(闺房的建立)是每次COM调用时由stub建立的(想想thread context建立的时机就好理解了)。另外,stub是COM/DCOM的概念,COM+应该已经不叫stub了,好像是叫interceptor之类的,记不清了。如果你调用一个COM接口的方法不是通过proxy,而是通过裸指针,那么context是不存在的(你也因此丧失了COM/COM+提供的特性)。这样的后果是,如果COM object依赖于context才能正确运行,那你用裸指针绕开context就可能出现潜在的问题。问题的严重程度和错误被发现的可能性取决于Object对context的依赖程度。裸指针的表现形式有很多:编程语言的对象引用、函数指针以及函数指针的变种(如事件)、没有经过正确marshal的interface等等。

    COM/COM+对大家说,我可以为你提供服务,如果你需要我提供的服务,就请你遵守我的rule,而不是fight with my rule。我肯定fight不过你,因为你是人,我是还未足够进化的代码。

    -msolap

  160. msolap
    *.*.*.*
    链接

    msolap 2010-02-07 12:57:00

    OwnWaterloo:
    @msolap
    同时我也想请教一个问题: 是否对某技术不如你了解深入, 就没有任何资格评论这种技术了?这个观点,有错吗? 负责任吗? 是否需要对COM研究到如同你那样的深度,才有资格评论?


    你的这个问题其实是个哲学问题,这个问题等同于:你如果对一个人的了解不够深入,是否就没有资格评论他了?

    我想当然不是,你完全可以拥有自己对某个人的评价:“这个人很烂,不要理他”。但问题是,如果把自己的个人评论在公共场合(如论坛)传播的时候,你就得掂量一下,你对他的评价是否符合传统大众层次上的客观?你是否有足够的阅历和对人性的洞察力?

    如果你的判断一旦失误,你会给听众造成不正确的引导,特别是那些没有太多阅历的同学们。这就是我说的不负责任

    这里又出现另一个哲学命题,人们怎么知道自己的判断是否失误?我的观点是人们不可能知道。越是了解不够深入,出现失误的概率越大。每个人都有局限,而局限往往会导致他坚持认为一个错误的观点是正确的。就像醉酒的人大多说自己是清醒的。

    那大家是否都不要在论坛上发表自己的心得体会了?当然也不是,但是当你发表自己的看法的时候,应该首先秉怀宽容仁慈之心,保持兼收并蓄(diversity)的心态。要不停地对自己说任何技术都有它的优点和缺点,都有它的适用场景和历史使命。那么你落笔时离客观就比较近了。

    我这里有一个个人建议,就是在公共论坛上应该多说平台和技术的优点,少说缺点。多用“不完全正确”等正面词汇,少用“错、烂”等负面词汇。特别是那些影响力大的大牛们更该如此。正面的言论会给大众一个正面的推动,容易创造一个良好宽容的环境(context)。而宽容的环境更容易激发程序员的激情和创造力。

    批判一种技术,无论你是否正确,往往都会打击这种技术的爱好者,并造成相互攻击的氛围,洁身自爱的人都会逃离这种环境。这样的技术论坛最后会变成被某些“大牛”和他们的簇拥者劫持的“近亲繁殖”的场所。一个找不到公平和兼收并蓄的论坛哪里还能被正确引导并推动技术发展呢?这就是我说的另一种不负责任

    OwnWaterloo,你说呢?

    -msolap

  161. msolap
    *.*.*.*
    链接

    msolap 2010-02-07 17:05:00

    OwnWaterloo:
    @msolap
    我引导你思考3个问题

    问题1:在COM出现之前, 是否不存在不同系统之间的粘合剂技术?
    错, 无论是COM技术出现之前还是之后, 不同系统之间的粘合剂技术一直存在 —— C语言的api。

    问题2:既然在COM出现之前, 已经存在不同系统间的二进制粘合剂, 那为什么还要搞出COM?

    问题3: 结合问题1,再结合与COM通信的语言,你再想想OO是否是COM的一个目标?

    可惜这个目标它完成得很烂。


    呵呵,我来回答你这三个问题,作为友好往来,你也不吝赐教回答我的问题吧。

    问题1,应该算是你的自问自答吧,这里好像没有人说过COM之前和之后,地球上没有粘合剂技术。
    本以为你会说COM之前有CORBA,没想到是C API。这里请教一下[问题A]C API是指什么?ANSI C语言?C runtime library?OS API?

    提到ANSI C,想起一份资料说到,当年C++刚出来的时候,C的爱好者针对C++特性与C++阵营进行了激烈的争论。C的爱好者认为C++的所有特性 C语言都能完成,而且完成得更好。我相信C阵营有足够的理由证明这一点,特别是在可移植性上。这是题外话。
    C语言可以胜任所有别的系统能做的事情,COM runtime还是用C写的呢。

    问题2,为什么还要搞COM?
    是因为各种技术都有各自的优缺点和适用场景吧。COM有它独到的优点,特别是在Windows平台。

    我们来看一下C语言的一个经典接口问题,type-safe Linkage:
    如果某个子系统A用C实现了一个API,接口是:void Foo(int i); // contained in foo.h
    另外一个子系统B用C来调用这个API,不幸的是,foo.h文件从软盘里读出来的时候,不经意把接口变成了void Foo(double i);
    问题在于这个B子系统(#include "foo.h")在通过C编译器编译和链接时完全没有任何问题。当B子系统碰巧调用到A子系统的Foo时,悲剧就发生了。
    [问题B]请教OwnWaterloo,如何通过C API来避免子系统粘合时接口描述错误问题?
    当然我前面说的软盘显然是不靠谱的,咱们现在有U盘有网络,可以保证foo.h在复制到B子系统的编译环境是完全一致。那么请考虑一下子系统A如果在版本更新升级时怎么办?


    问题3: 结合问题1,再结合与COM通信的语言,你再想想OO是否是COM的一个目标?
    您的回答是:“可惜这个目标它完成得很烂。”
    我之前在给zzfff的回复中提到:“COM接口才是COM的本质,COM不是better C++(语言),COM是better C++ interface。”。我再给你总结一下:“OO从来就不是COM的目标”(因此也不存在它完成得很烂之说,你算是被人带到沟里去了)。OO的大部分事情在面向对象的编程语言里面已经做得很好了,COM不关心OO,COM关心的是子系统和子系统,模块和模块,组件和组件之间如何跨越接口边界。接口边界现在是一种轻松的说法,一种痛苦的说法是接口鸿沟。


    子系统和子系统间有哪些鸿沟?
    1.编程语言的鸿沟
    [问题C]请教OwnWaterloo,C API如何来调用一个VB写的方法?C API如何让网页上的Java Script调用Delphi写的一个组件?子系统A调用子系统B,结果C++写的B子系统抛出了一个异常,C API如何让C语言编写的子系统A捕获到这个C++异常?C API如何解决Windows平台上调用惯例的问题(call convention)?是WINAPI的stdcall?C的Cdecl,C++的thiscall?还是delphi的safecall?

    2.跨进程、跨网络的鸿沟
    [问题D]请教OwnWaterloo,C API如何实现进程间调用?如何跨越网络的边界?指针是个虚拟地址空间里的概念,那指针如何跨进程和网络传递,指针的指针怎么办,你怎么知道这是指针?整型数据在SUN的solaris系统上和在Intel的Windows上的内存布局是不同的,怎么转换?

    3.安全的鸿沟
    [问题E]请教,子系统和子系统有不同的安全验证体系和授权体系,C API如何传递Credential?Delegate?Impersonate?Full Trust?

    4.两阶段事务提交的鸿沟
    [问题F]请教,Component A和B都访问和更新不同的数据库,C API如何实现分布式事务?

    5.业务和历史的鸿沟
    [问题G] 一个组件OLD是上个开发团队写的,Spec里注明了,本组件不支持多线程同时访问。请教C API如何解决多个组件同时并发调用OLD组件的问题?

    6.其他的问题
    在此先略过,我急于想知道前面几个问题的答案,:)

    还是那句话,没有经历过,自然就不知道很多问题的前因后果和历史渊源。前人的贡献今天被当成了想当然,但这就是真正的技术进步吧,:)

    最后跟OwnWaterloo兄弟说一句,一种技术如果你看到了它的可取之处,你就真正得到了。如果学一个技术扔一个技术,就像猴子摘玉米,摘一个扔一个,到头来会两手空空。这是对自己的不负责

    COM慢慢淡出历史舞台,COM有太多的问题,其实前面没有任何人否认,更没有人像你说的“陶醉在COM的世界里”。大家都在说一句话:“COM有很多闪光点,COM的思想值得我们去思考去学习”。

    -msolap

  162. 怪怪
    *.*.*.*
    链接

    怪怪 2010-02-07 21:00:00

    @msolap
    老兄的帖子让我学到不少,要说老兄的阐述只是让我觉得你懂得真多,老兄提出的问题就得让我真正有所收获了。

    另外,老兄对COM和OO的划分放在10年前的话,不知道能让多少同时学习OO和COM的人少受痛苦,唉唉,唉唉唉

    今天没白上博客园。

  163. pandaren
    *.*.*.*
    链接

    pandaren 2010-02-07 21:24:00

    讨论的真好 收益啊

  164. 韦恩卑鄙 alias:v-zhewg 致力于提高回复平均水…
    *.*.*.*
    链接

    韦恩卑鄙 alias:v-zhewg 致力于提高回复平均水平 2010-02-08 11:32:00

    确实 com不是面向对象的, 甚至com是属于面向服务的味道。。。

  165. 路人丙[未注册用户]
    *.*.*.*
    链接

    路人丙[未注册用户] 2010-03-05 23:54:00

    看看微软的技术迭代多爽啊,学习WM的孩子又可以学习新的WP7了:
    微软:Windows Phone 7完全不兼容Windows Mobile 6.x应用程序
    http://news.cnblogs.com/n/58018/

  166. andy.he
    61.152.124.*
    链接

    andy.he 2010-04-02 16:15:18

    恩,不错。也说两句(站在一个初学者的立场)。 首先,我喜欢看务实的回帖。对于某个问题或者命题,答案也许是丰富多彩的,你可以说它是对的,你也可以说它是错的,你的表述方式可以是激情或武断的,也可以是冷静而娓娓道来的,这些都不重要,重要的是你要有相当的资料或者证据抑或你自己的理解、经验来支撑你的观点。在很多主题里,往往我会看见“xxx不行”,“xxx是错误的”,“我完全赞同xxx”。。。这样的简短回帖,面对这样的回帖,我一般会跳过,因为我觉得这样的回帖没有丝毫意义。 然后,我发现中国文化里有一种独善其身的基因。一些前辈,不光技术牛,脾气也牛得很。这些人受不得一点委屈或者自认为肮脏的东西,他们做得最多的事情就是退出,退出他们以为不屑的场合或者环境。我只能说这是一种软弱与自私的表现! 我进入IT行业也才1年多点的时间,我知道业界肯定有很多牛人,至少有很多有丰富经验的人,但是,却绝少发现他们能莅临指导一下。我去过很多国内的论坛,却至今找不到一个能让我很满意的地方。 最后,我觉得中国人普遍缺乏合作以及互惠互利的精神。他们往往认为发生在其他人身上的事与自己无关,其他人的状态也与自己无关。所以,他们遇事往往只想到自己,只站在自己的立场上说话。我只能说这是一种极度短视的行为。

    @韦恩卑鄙:恩,有道理。我感觉OO与COM在不同的Level上,OO应该主要是讲语言吧,而COM更像是一种分布式的协议。

  167. 必填
    123.123.0.*
    链接

    必填 2010-05-23 23:00:11

    OwnWaterloo,我想你不但对COM认识不足,对CLR也是不足,建议你先把Essential .NET的第一章,再重读5遍。把后续章节至少读一遍。 :)

  168. 必填
    123.123.0.*
    链接

    必填 2010-05-23 23:39:48

    @msolap

    当然Context现在没人关心有其更重要的原因,回到COM时代,COM是不同子系统之间的粘合剂,一个大的应用可以分成很多子系统,某个子系统可能是C++写的,而另一个子系统可能是VB写的。某个子系统是运行在应用服务器上的,而另一个子系统是跑在客户端的。COM充当了重要粘合加翻译的作用。反过来COM又是一个应用系统的分割器,将一个大系统分成了一个个子系统。子系统内部用什么语言,什么OO的方法实现都可以,COM不关心。但如果子系统间要对话,就得遵守COM法则,用IDL说话。这就是为什么谈到COM,必然要谈到接口谈到IDL语言。COM接口才是COM的本质,COM不是better C++(语言),COM是better C++ interface。Don Box的一句COM as better C++把大家都带到沟里去了,那显然不是他老人家的本意,呵呵。

    发现一个表述不严谨的地方。 COM组件在运行时不是使用IDL说话,IDL是build之前的、源代码Level上的东西,运行时,COM组件间,是在用QueryInterface以TypeInfo这种东西来说话的。

    小疵不掩大雅,希望有机会多交流。我也是个.NET CLR的老粉,从你的回复来看,应该经历差不多。

  169. jimmy
    114.255.149.*
    链接

    jimmy 2010-10-21 14:49:57

    为什么老赵不建议学php呢,这是老赵所没有说明的,没搞懂。

  170. 老赵
    admin
    链接

    老赵 2010-10-22 10:02:53

    @jimmy

    从现在看来php在技术方面粗糙了,你可以用(因为生态环境好,资源多),但是学这个对自己没长进。

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我