星期三, 一月 31, 2007

开源共思

“开源”,出自自由软件社区,意指软件开发人员或软件公司在发布其软件产品的同时公开其产品的源代码,以帮助产品用户更好地理解和使用软件。根据不同的授权协议(GPL、LGPL、APL...),用户拥有不同的使用权限,比如修改、引用、甚至商业化等等。最著名的开软件莫过于Linux、Apache、Postgresql,在它们的带动下开源社区人丁兴旺,高手辈出,新软件好软件层出不穷。现在可以毫不夸张的说,无论个人用户还是企业用户,都能在开源世界找到适合自己的解决方案,当然有时候开源软件的易用性不如微软或苹果的软件出色,但在功能上决不逊色于任何专有软件,所以适当的培养自己的动手能力会有助于你更好地享用开源大餐。那么我们能从轰轰烈烈的开源运动得到些什么启发吗?我个人认为是肯定的。每一个优秀的开源项目背后都会有一个出色的社区,就是通过这个社区分布于世界各地的程序员才得以交流协作,打造出优秀的开源软件。开源社区并不是一个简简单单的自发组织的、虚拟的网络社区,它根植于]理乍得·马修·斯托曼 (Richard Matthew Stallman, RMS,生于1953年)式的黑客文化和信奉民主、自由的社区精神。在这种类共产主义信仰的驱动下,每一个社区成员都处于积极奋进的状态,相互之间能够紧密协作,创造力源源不断地注入社区,反过来激励更多的成员投入到创作之中。我想,我们最需要关注的就应该是整个开源社区的背后蕴藏着的那些东西。现在但凡有个把人的公司都会大谈团队精神是如何如何的重要,但能真正形成一个良好的、自组织模式的团队的公司还不多。那么为什么开源社区能比公司团队以一种更有效的方式组织在一起,我想,主要是因为“开源”这个神奇的词汇,开源社区的成员都是“开源”的拥护者,而且不仅仅是软件开源,更重要的是他们之间的思想也是开源的,相互之间能够真正的坦诚相待。而公司团队由于个人之间存在的利益冲突,往往不能做到就事论事,进而影响了团队的凝聚力。简单的就是美的,有时候思想简单一些可以促进我们自己成长和周围环境的和谐。如果我们的思想也能够开源的话,那么你我之间就更近了一层。借用一下“开源”的意念,让我们共同倡导“共思”(Open Thinking)。 

星期四, 一月 25, 2007

Behavioral differences


Method
Parameter format
Lookup failure behavior
Usage example


ClassLoader.
getResourceAsStream()
"/"-separated names; no leading "/" (all names are absolute)
Silent (returns null)

this.getClass().getClassLoader()
.getResourceAsStream
("some/pkg/resource.properties")


Class.
getResourceAsStream()
"/"-separated names; leading "/" indicates absolute names; all other names are relative to the class's package
Silent (returns null)

this.getClass()
.getResourceAsStream
("resource.properties")


ResourceBundle.
getBundle()
"."-separated names; all names are absolute; .properties suffix is implied

Throws unchecked
java.util.MissingResourceException
ResourceBundle.getBundle
("some.pkg.resource")

星期四, 一月 11, 2007

Compiere 实施步骤

1.产品漫游—以熟悉 Compiere 应用程序

2.实施方法 —参考

3.测试—可参照Compiere 的示例实体"Garden World"

准备

您可能需要准备账户、业务伙伴和产品的导入。尽管您可以在之后进行所有记录的导
入,但若设置账户导入则会节约您的时间。在初始化阶段,提供对 CSV(逗号分隔
值)导入的支持,其中 CSV 文件含有预定义的属性列表。这是 导入 工具完整版的子
集,您可以在稍后使用。

账户&CoA(会计科目)

关于会计科目设置的详细资料请参考 这里 。

初始化实施

您需要以系统管理员身份以进行初始化实体的设置。

此程序将创建用户、角色,及单据类型、业务伙伴、产品等的"标准"实体。在运行
后,您可以创建及打印第一张发票。

设置程序将创建两个用户: "实体级别"角色的用户,具有维护规则和进行事务处理的
权限。 "组织级别"角色的用户,具有进行事务处理的权限。

精化实施
完成初始化实施后,您已经可以开始 Compiere 的运行了。但是你可以去"初始化实体
设置"工作流程以检查、更新。

Compiere 实施方法

Compiere 被设计为支持快速上线。主要优势在于 Compiere 独特的技术特性 - "上线
后的结构更改"(请参考" 信息结构 "),让您能在上线以后进行任何更改。这使得没
有必要存在非常细致的分析和配置阶段,因为" 如果您忘记了某些东西或设置错误了
什么"那么重新实施不是一个好做法。在许多 ERP 项目实施过程中发现必须进行某个
主要变更,又或者发现了某些遗漏,结果导致上线之前不得不重新实施,造成资金、
人力、设备和时间的浪费。

因此,这里为快速和方便实施提供了一些指引。其中的大多数,实际上不仅应用于
Compiere 这一 ERP 的实施 - Compiere 不过使它更容易罢了。

技巧 1 :尽量使用固定期限的实施合同,并坚持它。这可获得预定义交付(实施服
务)的公开价格。

成功案例(Use Cases)

用例(Use Case)是一个业务过程,比如订单输入、收款、发货等。基本而言,它是
您在业务开展中所做事情的清单。创建3种类别:

(1)紧迫 - 运营您的业务所必需的基本业务流程。

(2)便利 - 使业务流程更快、更容易、更有效。

(3)支持 - 帮助做出正确的决策、报表、分析...

有意思的是,在许多实施中,优先级似乎恰好被弄反了,这很令人吃惊。优先级(3)
提供了更高的信息级别,所以常常是战略决策的催化剂,因而它们是重要的,但优先
级(1)确保了您能够得以制定战略决策。软件供应商的售前活动通常完全聚焦于优先
级(3)上,并且咨询公司也因此而繁荣 - 不过,请考虑优先级(3)中有多少是必须
等到上线以后方能做出决策的。

这样说来,原型阶段应持续多长时间呢?这依赖于您的风险级别,至少优先级(1)的
所有用例应当准确工作。在此基础上,您的感觉更好,主意自然妙,轻松确定下一步
将完成的优先级(2)和(3)用例。

优先级(1)的用例工作正常时,您肯定无法进入负面的媒体报道标题了。

原型(Prototype)

每个产品都有它自己的方式去完成目标。如果您强制让 SAP 的行为像 Oracle
Applications 那样,或者像您现存的实施那样 - 那么无疑就增大了失败的风
险。Oracle、SAP、PeopleSoft 等商业应用系统实施的公开失败案例中,全都归入此
类。通常,失败与产品无关,而是实施者及客户所持的不现实期待和呆板态度所导
致。

因此,您如果要获得成功则需要一个操练场,以了解实现目标的最佳方式以及备选方
式。如果您暂行规定此阶段,那么您的上线系统其实变成了您的原型。Compiere 不会
介意这一点,并将精确地工作,然而您不过在系统中放入了一些测试数据而已。

技巧 2 :所有的上线系统都包含一些"杂音"数据,因此不必尝试拥有一个100%干净的
系统。如果在 Compiere 中无法删除这些"杂音"数据,那么可以隐藏它们(以满足一
致性的要求)。

尽早引入全部用户

变更有时不会受到热烈的欢迎。许多项目集中于"超级用户"或"用户代表团",限制了
给正常运营带来的打扰。适度则没问题,但请尽早引用所有的用户。

原型阶段的结束通常是进行总体导入的好时机。此时人们可尽情使用或肆虐系统,而
不会产生什么负面后果。您也可趁机获得非直接的确认,即覆盖了优先级(1)中的全
部问题。

因此,请将您以及超级用户们的 Compiere 解决方案展示出来,甚至开一个 Party,
让所有人都看看并试用您的杰作 - Compiere 系统原型。

迭代式开发

请习惯于循环:

设置较短时间内可完成的、较小的目标
让它工作
为下一次迭代总结经验
" 大爆炸 "方式 - 一切都同时开始工作 - 则使目标难以达到。

某些方面您可能第一次不能正确处理,所以小步骤产生的成功经过不断累积(即使遇
到"事故"也可快速恢复),就可完成最终目标。

上线以后

既然业务运营已处于上线状态中,您就有了时间和知识可以开始调查,Compiere 在业
务的策略方面能够怎样帮您。这使您得以更好地利用 Compiere,因为您已经对系统有
了更多的理解。

技巧 3 :为两个项目做出预算,一个是上线实施项目,另一个是上线6个月以后的项
目,用以完全发挥 Compiere 的功能。

对于6个月后的项目,如果不考虑计划的详细程度,需要决定的是:早实施还是晚实
施。用户不会再有变得惊慌的理由,"会议室驾驶仓"(或"Compiere 见面会")可以为
他们提供良好的培训基础。

Compiere 最大的优势这时就表现出来了:

已改变的优先级,新的业务和市场开发,或者新的视角要求改变 Compiere 的设置。
不久之后,您的用户将变得适应,并将更进一步地控制系统。

Compiere 允许从绝大多数情形下轻松恢复,因为它被设计为" 自恢复 "。

一切听起来不错。当然,使用软件支持服务,可以将问题的后果最小化。

切换上线

需要决定一个问题:是否并行运行。众所周知,并行运行意味着双倍的工作。因此,
在您的"Compiere 见面会"中,要与您的用户商量,看看他们是否对系统切换感到适
应。

技巧 4 :"用户认为无需并行运行"是一个重要指标,如不考虑(项目经理做出)是否
并行的决定。

真实系统

不要等到"一切"问题都解决。那样可能永远也解决不完。因此,在您删除了原型(的
确如此!)以后,开始使用新的实施和真实数据。

在这个阶段中(记住,您挑选出了所有的紧迫问题),主要的挑战是从已有系统将数
据迁移至Compiere中,并做必要的定制工作。

一个重要部分是小型但正式的"会议室驾驶仓"(您可在此模拟驾驶仓尝试 Compiere
飞车,无需系安全带)。在备份以后,您给予用户了解和尝试系统的机会。不要只计
划一次"会议室驾驶仓",完全可计划三次或更多,这依赖于实施的复杂性。这些
"Compiere 见面会"不应过长,用来帮助传播消息和减轻转换带来的心理压力 。

"会议室驾驶仓"也是对您的备份与恢复过程的检验。

获取经验的另一途径是升级和打安装补丁。Compiere 使得它们很容易,通过这些设置
可以获得经验。

背景

上面推荐的实施方法正变得越来越流行。基于 快速原型法 的方法论已经出现了较长
时间。 XP (极度编程 )是快速 、安全交付新技术的方法论(软件开发流程)。只
需用实施任务替代编码的部分,它就非常适用于应用软件实施项目。要了解关于 XP
的更多信息,请检查 Google 。

Rational 的重量级流程 Rational Unified Process(RUP)近来已从强烈反对 XP 转
为拥抱它。现在,Rational 为 RUP 提供一个 XP 插件。

Compiere 的会计科目

Compiere 需要用到一套账户用于系统操作,即便其中某些可能永远不会用于过账
(例:如果您没有外币事务处理,则像已实现盈利这样的账户将不会被用到 )。当创
建实体时,Compiere 需要创建一套默认的账户(会计科目) 。

AccountingXX.xls / AccountingXX.csv
文件 AccountingCN.xls、AccountingHK.xls 和 AccountingTW.xls分别对应于中国大
陆、香港和台湾的基本会计科目(包含于 QuickIT 实施工具包 的会计科目模板中
)。

文件 AccountingXX.xls 是导入和维护您的会计科目表的基础。

文件名中的 XX 代表国家或地区代码 - 因此文件 AccountingUS.xls 是美国风格会计
科目的良好基础。

您初始化新的实体(初始化实体设置)时,文件结构要求保持不变。在此阶段,仅必
填科目被导入/创建(在 Account_Default 中包含了值 - 第 H 列)。

在初始化设置以后,您使用它导入您的科目层次,或用于报表。为此,您可更改导入
格式以满足您的需求。

请注意,文件名只是一个建议。会计科目的早期结构对应于文件
NaturalAccount.xls/csv。文件 AccountingXX.xls/csv 的结构是一个超集。

如果您修改了文件,则 必须导出 .xls 文件为 .csv (逗号分隔值)格式,因为
Compiere 只能读取 .csv 文件。导出的结果文件应当位于 %COMPIERE_HOME% 的
"data/import"子目录下。

术语

会计科目 (CoA) = 自然账户的列表 - 它随 Accounting*.xls/csv 文件提供
账户 、 组合 或 有效组合 = 会计分段组合的值;分段在会计模式中定义
如:01-1600-HQ-应付账户(此处是公司和自然账户)
自然账户 = 账户分段 - 在您账户结构中的元素;这是您在 AccountingXX 文件中导
入的内容
如:1600 - 应付账户
细节 - 创建您自己的会计科目

您需要有不同的账户对应于每个默认账户。例如,即使您不想或不需要区分货币盈余
和货币亏损,Compiere 仍然需要这两个账户。您可合并科目,比如通过总账日记账分
录。
Compiere 需要最小集合的账户。这些账户由"Default Account"列的内部列名标识 -
例:B_ASSET_ACCT
您可更改、添加或删除某些行,只要存在一行对应于每个默认账户即可。
如果您不喜欢提供的示例会计科目(CoA),可采取如下步骤 :

更改行(值/关键字、名称、描述),以符合您的会计科目
删除所有的行,但含有默认账户的那些行除外
在您的会计科目中添加其它账户

各列的解释,可参考 Accounting*.xls 文件中的注释。注意,列名仅作为说明之用,
可以修改。

A - 账户_值

自然账户必须填写的主键(完全用户自定义),可以是数字或字母-数字,长度不超过
20个字符。请注意,每行必须唯一。

B - 账户_名称

自然账户必须填写的名称(完全用户自定义),长度不超过60个字符。

C - 账户_描述

自然账户可选的描述(完全用户自定义),长度不超过255个字符。

D - 账户_类型

必须填写的账户类型(如资产、负债、所有者权益、费用、资产、备注)。请注意,
首字母必须是 A、L、O、E、R 或 M。例如:"L - 负债"代表中文的负债账户类型。

E - 账户_符号

可选的账户符号标识(当前未实现,计划用于财务报表)。可选项包括自然(默
认)、借项和贷项。请注意,首字母必须是 N、D、C 或为空。例如:"D - 借项"代表
中文的借项账户符号标识。

F - 账户_单据控制

可选的账户单据标识(换言之,该账户仅能通过分类账过账,无人工日记账分录。为
简化科目对账,推荐这样做)。请注意,首字母必须是 Y、N 或为空。例如:"Y - 是
"代表中文的"是"账户单据标识。

G - 账户_汇总

必须填写的汇总账户标识(换言之,您不能过账到汇总账户,它们仅用于报表)。请
注意,首字母必须是 Y、N 或为空。例如:"Y - 是"代表中文的"是"汇总账户标识。

H - 账户_默认

可选的默认账户分配,这是账户的默认分配列名称。这是实际的列名称,请勿修改其
内容。您需要让所有默认账户至少存在单独的一行与之对应,且需要让所有的默认账
户被列出。

例如:B_INTRANSIT_ACCT 表示该账户是默认的银行在途账户。您可能不会用到它,或
希望为每家银行使用不同的在途账户,但是您仍然需要包含此行。

I - 账户_父

可选的父账户账(列 A )。它需要精确匹配。用于在您导入会计科目表时建立账户层
次。请注意,该列在初始化实体设置的过程中会被忽略。

J/K - 资产负债表_值,资产负债表_名称

可选的资产负债表行值/主键与名称。用于创建财务报表行集合。导入格式已经预定
义。

L/M - 美国1120资产负债表_值,美国1120资产负债表_名称

可选的资产负债表行值/主键与名称。用于创建财务报表行集合。导入格式已经预定
义。在这里,它以美国税代码的 Form 1120 为基础,不同于标准的美国资产负债表结
构。

N/O - 损益表_值,损益表_名称

可选的损益表行值/主键与名称。用于创建财务报表行集合。导入格式已经预定义。

P/Q - 美国1120损益表_值,美国1120损益表_名称

可选的损益表行值/主键与名称。用于创建财务报表行集合。导入格式已经预定义。在
这里,它以美国税代码的 Form 1120 为基础,不同于标准的美国损益表结构。

R/S - 现金流_值,现金流_名称

可选的现金流有行值/主键与名称。用于创建财务报表行集合。导入格式已经预定义。