怪怪 | Nothing, Everything

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

零碎: 学习, 技术明星, 面向对象

没发帖, 不代表完全没有想说的. 鉴于时间紧, 任务急, 有预感高产期又要来了, 暂时不像过去那样长篇大论了, 就几个点说说.

首先要说的, 大家少上点网吧. 这些天上网条件受限, 一下子效率高了很多. 这事我想不用多说了, 大家心里都很清楚自己的状况. 这里头就涉及到获取资讯和学习两方面的问题. 我在这里要说的是, 借口, 全都TM的是借口. 比如那些IT新闻, 看似很重要, 尤其是对一些象我一样目前主要做Web的同志, 其实真的不可或缺吗? 明天Google/MS就推出了你潜心研究了大半年的产品, 而你还在alpha, 都不好意思放出来预览, 那你就不做了? 又如果你发现了什么别人的想法, 可以融合到自己的产品中去, 你就马上又重新设计? 这恐怕和过去接项目的时候, 需求不停的变快差不多了.

学习的方面. 学习总是不能停止的. 不过我的一个体会是, 必须知道目前的知识是不是已经足够覆盖全部技术需求. 我们不可能Linq出来改一次代码, SilverLight出来又换一个实现. 举个例子, 最早我根本不会用反射, 有一天在网上看见了相关文章, 觉得这玩意好使. 当时我们的系统里有很多需要共享的对象和数据, 直接加锁, 这和我的设计理念不合(因为这个对象也许换个场景就无需加锁, 比如可以在一个更外部的拥有者身上枷锁). 我想大家都知道Hashtable处理lock的方式, 这是一个经典教程, 而Java和.NET都是这么实现的: 继承下来搞个同步代理, 象Anders说的和他想致力消除的一样, 这些实践过程里充满了繁文缛节.

于是呢我就学了一天反射, 第二天实现了动态生成代理, 配合Attribute或者描述配置, 用Sync<T>.Synchronized(T obj)这样的方式. 2天时间没了. 那么这个动态代理一共用在几个类上呢? 2个. 因为只有两个类还没有手工写过做同步用的代理. 而十几个类的同步代理, 手写也只需要一两个小时. 既然有了统一的方式, 就怎么看着原来的手写代码不爽, 最后把所有类手写的同步代理去掉, 全都改成使用那个动态生成. 测试, 整理代码, 又好几个小时出去了.两天的时间看着不多, 不过这边两天那边两天, 时间怎么没的? 学习要找对时候, 如果避免不了诱惑, 不如不学.

不过, 我说过, 我是个刚刚入门的水准, 什么叫入门? 说白了就是, 具体技术, 比如反射这类, 看我的状态, 学习起来只花一些实践和记背的功夫, 除了我身体素质和精神状况所带来的限制, 不会有任何困难. 你可以拿我这个标准, 去衡量一下你自己, 不过别自己骗自己, 就我的经验, 很多程序员在学习能力上锻炼还不够, 远没有自己想象中强; 尤其是搞不清一个东西的学习成本. 知识经常是连带性的, 看着简单, 靠就这么个玩意, 结果浪费了很多时间也不能把一个知识点掌握到足够实践. 我较早时学习设计模式就是这样, 因为那时候没有入门, 却觉得不过是些方法嘛, 好掌握, 结果吃了很大亏, 走了很多弯路.

如果你达不到这个入门的标准, 在学习上可能会浪费很多时间, 是不是不学了呢? 这个我觉得倒是相反, 我说过, 一个程序员要是不如我, 那真该努力了, 没入门的程序员一文不值. 哪怕把工作耽误了, 也得给自己留出时间去学习, 只有在学习的过程中才能掌握学习的诀窍, 最后形成一个加速度. 耽误工作, 对老板不负责, 不过等你入门了, 甚至走上专家之路, 你能回报给老板的(虽然可能是另一个老板了)要比一个没入门的人多的多, 最终你这些能力会用到社会生产力上(虽然可能仅是一个小角落, 还不是直接的), 那么牺牲一个老板的一个项目, 是值得的.

当然, 我自己不推崇这样办事, 想学习可以脱产可以要求培训钱是小事白耽误的事情就不好说了, 毕竟做人还是负责点好. 很显然我当头儿的话, 也容忍不了这个; 但是我更容忍不了手下的程序员不学习. 对我来说, 要么是给他安排些较轻的任务, 留些时间学习; 要么, 等任务完了, 就请他走人好了. 反正社会不缺混日子的, 这样的程序员, 我也不指望就因为他了解项目多些, 就能比别人更适合维护已有项目. 很多管理人员在技术上肯定没法跟我比, 所以我也想请他们注意一下: 无论长期还是短期, 只有超短期的需求, 才应该让你考虑保留一个不学习的程序员; 另外, 别光顾了耍大刀, 不知道留出磨刀的力气和时间. 否则组织一定会为此付出代价; 对于组织上层来说, 这种代价还往往不是显而易见的. 毕竟第一生产力带来的格鲁夫所说的那种十倍速变化, 其威力相当可观. 昨天还运行良好的技术队伍, 很可能今天就不适应竞争了.

关于这一段, 最后要说的是, 对于挣两年前就关门的组织, 和已经想好自己人生就是瞎混加上其它对你更有意义的事的程序员, 不在此列. 我不排斥谁, 现实和快乐所造就的人的选择, 都值得尊重. 仅仅是提醒一下要在IT这条路上走得更远的个人和组织罢了.





没想到又这么长. 下一段又是扯大嘴八卦的, 又是Martin Fowler. 前两天闲着没事, 又翻了翻我经常打击它一下, 又经常引用里面的话的POEAA. 最后一章有一段讲"隐式接口", 具体的记不清楚了, 大概是说什么的也忘了, 不过, 老马丁把Xxxx["yyyy"]这种用法(更广泛的就是有一个通用的方法, 怎么用完全看用户的逻辑)叫做隐式接口. 手头也没有合适的书, 随便翻了一些, 比如Effective C++等等, 发现真是扯淡. 比如Meyers说的隐式接口, 指的是该接口不由显式的签名构成, 而是由有效表达式构成, 并且也在编译器完成完成检查. 其他书或者作者表述也和Meyers相差不大.

如果你忽略"在编译器完成完成检查", 那么很难说清楚Xxxx["yyyy"]是不是一个有效表达式. 这说明Fowler还是从隐式接口抓住了一些东西, 但很显然他搞错了. 可能又要有人说我咬文嚼字了, 不过在我看来, 这是很严重的概念上的错误, 将隐含着某种业务上的接口, 和隐含接口这个纯粹的程序概念, 彻底混淆. 对于我这样的入门程序员, 说错很正常, 作为一个大师, 尤其是建模/面向对象/模式方面的大师, 这个实在说不过去. 虽然我这次翻的是中文版, 但是印象里英文版也用了implicit interface这样的字眼. 没错, 我跟Martin比是一个小菜鸟, 但正是因为如此, 我不得不抱怨一下: 这个问题是我能搞清楚的, 也不太影响做设计, 写代码; 但是在那些更复杂的地带, 到底还有多少陷阱?

我的"老菜鸟"的说法是: 一方面, 他总结了很多我们需要的知识和经验. 一方面, 他就是一个老菜鸟. 说白了, 想想大嘴们成长的道路和当一个合格大嘴要花费的工作量, 就知道, 其实Fowler这样的大忙人, 能用来求甚解的时间并不多. 他怎么可能不菜呢? 不过这并不是说, 我们, 比如我, 就有理由去不尊重他, 或者全盘的否定他的水平. 比如, 哪怕他见过经历过的项目跟其它一些大牛的人比少些小些, 即使不算那些他间接接触的, 也比我要多得多也大得多; 钻研东西即使不像某一专家那么深入, 他所处的环境也让他了解的比我细致的多; 他有再严重的疏忽, 很显然在相关领域的深度和广度也比我强得多. 这个就是"老"字的含义, 绝对是客观的, 那话怎么说来着, 我吃的米还没有他老人家吃的盐多. 并且我个人也引用过Fowler的很多东西, 也在他传道授业的过程中, 拜读了他的著作, 大大的受到他的指引, 我怎么能不尊敬他, 而且甚至感激他呢? 不过, 一个两个问题, 就可以让我们提高一下警惕, 在我们学习知识的时候(其实又是跟学习相关的话题), 不要因为作者是谁, 或者其它这些因素影响我们的判断. 尤其是一些我们还没深入的问题, 不要让先看见的一些东西, 变成了一种成见, 而这成见却往往根本不是来自于我们自己的.

什么时候都要保持怀疑的精神, 正好前两天读一本从博弈论角度看应该如何做人的书, 也强调了这一点.





最后一段想说说面向对象的相关话题.

设计模式本身其实不像有些人说是种思想, 只是它介绍的那些手法体现了一些思想. 对于SICP这样的基础入门书籍(是本大学教材), 这些思想是一上来就强调的. 不过大多数命令式和面向对象语言使用者, 看起来不习惯罢了. 老外有篇文章, 大谈特谈如果用FP编程, 设计模式根本不存在, 因为你的编程方式直接就解决了设计模式所体现的那些思想要解决的问题, 具体手段当然就更不必要了. 他说的完全正确, 可我自己也尝试将编程风格更多的FP化, 最后发现总体来说就我的FP水平, 这么搞纯粹是捣乱; 对我来说, FP将片断拆的更碎, 而且不容易管理. 我个人的看法是: 毕竟FP因为性能等原因错过了编程语言发展的最好时代, 缺少了广大开发者的支持, 所以不会有大量的糖豆式的使用方法上的优化, 在结构化和其它一些方面, 甚至IDE这些, 提供的便利实在太少了. 而对于命令式编程来说, 虽然对象在Anders嘴里不过是个糖豆(而委托在Anders嘴里则是FP的全部, 反正对他来说都没什么了不起啦, 可能象他这样真正的大师眼里一切都是浮云); 但是这样的糖豆越来越多, 再加上很多设计思想和设计模式等具体指导, 也就逐渐的把命令式在设计和实现时的弱点消除很多(在这里讨论的不涉及没有状态等根本性问题和命令式编程的并发等原生问题).

命令式编程, 尤其是面向对象编程以及对接口的重视, 有一点就是增加了很多的繁文缛节, 比如你一个类, 为了和框架配合, 要实现一个IDictionary接口, 我靠, 那一堆没有实现也根本没必要实现的方法啊..., 就是有IDE支持都嫌烦, 如果需要再多实现俩接口, 什么TM的优雅, 根本是P话.说白了就是为了实现类型和约束呗, 越搞越复杂. 幸亏新的糖豆不断出现, 毕竟, 繁文缛节也可以被隐藏起来. 要说的是, 类型系统的复杂程度, FP编程也是照样要面对的. 静态面向对象语言的发展过程, 简直就是解决问题同时制造新问题然后再解决的过程, 但我相信发展下去最终能达到一个比较稳定的状态.

嗯, 上面这些纯属废话, 我的体会是, 既然程序语言是让咱们表达的这么一个工具, 过去那些我顶礼膜拜的各种原则, 最好再掂量掂量. 想要掂量它们, 你就得有更高级一点的原则. 这些个原则(对我来说)归根结底是什么呢?

首先, 你写每一部分功能或过程的时候, 应该根本不(用)想别处(有的时候想也没用), 这样一切就简单的多. 这即是一个最早想要达到的目的, 也是最终会接近的几个目标之一. 在这个过程中, 把其它任务的实现, 当做早就实现好的, 就好比你对.NET Framework或者其它基础框架的使用一样. 比如一个简单又有效的手段是, 在实现A时, 有一个任务B, 凡是涉及任务B的, 那么就建立一个任务B的空壳, 假装B已经实现好了, 并且直接调用B上面的操作. 在这里需要锻炼的是一个快速反应的直觉和判断是否真的有一个任务B的能力. 最后达到的效果是, 建立的那些空壳在A完成后, 不用过多调整. 我的经验是, 那些随手建立的空壳, 或多或少需要调整; 只是再实现A时, 尽量不要关注它们, 尽量让A本身合理即可. 当然, 仅是遵循这个做法, 而没有相应的技巧, 也不可能完美.

其次就是需要具备的能力: 能把共同的过程或那些能规范化的东西不断的提取出来. 面向对象总说封装变化, 其实要我说更关键的是先要封装不变化的: 在尽量固定住不变化的东西的过程中, 自然而然就会将那些不稳定因素, 设定一个约束或者契约, 然后排除出去(即封装变化是由固定不变化所自然导致的). 这时候继承多和多态就有用武之地了,Strategy啦TemplateMethod啦AbstractFactory啦就都出来了.这与封装变化的说法看起来似乎是一码事, 但是角度就完全不一样(如何看待最终没有本质差别, 但可能改变我们掌握它的难易度), 从找寻变化的规律容易, 还是从不变中确定入口容易? 有了这个能力, 可复用之类的口号就可以逐渐变成现实, 也能很敏感的意识到哪些东西应该放到另一个任务里去, 在第一步中所说的做法就可以更好的得到贯彻和实施.

最后是粒度大小要合适, 以解决一个或一类基本问题为基准是一个我觉得比较适当的做法; 当技巧更加熟练的时候, 我们有时可能会选择归并一些东西, 而分解另外一些. 有了这些基本的颗粒, 剩下的就是组装. 对于一个不像.NET Framework那么基本的东西, 颗粒的大小往往不必那么严格, 有时可以感觉怎么顺手, 就怎么来; 另外就是可能根据具体情况, 比如以简化为目的或者为了更好的组装等, 来调整颗粒的大小.如果实在不合适而不能对接, 那接口的设计和那些Adpter啦Bridge啦之类的具体方式方法怎么运用, 也就是自然而然的事了.

其实我说的这3步, 每一步都是以上一步的意识为前提, 下一步是都是为了解决上一步可能会碰到的问题才发展出来. 在实践中只要贯彻, 学习面向对象也好, FP也好(可能FP还要少一些不必要不本质的东西), 都要容易得多. 无论什么方法什么原则, 我个人感觉其目的主要是: 降低我们直接面对的复杂度, 将有迹可循的玩意都放进抽屉, 只剩下从需求而来的工作(因为这些怎么都要做).

其实这里头唯一一个学问就是, 如何找准看进去的那个点, 这个学问就是读万卷书不如行万里路了; 唯一一个技巧就是, 如何象挤牙膏那样, 把不相关的东西给挤出去. 建立模型要围绕需求, 实现则要把需求当垃圾, 从这边到那边的扫来扫去, 最终把它们赶到合适的位置上. 工作量大, 实现的乱糟糟, 往往就是对上面的三板斧把握的还不到位, 这就相当于自己作为自己的用户, 给产生很多隐性的需求的效果, 系统里剩下的垃圾堆应该是那些最接近来自外部的需求.

比如不知道大家怎么看待Page基类和咱们写代码的aspx.cs: 其实它可以被看作一个中介者, 这点[DP]上说的很明白了. 如果从实现一个页面展示的完整过程这一角度看过去, aspx.cs可以说是最脏的地方, 它和页面上每一个控件都有链接, 而不同的控件们仅仅是它连接的一小部分对象, 甚至最终还可能包括了咱们具体的业务需求, 就像GoF说的, 中介最后很可能变成了一个复杂无比的庞然大物. 按我的说法, 如果把WebForm框架也做为实现的整体看过去, 咱们写东西的这个地方就是个垃圾堆: 因为WebForm解决的是咱们这些用户的需求.

反过来咱们设计系统时也可以这样, 面条代码, 超大超复杂类型, 不是不能有, 而是随着可以固定的东西一个一个被固定住, 从各个不同地方挤出很多多余的东西, 然后找一个或几个合适的方式给他们安家. 不过不要把这种方式和较极端的XP等同, 预先设计之类都是很有必要的: 猪肚子下不出狗崽来; 折中和调整, 是适合从普通人到.NET框架作者的万金油. 就我的经验来说, 这样的实践和学习的方式, 要比一上来就想如何去符合面向对象的各类原则, 自然和舒服的多; 当然这种方式也有缺点, 既然指导手册趋于简单化, 那么在积攒了足够的经验之前, 你没法一上来就象一个架构师或设计师那样工作, 可是, 程序员还没当好, 就真那么容易变身成一个设计师吗?

好像又说多了, 开头还说不长篇大论呢, 就此打住. 最后说一句, "吾爱吾师, 但吾更爱真理", 只有我们踏踏实实的去学去问去钻研去挑战去生活, 才是我们对大师哪怕大嘴, 还有在现实中支持我们的那些人, 最好的致敬.

posted on 2007-11-17 22:13 怪怪 阅读(3874) 评论(45)  编辑 收藏 网摘

评论

#1楼   回复  引用    

scip不过是一本大学入门教材?
虽然它的确是一本入门教材,不过不仅仅是一本教材,它后面谈的东西,可不是简单教你怎么写程序这么入门的东西
至于lz对FP编程的一些看法,我只是觉得你对FP不够了解,或者总是站在c#这一类语言的观点来看
2007-11-17 22:41 | ctol[未注册用户]

#2楼   回复  引用  查看    

是散文嘛,看的有点晕.有些观点还是表示赞同的.很多经验之谈.
2007-11-17 22:57 | Leem      

#3楼   回复  引用    

借宝地一用.
首先声明,我并不认识下面提到的楼主.
之前在《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(二)url:

http://www.cnblogs.com/cj723/archive/2007/11/16/961524.html
随意发了一下评论,想不到楼主马上删除了.
我认为,在cnblogs这种技术传播自由的地方,你不同意,应该是用辩论的方式.而不是删除.
之前的回复大概如下

1.
《大话设计模式》,99.98%的抄袭,从知识传播角度,我们不禁止抄袭,但作为一本书,就该让读者让看到除抄袭的旧东西之外的作者的新的东西.
2.
由于1的存在,看不到书有什么属于是作者自己的思想,至少从楼主发布的这几篇文章来看,是这样.除了请几个所谓的小姐出来搞场.
3.
如果www.dofactory.com的
http://www.dofactory.com/Patterns/Patterns.aspx 不是楼主的创作,那你非常应该在抄袭(或叫翻译)别人作品时,征求一下原作者的同意.
2007-11-17 22:59 | matt[未注册用户]

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

呵呵, 可能吧. 只要你别以为我说的糖豆少, 就代表我不知道简单规则的优势就行了. 我在上篇文章说过, 对FP, 我现在只是停留在知道它哪儿好, 不知道它哪儿不好的阶段, 这就说明我是连门的没入.

不过SCIP确实只是一本教材, 只是他们的教学大纲认为这些就是程序怎么入门的东西, 其它的因为没那么重要, 所以可以后学. 而大多数受的教育和自学则正好相反, 把一些不重要的东西在入门的时候先学了.
2007-11-17 22:59 | 怪怪      

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

@matt
你在我这发, 我肯定不会删, 除非dudu动手.但我不完全赞同你的说法, 因为他那本书可能适合一些人的阅读习惯, 有助于那些人的学习. 还有人家可能不是删了? 我刚才这里一楼有一个评论, 现在看突然没了...

@Leem
写的比较丑陋, 见笑了 :)
2007-11-17 23:01 | 怪怪      

#6楼   回复  引用    

对了 我是一个在一个台湾老板的小公司里,一个自称做过1000万项目成本的从SAP出来的项目经理,现在有1个6人团队,一个文员 管理文档兼程序员,3个程序员(我就是一个),一个需求人员兼数据库设计,一个将需求翻译成界面的程序员,是这么一个团队。
现在的系统在我看过CNBLOGS的众多帖子之后,我觉得系统很糟糕,但是我会下意识的(我也看过POAA和分析模式,设计模式)去尝试重构系统,但是无力啊
有的页面一个页面4个datagrid然后显示不显示 点了这个按钮,那个datagrid显示,逻辑全写在button里 sqlconnection con = new sql ,典型二层结构,权限还没有加入,日志还没有加入,这怎么重构法。没有自己的领域模型。

尝试着给公司里的人洗脑(用新技术比如说LINQ),结果虽然自己写了文档给大家看存储过程与LINQ之间的区别,那个文档自己也觉得写得不错,但是依然有很多的问题,比方说以前用视图做的就是一个表有状态种类之类的SQL视图里要写left join啊 ,那么到linq里怎么个替代法,之类的问题。

感觉大家都否接受也是个问题,他们认为这个还不如用代码生成器生成一段存储过程,然后替换ADO parma来得快呢,诚然那个是快,绝对面条代码 还混和逻辑,这样的系统怎么个重构啊,真是绝望了。为此还和上头的项目经理超架,我实在是被面向对象洗脑了,这样的写作方式我工作2个月就厌倦了,现在1年多了,我还是无力。有没有什么好方法
2007-11-17 23:10 | gakaki[未注册用户]

#7楼   回复  引用  查看    

@gakaki
努力提高吧。
不过一些基础系统还是需要加进去的。
异常处理,日志,权限。前期最好加入。也可以使用一些开源的项目。
2007-11-17 23:33 | 暗香浮动      

#8楼   回复  引用  查看    

你的文章总是有很多想法啊,我很喜欢。不过目前有共鸣的只有“我更受不了不学习的程序员”和“许多程序员的学习能力还不够”,其他的还需要让我再体会体会。
2007-11-17 23:40 | Jeffrey Zhao      

#9楼   回复  引用    

怪怪是我崇拜的人
2007-11-17 23:43 | 老刀把子2[未注册用户]

#10楼   回复  引用    

@gakaki
要让别人接受一种新的开发方法是非常困难的。
除非你有足够的权力。
2007-11-17 23:46 | 老刀把子2[未注册用户]

#11楼   回复  引用    

需要花大力气了,组员都不敢用开源的 一方面我的解释能力不强,一方面他们也不那么主动比较害怕英文。所以这方面肯定要靠自己了。

一开始没有基础框架 一个公司很难做出一个好的系统,现在也有从网上找了商业控件 像RAD CONTROLS,使用了新的控件,但是有问题,虽然是我强力推荐的,可是还是会有小问题,在我看来比如为啥这个控件 碰到比较长的DIV就会被这个DIV覆盖之类的问题,暂时也没有找到好方法,用了Z-INDEX设置那个控件为999也不行。唉,因为是我推荐的,出了问题当然得怪我。虽然那个可恶的页面不是我做的。不过不解决不行啊。
这些也是用新技术要碰到的,不过这种问题只有真的使用了才会碰到吧。

日志之类的用ENterpriseprise library之类的还是LOG4NET好 不过他们2个好像都是写入windows日志那种不是写入数据库的讲,那岂不是要每个存储过程之后都要来变insert,可不可以在引入orm类之后,弄一个什么基类 然后CRUD之后自动调用写入日志的操作方法,然后任何的实体类继承那个类,这种想法行不。权限之类的更头大了,有ASP.NET 2.0MEMBERSHIP不过好像太简单,enterpriselibrary里也有一个,院子里还有人写了开源的基于RBAC模型的权限系统,前2天海看到一个院子里的开源 权限系统
http://framework.supesoft.com/

如果想要根据一个人的权限 自定义各个页面的控件的现实与否,比方说对gridview某些列的显示之类的,要到这样一个细粒度。那么选择哪种好 或者有更好的。

后面还要做BOM之类的,现在项目经理的方案是写一个基础的表,那个表大概40多个字段。我也不清楚那是干什么的要那么多列,实现目标是发生某个事件,
然后将这个表的数据原封不动COPY到另一个列相同的表中。可我总觉得有点悬着想法,然后可能会有多个这样的表。头大头大
2007-11-17 23:50 | gakaki[未注册用户]

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

@Jeffrey Zhao
主要是我大舌头, 说不清楚, 重新编辑了一下, 不知道能不能好一些.

@gakaki
"我会下意识的(我也看过POAA和分析模式,设计模式)去尝试重构系统".

这个无论对你还是对项目, 着急不得. 我把最后说的3步重新编辑了一下, 你可以参考, 找一些相对不变的东西, 先把它们想办法封装起来, 不要考虑什么面向对象原则, 也不要考虑什么分层, 主要是做到不要让那些可以比较清晰的东西和面条掺和在一起.

至于改变头儿和其它人的力量, 我可以说基本没有. 除非你让他们看见好处, 让他们觉得这样他们工作就少了, 不是完全指写的代码就少了, 而是, 比如说, 脑子更清楚了, 没那么头疼了. 不要尝试一下子让他们懂得多少面向对象, 而是找一个可以简化他们面对的复杂度的机会, 就抓住一个.

面向对象是一座大山, 你们作为一个攀登小队, 只有一个人爬的快是没用的, 只能一起穿越, 这是谁说的我忘了..
2007-11-18 00:01 | 怪怪      

#13楼   回复  引用  查看    

受教
2007-11-18 00:02 | 静旅      

#14楼   回复  引用  查看    

真行你,打这么多字
2007-11-18 00:10 | 蛙蛙池塘      

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

@gakaki
另外, 我感觉你们是不是过多的引入了复杂度? 你们的具体情况我不了解, 我也并非一个老鸟, 我可以建议的的是, 无论RAD Control/Enterprise Library还是LOG4NET, 无论是你决定的还是其他人决定的, 不能太轻易. 购买或使用其它人的组件, 有时候这个"复用"所连带出来的成本, 比想象中要高的多. 这不见得是在简化工作和合作, 有时候从多个角度衡量, 反而是在引入复杂度; 尤其是两个以上的第三方组件需要配合在一起的复杂度, 从学习使用和掌握的角度来讲, 往往是不是相加而是相乘的总体复杂度.

比如RAD/ComponentArts, 我过去也看他们漂亮的控件流口水, 但现在是完全不感冒了, 为什么, 我觉得使用它们在很多方面超出了我在解决主要矛盾之外剩下的那些精力所能掌握的复杂度界限. 我觉得很多人包括我自己耻于承认这点, 就是连个控件或某个中间件都使不好. 但我现在觉得, 不是咱们的问题, 而是这些组件不断的扩展它们的能力, 导致冰山上面这一角都过于庞大了.

引入组件在队伍里还会产生另一个问题, 当你们想要放弃组件自己实现的时候, 会因为自己的实现没有它们好, 而产生挫败感, 这样就进入了一个两难: 放弃, 觉得自己或其它组员做的东西太差; 使用, 又要承担组件所增加的各种成本和掌握它们的痛苦.

首先要明确的是, 问题是什么, 才能判断如何解决它, 比如使用组件与否.

你说的几个问题太具体, 我也没法帮你判断, 不过Log的问题, 一般确实是用AOP之类解决更方便一些, 可如果是使用已有框架中的AOP, 你们说不准又要承担新的问题. 我的想法是不要太激进, 还是先建立一个服务层, 在这里操作Log等问题, 用你最熟悉的方法写两句代码不见得比解决由引入组件带来的新问题痛苦. 除非你有足够的时间考察这些组件, 然后和你们的具体需求相比对.

关于控件与权限, 具体到列, 这个控制太细致, 感觉你现在很着急, 这种情况下我个人是绝对不推荐使用任何已有控件的和组件的. 哪怕用你所能想到的最差劲的方法去实现, 也比深入一个控件, 和解决如何使用好这些东西容易.

关键还是时间, 如果有时间, 首先确定几个候选方案, 在这个过程中, 一个是能理清你对当前情况的思路, 其次是也许能碰到不错的资源可供利用. 但如果没有时间, 随便选择一个不熟悉的东西太冒险, 还不如硬干...

至于硬干, 或者部分选择了某一方案(其原则是不要带入过多的未知因素), 那么我的看法是, 重新整理需求, 把需求中能变成特例的尽量变成特例, 实现若干个特例, 是个可估算的工作量, 实现的过程中最小化开销, 即在不影响最终运行的最低效果的目的下, 尽量赶工和对付. 这样的做法是为了赢得时间, 有了时间, 就可以总结和整理一些问题. 如果已经积重难返, 这也是不得已的.

只是一些个人建议, 也看看其他人能不能回答你的问题.
2007-11-18 00:34 | 怪怪      

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

@蛙蛙池塘
本来只想写30行的..
2007-11-18 00:37 | 怪怪      

#17楼   回复  引用    

其实一开始也是因为要做一个样子比较好的系统,客户说这个太烂样子难看需求人员也这么觉得,所以作为组里唯一知道有那么多好的控件的,因为那个控件支持的SKIN真的不少,但是我又觉得组里的人包括我的CSS控制能力都没有那么好,所以毛遂自荐了。

结果最后由于那个RAD GRID的使用不那么容易,虽然sample极多,我一个人用了顺德,其他人对于那些rad grid用的不是那么顺比如单选checkbox之类的问题,本来用gridview会的用这个的不会了,周五做review的时候项目经理又对这个控件的外观不一样了,他觉得不好看,其实事实整体风格不适合自己的站,因为我们没有美工。唉,用回gridview吧,看来就算我能做出一个像样的sample给大家也没有用,光我一个不够,谢谢以上指出

@gakaki
另外, 我感觉你们是不是过多的引入了复杂度? 你们的具体情况我不了解, 我也并非一个老鸟, 我可以建议的的是, 无论RAD Control/Enterprise Library还是LOG4NET, 无论是你决定的还是其他人决定的, 不能太轻易. 购买或使用其它人的组件, 有时候这个"复用"所连带出来的成本, 比想象中要高的多. 这不见得是在简化工作和合作, 有时候从多个角度衡量, 反而是在引入复杂度.


我是自我觉得这样破烂的系统根本不能拿出去卖钱现在的情况很糟糕,公司运营一年有余,也做了不少的系统,但是没有一个成的,现在有 思德克(做餐饮系统 居然开始用B/S做还要触摸屏,应该C/S啊,现在项目经理后悔了)和D LINK做(管理系统) 洽谈中,所以要交项目给对方看,上层的人很急但是没有办法,我虽然知道办法可是也解决不了问题。大家整天就是CRUD,代码写的很乱,可以说以后接这个人写的程序 要看懂逻辑都会很难,基本等于重写。
所以即使会和别人发生矛盾,我依然贯彻这种面向对象的思想,当然写程序就会慢(大概2倍于其他程序员),我也在尝试。
2007-11-18 00:48 | gakaki[未注册用户]

#18楼   回复  引用    

引入组件在队伍里还会产生另一个问题, 当你们想要放弃组件自己实现的时候, 会因为自己的实现没有它们好, 而产生挫败感, 这样就进入了一个两难: 放弃, 觉得自己或其它组员做的东西太差; 使用, 又要承担组件所增加的各种成本和掌握它们的痛苦.

结果是 我被完全的鄙视了 直接导致后面 讲LINQ没人听了
当初想如果要更多的功能,类似于固定gridview表头之类的问题,自己写的话,可能更恐怖(想想每个页面来那么一遍),所以才会想到复用的控件

尽量赶工和对付. 这样的做法是为了赢得时间, 有了时间, 就可以总结和整理一些问题. 如果已经积重难返, 这也是不得已的.

至于硬干, 现在看来只能硬干,每天就这么点时间,还有暴多的CRUD页面等着我 ,我已经忍耐半年这样了,系统依然如此,二层结构,看不到希望。您说的意思我理解了,就是别管那么多,先烂代码,之后查阅的时候重构,变得放那么,不变放这边。问题是连这点 重构代码时间也不见得给。。(所以开始就用面向对象的方法做,现在想想没有先烂后重构的快,不过这很容易变成习惯)我自己重构自己的成,别人的我就重构不了了

谢谢楼主的指点,我继续垂死挣扎,先一次少吃点,慢慢来
2007-11-18 01:01 | gakaki[未注册用户]

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

... 没有美工, K68.CN上几百块钱求一个整体设计都行啊..

如果说CRUD很多的话, 确实应该想些办法把这部分工作给重新统一起来, 放到一个框架里. 不过我觉得首先是整体框架, 其次才是ORM. 可以忍一段时间, 争取在明年改用新的ASP.NET MVC, 不是说一定比WebForm好用, 但是如果再加上一定的实现的规范, 好歹会变得整齐起来.

看你们的项目来钱不, 我觉得你们比较好的一个出路是, 如果有足够的利润, 把活外包掉一两个, 当然又剥削掉一层, 效果不太可能比你们自己做要更好. 但是你们可以留出一部分时间培训和学习. 小型项目组, XP还是不错的方法. 我觉得<<代码大全>>你们可以看看, 这样大家对软件开发都能有个整体了解, 还能统一一下观念.
2007-11-18 01:08 | 怪怪      

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

--引用--------------------------------------------------
gakaki: 至于硬干, 现在看来只能硬干,每天就这么点时间,还有暴多的CRUD页面等着我 ,我已经忍耐半年这样了,系统依然如此,二层结构,看不到希望。您说的意思我理解了,就是别管那么多,先烂代码,之后查阅的时候重构,变得放那么,不变放这边。问题是连这点 重构代码时间也不见得给。。(所以开始就用面向对象的方法做,现在想想没有先烂后重构的快,不过这很容易变成习惯)我自己重构自己的成,别人的我就重构不了了

谢谢楼主的指点,我继续垂死挣扎,先一次少吃点,慢慢来
--------------------------------------------------------

园子里IBatis.NET的文章你可以看一看, CRUD的话, 可以在较低的学习成本上为这些重复工作节约些时间. 另外SubSonic是另外一个不错的东西, 用来赶工不错. 就是它生成的界面烂了点, 不知道现在能不能自定义了.

关于固定表头一类的, 你可以自己做控件, 但以你现在的情况, 千万别陷进学习控件开发的黑洞里去, 能实现就得, 怎么凑合怎么来.
2007-11-18 01:14 | 怪怪      

#21楼   回复  引用  查看    

很多控件光好看,不实用,有些控件功能强大,你只能光看着,用不上.如怪怪所说,怎么凑活怎么用.
2007-11-18 01:22 | Clingingboy      

#22楼   回复  引用    

Martin Fowler的POEAA一书谈到"隐式接口"了么?也许我手头的这本书比较旧了(2002年10月第一次印刷),最后一章,第十八章,是Base Patterns,怎么就没看到类似的讨论呢。在网上找了一下,他倒是有一篇博客讨论implicit interface的,

http://martinfowler.com/bliki/ImplicitInterfaceImplementation.html

但内容好像跟你说的不一样啊,愿闻其详
2007-11-18 07:25 | saucer[未注册用户]

#23楼   回复  引用  查看    

好文,有很多观点和我在周会上强调的一致
2007-11-18 09:53 | lovecherry      

#24楼   回复  引用  查看    

太长了,时间不够了。
2007-11-18 10:16 | 金色海洋(jyk)      

#25楼   回复  引用  查看    

这里还挺热闹,唉,这大周末俺睡了两天,还是上来看看大家的讨论吧。
2007-11-18 12:03 | 蛙蛙池塘      

#26楼   回复  引用    

看了部份,感触啊~~~~

#27楼   回复  引用  查看    

怪怪,关于OO那些没看,就看了你关于学习那段,怎么说,有道理,前部分也实在,但感觉也有些激进,比如混日子的人那个问题,我也挺不喜欢那样的,但是,混日子的人稳定,塌实。。。没心气。。。你要让他挑大梁那是肯定不行的,但你要让他维护来系统,那倒还真不错,中国有句古话,水至清则无鱼嘛。
2007-11-18 13:44 | cnlamar      

#28楼   回复  引用  查看    

对了,那天收到你MSN的留言,你上网那会我没在,我也不知道你哪个时间会上,实在抱歉,呵呵。
2007-11-18 13:46 | cnlamar      

#29楼   回复  引用  查看    

UI-user interface很多场合是指用户界面,这个interface跟语言层面的interface也不是同一个概念,所以何必只抓住文字看问题呢,自然语言本身就是具备丰富的上下文环境的
Martin讲的隐式接口,更偏重于应用层面面向对象的概念,而不仅仅是语言语法实现模型上,换成契约(contract)或其它描述更好?interface还是更准确些
2007-11-18 15:05 | RicCC      

#30楼   回复  引用  查看    

呵呵,师傅,我没有高明的评论在此声名
只是支持一下 ^_^
2007-11-18 17:52 | 钢钢      

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

@saucer
@RicCC
我翻阅的版本应该比思归的晚的一个中文版, 就在基本模式的最后几页, 后面好像全书就完了. 而且Fowler还大量的谈到隐式接口在程序使用上的不便, 所以绝非指其它东西. 印象里这些也不是后加的, 而是本来就有.

思归的链接我看了, 看来Martin是明白这词确切的含义的(其实就是他真搞错了, 也不影响他的思想和经验水平), 至少发网上这篇文章时已经弄清楚了 :).

两位水平我是相当佩服的, 不过我觉得是不是有太多人过于保护这些明星了? 其实这样的写法也可能纯粹出于一时失误, 并非是不可原谅的, 我的初衷并非去揪这个不放, 而是提醒那些没两位水平的广大读者, 看书要仔细, 不要因为明星效应, 而放弃本来具有的怀疑精神.
2007-11-18 18:11 | 怪怪      

#32楼   回复  引用    

其实还有本书很重要啊 分析模式啊
如果说POAA是讲技术实现的书
那分析模式就是讲怎么构建一个比较好的有面向对象的领域模型,
虽然书里就讲了几个
2007-11-18 18:29 | gakaki[未注册用户]

#33楼   回复  引用  查看    

花了一个小时从头到尾看了一遍,啥也没记住,过后再好好看看,说的好多观点以前都没想过,好像一写起代码就靠着直觉去写了,没想那么多,这儿抄点儿那儿抄点儿就成了,唉,没有上升到楼主的高度呀。
2007-11-18 20:22 | 蛙蛙池塘      

#34楼   回复  引用  查看    

哦,对了,忘了问了,你那个动态代理的同步库能法出来让我学习学习吗?
2007-11-18 20:23 | 蛙蛙池塘      

#35楼   回复  引用    

哦,原来是在《记录集》模式里

其实你仔细读一下内容的话,他在POEAA书里说的implicit interface和explicit interface是指象这样的东西

1.class SomeClass
object this[string propName]{...}

2.class SomeClass
string MyName;

在后面这个情形,MyName是明确声明的(explicit interface),而在前面的情形,则是通过 对象["MyName"] 这样隐含的方式获取数据

interface在这里是泛指,或者说是契约(外面可看到的方法,属性)
2007-11-18 23:45 | saucer[未注册用户]

#36楼   回复  引用    

确实可以象你这么理解,不过我小题大作的原因,这里面有两点:

1. 我觉得这对公众人物来说,太宽容了。因为他们的影响力比一般人大的多,稍微说错一点(或者换种说法,说的稍微模糊一点),水平比较高的,比如你,都不会成太大问题,但是对一般人就会给他一个暗示,哦implict interface是什么什么意思。如果技术明星就那么一两个,那还没什么,因为说法不多;问题是和大多数其他技术明星的说法不同,别的技术明星的书我们也要看,这样就潜在的含有理解上隐藏的误区。其实像这种解释,稍微改变一下表达方式,就可以表示出区分。

2. 对于技术明星(不包括Anders这样实干派的),尤其是靠宣传工作建立起名声,甚至发财致富的,我宁愿抱着一种更大的怀疑态度。Fowler其实懂得已经够多了,但是我常常想,就算他比我聪明,他比GoF比所有其它更靠近技术专家的那些人也聪明吗?我想这个概率比较低。其次,他花在技术以外的心力和时间,是不是比别人多?答案却是否定的,因为每个人都只有24个小时。

如果我说Fowler这种人,内在的其实还是半瓶子不满一瓶子咣当,恐怕不少人拍我。(智商在他那个层次的人里不是多的,而下功夫的时间却是相对少的,还有其它结果吗?) 但是这不是说他水少,因为这里头还有个因素,即他的瓶子比我大得多,这样半瓶子也是一般人的好几倍。

我的意思就是,一般的读者,阅读他们的作品时,不妨谨慎一些,毕竟有不那么严谨的时候。

@蛙蛙池塘
没问题,我正打算整理几个小例子打一个包,弄好了就放出来。

#37楼   回复  引用    

另外他06年网上那篇文章的不同用法,就体现我说的这种问题:同一个词,不同意思,这种事还是尽量避免的好。 如果让读者时刻保持着一个技术词汇可能存在不同理解的警惕性,这比作者自己注意一下要难得多,更何况没法要求读者在读这些书前,就积攒了更多的阅读量,以支撑各种不同的理解。比如我就引用过他那种说法;后来不知道什么时候突然感觉不对劲,拿其它的书翻了翻才注意到。

#38楼   回复  引用  查看    

"吾爱吾师, 但吾更爱真理", 惟有自己实践才能接近和发现真理
2007-11-19 10:05 | Enzo      

#39楼   回复  引用  查看    

欣赏楼主的学习精神
2007-11-19 10:06 | Enzo      

#40楼   回复  引用  查看    

经验之谈,值得一看
比某些只讲理论,经不住实战考验之流的要好的多
2007-11-19 11:18 | txdlf      

#41楼   回复  引用  查看    

除了垃圾广告其它的评论偶是不会删除的
2007-11-19 17:00 | Clark Zheng      

#42楼   回复  引用  查看    

对于新技术的学习,我也有相同的感受:广泛学习,谨慎使用。广泛学习,这样才能知道尽可能多的可能性,才有可能找到最有效的解决方案。谨慎使用,就像怪怪说的,有时发现了很酷的技术,脑袋一热就要进行大改,结果发现耗费了大量的时间却没得到多少好处,或者突然发现新技术有我们没注意到的缺陷,然后十分后悔。
另,要是很长时间听不到怪怪的声音,总觉得少了点什么似的^_^
2007-11-20 09:35 | 1-2-3      

#43楼   回复  引用    

顶一下下~~
2007-12-12 17:30 | awen177[未注册用户]

#44楼   回复  引用  查看    

今天第二次点进楼主的博客了,很喜欢楼主的文章风格,感觉很散,但是很吸引人去读。
作为初学者更多是对于在软件开发学习中对于深度、广度的疑惑,不知道楼主有没有打算写些抛砖引玉的东西给和我一样的初学者。
2007-12-23 22:39 | David Wang      

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

这些我也在摸索, 真正形成一定的条条框框了, 就如你说, 抛砖引玉绝对愿意.
2007-12-24 04:17 | 怪怪      



发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 962869




相关文章:

相关链接: