Warning : caught an JavaWebDeveloperException() in MobiAppAge.foward() function

今天在csdn首页看到一篇推荐文章《RethinkDB:为实时应用而生的开源数据库》

看了一段示例代码,如下:

r.table(geo).get('sfo')('location').toGeojson.run(conn, callback);
// result passed to callback
{
    'type': 'Point',
    'coordinates': [ -122.423246, 37.779388 ]
}

让我想起了ajax技术刚兴起的时候,有一个比较有名的javascript框架(忘了准确的名字了,姑且叫做jsRMI),与此形似,也是试图在前端网页上通过javascript调用远程的逻辑接口(RMI)。

从这些框架的用户(也就是互联网应用的开发者)角度看——如果我没有理解错误的话(rethinkDB我没有细看它的feature list),两者都是试图在前端解决(部分)业务逻辑问题——或者我们称之为侵入后台业务,那么,两者的区别只不过是程度上的不同——jsRMI只不过是“试探性”的侵入业务逻辑层,而RethinkDB则简单粗暴的直接干到了数据层。

于是乎,有了一个比较含糊的感觉, 这个感觉早已有之,但是始终无法明晰化,不妨先写下来,以供以后参考验证。

正如我的标题所说:Warning : caught an JavaWebDeveloperException() in MobiAppAge.foward() function

我感觉到了一个警告 Warning,虽然它还没有升级到 ERROR、FATAL、CRASH等级别,但是也是一个比较明确的预兆,尤其是对web开发程序员而言——那就是,世界变了,传统的互联网应用开发模式也变了。

java初期的的口号Write Once,Run Anywhere所针对的应用场景是洗衣机、电冰箱、电视机等等,借着互联网的东风,以JavaApplet的视觉表现力风光一时,然后因为flash的出现,又马上销声匿迹,转入后端应用并大获成功。

在这一场转折中,互联网应用的开发分成了两个泾渭分明的阵营:后端开发:重逻辑和业务——前端开发:重效果和表现力。

但是,富客户端的出现,在解构这一切。

虽然富客户端的提法已经很早,但是遵从互联网业内操蛋的”概念先行“惯例,直到今天,我们才能肯定和确认它的影响力,比如:移动应用。

我们的战场开始从PC端转向移动终端——虽然PC的”用户份额“仍然是大头,但是,从市场的反应来看,移动端的”利润份额“更高,也更能体现”价值规律“:无论是从资本方还是劳务方的角度来看。

一个简单的例子就是:5年的java web开发人员和2年的android开发人员谁更容易达到期望的薪资水平?

我并无意于引发争论或者表达对两种开发人员技术水平高低的某种既定立场,也不想批判某些企业急功近利、蜂拥而上的思维模式,举这个例子只不过简单的说明一下市场对技术的认可程度。

也许web后端开发人员应该能够警觉到”前/后端开发“某种平衡的破坏,甚至低头承认自己的某些傲慢——”写java是造原子弹,写javascript是卖茶叶蛋“。事实上,金蛋银弹还是坏蛋,归根结底是市场说了算的。

比如Node.js的兴起,我认为是一个很明显也很成功的”需求决定论“的注脚。

我没有兴趣拿node.js在各项技术指标上去和java的某些框架去对比,这就和争论”java和c++哪个性能更好“一样无聊——我们早就该认识到,没有烂的开发语言、只有烂的开发者。

在我的眼里,Node.js的最大特点是——它是基于javascript的。这也就是它成功的原因:传统富客户端的开发者集中在基于Flash的action script领域和基于浏览器的javascript领域,而这两种开发语言都是ECMA Script的子集——正因为如此,开发者能够轻松快捷的构建产品原型、验证产品设计以及快速发布上线。

而在传统的开发模式里面,前后端开发分离的情况下,真正最直击消费者的前端开发者要花费和浪费大量的时间和精力去沟通需求、确定接口乃至于在各个后端功能模块的开发者之间扯皮。

移动应用领域的厮杀是惨烈的,拿着传统的软件工程和项目管理的经验去硬套——这些经验的总结很多还来自于与互联网无关的行业软件领域——无异于自杀行为。

而在这种高烈度的瞬息万变的环境中,一个优秀的PMP可能永远无法达到”神经猫“发布三天访问过亿的成就——虽然”神经猫“的成功有一些”莫名其妙“的成分,但是不可否认的是,这种在产品和开发上的”投机“在移动应用中甚至已经成为一种常态——发布十几个甚至几十个个小应用,然后期待其中的某个能够成功,从而收回所有成本!

关注用户、关注应用的体验乃至视觉表现力——眼球经济也好、以人为本也好、忽悠挣钱也好,大环境决定了前端开发者的位置逐渐重要起来,而后端应用开发者的”落寞“和”吃力不讨好“是必然的。

不如我们设想这样一个场景:当我们这些长期从事后端开发的”老程序员“还在设计MVC(模型、视图、控制层),考虑是DTO还是POJO等等等等的时候,前端开发人员说:您歇会儿,没这么麻烦,我用RethinkDB、RebuildDB、RefactorDB之类直接调用数据库就好了,反正app的逻辑也不复杂,而且我调用起来更方便。

很有压力对不对?不过我觉得很有趣——这也是我一直所主张的东西——任何体系和结构的发展趋势应该是简单而不是复杂。

归根结底,这是一场客户端引发的血案——哈姆雷特同志无语问苍天:THIN OR FAT CLIENT? THIS IS A QUESTION.

现实是,移动应用的富客户端定位,决定了战斗在后端的同志们要把很多的东西交出去,不管愿意不愿意。

以mvc模式为例:

Viewer已经完全放弃了,

Controller还能控制个毛线,mobi app只找你要简单接口而已

Model?Node.js是跑在server上的啊,亲~

写到这里,似乎也没有什么特别想唠叨的话了,做个最后说明:

首先,我没有鼓吹javascript和贬低java,只不过这两种语言代表了最明显的一个分野——需求的直接和多变 VS 实现上的复杂和顽固——我个人对php和python玩儿什么OOP是很不以为然的。

其次,我的一个基本判断是在移动应用领域,传统的前、后端开发的泾渭分明已经不存在,两者在贴近——不管是外力还是内因、愿意还是不愿意。而技术的趋势更偏重于轻量和快速的开发语言、框架和服务,其支持的服务对实时性、交互性要求更高。

再次,在瘦客户端thin client领域,传统的势力范围并未发生大的变化,变化的只是环境,包括利益——这也是让开发者纠结的地方,至少不少java开发者转行android是一个事实。

最后,该如何适应这种变化,我也没有什么答案。也许,

向前走——做android、ios开发;

向后走,去设计、实现更底层的高性能框架和服务(也许可能要扔掉http);

向左走,延续老本行,简单的”二八率“的话,八成份额也还是PC

向右走,卖水果,卖大枣,干嘛不吃饭呢:)

时间: 2024-10-25 16:17:40

Warning : caught an JavaWebDeveloperException() in MobiAppAge.foward() function的相关文章

关注LoadRunner脚本回放日志中的Warning信息-转载

关注LoadRunner脚本回放日志中的Warning信息 最近在与大家的讨论中发现了LoadRunner的很多问题,出于解决问题的出发点,我也就相关自己不理解的问题在Google中搜索了一番,并通过一些实例也去实际操作了一遍,发现很多问题确实并不是那么难解决,而只是我们不够细心,没有认真去分析和总结.这里简单列举我最近去研究的一个问题,就是关于LoadRunner在脚本回放日志中出现的Warning信息,也就是所谓的警告信息,通常我们可能觉得只要在录制回放过程中没有报error就认为脚本是ok

Concurrent.Thread.js

(function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( this.Data.Stack === undefined ) this.Data.Stack = undefined; with ( function(){ with ( Data ) { return function () {

[CasperJS] API--The casper module(译)

原文网址http://docs.casperjs.org/en/latest/modules/casper.html ps:原谅我的渣渣英语 1.create()创建一个casper实例 var casper = require('casper').create(); 2.Casper.options 设置casper属性 1)clientScripts Type: Array Default: [] 每一个被加载页面中的所有路径集合 A collection of script filepat

Zend API:深入 PHP 内核

Introduction Those who know don't talk. Those who talk don't know. Sometimes, PHP "as is" simply isn't enough. Although these cases are rare for the average user, professional applications will soon lead PHP to the edge of its capabilities, in t

替代alert的消息框和提示框

alert提示框由于外观不太友好,所以一般都不用alert了. 我在这里使用bootstrap的样式,写了一个可以单独显示消息,也可以确认取消的提示框. 使用的外观如下: 一:单独显示消息: 二:确认和取消: 单独显示消息的方法传递类型,信息,显示时间以及回掉函数.其中通过重载可以只传递信息. 确认和取消的方法传递类型,信息以及回掉函数.其中可以通过重载可以只传递信息和确认后执行的回掉函数.如果点击取消就去隐藏该提示框. 下面是代码: 1 //success 成功 2 //info 信息 3 /

linux :vmware kernel update导致vmware无法打开,解决

kernel 4.7 and VMWare Workstation 12.1. # cd /usr/lib/vmware/modules/source # tar xf vmnet.tar # mv vmnet.tar vmnet.old.tar # sed -i -e 's/dev->trans_start = jiffies/netif_trans_update\(dev\)/g' vmnet-only/netif.c # tar cf vmnet.tar vmnet-only # vmwa

VS之XML文件操作

XML,可扩展的标识语言(eXtensible Markup Language),具有多种优势,所以现在被广泛使用,本文通过一个简单的例子来实现对XML文件的保存和读取操作. 使用工具:VS2008 使用语言:C++ 开发步骤: 1.新建对话框程序 2.添加XML相关类 该类摘自网络 Markup.h // Markup.h: interface for the CMarkup class. // // Markup Release 8.2 // Copyright (C) 1999-2006

【JSTREE】 jstree-初始化时默认选中根节点

var contacttree = $('#contact-org').jstree({ "core" : { "animation" : false, "multiple" : false, "check_callback" : true, "themes" : { "icons" : true, "dots" : false }, "data"

[转]nodejs中的process模块--child_process.exec

1.process是一个全局进程,你可以直接通过process变量直接访问它. process实现了EventEmitter接口,exit方法会在当进程退出的时候执行.因为进程退出之后将不再执行事件循环,所有只有那些没有回调函数的代码才会被执行. 在下面例子中,setTimeout里面的语句是没有办法执行到的. 1 process.on('exit', function () { 2 setTimeout(function () { 3 console.log('This will not ru