解惑

解己之惑,解人之惑

2007年4月 (第2页共4页)

问题多多

刚刚说到我们要迁移数据库,所以我就试验了下使用ODBC连接数据库,配置完成以后,可以连接,但是在选择表的时候有问题,里面只列出了oracle的一些包,没有列出任何一个表或者视图,加了一个Command,随便写了一个SQL,从我们的一个表里面取全部数据(select * from tablename),可以正常过,到了报表设计器里面可以看到Command列出的字段确实是SQL选择的那个表的字段,但是把字段添加到报表中,然后预览的时候设计器就死掉自动退出了。

打开Business View Manager,添加数据源,从那个里面可以正常的列出数据库的表和视图。

看来Crystal Report的代码重用没有做好,一些地方可以正常工作,但是另外的地方就不能正常工作了。

更新:
找到解决方案了,选择那个ODBC连接,右键打开菜单选择Options,在Data Explorer中把Stored procedures去掉就可以了。

数据库可移植性重要吗?

对于大部分应用而言,数据库可移植性可能不太重要,而一些完全使用ORM的应用可能也问题不大,但是一旦需求来了,它就变得非常的重要,现在我们就遇到了这样的需求。
我们原来一直使用Oracle,也从来没有想到要更换数据库类型,所以我们一直心安理得的使用各种Oracle优化技巧来优化我们的SQL(我们的系统的性能要求也比较高),现在有个新客户,要求使用SQL Server,这下就麻烦大了,初步估计需要5000个小时!
这个变化也影响到我们做的水晶报表,原来没有考虑数据库迁移,所以选择数据库连接的时候直接选择的就是Oracle服务器,而不是建一个ODBC的数据源,而水晶报表的数据库配置是不能随便修改的,不说更换数据库类型,就是更换一下服务名都不行。

PS:据说微软愿意为我们的数据库迁移支付一部分的成本,呵呵,果然是财大气粗啊。

没落的Java社区

感觉原来的几个Java社区日益没落,当然这个和Java世界的消沉有很大关系,这两年已经看不到什么大的Java新闻了,特别是对于Java开发人员而言的大新闻,原来Spring带来的各种火热的讨论也已经沉寂下来,Java世界似乎已经毫无新意了,现有的任何Java开源产品或者组件所能够带来的开发效率的提升都无法和新的脚本语言匹敌(我想这也是为什么JavaEye会使用RoR重写的一个重要原因,同时也是Robin转向研究Ruby的重要原因),在可以预见的一段时间以内,都不太可能出现一颗真正的银弹。但是我对于Java并没有丧失信心,因为Java依然拥有广大的开发人员以及丰富的开源产品和组件,现在所缺少的是一个真正简单并且易用的快速开发框架,提供Java Web开发所必备的大部分功能,开发人员所需要关注的仅仅是创建数据库和业务逻辑代码(不需要开发常见的CRUD操作代码),当然开发人员也不需要太多的配置就能够让整个系统跑起来(不需要Spring的Bean配置、Struts的Action配置、Hibernate的配置)。
就我个人感觉,完成这样的一个框架并不是很难,困难在于Java世界应该引入更多的规则而不是可配置,最起码可配置是第二位的需求,但是Java世界的人似乎已经习惯了配置,习惯了对象间的关系是在运行时通过读取配置文件来确定,也习惯了通过读取配置文件来组装系统。
对于多人并行开发的系统而言,Java的强类型约束无疑对于代码的可维护性和可读性更加有利,但是基础设施的严重缺失使得代码的开发难度加大,代码的重复性也因此加大(对于一个简单功能,由于Java本身没有提供,只能自己写、寻找其它的开源组件或者公司自己的框架提供,但是很多新来的人不知道已经有那样的功能,即使知道也是拷贝一份代码稍加修改)。
我相信现在有很多人都有和我一样的想法,也有很多人在做,包括EasyJF(简易Java框架),问题是他们并不能真正的普及,他们的设计者和维护者并不能得到大部分人的认可,而像AppFuseSpringSideJdonFramework这样拼凑起来的快速开发框架也不能解决问题(还是需要大量的配置),我期望中的真正的Java快速开发框架是完全重写的基于规则的框架,不需要配置或者只需要极少的配置(例如数据库配置),具有强大的Model和View的转换能力,可以很容易的将POJO或者POJO集合转换为各种页面组件(表格、树),不需要POJO和数据库的映射配置,不需要写CRUD代码,URL请求自动映射到Action。。。。。。

Command中不能添加多值的参数

有一个报表要进行统计,但是按照原来的做法都不太好实现,后来没有办法使用Command来获取数据(说白了就是直接写SQL),但是在Command的界面里面添加的参数的值不能是多选的,但是有一个解决方法就是把参数转换为一个字符串。
一个例子就是Command里面使用到多值参数的时候,就创建一个字符串参数,然后写SQL的时候就设置为:
xxx in ({?parameter})
假设外面的真正的参数是params,那么可以写一个Formula把param转换为那个字符串:
Local StringVar result:="";
Local NumberVar i;
for i:=1 to count({?params}) do (
if i<count({?params}) then
result := result & toText({?params}[i],"0") & ","
else
result := result & toText({?params}[i],"0")
);
result

这样就可以解决Command里面不能使用多值参数的问题了。

换了一家装修公司

由于原来的公司个我们使用的材料太差,我们换了一家装修公司,是同事推荐的,他去年11月份才装修完,感觉还不错。
从目前的状况看,这家公司还不错,做事的风格比较好,那个项目经理说话也很客气,每次打电话最后都要说谢谢,他找的工人也不错,感觉还比较有文化似的,他们来的第一天先把上一家弄到一半的拆旧弄了,把堆在客厅里面的拆旧的墙渣清理了,然后把房间也打扫干净了。
周末我们去买材料,本来想着一些涉及环保的材料才在九百家居买的,结果几乎全部在里面买了,还好没有超支太多,另外那个经理给的参考报价好像也是这些建材超市的报价。
现在新的装修进程正式开始了,但是岳父身体不适回家了,而我爸妈又不能来,只能靠我们自己了,好在老婆就在新家附近上班,中午的时候可以去看,而我打算每周三的早上到那边看看情况,然后周末也多去一下,也问了下那个同事,他说原来每隔两三天去看看,主要是看看装修的结果是否和自己设想的一样,不是的话及时纠正。
哎,装修真的是一件很烦心的事情,难怪原来大连的一个好友让我买二手房,买别人装修好的。

痛苦的Crystal Report

这个阶段的任务包括修改一些Crystal Report,从我最开始研究Crystal Report时我就很讨厌做这个,因为没有什么共享的机制,各种格式要在创建报表的时候一次一次的重复,各种字段的显示格式也是,而我最讨厌的就是做重复的工作,而且特别讨厌做格式化的工作。
另外,你永远工作在一个沙箱中,很多时候你平时编程中使用到的东西在创建报表的时候就不能用了。
当然,一个可能的原因是我对这个东西并不是很熟悉,另外我对写SQL也不是很在行,所以在创建复杂业务逻辑的报表的时候问题就更加的严重。
但愿写报表的日子早点结束。

收到银行的还款计划

今天收到了银行的还款计划,从第一个月起到最后一个月的,每个月要还多少钱,本金多少,利息多少。我选择的是等额本金法,因为前期我们的压力也不是很大,以后肯定会提前还款的,加上我不会炒股什么的,所以使用等额本金法比较划算。惟一让我不太理解的是第一个月的利息比后面的多不少,不知道为什么,要仔细查查了。
另外产证下来了,应该把大连的公积金取出来了。

2007年4月13日更新:
第一个月的利息比后面多不少是因为银行放款是4月5号,而我第一次还款是5月20号,这样第一个月相当于要付一个半月的利息。

也谈Java基础的重要性(续)

呵呵,意犹未尽,继续批驳。
banq先生对自己的思维和真正想法并不是了然于胸,我想他不关心的是业务逻辑的实现了,他说他已经很多年不去翻J2SE了,那是因为他已经很多年不是“程序员”了,他不需要使用他的框架去完成一个实际的业务系统,你把这个框架做了,你鼓动别人去使用框架,去学习设计,还有意义吗?如果别人都去提高学习了,都去设计了,就不会有人用他的框架,而如果别人都不用,那他搞那个框架又是为了什么呢?
他说他自己对J2SE都忘记了,那么他是如何完成这个基于Java的框架的?难到都是拷贝别人的代码,然后就是debug?

再说他所谓的向上思维和向下思维,其实不是思维问题,而是开发方法问题,他所谓的向上思维是敏捷开发所推崇的,自底向上实现系统,发现问题就不断的重构系统,而CMM/CMMI以及RUP之类的开发方法就崇尚自顶向下实现,也就是他所谓的向下思维,这些方法的优劣现在本身就没有定论,也不会有定论,需求的不同导致使用不同的开发方法有不同的效果,IBM之类的大公司接单子都是预先浪费了无数的时间确定需求,然后签合同,完全按照合同的内容来执行,他们有资格使用自顶向下设计;而广大的中小软件公司没有那个本事,可怜兮兮的拿下一个单子也只能当孙子,客户让怎么改还不是怎么改?能拿到钱就不错了。所以这些公司使用自底向上就很自然了,因为快捷简单,能够更好的应付需求的变化(当然,要做好也非常的不简单)。

一个新技术不必关心它是如何做出来的,而是重点研究是如何使用它,使用的场合和条件是什么,这些就是模式啊”,天啊,这个是模式吗?模式是程序内部的设计好不好!怎么会和技术的使用场合和条件扯上关系呢?

如果我说不学习"数据结构,操作系统,编译原理,数学",照样可以作出架构优质的高性能Java系 统,你可能不惊奇了,Collection和数据库技术已经就是依据数学结构做出来的,你学了数学结构,自以为懂了很基础知识,碰到 COllection,你就会自然去打开看看,自豪运用你的数学结构理解它一番,可是这些对于你如何使用COllection根本是两个领域的知识(如何 使用Collection是模式领域知识),这些都是先入为主造成浪费时间,能力不足的表现
呵呵,他的那个叫做“作出”的吗?据我所知充其量是拼出来的,系统最核心的部分都是别人的(当然,这个也不惊奇,因为他最自豪的就是可以看懂别人的设计和使用别人的成果),当然不需要数据结构了。学习Collection的实现会浪费时间吗?看这个对于设计能力难到没有提高吗?看别人的设计就是能力不足了,想想自己当初是怎么学习设计模式的!
算了,不说了,记得原来gigix就写过一篇文章批驳过他的。

也谈Java基础的重要性

呵呵,看到JDon上正在讨论j2se基础的重要性,忍不住也来说两句,可以这么说,我是完全反对banq的说法的。
我不知道banq的功底到底如何,但是对于指导初学者,我觉得他完全不合格。
编程,在大多数情况下是简单的,这个可以从印度大量使用高中生编程照样可以开发出稳定大型的系统可以看出来,而且以我的经验来看,做对日外包也是一样,因为他们的设计文档已经写得足够的详细,他们提供的底层框架已经足够傻瓜(和设计文档相配合),在这种情况下,编程并不需要太多的技能,显现水平的方式就是对框架API和底层API的熟练程度,熟悉了那些API差不多就可以了(而且本来就有详细的API文档),只要可以编译通过,基本上就是验证业务逻辑是否符合需求的问题,再拔高一点,万一框架出现问题,是否有能力解决问题,这个就是全部了。
而banq先生才是恰恰误导了广大的初学者,把编程和设计混为一谈,banq先生一直考虑的都是上层的事情,都是架构和框架方面的内容,这个不是所有的程序员需要掌握和有机会掌握的,我看得太多的程序员工作了好多年,但是对于如何设计一个完整的系统还是一无所知,当然这个也不能全怪程序员,因为这个社会的大部分分工都是金字塔型的,顶层的人员的需求总是少数的,也永远只有少数人有机会去一探上层的内容。

回到编程,banq先生说OO是自然的,这个绝对是荒谬的,一个人做事情,他是按照一定的工序做的,这就像流水线一样,所以在完成简单工作的时候,OP才是自然的,你查看任何OO的系统,系统中把OO连接起来的那些代码绝对是OP的,只是这个过程,是代理给一些对象完成的,但是总归会回到主流程,为什么Java需要一个main方法?因为这个是这个过程的开始点。计算机处理程序也永远是过程式的,计算机不会理解对象,也不会理解对象之间的关系到底是怎么样的?那么为什么现在OO流行呢?因为OP在处理复杂系统的时候力不从心,这个是一个人为的提升过程,其实就是将OP中相关的方法和变量进行更好的封装,增加了一些OP所没有的特性(继承,信息封装),这样,我们在完成复杂系统的时候,代码的关系更加的清晰,我们也不用在程序执行的过程中声明太多的变量,也不用把一个过程定义得太复杂,OP这个过程中需要使用到得信息和方法被切分成很多独立的对象了,外围的程序通过调用这些OO的内容完成原来的OP的同样过程或者类似的过程。OO并不是最近才出现的,而是很早就出现的,可能和OP的出现一样早,为什么OP先流行呢?因为它“自然”简单,从头到尾一目了然,为什么OO那个时候没有流行起来,因为它理解起来比较别扭,而早期的计算机系统处理的任务都非常的简单,很多都是完成数学计算的。而计算机的速度越来越快以后,我们让计算机做的事情越来越多,越来越复杂,这样的系统的设计实现使用OP来做已经很难维护了,使用OO的方法就可以把系统切分开,很多人完成,定义相互之间的关系,然后使用OP的机制把他们连接起来达到我们的目的。

以装修为例,古代的装修很简单,可能就是编个挂毯挂上就行,任务的完成过程很简单,现在的装修呢?需要监理、水电工、泥工、木工、油漆工等等,监理负责任务的调度,什么时候水电工到场,做到那个程度,然后泥工做什么,木工做什么,在这个过程中,工种之间还需要协调配合,如果把所有的这些都丢到工地上(材料、人员和工具),会是一个什么样的局面?假设我们那么做了,可能工程还是可以完工,但是这个风险要比经过良好调度和分配的过程大得多。材料就好比对象的属性,人就好比对象,工具就好比私有方法,而他干的工作类型就是公共方法(例如木工做一个柜子,做门套,泥工拼地砖墙砖),监理就好比外围的程序(有时候监理也是对象,如果从房东的角度看的话,只是他需要的材料就是那些“工人”,对外的公共方法就是装修完,也有状态查询方法),监理关心的是人的调度以及让他干什么,而人知道怎么完成自己分内的工作,怎么用自己需要的材料和工具。

你是否精益求精?

有时候感觉自己做事情太精益求精了,比如说写代码,我写的时候不注意格式,但是写完存盘之前肯定要格式化一下再存盘,另外也很注意是不是有警告信息,我自己维护的代码是肯定没有警告的,不使用已经deprecated的方法,不导入任何不使用的包或者类,如果一个类实现了Serializable,那么一定要给那个类生成一个serialVersionUID,如果看到其它的不符合这些的代码,就感觉有点厌烦,好在我一般看的开源的一些代码做得都还不错,厌烦得时候并不是很多,但是项目里面得代码就不太一样了,一共有9577个警告,这个还是关闭了XML和JSP的校验的结果,另外我们的资源文件里面的重复的主键非常的多,使用我常用的那个资源编辑插件打开的话也是满眼的警告。
虽然有时候感觉自己这样有点吹毛求疵,有时候为了达到自己的标准要做很多“不太必要”的工作,会很累,但是如果是自己经常需要接触的代码,发现这些问题的话我还是会不厌其烦的把它修改到让自己满意为止。
这个好像就是心理学上所谓的强迫症吧。

更早的文章 更新的文章

© 2025 解惑

本主题由Anders Noren提供向上 ↑