迭代化开发新问题

http://blog.csdn.net/fuchunyi/archive/2006/10/22/1345708.aspx 这周去拜访一个客户,他们正在实施RUP,问及效果如何,听到了一些关于迭代化开发的新问题。 这位客户是一家集成商,主要为甲方开发应用软件系统。实施迭代化开发的主要目的是控制项目风险,应用项目的最大风险一般都在于需求,采用迭代化可以通过迭代产生的原型系统来收集甲方客户的反馈,从而及早修正对于客户需求的误解。但是开发团队并没有象预想中那样收集到甲方的反馈,甲方还是习惯于用传统的瀑布模型来评价、验收系统,他们并没有对项目过程中交付的原型系统进行认真的确认,所以也没有太多的意见反馈给开发团队,很多需求的变更还是要到系统正式验收时才被提出来。因为在甲方的观念中,他们还不太认可项目结束之前所提交的中间结果。 另外,项目的合同是按照瀑布模型的阶段来签的,需求分析、概要设计、详细设计、编码完成、验收测试是项目回款的里程碑。采用迭代化开发之后,在原定的概要设计交付时间点上,可能需求分析和概要设计都只完成了部分的工作,比原定计划要晚一些;而详细设计和编码工作都已经开始了一部分,比原定计划要提前一些。这样就不能按照原定时间点来要求甲方就需求分析和概要设计那部分工作量付款,对于中国的集成商而言,项目回款是比合同签定都要重要的工作。 这些问题给我们的经验教训是应用项目开发采用迭代化开发流程,也需要让客户理解这一点,项目工作说明书中的工作单元内容也需要跟迭代化开发流程来符合。软件开发流程关系到所有的涉众(Stakeholder),仅仅是开发团队理解并实施这一流程是不够的。 还有一个反馈来自于很多项目团队,认为迭代化开发概念上听起来很有道理,但在项目中实施后往往感觉不到采用这处方法后对项目有什么太大的帮助。迭代化开发的主要目的在于控制项目风险,常见的项目风险如技术架构、客户需求等等。但是日常工作中的项目往往没有太多的风险,我们开发的往往是重复性的项目,电信事业部做的就是不同运营商的BOSS项目,社保事业部就是为不同省份开发社保系统,虽然有特殊需求,但系统架构和基本需求完全一样;更多的项目是对现有系统的维护性开发,实现客户提出的变更请求和改正软件缺陷,一般不会涉及到系统架构的改动。在这种类型的项目中,迭代化开发体现的不是对风险的控制,而是系统增量式开发而不断给涉众所带来的信心和鼓舞,开发人员可以在较断的时间周期内看到自己所开发的系统可以“跑”起来了,客户则可以看到整个项目在不断地往前推进。

posted @ 2006-10-23 08:58 Sheldon Sun 阅读(171) | 评论 (0)编辑 收藏

现在的公务员...

妈的, 想起来就有气, 现在的公务员一个比一个牛, 本来应该为人民服务, 态度却一个比一个差....

最近想办居住证续办, 想打个电话咨询一下, 试了N多个, 有的 还好借了告诉你个号码, 让你去打, 但一直战线, 更有的那起来就挂掉, 拿起来就挂,,,,,,

TNND!!!!

posted @ 2006-10-19 22:49 Sheldon Sun 阅读(216) | 评论 (1)编辑 收藏

一个技术牛人的悲惨遭遇

http://www.bcb-tools.com/AuthorNotes.htm

posted @ 2006-10-16 08:56 Sheldon Sun 阅读(147) | 评论 (0)编辑 收藏

鲍尔默: 软件互联界线模糊 Web服务离不开PC

http://dotnet.csdn.net/n/20061011/95958.html 微软首席执行官鲍尔默表示,提前部署(on-premise)软件与通过互联网发布的服务之间的界线在日益模糊,微软正在顺应这一业界趋势。 鲍尔默在Gartner 的Symposium/ITxpo 会议上接受了Gartner分析师史密斯和伊冯的采访。鲍尔默在采访中说,许多网站可以被称作“点击运行”,服务通过网站发布,但在PC上运行。 他表示,我认为我们正处于一种转型中,软件正在由前互联网时代发展到我们所谓的“Live时代”,网站提供了“点击运行”能力,但软件仍然需要在PC上运行。 由于有大量的台式机和服务器软件产品,与Salesforce.com或Google相比,微软对托管服务的态度还不够积极。 据鲍尔默称,微软计划推出面向消费者和企业客户的服务化软件,提供通过互联网的服务和企业防火墙后面的服务器。 去年,微软将Windows 和开发者工具部门与负责MSN Web 服务的部门进行了整合,它目前正在开发一系列名为Live的托管服务,其中一些服务旨在补充现有的“提前安装”软件。 鲍尔默表示,软件+ 服务与服务化软件之间的差别在于人们是否想利用手机、PC的处理能力。甚至考查一下目前的互联网服务,它们也都使用了客户端的处理能力,例如AJAX、即时通讯服务。 鲍尔默表示,在这一服务化大潮中,尽管不能永远保持第一,但微软不会放弃。他说,我们或许不是第一,但我们在不断努力。在搜索方面也是一样,我们不会轻言放弃。

posted @ 2006-10-12 08:27 Sheldon Sun 阅读(115) | 评论 (0)编辑 收藏

将女友升级为老婆的时候发生的

亲爱的技术支持: 我急需您的帮助。我最近将"女朋友7.0"升级到"妻子1.0",发现这个新程序意外地启动了孩子生产程序,而且占用了大量的空间和珍贵的资源。这在产品的使用手册中没有提到。 此外"妻子1.0"自动将自己安装到其他的所有的程序中,它随系统同时启动,监控整个系统的状态。 "男人夜出2.5"和"高尔夫5.3"无法再运行,一旦运行该程序系统即行崩溃。试图运行 "周日足球6.3"经常失败,而"周六购物7.1"却代之运行。看来我无法保留"妻子1.0",因为它和我喜欢运行的任何程序都不相容。我打算回到"女朋友7.0",可是这个程序又无法卸载。 请您帮帮我吧! 乔 给乔的回信: 亲爱的乔:这是个很普通的问题,产生于你对基本原理的不了解。很多的男人健"女朋友7.0"升级到"妻子1.0",以为"妻子1.0"是一个"实用与娱乐程序"。然而"妻子1.0"却是个操作系统,是被设计用来运行所有程序的。你不可能清除"妻子1.0",也不可能回到"女朋友7.0",因为"妻子1.0"的设计中不具有这个功能,无论是卸载、删除或是清除已经安装在系统中的这些程序文件,都是不可能的。 有些人曾试图安装"女朋友8.0"或者"妻子2.0",结果是产生了更多的问题(参见手册中的赡养费/孩子的养育/律师费用)。我安装过"妻子1.0",我建议你保持现在的安装状态,妥善解决遇到的困难。 当任何错误或问题出现的时候,不论你认为是什么原因引起的,你必须运行"C:\我道歉"程序,并且避免使用"退出键"。必要时可能需要运行"C:\我道歉"多次,希望最终能使操作系统恢复到初始状獭。 "妻子1.0"虽然是一个需要高保养的程序,但同时对人可能是非常有益的。要想充分地利用它,需要买些额外的软件比如"鲜花2.0"和"巧克力5.0"。不要在任何情况下安装"秘书(短裙版)",因为"妻子1.0"不支持这种程序,而且系统多数时候肯定会崩溃。 祝你好运!

posted @ 2006-09-29 16:45 Sheldon Sun 阅读(135) | 评论 (0)编辑 收藏

About life

Life like a long run contest e.g 3000 meters. sb abort it at 1000 meters. sb abort at 2000 but only ones who finished running are sucessfully. But who will became these ones???

posted @ 2006-09-29 09:01 Sheldon Sun 阅读(125) | 评论 (0)编辑 收藏

如何在Web应用中启动后台任务

http://www.javaresearch.org/article/showarticle.jsp?column=2&thread=32387 摘要 我们常常在Web应用中需要启动一个自己写的服务,本文的目的是给你提供一个解决方案。 原理 本方案的原理是写一个实现了ServletContextListener接口的类,该类中有两个方法: public void contextInitialized(ServletContextEvent sce),它是在应用启动时调用;另一个方法是:public void contextDestroyed(ServletContextEvent sce),该方法是在应用结束时调用。把我们要启动的后台应用逻辑放在contextInitialized方法中实现;把释放后台应用占用资源的工作放在contextDestroyed来处理。但我们启动的后台任务常常是有要求的,比如时间,频率等,我在这里使用了一个开源组件:quartz。 步骤 1.写业务调用类: // DumbJob.java import org.quartz.*; import java.util.*; public class DumbJob implements Job { public DumbJob() { } public void execute(JobExecutionContext context) throws JobExecutionException { //在这里写业务处理代码。什么,你不知道?那你别问我!!:-< } } 本类的主要功能是由quartz中调度类按照指定的规则进行调用执行必要的业务逻辑。 2.写调度类 // TestShedule.java import org.quartz.*; import java.util.*; public class TestShedule{ static SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory(); static Scheduler sched; public static void run()throws Exception{ sched = schedFact.getScheduler(); //获取调度管理器 JobDetail jobDetail = new JobDetail("myJob", sched.DEFAULT_GROUP, DumbJob.class);//创建工作 CronTrigger trigger = new CronTrigger("myTrigger","test","0/10 * * * * ?");//创建触发器 sched.scheduleJob(jobDetail, trigger); //添加到调度管理器中 sched.start();//启动调度管理器 } public static void stop()throws Exception{ sched.shutdown(); } } 本类的目的是设置调用规则,在这里我用了“0/10 * * * * ?”表示每10秒钟就执行一次,有关表达式的说明请参阅quartz的api文档。 3.编写服务启动类: //ServiceLoader.java import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class ServiceLoader implements ServletContextListener { public void contextInitialized(ServletContextEvent sce) { try{ TestShedule.run(); }catch(Exception ex){ System.out.println(ex.getMessage()); } } public void contextDestroyed(ServletContextEvent sce) { try{ TestShedule.stop(); }catch(Exception ex){ System.out.println(ex.getMessage()); } } } 在contextInitialized中调用TestShedule.run()启动后台任务;在contextDestroyed中调用TestShedule.stop()停止后台任务。 4.部署服务启动类 在web.xml文件中增加如下一行配置: rootServiceLoader index.html 5.启动web服务即可。 总结 其实实现这个功能的方法很多,我在这里是应用了ServletContextListener接口和开源api quartz,希望能对你的开发有所帮助。 资源 quartz: http://www.opensymphony.com/quartz ServletContextListener在javax.servlet包中

posted @ 2006-09-27 16:52 Sheldon Sun 阅读(235) | 评论 (0)编辑 收藏

动态语言,别再说不

http://blog.csdn.net/myan/archive/2006/09/25/1281151.aspx 相信很多人都听过一个禅宗故事,说是两个僧人赶路,趟过一条小河的时候,看到一个漂亮的少妇困于其中,向他们呼救。其中一个有心施以援手,但想到佛家的色戒,便犹豫起来,不知如何是好。可另一个和尚却大大咧咧地冲过去,抱起少妇,趟过小河。于是前者的心里就很不舒服,一路上闷闷不语,后来实在忍不住,就问自己的同伴,既然身为佛门中人,怎能不顾清规戒律,如此轻薄。然而那位和尚却回过头来,淡淡地说:“我已经把她放下了,你还抱着呢?” 也许不太贴切,但是这几天中外豪杰们围绕Ruby和Rail爆发的口水战,让我不由得想起这个小故事。 前几天著名大嘴Joel Spolsky在自己的一亩三分地里对Ruby进行了FUD性的攻击,引发互联网上一片口水战,Ruby之父matz和Rails之父DHH都卷入其中。似乎是要与此相呼应,在国内技术论坛上,这几天围绕Ruby的争论也突然攀登新高峰了。国外的大气候和国内的小气候都有共同特点,就是站在传统技术立场上的人对于RoR的火爆看不下去了,首先站出来发难,从而引发Ruby支持者们的回击,然后双方厮杀在一起,连带旁边相干不相干的看热闹的、拉架的、含沙射影的、慷慨激昂的,瞬间就浩浩荡荡,横无际涯了。而争论来争论去,无非还是Ruby的性能问题、可用性问题、前景问题,等等等等。 可能是老生常谈了,但倒R派的观点让我想起多年前我们这些C++ fans对Java的鄙视言论。那个时候C++程序员们说,Java只能用来在页面上用applet作一些可笑的小动画,Java只能对对火柴棍排序,Java慢得像牛车,Java有内存泄露,Java狂耗内存,Java愚蠢的弱类型容器可以把鲸鱼装进一个笔筒,Java居然没有指针,Java做不了系统程序设计,Java写不了操作系统,Java解决不了我手头的超超级复杂的巨牛无比的难题,诸如此类,不一而足。冠冕堂皇的理由可以找出一大箩筐,但大皮袄下面无非就是一个“私”字而已。骨子里的想法是,我费了好大的牛劲才混了个C++三品顶戴,你Java一闹腾,就把我的似锦前程给搅黄了,怎能不妒火中烧,羞愤交加? 可是这些年过去了,当时我们吐那点酸水起了什么作用了吗?Java统治了企业计算,统治了手机应用开发,统治了大学教育。不但如此,Java在开源领域里也如日中天,接Eclipse之威在桌面应用中也占了一座大山头。一些传统上属于系统程序的项目,比如编译器、语法分析器、高性能的服务器软件等等,也大量转用Java开发。不错,Java还是不能用来写F-22战斗机的火控系统,但是这跟我们这些坐在cubic里写民用软件的家伙有个鬼的关系!人们对于简单、标准化和生产率的要求不可阻遏地突破了早期对Java筑起的FUD防线。面对Java的空前绝后的成功,我们这些当年曾经对革命力量翻白眼吐舌头的家伙,在沉默的面对现实之后,已经完成了一次观念上的涤荡。我们已经认识到,技术的发展趋势是不以个人利益为转移的,干这行就要有顺应技术大潮的勇气,要有不断破旧立新的魄力。我觉得我已经放下了曾经有的那种盲目的固执和一厢情愿。 然而时间没过多久,随着Java成长和腾达起来的一代人(其实不少也就是我的同龄人),又开始重蹈覆辙。面对以Ruby为代表的新兴动态语言的蓬勃发展,他们也有点坐不住了。靠革命起家的人最怕革命,当年的下里巴人翻身做主了,摇身一变成阔佬了,就开始对新的革命力量摆谱使脸色,甚至以FUD战术加以弹压了。与当年如出一辙,手段还是以攻为守,情绪还是慷慨激昂,笔法还是义正言辞,什么Ruby未经验证啦,什么Ruby性能低劣啦,什么Rails可扩展性不佳啦,什么Ruby不能解决“大型的”、“复杂的”、“企业级的”、“高性能的”问题啦。最要命的是,哪怕自己90%的时间不过是在字符串处理,这些阔佬们也还是一致宣称自己做着世界一流的、大型的、复杂的、企业级的、非Java不可、没Java不行、没Java就要上吊抹脖子跳楼挖坑的巨牛无比的大项目,听着让人心惊肉跳兼之无比崇敬。你说Java还能火几年?我说怎么也得5年!5年?那是上升期!少说十年,后面还有平台期。你还别不服,反正我退休之前Java说什么也别想凉下来,谁也别想威胁我的顶戴花翎。企业级啊,架构师啊,经验啊,高手啊,我混成这样我容易吗我?谁冒出来我就跟谁急,我就用口水淹死他! 可惜,这些大话对于我这种记性不幸没那么差劲的人来说,太似曾相识了,让我一眼就看出这言论背后的“私”字来。想来也真是轮回,当年我们C++这一批人放下的东西,原来你们Java这一批人还抱着呢。不过,技术的大潮真的是后浪推前浪,往后看吧,我相信,当年C++挡不住的东西,今天Java也挡不住。大趋势已经摆在这了,接不接受、什么时候接受,那是个人的问题,但是总体的发展是无可逆转的。 Ruby的兴起,其实只不过是一个积累了几十年的技术趋势的能量释放。世界上第二个程序设计语言Lisp及其后续家族成员都是最最动态的语言。早在七十年代,伴随着图形界面的出现,Smalltalk就以其纯粹的面向对象和纯粹的动态性获得有识之士的认可。自1986年代Perl出现以来,大量开发者就认识到,动态语言开发效率高,限制少,能够自由的表达思想,轻松完成在传统语言中非常困难的工作。很多人都预言动态语言迟早会成为主流。然而在整个1990年代,无论是计算机硬件条件还是软件工程的水平,都还不够成熟,再加上Perl自身存在一些问题,动态语言始终只是作为主流语言的一种有力的补充而存在。2000年之后,PHP大流行,在Web开发领域三分天下有其一。但是PHP本身完全是为Web而做,当扩展到其他领域时,就凸显出先天不足的劣势,因此地主稳坐,霸业难成。直到现在,无论是硬件条件、软件开发的方法,还是客观应用环境都逐渐成熟,在这个时候,Ruby借Rails框架赢得广泛关注,当然不是偶然的现象。在TIOBE全球程序设计语言排名表中,Ruby排名一年间跳升15位,而根据O’Reilly公司对于图书市场的统计,Ruby相关书籍的销量在2005年增长15倍的基础之上,今年又增长了7倍,已经超过Python和Perl。再看看是谁在关注Ruby,抛开一手把Ruby炒热的“Pragmatic Programmer二人组”Dave Thomas和Andy Hunt不说,一大批编程老枪都在尝试或者已经转向Ruby,这其中的著名人物包括Robert C. Martin、Martin Fowler、Bruce Tate等。如果这些还不够令人印象深刻的话,我们应该注意一下近期有关Ruby的一些事件。最近Sun雇用了开源项目JRuby的两名主要开发者,让他们可以全职开发JRuby,从而正式将Ruby语言搬上JVM。同时,微软也在上个月的一次有关.NET语言的技术会议上邀请RubyCLR的主要开发者John Lam发表演讲,外界传言他将加入IronPython开发者Jim Hugunin所在的团队,从而加速Ruby for .NET的开发进程。另一个致力于Rich Internet Application的软件巨头Adobe于几天前刚刚发布了用以将Flex 2.0整合到Ruby on Rails中的SDK。对于那些整天盯着巨头们脸色行事的人来说,这些消息就算不是金口玉言,至少也是明确的迹象了吧。 然而,比上面一切都更为重要的是,今天的世界已经变了,已经不是15年前C++统治一切的那个世界,也不是10年前Java中彩票的那个世界,甚至也不是5年前Visual Basic狂练葵花宝典的那个年代。互联网改变了太多的东西,经济形态和公司业务的形式和途径都已经并且仍在发生迅速的、根本性的变化。开放、互联、敏捷、整合、平等、自由、高速、专业,所有这些给我们带来了新的经济运行模式,也对软件的开发提出了新的要求。Ruby,以及Ruby所代表的一类动态的、自由的程序设计语言和开发思想已经迎来了它们的时代,它们将和其他的科技一起,在下一个轮回中改变我们的工作,改变我们的生活,改变我们的观念,直到下下个轮回将它们扫进历史的功劳簿中为止。 所以,该放下的时候,就勇敢地放下吧。当然,如果想再跟发展大势打一打,那就打一打,反正在技术进步的路上,保守的一方终究是要被解决的。

posted @ 2006-09-26 08:25 Sheldon Sun 阅读(121) | 评论 (0)编辑 收藏

软件构架师之路

http://tech.csai.cn/sa/200608111524241005.htm 构架师(Architecture)是目前很多软件企业最急需的人才,也是一个软件企业中薪水最高的技术人才。换句话说,构架师是企业的人力资本,与人力资源相比其能够通过构架、创新使企业获得新的产品、新的市场和新的技术体系。那么什么是构架师、构架师的作用、如何定位一个构架师和如何成为一个构架师呢?这是许多企业、许多程序员朋友希望知道的或希望参与讨论的话题内容。      我在此抛砖引玉,就上述几个问题把我的体会和理解做简单阐述。   所谓构架师通俗的说就是设计师、画图员、结构设计者,这些定义范畴主要用在建筑学上很容易理解。小时候到河中玩耍,经常干的事就是造桥,步骤如下:1、在沙滩上画图;2、选择形状好看、大小适合的石头;3、搭建拱桥。其中我们挑出来画图的那位光PP小孩就是传说中的 “构架师”了。   在软件工程中,构架师的作用在于三方面:1、行业应用构架,行业构架师往往是行业专家,了解行业应用需求,其构架行为主要是将需求进行合理分析布局到应用模型中去,偏向于应用功能布局;2、应用系统技术体系构架,技术构架师往往是技术高手中的高手,掌握各类技术体系结构、掌握应用设计模式,其构架行为考虑软件系统的高效性、复用性、安全性、可维护性、灵活性、跨平台性等;3、规范构架师是通过多年磨砺或常年苦思顿悟后把某一类构架抽象成一套构架规范,当然也有专门研究规范而培养的规范构架师。他们的产物往往也分为应用规范和技术规范两类。   与建筑学类似,如果软件系统没有一个好的构架是不可能成为成功的软件系统的。没有图纸的建筑工地、没有设计的造桥工程都是不可以想象的混乱世界。建筑工程如是,软件工程中亦然!   由于国内合格、胜任的软件构架师极为少见,直接导致了我国民族软件产业水平的落后。在未来以信息产业为主导的社会,信息产业水平的低下将直接影响国家核心竞争力。究其原因,无企业非急功近利、个人缺乏引导。   企业的急功近利是有无法克服的原因的,那就是社会发展总体水平。“生存是第一位的,赚钱是第一位的”,多年来许多客户抱怨国内的软件公司无法信任、系统项目累做累败、公司越换越差,但因国外不可能给中国做应用系统项目还不得不找国内软件公司做。由于人月费用低、公司开发成本高,软件企业对于应用只能草草了事,拿钱走人(很多公司拿不到后期尾款)。这样的环境下,企业几乎无法投入更多资源培养自己的构架师,加上眼花缭乱的跳槽风气企业更是不愿投入……   那么要成为构架师的途径似乎只有现在较为流行的软件学院和个人自我培养了。关于软件学院我接触过不少,其宗旨绝大部分都是造就(or打造)企业需要的软件构架师(or程序员or人才)。教师来源与企业、学员来源与企业、人才输送到企业是他们办学的手段。尽管各个如雨后春笋般出现的软件口号差不多,但除了中科院、清华、北大等大院校可以相信一些之外,恐怕更多的就是为了圈钱卖学位了事……我有个朋友二十几个人的小公司也想搞软件学院:)   构架师不是通过理论学习可以搞出来的,不过不学习相关知识那肯定是不行的。参考软件企业构架师需求、结合北京网畅公司构架师培养计划以及目前构架师所需知识,我总结构架师自我培养过程大致如下仅供参考:   1、构架师胚胎(程序员)学习的知识是语言基础、设计基础、通信基础等,应该在大学完成,内容包括 :java、c、c++、uml、RUP、XML、socket通信(通信协议)——学习搭建应用系统所必须的原材料。   2、构架师萌芽(高级程序员)学习分布式系统、组建等内容,可以在大学或第一年工作时间接触,包括 :分布式系统原理、ejb、corba、com/com+、webservice(研究生可以研究网络计算机、高性能并发处理等内容)   3、构架师幼苗(设计师)应该在掌握上述基础之上,结合实际项目经验,透彻领会应用设计模式,内容包括:设计模式(c++版本、java版本)、ejb设计模式、J2EE构架、UDDI、软件设计模式等。在此期间,最好能够了解软件工程在实际项目中的应用以及小组开发、团队管理。   4、软件构架师的正是成型在于机遇、个人努力和天赋   软件构架师其实是一种职位,但一个程序员在充分掌握软构架师所需的基本技能后,如何得到这样的机会、如何利用所掌握的技能进行应用的合理构架、如何不断的抽象和归纳自己的构架模式、如何深入行业成为能够胜任分析、构架为一体的精英人才这可不是每个人都能够遇上的馅饼……   然而学海无涯,精力有限,个人如何能够很快将这些所谓的构架师知识掌握?这是秘密,每个人都有自己的独门家传秘笈就不敢一一暴露了。不过有一点就是广泛学习的基础之上一定要根据个人兴趣、从事领域确定一条自己的主线来努力

posted @ 2006-09-26 08:12 Sheldon Sun 阅读(321) | 评论 (0)编辑 收藏

https://jdiameter.dev.java.net/examples.htm

fasdfasfae

posted @ 2006-09-25 13:23 Sheldon Sun 阅读(450) | 评论 (0)编辑 收藏

仅列出标题
共5页: 上一页 1 2 3 4 5 下一页 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(3)

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜