在线考试系统经验累积

项目是一个在线考试系统。目标是在单个服务器上支持400人同时在线考试。这个过程很漫长。


产品服务于小型学校。


前期,去学校采集用户需求。整理需求点,非常详细具体。记录会议纪要。


中期,根据需求点设计物理模型,索引。把功能点非常详细地写入文档。尽可能考虑到后期需要扩展的地方,采用设计模式比如,题库中的试题的题型,这个点就是后期最可能发生扩展的地方。采用模板方法模式搭建好算法骨架。以及相应的基类和抽象类,后期扩展一个题型直接继承抽象类,做到增加代码而不是修改已有代码。对于考试类项目,都会有遗传迭代算法实现模板生成试卷,而生成的规则,肯定会根据不同的学校有不同的需求点。这里采用策略模式,方便以后扩展。


后期,采用自动化测试(Jenkins + Ant + Jmeter)。这套测试环境,只针对性能和压力测试,非功能性测试。

 

监控工具记录。


IE采用HttpWatch工具,当然也可以使用WireShark进行抓包分析。Firefox自然是强大的firebugChrome开发者工具就可以分析。非常清晰地统计每次请求响应了多少数据量,然后进行相应处理。比如gzip。比如JSON的解析过程。


中间件是Tomcat,采用probe进行监控。关注JVM内存分配大小情况,线程池的大小,session情况等。根据负载情况调整,JVM内存分配情况,栈深度,垃圾收集器类型等。不同位的操作系统内存大小有相应的适配。


分析代码情况。代码实现算法不规范。比如循环去数据库获取数据,即使数据库有缓存,但是获取数据库连接池仍然需要开销。比如大量使用String情况也需要杜绝,因为string作为常量存入JVM运行时数据域的方法区,而方法区就是我们常说的永久代,而永久代很难有GC。一些无用的String就会占用很多内存开销。比如大量使用Integer对象,都需要修改。


根据实际情况,调整数据库连接池大小等参数。


JVM,采用JDK自带的jvisualvm工具监控,内存,线程栈情况。结合一些jmap,jstat,jstack命令。


利用MONyog监控MySQL,可以很直观看见SQL语句执行计划,然后根据执行计划,修改和增加索引,以及尽可能去掉连表查询,尤其不能有连表带In的子查询,应该是杜绝的


服务器采用64windowServer2010,然后进入资源监视器功能。观察和分析是否是硬件带来的瓶颈。所以需要理解CPU,内存,磁盘,网络。


上述是一个项目大致的流程,但是实际过程远比这复杂详细。这里记录大致过程。提供一些思路。各个环节需要什么工具去监测,又需要我们具备怎样的知识。尽可能去理解当一个请求来了然后到响应的全过程。各个环节是如何联动的,相互之间的关系和影响。


这个过程有些经验分享。


1,什么是产品?产品是解决人们问题的。产品能够解决用户的什么问题?推荐看《失控》《人类简史》来理解这个世界。


2,理解到对代码不能有偏见。面向过程与面向对象同等重要


3,会议纪要的书写。一定要描述清楚。在开会之前明确向负责人了解这是一次什么样的会议,并且这次会议需要达到什么样的效果。把会议结果写清楚以及后续安排,如时间安排,负责人安排等都记录清楚。然后,立即发给参会人员看,如果对方提出什么问题,则再修改,一定要及时。


4,需求分析是需求分析,在一次需求分析讨论会上,一定不要讨论如何设计如何实现等话题,因为需求分析讨论好了,设计实现就相对容易,所以明确什么时间做什么事情,不要胡乱一把抓弄这些事情。


5,积极参与讨论。首先,理解到每个人都有自己的思维方式,并都能提出自己认为好的方案。其次,根据项目具体情况,以及大家商量讨论的大致内容,最终大家大致统一意见。尽可能听取每一个人的想法,吸取更多思维方式。对事永不对人。


6,做到对整个系统特别熟悉,详细到每一个功能点。这样才能宏观把控,并能够合理分配资源。


7,每一个小功能必须细致、具体。在一个文档中,详细描述出来,比如表结构是怎样的?页面的大致样式?规则是怎样的?需要展示些什么?也就是一个小功能也要非常具体,在脑袋中想象出整个实现过程,细节,可能存在的问题。又应该如何避免。


8,尽可能学习别人的优点。学习如何与人沟通,你的用词,语气,语调。


9,解决问题的方式很多。理解到一个项目的各个环节如何联动的,自然就知道我应该在哪个环节去解决问题。深入理解这个生态系统,从请求到响应过程,非常值得我们去探索。理解到一个功能的实现是分为哪几个步骤,自然知道这些步骤中如何去解决问题。都是拆分思想,一层嵌套一层,一层联动一层。


10,态度方面。对于接受到的任务,你总得想办法去完成整个任务。你可以去找资源,如果人手不够,加人。如果时间紧张,加班,反正你总得完成任务。


11,不能给自己找借口。你不能说你接手是怎样的,然后问题又是怎样的?既然不能拒绝,那么只能你去面对了,无任何理由。而且必须要统筹全局。对这件事情,用到的技术,需要的工具,整个工程,涉及的相关人以及他的性格,脾气,能力,技术,想法等都需要统筹去分析思考。我应该如何才能让团队成员既开心接受这份任务,又按质量完成它。一定要让当事人非常愉快地接受任务。大家和和气气地完成项目


12,如果有问题,讨论。如果超出自己能力,那就找资源,寻求帮助,因为你总得去面对,并且把事情做好。


13,记住,一两个人命令维护团队10或者20人靠个人魅力。100多人那就靠规章制度、流程控制。


14,还是得踏踏实实。花时间和精力去理解每一个小功能点,一定不能想当然,或者感觉模棱两可的方式,一定要在脑袋中浮现整个逻辑过程。只要踏踏实实做到对每一个小功能点熟悉,那么组合起来,就会起到很大的化学作用的。


15,编程是一件有意义的事情。编程如果只满足今天,代码将没有任何意义。编程是一件非常系统的事情,推荐看《代码大全》。


上述15点是一些经验,当然也算是方法论。


 

整个流程需要掌握的知识体系。


 

链路层,IPTCPHTTP。内容太多,深入理解HTTP


中间件(如Tomcat)《Tomcat权威指南》,监控工具probe


JAVA代码。设计模式推荐看《Head First设计模式》,代码结构推荐看《重构改善既有代码结构》《代码整洁之道》。代码内容推荐看《修改Java程序151个建议》和《Effictive Java》。整体系统提升推荐看《代码大全》。


JVM。自然是《深入理解JVM虚拟机》。监控工具jvisualvm。命令参数jmap,jstat,jsack等。


MySQL。推荐看《高性能MySQL》,监控工具MONyog


操作系统。推荐看《鸟哥的私房菜基础篇》。理解整个大致架构。


硬件。推荐看《深入理解计算机体系》。


算法之类书籍,就不推荐了。根据实际情况反过来去看既有实现。比如IO别人是怎样实现的。Map,List又是怎样实现的

 

哈哈,经验还是差很远的。希望有像我一样的,刚入门的人可以看见这篇文章,我们共同成长。这些书籍,我都学习过,有的都看了2次了。


仔细品味这篇文章,你会发现你会用一生来学习这些知识,尤其各个环节。有些环节我们熟悉即可,但有些环节我们必须精通。什么?会SSM,SSH。什么?会LVSNginx,CDN,Zookeeper,Cache。什么?会Docker,kubernates。其实,说心里话这些真不算什么,这些是整个生态系统中一个环节而已。但是深入理解其设计理念和原理,那还是非常牛逼的人。


我渴望对整个生态系统有一定深度的理解。我知道短期内,看不见效果。真的,会设计模式,能够码出优美的代码,理解JVM就牛逼了?那不一定啊。我经常是被人嘲笑的对象(因为看了些书,理论过重,实践太少,这不刚入行嘛,别急嘛)。哪怕是我独自一人完成性能测试和压力测试,自己修改各个环节,并且代码码得还是可以的。这样的员工,有人需要吗?现在系统稳定地在学校跑起来了。哈哈,菜鸟正在通向牛人路上.......

附上三张整洁代码:希望大家评论和指出修改意见,因为我想进步。


日期:2018-01-24  文章:原创   微信号:ouyangtian199682  笔名:Sanding

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值