找回密码
 立即注册
楼主: xiaozongpeng

为什么大多数程序员不看好图形化编程?

[复制链接]
发表于 2021-8-3 21:07 | 显示全部楼层
大家都在说原理,举例子,我来从另一个角度说一下吧。
图形编程有两个致命问题解决不了。
一个是信息密度太低。
另一个是大量的鼠标操作,在工程提升到一定程度后是降低操作效率的。


首先一个信息密度太低的问题。但凡学过两天编程都知道流程图这个东西。
一个排序算法,就得这么大一页。
要解决这个问题,要么你得把算法打包成一个图标,要么就是洋洋洒洒的一大页,结果还显示不了多少东西。
如果屏幕不够大,或者工程大一点,就会出现一个“完形填空题目在正面,选项在背面”的场景。
而如果逻辑线稍微复杂点,就会出现一个被猫玩过的毛线球……
这什么可读性大家心里应该有数。


而问题二,鼠标和键盘切换操作,其实是不如直接全键盘流畅的。
如果要让鼠标和键盘流畅操作,就得把常用的按键集中到键盘左半边。这显然是一个很大的工程量。
而它的目标,代码编程早已实现……


所以不是看好不看好的问题。图形界面编程,对于小工具制作(比如按键精灵脚本)可能降低新手学习成本,会有一定发展。
但是推动这个发展的,开发图形ide的人本身,在经历了完整的开发流程之后,恐怕也会对图形ide存在的意义产生怀疑。
所以大家不看好这个也是情理之中。


相比之下我更看好ai介入的人工智能编程……但是总感觉这东西要毁灭世界,所以我还是不多说了……
以上。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-8-3 21:14 | 显示全部楼层
因为大多数程序员的抽象思维比较强,形象思维很差,我做程序多年,接私活无数,最喜欢做的活就是不需要界面的活,因为涉及到界面就涉及到反复修改
发表于 2021-8-3 21:24 | 显示全部楼层
我认为是因为图形化信息密度低,就跟我们不用象形文字了一样。
发表于 2021-8-3 21:27 | 显示全部楼层
之前确实不看好。如果都上云,基于faas,基于webide,都在浏览器里搞定,为什么不可以么?


我看好基于函数的可视化编排。但不一定我看好目前的方案,现在的方案都不是程序员视角做的,期待为程序员写的又不是程序员思维产物的基于函数的可视化编排。
发表于 2021-8-3 21:37 | 显示全部楼层
主要是效率低,程序的问题是学习成本高,
但是一旦学会
效率基本是差好几个数量级
我看过一个讲数学为什么难学的回答, 说数学的信息密度太高了, 导致信息阅读非常困难
其实程序也是一样的, 信息密度相对比较高,效率和这个应该有正相关
连线的信息传递密度太低,所以他更好使用, 但是同样的效率注定很低
发表于 2021-8-3 21:38 | 显示全部楼层
因为在知乎,程序员默认指互联网程序员。他们绝大部分不知道这个世界上还存在诸多行业专用的图形化语言。通用的,在工控界流行30年的梯形图lad,功能块FBD,流程化语言graphic,Ni的labview统统被忽视了。各位,你乘坐的高铁,主控程序也是图形化语言,是高铁行业专用,绝对安全的语言。就咱们程序员堆屎山的工作方法,你敢坐?确实,这些图形语言背后还是C,毕竟他们用c构建出来的。这些图形化语言会先在内部被解释成c,再把C编译二进制,当然,有些是解释型的。图形化语言的目的,并不是构建大型软件,而是为了实现特定的目的,甚至是为了某一行业服务,是为了易懂,容易调试,以及绝对的安全。不看好,只是互联网程序员不看好,因为他们没接触过,不懂而已。
发表于 2021-8-3 21:47 | 显示全部楼层
倒是有把代码图形化的工具,方便阅读现有代码的那种,不过是根据代码只显示与当前函数或者类相关的代码的,但是关系草图也只是更方便理解代码,并不能用来直接编程233,要是把关系全铺开或者逻辑也图形化的话。。。还是饶了我吧(っ °Д °;)っ
可以放点C++被“图形化”的图感受一下。。。


我认为图形化应该解决的问题(方便查看某个函数或类与程序哪些部分有关系,本回答中唯一的正确用法):
只展开与一个函数有关的联系
查看一个类与工具类间的关系(复杂且无意义):
展开一个类与一个工具类间的关系
查看存在继承的两个类间的关系(除了能看到父类哪些方法被重写了,哪些成员被访问了以外其他信息很混乱):
存在继承的两个类间的关系
把所有与main有关系的类中所有成员全部展开(意义不明,就感觉像在看一张设计的很烂的UML一样):
什么鬼玩意。。。
把所有用到的外部依赖展开(更混乱了,错误用法+1):
放弃治疗
综上,将现有语言转化为图形化在很多情况下可以方便理解代码,但是完全图形化根本没法用。。。
所以我比较支持用更好的文档和代码图形化工具来帮助人理解代码,而不是把编程的过程彻底图形化,过分复杂的信息只会让人感到迷惑和恐惧。
最后附上实际的软件界面截图(这个工具理论上Java,Python,C++都支持,不过Java项目如果用了Marven且经手过多个java版本的话很有可能遇到jdk版本错误导致图形化失败,根本读不出来那种。不过Python和C++好似问题不大)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-8-3 21:48 | 显示全部楼层
开发需要,日常使用C/C++与LabVIEW。
目前已放弃LabVIEW,或者说除非做测试之类的用完即抛的场景,一般我不会再用LabVIEW了。
原因其实很简单,我觉得不好用....或者说用着很不爽。
LabVIEW是一个非常完备、强大的图形化编程环境,真的是为各种工控等领域的工程师提供了非常方便的程序开发流程,对于涉及到与设备通信、信号处理等场合,使用LabVIEW的各种组件真的是方便的很。
但是我不太喜欢用的原因如下:
1.个人习惯文本式编程的快速,不管C/C++还是C#,写个函数、写个类,在打字熟练以后,其实是很快的,LabVIEW则是倡导分割子VI,但是子VI又是独立文件,不仅新建的时候要为文件命名,原则上来说,还要定义接线输入输出、VI图标的统一,对于接线这一块,有时候如果设置的不合理,调用VI接线时你那个线怎么也整理不齐...(逼死强迫症),虽然是可以通过慢慢细调来做到一个平衡,但真的好费劲....在VI中接线时,可能是我用鼠标瞄准时手抖,接线经常接错就很费劲,不如敲两行代码。
2.面向对象支持不是非常完善与方便,最新版的LabVIEW没有使用,目前用的是2016,怎么说呢,有些需求还是面向对象会实现方便一点,但是LabVIEW的面向对象,至少在2016版真是一言难尽...更不要说还结合了第一条想分离方法时新建VI的痛苦....
3.自由度较低,部分需求需要绕很大一块来实现。例如有的答主提到的快排,另外很多需求LabVIEW本身貌似没有提供,例如文件读取,提供的VI我觉得不是很好,32位LabVIEW下读稍微大一些的文件,就很容易告诉你内存不足而crash掉,当然这是32位的问题,64位不会溢出,但是有的仪器没给64位驱动,只能用32位LabVIEW。对于超大文件,我是想做个文件映射来读,但可能能力有限,我是没找到纯LabVIEW咋实现,我可以挂个DLL来实现,但是LabVIEW就成了一个单纯的界面工具,但我又觉得太丑了,没有那么多可调节的东西。
LabVIEW是个好东西,但是我是喜欢不起来,对于没有学过太多编程的人来说,LabVIEW提供了一个快捷方便实现他们实现需求的平台,这是伟大的一步,Simulink也是一样的道理。
但我个人认为,如果写程序写熟练顺手了,大部分人可能还是会觉得文本式编程会快一些。当然如果哪天图形化编程出来了例如clang-tidy这一类的好用的工具,也许会改观很多。不过对于平时一些不需要持久开发的任务,还是LabVIEW简单快捷,该香的还是香。
Matlab尽管是文本式的,但我也不喜欢用,主要是原生的编辑器太废柴太难用也丑...
发表于 2021-8-3 21:56 | 显示全部楼层
因为大部分图形化执行一次操作所挟带的信息量过低,不利于抽象。
一般来说常见的c like的编程语言会使用大小写罗马字母/数字/其它字符/空格。简化起见让我们强行假设是字符出现频率是一个均匀分布并只考虑大小写字符和数字,敲击一个字符这个动作 会带来-log(1/62)的 信息量。如果全算上信息量还要大很多。
一个图形化编程大概不太可能给你每一次操作提供62个选项,在假定操作是均匀分布的话情况下,比这个选择少意味着每次操作带来的信息量变少了。
何况敲击键盘是很快的动作,比用鼠标点点点要快很多。
发表于 2021-8-3 21:58 | 显示全部楼层
最近用虚幻蓝图(之前代码写的多,蓝图用的相对少),也在考虑这个问题。
客观上,作为信息的两种不同表达方式,图和代码各自有各自的特点:
代码一般是连续的序列,清晰而单纯,操作简单,图上拖来拖去的事情,敲几个字符就可以解决。但是,不要忘了,代码中的长分支、长循环、goto一般都是不被建议的,因为会极大降低代码的可读性。
图是图状组织,可以很直观轻松地反映出来模块、数据间的关系,但是如果用图只是单纯做序列,则不如代码那么方便。不使用图形编程,我们也经常需要画流程图、UML图、序列图,这就说明在我们的工作中,图这种信息组织形式是很有帮助的。
所以按照这个感觉,Blockly这种的,私以为只能算作“图形化的序列”,其核心仍然是代码序列。当然也算作一种“图形编程”,但是这种,距离蓝图的Ubergraph的差距就比较远。个人理解,真正能够发挥图形编程优势的,还得是超越序列的东西


此外,过去我曾经觉得图在描述“非瞬时”的序列上也有优势:
比如“我走到桌子前,拿起一杯水,喝”。
在Coroutine普及之前,需要实现“走到桌子前”,“拿起水”,“喝”三个FSM状态的转换关系,无论是用update+标记还是Listener、回调来实现。
不过,通过 Coroutine,代码实现这种无关系的简单序列也毫无压力:
this.WaitForSequenceEnd("GotoTargetActor", TargetDesk, [&]() {
    this.WaitForSequenceEnd("Bring", TargetCup, [&]() {
        this.WaitForSequenceEnd("Drink", TargetCup, [&]() {
            // All sequence end.
        });
    });
});
但是,如果这种序列的结构再复杂一些,基于Coroutine的写法也会比较乱了,至少,得考虑把各个Lambda表达式抽出来,以备重用了。


目前主要来用蓝图的UberGraph做FSM的“状态转换”的流程图。
这种图,其实过去本身在纯代码工作的环境下,一般也是需要先在文档里画一张图,然后照着图来写代码或者配置脚本。
目前的方式是:直接在蓝图里通过一些自定义节点和Reroute node来打草稿,尤其是状态机的草稿,然后慢慢往里面加功能。
使用的节点都是概念化的、抽象度比较高的节点,比如“等待所有观测对象进入静止状态”,嗯,对,这是单一的一个节点,有用代码来实现这么个节点的,也有用蓝图包宏的。但是在这种关系图里,只出现抽象度差不多这种程度的节点。
感觉是比“这边置个标记,Tick里根据标记分支”,以及“这边Trigger个Event,那边Listen并处理”的做法要清晰一些,重构的时候也方便一些。
但是目前还没有做到特别复杂的,相比于Coroutine的代码写法而言,主要的好处还是直观,倒不是说代码就完全做不到。
总之就是,时时刻刻把这张图当成是在文档里画流程图,而不是在编程
刚刚尝试了一段时间,坑也不少,还在继续跳,未来也许会有新的发现。
每个黄色区块是FSM的一个状态,所以可见跨区域的长距离连接,以表述状态转换关系
图中大量使用这种抽象度较高的Coroutine,比起那种“这个地方Trigger,那个地方侦听”要直观很多


总之,就图本身的特点来看,利用纯图编程的工作过程中,最好是可以更多聚焦于“关系”、“时序”而非单纯的“代码序列”。否则发挥不出图的优势,却会面对图操作复杂的劣势。
如何在工作中发挥两种组织方式各自的优势,而不是考虑两者之间的简单替代关系。私以为更加重要。




补充1:
图还有一个地方是比代码要有优势的,就是可以直观显示运行过程。
比如,蓝图调试时,当前正在被执行的连线加粗,这都还只是最初级的。
最具代表性的,是材质图、或者Substance这种节点图,每个节点都可以把当前运行的中间状态直接显示出来。
工作流中如果有这方面需要的,其实也可以考虑加强相应的工作流。比如,基于Noise的地形生成之类的。
找专家来帮着解决问题固然重要,但是,工具能更加简单易用,让更多的人能通过工具来完成自己的目的,对于整个项目而言,也是很有意义的事情吧?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 01:47 , Processed in 0.092327 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表