搬运.. http://www.yinwang.org/blog-cn/2013/04/20/editor-ide/
还记得很久之前 @luikore 写过一篇吐槽编辑器的文很好看...
上次大家在咖啡馆那次 ruby tuesday, @luikore 说了一点编辑器的设想,不过好像和王垠角度不同,你看是否有借鉴意义? 至于“直接编辑程序的 AST 结构”,似乎 IntelliJ 系的 IDE 就是这么做的,我不知道王垠提的 MPS 系统是否和这个有关。
我还是认为 IDE 速度太慢,说真的,我不希望 IDE 理解我写的代码,它理解就意味着运行速度会变慢,它理解的越是清楚运行速度就变得更慢,慢到让人难以忍受。
目前 rubymine 5.4 除去启动 使用上非常流畅 用编辑器要做加法,配置各种插件 用 ide 要做减法,去掉工作中不用的功能,我看做减法比做加法要容易
文件较多时编程用 IDE,服务器远程和小段程序或单文件一般用 vim 就够了。作为编程本身,IDE 中很多功能确实不是 vi/emacs 这些能比的。我喜爱 vim 但从不迷信这个东西。结构化编辑器,intellij idea 的 mps 和 eclipse 的 xtext 都在做。
我觉得,王垠真的是很牛和牛!牛的一塌糊涂...
不过,有一点,不知道出于什么原因,我似乎没看到过他提起过有关 Ruby 的只言片语...
难道他没有用过 Ruby ? 如果是事实,这应该是他最遗憾的事情了。(至少我替他遗憾...)
其实我用 xcode 的时候都用 https://github.com/JugglerShu/XVim 把它搞成 vim 模式 感觉还挺爽的 如果 xcode 能够不那么容易 crash 掉 而且自动注释能够完善点的话就更完美了
突然发现大一大二时候最早老师教我们用 MinGW 写 C++,后来自己转到 VS2008 和 VS2010,写 PHP 的时候也是用 IDE 的,至少那时我对 IDE 在速度上是没有任何抱怨的,但是自从进了 Linux,在 Eclipse 上写 Java 之后,对 IDE 的速度问题越来越感到不满,之后一写 Ruby 立即扔掉 IDE 只用 VIM 了。工作后接触了 RubyMine,试用了五分钟就扔掉了,跑得比 Eclipse 还慢啊。 所以说我后来接触的语言都是那种 IDE 比较慢的那种,这大概也是我现在只用 VIM 的重要原因吧。
Jetbrains 的 IDE 真是好用的没法说啊。 pycharm 开发 django,只要写好了 url 规则,按 alt+enter 自动创建 view,在 view 里面按 alt+enter 自动创建模板,虽然 django 没提供 rails 这么强大的 generate,但是 pycharm 可以弥补过来。 rubymine 开发 rails 的各种贴心功能,各种自动创建。不过 rails 本身的自动创建命令已经够强大了,rubymine 的贴心功能跟 rails 的贴心功能部分重复了。 刚刚看了个 intellij idea 开发 struts2 的视频,配置好 struts.xml 以后,package、action、model、class、method、jsp 统统自动创建,什么 mkdir、mkfile 的全省了。
IDE 不仅仅是写代码而已。她能做的事情很多,对熟手她是贴心的顾问,对新手她是循循善诱的老师
在 IDE 里面,写代码感觉已经不是在编辑文字,而是在操作一个构造精密的机械装置。
这有个他的 github 项目https://github.com/yinwang0/ydiff (基于语义的 diff),还有就是给 jython 社区贡献的那个语法分析器 https://jython.svn.sourceforge.net/svnroot/jython/trunk/jython/src/org/python/indexer/ 这里面是一个 python 的静态语法分析器。 https://yinwang0.wordpress.com/2010/09/12/pysonar/ 他从事的研究领域是 PLT,主要就是研究设计编译器和设计编程语言这些的,所以经常可以看到他挑各种语言的刺儿,呵呵。
#25 楼 @gaicitadie 盖茨他爹.... 工具的代码生成确实挺容易吸引人的,可以提高效率,有时候觉得不考虑可读性用 zencoding 写 html 和 slim 舒爽度差别也不大.. 感觉编辑器和 IDE 哪个好就像 sinatra 和 rails 之争一样,有些喜欢简洁自己搭起来,有些可以忍受 rails is omakase... 反正永远不会有统一的讨论结果...
应该是因为我孤陋寡闻,主要觉得这篇提出的解决方案挺有意思的,每一次对工具 (编辑器,编程语言) 灵活度的提升,应该都会是对创造力的一次推进...
@zw963 他提过 ruby 的 http://www.yinwang.org/blog-cn/2013/04/18/language-design-mistake2/ 真的是只言片语哦
@iBachue 我的看法是 ruby 和 python 没有一个类似接口机制约束输入,过于灵活不一定是好事 好在 ruby 2.0 加了命名参数,options 可以去掉了
@ericguo 函数式语言一直不温不火,但是总体趋势是各种范式语言都在吸取函数式思想 我有认识一个做金融行业分析的 lisper,据他的说法,sbcl 的实现性能已经和 c++ 差不太多了
呵呵,有些人就是吃王垠这一套。
我很好奇,过去十年是不是只有他读博中退,是不是只有他研究编译器,是不是只有他喷这喷那。
这么迷信天才吗?这么迷信反权威吗?这么迷信颠覆几十年的成果?
别看他说了什么,看他做了什么:1、清华读博,中退了,他觉得自己做的事很没意义 2、出国到 Cornell 读博,又中退了 3、到 Google 实习,跟所有人搞得不开心,走了。4、写文章喷这喷那
我看到了什么,看到的就是失败。我不是看不起失败,而是他经历 10 年的失败还是那个调调:我太牛了,环境配不起我。10 年都想不通这个问题,还持续的犯错,他还真牛呢。
哦,他终于开了个 github 帐号,让我们一窥他的颠覆学界几十年的成果:
(cps '(lambda (x) (if (if x (zero? a) b) c d)))
看到这段代码有没有发现什么?a b c d 是什么东西?哪个真实项目写这样的代码早被踢出去了。看得懂的不屑于看,看不懂的不明所以,哇好厉害啊。
他喷的东西毫无新意,每年有多少读书人和实习生在喷。建造一个有瑕疵但运行良好的系统比找出一个系统的瑕疵要难一万倍,苍蝇总是最会找腐烂的地方,但是苍蝇始终是苍蝇。
要粉他的,我不拦着。
@iBachue keyword arguments in Ruby 2.0
def foo(x, str: "foo", num: 424242)
[x, str, num]
end
foo(13) #=> [13, 'foo', 424242]
foo(13, str: 'bar') #=> [13, 'bar', 424242]
就是解决 options 的问题的...方法重载 Ruby 应该实现不了了,options 本身也在解决一部分重载的问题 插一句:这玩意也是 c# 4.0的特性,c#也是门很不错而且进取的语言
#49 楼 @diga2005 好吧 那以 http://apidock.com/rails/ActionController/Base/render 为例,光文档里出现的 render 方法支持的参数就不下十种了,假如你现在用 Ruby keyword arguments 来实现这个方法 (可能其中只有 template 和 layout 是有默认值的),你如何抽象呢?
@iBachue 我还没开始研究 2.0,但预感默认值不是必须的 参数几十种的情况我的感觉是函数的责任过重了,或许可以通过其他设计改善,但即使这样,也比 options 的方式把参数放到方法内部处理要强上很多
且不说到他这个水平做普通的 APP 已经对提高技术水平没有什么实际效果,但的确在 Google 做出了一些好项目。
其一,作为一个做学术为主的人和一个做工程为主的人,对待代码价值的认同方式是不一样的。看某些工程成果的角度也不一样。做学术的习惯就是这么吹毛求疵,要去比较和研究那些常年没有答案的争论,以他的角色不能“什么方便就用什么。”这种答案,具体到个体工程师,某个项目,可以说什么方便用什么,这没错。但是谈论到普遍的事物时,想要得出更有价值的答案,他就不能这么说。
其二,说王垠粉,或者是他的文字,看不懂的时候调侃一下“垠神”,很多时候只是在开玩笑,并没有谁真当他是神,去迷信他。如果要反驳,也是有人写过深入的博文去反对他的看法,这种方式比较高级。
#67 楼 @whitecrow 唉,这个还是比较形而下的,王垠的学术热情并不在这里,我以为你说的是有人 challenge 他写的代码(从学术上)呢
#44 楼 @Rei 我是“粉”王垠,但是它表达的是对其能力的倾佩,如果我自己的水平也高到那样的地步,我也会“粉”自己的。:-)
每个人对失败的定义都是不一样的,你所列举的事实都是事实,它们在你眼里是失败,但在我眼里是一种理想情怀和完美主义,不是每个人都有勇气一而再,再而三地否定这些世俗所定义的成就的。(不代表别人的看法)
另外他的博客的文风也确实透着一股“我太牛了,环境配不起我”的调调,对此我都是捏着鼻子看的,但这对我来说只是情商略低的表现,虽有反感,但不至于成为讨厌其为人的根源。
最后给的代码,我看不懂。但这既然是一个解释器的代码,我想如果水平达到这种地步的话,区区几个变量也不至于把人难倒吧。 但我看得懂的其他文章,大部分都可以做到言之有物,有理有据,虽然里面洋溢着上面所提的文风,但还是有许多干货,每次阅读都可以给我很多启发和共鸣。为了自己更好更快地提高,所以我还是要继续粉他(你想拦也拦不住 :-D)
王垠粉.... - -! 关于新的想法,说的人少,做的人更少,, 所以我佩服王垠, 当然更希望他能做出可以把玩的软件出来印证他博客说的东西是真的
v2ex、python-cn、ruby-china 等等他的每一篇 blog 都不会错过....难怪 google 要抛弃 greader,人肉转播比 rss 厉害多了...
他是个潜心做研究的理想主义者,兼且输出价值观。现今社会都以成败论英雄,像他这样的不多了。@Rei 喷的内容我不敢苟同,不明觉厉自然不好,无知无畏恐怕也不见得牛逼。
不要认为搞底层就很牛,因为他们更擅长那些,也不要因为一些言论就 粉 谁,都没意义。
刚简单的翻了一下最近的博文,发现了这么一段
所以我认为脚本语言是一个祸害,它几乎永远是错误的决定。 我们应该尽一切可能避免使用脚本语言。在没有办法的情况下(比如老板要求),也应该在脚本里面尽可能的使用通常的程序设计原则。 摘自 http://www.yinwang.org/blog-cn/2013/03/29/scripting-language/
不想过多的评论什么,对这样的言论也没什么评论的必要。
我比较同意 @Rei 的观点, 调调 确实存在,问题随处都有,阮一峰的博文可以做为鲜明的对比。
还是那句老话
Doing is better than saying !!
唉,不看人家文章具体内容有没有值得借鉴的东西,老喜欢评论这个人怎么样,发现我们国家上至朝廷,下至普通百姓都喜欢诛心,这可不是好习惯哦。另外,知乎上面有人说过,王垠的人品还不错,周围的人员很好,不劳烦我们费心了,要驳就对着他文章的内容使劲的开炮吧。
搬家没网错过了 party 啊...
IDE 的做法是折中的:内存中既保存文本又有 AST, IDE 追踪文本的修改然后尝试把 AST 的变化最小化。但 parse 就是个世纪难题,增量 parse 依然有很高的复杂度也很难并行化。而且 CPU 的单核速度已经发展到极限,没法再快了。所以人们开发出二相着色和 flymake 等各种技术 (自然会被科学家鄙视,但是科学一直没发展,怪谁呢)...
结构化编辑器的载体就完全是树,保存的时候才生成文本或者干脆就不要文本了。smalltalk 时代结构化编辑器就辉煌了,smalltalk 就不谈文件,谈 image... 现在所谓的 refactor 命令都是结构化编辑器上的基本编辑动作...
另外结构化版本控制工具没跟上的话,结构化编辑器都还不够实用 -- 难道是变相给 ydiff 做广告?? (其实之前 @hlxwell 提的 xib 版本控制问题,如果 git 支持 ydiff 就直接解决了...)
其实我最喜欢经典编辑器... 就是在平面上搞文本。高亮是通过词法为主,语法辅助的方式做,着色都是 "99% works and nobody complains"... 什么都能做还可以 out-of-box 的思考:例如把 end
这个关键字编辑改成 endo
这个方法,或者把整段代码用引号包起来,或者为了对齐某个符号鼓捣一些奇怪的缩进和空格...
只是现在,IDE, 文本编辑器,结构化编辑器已经没有明显的分界线了... 多多少少什么都有掺杂...
最早以前喜欢使用 IDE 是因为微软,开始放弃 IDE 而选择简单的编辑器的时候是因为 Rails。 现在因为开发 iOS 又必须选择 Xcode。
所以 我们没有机会选择。
看了几篇,说实话有点失望……都是一开始给人眼前一亮的感觉,因为观点跟大众不同,行文风格自由。但每次我想继续往下看“为什么作者这样想”的时候……就没有然后了……
项目最开始的时候用 vim 写,代码多了以后就切换到了 JetBrains 的 IDE。虽然输入上有很多不爽的地方,但各种贴心的提示还是能够节省不少时间的。有时候还得学会忽视一些比较严格或不者不够智能提示,还有封装比较多层的代码,IDE 的语义提醒也完全失去作用了。
@darkbaby123 我第一次知道这个人,看了看他的最新一篇博文 关于 go 语言,对于“为什么作者这样想”,他在思维导图中解释得很清楚,他列出的关于 go 语言那些坏的、丑的、可怕的地方都一目了然的,还有是然后的。
可能他的思维导图随时在更新,过了就看不到他当时的想法了。
@xhj6 go 的那篇文章我看过了,思维导图我就点进去瞄了下。因为对 go 没什么了解,就不说了。
倒是原先他写的那篇关于 python 等动态语言的文章我看过 http://www.yinwang.org/blog-cn/2013/04/18/language-design-mistake2
那篇文章举了些在我看来比较怪异的比喻,其实本质上说的是语言太过灵活导致不好掌控。相比起来他更倾向 Java 那种更严格的语言。我觉得动态语言有相应的优势,比如可以省去为了不出错而做的各种接口定义,比如 ActiveRecord 那样可以做到定义一个空的 class 自动映射数据表字段,更多的就不举例了。
我很遗憾他没有看到这些语言特性在实际生活中带来的好处。照他的逻辑,Rails 就是这个世界上最大的怪物之一……但 Rails 确实曾经改变了世界。
其实表达不同的观点也没问题,这个世界毕竟是多元化的,但我不喜欢的原因不在于此。
下面我简单分析下一个不懂 Python, Ruby, JavaScript 的人看到这篇文章前后的想法:
在我看来,这是一个经典的套路:先用新奇的观点吸引人,再用比喻模糊概念,最后得出“铁证如山”的结果。
你觉得这篇文章对一个想了解 Python 的初学者有帮助吗?
他并没有拿甚至一个 Python 代码片段来举例,讲下语言特性会在什么场景下造成什么样的影响。在对比下 Java 在同等场景下有什么优势。就是一个似是而非的比喻(还是特意丑化过 Python)的。新手看完后根本就不知道 Python 的语言特性是什么,灵活在哪里。就无意识的接受了作者的理念 -- Python 很危险,会造成“无穷无尽的烦恼和时间精力的浪费”。
我不反对主观。但我反对把主观的想法,经过一些似是而非的例子包装,最后生成一个看起来很客观的结果。
所以,如果我想学一些我不了解的技术,我不敢去参考他的博客。
#109 楼 @darkbaby123 我就是 python 初學者,我個人認爲那篇關於 Python 的很有幫助。如果學一門語言的時候只知道優點卻不知道缺點,我更不敢學。而且他的舉例我自己代碼工程中也遇到過。
所以我要學一些我不瞭解的技術的話,我更希望看了類似的介紹再決定。
@hardywu 我并不反对说一门语言不好,实际上很多黑 Ruby 的文章我也都看的津津有味。我更喜欢拿实际例子讨论语言的文章,而不是扯些虚的。也许我不大理解大神的抽象思维……
对比下老赵的这两篇,我更喜欢这种风格的干货: 为什么我不喜欢 Go 语言 Why Java sucks and C# rocks
其中第二篇还是个系列黑,但有理有据
@darkbaby123 搞学术的思维出发点不一样,我们做工程的,看看即可,不可当真,你让一个铸剑大师看一把明月弯刀他还可能勉强接受,但要他接受一对倒钩就太难了,这什么玩意儿?能刺吗?能劈吗?为什么不直?为什么没锋?…… 至于说瑞士军刀,就更是丑得不成样子了。
此人肯定不是铸剑大师,但也不是百晓生,如果你自己用倒钩用得正爽,何必在意别人嘲笑你的兵器丑呢?至于说初学者,挑选兵器时不舞那样几下,光听别人说,又有什么用呢。
@ darkbaby123 你觉得老赵有干货,那是因为你是码农他也是,并且他给出了代码;你觉的王没有干货是因为你觉得他没有提供具体的代码。是的,有点鸡同鸭讲的感觉。因为王是从事学术研究的,在 PLT(主要研究的就是编译器和编程语言的设计) 研究方面他很牛,说的东西还是值得一看的。我们是工程领域的攻城师,在学术领域内并非都是"shut up. just show me your code"准则,有时候很多问题用具体的代码根本说不清。 就从他批评 python 的这个问题具体来讲:他给 python 做了一些静态语法分析工具 (例如 pysonar),他觉得之所以这么难做是 python 设计时一些人为的原因造成的,仅此而已。但这些问题不会丝毫影响到我们这些搞工程的码农,因为很多学术上理论上有缺陷的东西在实际中并非是什么大问题。 但王垠为什么还要说?因为他就是搞这方面研究的。 那为什么一些码农还要看?因为工程师除了完成工作,挣钱,也应该在思想上时不时的更新一下,不断提高自身。
至于老赵的第二篇 Why Java sucks and C# rocks,看来看去都是语法上的问题,跳不出这个框框。他的这种文章之前很多老外也写过,但没有什么新意,至少带不来在思想上的新的东西。你觉得这种文章写上 10000 篇能发一个 paper 么?王在 05 年上学的时候就有很多 paper 了。算了,说这些都没意义。 总之:不要老纠着一个人不放,而忽视了真正要谈的问题的本身。
#116 楼 @hooluupog 老赵那个系列反复强调 Java != JVM,他喷的是不思进取的 Java,不说语法说什么?
王垠发的是什么样的 paper 你知道么?05 年的时候他还没搞编程语言设计。像王垠博客里这种文章写上 10000 篇能发一个 paper 么?有哪些思想上的新东西么?他的文章里充斥着观点,你找得到支撑论点的论据么?
王垠最近一篇对 Go 的评价“Go 语言里面有很多新的和好的东西。可惜新的东西都不是好的,好的东西都不是新的”这个句式简直听到烂,既可以什么都不说又好像说了很多,反正等于没说。看思维导图也没什么新东西,都是之前别人喷过的。
@hooluupog 最后说一次,我从来都没说这个人怎么样,我只是表示不喜欢他的文章。因为正 @Alex 所说,他的文章给我的感觉就是这样……所以我觉得对自己没什么帮助。不是没用,是对我而言没啥用。我们这些关注高层抽象的人尚且知道语言细节的重要,难道一个搞底层语言的专家反而要不在意?
肯定有其他人会觉得写的很好很精彩,这很正常。就像我先前回复另一位的,领域不同看待问题的观点也不同。其实这个话题的争论就像 vim 和 emacs 多年不变的宗教战争,永远不会有结果的……但我不理解的是为什么总有人抱着说服对方的想法去讨论……那讨论就变质了。
从来没有学了可包治百病的知识,只有对自己有用的知识。正确分析自己需要什么,有用则学,无用则抛,仅此而已。
他对 Go 语言吐槽的地方,其实在 Go 的官方文档和各种演讲里已经解释的很清楚了,Go 设计出来的主要目的就是为了填补语言性能和程序员生产率之间的鸿沟,自然会借鉴大量其他不同类型语言的做法,所以没有程序设计思想的创新很正常,人家本来就不是冲着这来的。可看他的口气似乎觉得语言设计者太 dumb 所以没有新点子出来,对此实在不能认同。这也只能说明搞学术研究和搞工程实践考虑问题的出发点过于殊途,不能同归也不能说明谁对谁错。做工程实践的人要牢记自己的视角,以防再遇到这样主观性极强,煽动性极强的来自学术大牛的文章时,偏听偏信乱了分寸。
参考: