软件研发

【专家视点】Java开发与技术挑战的思考

2015-12-24 09:47:17 | 来源:中培企业IT培训网

到目前为止,接触Java语言已经有将近10个年头。从趴在学校实验室中认领师兄提供的论坛系统开发任务,到参与WebERP构件化平台、网络资源聚合平台、电信增值业务平台、企业门户网站以及运营管理平台的研发,再到后面的掌上证券、软件商店、移动支付平台等移动互联网平台建设,不论是PC端,还是移动端,底层的技术一直都是用Java架构来进行实现的。期间参与过多次的Java技术培训与问题指导,以扑火队员的身份见证了形色各异的Java坑,从而不断提醒自己要跳出Java语言本身,去思考一些开发中的技术困惑和挑战。  


Java的成长经历  


Java语言已经走过二十个年头,岗位和身份的变化,也伴随着Java的同步成长,其中也包含了对技术理解的思考与变化。主要体现下面四个阶段:开发工程师、系统架构师与技术主管、技术顾问、技术合伙人(联合创始人)。  


开发工程师  


以前大学学的专业是数学而不是计算机,Java编程之路是从《ThinkinJava》这本书开始的,当时每天晚上十二点看到凌晨二三点,就这样持续将近3个月,面向对象的编程就这样入门了。Java语言上手非常容易,装一个IDE工具(Eclipse、Myeclipse等等),找一本参考书就可以开始,但是要想深入,还需要学习很多东西。从Java的常用包Java.lang.*,Java.util.*,Java.net.*等等开始,逐渐开始学习dom4j、jdom、log4j、hibernate、spring、ibatis、struts等等以开源为主体的各种Java扩展技术,jsp、mvc、ssh等等也是经常挂在嘴边的技术,JSON与xml的封装和解析也是数据配置与交换中常用的技术手段,明白和使用正则表达式也是开发中一块比较兴奋的事情。运行环境Tomcat、JBoss、WebLogic等等都用过也是Java知识丰富的一个佐证,能用过就懂Web容器与应用服务器的区别。  


由于Java广泛用于各种互联网的场景中,学习Java开发,还需要学习SQL语言以及各种商用关系型数据库MySQL、SQLserver、Oracle等等(NoSQL、memcached等各种非关系数据库)的安装与使用,在进行专业领域还要研究Lucence等等搜索引擎开源框架和组件。有些专注前端的可能还需要学习HTML、JavaScript以及jQuery之类的知识。  


Java入门阶段接触最多的开发可能就是论坛系统、管理信息系统以及OA系统之类,深入学习后面临的项目和平台就比较专业了,比如软件商店、支付平台、广告平台等等。由于Java相关知识非常广泛、开源项目和平台众多,在这里一直是个学习者,Java二十周年技术人员学习的好平台。  


系统架构师与技术主管  


谈到Java优点时,大部人分都记得它有一个非常先进的垃圾回收机制,在对象不被使用时可以自动回收,不用开发人员关心,甚至把这个说成为是Java优越于C++等其他面向对象语言的一个重要特性,而在实际中,对象引用错误、JVM内存以及堆内存的分配设置不合理等等现象,往往会引发服务器应用出现outofmemory的错误,进而宕机。Java的垃圾回收函数System.gc()只能发送垃圾回收请求,实际执行时间仍旧不总是可靠的。在进行内存对象进行处理时,Java对象在强引用下是不可回收,使用Java的软引用(SoftReference)机制可以做到让内存空间不足时自动释放不用的内存对象,从而保证内存空间一直可控。  


在Java应用开发中,逐渐开始使用设计模式的思想来进行关键模块的开发,单态模式、组合模式、适配器模式、观察者模式等等面向对象的特征也得到很好的发挥。基于Java架构设计中更多通过机制性保证来构建一个比较稳健可扩展的系统,比如无状态设计、同步异步分离、动静分离、模块服务化、多级缓存等等。  


在技术选型上,像软件商店、移动支付平台,除移动端使用Android实现,服务器都可以使用Java进行实现,这样一方面可以重用原有程序积累,又可以通过Java的丰富开源组件来加快开发速度。但技术方面的选择上不再以Java为唯一技术选择,后端存储层面,可以把关系型数据库、非关系型数据库以及文件系统进行整合考虑,不再把单一的“Java+关系型数据库”作为软件系统的唯一设计标准。后台任务服务以及程序逻辑都可以用Python、Shell脚本进行实现也非常好。多种技术组合使用可以充分发挥每一种技术的优势,这也是技术选型的一个重要原则。  


JavaEE的分层设计思想给软件开发提供了有利条件,根据前端、数据持久层、控制器层、代理层、组件层等视图可以有效地把工作模块分解给不同的团队成员,从而保证大型项目的任务分解与工作可跟踪。在产品进行迭代和升级时只需要修改受影响的代码部分就可以保证最大限度的代码稳定性。  


技术顾问  


Java技术输出主要涉及三个方面的内容:基础知识培训、基于性能优化的诊断分析、基于业务流程优化的架构重塑。Java基础知识培训主要定位在Java新手快速扫盲;基于性能优化的诊断分析主要集中在中小型公司,它们一般开发有一套自己的Java系统,但总出现系统问题或者访问量就是上不来(特别是它们购买的是性能比较好的服务器);基于业务流程优化的架构重塑主要对业务上有新需求的Java平台改进,原有平台比较混乱,需要进行统一整合,它们的立足点不是因为现有平台不能运行而影响业务。在这个维度,Java语言本身被包装成服务,已经不再是开发某一个模块那么简单了。Java平台出现的不同坑也只有经历了才能知道。  


技术合伙人(联合创始人)  


以互联网为载体的创业公司往往喜欢招募PHP的开发人员,主要是因为网站类开发使用PHP比较快,同时也有一定量的开源平台可用。从技术合伙人的角度思考,重塑和定义业务、优化管理是使用技术比较普遍的场合,依托开源项目或原有积累进行二次开发就比较方便,对于资源比较丰富的企业可以选择完全从零开始进行自主开发。技术的应用和功能模块需要有一定的预见性和主动性,是不是Java语言实现并不是最重要的,业务自由度越大的时候对Java语言本身的依赖性就越小。  


有关技术挑战的思考  


Java语言的学习和运用一开始可以让我们更多的关注在Java技术应用本身,随着身份的变化和多元化的场景的出现让我们对Java又有更加深入的理解。那就是Java是一门编程语言,我们处理和解决问题关注的更多层面不是选择哪一门语言,而是如何更好地满足实际场景的需要。跳出编程语言来思考问题,可以有助于看清楚技术的优势和短板,方便发现和理解一直存在的技术困惑和挑战。这里先讲两个与Java项目有关的真实案例。  


酷派通行证Android应用工作交接的冲突  


酷派通行证Android版是一款用于酷派手机应用进行身份登录鉴权以及掌上证券支付的移动应用,以前是西安一个团队负责进行维护和升级,后因工作需要移交给北京所在团队,当时就指派一个比较年轻的同事接手这个项目。Android应用主要是用Java开发的,兼有少量的C语言开发,其中C语言部分主要用于进行私有协议数据交换,保证数据交换安全。代码交接过来,本地开发环境稍加配置就可以消除所有编译错误,但打包发布成独立APK后却怎么也无法正确调用(如图1效果所示),与西安同事进行过确认,所有的代码是完整可用的。  


当接手工作的同事向我求助时,我当时也不清楚,只是从经验角度提供几个可能的原因让他进行分段验证,进而定位可能出现的原因,就这样持续了几天还没有解决,但深圳总部的手机项目已经反馈这应用有Bug出现,希望我们尽快进行解决。由于现在还没有本地运行通过,所以一直无法进行修复和更新版本。手机项目的入网、量产等环节都是有非常确定的时间节点,软件代表的邮件和电话也在不停地跟进这事,在这种压力下,接手这个工作的同事甚至产生不干了的想法,因为不知道这个问题是怎么回事,无法进行解决,更回答不了具体解决问题的时间点。这个问题持续两周,经过仔细测试和排查,发现问题的关键出现在编译环境上,交接前的编译环境和新的环境版本不同,从而导致高版本的编译程序无法运行在低版本的环境下,调整编译环境后问题自然解决。  


遇到未知的问题和现象来临时普遍会表现的比较不自信,精神压力比较大,很难一直保持对Java专业知识的冷静和思考,容易产生放弃解决的矛盾心理。研发人员在进行产品研发时面对的问题往往是多方面的,并不是说一眼都能看出来是哪一行代码错误那么简单,没有找到原因之前可能是无解的,可以说是一种煎熬。  


标签: Java开发