后期补充:网友对我诟病最多的就是我帮学生做面试题,说这是小偷和骗子行为,在此,我对自己给学员做面试题做出如下解释:
(1)学员拿着面试题来找老师,学生也事先思考和尝试后实在没有办法,又求职心切才想到找老师帮忙的。老师出于对题目和技术的好奇,也出于对学生的感情,才不辞劳苦去帮助做题的。明知小孩自己做不到,还不帮小孩去做,非要锻炼孩子自己去做,现在估计很多父亲都做不到吧。何况,学生也是我们的客户,我们不去帮一下,这个显得太冷酷无情了。
(2)有人说,应该让学生自己去做,做不出来就别去招聘单位冒充好汉,帮学生做题就是鼓励学生行骗和作恶!从这一点上来说,事情做得确实有点不光明磊落,但用行骗和作恶来形容,就言之过重了。毕竟用人单位也不是傻子,随便找个农民工把结果交上去,用人单位就会录用吗?用人单位在做题之前就对学员进行过一些基本的技术考核和交流,肯定也是觉得差不多了,才让学生把题目拿回家去做的,学生做出来后,也要给他们去讲解代码思路的,只要学生能说清楚代码思路,用人单位未必真关心是学员自己单独做的,还是有朋友帮忙做的,因为很多单位的招聘岗位是对事不对人的,只要能把工作中安排的事情搞定,那就不管这个人是否是自己亲自搞定的,还是靠外援搞定的,公司要的是事情的结果。很多公子哥在一些大公司都挂职“副总经理”,难道这个公子哥真有“副总经理”的能力吗?不管他们有没有,但是,他们能靠自己的关系把“副总经理”要办的事情办妥,这就是公司的目的。同样道理,公司不管学生是怎么做出来,只要学生做出来了,就说明他或他的亲友团能解决公司日后分配给他的任务,才不管他是怎么解决的呢?公司也许要的就是这一点。如果是这样,我们正好满足了公司的需求,怎么能说是行骗和作恶呢!
(3)我历来的一个观念就是:对于我花时间研究透和解决过的技术问题,只有把这些知识分享出去,才能实现个人价值和社会价值的更大化。如果一个人花了很多时间和精力搞明白的知识只装在自己的肚子里,不找机会把它应用出来,那么这个知识就没有什么价值,一个知识只有被很多人使用,被反复地使用,才能实现这个知识的价值最大化。所以,我把这些题目和解题思路都公布出来了,为了吸引更多人来学习,我当然要告诉大家这是面试题,并且是决定工作成败的面试题,这也是提高大家来学习这个题目的热情的一种激励手法罢了,没想到被送到了道德审判的十字架上了。
前面的两篇博文写到:有两名同学出去面试,招聘单位分别给他们两个小项目拿回家做,三天内做出来即可给到7k以上的月薪,我都帮他们做了,详情参看《交通灯管理系统》和《银行业务调度系统》的介绍。
不久,又有一名学员给我打电话,让我帮他做一道类似的题目,不过,这次项目变成了“移动用户资费统计系统”,再细问,知道这次的招聘公司不是软通动力了,而是联想利泰,这两家公司提供的word文档格式都完全一样,我奇怪现在的软件公司怎么都学会用这招来考核求职者了,我真怀疑这些题目出自同一人之手,难道是软通动力的技术经理跳槽到联想利泰啦?他的这招面试手法确实够高!
我看到“移动用户资费统计系统”的需求文档后,发现这个系统的业务比《交通灯管理系统》和《银行业务调度系统》的业务都要复杂得多,一时间真不知道该从哪里着手, 只能回复那名学员:“这个项目题好像不是一两天就能搞定的事情,我努力做做,别抱太大希望”。如果说“交通灯管理系统”或“银行业务调度系统”做出来就可以拿到7k月薪的工资的话,我认为这个“移动用户资费统计系统”做出来的话,起码应该可以拿到1w以上的月薪。我按照“移动用户资费统计系统”的需求文档认认真真地做了两天,体力透支很大,加之十几年的编程生涯,我一直处于亚健康状态,这个“移动用户资费统计系统”终究成了压倒骆驼的最后一根稻草,我累得病倒了!等到身体康复后,我不甘心事情只做了一半就放弃了,接着又花了两天的时间,总算把这个项目题给做完了,结果又再次累病倒了。
后来又有好几名去联想利泰面试的学员拿着这个《移动用户资费统计系统》找我,我每次都把源代码给了这些学员,并讲解清楚了其中的代码结构,后来问这些学员,他们一个也没被录取,他们一致认为该公司可能只是想找个人来向他们讲解如何实现此系统的代码,看来着实枉费了我一番心机和功夫!最近,又接到多名学员的反馈,除了联想利泰,美国阿格雅技术有限公司也在使用此题目考核面试者,这个题目虽然没有华丽的外表,但它确实是一个有技术含量的项目,绝非是一个普普通通的程序员容易做出来的东西!这道题目是在解决实实在在的复杂业务问题,其中涵盖了技术含量极高的编程技巧和设计手法,这才是真正做高级项目所要学习的知识,对于广大程序员来说,它是一个不错的案例,不同于那种只是大量重复性工作的增删改查项目。
特别说明: 由于电信和银行实际环境的复杂性和产品一旦上线运行后对错误的容忍度几乎为0,电信和银行的项目在做完后都不能直接上线测试运行,而是要通过编写非常完全和严格的模拟程序来进行测试,确保万无一失后再实际上线运行,所以,为电信和银行项目编写模拟程序和比对检查程序运行的结果就非常重要了。虽然我写完了《移动用户资费统计系统》的代码,但不能保证最终的运行结果就没有错误,这需要仔细分析和比对运行结果才能发现问题,由于《移动用户资费统计系统》的业务逻辑实在有点复杂,仅凭我个人之力,实在难以比对出每个细节,为此,我专门编写了《测试用例编写指导书》和《比对检验指导书》,供感兴趣的网友参考。如果有哪位网友发现我写的程序统计出来的结果有问题,请来信详细告知,我将不胜感激。
下面是”移动用户资费统计系统“的需求:
移动用户资费统计系统
原始需求文档下载 讲座ppt下载 讲座源码下载 讲座视频下载(待补充)
-->模拟实现简易的移动用户资费统计系统逻辑,具体需求如下:
- 移动运营商A设置两种类型的用户:普通用户及VIP用户,现该运营商已有5个VIP用户和15个普通用户,共计20个用户。
- 普通用户资费标准如下(不考虑漫游和长途):
【基准资费】
无月租费用。
通话费:0.6元/ 分钟(仅拨打收费,接听免费)
短信费:0.1元/ 条
数据费:5元/ M
【优惠套餐】
话费套餐:月功能费20元,最多可拨打60分钟电话,超出时间按照0.5元/分钟计费。
短信套餐:月功能费10元,最多可发送200条短信,超出条数按照0.1元/条计费。
数据套餐:月功能费20元,最多可获50M的流量,超出流量按照3元/M 计费。
注:用户可以选择多种套餐,各功能(通话、短信、数据)计费时,如已选择对应套餐,则按套餐标准计费;如未选择对应套餐,则按对应的基准资费计费。
- VIP用户资费标准如下(不考虑漫游和长途):
【基准资费】
月租费用:按天收取,2元/ 天
通话费:0.4元/ 分钟(仅拨打收费,接听免费)
短信费:0.1元/ 条
数据费:3元/ M
【优惠套餐】
套餐1 :月基本费用100元(无月租费用),提供如下服务:
①最多可拨打750分钟电话,超出部分按照0.3元/ 分钟计费。
②最多可发送200条短信,超出条数按照0.1元/ 条计费。
③最多可获得100M数据流量,超出流量按照1元/ M计费。
套餐2 :月基本费用200元(无月租费用),提供如下服务:
①最多可拨打2000分钟电话,超出部分按照0.2元/ 分钟计费。
②最多可发送500条短信,超出条数按照0.1元/ 条计费。
③最多可获得300M数据流量,超出流量按照0.5元/ M计费。
注:用户最多只能选择一种套餐,如未选择任何套餐,则按照基准资费计费。
- 各类型用户只能选择提供给本类型用户的套餐。
- 新用户入网。
①对于新入网的普通用户,入网当月赠送如下服务:免费拨打60分钟
电话,免费发送200条短信,免费获得50M流量。超出赠送的部分
按照普通用户基准资费进行计费。
②对于新入网的VIP用户,入网当月赠送如下服务:免费拨打200分
钟电话,免费发送200条短信,免费获得100M数据流量。超出赠送
的部分按照VIP用户基准资费进行计费(注意:需按入网天数计算月
租费用)。
- 每月为用户计算一次账单,用户订制的套餐信息和账单信息采用文件方式进行存储(提示:可使用java中的Properties API进行文件操作)。
- 用户可自由订制或退订所属用户类型的套餐,并从下月起生效。
- 异步随机生成客户操作如下:
①拨打电话,每次拨打时长为1至10分钟不等(随机决定,以分钟为单位)。
②发送短信,每次发送条数为1至10条不等(随机决定)。
③上网获取数据,每次获取数据流量可为50K,100K,200K,500K,1M(随机决定)。
④订制或退订相应套餐。
⑤新用户入网(随机决定用户类型)。
注:随机生成客户操作时间间隔自定,可设置。
- 不要求实现GUI,只考虑系统逻辑实现,可通过Log方式展现程序运行结果。
解题思路
- 数据分析与统一计算公式:
分析本系统的业务,可以看到普通用户和VIP用户在订购套餐的方式以及月底计算账单的公式上都有很大的不同:
(1)普通用户没有月租费和月基本费、而VIP用户有月租费或月基本费。
(2)普通用户是单独订购电话、短信和数据套餐,每项套餐单独收取月功能费;VIP用户不能单独订购电话、短信和数据套餐,VIP用户订购的套餐中同时包含了电话、短信和数据等服务功能。
我们可以为普通用户和VIP用户分别设计出一个月底计算账单的公式,但是,为了简化编程,我们也可以为两种不同用户设计出一个统一的月底计算账单的公式,这就好比“大象有尾巴,而蚂蚁没有尾巴,大象没有触角,而蚂蚁则有触角,能否用同一个累加所有器官的公式来计算蚂蚁和大象的体重呢?当然可以,这时候只需要假设蚂蚁也有尾巴,只是蚂蚁的尾巴重量为0,假设大象也有触角,只是大象触角的重量为0,这样,就可以用同一种累加所有器官的公式来计算蚂蚁和大象的体重了。”我们可以采用如下方式来统一各类用户在各种情况下的费用计算公式:
(1) 月基本费或月租费:月基本费方式为固定值,月租费方式为当月总天数*每天费用或者(当月总天数-入网日+1)*每天费用,只有vip用户才存在此项费用,但是为了统一计算公式,可以认为普通用户也有此项费用,值为0。
(2) 电话收费时长:等于(电话时长-免费时长),计算后的值小于0则记为0,免费时长又分为两类:新入网的免费和套餐中的免费,新入网的免费在用户对象中处理,套餐中的免费封装在套餐策略对象中处理。
(3) 电话、短信、数据套餐月功能费:只有普通用户定了套餐才有此项费用,但是为了统一计算公式,可以认为没定此功能套餐的普通用户和vip用户也有此项费用,值为0。
(4) 月电话费用=电话套餐月功能费+单位计费价格*电话收费时长
(5) 按月电话费用的相同规则计算月短信费用和月数据费用
(6) 月总计费用=月基本费或月租费 + 月电话费用 + 月短信费用 + 月数据费用
我们可以用如下一幅“月账单费用的组成成分”图来直观地理解上面的计算公式:
- 采用一种便于程序代码读取的格式在配置文件中存储各项数据
刚开始猛然看到这么多数据项,肯定会感觉纷繁杂乱,理不出头绪来,但是,不管这些数据项有多么多,归结起来,不就是某个用户要使用自己的某种数据吗?只是不同的用户有不同的数据罢了,每个用户只需要关心和使用自己的数据、而不用关心其他用户的数据就显得简单多了,因此可以写一个类来专门读取用户的数据,在配置