百科问答小站 logo
百科问答小站 font logo



民科是不是很少拿计算机科学开涮?为什么? 第1页

  

user avatar   lu-luce 网友的相关建议: 
      

我其实现在强烈的怀疑部分深度学习研究学者就是计算机民科。包括宣称要实现自动驾驶的某些公司。还有就是一些打着智能制造的机器人公司。

尽管很多国内外业内专家都明明白白的告诉大家。5级自动驾驶二十年之内无法实现。人机协作无法适用于很多柔性环境。但是不介意这些人继续用什么人工智能,2025忽悠国家投资。


user avatar   kuang-qi-84 网友的相关建议: 
      

在北师大读书的时候,在实验室接待过2位计算机民科。CS并不是师大的传统强势专业,本人见识有限,而世界又很大,所以综合来看,全国的计算机民科数量应该不容小觑。

================

很意外的是,这两个人的个人特质和研究方向却有某种一致性,下面来具体讲讲。

第一位大概六七十岁,带着一本厚厚的文件来到实验室,希望我们能给他开发一个程序。这一本文件是他自己发明的一个“汉字编码方案”。类似于汉语词典的“偏旁部首检字表”,有很多个分区,每个分区里有一些汉字。他声称这个分区是根据某些中国传统典籍总结归纳出来的,汉语拼音使用拉丁字母表示汉字,是西方文化对中国文化的入侵。而他发明的这个方案,脱胎于中国古代经典,有利于传播中华传统文化。

他还声称这个方案可以表示出汉语拼音以及任何汉字输入法都无法输入的汉字。可是他的那份文稿是电脑打印的,我就问他既然无法输入,那这些打印的汉字是如何到电脑里,才打印出来的呢?他似乎无法听懂我的问题。

我想他也许是在学习使用拼音输入汉字的时候遇到了麻烦,他强烈地抨击了使用拼音输入汉字的不合理性,并声称只有年轻人才学得会用拼音打字。他坚定地认为,在北师大,那些跟他同龄的教授专家,也无法熟练地使用拼音打字。我对他的这种想法感到惊讶。虽然没有调查,但我还是相信师大的教授们应该还没水到那个程度,就算不写论文了,用拼音发个短信聊个QQ应该不至于有障碍。

我花费了很多口舌试图让他清晰地定义自己想要干什么。他想做的是输入法吗?那他应该定义电脑键盘上的按键和汉字的对应关系,就像五笔字型那样。他想做的是汉字编码吗?那他应该定义二进制与汉字之间的对应关系,就像GB2312或者Unicode那样。而这些他都没有,他只是根据某种规律对汉字进行了分类,我无法理解这个东西有什么用,也无法让他明白他应该做的是什么。无奈下我只能终止了与他的沟通,他在抨击了中国大学生视野狭窄、不懂创新等等之后离开了实验室。

================

这第二位也是六七十岁,带来的东西也是汉字输入法。也许学习拼音输入法真的伤害了这个年龄的一些人……

相比于第一位奇幻型的“中国传统文化”民科,这第二位则务实得多。他来的时候真的开发出了一个可以工作的输入法。在Windows系统中,有一个叫做“输入法生成器”(imegen.exe)的系统自带工具。在这个工具中,给出键盘字母和汉字的对应关系,即可产生一个自制的输入法。这个工具大概在Windows 95时代就有,直到Windows XP。我大概在很小的时候(小学?)就见过它,但从来没有使用过。在我问他是如何开发这个输入法时,他提到了这个工具,所以我很快明白了他干了什么,打算解决什么问题。有了上次的经历,这位老先生让我感觉靠谱很多,我决定仔细听他介绍他的这个输入法有何高明之处。

他的输入法在本质上是一个双拼输入法。他主要解决的问题是拼音输入法的重码问题。他对双拼的改进是,让韵母带上声调。规定某个按键为某韵母的一声,往右的三个键是这个韵母的二三四声,有了声调之后会一定程度上降低重码。其实设计这样一个方案应该也不算容易,这么多韵母又带上声调,大概会很容易互相冲突。他应该也是费了一些功夫减少这种冲突。而且双拼都会面临零声母、零韵母等一些问题,他应该也都需要进行处理。他似乎在组词的情况下设计了更多降低重码的方案,但时间久远我有些记不清了。

遗憾的是,他的这个输入法试图解决的问题在今天的意义已经不是很大了。现代的输入法利用现代计算机更强大的计算能力,可以在本地包含更大的词库和更精确的模型。而基于互联网,更是可以实现海量的云端词库和热词实时更新,甚至还有上下文联想等功能。在日常输入中,需要我们停下来选字、解决重码的情况已经比较少见了。在当前的背景下,提高打字速度的更好方法其实是降低按键次数。例如搜狗输入法,只要输入“bjsf”即可在候选字中得到“北京师范大学”、“北京师范大学珠海分校”等选项。bjsf3这5次按键,即可完成“北京师范大学珠海分校”10个字的输入。这完全依赖于庞大的词库,而不是“bjsf”这四个字重码少。(想自己尝试一下的朋友请使用最新版本的搜狗输入法在Windows或Mac操作系统的电脑上尝试,手机不行,别问了【捂脸】)

我提出这个观点后,他似乎还不太相信,于是我在我的笔记本电脑上向他演示了现代输入法的词库。他要求我输入“我家住在伍佑镇”,我直接全拼整句输入,按空格上屏,就得到了准确的结果。他非常惊讶于我的电脑为何知道“伍佑镇”这个地名。我又向他演示了“今晚去巴依老爷吃新疆菜”、“头疼吃对乙酰氨基酚片”等比较生僻和拗口的词组,利用云候选都可以自动排在候选词的第一名。他似乎也意识到了现代输入法的先进程度,放弃了对他的输入法先进性的坚持。后来我祝他好运并礼貌送走了他。

评论里说这个人不能算民科,因为他至少拿来了能用的东西。但我想他至少还是具备了一些民科的特质。首先,他能带着作品来到大学,显然是认为这个作品具备了科研成果的独创性和先进性。他跟我的开场白大概是“20年前xx国家领导人号召我们xxx,20年过去了,我完成了这个成果”。从我跟他的交流中,也可以感受到他起初对这个作品的定义就是一个二十年磨一剑的“重大创新”,对他自己所做的事情就是“推动科技发展”,我想在他心中的自己,大概算得上科研人员。而他没有对市场上现有的产品有所了解,也不具备检索科研文献的能力。他来时蓬头垢面,身上散发着难闻的味道,衣服应该也是很久没洗过了。想必是沉迷于他的“科研”,以至于影响了他的正常生活。其实民科在我这里算不上什么特别贬义的词,也没有冒犯意。如果有网友觉得不妥,那我就姑且称他是一位落伍的爱好者吧。

这就是我的经历。

话说回来,要宣称解决了问题,就需要先发现问题。发现的问题至少应该是真实存在的。哥德巴赫猜想是真实存在的,光速无法被超越是真实存在的,拼音输入汉字对老年朋友不友好这个问题也是真实存在的。推翻冯诺依曼架构大概不算是个问题,现代处理器也有很多采用了哈佛架构,技术选择不同,并没有推翻一说。

现代互联网产品都在极尽所能优化用户体验,没有计算机科学素养的民科大概也被这些友好的软件们惯坏了,发现不了问题大概就不会有民科了吧~


user avatar   chen-wen-shi 网友的相关建议: 
      

这个问题其实最主要的原因是中国在基础教育阶段没有普及计算机教育。民科的源头就在于在基础教育阶段学了点皮毛开始自我膨胀,又没有合适的高等教育来给他们泼凉水。然而绝大部分国人在基础教育阶段只学过数学物理,没学过计算机。


user avatar   cnnblike 网友的相关建议: 
      

怎么就没民科了?上个被挂城墙的就是被一巴掌扇去github比赛写tokenizer了啊?

验证成本太低的东西都不适合民科存活。起码来点高端的,像我这种真民科就有一个设想,当堆积在我家后院的美金达到一千万亿的时候,这些美金将会产生智能。

不信?不信你倒是试试啊,小规模的说不定也有效,无效那就是你心不诚


user avatar   divinites 网友的相关建议: 
      

有的,比如这位。

中国人发明的一种独特有趣的新排序法 — 张仰彪第二排序法

去年,我曾经在CSDN的论坛里发表了我写的第一种排序法:“张仰彪排序法”,没想到就像捅了马蜂窝,在论坛里引起一场渲染大波,赞同的几乎没有,扔板砖的倒是不少,至今够盖一座楼的了。各色人等纷纷粉墨登场,说啥的都有,归纳起来就是一句话:“不许革命!”
平心而论,倒也不能把这些唱反调的人统统与赵举人之流划为一类,因为他们说的也有一定道理,用两个数组排序确实是一个缺点,尽管瑕不掩瑜,但人家就是揪住这一点不放,唯一让他们改变观点的办法就是拿出更好的东西来。
皇天不负有心人,经过近一年的潜心研究,我还真的写出了一种新的排序法,这次是用一个数组排序,其原理和算法过程非常独特有趣,而且我在网上搜索到了很多排序算法,与我的新排序算法都截然不同,甚至不用仔细看代码,搭眼一看它们的运行例图就可以知道它们之间差距很大。因为我的新排序法在排序时几乎始终守着数据队列的头部,就像我们中国的舞龙,始终抓着龙头就把整条龙排好了,仅这一点就与其他任何一种排序法不同。
我原来写的那个“张仰彪排序法”确实有点逗乐的成分在里边,一方面活跃一下气氛、和大家认识一下,另一方面可以起到抛砖引玉的作用,为我现在写的这款新的排序法做个铺垫。
至于此新的排序法究竟如何,请看下文,各位看官您见仁见义,欢迎发表高见,无论鲜花还是板砖,在下随时恭候,统统笑纳。而且保证物尽其用:鲜花送美,板砖盖房。


张仰彪第二排序法
张仰彪第二排序法的原理与目前非常流行的反恐类网络游戏有些类似,它将待排序数组内放错位置的数据视为隐藏在节日游行队列里故意站错位置的恐怖分子,并自动地将这些恐怖分子按照它们相互之间的内在关系而分成几个不同的小组。排序时反恐队员首先从游行队列的最前头开始清查,若遇到的人是好人,就快速通过去查下一个。如果查到一个站错位置的恐怖分子,就停下来在这个位置上连续地排查运作,直到将这个恐怖分子及其所在小组的全部成员都清理到正确的位置上,然后才继续前行去查下一个位置。直到清查的次数比队列的长度小1时,尽管此时反恐队员可能仅沿着游行队列前行了很短的一段距离,还处在队列的头部,但队列中所有站错位置的恐怖分子都已被清理到了正确的位置上,排序完毕。
下面给出张仰彪第二排序法的C语言代码:
……(代码略,有兴趣可以看CSDN原版)
可以看出,此排序法的空间效率和时间效率都与冒泡排序法相当,而且此排序法也具有一定的智能。对于排列非常混乱的数组,此排序法要进行很多数据比较和数据交换,比较费时。但当待排序数组基本有序时,此排序法只进行数据比较,而数据交换操作则很少,时间效率将大幅提高。
同时,此排序法的原理非常独特有趣,并且富含中国古老文化的精髓和神韵。在排序时它几乎很少沿着待排序数组的数据队列前行,而是守着数据队列的头部,犹如姜太公稳坐钓鱼台,将队列里站错位置的乱臣贼子逐个擒过来、推出去,吐故纳新、收放自如,象极太极推手,又象中国的舞龙,不经意间,一列混乱的数据已成清一色一条龙。而且此排序法在运作时,可以将数组里所有放错位置的数据自动分组,一次清理完一组才继续前行,又恰似西游记里的三藏师徒,刚踏上西行路就遇到老妖怪,于是师徒几人便停下来降妖捉魔,直到将这老妖怪及其洞中所有的小妖全部剿灭,才继续西行,而没走几步,又遇到一股妖魔鬼怪,于是又停下来与妖怪大战一番......
可见,在排序原理上张仰彪第二排序法极为独特,与现有的任何一种排序法都不相似,它应当是一种全新而有效的排序法,信不信由你。
至于为什么此排序法具有将数组里放错位置的数据自动分组、按组排序的功能,老纳作了如下分析:
首先,在任何一个待排序数组里,所有放错位置的数据都可以按照它们之间的内在关系而被分成很多小组,小组有大有小,但任何一个小组都不能再被分成更小的组。
例如:有100个人按年龄(有同龄的)顺序坐成一排照相,若其中只有两个人发现自己坐错了位置,这两个人必然相互坐到了对方的位子上,只要两人对调即可,与别人无关。如果只有三个人甲、乙、丙发现自己坐错了位子,那么这三个人必然是相互轮错,例如甲坐到了乙的位子上,乙坐到了丙的位子上,丙坐到了甲的位子上,此三个人构成了一个错位三角,也可以说构成了一个错位环。如果有四个以上的人发现自己坐错了位置,情况就变得比较复杂,此时所有坐错位置的人将被分成一个个小组,每个小组里的人都是相互间轮流坐错了位子,与组外的人无关,整个小组构成一个封闭的错位环,此环不可再分,这个错位环就是前边所说的某些错位数据之间的内在关系,也是将数组内所有错位数据分组处理的唯一依据。
既然待排序数组内的错位数据具有可以分组的特点,那么本排序法在排序时每遇到一个错位数据其实就是遇到了一组错位数据。所以将一个数据放到正确的位置上后交换过来的一定仍是一个错位数据,于是再将它放到正确的位置上,而交换过来的可能又是一个错位数据,只有将这一组错位数据全部清理到正确的位置上,排序位置才继续前移,直到又遇到另一组错位数据 ......。而此过程中无论怎样交换数据都不会移动原本就在正确位置上的数据,也不会移动刚刚排好位置的数据,这一点至关重要。
而整个排序过程中排序位置究竟可以从数组头部前移多远,取决于待排序数组里原来有几个没有错位的数据。
----------------------------------------------------------------------------------------
这就是张仰彪第二排序法,爱咋咋地。
编自己的程,下自己的蛋,让别人说去吧。
< 完 >


原文地址:中国人发明的一种独特有趣的新排序法 - 张仰彪第二排序法


user avatar   zhangshilin91 网友的相关建议: 
      

因为计算机领域的民科已经融入到我们生活了,以至于在你眼皮底下却发现不了。他们就是天天借着大数据,云计算,人工智能指点江山,吸引关注度的媒体。他们什么都懂,但又什么都不懂。

(本人并不是否认以上技术,并期望以后能从事相关工作)

———————更新———————

从今天开始加上区块链

---------------更新---------------------


user avatar   li-xiang-1-48 网友的相关建议: 
      

相反,计算机科学是一个民科远远多于官科的学科。

民科混的好的办了大企业,如比尔盖茨,g胖等,或者建立了去中心化经济系统,如中本聪,李笑来等,

民科混的差的也当了黑客,靠勒索病毒横行互联网,

官科如Linus,方滨兴等也创造了很好的作品,但数量和质量都远远不及民科。


user avatar   wang-jian-60-38-24 网友的相关建议: 
      

引:

2007年,FBI公开了恋童癖圈子的符号。恋童癖通过这些符号来分辨性取向,用来沟通在哪里可以找到对方或者找到“猎物”。这些恋童癖符号经常堂而皇之地出现在人们视野中,他们自作聪明地以为人们会永远被蒙在鼓里,没有想过有一天人们会觉醒,而这些象征主义符号就会导致他们自己的失败。



这是一张江南布衣线下活动的宣传照。

如果说是我们不懂西方文化,无法理解图片是有多诡异,那笔者今天就借这篇文章给大家普及普及。(注:笔者在他们删微博前,存了那么一点图片。)

01

9月19日,有家长发文称,家里的一件“jnby by JNBY” 童装上印满了“Welcome to hell(欢迎来到地狱)”



“let me touch you(让我摸摸你)”等诡异图案和英文开始。



到众多购买过江南布衣的家长们开始自发讨论退货。

除了文字,网友晒出的衣服上还配有一个魔鬼形象的人作势要砍掉一只脚、另一个男人把手伸向旁边的男孩以及疑似车裂酷刑等诡异图案。

随后的9月23日,江南布衣发布了致歉信,全文如下:



但道歉有用吗?你的危机就能解除吗?从网友反馈来看,大多人对这份声明的态度并不满意。

02

因事件不断地冲上热搜,而后又经过网友的不断发掘,这才发现出问题的衣服不止一件Welcome to hell。

多名消费者也纷纷晒出自己购买的童装照片:

比如“七窍流线”的锈色兔子图案,

这玩意别说穿在小朋友身上,穿在成年人身上也会做噩梦呢。



还有乱箭射死的图案,屠杀印第安人血淋淋的历史。



断肢、爆头的诡异设计



而且在官网宣传照上,也明目张胆的宣传。



这些让人引起不适的设计被网友痛批,现在看来一点也不冤枉。



在童装产品中,有一款服饰的印花图案取自艺术画作《人间乐园》,花苞和蛇的图案设计,印上女孩的裙子上。尽管这一画作的艺术价值很高,但凑近了仔细看才能发现这是一个倒立的裸女半身,双手盖住敏感部位,下体还有一坨巨型红色水果。






性元素应用于儿童服饰上明显不妥,也在很大范围内引起人们的视觉不适。而这件服装是江南布衣2017年的产品,至今已有5年时间。

03



据企查查显示,江南布衣集团成立于1994年,但其品牌的主公司——杭州江南布衣服饰有限公司工商信息显示为登记于1997年9月4日。



赴港上市后,总市值一度拉升至百亿港元以上,号称“中国设计师品牌第一股”。



其创始人李琳更是被外界贴上了诸多标签:“浙大学霸”“山本耀司拥趸”“不计回报的环保主义者”……

此后江南布衣正式推出jnby by JNBY童装品牌,主打“纯粹、自然、趣味”的设计风格。



为了打进“中高产阶级家庭”的心里,江南布衣对新开拓的品牌配备了对应的设计师团队。

从首席创意官到主设计师再到摄影师,每位均在集团工作超过16年,以保证“出品高质”。



但问题在于,这些天马行空的创意官、设计师、摄影师真的就懂艺术吗?真的以为从骨子里默认西方元素那就是艺术吗?

笔者也在江南布衣摄影师袁xx身上又发现了一些特殊的嗜好。



为某男朋友系列拍的耳环饰品照片。



一个小男孩的摆拍,向wolfgang tillmans致敬!












再到给江南布衣拍摄的照片!

笔者都想问问江南布衣童装和童模图片展示出来的血腥、暴力、宗教等图案和英文表达,设计师与摄影师们是出于什么样的设计理念,希望向少年儿童传递什么样的价值观?

04

回到恋童癖标志。

2007年,FBI公开了恋童癖圈子的符号。恋童癖通过这些符号来分辨性取向,用来沟通在哪里可以找到对方或者找到“猎物”。






蓝色螺旋三角,这代表喜欢男童,而浅蓝色的螺旋三角代表喜欢男幼童。粉色心形,代表的喜欢女童,而双色蝴蝶代表男童女童都喜欢的恋童癖。



这是因为如果一个恋童癖设立儿童机构或者组织,就可以很轻易的从那些儿童中选择猎物。

江南布衣明目张胆地将三角恋童标志放在线下买家亲子照活动中,还要用兔子毛衣代替easter bunnypedo,所有兔子服饰、背包……

05

难道这个企业不去反思一下吗?



在江南布衣在道歉信中:“我们希望通过全面回顾服装设计及审批流程,建立更严格的内部审核机制,完善消费者体验。”

在我这家长看来,这样的道歉毫无诚意,不过,也就如此吧!

或者这根本不是某个或者某些设计师的问题,而是从根上,从企业文化上,从设计理念上,从垃圾员工身上,这家企业,就已经出问题了!

孩子,在他们的眼里已经不是孩子,

或许就是一个猎物,可怕么?

真的,细思极恐!


user avatar   PandaOS 网友的相关建议: 
      

谢邀。这个问题很简单:如果知道各个号码的中奖概率一样,他们还会成为彩民吗?

***** ***** *****

上面这句话是调侃。如果要认真回答这个问题,得从两个方向回答:

  • (1)“1,2,3,4……” 这样的号码买的人真的少吗?

以双色球(红球 33 选 6,蓝球 16 选 1)为例,在 2015-11-17 的开奖中,全国投注量为 323,653,256 元,即 161,826,628 注,而不同的投注数 共有 17,721,088 种,所以平均每种组合大概有 9 个人投注。那么, 1,2,3,4,5,6,7 这样的组合是否有 9 个人投注呢? 还真的挺有可能呢。全国那么多人玩双色球,有 9 个人次投注了这个充满规律的号还真不奇怪。

所以,题主的命题看起来好像不太成立。

当然了,一定有很多人觉得觉得这个号绝无可能中奖,那么我们来看看近 300 期双色球的开奖情况:

根据计算,四等奖的中奖概率大约为 1 / 2303, 但在最近 300 期里,它中了 1 次四等奖,中奖率还高于平均值呢。

  • (2)为什么有些彩民会觉得 “1,2,3,4……” 这样的号码不容易中奖?

用我自己创造的词语来说:他们被 “归类假象” 蒙蔽了。

什么叫 “归类假象” 呢?

就是看似有意义的归类,在我们所关心的维度下没有意义,反而对我们的判断造成了干扰。

就概率而言,似乎可以用一种很有意义的方式将所有情形进行归类,而看上去不同类别的发生概率差别很大,然而实际上,这个差别只是由于它们在总数上的差异造成的。从任何一个类别中抽取相同个数的例子,其发生的概率或期望并无任何不同。

就本题的来说,我们不难理解彩民们的想法:

他们不自觉地把彩票中奖号码归类成了 “有规律组” 和 “无规律组”。

以双色球为例:“有规律组”的情形可能包括: 7个数呈等差数列,7个数都小于10,7个数都是偶数,7个数包含了两个等比数列等等……其他的都为 “无规律组"。

彩民们研究了一下以往的中奖号码,发现过去好像极少开出”有规律组“ 的情形,所以他们认为:

  • 【买无规律的号码组比买有规律的号码组中奖概率更大】

这个推论有道理吗?看起来好像很像回事呢。

但实际上,上面的那句话是不对的,正确的说法是:

  • 【中奖结果是无规律的号码组比有规律的号码组概率更大】

这两句话有什么不同呢?简单地说,后者是 有规律组 和 无规律组的 等比例抽样,而前者是 有规律组 和 无规律组的 1:1 抽样,样本大小就不一样,概率分布又怎么会一样呢。

举个例子,假设有 100000 个号码组合,其中有规律的有 1000 组,无规律的有 99000 组。

假如彩票中心抽奖了 100 次,每次中奖 1 个号码组合

  • 那平均来讲,只有 1 次是有规律组的, 99 次是无规律组的。无规律组的中奖结果占了 99%。

然而,对彩民来说,

中彩票的平均次数= 买彩票的次数 * 中奖号码属于这个分类的概率 * 买的彩票数在该分类中的比例

如果买了 100 次彩票,每次 1 注,

  • 如果 100 次都是买有规律组,那他的平均中奖次数 E1= 100* (1/100) * (1/1000)=0.001
  • 如果 100 次都是买无规律组,那他的平均中奖次数 E2= 100* (99/100) * (1/99000)=0.001

毫无差异

以上的推导非常简单,连小学生都很容易理解吧?

但是在生活中,这种看似简单的 “归类假象” 可骗了不少人哦。

举个例子,这是一个古老的故事:

曾经有一个女子学院,有一天校长提议道,为了活跃学院的气氛,建议招一部分男生。董事会的成员坚决反对:千万不能这样,否则的话,一年后会有一半的女生退学的!
在最终的妥协下,校长决定,当年招收 1% 的男生做试验。
一年后,校长宣布:“招收男生的计划取得了圆满成功。诚然,学院的女生数量确实有所减少,但一年后她们在该届全体学生中的比例仅仅下降了 1 %”。

你发现问题在哪里了吗?

#


user avatar   maomaochong1107 网友的相关建议: 
      

很少有人不基于框架直接写GUI界面啦,我这个回答就从GUI框架反过来推什么语言做GUI合适。(只聊桌面端GUI编程框架)

Qt

几乎是C++领域最流行的跨平台桌面端软件开发框架了,这个框架是两个挪威人在1995年创建的,发展至今可以说历史相当悠久,稳定性也很有保障。很多大公司都在用它做界面比如金山的WPS。

它内置了自绘引擎,也就是说界面上的一个按钮,一个文本框,都是Qt的引擎自己画的,这保证了基于Qt开发的软件界面在不同操作系统上看起来是一模一样的。

它提供了大量的与界面无关但与软件开发息息相关的API,比如、网络、文件系统、剪切板等,而且让这些API在不同的操作系统下都有效,这极大的节省了开发人员的时间。

但它也有一些缺点,比如在处理一些特殊需求上很不方便,比如:目前Qt有没有比较好解决高分屏下缩放显示的方案?Qt没有真正完美的无边框解决方案吗?等,在一些组件的渲染上也会出一些隐藏的较深的问题(QListItem),一旦遇到,就很难解决。

Qt近年来不太专一,qml,qtquick等,搞了很多,而且这些新玩意儿一直不温不火,有些模块做了又废弃了,比如:qt script,搞来搞去,搞的模块繁多且复杂,用起来不是很舒服。

Qt有界面描述语言(XML描述界面),可以通过设计器拖拽空间设计界面,编译期界面描述语言被转义成C++代码,性能上没啥损失。

Qt商业授权不太友好,开发商业应用一定要谨慎,之前听说有公司为此付出了高额的版权费。个人开发者可以免费使用。Qt的免费版本不允许静态链接,会有版权上的限制,但开发者还是可以通过一些特殊的编译方法静态连接Qt的库的。

除了使用C++开发Qt应用外,开发者还可以使用其他语言开发Qt应用,最流行的就是使用Python基于PyQt做Qt应用了,其他语言的绑定不是很成熟,但PyQt仍然有版权的问题。

GTK

GTK是1997年创建的,也非常成熟稳定,是C语言开发的,但有很多语言的绑定,比如官方支持的JavaScript、Rust等,当然用C++语言操作GTK也很方便,它也有自绘引擎(Cairo),也提供了大量系统相关的API,商业授权也非常友好,基于GTK开发商业软件不用担心收到律师函的问题,虽然它是一个跨平台桌面软件,但它似乎只在Linux操作系统领域流行,有非常多的Linux桌面软件都是基于GTK开发的。

这也直接导致GTK的维护者很重视Linux领域的发展,而忽视Windows和Mac领域。这个框架提供的很多API,只在Linux下有,Windows和Mac下没有。这样的API数量众多。甚至在Windows下编译一下GTK的源码都要比Linux下难很多。而且GTK的渲染引擎在Windows下性能表现也不如在Linux下好。

GTK在Windows上也没办法静态连接,它到不是因为版权的问题,而是它依赖MSYS2的一些库,这个库用于在Windows上模拟Linux环境,这也是为什么GTK在Windows上表现不佳的原因之一。

另外,由于GTK是C语言开发的,所以开发风格也很C语言化,这对于部分开发者来说可能觉得繁琐。

wxWidgets

wxWidgets是1992年英国的一个大学教授开创的跨平台GUI软件,也非常成熟稳定,商业授权非常友好。它没有自绘引擎,而是对不同平台下的界面API做了整合和封装,这样开发者在Windows下开发的软件看起来就是Windows窗口风格、Linux开发的软件看起来就是Linux窗口风格,这对于某些软件来说,正是他们想要的,但要想搞一些花哨的特效就没那么容易了。它同样也提供了大量的系统相关的API供开发者使用。

它是C++开发的,所以对C++开发者非常友好,除此之外它还支持静态连接,也就是说开发个应用不用分发给用户一大堆dll,当然Qt也支持静态连接,但是你得自己编译Qt的源码(不是很方便),而且Qt的授权规则也不允许普通开发者这么做。

它会有些小问题,比如我之前提的:wxEVT_NOTIFICATION_MESSAGE_DISMISSED event emit twice,但总体来说还是非常稳的。除了开发的界面比较死板外,没啥大的问题。目前使用这个框架开发软件的人越来越少了。

FLTK

fltk是1998年创建的跨平台开源GUI框架,历史悠久,商业授权友好,而且C++之父也用它,它非常轻量级,支持静态连接,一个简单的应用编译后只有500K左右,非常赞,

它有自己的自绘引擎,没记错的话用的是OpenGL,但它的重绘机制是按区域重绘的,如果组件A所在的区域上存在组件B,那么A组件重绘时,会把B组件的给重回掉,开发者必须自己写代码处理这种情况。想象一下,如果你想实现一个A组件fade out的同时B组件fade in的效果,就会非常麻烦。

FLTK提供的一些组件样式都比较刻板,绘图API也比较少,你想实现一个漂亮一点的圆角按钮(它内置圆角按钮的圆角大小是不能改的),必须自己画,而且还得借助一些非常奇葩的手段才行(如果你想知道,可以联系我)

它是C++开发的,但API不够现代,用起来总体还算舒服的,它有Rust绑定:fltk-rs。它的用户比前面三个都少。它提供了一些与界面无关的操作系统API,但非常少,几乎可以忽略。

Duilib

是2010年国内一个开发者开发的GUI开发框架,因为底层基于DirectUI开发,所以只支持Windows平台,不支持跨平台,开源协议友好,商用没有任何问题(需要附加Lincence文件),国内有很多大厂基于这个技术做桌面端应用,比如网易、腾讯、百度,这个框架是基于C++开发的,对C++开发者友好。但框架本身还有一些问题,比如对高分屏支持不佳、特殊控件绘制上也有一些小问题,除了界面相关的API外,几乎没有提供系统级的API,作者纯粹是用爱发电来开发这个框架,所以更新不是很及时。

相对来说网易基于Duilib开发的分支更完善一些:NIM_Duilib_Framework,添加了高分屏支持、多国语言、整合了多线程处理的支持,但环境搭建相对比较麻烦。如果开发者要用这个框架,一定要用develop分支下的代码,master分支下的代码问题很多,这个框架看上去也是作者一个人努力的成果。

Sciter

Sciter是2006年创建的跨平台闭源GUI框架,足够稳定,商业授权不友好,但个人开发者可以随便用(只能用动态链接库),一旦公司规模超过3人,就得买版权了(有权静态连接)。

它内部封了一个浏览器核心,让开发者使用HTML,CSS,JS来创建界面,但对这个浏览器核心做了大量的精简,不像Electron和NW.js动辄上百兆的体积,它只要6M就够了。当然这也意味着有些浏览器特性它是不支持的,比如CSS3的flex布局,它就不支持(但它提供了自己的flex布局实现方式)。以前它使用自研的一个脚本语言(和JavaScript很像),自从集成了Fabrice Bellard大神的QuickJs之后,就全面支持JavaScript了。它还对一些特殊的场景做了内置的支持,比如渲染大列表。

它使用C++开发,对C++开发者很友好,有Rust、go、Python等语言的绑定,但都是社区提供的,质量堪忧。有很多知名厂商都用这个库做界面,比如360、teamviewer、赛门铁克等。

RmlUi和Sciter很像,可以看成Sciter的替代框架,但RmlUi这个项目有三界作者,一个一个的弃坑不知道新任作者会不会弃坑,目前还不是很成熟,比如我正在尝试帮作者解决的CJK输入法的问题,目前还不推荐大家使用这个框架。

CEF

CEF是2008年创立的,基于Chromium的跨平台GUI框架,稳定且商业授权友好,国内很多大厂都用的CEF:比如微信桌面端、网易云音乐桌面端、QQ桌面端、微信桌面端、MATLAB、FoxMail、OBS Studio,装机量破亿。

由于它几乎封了一个完整的Chromium,所以体积非常大,但支持所有的HTMLCSSJS特性,它几乎不提供任何与操作系统相关的API,创建个托盘图标、读写个文件啥的,都要开发者自己完成,它是C/C++开发完成的,对C++用户非常友好,它有gopythonjava等语言的绑定,但都是社区提供的,质量值得担忧。

它对Chromium封装的很好,避免了开发者直接与Blink、V8、Chromium等复杂的代码打交道,很多功能都有默认实现方式,遵从约定由于配置原则,有经验的C++开发者可以很轻松的驾驭CEF框架。

由于Chromium是版本弟,所以CEF版本发布也非常频繁,很多被标记为稳定的版本,还是会出一些莫名其妙的问题,选一个好的版本非常重要。

与Electron一样,它也是分主进程和渲染进程的,所以开发者要非常娴熟的运用跨进程通信的技术,虽然CEF提供了跨进程相关的API,但复杂度还是有点高的,使用的时候要认真细心。

MAUI

这是微软的跨平台GUI框架,不仅仅支持桌面端,还支持移动端,但官方并不支持Linux的桌面端(黑人问号,感觉与微软近些年向开放、开源的大方针相悖),这个框架新的狠,至今还没发布稳定版。目前还没什么人用。而且不知道将来会不会被微软放弃。

它是.NET平台下的GUI框架,有自绘引擎,对C#开发者很友好,界面依然是用XAML描述的,可能很多人一听到XAML就直接弃坑了。XAML表现力确实弱一些,我觉得WPF没火起来跟XAML有直接关系。

使用这个框架开发桌面应用得封一个.NET框架给用户,当然有了.NET框架应用程序访问一般的系统级API也就不成问题了。

Compose Multiplatform

这是JetBrains搞的跨平台GUI框架,也非常新,前段时间刚刚推出1.0.0版本,但这个版本还不是很稳,至少比Flutter Desktop的第一个稳定版要差很多。同样也几乎没什么人用。

它的自绘引擎用的是Google的skia,这个自绘引擎稳的很,Chrome和Flutter都是用的它,所以排版、绘制、渲染之类的工作不太会出问题。比Java生态圈里的Swing和JavaFx要好很多。

JetBrains的东西当然对Kotlin开发者友好啦,Java生态下的很多东西你都能用,访问系统级API也没啥大问题,同样也得考虑封一个JRE给用户。

flutter-desktop

这是谷歌的跨平台开发框架,开源、免费、文档齐全、投入力度大且持久,同样也新的很,Windows版本刚刚发稳定版,Mac版本还没稳定。

如果你完全没搞过移动端的flutter,想用这个框架开发桌面应用,那么意味着你要学的东西还挺多的。好在dart和flutter入门都不是很难,学习曲线比较平缓。

由于flutter在移动端积累了很多年,所以界面上的一些东西在desktop端都比较稳(skia自绘引擎),与操作系统相关的东西还不成熟,生态也不太好,比如你想订制一下窗口的标题栏,想访问一下注册表这类工作可能得自己想办法。不过它有类似FFI的支持,跟C/C++语言打交道很方便。

开发者直接使用Dart语言描述界面,这会导致众多大括号嵌套在一起的问题,可能很多开发者不习惯。

webview2

这是微软Edge浏览器团队推出的跨平台GUI引擎,是闭源的,目前只支持Windows,对C#和C++开发者友好,如果使用C#开发,就得考虑把.NET运行时分发给用户,如果使用C++开发,就得自己处理系统级API的操作,webview2本身是不对系统级API做封装的。

这个框架推出也没多久,很多API也还不稳定,更值得担忧的是这个团队,他们前不久刚刚放弃了自己的浏览器核心转而使用Chromium浏览器核心,不知道他们会不会放弃webview2这个框架。

它的优势是可以复用系统当中已存在的webview2二进制资源,也就是说它虽然封了一个Chromium浏览器核心,但如果你可以确定客户电脑已经存在了基于webview2开发的应用,你的安装包体积可以足够小。

它也是多进程架构,甚至比Electron还要多一个进程(为了复用二进制资源),资源占用比较多。

webview

这个库使用操作系统的浏览器引擎来达到减小安装包体积的问题,Mac上使用Cocoa/WebKit,Linux上使用gtk-webkit2,Windows 10上使用Edge(也就是上一个小节里提到的webview2),它应该是不支持Win7的。开发者要考虑前端代码浏览器兼容的问题。

开源且免费(MIT)有go、Rust、Python等语言的绑定,不过官方支持的是go语言,C和C++,操作浏览器的API非常少,不支持自定义scheme,更别提系统级API了。

TAURI

采用的技术方案与webview类似,所以安装包也足够小,非常新,还没发布稳定版,开源免费。webview框架碰到的问题TAURI都有,

使用Rust开发,将来会支持Deno,作者说将来会直接使用webview的技术来支持多平台,

NW.js

NW.js最早把Chromium和Node绑定到一起,用前端知识做界面,用Node技术访问操作系统,最早叫node-webkit,在2012年创建。NW.js基于MIT开源,可以无忧使用。没记错的话,微信小程序开发工具是用NW.js开发的。作者是英特尔的员工,英特尔的一些工具也是用NW.js开发的。

除了Chromium和Node的能力外,NW.js自己也封装了一些系统级API,类似托盘图标、剪切板、系统菜单这种,但数量明显比Electron要少。

NW.js可以在多个窗口间共享同一个Node.js上下文,而且还可以通过配置让Node的上下文和Dom上下文混合,这给开发者带来了很多便利。心智负担减少很多。不像Electron要时刻想着进程间通信,哪些模块当前进程不能用这类问题。

NW.js虽然起步早,但奈何没有杀手级应用,周边的生态和工具链没发展起来。用的人越来越少,维护的投入也不如Electron大,再加上Chromium更新非常频繁,导致NW.js的有些API也不是很稳,恶性循环加剧。

Electron

Electron的作者曾经在NW.js团队工作过(NW.js项目贡献第二多的人就是Electron的作者),后来辗转到了github公司,于2013年在创建了Electron,也是个开源免费的产品。由于VSCode、slak等国际型产品都选择了Electron,所以从者甚众,生态和周边工具链也完善的多。虽然开发方式上有点蹩脚的地方(多进程架构及模块归属进程),但瑕不掩瑜。

Electron每创建一个窗口都会多一个进程,这使Electron创建窗口的效率不高(秒级),NW.js有复用进程的机制,即使新窗口加载完全不同域的页面也不会创建新的进程(毫秒级)。这也是为什么很多基于Electron开发的应用都使用Dom模拟弹窗的原因。

无论是浏览器相关的API,还是系统级API,Electron提供的都比NW.js多。

--------2022-02-25更新--------

这些框架除了对开发者使用的编程语言有要求外,还有一个重要的差异就是有没有独立的界面描述语言(也就是UI DSL),这非常重要,涉及到一个框架表达业务的重要能力。

类似XAML、qt的ui文件、HTML+CSS都是界面描述语言,下面这种也可以算界面描述语言,但我感觉它不够纯粹(flutter、qml和Compose Multiplatform都是类似这样的):

       panel {   row {     checkBox(...)     row {       textField(...) // indented relatively to the checkbox above     }   } }     

但无论如何,显而易见的是,没有任何一个界面描述语言能比的上HTML+CSS组合。想想看:HTML里各种花里胡哨的语义化标签和Dom操作技巧,CSS里的布局方式、伪元素、动画描述...,对比之下你就会觉得XAML、qml直流都是弟弟。

除此之外,一个优秀的GUI框架还有两个重要的需求,这里我简单聊聊:

强大的事件处理机制必不可少。

想想这些:鼠标事件、键盘事件、触屏事件...界面加载完成、媒体播放结束、元素大小改变...网络状态变更、数据段传输完成...另外,还得处理事件冒泡、事件捕获、事件分发吧...

qt的开发者曾经说过qt的SIGNAL和SLOT机制是有性能问题的(但影响很小)

强大的异步处理机制必不可少

你不能在用户处理业务逻辑的时候,让界面渲染工作阻塞,这就需要一个强大的异步处理机制,让开发者自己去开线程去完成业务处理,无疑是又麻烦又会增加开发者的心智负担。

我记得很早之前在C# WinForm应用中,点击一个按钮,如果不用Invoke执行逻辑处理的话,界面就会卡死。

这么看来,在你的GUI应用里包一个浏览器核心还是挺有必要的,这样你就可以用HTML+CSS强大的能力来描述你的界面,用JavaScript强大的事件处理机制和异步处理机制来完成用户交互。

可能有人会想,这会带来很多问题呀,比如应用体积会增大的100M以上、会占用更多的CPU和内存资源,还会更耗电等等。

确实,目前来看这些都是问题,但仔细想想,这些问题应该不会持续太久,网络会变的更快,用户的磁盘和内存会变得更大,CPU处理能力也会更好,耗电的问题当然会持续存在,甚至会愈发耗电,但电的供应会持续增长呀。

web相关的技术之所以胜出,并不是这些技术的设计者有多厉害,而是这20多年间,有大量的人涌入了这个领域,前赴后继的推动着它前进。其他任何一个领域都没有这么热火朝天的景象。推荐大家看看我的另一个回答:

------------2022-02-27更新----------

用Web相关的技术做GUI应用的优势是,让开发者可以把大部分精力投注在业务本身上,而不是处理与GUI相关的技术细节。

实际上所有的框架,都应该是这个目的,比如ORM框架,目的应该是让开发者把大部分精力投注在业务与数据之间的关系上,而不是管理关系型数据的技术细节。

当然这肯定是有损耗的,在性能、稳定性、资源消耗上,都会有所削减。而且,因为有框架的存在,开发者很难深入到框架内部做一些特殊的事情。比如,我们该如何修改HTML的排版渲染机制呢?

所以,有些框架注重性能,有些框架注重开发效率,开发者做选择题的时候也应该衡量这两个问题,你的应用对哪些方面要求多一些呢?

你如果要开发一个视频监控系统,没多少业务功能,但要24小时不间断的记录视频数据,随时调取某一段时间的视频数据,这种应用可能Qt是最好的选择。

你如果要开发一个类似飞书的团队协作应用,业务逻辑复杂的一塌糊涂,而且要在短时间内满足更多用户的需求,占领更多的市场,那么Electron可能是更好的选择(目前飞书已经不再用Electron了,他们自己编译了Chromium核心,自己封了一个类似CEF的框架)

目前微软、谷歌、JetBrains等公司都非常重视桌面端开发框架,也在推各自的框架产品,说明桌面应用领域并没有没落,反而应该更加受到重视。

虽然移动端应用大行其道,但我认为,只有生活、社交、轻娱乐等方向上的应用在移动端有较好的发展。文档协作、大型游戏、开发工具、专业管控软件等应用还是在PC端发展的更好一些,毕竟PC端有更多样的输入输出设备、更广阔的显示和交互的空间,更强的存储和计算能力。

希望桌面软件开发领域的从业者都能获得幸福。

满屏荒唐言,一把辛酸泪,一把辛酸泪,一把辛酸泪...





  

相关话题

  为什么1KB等于1024B? 
  回顾人类历史,计算机的出现和进化对人类的进程造成了多大的影响? 
  一个浮点数到底是怎么被转换为字符串输出?一个浮点数不精确,那么其输出的值是怎么被确定的呢? 
  在线教育平台上有哪些让你相见恨晚的计算机或互联网课程? 
  希顶字母很丑吗?究竟是世人皆醉我独醒,没有前卫眼光,还是这个世界人情很冷漠? 
  如何看待《民科的背后:底层文化的哀嚎,肉食者你们听到了吗》一文的这些观点? 
  计算机领域有哪些「将错就错」被沿用至今? 
  如何开始用 C++ 写一个光栅化渲染器? 
  今年诺贝尔物理奖得主彭罗斯算不算民科? 
  面向对象编程的弊端是什么? 

前一个讨论
网络用语「润」是什么意思,有哪些引申用法?
下一个讨论
假如存在 III 级外星文明,为什么他们一直不发动宇宙战争?





© 2024-11-28 - tinynew.org. All Rights Reserved.
© 2024-11-28 - tinynew.org. 保留所有权利