投奔怒海——一个Domino老程序员眼里的Java开发_domino开发用的人为什么这么少_starrow的博客-程序员秘密

技术标签: Domino  IBM Domino开发菁华  Java  编程与IT  

这是一个以键盘鼠标为谋生工具已十多年的人初次进行专门的Java开发的体验和感受,对于Java程序员,这些也许早就习以为常,那就把这当成从一个来自不同世界的新人眼里看看他们自己的工作;对于我的Domino同行,这些体验或许将来有更多共鸣的可能。

在加入到这个Java产品开发团队之前,我的Java开发经验如下:十几年前跟着一本Java入门书做练习写的几个Applet,Domino项目开发中写的几个读写数据库和外部邮件的代理,XPages开发中的少量Java Beans和一个流程库。除此之外就只剩下对用Java做web开发涉及到的繁多的名词Struts、Hibernate、Spring……耳熟而已。

我的工作是给一个大型Java产品增添功能,面对的环境如下:

Linux操作系统,意味着Shell命令和脚本、SSH连接和PuTTy客户端。

JBoss应用服务器

MySQL数据库

Eclipse+Maven+GitHub的开发环境

采用Apache CXF的Web Service开发,随之而来的就是WSDL、SOAP、XML Schema、JAXB……

我的感觉就像从一间熟悉的暗屋走出,霎时被强烈的阳光照得睁不开眼。撇开我专栏文章一直在讨论的Domino在技术架构和开发上的独特性,这样的个人感受恰恰反映了一个封闭的适用于专门领域的开发平台与一种通用的(Versatile)开放的编程语言和环境之间的巨大和根本的差异。

Domino环境下的快速开发是建立在现成的封闭不透明的基础架构之上的,在传统的客户端应用程序开发里,用户管理、权限管理、登录过程、应用程序界面、与邮件的集成以及视图等等都是系统自带的功能。这一方面极大地省去了开发者的时间和精力,保证了应用程序的基本框架上的可靠性,另一方面这些“黑盒”一样的功能基本没有代码接口,无法定制、调整和优化。在设计应用程序的这些部分时,程序员与其说是在开发,更像是一个软件用户。

Java等通用语言的开发则完全不同。一切都是建立在可查询的代码基础上的。没有现成的功能,同时也没有天然的限制。各种框架和工具类库应需而生。

如果说Domino程序员时常遇上的问题是没有足够的资料和文档,Java同行则只可能抱怨“信息”太多,规格说明(Specification)、标准、API文档、汗牛充栋的教材和随处可寻的参考资料、当然数量最多的是不断衍生和更新的技术、框架、类库和工具的资料。我曾经和朋友说过,一个入行五年的Domino程序员和只有一两年经验的新手在知识和能力上有较大差别,但是再干上五年,改变就不大了。这样的论断对Java程序员大概不适用,即使有十年经验的程序员,仍然会面临不断涌现的新知识和技术。记得我刚开始学习LotusScript类的文档时,觉得它们的功能范围和数量都有限,偶尔要用到Java和.Net时对包罗万象的类库很有兴趣。现在由于记忆力和求知欲的下降,在做Java开发时每每需要查询API文档和技术资料,就像读一篇文章不断遇上生字要查字典一样,有些不堪其苦了。对比今昔,如同一个嫌游泳池里没有风浪过于平静的人突然被扔进太平洋,刚从一个浪里钻出,又被一个巨浪拍下。

转到这个新环境下开发,给我印象最深的还是三点:

一是开源环境下Java积累的代码如此之多。使用Maven,轻松地往项目里添加几个依赖的jar,Maven自动计算和下载的依赖项之多可能会让你大吃一惊。互联网上大量的Repository构建了一个代码重用和共享的海洋,在这里你才会意识到全球Java程序员工作在一个无差别的环境里,无数大脑日积月累的集体成果。每个人的贡献就像水滴一样汇入大海。Java自带的庞大类库在可以依赖使用的资源面前也显得小巫见大巫。可使用的代码之丰富和便利,也使得一个项目或产品迅速被公共代码胀大。我目前开发的产品的war文件总体积已达到五百多兆。

二是体验到Java的惊人内存需求。一个应用服务器动辄消耗上G的内存,各种开发工具也张开血盆大口,以百兆为单位吞噬着内存。反观运行本机码的Domino服务器和传统的客户端,空闲时每个进程只占用区区几兆内存,整个Domino服务器加起来也不过几十兆。Java的跨平台特性和开发高效从这个角度便可以用“以空间换时间”来概括了。可以这种海量相提并论的就是日志的数量,几分钟的部署若干个war的时间里,屏幕疯狂地刷动。一天下来,鼠标没点几次,应用产生的日志就已数十兆。

第三点与Java语言的特性相关。因为不像在Domino那样的环境里有许多现成且却无法改动的功能,所有feature都要依靠代码实现,并且Java的语法本身有些冗赘(即是需要大量的所谓Scaffold),导致代码的数量随项目的成长迅速增多。Domino中的项目受制于平台限制,得益于现成功能,规模都不大。典型的各种文档管理、流程应用数据库,都可以一人开发和维护,即使是复杂的一整套OA和企业的业务系统,代码的总量也不很大,一个人完全可以掌握所有的细节。与此相对地,一个复杂的Java产品代码上十万行,每个开发人员都只可能熟悉其中部分,对产品的整体则仅有结构上的理解。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/starrow/article/details/38124105

智能推荐

node0.12升级到6.x 实战_weixin_34137799的博客-程序员秘密

前几天node官方发布了6.x版本,官方介绍年底将不会维护node0.12,node0.10等版本,由于我们的node项目当前版本是node0.12,所以着手升级一下我们的服务端使用的node版本,打算升级到node6.x,从官网可以看到当前最新的版本是node6.1.0.下面将记录整个升级node的过程。安装nvm(node版本管理工具)安装nvm...

PCI DSS安全标准,支付卡行业的安全卫士_chonglan4183的博客-程序员秘密

支付卡的使用在日常生活中十分普遍,现金支付越来越少,刷“卡”消费成为大多数人的潜意识选择。一“卡”在手,即不用担心出门忘带现金,也省去了现金支付找零等繁琐的流程,为人们的生活带来了许多便利。 但是在刷卡消费的时候,用户的一些相关信息却会被商家保留,一旦这些资料不慎泄露...

Java自定义异常_jiqimiao的博客-程序员秘密

Java 语言要求 java 程序中(无论是谁写的代码),   所有抛出( throw )的异常都必须是从 Throwable 派生而来。 当然,实际的 Java 编程中,由于 JDK 平台已经为我们设计好了非常丰富和完整的异常对象分类模型。因此, java 程序员一般是不需要再重新定义自己的异常对象。而且即便是需要扩展自定义的异常对象,也往往会从 Exception 派生而来。所以,对于 jav

dataframe保存为txt_如何将TXT文本格式的批量经纬度值导入到奥维成为标签_jck?????的博客-程序员秘密

文本编辑:示例1:最基本的,只批量导入WGS-84经纬度值成为标签,不需要导入标签名称。 文本编辑格式:经度值+空格+纬度值+换行,如下图:示例2:除WGS-84经纬度外,还要导入标签名称。文本编辑格式:标签名称+空格+经度值+空格+纬度值+换行,如下图:示例3:导入完整的标签,定义了标签的各个要素文本编辑格式:标签名称+经纬度+海拔+标签名称显示样式+标签图标样式+备注内容的名称显示样式代码说明...

python中object转为float_object怎么转换成float数据_August丶Starten丶Sin的博客-程序员秘密

这次给大家带来object怎么转换成float数据,object转换成float数据的注意事项有哪些,下面就是实战案例,一起来看一下。数据类型转换:今天遇到一个问题,就是DataFrame类型的数据里是str型的数字,想把数字转换为int 或float;百度没有发现好的,也可能输入的关键字不对,找不到;DataFrame.info()之后发现数据全是object之前有一个方法就是:先trainda...

随便推点

druid1.1.22.jar 包下载地址_druid-spring-boot-starter1.1.22架包下载_muZi_Lh的博客-程序员秘密

druid1.1.22.jar 包:https://repo1.maven.org/maven2/com/alibaba/druid/1.1.22/

Linux中makelfile讲解_sinat_34665848的博客-程序员秘密

最近在学习Linux下的C编程,买了一本叫《Linux环境下的C编程指南》读到makefile就越看越迷糊,可能是我的理解能不行。            于是google到了以下这篇文章。通俗易懂。然后把它贴出来,方便学习。           后记,看完发现这篇文章和《Linux环境下的C编程指南》的makefile一章所讲述的惊人的相似,只是这篇文章从一个实例切入,在有些地方比

矩阵类型及其操作_typedef struct d3dxmatrix_bluedump的博客-程序员秘密

在Direct3D中,顶点坐标变换通常是借助于矩阵实现的,因此下面首先介绍在Direct3D中提供的各种矩阵类型和相关的矩阵运算函数。 1、D3DMATRIX矩阵类型D3DMATRIX是Direct3D中最简单的矩阵类型,其定义如下:typedef struct _D3DMATRIX { union { struct { float

POJ 3090 Visible Lattice Points (欧拉函数)_w20810的博客-程序员秘密

题目:http://poj.org/problem?id=3090题意:在平面直角坐标系中,从(0,0)到(x,y)画一条线段,其中x>=0,y>=0。若这条线段上面没有其他的点,说明点(x,y)是可见的。求可见点的个数。                           (0,0)分析:列出点(x0,y0)到(0,0)的直线方程y=(y0/x0)*x,很容易想到就是求互质点的个数。

往当前内核添加驱动程序_yangkunhenry的博客-程序员秘密

接上前面编译内核的文章内核编译好了之后,自己要往内核中添加自己的驱动程序,如果加呢?选择一个目录加入自己的驱动文件[email protected]:~/Work/linux-source-3.13.0/$ 因为前面编译内核是在上面这个目录下编译的所以就在这里添加自己的驱动文件,在driver/char 下创建一个目录[email protected]:~/Work/li...

李宏毅2021年机器学习作业5(Seq2seq)实验记录_李宏毅机器学习作业5_DogDog_Shuai的博客-程序员秘密

李宏毅2021年机器学习作业5学习笔记前言一、问题描述二、实验过程2.1 基于RNN2.2 基于Transformer三、总结前言声明:本文参考了李宏毅机器学习2021年作业例程,开发平台是colab。一、问题描述机器翻译B站作业讲解视频Colab地址二、实验过程2.1 基于RNN操作:直接跑原代码就可以中途意外:跑程序时中途断开连接了,再跑就分配不到GPU了。训练时间:6小时2.2 基于Transformer操作:在代码里把Transformer部分注释取消注释,然后

推荐文章

热门文章

相关标签