作者:昌维
来源:https://www.zhihu.com/question/537774494/answer/2534015588
知乎上有一个提问:

分享一个很有意思的回答。
我是一名 JetBrains 的忠实粉丝。我学习编程语言的经历大概有 10 年左右,使用 JetBrains 大概有 7 年左右。
在这么多年的学习编程和使用 JetBrains 全家桶的过程中,我认为 JetBrains 的成功不仅仅是技术原因,还有的是产品上面的创新。
而这些创新都离不开大型软件工程的实战经验,因为只有经历过大型软件工程的开发与不断迭代过程,才知道一款优秀的 IDE 里面需要什么功能,哪些功能能够帮助程序员高效地开软件。
网传 JetBrains 的 IDEA 系列最早的“杀手锏”功能是 refactor (rename)重构功能。
例如,在 IDEA 中你可以使用 Shift+F6 快速将一个变量改名,并且这个改名操作将应用到所有引用了该变量的代码。
这就需要 IDEA 对整个项目中的所有代码做 parser,追踪他们之间的引用关系,这类功能的背后离不开强大的代码静态分析技术。
所以做专业软件,首先是需要有技术方面的支持,其次是产品方面的设计考量IDEA 的重构功能极为强大,包括各种强大的 extract,路径移动等。

IDEA 的强大远不如此。它的功能包括但不限于
想到以上这些功能的创意,需要 JetBrains 的产品经理需要有极长时间的一线 coding 经验,并且这些软件工程项目的质量要求很高(如果是屎山项目,也就没有用到重构功能的必要性),尤其是经历过从 0 搭建起一个项目,并且后面又遇到需要重构的情况。
而国内做不出来这类软件,原因也主要有如下:
做工业软件,最好就需要是这个领域的工程师直接转行来做工业软件的产品经理,因为只有自己行业的人才最了解自己人。
而我们的现状是连抱有工程师思想以及拥有工程师文化的公司都非常稀少,更别指望真正的工程师们在拥有丰富经验之后转行 PM ,然后设计优秀的工业软件帮助我们加速生产效率,解放生产力。
最后,再谈谈 JetBrains 在获客与留存方面做的努力很多工业软件都有 help 帮助文档。
但是大家可以扪心自问一下,你们真的有看过专业软件的 IDE 吗?你们有点开过专业软件的 help 菜单吗?
以 JetBrains 家的 goland 为例,当你初次安装时时,首次启动软件会显示引导画面,里面会使用言简意赅的文档和样例代码帮助你快速掌握这款 IDE 的各类 feature
如图所示,这是 goland 的 learn 功能,而图上此时此刻显示的则是如何使用快捷键快速删除代码行或者换行,以及将过长可变参数的代码自动转换为可读性较强的多行格式。

无论是样例代码,还是帮助文档的文案,他们都设计得言简意赅,而且即使是英文,也是选择了计算机领域常见的英文单词,不会对非英语母语人士造成太多障碍。
只有当用户能够很快学习上手你的软件,那么你才能长久留存客户。
而这一点,在我见过的绝大多数驰名全球的顶级专业软件(包括设计领域的 Adobe 全家桶,电子工程领域的 MATLAB,Cadance ICC、Altium Designer、TI 德州仪器的 LabView 和 Multisim,Intel Quartus,Xilinx Vivado)都做得非常差,基本没有像 JetBrains 那样提供言简意赅的解释和恰到好处的样例代码让你快速上手。
一款专业软件令人难以上手,学习门槛极高,也是很难留存客户的。而 JetBrains 在快速入门与帮助文档的细节设计上绝对可以说是优秀至极。
有人问 vim 是否适应键盘操作?或者 vim 是否有在 ssh 上面直接编辑代码这种场景。
首先是键盘适应方面,如果你有深入使用过JetBrains,其实会发现 IDEA 的纯键盘操作效率并不比vim低,你想要的所有功能都有默认快捷键,没有的话也能自己配置,并且这个配置是云端同步的。
我在公司电脑,自己的surface平板电脑和家里的游戏机上全平台同步,而且自动完成可以根据自己的coding领域习惯写自定义live template。
最后是ctrl+shift+a以及alt+enter几乎可以在任何地方完成绝大部分写代码的常用操作。我并没有觉得vim在这方面有比JetBrains的效率高多少。
另外,就是 ssh 直接编辑代码这种场景。
我认为这种场景是非常危险且不规范的做法。真正符合工程化的项目都是本地使用 IDE 编辑,IDE 的静态分析功能帮你检查出可能出错的地方,确认没问题后,用版本控制工具提交,提交过程 IDEA 会跑代码格式化,lint 规则检查,import 优化,清理 unused 代码,自动帮你做 GPG git 签名。
如果是公司或者开源组织机构的项目,还会自动帮你更新 copyright,然后做 TODO 检测,code analysis,git hook,最后 push 代码后,CI/CD平台开始跑单元测试,集成测试等,全部通过后则自动由 CI 平台通过 SSH 发布到生产环境。
如果你的代码经常需要直接 SSH 连上去直接用 vim 修改,没有经过任何工程化工具的前置处理以及 code review,那么我只能说你的项目非常不规范,开发这种不规范的项目当然体验不到 IDE 能够带来的好处。
好了,解决了这个疑惑,现在又可以继续愉快的写代码了。。
这里免费提供一个最新 IDEA 激活码,亲测可用,提取链接:https://docs.qq.com/doc/DVU9meURJVENHV2VJ
其实 IDEA 也有开源的社区版本,收费的专业版也很容易申请到免费激活码,可以参考教程:
http://www.javastack.cn/intellij-idea-by-open-source-project/
关注我,后面栈长会继续分享 IDEA 系列教程,带你打通 IDEA 的任督二脉!
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
觉得不错,别忘了随手点赞+转发哦!
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir
当谈到运行时自省(introspection)和动态代码生成时,我认为ruby没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资
使用Ruby1.9.2运行IDE提示说需要gemruby-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall