现实中从来不会有人认为手语是比文字语言效率更高更方便的沟通语言。
但却有题主认为用手挥动鼠标是比键盘敲命令更值得推崇的与计算机交流方式。我觉得这才是真正奇怪的思路。
图形界面仅仅在被严格定义的有限的场合具有优势,在绝大多数场合都不会比命令行的表达能力更强。
对于浅度用户来说也许那严格定义的有限场合就已经满足了他对计算机的全部需求。然而对于专业人员很少有说完全不用键盘的。
因为对专业人员来说,命令行的确比图形界面强大,方便——就好像专业人员喜欢使用术语而不是拿大白话展开让每个人都“懂”一样。
当然,强行“拽”术语甚至误用错用术语搞后现代文本风,那就是另一回事了:这种行为值得鄙视;但必须注意,该鄙视的是拿术语装X的行为;甚至,和普通人说话时,该说人话他们不说人话你也可以鄙视;但对于想成为内行、需要和同行高效交流的人,提倡术语才是明智之举。
鼠标是一种更偏模拟量的输入设备,它在输入模糊性的“大概这里”“大概那里”之类信息时非常高效——因为人的思维本身就有一定的模糊性,转换成语言文字甚至具体的纵横坐标等精确指令,反而带来很大的思维负担。
因此,在画图/修图等软件里,鼠标往往比键盘更好用。因为我们真正需要修的可能是画面中模特的“鼻翼两侧”,用键盘就要转换成明确的(81,97)开始的一块不规则区域——可以做到,但为什么不可以是(82,101)呢?
甚至,我该怎么知道模特鼻翼左上角坐标是(81,97)都是个难以解决的问题。这时,不需要动脑子直接可以指上去的鼠标,显然要优越得多。
以上,就是“只能用大白话拽术语纯属装X”的场景。
计算机本质上是个数学机器。精准的使用术语是一个门槛较高的工作。
此时,就好像输入法的联想功能一样,设计一个“上下文菜单”,帮用户选择合适的命令,自然就能大幅提高他们的输入效率、降低记忆负担。
这种情况下,图形界面也是优于命令行的。
但,只要稍进一步,情况就悄悄发生了变化……
和输入法的联想功能一样,如果你需要输入的东西稍微生僻、它就是“联想”不起来呢?
做计算机命令方面的联想,比输入法还要难得多。毕竟后者有海量语料库(但作为专业输入者,你还是需要掌握生僻字的输入方法,不能依赖联想)。但在某个界面上(比如AutoCAD),可行的上下文甚至可能有无限多种。
除非在某个极为狭隘的领域做一些单调重复的简单工作,否则,只依靠程序员拍脑袋给你拍出来的“上下文菜单”,是不可能顺畅完成日常工作的。
你需要做的工作越复杂,“智能联想”能提供的帮助就越少。
同时,为了提高“智能联想”的命中率,我们写程序时,往往不得不尽量减少用户的可调参数——比如,为了照顾普通用户,我们不敢说去除噪点(参数xx半径yy强度zz)、色彩增强(RGBα颜色通道上的各种操作以及另外一大堆参数)等等等等,而是把所有这些放到一起、搞出十几个固定风格让用户选,还告诉用户说这种高科技叫“一键美颜”,结果输出五毛钱特效……你要开照相馆靠这个能应付挑剔的专业顾客?
此时,智能联想不光无法提供帮助,反而成了专业用户的阻碍——想想如果要你用美图秀秀做商业海报,你会不会骂娘呢?你会不会想念PS那吓死普通人的专业菜单?
显然,一旦面对的问题复杂到一定程度——既然你已经是数学家/科学家/计算机专家了,为什么不直接用精确无歧义的术语呢?
把术语都日常化,的确便于科普;但到了学术交流阶段,不说“扭矩是xx牛顿·米”而说“大概像你手掌上放xx本书时手肘受到的力”,不仅是浪费与会专家的时间,实际上也不可能说清楚你真正想表达的“效率-扭矩曲线”这种高端玩意儿了。
计算机领域也一样。
以上是受 @pansz 朋友的启发,这才能够说的一步到位。
pansz:为什么总有人极力推荐使用命令行操作而非图形界面?
以下是原帖内容。因为当时没整理好思路,因此说的比较凌乱。不看也罢。
举例来说,我有个硬盘坏了,读取速率经常掉到2m以下,还频频出错。里面有500个G的资料要抢救。拷完得差不多一两天,还得人坐旁边看着,错了停了就重拷,再拷贝时要跳过重复文件(现在还好,win10有跳过文件功能),不然很可能拷到同样位置又出错了。
如果你用图形界面,那么你就需要找一个精确吻合你需要的软件,然后一点……点这下当然很容易,可找软件能累死你,因为这种需求太小众了。小众软件太难找甚至压根没有,就是找到也经常要掏钱买,不过相比搜索难度就不算什么了。
但如果你命令行玩的很熟练,那么很容易就可以组合几个常用命令,轻松完成任务――甚至还可以带断点续传功能、拷完可自动关机。
换句话说,命令行模式的确需要你记忆更多命令、孰知一些通用约定;但这些东西可以作为基础,搭建出任意复杂的功能来。
当然了,这也导致它的入门门槛略高,对非专业用户来说得不偿失;即便专业用户,当针对该领域的软件已经较为完善时,不去用现成的图形界面工具就是舍近求远了。
甚至,组合这类命令本身,往往就要求你有一定的编程基础,对非程序员来说那是加倍的不合算。
当然,如果你已经是程序员,那么学会使用命令行(脚本),起码可以在遇到类似问题时,解放你一两天的时间。
刚才手机答的,现在稍微展开点说一下。
这里有一个图形编程工具,是MIT为儿童学习编程设计的:Scratch - Imagine, Program, Share
你猜为什么它就是比不过python、java、C++呢?
各行各业,做事都免不了要用工具;但工具和工具并不一样。
举例来说吧,你在家做饭,完全可以用这个:
但如果你要开个店卖面条,还用上面那个说明你傻。这玩意儿才值得拥有:
但如果你说我要造面条机……那么你该买的是这个:
很容易发现,越是面向最终消费者的工具,功能就越是单一,操作也越是简便——量面,倒水,一键出面条。弄伤自己?嗯……举起来砸自己脑袋算吗?
越是面向专业人员的工具,功能就越是复杂,操作界面也多了很多按钮/仪表;如果不注意操作规程,就容易不小心弄伤自己。
但是,在付出这些代价的同时,你也得到了极高的生产力、可以做的面条厚薄、宽度的可调范围也大幅增加。
最后,给专业人员制造工具的工具,其复杂度更为“恐怖”,工伤成了家常便饭:
我们再换一个角度。
面条机虽然最终功能单一,但它有机的组合了许多功能,从搅拌和面到面条挤出,一条龙服务……
等等,你说,它也有电机啊,拿来拧个螺丝行不行?
不好意思。它可拧不了螺丝。拧螺丝你得找这个:
你说,还不对啊,这玩意儿能拧任何螺丝、也可以配合各种型号的钻头……面条机能做粉条吗?不都是条状可以吃的东西嘛?
你看,刀锯斧刨锤,这几样凑一块足够做任何木工活了。面条机……
没错,这里还有一个维度:工具的泛用性。
这玩意儿好用不:
好用?我这有个旋翼机,你用它能做飞控吗?
显然不行。做飞控你得找它(以及其它类似的东西):
没错,没那个现成的计算器好用,前者开箱即用,算账全靠它;后者……对不懂计算机的你来说,它和一块砖头没多大区别——还不如砖头好用呢,起码垫脚啦拍人啦拿来就用。这树莓派啊,吃不能吃喝不能喝梳头发都别别扭扭不好用……
但是树莓派有无限可能。
对工具使用者来说,他总是有两个选择方向:方向一是只能做一样的专用工具,方向二则是泛用型的基本工具。
专用工具单件学习成本低,使用方便;泛用工具学习成本高,使用不便,甚至常常伴随着危险。
作为生产厂家,你可能会买椅子生产线;但作为一个高级木匠,你肯定选择带锯机、木工机床。因为只有后者才允许你发挥自己全部的专业才能——生产线?我造生产线。
作为木匠,借助木工机床,他是万能的;买条生产线他就只能像没有技术的农民工一样接收半月培训坐生产线旁边当螺丝钉,然后只造同一个型号的椅子(的一个零件的一个面、一个孔)。
换句话说,对专业玩家,学习使用更接近根本、泛用型更强的工具,效率反而是更高的。
就好像我们程序员,说白了只会顺序分支循环三种控制结构和与或非三种逻辑——然后借助某种编程语言几十个关键字/运算符表达出来——经过四年学习,便可宣布计算机领域我全能。
反之,你要只会玩war3地图编辑器,这个图形界面可强大了——给你八年时间,你能用它清理磁盘吗?
欲速则不达。
单件学习效率高的工具,在面对一整个大领域的问题时,往往反而是更难学难用的。
因为做100种家具你就不得不学习使用一百条生产线,每条生产线又有100个位置……你得掌握一万个知识点才可能做出100种不同家具。
再多一种家具?从头学吧。
但如果你学锯刨钻斧,学木工机床,只需掌握至多几十个知识点,你就是万能的。
没错。这里就是图形界面和字符界面设计着重点上的根本不同了。
图形界面就像计算器,你需要什么功能,它就给你什么功能;无论供电、显示甚至长时间不用自动关机节约电量等等,都用不着你操心。
Do not make me think——这是图形界面设计者对它的用户特征的总结。
当然,一旦认为用户需要“Do not make me think”,那么结果必然要走向“禁止用户思考”——除了按钮,你什么都不要知道。让你知道了就说明我“封装”没做好,又劳驾您动脑子了。
久而久之,哪怕你清清楚楚知道后台的一切,你也没办法控制它了——就好像win10饱受诟病的强制更新等机制一样:我笔记本网卡很奇葩,win10驱动下它就是上不了网,只有win7驱动可用;但为了使用win7驱动,我不得不和它那恶心人的“傻瓜机制”斗智斗勇一整天!因为从调查排错到替换驱动,它时时处处拿我这专业人员当傻逼,时时处处给我制造麻烦。最后,强制关闭完整性检查、建立win10版驱动同名目录并给这个目录设置极高访问权,这才阻止了win10做蠢事,使得它不再强制把正常的win7换成错误的win10驱动。
如果你确信自己不需要了解背后的原理,确信自己永不必处理软件作者没有想到的奇葩状况,那么傻瓜式的图形界面显然最为适合你。
而字符界面类似树莓派。它不仅给你现成的功能,还给你完成任何功能所必需的基础——你可以把任何现成的功能当成基础组件,用来搭建更酷更炫的东西。
最最极端的例子就是图灵机,或者各种编程语言——没错,这些玩意儿功能简单,简单到了丑陋的地步。以至于仨数字排个序都需要自己写程序才能搞定。
事实上,最最“简单”的机器语言,你得自己做二进制转换;汇编语言可以帮你把“助记符”转换到二进制;C/Java等高级语言可以让你用if/for/class等更为高级的概念直接编程;而更“高级”的脚本语言……你只需像胶水一样把它提供的半成品往一块一粘就好——要什么你就能“粘”出什么。
而命令行的设计思想,就是“搞一种比脚本更高、但比计算器更低的东西”——不,它实际上是把计算器本身都当成一种组件、一个工具,从而允许你自由组合它们。
比如,我可以这样:
call 自动打蛋器 //打出鸡蛋液
call 自动面条机 //加入鸡蛋液做成鸡蛋面
call 电磁炉 //煮面
call iPhone //喊你家的小懒虫起来吃饭
添加细节,调试通过,存成“一键做鸡蛋面.sh”,然后在桌面建立个快捷方式——该吃饭了鼠标一点,一会儿电话打过来你就可以去吃面条了。
如何?酷吧?
N年前,我有张光盘划伤了,数据怎么都读不出来。有个文件时多时少,总是读若干字节就出错。用了当时流行的很多数据恢复软件都读不出来。
但这个故障我很清楚,就是表面稍微擦伤,导致数据难以读出。每次根据激光聚焦点位置的不同,能够读取的数据也各有不同:近一些能读前4k,远一些能读后4k;偏左点能多读接下来的4k,再偏右点又能把尾部4k读出来……总之只要多试,利用激光头的随机误差,就有一定概率能救出全部数据。
可是很遗憾,我找遍了当时各种数据恢复软件,包括很多商业数据恢复工具的破解版,全都无能为力。
后来我都打算自己写程序fseek一把了,忽然想起个主意。于是把光盘路径设定为ftp服务目录,然后用断点续传工具从这个自建ftp站点下载,重试次数无限——这样实际发生的物理行为就是我所期望的场景——果然,仅仅消耗了4、5分钟,就把完整内容读出来了。
当然了,这个其实是用图形界面软件做的。但是这里面有个思想很可贵,就是工具是可以组合起来用的,并不需要别人全给你做出来。有一些基础功能,然后再允许你组合,那么绝大多数任务你自己就可以通过组合搞定。
命令行鼓励你组合使用各种软件——当年的DOS甚至把它们统称“外部命令”——从而得到无限的功能。
只不过,window的命令行是个阉割品,你实际上很难很难借助它粘合各种软件。
这样也好。各种各样的标榜自己可以“数据恢复”的劣质品就可以上架卖了(当然,专业的数据恢复软件还是很强的,只是它可能恰好没有我想要的功能而已)。
再来个例子。
我的笔记本自带硬盘只有320G。对我这种重度使用者来说显然不够。后来又买个1T的希捷deskjet移动硬盘作为补充。但没多久,50G容量的C盘已经满了(当时大部分人分给C盘的容量只有10G左右,很少舍得给20G的,我直接给50G)。
实在忍受不了,买个新硬盘打算升级。
但这个笔记本上有我已经配置好的全套环境,原有的windows还是正版。重新安装实在劳民伤财。
很多高人马上就会想到ghost:把C盘用ghost做个影像,然后把影像写到新硬盘第一个分区;写完用PQ Magic扩大这个分区;然后再在新硬盘上分出D、E区,继续用ghost把旧硬盘其它分区做成映像复制过来——同时按需要用PQ magic扩大分区。
简单说,你得下载(很可能是盗版的)ghost和PQ Magic(其实PQ magic当时已经不支持win7的ntfs分区扩容了,所以你得满世界找替代的、可支持ntfs的软件);然后等着ghost一个个做映像;然后一个个写入映像、修改分区大小……总之,起码5、6个小时离不开电脑。
我的做法是,找个U盘,在上面做Linux live CD。
把新老硬盘同时安装到电脑上(当时就打算用老硬盘做移动硬盘的,所以同时买了移动硬盘盒);使用U盘启动,打开Linux终端,su切换到超级用户(root)。
使用fdisk为新硬盘分区,其中C盘分200G,D、E等分区同样放大;另外又给linux分了几个区,打算做双启动。
然后执行如下命令:
dd if=/dev/sda0 of=/dev/sdb0 bs=16M
dd是Linux下一个强大的数据复制工具;Linux下一切皆文件,因此sata接口上的磁盘a的第0个分区同样可看作一个普通文件,磁盘b情况类似;if=/dev/sda0意思就是以老硬盘最前面的分区为输入;of=/dev/sdb0意思就是以新硬盘最前面的分区为输出;bs=16M意思是一次拷贝16M的数据,这个不同的系统有各自最合适的值,你可以多试几次,看看选用哪个值拷贝速度最快。因为这个命令是把整个分区当文件顺序读写,因此无需频繁寻道,数据复制速度可以一直压着硬盘理论最大值飙车。
dd (Unix) - Wikipedia
还有N个区?很简单,继续往下写dd if=/dev/sda1 of=/dev/sdb1 bs=16M就好了。
然后,继续敲resize2fs /dev/sdb0,它会自动把该分区的文件系统大小调整到和分区实际大小相符。其它分区依此类推。
敲完,存为cpsys.sh,chmod +x,然后多检查几遍,确认没问题,执行./cpsys.sh > cpsys.log
接下来出去逛商场,逛到中午回来,cat cpsys.log | grep Error确认没发生任何错误,关机,拔U盘,拔移动硬盘,启动,一切就和原来一模一样——除了磁盘空间变大之外。
——对不会命令行的你来说,你得知道ghost、知道pqmagic,知道它们是干嘛的、知道它们怎么用(pqmagic不支持了你还得重新找重新学);但对我来说,dd是个日常使用的、熟的不能再熟的普通工具,其它一切一切也都是老熟人。在整个过程中,我不需要学习任何额外知识,“吃老本”就足够了。
因为它们都是泛用型工具。一次投资,终身受益。
说什么IT行业千变万化,说什么IT一日千里,说什么搞IT必须终身学习……
但对掌握了泛用型基础知识的人来说,所谓“日新月异”多半只是新瓶装旧酒——比如说,我敢把ghost叫做“用图形界面打包的、功能单一的dd命令劣化版”,而且的确可以随手用三五行命令把它秒的渣都不剩。PQ Magic同理。
你呢?
什么叫自由?
你所掌握的知识都是你的,可以随意的流淌于指尖,可以轻松惬意的达成你需要的任何目标,这才是自由。
受制于商业软件,人家不给你写你就只能乖乖在电脑前坐5、6个小时;人家不支持了你好不容易死记硬背下来的一切就打了水漂——不会有人真有这么大脸,敢把这个叫“自由”吧?
当然了,我们都知道,面条机是不可能这样组合的。
很简单,并没有一个标准的、为了得到这种自动化而做出的输入输出约定。
因此,哪怕你集齐了打蛋器、面条机、电磁炉、iPhone,你还是召唤不出神龙……哦不,服务不好你家的小懒虫。
图形界面有着同样的窘境:你可以一键做面条、一键煮面;但你必须自己把面粉+水倒入面条机,然后自己把面条放进电磁炉……
这就是我在评论区提到的:你可以勉强用按键精灵去组合图形界面程序,但是你必须考虑界面卡死等等可能。浪费更多机器时间,功能还不稳定。
因为它们压根就没考虑过“程序之间的接口问题”。
而如果你玩的稍微深一些,就知道Windows下的rar、7z等压缩软件,都同时给你安装了个非GUI版本,允许你在命令行通过参数使用它们——允许你把它组合进你的处理流程,这本身就是个极为重要的功能(事实上,很多GUI软件都能接收命令行参数。越是偏工具性的软件就越是不敢忽视这点)。
而命令行(特指bash等真正有管道、作业控制等支持的命令行,并不是Windows上那个李莲英……哦不,cmd)从一开始,就考虑了这个协作问题。
学过C语言的,大概都知道main函数有一个返回值,这个值就是给命令行用的(其它编程语言都有类似支持)——0表示成功执行,非零是各种错误码(不同的返回码代表什么也有统一的标准)。
*nix的shell不仅能捕获这个返回值,它甚至还允许你捕获、分析其它软件在标准输出/标准错误上的输出内容,从而达到更深层次的配合。
尤其php、python之类脚本语言,它甚至允许你轻易的把“通过命令行调用其它程序”集成进你的代码(其实C也很容易做到这些,它们甚至有专门的库提供支持)——你完全不必操作字符串、也不必自己写代码完成http下载,丢给grep/wget即可:它们那么强大,你再自己一点点敲一遍,不累吗?
现在,当你买了面条机,你就可以轻易把它们组合起来,从“一键做面条”衍生出“一键做西红柿打卤面”、“一键做酸菜肉丝面”等无穷无尽的功能。
换句话说,命令行牺牲了工具的易用性,提高了入门门槛,以保证其泛用性;而图形界面通过牺牲泛用性,突出了其入门门槛低、易用程度高的优点。
当然,理想很丰满,现实很骨感。
命令行的确给“脑子里充满奇思妙想又喜欢捣鼓”的人带来了极大方便;但它本身却因此显得有些复杂了,入门门槛较高。这就使得它成了“专业人员”的玩物,缺乏计算机基础的普通用户只得敬而远之。
很多时候,你必须先是一名程序员,才可能解放命令行的威能;但更多时候,哪怕你就是一名程序员——我只是想做碗面条啊,为什么一定要我先看完这一千多页的鬼手册?
人,总是喜欢偷懒的。
这时候,“点开即用”的图形界面就显得更强大、更方便了。
——我只需要把代码编译成APP,然后挂出去卖就行了;具体的编译步骤、参数什么的,随便选一个不好吗?
——什么破光盘要组合这个组合那个,真有那需求我敲段C/Java代码不就搞定了?
——更多更诡异的需求?买买买!都不掏钱买写程序的不得饿死?
你看,也有道理,对吧。
你呢,你会如何选择?
总之,不同人有不同的需求。单独的一个个图形界面程序足以解决80%以上的问题,而且还不断有新的程序被写出来,覆盖更多的“痛点”。
也许,命令行所致力于解决的那额外20%的问题并不是你的需求;或者你可以忍受一定的不完美、或者你可以等更完美的成品上市。
不过,总有人,总有公司,总有一些业务场景,会遇到“不得不解决20%问题”的时候。
如果你善于组合,那么很可能就能花一两天时间(也可能更长或更短)解决问题;否则,或许你就不得不花十倍百倍的时间从头写出那些基础功能、然后再组合出解决方案——再或者,你也可以提出需求,让软件公司给你定制软件:这个世界上,绝大多数的软件都是组合他人现成的库/程序完成的,不怕多这一个。
这也是为什么office为什么要支持VBA以及微软为何要从OLE到COM到COM+无限次推倒重来……从而把一些“可怕的细节”通过“可怕的编程语言”暴露给无助的非程序员们的根本原因——哪怕因此而导致宏病毒泛滥。
并且,现在Windows也搞power shell了。
没有免费的午餐。
要么牺牲易用性来保证泛用性,要么牺牲泛用性来保证易用性——有些困难是本质上的。钱再多,你也不可能两者兼顾。
如果你只需要解决“敲键盘时坐的舒服”的问题,那么千万别理什么椅子生产线什么制造生产线的工具,挑一把让自己感觉最舒服的椅子就行了。
反之,如果你打算自己开家木器厂和别人竞争……你猜如果你这辈子都没见过椅子是怎么生产出来的,几个“小目标”够你赔?
但是,又一个转折,你个做木器厂的,研究汽车发动机干嘛?
当然,这里讨论的是“合理利用手头一切资源”的问题。
也有人觉得敲命令便于装B,另一些人则选择怼这些装X犯。这就是另一回事了。
因为命令行本质上是逻辑的文本化描述。
同样是文本化描述逻辑的还有代码。这也解释了为什么程序员更喜欢命令行。因为一旦逻辑文本化,那么就可以对逻辑进行抽象,保存,优化,很多人不知道命令是可以保存的,windows 上的bat 脚本见过没?那用记事本打开就是一堆文字而已
别小看这个抽象能力,逻辑是有层次的,当把低层次的逻辑封装起来,就能在更抽象的层次上高效的表达逻辑。而鼠标是难以做到的。
如果逻辑能够保存,就能够获得持久化和分享的能力,以及持续改进的能力,当我们要求计算机执行复杂任务时,往往我们没有办法思考的很全面,这时,如果他人的经验能直接以可执行的文本传播,将节省所有人的时间成本。
通过抽象成不同的层次和持久化,命令行永远能够以一种简单的调用完成鼠标操作远远完不成的任务
我用了这么多年命令行,现在倾向于认为,除去极端情况,大部分时候用命令行只是因为gui替代品的交互设计不行,或者人力不足以做出好的gui,没有例外。
比如说我在小公司上班用的命令行工具,模糊搜索的时候fzf弹出搜索框,zsh命令补全的选项面板,以及tmux横竖各种切分窗口,vim各种折叠代码和补全窗口,终究不是在命令行参数,而是在交互设计上下工夫,况且折腾半天也不过是一个poor men's gui,君不见Google微微一笑,掏出了自产的webide全家桶。
很多人举例说“我需要远程登录xxx机器然后用终端编程”,本质上是因为linux的远程桌面功能做的太差,开个x forward就卡成翔,远不如rdp方便,所以只好刀耕火种而已。真正涉及到集群管理的时候,各种monitor panel还是用的web console,大家都是用浏览器点进去,图表动画一应俱全,放大缩小一目了然,哪有什么命令行的事。
至于“用pipe组合各种命令行而不复用组件库”本质上是一个糟糕的实践,只是因为这么多年来习惯成自然,改不了了,大家只好将错就错而已。各种bash自动化脚本配合sed awk鬼画符毫无可维护性而言,历史负担越来越重,谁也不敢动,只好奉为圭臬,老人们再教导下一代的命令行使用者,这是一种循环。