订阅本站

项目管理–经验之谈

中國壹石頭 发表于 2010-4-30 分类 软件工程 | 发表评论

工作五年,一晃已年过三十了。读研时,独立做项目,毕业头三年,主要在大公司工作,后来,也就是08年,半创业。具体点,合伙人吧,自己负责IT部门,到现在6人,公司总共20来人,旅游业。这两年严酷的创业经历,让我越发觉得管理(做事),以及领导(带人、待人,不是管人)的重要性。因为,随着组织的扩大,混乱度无形中就会增大,管理和领导,就是让这种混乱重归有序,重归单人作战那种意图和行动的高度统一。

说得功利点吧,一个人的财富和其影响力是成正比的。影响力本质上就是对他人的价值。比如,郎_xian_评的出场费一天超过15万。作为技术人员,如果我们只能影响周边几个人,那么我们凭什么拿那么高的报酬,除非我们做的事情影响了很多人,比如杨勃的豆瓣网。所以,我还是觉得,技术人员往高处发展,逐渐应该有管理意识、培养自己的管理能力。技术从书本上可以学到很多,管理还真得实践,书上看到的,你觉得很弱智的问题,比如盲目扩张,自己亲身经历时,一样会犯,也许是行为习惯在起作用,看书不足以改变行为。回到正题上。也许是自己曾经在较大公司或团队的做事习惯和视野,刚创业时,用在这种小团队的商业项目开发上,几乎惨败。先说项目开发这块吧。

大家知道,项目管理和过程管理是两码事,前者关注目标和进度,成本和收益;后者关注做事流程、方法。
项目管理,体会最深的,就是目标和任务分解、进度控制,以及沟通。

项目管理软件
从大公司出来的人,我想最喜欢玩的,就是借助于项目管理软件(核心是甘特图)。市面上的大多数知名的项目管理软件,无论是桌面版还是网页版的,我都试过。当然最后也选择了一款:ConceptDraw Project,用了一年多,也多少有些用。但最后还是发现,它其实对项目进度和质量关系并不大。也许,一个Excel表格更实用。

项目管理软件,本质上是解决一种沟通和职责分配的问题。比如,一个项目,折叠成一个三层树形结构,老板只关心第一层,也就是整体进度;中间是项目经理关注的功能层,最后一层,也就是具体的任务,是开发人员关注的。想想,如果没有这玩意,你怎么告诉其它项目干系人进度?但又引出几个问题:

靠文档来沟通,还是靠信任? 太在乎文档,往往导致每天去关注文档如何漂亮、有说服力,并为此花大量时间,而不是项目如何漂亮。另外,是否有文档就可以防止扯皮、兑现承诺?我们是关于项目目标,还是关注彼此的博弈?

进度偏差 创业型项目,往往都是以前没有接触过,其进度评估往往有很大误差,比如业务需求的挖掘和变化,技术难点,开发人员素质。我们是关注进度,还是关注项目本身的质量?两者都要,但如何兼顾?虽然有方法学,比如砍掉优先级低的,但你怎么让老板相信某个核心功能就得四天时间。

在我们的进度设计不合理情况下,是否开发人员完成甘特图(WBS)下的任务就ok?远远不够,任务分得太细,往往限制了开发人员的创造性和自我评估能力,如果提前两天完成呢?

我们现在是以项目管理软件为辅,任务的下达主要以邮件传达,每周一上午的周例会会白板宣布。我发现白板比投影仪PPT好用。

关于规范
这也是大公司特别喜欢玩的。
也许我们前期会制定一个的架构、设计文档,代码规范,这有一个规范建立的时间成本以及规范本书的合理性,再说如果一个开发人员,特别是高手,如果不认同你的设计和规范,你要强推,他要么走人要么怠工。规范的本质是为了协作和后期可维护,如果只有两个人或一个人写某个模块,你觉得有这个必要吗?规范整洁的代码,在项目初期,对用户的价值关系很小,你会关心豆瓣网的js代码写得很漂亮吗?我们应该关注代码的健壮性而不是可维护性,我们不是在开发 Windows。

人适应项目,还是项目适应人
大公司,往往是来了一个项目,赶快招人,人来适应项目。小公司呢,我现在的看法是,项目适应人。小公司,往往一个项目做砸,公司就面临解散。所以,我认为,最好还是按照开发人员的擅长,保证功能质量,最快的速度上线。另外,为了达成进度,可以在上线初期砍掉不太重要的栏目或功能。

我在这个上面栽过跟头的。比如开发人员的擅长,如果他擅长jsp开发模式,而不是Hibernate+Spring的分层开发,就让他按自己的意思做吧。因为,创业型项目都不会太大;即使技术实现你感觉完美了,用户可能感觉不爽;再说,项目开发,涉及到业务调研、需求分析、原型界面、架构、开发、部署、推广。开发,也就是代码实现,占去项目时间,也许不到30%。项目如果证实有商业前景,代码重新实现一遍,花不了多少时间。
但我也深深地意识到我们项目管理的级别,就如同CMM1到CMM4。但我还是觉得目前是最好的选择。
如果最低层次的用户需求目标都达不到,直接考虑代码怎么有可扩展性、可维护性,对于小公司就是找死。
另外,尊重和信任、支持开发人员的技术选择,往往是一种激励、增强团队凝聚力的方式。万众一心,比什么目标、进度更有效、实际。
我们应该培养一种团队成员的内部创业心态,而不只是敬业。

在进度把控上,我现在更倾向于强调我们的项目目标和紧迫性,而不是他们的任务。因为我希望大家的关注点是项目,而不是他的上级,他应该对项目负责,而不只是对上级负责。

说说沟通
项目管理中最难处理好的,就是沟通。以前,我比较关注于工具,如邮件、文档、ppt讲稿会议,逐渐我关注效率和效能,特别是态度。沟通最基础的就是态度。如果网站上线后,订单提交出现一个核心bug,你是直接找开发人员问责;还是告诉他哪儿出了问题,这个问题的严重,并且自己反省,比如测试流程出了问题。出现这种事情,也许需要负责人举重若轻的气度。但更深层次的,如果负责人能够培养其员工质量意识,危机意识,才是治本。因为一个有强烈质量意识的团队,他自然会去对代码健壮性、功能易用性精益求精,自然会去配合测试流程。
刚才那个沟通问题,对开发人员的态度,前者是负面,后者是中立。那么前者,开发人员的反应是如何不让领导下次责怪自己,比如只做领导安排的事情;后者的反应是怎么去改进,不让这样的事情发生。
如果你认可创新就可能出错,如果你认可开发人员都是想做好的。那么所有的事情,朝正向发展迈出了最决定性的第一步。

沟通:命令式还是征询式
在沟通,特别是下达任务或做决策这类事情上。应该说中国绝大多少管理者都是用命令式。我过去经常在用,但一直在试图改正,改用建议式和征询式。管理者最需要、最难开口的一句话是:Do you think so?命令的方式,经常出现下级不能理解上级的意图,严重的出现抵触。每个人,其实都喜欢别人按自己的想法做事,但你怎么知道自己的想法或决策是对或不是偏颇的,怎么让团队愿意去执行?去征询团队其他成员的意见,让他们参与,往往能够培养其主人翁意识、责任感、向心力,还能够完善自己的想法。但要将员工参与意识,转化为一种习惯,太难。
当大家都没有主见时,需要领导者的果断、魄力和强势,但这种机会并不多,而且这种情况,需要团队成员对领导者的信任。

遵守制度,还是建立信任
在大公司,往往是告诉你怎么去遵守公司制度。在小公司,我认为最基础、最核心的一件事,就是建立信任,让团队信任你的人品(说到做到),信任你的能力(能够把大家带到一个新的高度)。建立了信任后,下一步的核心工作,怎么将你的个人目标,也就是团队目标,转化为每个成员的个人目标。
有了信任这个基础,才会有了团队建设的第二个核心:激励。
是激励,而不是约束、监督,让团队有战斗力。但大公司往往喜欢后者。也许,大公司都是职业经理人,反正是打工,太关注于事。如果说有个所谓的中国式领导,我觉得就是以人为本,对人的尊重。人的关系处理好了,事情就好做。
加班、考勤、上网监控,这类对信任、激励极具破坏力的行为,也许是工业型社会对我们这个思考性创造性行业的侵蚀。知识型劳动者,需要一种与体力型劳动者完全不同的管理模式,这种模式也许需要一个从萌芽、生长到成熟期。现在在目前的中国,还只是刚走出萌芽期。

以前完整看过余世维的11套视频,还看过几遍。他那种人本理念我还是很认同,只是,他在大公司、规范公司的做事情方法和风格,完全照搬拿到小公司,非常危险。你能够拿幼儿园那种教育方法来教育成年人吗?小公司不具备大公司那种职业化的环境,也不具备大公司在行业中的市场地位及资金实力。
如果说大公司讲究做事方法、流程,如SWOT分析法、BCG矩阵,小公司更看重灵活性、市场适应性。小公司应该适当短视、急功近利,否则在你实施一个三年计划时,第二年还不赚钱可能就撑不下去。
所以我觉得,在跨国大企业呆惯了,出来创业很危险。一个是做事方法不适应,另外一个就是没有平台。如果要出来创业,以前那种大企业的经历可能更是一种劣势。 也许有一种情况,你是大公司的高官,拿到一笔很大的风险投资,然后出来创业。

人事招聘
薪水 如果公司给得起,并且应聘者能力差不多。 就不要太在乎那200、300。虽然说至少要不低于行业平均值(IT人员是IT行业平均值,而不是本公司所在的行业平均值),但最重要的,还是不要低于当事人的期望值,因为最核心的是满意度,而满意度决定于期望值和实际值的差距。对于小公司,往往一个人技术人员的成本和收益,和其工资差距非常大,有可能 10倍。所以,我们的关注点,应该是怎么一开始留住这位人才。然后,怎么让其充分发挥潜力。小公司往往不是因为节省那几千几万的工资成本死掉的,而是充分利用这位人才才活下去了。

另外,不要以为有多少人才选择的机会,小公司往往不受高级人才的青睐。太高级的人才,可能养不起,而且往往太有个性,很难合作愉快,除非在来公司前有很长时间的了解。
招聘到合适人才后,应该让其忘掉薪水,专注于工作,寻找工作本身的乐趣。当然,要做到让其在薪水上有优越感,也许是项目很盈利的那一天,开始时很难。

人才标准 如果其能力和你预期相差不大的话,更应该考虑其态度、做事风格,甚至是价值观。因为其能力的发挥,和这个环境,特别是他的直接利益相关者,也就是上司,关系太大。如果配合得好,一个人可以顶三个。否则,那种内耗导致的进度延期,由此引起的市场机会丧失,公司财力无法支撑,往往是致命的。因为一个几人的IT 团队,每一个人的职责就如同那木桶的一块板,缺了那块都存不了水。
比如关于质量,更确切说是内容质量,我们目前做旅游电子商务,我认为内容质量很核心。但你招进来的同事,始终认为先要量,什么都可以抄,而我强调质,原创、半原创,可以少而精,而不能多而乱。除开项目进度,怎么去沟通?最好两个人一开始都认同原创的力量。

提升一个人的技能不难,但改变一个人的态度比较难,改变一个人的价值观几乎不现实。所以先找志同道合的人吧。
别期望人才是可替代的。我们不是大公司,我们缺了谁,那一块就不转。
大家都知道,松耦合要付出代价,比如SOAP协议的低性能,AMF私有协议的高性能。创业期,不要太多考虑人才替换,而是关注怎么发挥人的潜力,留住人,尽快高质量完成项目。人才替换的一个假设,可能是你对自己管理的不自信,因为你不相信自己能够留住人。

这次就写这么多吧。
我似乎有这种体会,考大学、四六级这类资格、证书类考试最好混,因为只要勤奋就可以,再加点方法就可以出类拔萃了。 上班也比较好混,说找工作吧,像我搞技术的,本身对技术很狂热,根本就不愁找不到工作,因为面试时我觉得那家伙应该比我牛,正好可以切磋切磋,没想太多所以没啥怯场或不自信。工作吧,如果是技术类,特别是商业软件,技术难度都不大,按上司意思来,很容易搞定。创业呢,自己要做商业判断、业务决策,还要协调若干人的工作(协调的本质是协调利益)。做事和管事,完全是两码事,有些难。不过,创业还是很有意思,因为你可以按自己的意愿去工作去生活,当然也是受限环境的自由。

我将我的一个回复放在这个地方,特示警醒:

引用
告诫各位处于开发第一线的朋友,千万不要受本文的误导,把规范和设计文档不当回事。

我的看法:
1、文档的多少和深度决定于项目环境。
如果是大项目,比如二三十开发人员,架构文档、需求文档、代码规范等都是必须,否则开发人员不能迅速了解项目技术和业务特点,从而无法快速开发,也即是规范可以降低培训成本和团队沟通;另外,项目开发中后期可能根本不可控,谁都看不懂其它人的代码。部署时看到的一些bug无法及时修复,因为到处都有地雷。我以前经历过这样的项目,最后加班都没用。

如果是产品型,规范更重要。当然我说的产品可能是2.0版以后,因为这时候的产品基本得到了市场的认可。而在初版时,代码写得烂都没关系,因为你不不知道用户会不会买单,也不知道能否按进度开发完成。而在后续版本,如果没有规范文档,维护的成本都不亚于重新开发。特别是处于一线的开发人员会怨声载道:为什么要我来收拾残局?那么,这样的士气,开发效率怎么会高,项目质量怎么会高?

2、成熟型大公司那套做事流程,可能高手受不了,但可能是最优的方案。因为,到项目后期维护,往往只是一些业务功能的删减改进,不需要技术高手,这个过程可能漫漫几年,项目维护成本会非常高,雇佣高手一来他不愿意干二来也不需要这种人,如果项目代码还维持在一种“秩序”,初中级开发人员就可以胜任,有什么不好呢?
项目上线时,是为了追求利润。项目维护期,是为了省成本。

3、刚入道的朋友,最好是按规范来,就像学武术,先要学套路。否则,养成的编程坏习惯,比如文件名叫Aaa1.java,代码没有缩进。过几年非常难改。而好的编程习惯,可以提升开发效率,还能让自己思维清晰。
学技术阶段,一定要注意代码的可维护性、健壮性及灵活性,只有养成对代码精益求精的态度,你才可能成为技术高手。技术学好,做技术管理就有了基础,而且别人也会服你。

ping命令中的TTL的含义

中國壹石頭 发表于 2010-4-26 分类 网络管理 | 1条评论

在昨天晚上的计算机网络实验中,老师让我们做的实验是试用一些网络常用的命令,比如ping,tracert,netstat等。ping命令我们是常用的,但是你知道TTL是什么意思么?记得以前我在哪里看到我们可以从TTL的值中可以看出目的主机的操作系统类型,是这样的吗?问了一下老师,明白了TTL的真是含义。

以下就是ping曙光博客的返回值:
C:\Documents and Settings\user>ping www.ezloo.com

Pinging www.ezloo.com [66.235.202.42] with 32 bytes of data:

Reply from 66.235.202.42: bytes=32 time=254ms TTL=51
Reply from 66.235.202.42: bytes=32 time=256ms TTL=51
Request timed out.
Reply from 66.235.202.42: bytes=32 time=260ms TTL=51

Ping statistics for 66.235.202.42:
Packets: Sent = 4, Received = 3, Lost = 1 (25% loss),
Approximate round trip times in milli-seconds:
Minimum = 254ms, Maximum = 260ms, Average = 256ms 从结果中我们可以看出曙光博客的服务器的IP地址是:66.235.202.42,所用的时间是256ms等,那TTL等与51是什么意思呢?

TTL是生存时间的意思,就是说这个ping的数据包能在网络上存在多少时间。当我们对网络上的主机进行ping操作的时候,我们本地机器会发出一个数据包,数据包经过一定数量的路由器传送到目的主机,但是由于很多的原因,一些数据包不能正常传送到目的主机,那如果不给这些数据包一个生存时间的话,这些数据包会一直在网络上传送,导致网络开销的增大。当数据包传送到一个路由器之后,TTL就自动减1,如果减到0了还是没有传送到目的主机,那么就自动丢失。就像上面ping曙光博客的时候第三次那样,出现Request timed out的情况,增加TTL来减少网络资源的消耗。默认情况下,Linux系统的TTL值为64或255,Windows NT/2000/XP系统的TTL值为128,Windows 98系统的TTL值为32,UNIX主机的TTL值为255。(这个是从网络上找到的),曙光博客的目的主机是采用FreeBSD系统的,在这里可能TTL值是64,而不是UNIX主机的255,所以在从我这里到目的主机经过了64-51=13个路由。当我们不知道目的主机的操作系统的时候我们可以根据TTL来猜测,但是不一定100%准确,如果目的主机是windows,但是经过了比如75个路由器,那么TTL的返回值是128-75=53,那么你可能认为这个目的主机是Linux系统,但是一般不会经过那么多的路由器,所以通过TTL来判断目的主机的操作系统还是有一定的依据的。

Facebook Menu Page Test Report

中國壹石頭 发表于 2010-4-25 分类 超市项目 | 发表评论

在Facebook项目上进行测试的项目的参数列表:

项目名称:AppMenu
Application ID  120165764667681 
API Key  162aeed0f2dfbfb19f7bd44b044278b5 
Secret  b5ff4c07b8ff271c971ca24a7f12b1ff

项目主页:http://www.facebook.com/apps/application.php?id=120165764667681
Canvas URL:http://apps.facebook.com/realkit_app_menu/
Canvas Callback URL:http://localhost:8080/Java/MyMainPageServlet?

Facebook调用Canvas Callback URL时发送的参数:
 fb_sig_in_iframe : [Ljava.lang.String;@1e04861
 fb_sig_added : [Ljava.lang.String;@1b00766
 fb_sig : [Ljava.lang.String;@1b5eba4
 fb_sig_in_new_facebook : [Ljava.lang.String;@81933a
 fb_sig_time : [Ljava.lang.String;@e90097
 fb_sig_app_id : [Ljava.lang.String;@125ee49
 fb_sig_iframe_key : [Ljava.lang.String;@13f212a
 fb_sig_api_key : [Ljava.lang.String;@19a6087
 fb_sig_locale : [Ljava.lang.String;@37504d

返回信息的值为:
fb_sig_in_iframe : 1
fb_sig_added : 0
fb_sig : b61d0cbc4d786d12be913388c8a0d971
_fb_fromhash : 547accdd150cc711808c397ccb4a6a6a
fb_sig_in_new_facebook : 1
fb_sig_time : 1272243702.9705
fb_sig_app_id : 120165764667681
fb_sig_iframe_key : 8e296a067a37563370ded05f5a3bf3ec
fb_sig_api_key : 162aeed0f2dfbfb19f7bd44b044278b5
fb_sig_locale : en_US

// servletOutput.println(“

“);
// servletOutput.println(“”);
// servletOutput.println(“FB.init({appId: ‘your app id’, status: true, cookie: true, xfbml: true});”);
// servletOutput.println(“FB.Event.subscribe(‘auth.sessionChange’, function(response) {“);
// servletOutput.println(” if (response.session) {“);
// servletOutput.println(” // A user has logged in, and a new cookie has been saved”);
// servletOutput.println(” } else {“);
// servletOutput.println(” // The user has logged out, and the cookie has been cleared”);
// servletOutput.println(” }”);
// servletOutput.println(” });”);
// servletOutput.println(“”);

// servletOutput.println(“”);
// servletOutput.println(“hello world”);
// servletOutput.flush();
// servletOutput.close();

Struts使用举例

中國壹石頭 发表于 2010-4-24 分类 备份文档_txt | 发表评论

1.  logic:empty           该标签是用来判断是否为空的。如果为空,该标签体中嵌入的内容就会被处理。该标签用于以下情况:
         1)当Java对象为null时;
         2)当String对象为”"时;
         3)当java.util.Collection对象中的isEmpty()返回true时;
         4)当java.util.Map对象中的isEmpty()返回true时。
          eg.
            <logic:empty   name=”userList”> 
              … 
           </logic:empty>
           该句等同于:
           if   (userList.isEmpty())   { 
                 … 
           } 
   2.  logic:notEmpty
          该标签的应用正好和logic:empty标签相反,略。
   3. logic:equal
          该标签为等于比较符。
          eg1. 比较用户的状态属性是否1,若为1,输出”启用”;
                 <logic:equal   name=”user”   property=”state”   value=”1″>
                     启用
                 </logic:equal>
         eg2. 如果上例中的value值是动态获得的,例如需要通过bean:write输出,因struts不支持标签嵌套,可采用EL来解决该问题。
                <logic:equal   name=”charge”   property=”num”   value=”${business.num}”> 
                    ……
                </logic:equal>
   4. logic:notEqual
          该标签意义与logic:equal相反,使用方法类似,略。
    5. logic:forward
          该标签用于实现页面导向,查找配置文件的全局forward。
          eg. <logic:forward name=”index”/>
    6. logic:greaterEqual
          为大于等于比较符。
          eg. 当某学生的成绩大于等于90时,输出“优秀”:
               <logic:greaterEqual name=”student” property=”score” value=”90″>
                  优秀
            </logic:greaterEqual>
    7. logic:greaterThan
          此为大于比较符,使用方法同logic:greaterEqual,略;
    8. logic:lessEqual
          此为小于等于比较符,使用方法同logic:greaterEqual,略;
    9. logic:lessThan
          此为小于比较符,使用方法同logic:greaterEqual,略;
    10. logic:match
          此标签比较对象是否相等;
          eg1. 检查在request范围内的name属性是否包含”amigo”串:
            <logic:match name=”name” scope=”request” value=”amigo”>
                  <bean:write name=”name”/>中有一个“amigo”串。
            </logic:match>
         eg2. 检查在request范围内的name属性是否已“amigo”作为起始字符串:
           <logic:match name=”name” scope=”request” value=”amigo” location=”start”>
               <bean:write name=”name”/>以“amigo”作为起始字符串。
            </logic:match>
         eg3.
            <logic:match header=”user-agent” value=”Windows”>
               你运行的是Windows系统
            </logic:match>
    11.  logic:notMatch
          此标签用于比较对象是否不相同,与logic:match意义相反,使用方法类似,略。
     12. logic:messagePresent
          该标签用于判断ActionMessages/ActionErrors对象是否存在;
          eg. 如果存在error信息,将其全部输出:
               <logic:messagePresent property=”error”>
                  <html:messages property=”error” id=”errMsg” >
                        <bean:write name=”errMsg”/>
                  </html:messages> 
               </logic:messagePresent >
     13. logic:messagesNotPresent
          该标签用于判断ActionMessages/ActionErrors对象是否不存在,使用方法与logic:messagePresent类似,略
      14. logic:present
           此标签用于判断request对象传递参数是否存在。
           eg1. user对象和它的name属性在request中都存在时,输出相应字符串:
              <logic:present name=”user” property=”name”>
                  user对象和该对象的name属性都存在
            </logic:present>
          eg2. 若有一个名字为“user”的JavaBean,输出对应字符串:
             <logic:present name=”user” >
                  有一个名字为“user”的JavaBean。
            </logic:present>
          eg3.
            <logic:present header=”user-agent”>
                  we got a user-agent header.
            </logic:present>
      15. logic:notPresent
           此标签用于判断request对象传递参数是否不存在,意义与了logic:present相反,使用方法类似,略。
      16. logic:redirect
           该标签用于实现页面转向,可传递参数。
           eg1. <logic:redirect href=”http://www.chinaitlab.com”/>
     
       17. logic:iterator
            用于显示列表为collection的值(List ,ArrayList,HashMap等)。
            eg1. 逐一输出用户列表(userlList)中用户的姓名:
               <logic:iterate  id=”user” name=”userList”>
                  <bean:write name=”user” property=”name”/><br>
               </logic:iterate>
            eg2. 从用户列表中输出从1开始的两个用户的姓名
               <logic:iterate  id=”user” name=”userList” indexId=”index”  offset=”1″ length=”2″>
                  <bean:write name=”index”/>.<bean:write name=”user” property=”name”/><br>
               </logic:iterate>
            eg3. logic:iterator标签的嵌套举例
                <logic:iterate id=”user” indexId=”index” name=”userList”>
                       <bean:write name=”index”/>. <bean:write name=”user” property=”name”/><br>
                       <logic:iterate id=”address” name=”user” property=”addressList” length=”3″ offset=”1″>
                           <bean:write name=”address”/><br>
                       </logic:iterate>
               </logic:iterate>
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
public ActionForward execute(ActionMapping mapping,                                                  ActionForm form,
                                                 HttpServletRequest request,                                                  HttpServletResponse response) {
   ThreeForm threeForm = (ThreeForm) form;
   //OneForm oneForm=(OneForm)form;
   //String str=(String) s.getAttribute(“name”);
   //threeForm.setName(str);  //这样写会造成ClassCastException
   HttpSession session=request.getSession();
   OneForm oneForm=(OneForm)session.getAttribute(“oneForm”);
   threeForm.setName(oneForm.getName());
   return mapping.findForward(“three”);
}