[转]不是高手别碰我,VIM怎么舍得我难过

大家都说用VIM的是高手,我说不对,随便看一下程序图片,简直就是绝世高手用的编辑器。我折腾了半夜,反而被它给折腾了,因此为了朋友们的幸福着想,我不再一一列举它的用法。其实最大的原因是:不好意思,我也没能学会传说中的绝世武功。

据说,VIM(编辑器)+GCC(编译器)+GDB(调试器)是Linux下最常用的开发工具链。自小被VS2005浸染的我,不习惯VIM,不习 惯GCC,不习惯GDB,叫我怎么敢跑到Linux下写程序。高手们似乎很喜欢用VIM加上一大堆插件来写程序,根据我看到的做法,要想有VS那样的智能 补全功能,VIM首先要Ctags(这是要输入一长串命令的),接着输入几个字母再按一下Tab键(需要SuperTab插件),才能出现智能提示。

这还不是最紧要的,在VIM里面,删除一行字,请按d两下,删除一个字,请按一下x。以及一长串的需要记忆的命令列表,例如gg是跑到文章的最前 面,shift+4是跑到行首,等等。我不自觉地想起了小学五年级那个暑假学的WPS,要输入一大堆的指令才能输出一篇格式整齐的文档,在别人眼里看起来 绝对是很牛的事情。现在会用Office2007的,也不止你我他吧?至于那个时候所学的一大堆WPS控制指令,还有五笔字型,到现在全忘了。

我肯定不是个记忆强的人才。帅哥拿起个Ubuntu,手中熟练地敲打着一堆我看不懂的指令,看得我眼花缭乱。用Linux,我最头疼的事情是干什么 事情我都要先敲入一个命令,然后–help找帮助来看,否则绝不会记得那个命令是怎样用的。一开始还说这是学习阶段要好好熬,尝试多了以后就会觉得这事真 的很折腾。

你说,好好一个软件为何就不写个gui界面,非得让我敲命令去记忆每个参数什么意思,好好一个配置为何就不写个gui界面,非得让我把整个配置文件研究完才知道我该去哪里修改配置参数。

他们说:Unix哲学是:一个程序只做一件事,并做好。但是不知道为什么,Linux下的软件作者似乎就是懒得写个gui,或者他们认为他们只需把 软件的逻辑做好就可以了,至于gui方面,根据简单原则,应该由其他有兴趣的人去做。其实我觉得原因有二,一则是没有强大的开发工具(要像C#那样拖个控 件就可以写gui),二则程序员也懒。

为什么没有强大的开发工具呢,为什么Linux下没有VS这样的重磅武器?我再从VIM+GCC+GDB说起吧。VIM的难刚才说过了,GCC的 话,要是有几个文件你非得自己手动写一个makefile不可,GDB我基本没试过,据说也有些图形界面的调试工具,可以像VS那样按一下快捷键就能调试 (这个肯定也是要配置N久的),我看过一份GDB的使用手册,又要记忆很多调试指令,我觉得我快要崩溃了。

上面所说的“一个程序只做一件事,并做好”现在已经造成了许多弊端,最可见的是依赖性。

相信在Linux下稍微深入过进行开发的知道,GCC的版本号是件很痛苦的事情,有些程序要A版本的GCC编译,有些程序要B版本的GCC编译,高 点低点版本号都不行。再加上相应的头文件库文件版本号,你是不是有种抓狂的感觉。悄悄地,我再告诉你,Linux现在发展很快,版本号一直在不停地变,你 可以去发疯了。

譬如,A作者维护一份A程序,B作者维护一份B程序,两个程序之间是有依赖的(可能的情况是B程序是A程序的gui),突然B作者想去周游世界不继 续开发B程序了,A作者继续开发下去,接口变了,那B程序基本就没用了。作为使用者的你,要么只能怨天尤人,要么改行帮B继续开发。

开源模式无疑是有很多长处的,但是其短处一直没有被正视。开源意味着源代码开放,人人都可以修改提交,可是就实际情况而言,更多的是做横向的,而不 是做纵向的。我所说的横向是指开发配套软件,纵向是指对软件进行更深入的开发。因为横向的容易,只需要知道要配套的接口就可以了,而做纵向则需要将源码读 懂。

继续说为什么Linux下不可能出现VS这样的重量级应用。VIM+GCC+GDB一样可以实现VS的功能,可以进行编码,编译以及调试,但为什么它们合起来就不是VS?因为没有架构。

现在开源的开发模式说到底还是陈旧的开发模式。软件工程的概念已经提出来好几十年了,可是当你想深入了解某个开源软件,接着去下载其源代码的时候,会很悲哀地发现:你找不到任何对应的开发文档。所有能帮助你理解源代码的只是程序源代码中的注释。

假如你很牛,想要做一个Linux下比VS还强的IDE,要用到VIM、GCC和GDB,你要做哪方面的工作呢?以进行一次小小的开发为例吧。先不 管VIM中代码智能提示是怎么来的(至今我还不知道如何写好函数名后提示我参数列表),辛辛苦苦写好代码后,要编译是吧?假设编译出错了,GCC会提示你 哪里错了,还显示出一个行号提示是哪里的错误,错误是什么。想快速定位到错误的地方吗?不好意思,GCC说我是编译器这事不归我管,VIM是个编辑器,这 事归它管。可我总得知道是哪里错吧?谁给我这个定位的参数?GCC只能输出信息,它意识不到VIM的存在。这时候你得写个适配接口,将GCC的输出信息转 换一下,然后提交给VIM,VIM再跳转到出错的地方。当然这个VIM插件是有的,叫做quickfix。

诸如此类的问题很多,VIM、GCC和GDB是基本没什么关系的软件,要想使它们可以通信,你必须写一大堆的适配程序,写适配程序还得考虑VIM的 接口是怎样的,GCC的接口是怎样的,GDB的接口又是怎样的,这些你又得去学习。而在VS中,这是一个设计好了的架构,不同模块之间的接口是已经定义好 了的,它们之间传输的数据也是定义好了的,想要通信是吧?简简单单在内存传送一个变量过来就可以了。而在VIM+GCC+GDB的通信中,数据的传送是很麻烦的事情,有时候还要通过写入读出硬盘,很神奇吧?

由于没有架构,所以要写一大堆的适配器才能将它们集成起来,还有些是适配器做不了或者做得不够好的功能,譬如刚才所说的代码智能提示,的确是有 VIM插件可以做,但是如果你看过写C#时候VS的行云流水,就知道那些插件做得远远不够。这不是插件的问题,而是VIM+GCC+GDB们在该内聚的时 候没有内聚。当然这也不是它们的分内事,它们本来就不是打算做IDE的。这时候你还会觉得“一个程序只做一件事,并做好”是绝对好事吗?

知道了没有架构之后,你可能会想,要是有了架构,是不是就可以做出VS那样的IDE了?这还得考虑开源开发者的软件工程水平。就我看来,还是有许许 多多的开源开发者基本是没有软件工程概念的。在现实中,你可以要求一个开发者按照你的思路你的文档去开发,因为你掌握着他的薪酬。而在网络中,一则没有软 件工程开发观念,二则他们也不会去学习新的一门学科,各种各样的软件工程开发模式,咱做开源只是兴趣而已,此处不留爷,自有留爷处。你拿什么来管理这些不 想被束缚的开发者们呢?

除非,有架构,而且VIM和GCC和GDB按照架构去做,否则绝不会做出VS那样的IDE。可是几乎在一盘散沙各自为政的开源界,有可能吗?所以我断言,开源界不可能出现VS那样的重量级应用。

 

感谢匿名人士的投递
新闻来源:原创
十年前,会打字就叫做计算机高手了。今天,会写程序也叫做计算机高手了。我相信过了十年后,写程序会是件相当普遍的事情。打字是表达思想,写程序也是表达 思想,我个人觉得,无谓为了这些艰难的入门而浪费用户有限的精力,同时可以将用户的精力用于更关键的地方,这才是开源界所要做的工作。

粗粗看过文后的评论,不出所料地引来骂声一片。再不出所料的是,反驳我的评论无一例外地对作者本身先做一番评论再对文章说事,甚至再加上对作者身份的断定(肯定是在线大学生写的云云),好比骂人前先扣一尿盆子到头上再开骂不迟。这些尿盆子是:自我感觉太好、无知、自己水平差(所以就别乱说)、白痴等等。其实我想说,心态很重要,您如若抱着这样的心态我们继续讨论下去,大家都不愉快,我不如打白旗率先退出为好。

至于质疑我用的是不是正版VS的问题,以至于质疑我不尊重软件价值的问题,这也是个扯开话题攻击人身的问题,尽管回答这个问题很没有必要,我还是做出回答,我所用的VS和OFFICE都有授权的。希望我们不要扯到正版盗版的问题方面去,继续问我电脑里面所有的软件是不是都是正版的,就算是正版的又怎样,你还会进一步质疑我肯定听过MP3,看过RMVB吧,这些作者都付费了吗?

何况质疑我的大多热门评论里面提到的都是VIM。我无意加入Emacs和VIM和各种编辑器之间的骂战,更无意想强加我对萝卜青菜的喜欢于各位。我只是通过VIM来引出我对开源项目管理模式的不满而已,何故各位对我的萝卜青菜之爱严加指责呢?另我感到惊愕的是,大家都在对我不爱VIM表示了很大的不满,而对我说的项目管理模式丝毫不提及。须知道,编码只是最底层的一个工作,而我说的是上层建筑的架构有问题。至于怎么编码,这是个人喜好的问题。

而我说的那些依赖性的问题,各个软件之间配合工作的问题,等等,有人肯质疑吗?

有网友提出我文中工具链的说法是错误的,我查了一下,的确我的提法是错误的,感谢指正。

先说效率问题。有人评论说VIM高效,这点毋庸置疑,我同意。有人评论说VIM使用面广,我也同意。可问题是我质疑的不是这个呀,我只是说VIM命令繁多,记忆困难而已。

“如果你还在编码,这文章等你10年后来看看,不知道你会不会觉得当年很无知”。请容许我举个例子,现在的十年前,打五笔的笑打拼音的,五笔打字的确是快,比拼音快多了。到现在,五笔还是比打拼音的要快,可是现在打五笔的还有几何?一个Coder好比一个打字员希望看稿打字一样,当然希望拿起详细设计直接就来编码。这时候,编辑器的效率是很重要的。但是做上层设计工作的知道,脑子其实比手动得慢,一个程序编码的时间比思考的时间少多了,整个项目中,编码时间只占10%左右的工作时间。

好比写文章和看稿打字的区别。写文章用五笔,思路好不容易整理好,打字的时候发现有个字五笔不记得怎么打,是件很恼火的事情。用VIM写程序,逻辑设计好以后,编码又不记得某个函数的参数列表的先后次序,也是件很恼火的事情,再加上繁文缛节一般的操作命令,我不知道我是专注于程序多一些还是专注于VIM多一些了。当然看稿打字那就容易多了,所全神贯注的地方是如何把每个字打好了,而不用考虑整篇稿子的起承转合问题。

GUI和文本模式各有优缺点,只是在未来的潮流发展中,哪个利多弊少的问题。当年DOS下的WPS是很牛,可是也被现在的WPS取代了,当年DOS的《仙剑奇侠传》是赚取了大量热泪,但是现在再出一个同样品质的《XX传》,会有人买账吗?VIM若是现在冒出来的,会有那么多人捧场称颂吗?无非是习惯作用罢了。我还记得VIM有个列块操作,DOS版的WPS也有,在教程中还专门写上了,可是真正用得上列块操作的人又有多少呢?

我还想起了Linux下compiz桌面特效可以画一团火,初看是很帅,实际上后来根本就没人会无聊到在自己桌面上花一团火出来玩。

试问,十年后,一定就会知道鹿死谁手吗?我说的是我是那样的一种懒惰的人,而且深信正是懒惰使世界进步,而且我相信这种人不在少数,如果觉得VIM更适合自己的,无妨忽视我。

再说Eclipse和NetBeans。相信同时深入用过VS和Eclipse的人都知道就开发(不分语言)而言,孰优孰劣。Code::Blocks我也用过,就C++开发而言,跟VS就不是一个重量级的。(我说的不是VC6,是VS2005,不要拿98年的VC6来和现在的比)

我文中提到开源模式的问题,似乎没有人做出反驳,只是针对我的个人喜好做出来驳斥,倒是赞同的有一些,其实我拿VIM说事的重点是开源模式有问题,希望大家可以在这方面对我进行批评。这里我再提一句,Eclipse和NetBeans一开始都不是开源的,它们之所以成为重量级IDE,它们的架构是一早就规划好的了,我没发现开源之后它们的架构有哪方面重大的变化(以至于我阴谋地怀疑它们开源的原因只是想利用开源界的编码力量而已)。

再说LaTeX。用过LaTeX的相信都是被其强大的数学公式编辑功能所吸引过去的。OFFICE2007里面也有,LaTeX的文法,可视化的数学公式,不用再编译生成就可以知道自己输入的是什么东西,这不更好吗。

批评我浅尝辄止的话,有一个评论说得很对,我们应该把精力放在关键的地方(只是可惜不知道为什么,没人支持也没人反对)。世界上好玩的东西很多,不是什么东西都可以弄精通的。假设我才智中等,把VIM弄精通了,把GCC弄精通了,把GDB弄精通了。这就意味我要放弃另外一些也很好玩的东西。我的意见是对每样东西都浅尝辄止,只对自己很有兴趣的进行深度挖掘。至于VIM对我而言,它只是个工具,还没有上升到设计甚至思想方面的高度,不是说它不好,而是就算精通了我又能怎样,打字快点而已吗?计算机永远只是一个辅助工具,对人的辅助作用始终是有限的。

再到gui的问题。有人说不需要gui,因为不需要gui也工作得很好,因为服务器要gui是要耗费资源的。先弄明白gui是干什么用的,不是机器要看到gui,而是人要看到gui。gui只有在需要的时候才需要被启动。好的gui可以使人工作效率提高,如apache为例吧,我是赞成apache用文本配置的,尽管我第一次配apache,sendmail这些花了老半天时间,因为一般用户用不上,这些事情应该由专业的网络管理员去做。

十年前,会打字就叫做计算机高手了。今天,会写程序也叫做计算机高手了。我相信过了十年后,写程序会是件相当普遍的事情。打字是表达思想,写程序也是表达思想,我个人觉得,无谓为了这些艰难的入门而浪费用户有限的精力,同时可以将用户的精力用于更关键的地方,这才是开源界所要做的工作。

posted @ 2009-12-27 15:10  iDelong  阅读(483)  评论(0编辑  收藏  举报