怪怪 | Nothing, Everything

"有过一个发疯的时刻,有感觉的钢琴以为它是世界上仅有的一架钢琴,宇宙的全部和谐都发生在它身上." - 狄德罗
随笔 - 109, 文章 - 3, 评论 - 2072, 引用 - 60
数据加载中……

闲言碎语

有些想法是以前没有表达清楚的, 在这个帖子里唠叨两句。

1. 关系模型和对象之间的矛盾, 其实很多时候找出真正的重点甚至本质的钥匙在于, 不同的阶段之间如何连接, 和比如性能之类的看似比较外围的点。 

现在有一种比较不好的说法, 比如机器越来越快, 性能不重要了, 等等。 如果真是如此, 其实很多矛盾就根本不存在。 比如, 即使我们采用的是面向对象数据库,或者某个超级强大的ORM框架;也许在某些特别合适的情况下我们可能少做很多工作, 但是我们承担的起那个开销么? 注意, 我这个不是对面向对象数据库性能的质疑那么陈词滥调, 而是这样: someBody.Friends, 关键的问题在于, 什么时候载入Friends的数据? 载入多少条数据? 延迟加载对于很多系统是不能接受的, 因为在这些场景中(比如压力很大的系统中, 比如数据库服务器和应用服务器之间的网络开销), 由于连接次数过多, 带来的性能下降很可能是致命的。 而这些问题如果一旦产生, 一般就是本质性的, 任何工具也解决不了的; 即使明天CPU突破100Ghz了, 网卡响应速度提高1000倍了, 这个问题也仅仅是被隐藏一时而已。

在这里引入一个个人的认识, 我觉得应该作为每一个软件开发人员都知道的公理: 硬件的进步是为了让用户获得更好的体验, 老板降低更多的成本, 而不是为了让软件开发人员活得更舒服一些。

如果不存在这个问题, 那么一个简单的ORM或者ActiveRecord就足够了, 也不见得非得要什么面向对象数据库或者非常复杂的框架。 实际上, 正是面向对象数据库, 或者类似的理念(包括一些ORM), 在他们的模型上, 或者其使用方式上, 往往和真实发生的事情相矛盾; 也就是说, 我们之所以碰见问题, 不是因为我们的持久化系统与面向对象不对付, 而恰恰是因为我们把不对付的做法, 带入了系统的设计和构造, 带入了应用, 所以才制造出问题: 明明因为性能也好, 因为什么其他看起来不那么关键的问题也好, 我们在这里实际上有两个阶段(持久->内存,内存->应用), 而当我们使用一些解决方案(非工具之罪)时, 却经常性的非要罔顾这一点。 即使直接从用户的视角出发, 作为人同一时间能处理的信息也是有限的, 所以诸如何时载入数据、 载入多少等问题也是客观存在的。 想要还原真实世界吗? 那么先搞清楚“真实世界”是用户相关的真实世界, 还是上帝的真实世界呢?如果希望引入一些新的工具, 就消除和避免这些问题, 鉴于理想和现实的差别, 抱怨的产生也是自然的了。

实际上, 我个人认为, 理解好这些问题, 采取任何解决方案都是可行的。 诸如ORM, 面向对象数据库之类的东西的引入, 更多的应该看重其它吸引力, 而不是隐藏和“帮助”我们去避开那些我们必须解决的问题; 很显然, 越是考虑的的清楚, 越可以自由和恰当的使用好它们。 要说更多的问题, 可能还有因为某些解决方案带来僵化的可能性; 因为很多时候我们希望持久和应用是可以分别变化的(不是指Oracle->MSSQL)。 实际上, 如果我们将面向对象数据库或者ORM的结果, 当作进入下一阶段之前准备的数据, 那么持久和应用之间还是解耦的。 最后归根结底, 如果我们认为存在或部分存在两套对象是不能接受的, 那不还是因为上述提到的问题吗?

最后多说一句, 在探讨这些问题之前, 首先确定你需要一打子对象。 水蒸气对象的引入, 本身就不会有什么好果子吃; 这时候引入额外的工具或框架, 最好的结果不过是既没有改进什么, 也没有损失太多; 唯一的收获是,因为我们的“设计”更“面向对象”了, 所以心里很美罢了。 这种结果恰恰造成在我们最不需要对象的时候让我们似乎尝到了什么“甜头”, 以至于让我们昏头。

2. 数据库或者其它持久化的方式, 比如文件等等, 对我们设计系统还能起到什么作用? 我们现在非常习惯于类似于web.config这样的文件了, 也经常在数据库中保存一些配置信息, 更多的呢?

很多人总再说, .NET 1.1足够用了, 个人认为这是因为看得不够远。 关键是, .NET 2.0以后, 对于语言的变革, 对于我们的设计, 到底产生了什么样的影响? 实际上, 大多数高水平的.NET程序员, 都对这些新特性掌握的很好, 可大多数人还只是把它们当成简化工作, 或者搞些局部技巧的糖豆, 而没有真正的让它们革新我们的设计。 想像一个对象, 除了基本的数据属性, 应用delegate,我们完全可以让行为也变成一种属性, 通过不同的配置和构建过程, 我们就可以获得多态等特性, 而且比使用老掉牙的设计模式实际上要灵活的多。

更关键的, 通过对持久层的更新, 我们非常容易的就可以改变它们, 如果花半个月功夫, 做一个用于创建和配置对象的小型框架, 我们的定制能力就不再以类为单位, 而是可以细致到每一个对象的。 而且, 鉴于过去针对不同对象的流程之间也经常会出现很大的相似性, 如果我们充分考虑操作和数据的特征, 采用新的视角来规划数据和对象, 实际上, 我们对于流程的重用, 也会上升到一个新的高度。 再想想对单元测试等应用场景的改善吧, 不是很诱人么?关键是, 我们准备好了没有, 还是等着所谓的“大师”把一切总结出来, 然后我们照做就行了?

这里说一句多余的话。 Linq刚出的时候, 我给予它比其它ORM更高的评价, 我说, “它不仅仅是一个ORM”。 但是实际上, 由于MS的影响力和一些伪面向对象专家和组织长久以来营造的一些舆论导向, 我倒是觉得, Linq带来的负面影响, 可能要比它多出的那部分带来的革新要大。 我并没有看到Linq对delegate的应用启示了多少人, 但是我看到更多的人能够更轻松的在不恰当的场景下尝试Linq中那些类似于ORM的部分, 从而更加接近上面第1条中所说的陷阱。 

虽然有没写完的感觉, 但是没啥更多可以说的了, 先到这儿吧。 

Update:
既然是瞎写, 也不打算上首页, 就说点乱七八糟的吧。 我觉得今天老赵搞的这个推荐是有点让人莫名其妙。 联想到这两天我去和别人去进行无聊的争论, 难道夏天到了, 大家都开始浮躁了?

警告, 后面的文字我根本不想写, 如果你是敏感的人, 尤其是你原来对我还有三分好感, 你就不要看了, 赶紧点右上角的x吧。























































说一个现象, 在pongba那个圈子里也是, 在这里也是, 大家只要发一个贴, 互相的称呼就都是“大大”, “牛人”, 唉....有谁还记得《神雕侠侣》最后一段, 杨过他们上山以后碰见一群家伙正在“华山论剑”。 说实话, 有一阵子我心里很不把金庸的写作水平当回事, 觉得他塑造的太典型了, 不具备足够的技巧。 也许,生活里有些时候, 事情就是这么典型的。 我的偶像, 当之无愧的大神(相对于满世界牛人, 我觉得“大神”这个称呼也有点不够用了)John Carmack曾经说过, 跟任何程度的程序员, 都有可能学习到东西, 而不要去计较谁更“Better”, 这种精神是我非常认同的。 谦虚谨慎, 尊重他人, 这是我们都应该努力做到的, 不过现在这阵势, 还是在这八个字的正常范围内吗? 尤其让我难以接受的是, 一些全民皆牛的参与者, 还是我曾经比较喜欢的家伙。 

难道是我太敏感了? 毕竟, 如果我不是和谐的一分子, 说不准真有问题的就是我。 看看吧, 何必非以不受人欢迎的面目出现呢。

posted on 2008-04-21 16:34 怪怪 阅读(1900) 评论(12)  编辑 收藏

评论

#1楼    回复  引用  查看    

2.0,3.0,3.5都没怎么看过,只是觉得模板,扩展方法这些东西在某些地方还是很有用的,好处,没仔细总结过,部分类,不知道是好还是坏,不过至少可以让代码清晰一点,不用2.0以上的功能,一样可以写代码,个人觉得开发工具只是工具,当然好一点的工具,新一点的方法,在效率上会有所提高,这或许就是工具推陈出新的本意吧?

linq,没仔细用过,你说的延迟加载,部分加载倒是我比较欣赏的功能,不过感觉linq从某种程序上来说好像更像是一种通用的面象对象查询接口,数据库方面的应用只是接口的一种吧,ORM好像也算是吧

另外,人总是要适应社会的,除非是英雄,那或许可以造时势
2008-04-22 12:18 | 九流      

#2楼    回复  引用  查看    

其实老赵的推荐,出发点还是好的。自己认为不错的东西,推荐给更多的人分享,也是很好的事情。
我看待人和事,只要出发点是好的,即使错的(当然我无法判断老赵说的那个大牛是否真的牛),我也会感激对方。事情的对与否,还得靠自己去分辨。

至于微软的技术,我还未深入,就已经远离,她的强大和方便,确实让很多人开发起来感觉很爽。我把自己定位为一个技术人员,微软的平台太高,以至于让我都不知道自己站在什么位置,还是从最基本的东西一点一滴的做起。

我是一个敏感的人,也喜欢看博主的文章。不过看完之后,博主的警告并没有出现那种应该有心理准备才看的东西。

不过自己的见识确实还很浅,感觉还无法跟博主进行深层次的交流,不过还是喜欢常常过来逛逛,当一个过客。
2008-04-22 13:52 | 路缘      

#3楼    回复  引用  查看    

再说一小点,冒昧说一句,有些事情,自己心里明白怎么回事就行了,也用不着那么较真,因为别人也不一定是很认真很负责的说的。
2008-04-22 13:57 | 路缘      

#4楼 [楼主]   回复  引用  查看    

@九流
其实如果更加重视delegate的应用, 设计的方法还是能有很大变化的, 感觉这里可能会有一个量变到质变, 不仅仅是个效率的问题。

@路缘
其实老赵的推荐, 我只是觉得放首页有点奇怪, 别的没觉得什么。 就是觉得国内社区的讨论氛围很奇怪。 牛人的定义, 我一直以来认为的是, 对自己所在的领域*本身*有所贡献的才算; 为什么这么说呢?

其实我不在乎大家全都带上牛人的光环, 如果比如某某技能掌握的不错了, 也有分享该技能的行为, 这当然是好事。 只是正是因为大家都是普通人,是很容易懒惰的, 这在让人来点虚的,心里一美,进步反而慢了。 如果风气整个往这个方向发展, 整个社区就会止步不前。 我在乎的是这一点, 所以我愿意看见大家都把别人看做老师(鼓励分享), 但我不愿意看见那么多互相称赞的牛人, 这是两个不同的概念。

其实微软的东西, 有时候当成一个正面的例子, 有时候当成一个工具, 有时候当成反面教材, 这就足够了。 我个人至今为止大多数实践都是依赖于微软平台的, 但是我从来没把掌握它们当成什么技术, 就是技术也是别人的技术~
2008-04-22 21:01 | 怪怪      

#5楼    回复  引用  查看    

嘿嘿,delegate我好像一直把他当指针函数(或是函数指针,名词记不清楚)来理解,不知和他的本意是否有太大区别
效率个人理解,应该不只是指原始开发时,当需求变更时的可应变性,以及系统的维护,扩充这些方面也应该是有效率的定义吧?
2008-04-23 14:15 | 九流      

#6楼 [楼主]   回复  引用  查看    

以命令式编程的观点来看, 这么理解即使在本质上也没有啥问题。 关键是咱们怎么用它。 至少最传统的, 函数本身和查表的结合, 可以取代switch和if, 递归和迭代函数自身, 就可以取代循环。

实际上, 设计模式等面向对象的手法, 不也是通过一些技巧, 消除硬编码、 控制粒度、 保持正交性, 来获得重用、 面对变化的特点么? 以至于有人说, 一个人懂不懂面向对象, 看他的代码里有多少if就知道了。

当函数以delegate或任何形式被单独拿出来, 作为类似于对象或变量的东西处理, 我们就可以在设计和实现上获得非常大的灵活性, 去突破命令式语言如面向对象语言的束缚和限制。 在大多数delegate适用的场合, 要比传统的面向对象设计, 获得更好的, 按你的说法吧, 可变性, 可维护性, 可扩充性, 同时工作量和工作的难度也可以大大降低。

取得这一切的关键就在于你怎么去判断一个场合应该使用delegate作为解法的核心元素, 如何应用它,用什么视角去切入。 至于它底层上本质是什么, 倒成了无所谓的了。 就好比C本身也能面向对象编程, 但是代价就要大的多; 我们使用真正的面向对象语言的时候, 也不会去关注这些糖豆的底层本质; 关键是它会给我们带来什么样好处。

在这些delegate可以发挥特长的地方, 面向对象的一些观点, 还有像设计模式那些手法, 因为没有存在的必要, 都不再是什么技术; 相比之下, 只能代表没有delegate的时候,肯定会存在的负担和繁文缛节而已。
2008-04-23 15:16 | 怪怪      

#7楼    回复  引用  查看    

怪怪兄台:
我看了您很多地方的评论,由于功力尚浅,不能明了,希望您能抽空写写的demo让小弟学习一下,谢谢!特别希望您能有delegate方面的DEMO,谢谢!
2008-04-24 22:27 | songcan      

#8楼    回复  引用  查看    

个人以为, delegate更多情况下, 像是一个方法级的接口, 所以才有可能衍生出种种的灵活应用.
- -#
2008-04-24 23:18 | rex xiang      

#9楼    回复  引用  查看    

我觉得别人说你是牛人没关系,但不要自己说自己是牛人。如果自己不是牛人,还把自己当牛人那就更可怕了
2008-04-25 23:52 | 生鱼片      

#10楼 [楼主]   回复  引用  查看    

@rex xiang
这么理解也可以,但不存在接口带来的负担 :)


@生鱼片
没错, 问题是风气。 客气是好事, 客气的大家就昏了头就不好了。


@songcan
我在今年内应该有个比较清晰的认识了, 到时候会有相关的文章来促进这方面的讨论。
2008-04-27 09:38 | 怪怪      

#11楼    回复  引用  查看    

对,你说的现象我也注意到了。自己保持好的心态就行了,最重要的是不要别人吹捧几句,就得意洋洋找不见方向了。保持低调、谦虚、谨慎的态度就好。其实你说的那些,自己心里清楚也就足以了。

老赵的推荐是夸张了些,让人觉得此人已经登峰造极无可比拟,实际上由于我们自身的经验、从业时间、所处环境所限,我们和国外一些技术大牛相比还差得太远太远。每个人的性格不一样,有些人可能会比较张扬,或者说是比较直白。如果是我的同事,我要么让他毛遂自荐,要么就简单的几句话,无外乎“他的前台水平不错,大家有空可以去逛逛”之类。

还有就是《神雕侠侣》最后一段, 杨过他们上山以后碰见一群家伙正在“华山论剑”,这个是说什么啊?我早都忘了,看《神雕侠侣》的时候还在上初中。
2008-04-27 22:26 | 张子阳.      

#12楼    回复  引用  查看    

好像还有很多未竟之言, 我还等着下文呢.
.NET 2.0中语言的变革设计的影响, Linq对Deletgate的应用, 我一直有类似的想法, 但是也一直想不清楚, 愿闻其祥;
2008-05-09 13:41 | kuber      

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-04-22 02:08 编辑过


相关链接: