JYun

DotNet学习
随笔 - 7, 文章 - 17, 评论 - 3, 引用 - 0
数据加载中……

2008年1月9日

转 一个典型的代码走查检查单

代码走查的最主要的目的是为了发现程序中的逻辑错误,编程风格方面的错误可以通过风格检查的工具去检查。如下的检查单给代码走查的专家发现逻辑错误提供了一个很好的帮助。

  序号检查项

  1代码的注释与代码是否一致?注释是否是多余的?

  2是否存在超过3层嵌套的循环与/或判断?

  3变量的命名是否代表了其作用?

  4所有的循环边界是否正确?

  5所有的判断条件边界是否正确?

  6输入参数的异常是否处理了?

  7程序中所有的异常是否处理了?

  8是否存在重复的代码?

  9是否存在超过20行的方法?

  10是否存在超过7个方法的类?

  11方法的参数是否超过3个?

  12是否有多种原因导致修改某个类?

  13当发生某个功能变化时,是否需要修改多个类?

  14代码中的常量是否合适?

  15一个方法是否访问了其他类的多个属性?

  16某几项数据是否总是同时出现,而又不是一个类的属性?

  17switch语句是否可以用类来替代?

  18是否有一类的职责很少?

  19是否有一个类的某些属性或者方法没有被其他类所使用?

  20在类的方法中是否存在如下的调用形式:a.b().c()?

  21是否某个类的方法总是调用另外一个类的同名方法?

  22是否某个类总是访问另外一个类的属性与方法?

  23是否两个类完成了类似的工作,使用了不同的方法名,却没有拥有同一个父类?

  24是否某个类仅有字段和简单的赋值方法与取值方法构成?

  25是否某个子类仅使用了父类的部分属性或方法?

posted @ 2008-01-09 13:37 JYun 阅读(68) | 评论 (1)编辑

2007年8月2日

原创及工作经验 SQL 2000包执行错误

因为要将客户机的ACCESS数据库中的刷卡记录导入SQL中,ACCESS的数据库采用的是目录共享方式共享的,但是包执行几次都错误,了解到是SQLAGENT的帐户问题,因此解决方法如下:

客户机加入域的情况:
 在SQL-SERVER服务器上,在服务中将SQLANGENT服务的登录帐户,设置为域管理员帐户,同时该帐户要能够登录客户机,这样包执行就正确。

客户机没有加入域而且是Win98:
 在SQL-SERVER服务器上,在服务中将SQLANGENT服务的登录帐户,设置为本地管理员或系统帐户,在WIN98的机器上建立一个SYSTEM的帐户,密码为空,这样包就可以正确执行了。

posted @ 2007-08-02 10:15 JYun 阅读(78) | 评论 (0)编辑

2007年6月21日

原创 爱因斯坦迷题及推导过程

     摘要: 今天下午没事,看2007年第6期程员序,正好看到爱因斯坦迷题这块,闲着没事,推导一下,下面是推导过程:在一条街上,有5座房子,喷了5种颜色,每个房里住着不同国籍的人,每个人喝不同的饮料,抽不同品牌的香烟,养不同的宠物  问题是:谁养鱼?  提示:  1、英国人住红色房子  2、瑞典人养狗  3、丹麦人喝茶  4、绿色房子在白色房子左面  5、绿色房子主人喝咖啡  6、抽Pall Mall 香烟的人... 阅读全文

posted @ 2007-06-21 17:44 JYun 阅读(319) | 评论 (1)编辑

2007年3月13日

转 “主动程序员”与“被动程序员”

我觉得这个世界上的程序员 可以分为两种:"主动程序员"和"被动程序员"。"主动程序员"可以自己选择开发方式,开发语言和框架,"被动程序员"被动接受公司指定的语言和开发方 式。其实在现实生活中,这种分类并不绝对,一个程序员可能在不同的时候担当不同的角色,"被动程序员"也可能享有有限的主动权。这么分类并不以程序员本身 的知名度,财富多少,是否自己创业还是受雇于人有关。

  David Heinemeier Hansson 受雇与 37 Signal ,但是仍然可以自己选择建立自己的 Rails 框架来完成项目,他应该算是个"主动程序员"。Firebird 数据库的领导者同时也是 Interbase 数据库的创始人 Jim Starkey 将自己的公司卖给了 Mysql AB 而不得不给 Mysql 干活,从某方面说,他应该是个"被动程序员"。大多数第三世界国家的程序员应该属于"被动程序员",他们编程只是为了一份养家糊口的工作,他们无权选择自 己喜欢的编程语言或者框架,因为这是公司给他选择的,因为如果选了其他,他可能就找不到工作了。曾经有个即将离职的同事让我给他推荐一个比较好的编程框 架,可以很容易完成一个网站的制作,我给他推荐了 Zope, 还有 Rails, 他听我的介绍觉得不错 ,当我告诉他必须学习 python 和 Ruby 编程语言时,他显得很惊愕,"那能找到工作吗?"。这话其实也表达了大多数国内程序员的想法。看看招聘网站就知道,现在最需要的程序员是 Java 程序员,最需要了解的框架是 Struts。如果不会你很难得到面试的机会,所以就算你不会也要在自己的简历中"修饰"一下。

   有些自己创业的人可以自己选择喜欢的编程语言和框架,当然那毕竟是少数。如果我能够选择的话,我肯定不用 Java 来做网站应用。因为它完成一个简单的工作太麻烦了,很难快速适应需求的变化。当然我也不会去用 PHP ,因为我已经习惯了面向对象的编程方式了。 我发现一个奇怪的现象:大多数转向学习 Ruby on rails 框架的人都是来自 Java 阵营的程序员,而转向Python 框架Zope,django 的程序员大多有 ASP,PHP 背景。因为 Ruby 是一个真正的面向对象的语言, 它同时具备了脚本语言的特点,而 Python 首先是一个脚本语言,它具备了一些 OO 的特征。Java 程序员 很难忍受走回头路,所以他们选择了一个比Java更面向对象的语言 Ruby ,而PHP,ASP程序员没有那么重的思想负担,他们选择 Python 可能是因为它的代码更 Beauty ,远比他们以前写的"意大利面条"式的PHP,ASP 代码要干净的多。

  无论是 python, 还是 Ruby 这些非主流程序语言开发的框架,使用起来都异常的简便,他们可谓是真正从程序员角度考虑的框架。为什么 Ruby 一出,搅的 Java 的世界一片混乱,我想原因还是出在 Java 这里,当 Java 程序员想当然地认为程序开发应该如此麻烦的时候,Rails 的出现让他们立刻觉得被这些所谓的 Java 流行框架和 Sun 给欺骗了,这种欺骗是如此之深,以至于他们中间有的人"头也不回"的离开了 Java, 转而攻击 Java 的种种不是。这其中比较有名的人就是 Bruce Tate ,这位老兄写了两本轰动 Java 世界的书,Spring: A Developer's Notebook 和 Better, Faster, Lighter Java (该书可是获得 Jolt 大奖的,恰好我还都读过),随着 Rails 的流行,这位仁兄立刻叛逃出 Java 阵营,写了 Beyond Java 一书,着重介绍了一些非Java 框架,比如 Smalltalk 的Seaside, 和 Rails。

  Java 为什么这么复杂,我想了很久,得出这么个结论:这是因为 Sun 希望它那么复杂。为什么这么说呢?Sun 不是一个好的软件公司,它最擅长做的是制定规范,这很类似Java 编程中的 Interface, 经常编写 Java 程序的人,会发现 Interface 可能是出现最多的一个词汇了,任何框架中都充满了Interface —接口,大多数编程书都推荐面向接口编程(当然这不是Java的错,是设计模式要求的,不过 Java 将此发挥的最好)。首先定义接口,然后针对接口编写不同的实现,至少提供默认的实现。Sun 也是如此,看看 J2ee 的规范包含了多少 J 打头的技术, JDBC,JNI,JCA,JDO,JPA .... ,现在的 JCP 组织更加如此,每隔一段时间,就有大量的规范问世,Draft 的,还是 Final 的,充斥着Java 世界,这是 Sun 希望的, 每定义一个规范,就会有很多厂商来实现它,Java 的软件市场就做大了,这样 Sun 就可以靠授权,认证拿更多的钱,你看 Sun 的股票那么低迷,而却拥有那么雄厚的流动资金,原因再明白不过了,只要 Sun 还拥有 Java ,它就拥有了一切。

  Sun 希望 Java 变得复杂,就如同程序员希望 Perl 代码难看一样,这样做是可以带来好处的。Java 的复杂性也带来了产业链上其他行业的繁荣,比如咨询,在 Php ,Perl 流行 Internet 的年代,网站开发似乎还不需要咨询师,包括 C/S 盛行的时候,企业开发也不需要咨询师,然而随着 J2EE 逐步主宰企业级开发,咨询行业也开始兴旺起来。企业大把大把的把钱投入到开发咨询中,究竟效果如何,不得而知。我想对大多数程序员,尤其是那些有自己想法 的程序员来说,请求咨询公司,还不如自己去了解来得清楚。软件开发咨询师在我看来,有点象是"律师"—"代表贪婪的公司,让这个世界变得更糟糕一些"(中 Alex 的对白)。如果说国外的咨询师是希望通过主观的努力来解决客观存在的开发复杂性的话,那么国内的咨询行业可能把原本复杂的软件开发变得更加复杂了。我不相 信他们,我宁可选择某个软件的培训,而不希望有人来从头到尾指点你如何开发,因为国内咨询师的水平比你从书本上了解的高不到哪里去,公司又何必花费这笔冤 枉钱呢。

  那么如果你是个"主动程序员",你会跟着 Sun 的指挥棒走吗? 我想离开 Java 世界,你选择的机会应该很多,但是前提是:你愿不愿意离开 Java 。因为大多数人觉得改变现状其实并不是个好事情,学习一个新语言和框架意为着你过去所有的经验就消失了,这其中有风险。对大多数程序员 来说,编程其实就是份工作,跟卖盒饭,装机器没什么区别,只要搞好本职工作就可以。试图改变现状的人很痛苦,了解差异的人也是如此,就如同 Neo 在接受红药丸和蓝药丸。

  我在当年学习 Perl 的时候曾经买过一本《Learning perl》,书的作者曾经这么说,学习 Perl 是为了让自己把更多的时间用在去滑雪, PHP 的创始人 Rasmus Lerdorf 也曾经这样表示过,他希望自己能够减少盯着电脑的时间,可是这么多年过去了,他发现自己还是要继续盯着该死的电脑。其实我对选择框架语言也并没什么兴趣, 我只是希望能够以简单的方式完成工作,而把时间省下来去听听音乐,看看电影。实际上我跟不希望改变现状的人没什么不同,他们不希望学习新的东西,因为现有 的东西很熟悉了,学习新框架,还不如把时间放到玩上去,我的目的一样,我学习只是希望自己的工作更轻松一点,这样可以用更多的时间来玩。所以每当我看到各 种技术论坛上充斥着Java, .net , ROR ,Python 之类的争吵,我都觉得很好笑。其实为了维护一个语言而争吵最没有意义。编程语言就和英语,计算机一样,就是个工具,选择它们只是为了尽可能简单地完成工 作,提高生活质量。为了语言而语言,为了框架而框架都是没必要的。"主动程序员"可以选择自己的方式来工作,这是大多数人做不到的。如果有可能,我也希望 做一个"主动程序员"。

posted @ 2007-03-13 22:46 JYun 阅读(55) | 评论 (1)编辑

2007年1月7日

转 ORM之硬伤

原贴 http://www.cnblogs.com/Barton131420/archive/2007/01/07/613955.html
园子里有些人,他们真以为自己明白了面向对象,然后装着满腹经纶,侃侃而谈,一篇接一篇,不厌其烦地喊着ORM如何如何。你以为他真的明白“面向对象”么?其实,他对面向对象的理解仅限于教科书中的封装、继承和多态,或者再知道一点面向对象的若干原则但其实并不真正理解。
笔者愚钝,入行多年尚不懂面向对象,只懂得用其形而不懂用其实。五年后的某一天终于开窍,明白了面向对象之实,也仅仅是一个开始而已。当又经历了另一个五年的倦怠,发现并理解了设计模式、面向方面等技术作为面向对象的必要补充后,才算是彻悟!所以当我见过一个同学,尚未出校门已然彻悟,真是羞愧!
有一天面试的时候,我问一位同学,Framework和Library的区别是什么?他答不上来。而另一个同学略一思考就告诉我,你的程序会调用Library,而Framework会调用你的程序。虽然精辟,但我还是要补充:Framework通常也会提供一个Library,所以,Library是水平的,而Framework是垂直的,此处的“水平”和“垂直”是相对应用系统的层次设计而言的。如果没有层次,其实Framework其实就是Library。Microsoft的Enterprise Library当然就是一个Library,无法代替Framework。
如果让那位已经彻悟的同学舍弃ORM来实现复杂的业务功能,他当然无法接受。相反,如果让一位抱着《Thinking in Java》似懂非懂的同学用ORM来实现同样的功能,他也一样无法接受。其中的一些同学非常擅于“鸡蛋里挑骨头”,于是园子里有了这样一堆垃圾文章或者垃圾跟贴。另外一些同学不精于这样的能力,所以仍在徬徨之中。

此乃ORM惟一之硬伤也!如果你不理解面向对象思想,就先试着去理解,然后再来讨论ORM这个话题,并发表你的高见。

再说性能
ORM提供了所有SQL语句的生成,代码人员远离了数据库概念。从一个概念需求(例如一个HQL)映射为一个SQL语句,并不需要什么代价,连1%的性能损失都没有。真正的性能损失在映射过程中,更具体地讲,是在对象实例化的过程中。我曾经做过一个试验,以“计算第N个素数”这样的命题。我采用Delphi写Native Win32 Console程序,又采用C#写CLR Console程序。两者相比,令我大失所望。

N

结果

耗时

Delphi

C#

1000

7927

0ms

2ms

10000

104743

16ms

17ms

100000

1299721

438ms

324ms

1000000

15485867

11437ms

7823ms

该命题采用的算法是找出第N个素数以前的所有素数,开辟一个内存区存贮这些素数。在Delphi中我用链表,在C#中我用List<int>。实际的结论是:当列表足够大时,链表的性能远不及List<int>。当然,如果每个链表节点只装一个元素,这种差异会更明显。事实上,我测试过每个链表节点所装的元素个数做了一个阶梯试验,从30个、254个、510个、1022个到2046个,每个节点所装载的元素数越多,耗时越短,最终越来越接近C#的List<int>。
不知道各位是否已经明白了性能在哪儿损失了:内存分配。Native的内存分配与释放都是非常耗时的操作系统行为。但在托管环境下,内存的释放是GC干的事情,甚至不需要统计到耗时中,而内存的分配也是一件非常快捷的事情。当然,即使是快捷也还是需要耗时的。这让我联想到DataSet的性能。DataSet也是一种数据容器,但是却没有多少人抱怨DataSet的性能。如果你明白DataSet的机制,就会发现,DataStorage巧妙地规避了内存分配和耗时的问题。而我们的ORM无法解决每个对象实例在构造时分配内存所耗时间。我做了一个不精确的评估,相比DataSet,对象集合的性能损失大约占20%左右。
如果假定ORM并没有比传统的数据访问方式耗费额外的IO的话,除此之外,ORM再没有任何性能损失!
再回到前提条件:ORM并没有比传统的数据访问方式耗费额外的IO。这个条件成立么?
由于ORM的实体对象定义已经固定,所以即使我不需要某些字段,也一样需要加载这些字段。
OK,有的同学已经看出来了。额外定义一个视图的实体对象即可。定义这些视图的实体对象的确很麻烦,但是肯定比构造那些SQL并不断地维护它简单得多。
当一张表中有1000万行数据时,实例化1000万个对象是不可能的。
非常正确。难道你曾经成功地尝试过将1000万行数据加载到某个DataTable中并且没有性能问题?从应用的角度来说,在一个模型中包含的实例数超过500行就有设计不当的嫌疑。我对Google的抱怨是:当搜索结果超过1000个时都会令我抓狂。让我从1000行数据中找出我所需要的某一行,这是开发人员的思维,并不是用户的思维。如果能够在已有的结果中进行二次、三次或者多次进一步的筛选,可能更适合绝大多数人。我为什么不愿意在分页中花太多的精力,其原因也是如此。我认为用户的眼球只能接受100行以内的数据,超过这个行数就需要采用其它的方式,或者改善领域设计。所以,这个问题的答案是:你不可能需要一次载入1000万行。
当应用系统整体性能欠佳时,因为隐藏了数据访问细节,从而无法找到快速优化的途径。
不能同意。几乎每一个ORM框架都提供了非常可靠的数据库访问日志。通过这些日志分析性能损失将比直接使用SQL语句更可靠、更方便。

灵活性
ORM不够灵活?我完全不能理解,我甚至不知道这个不够灵活是与什么基准相比。相反,ORM可以让你灵活地替换数据库(当然这个优点并没有非常重要的意义);在修改数据库以后不需要修改服务层或者只需要进行简单的修改;可以对某个服务进行单独的测试;可以对服务进行不依赖数据库的、上下文一级的扩展;可以进行更好的层次设计;......
不能实现所有的查询条件
如果是想表达“每一个Select语句可以通过面向对象的方式进行查询”的话,我觉得目前绝大部分ORM框架都已经很好地解决。我解决这一问题的基础是:我不提供超越SQL ANSI92的能力,但覆盖SQL ANSI92的所有功能。对于解决实际应用中的不足部分,采用运行时算法补充。Hibernate采用的是HQL这样的方式,基本上SQL能够做到的,HQL都无一例外可以做到。ECO采用的是OCL的方式,其功能可以完全覆盖SQL。我的框架所实现的查询目前我还没有发现无法解决并必须利用Native SQL来实现的(因此我无法理解Hibernate3为什么要提供这样的扩展)。Hibernate采用的策略是以面向对象为核心,换句话说,以持久化对象为终极目标,而以加载对象以持久化对象为前提。设计一个POJO,实例化,然后保存起来,下次使用的时候可以依样载入即可。大规模的查询并不是框架的核心目标。所以,如果你完全依赖Hibernate去持久化,我非常担心你将来是否有机会用你的数据积累去做数据仓库。而我的框架目标则不同。在持久化与加载两个目标间我没有主次之分。我也没有超前到MDA,我的对象模型仍然基于数据库的ER设计,我仍然提供一组非常清晰明了的数据库视图。
多表连接查询
如果需要将多表的连接查询结果转换成一个二维视图,显然需要你再定义另一个视图实体对象,将视图映射到对象模型。如果你仅仅是要在一个对象实例的某个属性中获得另外一个对象的集合,似乎这不是DAL方式的优势,而反而是ORM的优势。将多个对象所依赖的多个对象放到同一个上下文中,显然这是最好的一种方式。
统计查询
从理论上讲,ORM不适合做OLAP,不适合做太多统计查询。其实这一点,我的框架已经提供了非常好的解决方案,对Aggregate到面向对象的视图处理得非常好。

开发效率
提高开发效率仅仅是一个抽象的目标,具体的手段应该是两个方面:一是IDE和辅助工具;一是适合将任务分解成多个解耦的部分从而可以通过增加人员来提升总的开发效率。虽然ORM仅仅是开发环节中很小的一部分,但是却遍布应用系统中的每一角落,因而对开发效率影响较大。除了ORM,难道还有更好的选择么?
ORM后,原来精湛的SQL技能变得毫无用武之地,让人甚是失落,但这并不是ORM的过错。

posted @ 2007-01-07 19:19 JYun 阅读(134) | 评论 (0)编辑

2006年12月13日

转 程序员学习的革命-如何使用大脑

本文链接地址:http://blog.csdn.net/thefirstwind/archive/2006/12/13/1440965.aspx

标题:程序员学习的革命,教你如何使用大脑
作者:邢晓宁
时间:2006年12月13日
声明:版权没有,随你任转

很多人搞技有很多行搞技,搞了一段时间终发现,自己不适合作技,又退了回去。要我就是用方式的问题,真的学会适当的用方式,起来才得心手,才能找到编程的快乐。

候,我们问到很多高手详细的技术问题,他们马上用程序实现出来,而且运行无这应该是左高手。左:是作抽象化符号理的。

而另外一些高手,我们问们请设计方案的候,简单的在上勾勒几笔,大致的设计方案就呈出来,之后的check,他多半不看你程序,只讲讲大框儿便能发现问题这样的的应该是右高手,右脑:形象化分类处理,我公司以前的老板是技出身,检查我的程序的候,都要程序,他从来不看我的代。人家讲话,你的程序在我里要明来了才算通你自己都想不通,那就上手,想明白了再

当然,左脑和右脑结合是最好的方式,但是现代人对右脑的应用没有得到很好的开发,人刚生出来的时候就最开始发育的是右脑,之后的3年中主要也是使用右脑,然后才是逐渐德在右脑和左脑架起一个沟通的桥梁,扶助左脑的建立,随后左脑逐步的完善。随着学校的教育,左脑的使用频率越来越高,比例上成年的使用左脑远远大于右脑。但是值得注意的是,右脑的信息存储容量是左脑的100万倍,如果得不到很好的右脑利用,那么岂不是浪费了很大的资源。

另外,论坛上,有人调查过编码员每天要有多少代量,剩下的时间在干什?平均是150行左右,当然干外包的要多一点。不,星星多的,基本程的时间不超工作时间20%,剩下的时间在思考,或者说这时间在大里面勾勒出来程序的,也就是常的画脑图。看来很多大牛,在用脑上,右脑的使用还是高于左脑的。

对于画脑图这个概念,又叫做思维导图、心智地图,心像图,心智图,Mind MapMind mapping, 可以视之为一个树状图或分类图。不要一行行地作记录,而是画脑图。用树状结构和图像再辅以颜色、符号、类型和关联来画脑图。脑图法,是由托尼·布赞发明的一种方法。在他杰出的新著《脑图之书—发散性思维》(TheMindMapBookRadiantThinking)里,有对这种方法很好的介绍。

 

顺便说一句,编程中什么语言好,是个来已久的话题,也没有必要去深究。入打好程基以一本常用言做实现手段(一般都C言,当然不绝对),干活的候,用到什么语言,拿起程手册上就能干,就可以。可是,问题是,很多言的程思想不太一,有些精髓是要稍微理解以下的。这里要注意的是,不要把重心放在各种语法上,技术的核心其实是技术思想,如果建立了成型的技术思想,即使上忘记各种语法,事后稍微温习一下也很快就能上手。但是,如果不明白技术思想的话,根本不知道如何上手去干活。所以说,学编程,还首先要学编程思想,技术思想,多画脑图。

得大学毕业设计候,用powerbuilder开发,当就用了三个月,相比几万行的代,家里更多是堆如山的设计图纸,当根本不懂得什么这那个,也没有个设计标准,子里面想什就画出来什。短短三个月,最后被评为毕业设计,小吹一下。因那个竟是我入的第一大笔,身受益。

,有些候,我在程序设计之前,做的各种图,用利,框架,流程,系功能,等等等,无非也就是脑图的各形式,只不是不同期的不同的形式而已。(可能理解得不太深入,别喷我)

于国人来,技不是问题,更重要的是设计思想,好的设计决定目的生命周期,好的设计决定代劳动强度,决定后期维护用。而个好的设计来源就是大对项大致的勾勒,几笔简单的勾勒,可不是都能画好的。

里就是想说说是其他工作,以及平的学,画一张张好而有效的脑图是多末重要啊。

那么如何画脑图,以下介绍两种方式:

(一)托尼.巴赞的脑图规则

1,首先在纸的中心画一个彩图,这个彩图往往胜过千言万语,明确主题,并且刺激创意性思维,同时会强化记忆。

2,多用图画

(二)另一样式:台湾高美士中葡中学校长梁佑澄的脑图的方法及法则

1.工具方面, 只要可画图之纸张(一般A4B4) 及方便使用之颜色笔即可; 若你懂得用计算机, 这也是一种极方便的工具。

2.一开始就把主题摆在中央。向外扩张分枝, 近中央的分枝较粗, 相关的主题可用箭头号连结。在纸的中央,从主题开始—最好用一个符号,然后画出从主题上

分散出来的分支。如果你将纽约市进行脑图呈现,就将自由女神像作为中心。如果你在悉尼,就用港口大桥作为中心点。如果是本书中关于大脑的那个章节,就画一个由两部分组成的大脑。

3.使用「关键词」表达各分枝的内容---- 脑图目的是要把握事实的精粹, 方便记忆, 所以不要把完整的句子写在分枝上。

4.将相关的内容放到同一分支上,每一内容如新的亚分支那样分散开来。使用符号、颜色、文字、图画和其它形象表达内容。图象愈生动活泼愈好。

5.建立自己的风格 --- 脑图并不是艺术品, 所绘画的能助你记忆, 才是最有意义的事。

6.你完成每一分支后,用不同色彩的框将其框上。

7.重画能使「脑图」更简洁, 有助于长期记忆 --- 同一主题可多画几次, 不会花很多时间, 但你很快会把这主题牢牢的记住。

8.有规律地将内容补充到每一张图上。这样,就很容易从概要开始,然后当你在每一学科中学到更多要点时,不断使脑图更加丰富、充实。

最后,这是一个简单的脑图例子,大家可以看看。

 

另外再转一个实例:

 

 

里再推荐一本老吧,的革命。祝大家,在程中找到快

 

posted @ 2006-12-13 17:01 JYun 阅读(90) | 评论 (0)编辑

2006年11月28日

转 商业软件编程很无聊?

这周读到三篇博客帖子。把它们串在一块儿读,对我们的职业发展非常有教育意义。
一篇是Thoughtworks前员工Ravi Mohan写的,《但是马老大,商业编程就是无聊》。Martin Fowler在一篇帖子里说,编写企业软件不光是捣腾数据。并不是只有解决算法问题,操纵硬件,和应用大量数学才有意思。关心顾客(马丁所谓的客户亲和力),全力让自己的软件为客户带来商业利益也是挑战所在,趣味所存。Ravi在帖子里不以为然,认为不管Martin Fowler怎么辩白,商业编程无趣是不争的事实。不信可以看看人心所向。从来只见有天赋的程序员屁颠屁颠地去开发编译器,操作系统,TCP/IP stack, 大规模并行系统,高性能服务器,游戏引擎等系统级软件。哪怕优秀的商业软件程序员也无限渴望去开发系统软件。相反,从来没见那个能靠系统开发软件挣钱的牛程无限向往开发商业软件。这好比柏林墙没倒前,只见东德人拼死冲到西德去,没见有什么西德人拼死要到东德去的(愤青们就不用和我争论东德怎么好了哈。Ravi自己的例子而已。东德好不好关我P事)。Ravi还说,哪怕Thoughtworks内部员工也无限向往系统编程。每次Thoughtworks讨论把生意扩展到嵌入式编程和非其它非企业计算领域时,Thoughtworks的员工们都士气高涨。然后Ravi引了老愤青Paul Graham的话,号称集中精力攻克困难但定义清晰的问题完全是出于自我保护的需要,因为成天解决琐碎问题不能让人学到任何东西,只能让人变蠢。做系统编程给人的满足感比做琐碎的商业编程大多了。Ravi进一步谈到Martin Fowler其实也承认商业软件开发遇到的问题太过随意,很多都是为了满足客户莫名其妙的要求,不会带给程序员成长的机会。他尤其赞同Martin说的“商业编程的真正挑战在于找到软件中能给客户的生意带来切实利益的东西。要做到这点,我们需要扎实的行业知识和技术功底。”。可惜的是,大多数商业软件程序员处于尴尬的境地:论行业知识不如行业专家。论编程技术不如真正的hacker(黑客这个词已经等同于cracker了,所以我还是用原文)。当然,这种尴尬情况在其它编程领域也存在,但症状没有那么严重。搞笑的是,Ravi说其实Martin算是商业程序员里比较幸运的,总有机会和牛人们合作,找出他的代码到底有什么商业价值,而这和普通的“编码人”有本质区别。这也是为什么外包的工作如此无趣的原因:商业方面的分析已经定了。编码的框架已经定了。承接外包项目的程序员发挥余地实在有限,更不用说趣味二字了。作者的要点是,要想让自己的工作变得有趣有意义,要么就下大力气变成业务专家。要么就变成可以玩儿转系统的编程高手。其实系统编程高手也是业务专家。只不过他们的业务领域恰好和技术领域重合。
 
第二篇帖子是Reg Braithwaite的一篇帖子,商业编程没有那么难?》。这篇帖子同时引了Reganwald另外一篇短文,怎么让编程变得困难》。Reg在两篇文章里都谈到了同样的一个观点:商业编程从表面上看来都是广泛而肤浅的。程序员有大量问题要解决,但没有什么问题特别深刻。哪怕你用最新的技术都不足以让普通的商业编程变得更有意义。用Reg的话来说就是用Ruby On Rails编程好比聆听Jaco Pastorius,什么人都能干。只有在复制Jaco的盛宴时才能真正获取学习经验。还是以RoR为例。用RoR远远不够(其实不用也无所谓)。仔细研究RoR的代码,学习怎么设计自己的DSL才是正道。在《商业编程没有那么难?》里面,Reg举了三个例子。一个是从信用卡的使用情况实时判断被使用的信用卡是否被盗。一个是实时卡车调度问题,能针对路矿和递送要求优化卡车路线和发车时间表。还有一个是销售辅助系统,能学习潜在客户的特质,帮助销售决定是否跟进。嗯,两个模式识别和学习问题,一个调度和网络流优化问题。都是非常有挑战性的问题。都可以让一个普通的商业项目变得趣味十足(当然也能让我们的压力陡增)。当然,如果你对每月一张固定的工资单感到满意,知道自己的工作马上就要外包给西贡的大学生也能安然入睡,就不用自找麻烦了。作者的要点就是:挑战不是别人给的,而是在勃勃雄心驱使下,你自己找的。也许以后做每个项目时,我们应该给自己找点有挑战性的问题,激发自己的潜力。不然做的项目再多,也不过浪费人生。
 
第三篇帖子是XML发明人Tim Bray的一篇短文。在Tim的努力下,JRuby的两个主程加入了Sun。新闻公布后Tim收到几乎所有JVM语言作者的询问,问为啥子Sun独选了JRuby那俩哥们,能不能给其它JVM语言也提供支持。于是Tim谈了JRuby受到重视的原因。首先,没人要求,没人给钱的情况下,这俩老大投入大量精力,运用各种技术把半死的JRuby项目盘活了。其次,JRuby背后有活跃的社区(大半因为Rails的风潮)。第三,他们善于交流,到处做报告,做让人印象深刻的演示,展示项目进展。第四,他们不断发放高质量的代码。每个版本都较上个版本有长足进步。也就是说,他们证明了自己的能力,展示了自己的领导才能,更重要的是他们不断交出优秀的作品。职业培训里常说要想事业顺利,要做到两点,搞出事(make things happen),和搞定事(make things done)。JRuby是个很好的例子。
 
帖子的教育意义很明显,俺就不用在罗嗦了吧?


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1236675

posted @ 2006-11-28 09:41 JYun 阅读(77) | 评论 (0)编辑

2006年11月27日

看 设计模式之策略模式探讨初步 有感,并摘取部份内容,学习之

原文 http://www.cnblogs.com/changhai-xuri/archive/2006/11/24/571089.html

使用模式最好的方式是:「把模式装进脑子中,然后在你的设计和已有的应用中,寻找何处
可以使用这些模式。」以往是代码复用,那么现在则是经验复用。

第一个设计原则:
   找出应用中可能需要变化之处,把它们独立出来, 不要和那些不需要变化的代码混在一起。
也就是说: 如果每次新的需求一来, 都会变化到某方面的代码, 那么你就可以确定, 这部分的代码需要被抽出来, 和其他闻风不动的代码有所区隔。
把会变化的部分取出并封装起来,以便以后可以轻易地扩充此部分,而不影响不需要变化的其他部分。这样的概念很简单,几乎是每个设计模式背后的精神所在。
所有的模式都提供了一套方法让「系统中的某部分改变不会影响其他部分」。
这样的结果如何?代码变化之后,出其不意的部分变得很少,系统变得更有弹性。

第二个设计原则:
针对接口编程」真正的意思是「针对超类型(supertype)编程」。
这里所谓的「接口」有多个含意,接口是一个「概念」,也是一种Java的interface构造。你可以在不涉及Java interface的情况下,「针对接口编程」,关键就在多态。
利用多态,程序可以针对超类型编程,执行时会根据实际状况执行到真正的行为,不会被绑死在超类型的行为上。
「针对超类型编程」这句话,可以更明确地说成变量的声明类型,应该是超类型,通常是一个抽象类或者是一个接口,
如此,只要是具体实现此超类型的类所产生的对象,都可以指定给这个变量;这也意味着,声明类时,不用理会以后执行
时的真正对象类型!

第三个设计原则
  多用组合,少用继承。
  在设计时你会发现,对象的一些行为往往易于改变,采用继承时,超类的形为特性的改变会涉及到的有子类的改变,扩展性变得不够好,
  按第一原则把这些易于变化的行为抽取出来,按第二原则采用接口来管理每一类形为,让具体的形为类去继承这些接口,
  每一种形为之间不再有关系,对于主体类涉及到哪些形为,我们就把它们组合到一起好了。这样通过组合建立起来的系统具有很大的弹性,
  我们就可以在运行时动态地改变行为,只要组合的行为对象,符合正确的接口标准即可。

posted @ 2006-11-27 10:41 JYun 阅读(48) | 评论 (0)编辑

转 框架设计经验谈 -- 不要为框架作过多的假设

框架往往是这样产生的:我们拥有了开发某种类型应用的大量经验,并开发了一些这种类型的应用,我们总结这种类型的应用中共性的东西,将其提炼到一个高的层次中,以备复用。这个“高的层次”的东西便是框架的原型。随着我们经验的不断积累,框架也会不断的向前完善、发展。框架,正如其名,就是一个应用的骨架,选用的框架的好坏直接决定了基于其上构建的应用的质量。在确定了一个框架后,我们在骨架的缝隙里为其添加“血”和“肉”,便成为一个应用。

    框架源于应用,却又高于应用。
    我今天要说的是,正是因为框架源于应用,所以在提炼框架的时候,我们往往不自觉的为框架作过多的假设。这些假设来源于孵化框架的具体应用中的一些潜在的“规则”或约束。为什么了?因为我们常常希望,使用了框架之后,这个孵化了框架的应用再基于这个框架来重新构建应该非常简单。这种简单性会在两种情况下出现:一是你成功地抽象出了一个非常好的框架;二是你抽象出的框架与孵化框架的应用紧密的耦合在一起。如果没有设计框架的经验,我们陷入第二种情况是必然的。

    框架与孵化框架的应用的紧密耦合,换句话说,就是为框架作过多的针对这个具体应用的假设。在这种有过多假设的环境下设计框架导致的最直接的后果是:降低了框架的可复用性。我们提炼框架的目的是为了使之能在各个类似的应用中很好的复用,而依赖于太多的假设来设计框架将大大降低这一美好的目标。

     框架为应用作过多的假设的一个非常具体的现象就是,框架越俎代庖,把本来是应用要做的事情揽过来自己做。这是一种典型的吃力不讨好的做法。框架越俎代庖,也许会使得一个应用的开发变得简单,却会给其它更多想使用该框架的应用增加了本没有必要的束缚和负担。

    框架只做该做的事情,而哪些事情是该做的,取决于设计者的判断,而判断的正确与否取决于设计者的经验和能力。
    
    我们设计框架时,往往在框架中提供了很多内置的组件,但是,框架不应该强迫应用使用任何一个最要、核心的组件。相反,框架应该允许应用提供组件的自定义实现来替换掉内置的组件。这个可以通过组件的接口设计并暴露之而非常容易的做到。比如,我们的框架可以规定消息头MessageHeader中必须包括哪些字段,但框架不能强制说MessageHeader就只能包括这些字段。这个区别正是接口与实现(类)的区别。框架提供的是一系列的接口和这些接口之间的相互联系,以构成骨架;应用实现这些接口以形成“血”和“肉”来填充这个骨架从而得到一个“有机体”。

    空谈了这么多,举两个例子吧,这两个例子都是关于
ESFramework的。
    第一个例子是,有段时间将ESFramework定位为一个应用框架,期望其能适用于所有的C/S应用,于是,在ESFramework中包含了大把与应用相关的东西,使得ESFramework越来越复杂和庞大。正如,能治百病的药治不了任何病一样,能满足于所有应用的框架几乎不会被任何一个应用采用。对这个错误的解决方案的改成是,将ESFramework定位于一个单纯的通信框架,这会大大拓宽它的复用范围。(更详细描述可以参见
ESFramework 最新进展 -- ESFramework体系

    第二个例子是,在早期版本的ESFramework中有个名为ServiceType的枚举,它将所有的消息进行了分类,说实话,这种分类非常适合IM系统,但对其它C/S系统并不一定合适。而且ESFramework还针对这个ServiceType分类提供了对应的内置的消息处理器(
详细情况)。现在看起来,这种做法是多么的笨!在后期的ESFramework版本中,ESFramework对消息如何分类再没有任何干涉,那些本不应该存在的消息处理器也删除了。取而代之的是使用一个DataDealerBagList,应用可以向其中添加任何消息处理器,只要应用将消息处理器与消息类型进行了正确的匹配就可以。

    两个例子说完了,最后总结一下,我们的第一个经验是:不要为框架作“过多”的假设,而不是:不要为框架作“任何”假设。一个没有任何假设的框架,从另一个方向看,就是一个万能的、能解决任何问题的框架,我们知道,这样的框架是不存在的,即使存在,也是毫无用处的。
    不要为框架作“过多”的假设,那么何谓“过多”了?有很多特性/组件,我们可以一眼就分辨出,它是应该存在于框架中,还是应该交给应用。但是,也有一些特性/组件,它们的所宿地就不是那么清楚了,这时,需要设计者的权衡,这种权衡恰恰是最体现设计者内功的地方。难怪有人说,软件设计也是门艺术,因为随时随地你都可能碰到需要权衡的地方!(每个程序员都希望当架构师,但是架构师并不是那么好当,因为架构师就像一个艺术家一样,需要做非常多恰当的权衡。如果任何人都能作出和你同等水平的决策,那你设计的这个决策便不值钱了。
软件的艺术之美源于权衡(Trade-off)

posted @ 2006-11-27 10:25 JYun 阅读(65) | 评论 (0)编辑