对比与测试

这周有点点感悟想写出来。选择一样技术,首先要对比,能对比的前提了解了很多相似的技术。简单说个例子吧,android网络库:apache httpclient,java connection,AsyncHttpClient,Okhttp,volley,Retrofit等,该怎样选择呢?首先要做的是对比这几个库的适用场景和未来支持情况。apache httpclient,java connection,AsyncHttpClient,Okhttp都只能算是底层的工具库,只停留在协议层面上的实现。而volley,Retrofit是在工具库基础封装的,是应用层的库。volley,Retrofit能更有效的控制线程,从而更稳定的工作。从应用场景上做了区分,还要做领悟的区分,apache httpclient Android官方从6.0开始放弃了,也就是所有依赖这个库的工具库都残了。这个时候需要阅读一下源代码,volley是基于httpclient的,所以在android 6.0上也很惨,而Retrofit是新兴的,底层基于全协议的OKHttp,性能也不错,是当下不错的选择。那么在案场为什么选择了volley呢,volley比较轻,而在我基于OKHttp修改过,既然能修改了,代表我对其原理也算了解,相反对Retrofit并不是很了解。在实践中我们应该选择有能力去修改的库,这样无论你遇到什么未知问题,都不可怕。选好技术之后,就应该自己做些测试,想办法做测试,这样才能掌握数据,我们不能人云亦云的,人家说这个好,那个好,我们就跟着用,我们应该要有自己判断。要测试,首先要知道测试标准和测试工具,这和优化性能是一样的,瞎搞就没有意义了。工具是第一步,没有工具的,自己写测试代码,多次数据的均值作为最终的测试结果。最近一段时间我也在大量阅读开源库的代码,对比各个库的实现,比较实现上差异,再通过测试对比性能。这样一个过程有什么意义呢?1、懂得原理,2、知道怎样优化。这周某服务器开发群说的几个总结,我觉得挺好的。“看一个语言, 一个系统, 一个项目, 好不好, 我们要不要用, 最最重要的是看:1. 背后的社区是否强大, 这个直接关系到你可利用的资源是否丰富, 出了问题是否很容得到解答。2. 背后的组织是否可持续发展, 一般个人项目, 除非是小工具, 否则很容易蛇尾, 导致你后续只能被迫迁移。” 不是实习生的我们要学会选择,要有选择的能力,这样将来才有可能独当一面。 顺便也说说最近学习node.js的感受吧,要是以前学一门东西,首先要做一个demo或者成品出来,然后在使用过程中发现问题。喜欢感性的认识,喜欢实实在在的感觉。也就是这样,在没有实践环境之下,很难深入学习,导致最后没有自信,总是觉得别人的任何做法都很好,存在很多未知的问题。这次学习node.js的主要目的:1、了解服务器集群,2、了解session共享,3、了解数据集群或者主从配置,4、如何优化性能,5、如何将曾经多年学习多核编程的理论融合到实践。开始学习的时候,我把node的文档都看了一遍,对node的整体有所了解,然后做了demo,用webbench做压力测试。部署调参数,再压力测试,对比数据,做到心中有数。node裸测,配nginx反向代理负载均衡再测试,加上redis session和mongodb测试等。最后发现在我的MacBook上,100个并发数吞吐量是最好的。通过这样的实践,可以掌握一套方法,可以帮助你写技术实现报告和可行性分析。掌握测试方式,这样才能快速定位问题,提高效率。 这周同事说,要会用断点,很快定位问题的。哈哈,在过往的5年程序猿生涯里,我没有用过断点,今年才开始用的。没有用断点的生命里,我也锻炼了不一样的思维,快速分析问题和高效的推测能力。当然还是建议大家使用debug模式,测试工具,这些适用于大部分人。师弟说他可以不测试改bug的,是组里面比较懒,但是改bug最多的,这些都是题外话啦。做性能优化必须要懂的两样东西:1、原理,2、工具。随着技术技能的成熟,我们不可能还以原来的方式学习的,总是依赖环境,总是依赖当前的项目。我们应该通过测试模拟各种环境,达到某种标准,虽然现实环境和测试环境会有差异,但是优化的方法是一样的。很简单,我能在MacBook上测试出,100个并发一秒的吞吐量820,我同样可以在现网机器上得出不一样的参数,确定需要多少台服务器集群。甚至还可以再测试同一个机器开启多个实例,测试整台服务器的最佳运行状态。细心的人在一个demo上就可以学习到很多东西,当然我更希望选择比较出名的开源项目测试,而不是都是很水的开发人员做的东西来玩来测。虽然努力了就会有收获,但是收获不一定能成正比,甚至别人带到坑里去了。在学习过程中,肯定会遇到疑惑,需要一个讨论的环境。有时候我就会问问同事,压力测试的标准是怎样的,是不是不包含失败的呀,还是在多个失败是可以容忍的等等。 能否独挡一面,就看一个人在处理未知情况下的能力,在选择里面能否不跳坑,在项目进度是否有可控能力。 处理未知情况的能力,需要比较广而深的知识,需要具备将无处理过问题转为曾经处理过的问题,然后解决。在成长的过程中,我们有时候过程关注细节,浪费了很多时间,我们只需要知道常用的方法和方案就好了,没有必要面面俱到。关注了一个今年的Qcon,国内的大公司开始使用react native了,阿里开源了相似的方案weex,腾讯推出了x5等,或许将来移动端开发会有所变革,但是无论怎样变,原理是不会变的。CPU从单核到多核,服务器从单机到集群,我们的编程之需要做些细细的调整。复用昨天说的那句话 “ 看着一些人,一时说用swift做android,一时说做服务器!总是希望有一门万金油语言…我只想说语言都是很表面很肤浅的东西!c/c++就是万金油了,但是你用它开发了?现在都是看项目看需求看人选技术的!一个项目很少只用一门语言的!思想体系和架构体系才是真正的跨平台!正确看待语言,一直追着语言跑,和一直追着开源框架走是一样的,永远在被动,永远在加班,没有多少积累。会100种语言还不如会50种方法。核心竞争力就是能各种语言的优势糅合一起,还能发挥最高的效率和性能。”很多方法都是放之四海而皆准,如在redis 2.0 集群,memcached集群等都是相似的,都是什么hashing ring,sharing,hash,环状等,还有主从,双主模式等。

你可能感兴趣的:(对比与测试)