2007年4月16日星期一

Web Service的异常处理

在 Atlassian Confluence 2.3中,如果用户和组来自于LDAP,当一个用户事先未加入用于授权的组,此时用户访问WIKI页面时会提示“Not Permitted”,但管理员将该用户加入授权的组,访问时仍然会提示未许可。这是因为Confluence使用了缓存机制。以管理员进入Confluence后,点击右上角的"Administration"打开管理页面,选择左边菜单 Administration->Cache Statistics。打开这个页面可以看到系统的缓存信息:


Confluence的缓存使用的是Orachle的Coherence技术,配置在confluence-coherence-cache-config.xml配置文件中定义的(在目录..\confluence\WEB-INF\classes下)。详细的配置定义可以参看
Coherence的配置元素参考,这里简要说明需要调整的配置。

缓存配置的问题

配置文件的根节点包含两个部分:
定义要配置的项,下表中的项是LDAP部分的


<cache-mapping> 
<cache-name>com.atlassian.user.impl.ldap.LDAPUserManagerReadOnly.users_ro</CACHE-NAME>
<scheme-name>user</SCHEME-NAME>
</CACHE-MAPPING>
<cache-mapping>
<cache-name>com.atlassian.user.impl.ldap.LDAPUserManagerReadOnly.repositories</CACHE-NAME>
<scheme-name>user</SCHEME-NAME>
</CACHE-MAPPING>
<cache-mapping>
<cache-name>com.atlassian.user.impl.ldap.LDAPGroupManagerReadOnly.groups</CACHE-NAME>
<scheme-name>user</SCHEME-NAME>
</CACHE-MAPPING>
<cache-mapping>
<cache-name>com.atlassian.user.impl.ldap.LDAPGroupManagerReadOnly.groups_hasMembership</CACHE-NAME>
<scheme-name>user</SCHEME-NAME>
</CACHE-MAPPING>
<cache-mapping>
<cache-name>com.atlassian.user.impl.ldap.LDAPGroupManagerReadOnly.groups_getGroupsForUser</CACHE-NAME>
<scheme-name>user</SCHEME-NAME>
</CACHE-MAPPING>
<cache-mapping>
<cache-name>com.atlassian.user.impl.ldap.LDAPGroupManagerReadOnly.repositories</CACHE-NAME>
<scheme-name>user</SCHEME-NAME>
</CACHE-MAPPING>


schema-name定义了配置表的名称为user,上面的LDAP的配置都使用user配置表,前面提到加入组无效的问题,就是因为"com.atlassian.user.impl.ldap.LDAPGroupManagerReadOnly.groups_getGroupsForUser"缓存的原因。

接下来我们看配置的缓存值,节定义各个schema的缓存值,与LDAP相关的是如下部分:


<local-scheme> 
<scheme-name>default</SCHEME-NAME>
<class-name>com.atlassian.confluence.cache.tangosol.HitTrackingLocalCache</CLASS-NAME>
<high-units>1000</HIGH-UNITS>
<expiry-delay>3600</EXPIRY-DELAY>
</LOCAL-SCHEME>
<local-scheme>
<scheme-name>user</SCHEME-NAME>
<scheme-ref>default</SCHEME-REF>
<high-units>5000</HIGH-UNITS>
<expiry-delay>300s</EXPIRY-DELAY> //定义缓存过期的时间,可以根据需要进行调整
</LOCAL-SCHEME>

user的schema使用default。从这个表看,user的expiry-delay项为300秒,也就是过5分钟后,该用户就可以具有权限访问WIKI页面了,但实际上并非如此,用户依然未授权。后检查发现,这个配置项根本不起作用!而是使用了default的设置,3600秒也就是60分钟才会过期。问题出在cache-mapping的定义上,在Cache Statistics的页面可以看到缓存定义项的名字比配置文件中的定义名多了一级:ldapRepository。这是atlassian-user.xml配置的ldap库的名字,原来Confluence内部的缓存配置项名加上了库的名字,但在默认的配置项定义中却没有,因此上面的配置根本不起作用。Confluence的文档也未提到这一点,让我折腾了很长时间!!


解决办法


解决办法很简单,就是在cache-mapping的cache-name值的com.atlassian.user.impl.ldap.LDAPGroupManagerReadOnly后面加上库的名字即可,新的配置如下:


<cache-mapping> 
<cache-name>com.atlassian.user.impl.ldap.LDAPUserManagerReadOnly.ldapRepository.users</CACHE-NAME>
<scheme-name>user</SCHEME-NAME>
</CACHE-MAPPING


修改后重启Tomcat即可。

随便谈谈——rup、开发过程、cmm

原文:2002/7
修订:2004/2/19

这是以前在XPChina论坛上贴的一些旧文,后又贴在了UMLChina上。当时的公司刚做完CMM3不久,因为自己不但是CMM过程改进组和评估组的主要成员,同时也是一个一线的项目经理和开发成员 。软件开发者是痛苦的,所以他们总是梦想是有像“葵花宝典”一样的神奇功法可以拯救自己,比如说“规范的开发流程”,比如说CMM,但在无数次的尝试之后,我想,也许那不过是个silver bullet。最近一年多在开发中,逐渐使用像FDD和XP的一些实践,开始觉得,也许不提“方法”,那些来源于开发实践中的不那么宏伟的东西似乎更有效,像JUnit之类的东西。不过现在整理以前的旧文,也算是回顾一下当时的思路历程吧。

2002年在XPChina贴出之后,网友grantlee提出了一些质疑,而且《随便谈谈..》似乎意犹未尽,于是又贴了续文《随便再谈谈...》。还有一点需要说明,既然“随便谈谈”,看官需不必太苛刻。


XPChina帖子链接(http://xpchina.smiling.com/group/posts/view_forum.ecgi?group_id=9999&res_message_id=1101784)


现在开发软件的人员说到开发流程,基本上都是rup/xp,xp没使用过,不敢说,这里说一说我对rup的使用经验。

根据我的使用经验(1.5 years),rup并不是一种强方法论,更多的是包括了大量的关于软件开发的流程和设计指南,没有谁会直接使用rup的流程,实际上只有理解好rup的活动思想,自己剪裁、组织合适的流程,才可能使用比较有效,但这需要很长的学习曲线和昂贵的学习费用(包括OOAD/RUP,不是一个人而是一个团队),当然自学也是没有问题,如果本身有很多软件开发的经验。

所有我同Rational的人交谈的时候说,虽然RUP号称适合于小项目,但那是在忽略了学习周期和成本的前提下,也就是说,如果你的团队或组长很熟悉RUP,那么它当然适合小项目(可以有效地剪裁并向成员培训),否则在实际的项目中使用就要小心了。但无论怎样,都可以把它看作关于OOAD的设计指南和流程的一般性建议,就像XP的很多原则也可以适合于其它环境,不过话又说回来,软件开发经验的本来就是怎样,不一定非要属于某种方法。

关于软件流程和CMM

过去我觉得正规的软件企业应当有一套完整的开发过程,现在我更倾向于认为软件开发的最佳实践对项目更有价值,包括开发方法、管理的,如有效的计划、需求方法、同行评审、团队的面向对象的经验。主要我觉得国内软件企业不太可能建立真正有效的角色清晰的资源结构和成熟有效的过程框架,国内软件企业热衷于CMM而不太关注于其具体效果(我参与了我们公司CMM3的评估,评估小组成员);关注于纸质的规范,而不关注约定对质量的提高;盲目追求一套流程,而忽视流程是否真正有用。

作了这么长时间的过程改进和软件开发,我觉得对于国内的企业来说,xp或者其它最佳实践方法更容易给开发团队带来实际的价值,因为这些由一线经理和开发人员,CMM不过是高层管理的招牌,他们大部分人实际上不懂软件开发,或者没有参与一个完整的软件开发过程,谁又会期望他们给开发团队带来的是开发的利器。

grantlee:我也随便说说

XPChina:我也随便说说

1、RUP不是方法论;00才是方法论,RUP/XP只是工作流程罢了。
2、过程的改进不是一朝一夕的事情,流程也有一个制定的过程;在这个过程中应该是首先有流程,然后才是流程的逐渐实施。
3、不管采用什么方法,对于企业的目标是一定的:创造价值;所以使用什么方法还是和当前团队的能力相关,如果带领着一组清一色的学生你无论如何完成不了一个大的项目(当然你通过几年的培训另说了)。

随便再谈谈——rup、开发过程、cmm

UMLChina帖子链接(http://umlchina.smiling.com/group/posts/view_forum.ecgi?group_id=9986&res_message_id=1135234)

我不知道rup是不是不能叫方法论,但我想既有分析设计的方法,也不妨有流程的方法,不过也许你是对的,但我只想把我使用rup的一些感受同大家交流。

我同意grantlee的话“过程的改进不是一朝一夕的事情,流程也有一个制定的过程;在这个过程中应该是首先有流程,然后才是流程的逐渐实施。”,但我分为两个层面来说明一下,一是如何的循序渐进, 二是制定怎样一个流程来执行。

首先循序渐进的做法是没有问题的,开发的流程不可能一下就完善起来(永远也不会有没有机会改进的时候),但重要的是怎样的循序渐进,以什么样的目标的渐进?那国内的企业是以什么来作为改进的目标呢?我想可能主要不是质量目标,而是评估的目标吧,倒不是说企业领导者不愿意看到质量的改进,这里面有些问题:质量的改进并不像证书那样被大家认同,同样也就不被管理者认同。实际上没有几个管理者是真正关心质量和开发的生产率这些话题,他们渴望市场和媒体的认同,这必然会带来一些轻浮的做法和浅薄的目标:通过CMM评估,而且它的高层需要也是基于市场和同行的压力(你说鼎新都过二级了,联想怎能不过呢?),这样的改进能带来什么呢?可笑的是,CMM的宗旨是帮助企业评估它的过程能力或者叫开发成熟度,它不愿意被看作是一个标准或认证,所以它叫评估而不叫认证。当我们通过CMM3我仍然不知道我们的项目的控制范围有多大,测试覆盖率是多少;当我看到众多的国内软件开发企业在2001年接二连三的通过CMM评估时,我知道我们都在玩弄CMM。国外到CMM2极可能需要几年的时间,CMM2到CMM3需要1.5-2年的时间,而我们从一个连SCM/Baseline都没搞太明白的公司,用一年的时间通过了CMM3(实际时间更短,不敢说出来),这又是怎样的渐进呢?

其次说说RUP,当然CMM同RUP并没有多大的关系,但CMM3要求要求组织级的开发过程,项目根据组织级的开发过程进行剪裁来获得项目的开发过程。以前我不知道国内到底有什么成熟的流程,所谓的结构化实际上也是很模糊、不完整的概念,RUP因为具有了开发过程所需要的流程、指南、模版,这些都是CMM,也是软件开发过程所需要的元素。因此我们就通过基于RUP来定制自己的开发过程,但后来发觉使用RUP有些问题:

  1. RUP的活动太多,并且没有严格的活动界限,对于初学者来说很难理解那些活动应该取舍,项目经理在半年后仍然无法熟练地对RUP进行流程的重新组织。
  2. 虽然RUP声称不一定要依赖OOAD,但事实上RUP是离不开OOAD,它本来就是从Objective流程改进而来。但对于组织来说并不是所有的项目都适用于OO的。

但是总的来说,我还是认为RUP比较复杂,并且项目也不能花费太多的学习代价,所以我还是希望能够有更加容易理解、有效的流程。

对于人,我觉得虽然我们并不是实际用应届毕业生(指没有经验的)来开发,但实际上对于严格的流程来说,我们可以说不是训练有素的人员,所有也有人说国内的职业工程师太少,这时候也更需要贴近开发人员,容易在过程中改进的流程。

同时我也觉得CMM确实需要很多管理带来的成本,不是太大的软件企业是否值得付出代价(虽然有些企业是大型企业,但开发团队从整体上讲却是小企业),这时候注重项目成败的流程会更有价值。

Persistent Data Object(PDO)-基于.Net的O/R映射框架


PDO是一个试验项目,已停止开发。O/R映射框架推荐使用NHibernate



持久化问题(永久存储信息的访问)是面向对象开发和企业应用开发需要面临的问题,而关系型数据库是目前保存数据的有效手段,因此如何在对象层(Object)和关系数据库(Relational)之间建立一种好的机制,可以更有效的改进开发的效率和质量。PDO(Persistent Data Object)是适用于Microsoft .Net环境下的O/R映射方式的持久性处理框架。PDO能够使处理持久化数据(需要保持在关系型数据库中的数据)采用"持久化对象"的方式,对于面向对象设计来说是处理对象持久化问题的自然方式。在传统的开发方式中,通常需要书写代码使用像ADO或Microsoft .Net Data Provider等数据访问引擎来读取、更新和增加数据,需要维护关于底层数据库的信息。然而PDO对数据以对象和属性的方式进行处理,而不再需要了解如何处理表的纪录,以及数据的来源等底层的数据库信息。

PDO同其它O/R框架不太一样,使用基于客户端的状态管理,是一种直接支持客户/服务器模式的O/R映射和设计框架,着重于分布式应用。有关PDO构架的详细介绍参看PDO Developer Guide

PDO采用C#开发,开放源码。

Features

1.0.0 2004-5-10
(new)

  • 重新改写底层代码,性能改进
  • Delay Loading支持延迟属性的装载和更新
  • 支持多种数据访问方式
  • 支持多数据源定义
  • 增加XML映射支持
  • 改进的Attribute映射方式使映射定义更简单
  • 删除MCC模式支持库。原来的MCC库管理对象状态使整个结构显得复杂。
  • 在核心库中增加客户段状态管理支持。
  • 支持更加灵活的自动值属性处理。使PDO能够支持包括Microsoft SQL Server和Oracle等主流数据库的自动主键创建方式。

0.4.1

  • 项目从VS.Net 2002 升迁到 VS.Net 2003,单元测试工具改为使用NUnit,以便更好的同其它开源工具集成,如NAnt。

下载

开发

  • PDO需要在.Net Framework 1.1环境下使用。
  • PDO设计时考虑了CLS兼容,但并未进行兼容性测试,如果在C#以外的语言中发现无法正常使用,请通过邮件报告发现的问题。
  • 源代码使用Microsoft Visual .Net 2003开发环境开发。其它的辅助工具参看源代码包的readme.txt。

[lastest updated:2004-5-10]

基于电子邮箱的虚拟文件存储空间:emboxFTP

关于Kangaroo emboxFTP

Kangaroo emboxFTP是一个采用Java编写的基于电子邮箱的虚拟文件存储空间。利用emboxFTP可以方便地在邮箱中保存个人文件。

邮件文件系统MFS(Mail File System)




常规情况下电子邮箱用于收发电子邮件,emboxFTP通过扩展电子邮件的头信息(Header)来保留文件信息,使用附件来保存文件,形成了一个简易的基于邮件的邮件文件系统MFS(Mail File System)(见上图)。

MFS具备一般的文件系统功能,如:
  • 新增/删除文件
  • 通过扩展java.io包的MFInputStream/MFOutputStream读写文件。
  • 列出文件列表
MFS将文件拆成小块发送并存储到邮箱中,MFS支持用多个邮箱组成一个大的空间。
当前版本还不支持目录结构。

FTP服务

为了便于使用MFS,emboxFTP通过FTP服务的方式来提供访问接口。emboxFTP建立一个FTP服务器来访问MFS,通过FTP服务,我们可以使用标准的FTP客户端如NetAnts(下载)、

  • cuteFTP(上传/下载)等管理邮件文件系统中文件,如上传、下载、删除文件。
  • emboxFTP支持FTP端口的用户的配置,参看readme。
版权

本软件开放源代码,可以随意使用本软件的发布版和源代码,但请注意源代码中的声明。

下载
安装
  • emboxFTP采用Java编写,需要运行在JDK1.3以上,如果你的机器未安装JDK,请在http://java.sun.com/j2se/1.3下载。
  • 安装后首先阅读readme,并进行邮箱和ftp的配置,然后运行run.bat。
文档
  • emboxFTP开发特性表(虽然使用的是FDD(Feature-Driven Development,一种敏捷开发方法)的术语,但并不是按照FDD来定义的)。

关于构架的一些观点

12月5日聊天备忘——关于构架的一些观点

2002/12/10
参与者:张玮、魏猪头、marshine

12.5日晚,我和两位同事又来到KFC,来几杯可乐,找一个靠窗的位置,就开始天南海北的神吹。这是我们一些简单的乐趣,高升桥那家KFC是我们常去的地方。
在项目中,平常我们都会谈论关于构架的话题,然而“到底什么是构架?”,有人提出来。是啊,到底什么 是构架呢?有人说构架是项目的关键问题的决策,有人说构架软件逻辑结构的高级抽象;RUP中的构架是4+1视图,XP认为构架可以用隐喻(Metaphor)来表示,FDD看重领域模型在架构中的位置,也就是说,软件开发者时常挂在嘴边的“架构”(Architecture)并不容易找到一个标准的概念。
我个人比较同意“构架是项目的关键问题的决策”的观点,它应当有多个剖面(Profile),也就存在不同的对于架构的描述,取决于关注者的重点。
我们开始在各个方面讨论关于构架的一些概念,以及对项目的影响。后来张玮把它整理出来,这便是这篇小文的由来。


从某种程度上说,系统本身就是架构,那为什么还需要提出架构这种概念甚至由某个或某几个专门的架构工程师或小组来负责主要制作并维护这些架构呢? 实际上,不论是否有架构工程师、专门的制作架构的活动或架构文档,任何一个系统都是有它的架构的。 就好象大多数文章,不管它是否有目录,是否有导读,它都是有自己的结构的。架构是系统的形或系统的神;同时架构(在大多数情况下)还可能影响项目组成员的组织;架构可以起到提纲契领的作用。

人们需要架构来:

  • 了解系统--了解架构的目的就是(从某一个角度)了解系统,因此从这个角度上来说,架构就是为了交流(比如说某人对房子最关心的就是它的建筑面积),既然是为了交流,当然需要一个顶层的描述,从而建立起对系统的总体映象。
  • 做出并表达重大决策--描述架构是为了描述系统,但只有重大的决策才被列入架构。而这种决策是否重大,实际上从决定本身而言,项目中每个决定都是一样重要的,因此我们说某个决策是否重大,实际上是说这个决策对受众影响的重大程度及影响的范围是否更广,或者说要改变这种决策的难度的大小。
  • 平衡协调--预先制作架构是因为架构影响的范围广,程度深。范围广就意味着需要多方协调,同时架构还意味着对多方进行权衡(平衡),比如对多种需求多种技术进行权衡等。架构还可以用于多个小组之间的协调,它是多个小组之间的协议,同时它还包含多个小组共同的守则。有专门架构小组或专门架构师是因为架构是对多方面需求多种涉众要求进行权衡并做出的重大决定,而这些因素互相约束,互相牵制并互相影响,因此需要有专门的人进行统一的协调(集中制),当然也可能所有影响深远的决定由团队所有成员一起做出,统一进行协调(民主制)或有一种解决冲突并协调的机制(如隐喻,民主集中制等)。
  • 屏蔽影响--架构稳定就意味着影响深远及需要多个地方都发生改变的变化不会频繁出现。
  • 目录--就象一本书,需要一节前言来说明书的结构及表达的方式,如果你要想快速找到文章中关心的某一项内容,一般来说,你需要先查目录,架构也可以起到目录的作用。

认识到架构的这些特点,我们可以在应用中更好地使用架构:

  1. 架构就是系统,系统就是架构
    既然描述架构就是描述系统(中的重要元素),因此一切描述系统的手段都可用于描述及表达架构。
  2. 架构是重大决定,因为它影响深远
    1. 因此架构的确定方法与组织中确定大事的文化应相符,比如组织是一种民主制,则宜用民主制的架构方式,组织是集中制,则宜用集中制,如是民主集中制,则宜用民主集中制
    2. 架构元素应捡重要的元素说,所谓重要的元素,是指
      1. 共同的元素,

      2. 变化涉及多个部分的。

  3. 架构用于交流
    1. 因此描述架构的方法应用易于理解的方式来表达架构,比如简单,直接的方式,图画甚至动画等一切手段。
    2. 因此架构应该是面向不同受众的,比如用户和设计人员看待架构的角度就不会一样,他们的关注点也不会一样。比如一幢房子,用户可能比较关心地段、户型、面积等,而开发商可能更关心成本及收益等,而建筑商可能更关心其中的通用件是否多,是否容易施工。换句话说,如果给你十分钟对初次接触系统的人描述系统,对用户和对设计人员,编码人员,测试人员等你所讲的话肯定会不一样,但是它们又都是描述同一个东西的。

  4. 架构用于平衡协调
    1. 因此架构中应包含这两部分内容:划分的部分及各部分之间的接口,各部分之间共同的约定。

    2. 如果项目组本身成员之间的关系就比较和谐,协调比较方便,重大事项的决定可以集体决定,就可以没有专门的人负责维护架构(但并不是没有人维护架构,没有人维护和所有人维护是完全不同的)。

    3. 架构工程师需要有(技术上及人员组织协调的)经验。各种技术的平衡及协调也是架构工程师所需要做的一件重要的事情。

  5. 屏蔽影响一个好的架构应使系统趋于收敛,意即架构使系统变化引起的改变及影响越来越小。


附录:一些关于构架的描述

"Architecture" is a term that lots of people try to define, with little agreement. There are two common elements:One is the highest-level breakdown of a system into its parts; the other, decisions that are hard to change. It's also increasingly realized that there isn't just one way to state a system' architecture; rather, there are multiple architectures in a system, and the view of what is architecturally significant is one that can change over a system's lifttime.From time to time Ralph Johnson has a truly remarkable posting on a mailing list, and he did one on architecture just as i was finishing the draft of this book.In this posting he brought out the point that architecture is a subjective thing, a shared understanding of a system's design by the expert developers on a project. Commonly this shared understanding is in the form of the major components of the system and how they interact. It's also about decisions, in that it's the decisions that developers wish they could get right early on because they're perceived as hard to change. The subjectivity comes in here as well because, if you find that something is easier to change that you once thought, then it's no longer architectural. In the end architecture boils down to the important stuff-whatever that is.

---Introduction,Page 1.Patterns of Enterprise Application Architecture. Martin Fowler. Addison Wesley Published,2003

(2003-2-10)

Abstractly, software architecture involves the description of elements from which systems are built, interactions among those elements, patterns that guide their composition, and constraints on these patterns and interactions among those components. Such a system may in turn be used as a (composite) element in a larger system design.

---Chapter 1:Introduction,Page 1.Software Architecture:Perspecitiv On An Emerging Discipline .Mary Shaw,David Garlan. Prentice Hall Published, 1996 [清华大学出版社影印版,1998]

(2003-2-17)

CodeMetric项目

关于CodeMetric

CodeMetric是一个采用C#编写的代码度量程序,当前版本可以对C++/Java/VB/Delphi语言的代码行进行统计。
在开发过程中采用了TogetherJ 6作为UML的建模工具,并使用csunit作为单元测试的框架(csunit是属于XUnit的C#单元测试框架)。
虽然CodeMetric只是为了熟悉C#而开发的一个小软件,但CodeMetric在设计上还是充分考虑了系统的扩展性,可以很容易的扩展支持的语言和度量项。
同时CodeMetric支持统计的结果作为简单文本方式输出和XML方式输出。可通过制作不同的样式表来改变统计结果的输出效果,但当前版本没有提供确省的样式表。参看体系架构文档

下载

安装

CodeMetric采用C#编写,需要运行在.Net的CLR环境中,如果你的机器未安装.Net的运行环境,首先下载Microsoft .NET Framework Redistributable(.Net运行环境)。

文档

About Marshine

出生于四川安岳(号称石刻之乡),居住在成都,现在北京一家软件开发公司进行.Net应用开发。都说成都生活气息较浓(另说成都人比较闲散),不过我倒觉得有一种自由与轻松的感觉,当然还有美食和好玩的地方。
92年开始就读于郑州纺织工学院电气工程系自动化专业(学校现已改为中原理工大学,本想改得更为大器,却更像一所民办大学,就像什么黄河大学)。大学4年,生活简单却也自得其乐,上课、踢球、喝夜啤酒、看录像。日常生活基本没有异色,倒乐得清闲看了大部分计算机专业的教材。95年通过计算机程序员水平考试,算是大学里觉得骄傲的一件事;平常成绩平平,普遍60出头,偶尔70挂零,颇为中庸;自从小学里当过小队长,在事业上再无建树,大学当过微机原理科代表,只负责收作业、擦黑板,不能算是突破。
96毕业后到成都的一家小研究所从事电子产品开发,9个月设计电子线路,焊接电路板、调试电路,很辛苦,却也有创造的乐趣,后觉得电子产品设计太难,环境又不够好,没有成就感,灰心失意而去。
97年帮一个朋友做一套房地产管理软件,用的是Foxpro。独自呆在一个房间里3个月没日没夜的开发,出来后疯狂的想找一个公司,不为别的,只因这样白天有同事可以聊天。软件中骄傲的部分好像是居然用VF写了一个显示AutoCAD矢量图像文件的程序,要拿到现在,早到网上下载控件去了。这套软件算是我职业软件生涯的开始吧。
之后进入XX集团,开始使用Visual Basic开发一些小型的应用。1999年开始开发企业端的应用,这是我的第一个具有挑战性的项目:在4个月时间内开发一个同城客运车站联网系统(市场人员就是这样,那管开发者死活)。项目要求4个车站能够相互联网售票,并且工商银行能够连接到系统中,利用其终端售票。现在想来那个项目充满了风险,5、6个人,几乎不熟悉所有的关键技术:DCOM结构(当时MTS才2.0,还有很多问题)、SQL Server、分布式系统,Visual Basic语言熟悉的人也很少,按照Edward Yourdon的话就是一个“死亡之旅”。项目最后还是按照计划在2000年1月开始上线,虽然问题不断,系统基本上还是可以运行,紧接之后的2000年,我们利用10个月的时间开发了全新的2.0系统,并对原来的系统进行了升级。“死亡之旅”的结果是一半的人离开了公司,不过现在想来,当时的团队的气氛是很和谐的,积极性也很高,至今仍叫我怀念。
接下来几年,忙忙碌碌,时而关注什么公司发展的大事,有时也为“软件的未来”之类的事情做一些毫无意义的担心。关注软件工程那阵子,先是参加微软的MSF培训(Microsoft Solutions Framework,2000年),觉得没什么意义。然后是RUP,后来参加了公司的CMM3的改进和评估,越来越觉得国内的软件公司浮夸的多,真能进行软件过程改进的少,能有条理做好的我就看不见了(视野不够) ,所以对那些CMM什么的就再没多大兴趣。不过对怎样有效的使用像RUP和XP/FDD这些工程方法来进行小型团队的开发还是有点意思的。 基本上来说我没有固定的流派,有RUP/XP/FDD综合的影子。
2003年有过短暂的创业历程,和一位朋友一起开发基于.Net的字处理风格的XML文档发布系统,因为缺少资金的支持,难以维持生计,与年底时候终止。项目因为开发字处理内核花了大量的精力,希望这部分有机会能够得到发展。
平常主要研究研究OO和互联网方面的技术;喜欢使用Java,现在主要使用C#进行.Net应用的开发i;XML在刚出来时就很喜欢,不过现在被炒得成了时髦用语。因为所开发的项目大部分是企业应用,当然也离不开J2EE和.NET企业架构,以及数据库方面的技术。
跌落到一处枯叶覆盖的深坑,希望那儿曾经有先行者留下的提示;偶有感悟的惊喜,希望能与朋友谈谈,即便那不是真理。一些实践中的心得与各位交流。
联系:
marshine@163.com
http://www.marshine.net/