在软件设计中分层应该是越少越好, 过度分解一般都是有害的.
虽然说复杂的事物分解之后一般可以得到一些较简单的组成成分, 但这并不是必然有用的. 分析学成功的关键在于分解之后的组分能够出现大量重叠的情况,
参见软件中的分析学 http://canonical.blogdriver.com/canonical/555330.html
当分解到一定程度之后我们未必能够发现可以重用的部分. 而且即使分解后系统中所有的基元都是简单的,
也并不意味着整个系统就是简单的. 生物遗传密码由四种碱基构成, 但是我们理解了ATGC决不意味 ...
- 23:58
- 浏览 (307)
- 评论 (0)
敏捷(Agile)开发的灵魂是演化(evolution),其具体的过程表现为迭代(iteration),迭代的每一步就是重构
(refactor),而单元测试(unit test)与持续集成(continuous
integration)模拟了程序生存的环境(约束),是merciless
refactoring的技术保障。从数学上我们知道迭代总有个收敛问题。一些重型方法将变化(无论是正方向还是反方向的)等价于风险,而倾向于消除开发
中的不确定性,其中的迭代是趋于迅速收敛的。敏捷的迭代是开放式的,强调拥抱变化。敏捷编程排斥过度设计,除了过度设计会增加成本之外 ...
- 23:15
- 浏览 (317)
- 评论 (0)
Agile批评过度设计(over-engineering)的声音很大,但对于设计不足(under-engineering)同样是持坚决的否定态度
的。修改过度设计的应用比修改设计不足的程序要容易的多。因为简化的途径是明确的,而走向复杂的途径却往往是难以控制的。Refactoring To
Patterns试图引入一些经验,但这些可预见的调整多半只在细节处,其影响是局部的。一个复杂性低层次的设计要支持一个复杂性高的应用,所需的代码量
不是线性的堆砌,而是几何级数式的增长,重构的时候需要做出的改变往往也是影响全局的。而事实上,设计不足是比过度设计更 ...
- 23:11
- 浏览 (303)
- 评论 (0)
循环结构是imperative
language的重要组成部分,一般也是程序中比较难以理解的部分。特别是没有软件技术背景的朋友,明显对于循环的理解力较弱。在Von
Neumann体系结构中,赋值语句是必须的,因而引出了存储概念,也引入了时间概念,因为我们可以区分出赋值前和赋值后的时刻。引入时间之后,本质性的
影响是程序串行化,而强迫我们从并行思考转入串行处理。很多时候这是一种不自然的情况,在我们的自然思维中,我们看到的或想到的也许只是一组静态结构,但
在程序中表达的时候却往往不可避免的需要引入一个动态过程。而我们控制动态结构的能力总是不足的。最近对于函数式语言及处理风格的越来越强烈的要求 ...
- 22:49
- 浏览 (269)
- 评论 (0)
单元测试随着agile的流行已经家喻户晓了,这正反映了软件的一个本质特征:软件是Man-Made的,而人是不可靠的。软件出错的高频率必然导致控制
间隔的缩短。我最早是在编写matlab程序的时候独立的发现了单元测试的作用。因为matlab是弱类型的,横纵矢量也不区分,很容易犯错误,我就为每
一个matlab函数编写了测试脚本,约定了命名规范为xxx_test.m, 在测试的时候通过
can_assert来做出判断而不是输出变量内容进行人工检查。
每次作了修改的时候,运行一下can_test_all.m就自动搜索测试脚本并运行一遍。 后来xp出现了,
我也第一次听说了单 ...
- 22:34
- 浏览 (296)
- 评论 (0)
关系数据库提供的是集合存储模型, query(fields, condition) ==> list of records, 可以从条件集合映射到记录集合。
当condition退化为单一的key, 而fields采用默认值的时候,我们就退化到Map语义, 从key对象映射到value对象,而不是从集合映射到集合。
很
多时候我们只需要这种简单Map语义的存储模型,例如用户偏好设置的存储。在这种受限的模型下我们也可以更直接的实现cache支持。如果我们希望在
Map的基础上稍微扩展一些集合操作的特性,可以通过key的结构扩展来实现。即规定key采用类似url格式 ...
- 22:22
- 浏览 (333)
- 评论 (0)
级列设计理论中我们谈到一般和特殊的关系, 但这是否指的是“相对抽象” 以及 “相对具体”之间的关系,
而“一般”到“特殊”和“特殊”到“一般”这两个方向是否指的是具化过程和抽象泛化过程?
我猜测有这种想法的人大概是受到软件设计中所谓抽象封装思想的影响. 很显然, 我并不是这样认为的. 一般性(普遍性)与抽象性是不同的概念.
在物理学中相对论是比Newton力学更加一般性的理论,但它和Newton力学一样都是关于我们这个世界的真实的理论,都是非常具体的。虽然我们有的时
候会说相对论更加抽象一些,这不过是暗示这个理论所描述的情形与我们的日常经验距离遥远而已,并 ...
- 22:21
- 浏览 (593)
- 评论 (0)
级列理论是分析学中常见的一个思维框架,我只是把它从我最熟悉的物理学中借用到软件设计领域而已,
它本身并不是我所创造的一种概念(创造是艰难的)。在某些领域,这一分析框架可以表现出完美的数学特性,如时频分析领域的小波分析(wavelet),
统计学习理论中的支持向量机(Support Vector Machine),
分子动力学中的BBGKY级列等等。在其他一些领域它的精确性可能要弱很多,但其思想内核是一致的.
级列理论的基本内容如下:
htt ...
- 01:27
- 浏览 (1717)
- 评论 (0)
近代数学和物理学的发端是从微积分的发现开始的,人类第一次系统化的将连续性的思想推向了极限,也开创了崭新的思维方式。记得高中自学微积分的时候我也花
了很多时间去思考连续性的问题,但是后来渐渐习以为常了。研究生的时候重新开始考虑连续性的问题,只是关注的方向是概念体系中的连续性。
all or
nothing是我们的思维中经常出现的一个误区。很多时候我们的讨论局域在一个封闭的既定的体系中,最后的结论也是在原地转圈圈。就像是“人性本善”与
"人性本恶"的争论一样,数千年无所结论。也许我们真正的问题应该是猪有善恶吗,猩猩有善恶吗 ...
- 01:25
- 浏览 (572)
- 评论 (0)
敏捷思想的流行使得很多人对可扩展设计产生了一种怀疑的态度。这有几方面的原因,一方面是J2EE平台本身提供的分布式机制等技术因素很容易诱导你定义不
必要的扩展需求,第二是基于目前的技术手段对于程序结构的分解仍然有着很大限制,具体的程序实现中往往会引入某种强制依赖,削弱了潜在的可扩展性,第三则
是设计者本身对于技术和业务的把握不够深入,在考虑设计的可扩展性时经常做出错误的判断。但是一个只满足当前需求的系统一般不是个好系统,也很难在多次迭
代生命周期后继续生存。XP(extreme
programming)强调简单化,其实质在于简单的东西可以在未来被重构(ref ...
- 01:24
- 浏览 (394)
- 评论 (0)
实际观测到的结果是系统内在结构的外在表现,而软件开发是从需求分析开始,经历系统分析,设计并实现的过程,即从用户需求逆推出软件的结构。这种根据外在
表现求解内部结构的模型的过程,在数学上称为反问题(inverse
problem)。关于反问题,一个众所周知的难点在于解的不适定性。因为不同的结构可以有类似的外在表现,因而反问题的解是不稳定的。在一个既定的情况
下,我们按照某种粗略的外在度量标准,从反问题的众多近似解中选择了一个。但是当所需的外在表现发生微小变化后,我们第一次选择出来的结构可能无法适应这
一微扰,而我们再次求解出来的结构可能与原先的结构有着巨大的 ...
- 01:22
- 浏览 (1827)
- 评论 (0)
架构的可退化性(degragation)指的是架构的结构可以从元素比较丰富,层次比较多,比较复杂的情况退化到比较简单的情况,
而架构的无侵入性(non-invasive)指的是架构对于外部接入对象没有特殊的形式要求, 一般通过依赖注入(dependency
injection)向接入的外部对象推送信息. 这两个概念之间存在着紧密的关联, 但并不等同. 无侵入性可以看作是架构的一种局部可退化性,
例如一个业务对象在正常工作的时候需要是完整的EJB对象形态, 而在编写的时候退化到普通的java对象(POJO).
架构的可退化性是一个比无侵入性更加广泛的概念:一 ...
- 22:55
- 浏览 (292)
- 评论 (0)
系统架构通俗的说起来就是系统的结构组织方式.原则上说, 架构只有好坏之分,而不存在有无的问题.
软件的体系架构可以直接体现为代码的类结构, 也可以表现为文档性的编码规范和全局约定等. 如果软件架构中能够抽象出一些稳定的元素,
那我们就可能得到一些所谓的框架代码. 一般业务架构是很难重用的, 目前常见的框架代码所描述的多半是与业务无关的技术架构.
良好的系统架构应该体现出应用本身的结构要求. 所谓各个为自己, 架构为大家. 只要各个局部符合规格,
应该由架构负责在合适的时刻按照合 ...
- 17:35
- 浏览 (324)
- 评论 (0)
现在MDA建模的宣传多集中于可视化的表现形式, 鼓吹通过平面图标的摆放来传达信息.
图形的方式是否一定比文本表现要优越呢? 图形的表现能力确实是要强于普通文本的.文本对于信息的组织方式基本上是一维的,
而平面图形本质上是二维的(如果考虑颜色因素, 平面图形可以说是2.5维的). 人的视觉对于图形有着天然的并行处理能力,
通过图形我们有可能更有效的获得信息. 但是程序中细节的关联可能是复杂的, 多维的, 二维图形同样难以直接描述这些关联,
而一维的文本对于所有维度的描述是对称的, 可能在描述多维关系时更加容易维持简单性和一致性. 当描述复杂的关联 ...
据说"Less is
more"是1961年宝姿品牌提出的设计理念,它开创了简约优雅的时尚风格。Unix系统的设计可以说也是这一设计理念的最佳体现。使用Unix工具,
读Unix系统源码,我们时时都能体会到一种简约之美。而Microsoft发放出来的源代码一般都相当冗长,变量名也长,这一度让我很反感。为了简化C
++中的COM编程,我不得不专门写了一个封装框架。
简约并不简单。例如,注释一般都是期望能够帮助理解的,应该是有益的。但注释太多就会干扰对程序的理解。这里关键就是能否提供有效的信息量。利用这一点,我们换一个角度 ...
- 22:46
- 浏览 (297)
- 评论 (0)
在witrix平台中,validate.js提供了完整的客户端输入校验框架。其基本思想是为每个输入控件指定验证函数(validator属性),在提交Form的时候自动调用该验证函数即可。
<form action="test.jsp">
<input type="text" name="userName" validator="js.validate.checkNotEmpty(value,'用户名')" />
<input type="button" value="submit" onclick="js.validate.s ...
- 22:26
- 浏览 (950)
- 评论 (0)
- 分类: Witrix开发平台
守破离(Shu Ha Ri)是日本剑道(Kendo)的哲学。http://c2.com/cgi/wiki?ShuHaRi (日本人很善于推销自己传统的思想,而中国的传统却似乎在盲目自卑和盲目自大两个极端之间徘徊)
守是模仿(Imitate),遵循,是无我的过程。在日本的传统心性中,守的阶段需要完全开放心志,全盘接受导师的教导。此时应该学习唯一的真理,知道唯
一正确的方法,分清对与错。通过长期不辍的练习,将对规则的记忆固化在自己的身体中。初学者看似是自由的,但也是不明智的(unwisely),我们总是
倾向于采 ...
- 22:24
- 浏览 (309)
- 评论 (0)
witrix平台中的tpl模板技术是一种通用的xml动态标签技术,不仅可以用于文本生成,而且可以用于任何需要动态标签的地方,例如工作流引擎
的配置和执行脚本。tpl模板引擎采用的不是jsp
tag的标准机制,而是重新设计并实现的。在开发的后期,因为jstl标准出现,我们对标签的命名作了一定的修改,以尽量符合标准的调用接口。tpl模板
语言完全符合xml规范,其标签定义都是完全独立开发的。在开发tpl的时候,我们甚至没有看到任何类似于c:forEach和c:if的标签设计。但是
我们发现,tpl的动态处理功能与jstl虽然命名不同,但是基本是等价的,所以修改是非常直接的过程。
FreeMark ...
- 22:18
- 浏览 (610)
- 评论 (0)
- 分类: Witrix开发平台
http://www.ps.uni-sb.de/~duchier/python/continuations.html
A continuation is a procedure that takes the value
of the current expression and computes the rest of the computation.
Continuation是一种非常古老的程序结构,关于它的理论分析可谓渊源流长,参见http://library.readsch ...
- 00:58
- 浏览 (356)
- 评论 (0)
现在很多设计中推崇接口和依赖注入(dependency
injection),而不倾向于采用继承机制来构造程序结构。但很多时候作为一种简便而廉价的封装方法,继承仍然是不可或缺的.
例如与一些Engine打交道的时候,需要实现某些特定的接口. 在osworkflow中, 我们需要实现FunctionProvider接口,
interface FunctionProvider{
void execute(Map transi ...
Six Learning Barriers in End-User Programming Systems http://www.cs.cmu.edu/~ajko/LearningBarriers.pdf
学习在传统上被认为是人类特有的活动, 怎样降低学习的难度一直是理论上非常令人迷惑的问题, 同时它也是人类所面临的最大的实际困难之一.
在软件的世界中, 关于学习的研究也是一个非常重要的领域,
例如所谓的可用性(usability)和用户友好设计,其核心问题就是如何降低用户学习的难度.
我们目前的了解多半是一些经验的 ...
在witrix平台中,异常处理没有采用java语法支持的checked exception,
也不提倡使用自定义的异常类,
而是定义了少数几个RuntimeException基类,一般是CommonException(RuntimeException的派生类)。
在我自己的经验中,checked exception从未发挥过实质性的作用。checked
exception在某种程度上破坏了封装性原则。我们一般不会在最细的粒度上处理异常,而是在某个统一的模块节点处进行。如果使用checked
exception,
则从最 ...
- 23:00
- 浏览 (338)
- 评论 (0)
tag在国内java社区并不算流行,这在很大程度上是因为jsp
tag的设计失误造成的。但在整个开发业界内,tag已经成为一种广泛应用的技术。微软的dotNet服务器端极端依赖tag技术,而在浏览器端IE的
behaviour, htc也独立的发展起来。Longhorn的XAML,
Firefox的XUL无一例外的依赖于可自定义的tag。java社区的JSF, SiteMesh, Tiles
等等,不可尽数。有些人在前台通过给html原有元素增加自定义属性,然后通过javascript去解释的做法,也是一种element
enhance概念的变种。至于Fr ...
AOP作为一种新的分解与合成技术,除了性能问题之外,仍有一些概念层面上的细节问题需要解决。最近Stoerzer的一篇论文AOP Considered harmful因为与Dijkstra的经典论文Go To Statement Considered Harmful
进行对比而引起了广泛的讨论。
Dijkstra认为程序运行时的指令序列是我们最终想要的东西,而这一序列是运行时根据源代码的描述在时间轴上展开的(串行结构)。因为人们更容易理解
静态关系而不是随时间演化的过程,所以我们应该尽量缩小静态程序(spre ...
- 22:50
- 浏览 (394)
- 评论 (0)
接口(interface)总对应于某种明确的概念,它并不简简单单的等价于其成员函数的集合。有的接口如java.io.Serializable甚至没有任何成员函数。接口最重要的就是名, 是对概念的甄别。接口发布出去之后才能够被实现。当我们使用某个接口的时候,即使我们只用到其中部分函数,我们也必须负担整个概念。虽说"有名,万物之母", 并不是任何时候我们都需要名的。我们会说,就要那个,蓝色的,这么高,... blabla, 对,就是这个(this)。模板(template)弱化了类型系统,它对系统的约束直接作用在细节行为上,降低了明确建模的需求,不 ...
- 22:37
- 浏览 (293)
- 评论 (0)
- 浏览: 107230 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
最近加入圈子
链接
最新评论
-
关于REST
说的太抽象,看完之后好像是理解了,又好像很模糊。
-- by zjq_blog -
[导入]关于jsplet的一些 ...
我有一个疑问:把一个request || response带入到biz里面会不会 ...
-- by deepthink -
C++配置管理
boost里已经有现成的啦!
-- by jimmy_c -
不完全的计算
当我们 oo 的时候,一般都不认为自己在“计算”,当我们计算的时候,根本就想不起 ...
-- by hotman_x -
面向集合的框架设计
嘿嘿,说句不合时宜的话,一个事物“完美”是因为它已经没有价值,没有改进的必要。费 ...
-- by hotman_x






评论排行榜