想了解java可视化编程吗?想了解可视化编程之罪 —— 可视化编程是否真的没有未来?,可视化编程:利用图形来创建程序,却被程序员认为是糟糕的想法?,超级好用的 Java 数据可视化库:Tablesaw?? 吗?......本文带你一探究竟。
今天想聊聊可视化编程(visual-)的未来发展,喂喂,咱们这儿还没开始,各位大佬先别急着走啊您……确实,可视化这个概念跟任何技术并称,都是技术前沿、下一个风口、万亿市场的代名词,数据可视化、可视化分析、神经网络可视化……唯独在一个领域似乎成了low和过时的象征——可视化编程。无论资深程序员还是风投大佬,只要你跟他提起这个概念,对方都会立刻露出一种“不提这个还能聊”的鄙夷神情。然而可视化编程本来是一个多么朋克且具有未来感的语汇,它最大的意义在于打破一些我们今天看起来不可逾越的技术壁垒,重新定义被称之为底层技术生态的一些东西。著名的信息技术分析公司Gartner早在2012年就提出了“全民开发者”(Citizen Developer)概念,指的是借助于一些组件化的集成代码可视化平台,一些不具备专业代码技能和开发经验的“小白”人群也能自主组织或参与应用开发,从而把代码开发由一项程序员专属职能扩充到更广泛的人群,甚至是全人类。想象一下,你们公司的保洁阿姨将参与下个季度的核心项目开发,隔壁的王大爷开发了一个名为“跳了吗”的程序用来约小区大妈一起能跳广场舞……妈耶,这将是一个多么不可思议而令人神往的时代,不仅是IT行业,整个社会都将发生天翻地覆的变革。然而理想是雄壮的,现实却是悲壮的。从上世纪60年代至今,无数大佬在这个领域进行了前赴后继的探索,提出了各种解决方案,并开发出了配套的工具,目前可知的可视化编程工具已超过90余款。上世纪九十年代,还有人尝试开展一场运动,即在企业中普及可视化编程工具,通过UML CASE来定义和生成应用。这种工具的工作原理是通过可视化方法为系统建模,根据模型生成程序代码,任何代码的变更都可以反向反映到模型上。但是这些实践都宣告失败了。截至目前,可视化编程只在一个领域取得了一些成果,你猜对了,就是以Scratch、Blockly为代表的儿童编程。想到这些,一股悲壮感油然而生,猛虎落泪.jpg。那么现在问题来了。为什么一个看似如此潜力非凡的技术风向,却至今未能爆发出应有的潜能,反而受到专业人士唾弃?问题到底出在概念本身,还是缺乏有效的实现路径?对可视化编程的负面印象到底是一种偏见,还是它从根本上就是个糟糕的idea?有没有一种解决方案能够从底层实现革新,创造真正意义上实现可视化编程?这就是我们接下来试图讨论的问题。一、可视化编程七宗罪——程序员眼中的可视化编程为了解答可视化编程相较于传统编程到底差在哪里的问题,我们首先和一些程序员聊了一聊。他们是这样说的:观点一:“编程就不该是一个用鼠标来做的事儿”几乎所有的程序员都首先对现有可视化编程平台的工作方式提出了质疑。他们认为,大多数可视化平台都采用了Block Type(积木模块型),即通过“拖拽”、拼接并通过可视化窗口对一些对象属性进行定义的方式来实现项目的搭建。这是一种十分低效的编程方式。程序员的基本气节就是,宁愿用键盘敲出一行行代码,也不愿拖坏鼠标。观点二:“可视化编程只能做做小程序吧”多数受访程序员们认为,可视化编程工具听起来只能搭建一些前端页面,要么就是通过图形化节点的方式来做一些简单的程序序列,做做儿童编程还行,至于具有复杂数据架构的大型应用,别问,问就是做不了。观点三:“那玩意儿咋维护呢?”可视化编程的基本逻辑是实现代码到可视化图形的映射。一个简单的程序包含数百行代码的情况是常态,而当这些代码成为百上千个图形元素,阅读和理解的抽象程度、维护的困难程度甚至会超过以文本形式存在的代码。观点四:“没有配套的编程系统环境,架构不完善,缺乏安全感”高级语言历经了很长的发展历程,其实语言本身并没有什么本质提升,但是基本架构、代码库和配套的IDE却日益完善。而可视化编程目前还只停留在初级阶段,只解决了工具层面的核心问题,缺乏配套的工作环境和技术资源积累,将在很大程度上限制工作效率甚至抑制产能。观点五:“我讨厌非开源的东西”可视化编程工具基于对既有代码逻辑或对象进行封装来实现,却也因此而无法被轻松解耦,极大地限制了开发的自由度。如果遇到问题,是不是还要重新维护和开发可视化工具本身啊?何况有很多工具甚至还不是开源的。那我要这铁棒有何用…观点六:“不具备任何复用性”程序员们均认为,可视化编程工具开发出来的东西都是模块拼接而成的,缺乏有效的可复用机制,首先不具备清晰的数据结构,其次更无法被模块化。所以,只能开发一次性应用???观点七:“可视化语言与代码本身完全割裂,无法兼容”除了对于可视乎语言本身的指摘,很多程序员也表现出了对这种新工作方式的抗拒。他们觉得自己已经习惯了代码化的开发逻辑,很难适应一款从根本上存在歧异的“语言”。而如果在使用中要同时兼顾,则更加难以协调思维逻辑的转换。可以看出,程序员对于可视化编程的抗拒心理主要围绕产能、开发效率、使用性、功能性等实践方面。尽管很多程序员都承认,可视化编程是一个好的概念,但是作为一种工具,它从逻辑上并不能真正实现对高级语言的简化,反而在操作层面将其复杂化了。一言以蔽之,所以可视化编程只能做为一种初级工具,作为高级语言的辅助品,而永远无法取代高级语言。二、可视化编程工具市场调研——是否真的一无是处?可以看出,程序员抗拒可视化编程,本质是在说,目前还没有一款成熟的可视化产品真的能够让他们体会到便利,解决他们后顾之忧。这让我们不禁开始思考,本质上这或许是一个技术发展阶段的问题,不是可视化编程这个思路不好,只是好的工具还没有问世?为此,我们调研了目前市场上的一些可视化工具,想要看看是否有一些工具已经做出了一些突破,或者具备实现突破的潜质。调查显示,作为可视化编程的发源地,目前国外主打可视化编程、低代码编程的平台至少有十几家,其中最具代表性的可以说是、Mendix、、 Kony等几家。而值得欣喜的是,国内这几年也有一些功能相对完善的竞品出现,包括明道云、简道云、iVX等。关于这些平台的相关评测文章已经很多了,而这里我们不去比较平台的优劣,主要探讨这些产品在可视化编程领域的技术探索进展到了什么地步,对于传统技术生态的改造有哪些贡献,因此只在国内外产品中各选出一例进行讨论。1.一直被视为可视化开发领域的标杆产品,也是全球顶级的Paas提供商。虽然它的核心逻辑是早已不被看好的UML,但不可否认,它确实在这条路上走出了一些新意,告诉我们可视化开发也可以做很多事情。首先,Mendix是一款目标非常明确的产品,它要解决的核心痛点就是可重复开发。而它解决问题的核心思路是建立可视化模型,通过建立模型之间的数据结构来实现应用模型的搭建。采用模型解释方法取代代码生成方法,一键部署和运行,而不需要再编辑、编译和运行。Mendix的核心开发方式在扩展性方面,Mendix使用Java语言编写Java action,扩充micorflow来使用定制代码,解决复杂业务问题;如果有更复杂业务,还可以使用提供的DSLs来调用。Mendix的JAVA接口同时,Mendix提供了一套完善的基础开发框架,允许使用敏捷方法来应用工具进行模型开发,最小模型为领域模型和GUI模型,services和外部数据源等。可以看到,针对可视化开发可能存在的功能性、开源、安全性、开发效率等问题,Mendix至少都提供了一些解决方案。我们目前还无法完整评估这种解决方案是否高效,但至少在应用层面已经完全够用。从Mendix官网所提供的应用实例来看,可视化工具已经在某些开发领域体现出它相对于传统编程的优越性。2.iVX我们选择iVX作为国内可视化开发平台的代表,是因为它是真的秀,在很多方面让人耳目一新。来,让我们康康,iVX的首页一上来就号称它重构了一套可视化开发语言,Emmm,感觉有点暴躁,它是否真的能做到呢?iVX的首页:真正意义上的零代码语言首先iVX告诉我们,“可视化编程”并不一定意味着“拖放”。iVX完全摒弃了被人诟病的块拼接模式,通过对象树方式来定义对象结构,通过事件面板的方式来定义对象间的交互逻辑和数据逻辑iVX的核心开发方式可以说,iVX在进行编程逻辑可视化的基础上,很好地保留了了原生的开发逻辑。例如,在事件这部分不是通过逐一为每个对象添加响应条件的方式来进行,而视采用条件、循环、动作、回调模块互相组合的方式来做,所有事件都被集成在一个面板里,一目了然iVX的事件面板而尤其值得表扬的是它的IDE,采用不同的颜色区分各种对象和事件模块,并支持对所有对象、数据和事件的搜索,能够添加备注,感觉有点厉害。iVX的开发界面在开源性和扩展性方面,iVX支持接入API和JS代码。同时非常有意思的是,他们还搞了一个叫小模块的东西,允许用户把自己开发的一部分东西抽象成一个组件,在可复用性方面还是挺有创意的。我们还看到,iVX采用了前后端分离的数据架构,这无疑是处于对数据的并发性能和安全性的考虑。在同类应用当中这是一个比较具有前瞻性的布局,但是表现如何,还有待测试。虽然说重新定义编程语言这事儿还不好说,但是iVX这款产品在很多方面都提出了一些具有创造性的解决方案,已经足以让人感到眼前一亮。它至少重新定义了一种新的零代码开发模式,帮助企业做一些建站、开发一些OA应用啥的,应该不在话下。三、让开发人员用起来——可视化编程工具的未来基于上面的描述,我们可以看出,目前很多可视化开发工具确实在技术领域取得了一些突破。核心发展的方向主要是两个,一种在于为特定问题或场景提供解决方案,如Mendix专注于可重复开发,国内一些云平台专注于为企业提供快速开发模组。另外还有一些工具则试图构建一款底层开发工具,提供一种全局性的开发思路,这个路无疑比较困难,但是他们也取得了不少进展。从目前已经商业化了的几款工具来看,工具功能已经发展到了可以胜任各类WEB应用、OA应用甚至构建一些平台的水准,也已经建立了基本成熟的aPaas平台的运营模式,有一些大企业入驻并体会到了可视化开发带来的便利。尽管可视化开发工具并非一无是处,但它的问题也非常明显,距离真正重构技术生态还有着漫长的距离。例如在大企业最为看中的安全性和标准化问题方面,既有工具都还不能提供完美的解决方案。而对于上下游资源的运营和新生技术生态的建构,也尚显幼稚。可视化编程尽管在发展过程中经历了一些挫折,但近年来所取得的成就也应该受到关注。尽管开发人员对于代码的亲近和工具的抵触心理几乎是无法解除的魔咒,类似于一种精神洁癖。但是如果一款工具足够完善,势必能在技术层面撼动这种固有成见。而当更多的开发人员尝试使用可视化工具,并积极在这一领域探索,可以预见,未来可视化编程不仅能参与底层的应用架构,还将帮助我们在更高层次上对事物进行建模。
可视化编程语言可以让程序员通过操纵图形元素来创建程序,而无需键入文本命令。众所周知的例子是 Scratch,这是一种麻省理工开发的可视化编程语言,用来教孩子们学编程。该语言的优势在于新手和普通用户可以更容易接触编程。二十世纪九十年代曾经有一种非常流行的运动,即通过所谓的 CASE 工具将这类工具带入企业,这些企业的系统可以通过 UML 进定义和生成,而无需雇佣训练有素的软件开发人员。这涉及“round tripping”的概念,即通过可视化的手法为系统建模,根据模型生成程序代码,而且任何代码的变更都可以反向反映到模型上。但最终这些工具未能兑现承诺,而且大多数这类尝试现在也已基本放弃了。因此,除了一些非常有限的领域外,可视化编程都未能成功。其中的原因基本上可以归于以下几种对编程的误解:(1)文本编程语言混淆了本质上很简单的过程。(2)抽象和解耦是外围问题,对编程的意义不大。(3)为支持编程而开发的工具并不重要。误解一:文本编程语言混淆了编程本质第一个误解认为软件开发的门槛很高,因为文本编程语言混淆了编程的本质。Scratch 在教育学家中的流行就属于这种误解。该观点认为编程实际上非常简单,我们只需通过清晰的图形来表现,就可以大大降低创建和阅读软件所需的学习曲线和努力程度。我认为这种误解是因为有些人未能真正读懂用标准的文本编程语言编写的程序,并想象可以将程序转换成盒子和箭头等图形元素。如果你这样做,很快就会发现一行代码经常需要映射到多个盒子上,一个简单的程序包含数百行代码的情况是常态,因此这将转化为成百上千个图形元素。在头脑中理解如此复杂的图形往往比阅读同等的文本更加困难。在这个问题上,大多数可视化编程语言的解决方案是使用“块”来代表更为复杂的操作,从而可以让每个可视化元素都代表一大段文本代码。可视化流程工具是罪魁祸首。问题是我们需要在某个地方定义这些代码。于是,这就成了“属性对话编程”。可视化元素本身仅代表最高级别的程序流程,而大多数的工作是通过隐藏在盒子中的标准文本代码完成。这种做法酿成了现如今两边皆难堪的局面。一边的文本编程语言没有现代工具支持。属性对话编程通常是低配版的标准开发环境,而且你必须选择特定的语言,通常是某种脚本语言。而在另一边,可视化元素只能等待有经验的程序员创建,而且只有通过阅读底层的代码才能读懂程序,所以大多数视觉化表现手法的优势都丧失了。视觉上的“代码”和文本代码之间存在着阻抗失配,而且程序员必须不断在两者之间来回切换,时间都浪费在满足图形编程工具的需求上,而不是解决手头的问题。误解二:抽象和解耦是外围问题因此才有了第二个误解,即抽象和解耦是外围问题。可视化编程假设大多数程序都是简单的程序序列,有点像流程图。实际上,这也是大多数新手程序员想象的软件工作原理。然而,一旦程序的规模超出了简单的示例,新手程序员很快就会被复杂性压垮。他们发现很难推断程序的代码库,而且常常难以大规模地创建稳定又高效的软件。编程语言中的大多数创新都是为了管理复杂性,最常见的是通过抽象、封装和解耦。面向对象和函数式编程中所有类型的系统和装置实际上都是为了努力控制这种复杂性。大多数专业程序员会持续不断地抽象和解耦代码。实际上,好代码和差代码之间的本质区别也在于此。可视化编程工具很少拥有有效的机制来执行这些操作,而开发人员也必将陷入二十世纪七十年代 BASIC 的漩涡中。误解三:为支持编程而开发的工具并不重要最后一个误解是即使没有现代编程工具的支持,可视化程序员也可以编程。想想代码编辑器和 IDE 漫长的演变过程。例如,Visual Studio 支持高效的智能感知,可以单独查找基类库中数千个 API。缺乏良好的源代码控制是绝大多数可视化编程工具的另一个主要的缺点。即使这些可视化工具的布局保存为文本的格式,代码的差异也毫无可读性可言,因此毫无意义。我们很难从大块的 XML 或 JSON 找出每行代码的修改来源。一些对程序的功能执行没有任何影响的因素,比如图形元素的位置和大小,也会导致元数据的变化,这让解析差异变得更加困难。文本编程语言知道将不同的代码保存到不同的源代码文件中,因此系统某一部分的变更很容易与另一部分的变更合并。可视化编程工具通常会将每个图表保存在一个文件中,这意味着合并也会成问题,当遇到难以解析差异的语义时,难度会更大。总之,可视化编程工具提供的优势,即简化程序的创建和理解只是一个海市蜃楼。只有在非常简单的编程中才可行,在这种不理想的形势下,最好的结果也不过是说:可视化元素是具有混淆副作用的文本代码的容器。补充说明可能在第一段中加上 Scratch 的截图并用作主要示例是错误的做法。我不是一名教育工作者,我不知道 Scratch 是否可以作为一种有效的教学工具。许多人提到,Scratch 在编程教学方面非常有用,特别是对儿童而言。任何可以引导人们进入精彩纷呈的编程世界的东西,我都欢迎。我并不想通过这篇文章抨击 Scratch,提到它只是因为它是大多数人都听过的最有名的可视化编程系统。有人在 Reddit 上提到的另一个反面例子是静态结构工具,例如 UI 设计工具、数据库模式设计工具或类设计工具。我同意这些工具非常有用。任何有助于可视化数据结构、或程序的大规模结构的工具都是好东西。但这些不足以支撑他们的论点。 等 90 个试图通过在图形可视化之上构建工具,来开发出一个完全不用写代码的开发环境,可是最终都失败了,这恰恰证明了我的观点。你如何看待可视化编程?针对可视化编程并不是理想的想法,评论区的不少网友也发表了不一样的看法:评论1:你混淆了图形数据流语言(带有隐藏选项框和连接这些框的箭头)与Scratch。Scratch 是一种文本语言,里面的程序语句和类型是预定义的形状,可以消除语法错误。你无法在 Scratch 中犯语法错误,因为这些框无法组合在一起。 除了这种语法帮助之外,Scratch 不会隐藏任何内容,并且格式也与纯文本语言没有差别。也就是说,我同意你说的有关其他教学语言的大部分内容,例如用于 Lego 机器人套件的语言。该语言源自 LabView,大多数初学者发现很难超越几个块或连接变量之类的东西。我的猜测是,一种能够通过变量赋值来达到复杂性障碍的语言并不能很好地扩展:-)。评论 2:我认为你的文章的出发点不正确,因为可视化编程根本不是为程序员准备的。对此,你怎么看?欢迎下方留言,分享你的看法!原文:
本文作者:-秦人 本文适合刚学习完 Java 语言基础的人群,跟着本文可了解和使用 Tablesaw 项目。示例均在 Windows 操作系统下演示 推出的《讲解开源项目》系列,今天给大家带来一款基于 Java 语言的数据可视化库开源项目——Tablesaw Tablesaw是一款 Java 的数据可视化库。它主要包括两部分:一部分是数据解析库,另一部分是数据可视化库。数据解析库主要是加载数据,对数据进行操作(转化,过滤,汇总等)。数据可视化库就是将目标数据转化为可视化的图表。 项目源码地址: 的项目父级项目,主要定义项目打包的配置。beakerx:tablesaw 库的注册中心,主要注册表和列。core:tablesaw 库的核心代码,主要是数据的加工处理操作:数据的追加,排序,分组,查询等。data:项目测试数据目录。docs:项目 MarkDown 文档目录。docs-src:项目文档源码目录,主要作用是生成 MarkDown 文档。excel:解析 excel 文件数据的子项目。html:解析 html 文件数据的子项目。json:解析 json 文件数据的子项目。jsplot:数据可视化的子项目,主要作用加载数据生成可视化图表。saw:tablesaw 读写图表数据的子项目。二、实战操作2.1 准备工作项目中引入 Tablesaw 依赖包<> <groupId>tech.tablesaw</groupId> <>tablesaw-core</> <version>LATEST</version> </>2.2 数据解析2.2.1 内部数据制作数据表格@Test public void () { String[] students = {"小明", "李雷", "小二"}; double[] scores = {90.1, 84.3, 99.7}; Table table = Table.create("学生分数统计表").( .create("姓名", students), .create("分数", scores)); System.out.println(table.print()); }代码超级简单,首先定义要展示列数据 students 和 scores。然后创建数据展示的 table 定义表格名称,添加表格列数据即可。效果展示如下:2.2.2 加载数据文件制作数据表格@Test public void () throws Exception{ Table table = Table.read().csv("/data/bush.csv"); Table = table.("who"); .(.DOUBLE) .forEach(x -> (() x).( .percent(0))); System.out.println(.toString()); }首先 Table.read 加载数据文件,加载数据支持 csv、数据库结果集、文件、URL 等指定表格 x 轴的字段,并对 数据进行百分比数据的转化。bash.csv 文件内容如下:运行效果如下:2.3 数据可视化Table robberies = Table.read().csv("./data/boston-robberies.csv"); Plot.show( AreaPlot.create( "Boston Robberies by month: Jan 1966-Oct 1975", robberies, "Record", "Robberies"));首先加载数据 Table.read,绘制图表 AreaPlot.create ,然后 Plot.show 在本地生成图表的 html 页面,自动打开浏览器显示。boston-robberies.csv 文件内容如下:运行效果如下:Tablesaw 还可以绘制出很多种类的图表,期待你的发掘。三、最后教程至此,你应该对 Tablesaw 有一个简单的了解。这里告诉大家一个方法,可以快速掌握开源库:在源码中找项目的单元测试代码。然后,我们再将项目导入开发工具,直接运行项目中的单元测试。 这是可能是最快捷、有效的掌握、上手开源库的方法。本教程是针对有一定 Java 编程基础,如果你的项目正好需要数据可视化的库,Tablesaw 库是个不错的选择!『讲解开源项目系列』——让对开源项目感兴趣的人不再畏惧、让开源项目的发起者不再孤单。跟着我们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎留言联系我们、加入我们,让更多人爱上开源、贡献开源~
上述文章了解到关于可视化编程之罪 —— 可视化编程是否真的没有未来?,可视化编程:利用图形来创建程序,却被程序员认为是糟糕的想法?,超级好用的 Java 数据可视化库:Tablesaw?? ,让我们对java可视化编程 有一个直观的认知。我们发现,作为一个优秀的Java程序员是多么的自豪。
只要一个电话
我们免费为您回电