
鲁本·奥尔特加( Ruben Ortega)在Unsplash上的照片
我喜欢 C#。我大学毕业后的第一个真正的编程项目是用 Unity 编写的游戏。我立刻爱上了这门语言。只是觉得很新鲜。它就像 Java……如果 Oracle 真的关心它的话。这是在 Java 7 天。我听说他们从那时起转向了更快的发布周期,所以事情可能会发生变化。
我仍然喜欢这门语言。我的意思是它可能不是最好的,但它仍然可以做任何事情。像多线程。你认为多线程很难吗?好吧,文思豆腐的做法去 Dart-land 开始玩 Isolates。你没有意识到你拥有它有多好。
但是在过去的几年里,我变得非常担心 C# 的命运。我实际上在这里的评论中分享了我的想法,因为该评论引起了如此多的关注,所以我想我会在这里详细说明。
所以在评论中我说
C# 正在消亡,而微软正在扼杀它,因为他们不断添加没有人要求的随机内容。这是功能蠕变的死亡。
很清楚。不言自明。完全不需要文章。但无论如何我都会写一篇。
资料来源:推介会议
以上引述是从 Freakonomics 插曲中转述的。这个:
原话是“除了轰炸,我知道没有比租金控制更有效的城市摧毁方法”。我没有改变轰炸,因为我不知道编程语言的等价物是什么。但是轰炸是行不通的。我的意思是你可以轰炸公司的总部,但它不会杀死该语言,只会停止它的开发。我希望我不会被恶魔化。
因此,特征蠕变的问题在于它使编程语言更难学习和掌握。如果您想看到这样的例子,请参阅对 C++ 发明者 Bjarne Stroustrup 的所谓采访。如果您从未看过,这里是整个采访。是假的,不过挺好笑的。
1998 年 1 月 1 日,Bjarne Stroustrup 接受了 IEEE 的“计算机”杂志的采访。
自然地,编辑们认为他将使用他创建的语言回顾七年的面向对象设计。到采访结束时,采访者得到的比他预想的要多,随后,编辑决定隐瞒其内容,“为了行业的利益”,但与其中许多事情一样,存在泄密。
这是所讲内容的完整记录,未经编辑,未经排练,因此不如计划中的采访那么整洁。
采访者:嗯,你改变了软件设计的世界已经有几年了,回顾过去,感觉如何?
Stroustrup:实际上,我在想那些日子,就在你来之前。你是否记得?每个人都在写“C”,但问题是,他们非常擅长。大学也非常擅长教授它。结果证明他们是有能力的——我强调“有能力”这个词——以惊人的速度毕业。这就是导致问题的原因。
采访者:问题?
Stroustrup:是的,问题。还记得每个人都写 COBOL 的时候吗?
采访者:当然。我也是。
Stroustrup:嗯,一开始,这些家伙就像半神。他们的薪水很高,被当作皇室对待。
采访者:那些日子,嗯?
Stroustrup: 对。所以发生了什么事?IBM 对此感到厌烦,并投资数百万美元来培训程序员,直到他们变成一毛钱。
采访者:这就是我出去的原因。薪水在一年内下降,以至于成为一名记者的薪水实际上更高。
Stroustrup: 没错。嗯,同样的情况也发生在 'C' 程序员身上。
采访者:我明白了,但重点是什么?
Stroustrup:嗯,有一天,当我坐在我的办公室时,我想到了这个小计划,它可以稍微调整平衡。我想‘我不知道会发生什么,如果有一种语言如此复杂、如此难以学习,以至于没有人能够让程序员淹没市场?实际上,我从 X10,你知道,X windows 那里得到了一些想法。那是一个非常糟糕的图形系统,它只能在那些 Sun 3/60 的东西上运行......它们拥有我想要的所有成分。一个非常复杂的语法、晦涩的函数和伪 OO 结构。即使是现在,也没有人编写原始的 X-windows 代码。如果您想保持理智,Motif 是唯一的出路。
采访者:你在开玩笑吗?
Stroustrup: 一点也不。事实上,还有另一个问题。 Unix 是用“C”编写的,这意味着任何“C”程序员都可以很容易地成为系统程序员。还记得大型机系统程序员过去的收入吗?
采访者:你敢打赌,我就是这样做的。
Stroustrup:好的,所以这种新语言不得不将自己与 Unix 分开,通过隐藏将两者很好地结合在一起的所有系统调用。这将使那些只知道 DOS 的人也能过上体面的生活。
采访者:我不相信你说……
Stroustrup:嗯,现在已经够久了,我相信大多数人已经意识到 C++ 是在浪费时间,但我必须说,他们花费的时间比我想象的要长得多。
记者:那你具体是怎么做的呢?
Stroustrup:这只是个玩笑,我从没想过人们会认真对待这本书。稍微有点脑子的人都可以看出面向对象编程是违反直觉的、不合逻辑的和低效的。稍微有点脑子的人都可以看出面向对象编程是违反直觉的、不合逻辑的和低效的。
采访者:什么?
Stroustrup:至于“可重用代码”——您什么时候听说过一家公司重用其代码?
采访者:嗯,从来没有,实际上,但是……
Stroustrup: 那么你来了。请注意,在早期尝试过一些。有这家俄勒冈州的公司——我想他们被称为 Mentor Graphics——在 90 年或 91 年左右试图用 C++ 重写所有东西时真的感冒了。我真的为他们感到难过,但我认为人们会从他们的错误中吸取教训。
采访者:显然,他们没有?
Stroustrup: 一点也没有。问题是,大多数公司都隐瞒了他们所有的重大错误,并且很难向股东解释 3000 万美元的损失。尽管给他们应得的,但他们最终还是成功了。
采访者:他们做到了?好吧,你就在那里,它证明了面向对象的工作原理。
Stroustrup:嗯,差不多。可执行文件非常庞大,在具有 128MB RAM 的 HP 工作站上加载需要 5 分钟。然后它像糖浆一样跑了起来。其实,我以为这会是一个主要的绊脚石,我会在一周内被发现,但没人在意。Sun 和 HP 非常乐意出售功能强大的机器,拥有大量资源来运行琐碎的程序。您知道,当我们在 AT&T 拥有我们的第一个 C++ 编译器时,我编译了“Hello World”,并且无法相信可执行文件的大小。2.1MB
采访者:什么?好吧,从那时起,编译器已经取得了长足的进步。
Stroustrup: 他们有吗?在最新版本的 g++ 上试试——半兆字节不会有太大变化。此外,还有来自世界各地的几个最近的例子。英国电信遭遇了一场重大灾难,但幸运的是,他们设法放弃了整个事情并重新开始。他们比澳大利亚电信更幸运。现在我听说西门子正在建造一个恐龙,并且随着硬件的尺寸变得越来越大,以容纳可执行文件,我越来越担心。多重继承不是一种乐趣吗?
采访者:是的,但 C++ 基本上是一门健全的语言。
Stroustrup: 你真的相信,不是吗?你有没有坐下来研究 C++ 项目?事情是这样的:首先,我已经设置了足够多的陷阱,以确保只有最琐碎的项目才能第一次运行。以运算符重载为例。在项目结束时,几乎每个模块都有它,通常是因为人们觉得他们真的应该这样做,就像在他们的培训课程中一样。相同的运算符在每个模块中意味着完全不同的东西。当您有一百个左右的模块时,尝试将这些组合在一起。至于数据隐藏。天啊,当我听到公司在让他们的模块相互交流时遇到的问题时,我有时会忍不住笑。我认为“协同”这个词是专门发明来扭转项目经理肋骨上的刀的。
采访者:我不得不说,我开始对这一切感到震惊。你说你这样做是为了提高程序员的工资?那太淫秽了。
Stroustrup: 不是真的。每个人都有选择。我没想到事情会变得如此失控。反正我基本成功了。C++ 现在正在消亡,但程序员仍然获得高薪——尤其是那些不得不维持所有这些废话的可怜的魔鬼。您确实意识到,如果您不实际编写,就不可能维护大型 C++ 软件模块?
采访者:怎么会?
Stroustrup:你失联了,是吗?还记得 typedef 吗?
采访者:是的,当然..
Stroustrup:还记得花了多长时间摸索头文件才发现 'RoofRaised' 是一个双精度数吗?好吧,想象一下在一个主要项目的所有类中找到所有隐式 typedef 需要多长时间。
记者:那你觉得你成功了吗?
Stroustrup:还记得平均规模的“C”项目的长度吗?大约 6 个月。对于一个有妻子和孩子的人来说,时间还不够长,足以过上体面的生活。拿同一个项目,用 C++ 设计它,你会得到什么?我会告诉你。一到两年。那不是很好吗?所有的工作保障,只是通过一个判断错误。还有另一件事。大学已经很久没有教授“C”了,现在缺少像样的“C”程序员。尤其是那些对 Unix 系统编程有所了解的人。有多少人知道如何处理 'malloc',当他们使用了这么多年的 'new' 时——而且从不费心去检查返回码。事实上,大多数 C++ 程序员都扔掉了他们的返回码。好人''-1'怎么了?至少你知道你有错误,
采访者:但是,当然,继承确实节省了很多时间?
Stroustrup:是吗?您是否注意到“C”项目计划和 C++ 项目计划之间的区别?C++ 项目的规划阶段是其三倍。正是为了确保应该继承的所有东西都是,不应该继承的东西不是。然后,他们还是弄错了。谁听说过“C”程序中的内存泄漏?现在找到它们是一个主要行业。大多数公司放弃,并将产品发送出去,知道它像筛子一样泄漏,只是为了避免跟踪它们的费用。
采访者:有工具……
Stroustrup:其中大部分是用 C++ 编写的。
采访者:如果我们发表这个,你可能会被私刑,你意识到了吗?
Stroustrup:我对此表示怀疑。正如我所说,C++ 现在已经过了它的顶峰,没有任何一家头脑正常的公司会在没有试点的情况下启动 C++ 项目。这应该让他们相信这是通向灾难的道路。如果没有,他们应得的..你知道,我试图说服丹尼斯·里奇用 C++ 重写 Unix..
采访者:天啊。他说什么?
Stroustrup:嗯,幸运的是,他很有幽默感。我想他和布赖恩早早地就知道我在做什么,但从来没有放过。他说如果我有兴趣,他会帮我写一个 C++ 版本的 DOS。
采访者:是你吗?
Stroustrup:实际上,我确实用 C++ 编写了 DOS,当我们完成时我会给你一个演示。我让它在机房的 Sparc 20 上运行。就像 4 个 CPU 上的火箭一样,只占用 70 兆磁盘空间。
采访者:在PC上感觉如何?
Stroustrup: 现在你在开玩笑。你没见过 Windows '95 吗?我认为这是我最大的成功。不过,在我准备好之前几乎把游戏搞砸了..
采访者:你知道,Unix++ 的想法真的让我思考。在外面的某个地方,有人会尝试一下。
Stroustrup:在他们读完这篇采访之后就不会了。
采访者:我很抱歉,但我不认为我们能够发布任何这些。
Stroustrup: 但这是世纪故事。我只想让我的程序员同事记住我为他们所做的一切。你知道现在一个 C++ 人能得到多少?
采访者:上次我听说,一个真正顶级的人每小时价值 70 到 80 美元。
斯特劳斯特鲁普:看到了吗?我敢打赌他赚到了。跟踪我在 C++ 中的所有问题并不是一件容易的事。而且,正如我之前所说的,每个 C++ 程序员都被某种神秘的承诺所束缚,他们会在每个项目中使用该语言的每一个该死的元素。事实上,有时候这真的让我很恼火,伊芙。过了这么久,我几乎喜欢这种语言。
采访者:你的意思是你以前没有?
Stroustrup:讨厌它。它甚至看起来很笨拙,你不同意吗?但是当图书版税开始进来时……好吧,你明白了。
采访者:就一分钟。参考文献呢?您必须承认,您改进了“C”指针。
斯特劳斯特鲁普:嗯。我一直想知道这个。本来,我以为我有。然后,有一天我和一个从一开始就编写 C++ 的人讨论了这个问题。他说他永远记不起他的变量是被引用还是被取消引用,所以他总是使用指针。他说那个小星号总是提醒他..
采访者:嗯,在这一点上,我通常会说“非常感谢”,但似乎还不够。
Stroustrup:答应我你会发布这个。这些天我的良心越来越好。
采访者:我会告诉你的,但我想我知道我的编辑会说什么。
Stroustrup: 反正谁会相信呢?不过,你能把那盘磁带的副本发给我吗?
采访者:我可以做到。
所以这次采访显然是假的。或者是……?不,是假的。
但它传播开来,并且有充分的理由:它可能是真的。因为我们都喜欢取笑 C++ 是什么臃肿的烂摊子。出于这个原因,它不再被真正使用。
我的意思是,当然,如果你正在研究低级的东西,它主要仍在使用,因为你唯一可以使用的其他语言是 C。尽管 Rust 越来越流行。
但是您最后一次看到使用 C++ 的高级框架是什么时候?
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我有一个模块:moduleMyModuledefdo_something#...endend由类使用如下:classMyCommandextendMyModuledefself.execute#...do_somethingendend如何验证MyCommand.execute调用了do_something?我已经尝试使用mocha进行部分模拟,但是当未调用do_something时它不会失败:it"callsdo_something"doMyCommand.stubs(:do_something)MyCommand.executeend 最佳答案
我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume
我有一个定义类的Ruby脚本。我希望脚本执行语句BoolParser.generate:file_base=>'bool_parser'仅当脚本作为可执行文件被调用时,而不是当它被irbrequire(或通过-r在命令行上传递)时。我可以用什么来包装上面的语句,以防止它在我的Ruby文件加载时执行? 最佳答案 条件$0==__FILE__...!/usr/bin/ruby1.8classBoolParserdefself.generate(args)p['BoolParser.generate',args]endendif$0==_
我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用
什么是Linq聚合方法的ruby等价物。它的工作原理是这样的varfactorial=new[]{1,2,3,4,5}.Aggregate((acc,i)=>acc*i);每次将数组序列中的值传递给lambda时,变量acc都会累积。 最佳答案 这在数学以及几乎所有编程语言中通常称为折叠。它是更普遍的变形概念的一个实例。Ruby从Smalltalk中继承了这个特性的名称,它被称为inject:into:(像aCollectioninject:aStartValueinto:aBlock一样使用。)所以,在Ruby中,它称为inj
我在新的Rails应用程序(3.2.3)中运行迁移时遇到了问题。我们正在使用postrgres9.1.3和-pg(0.13.2)-当我运行rakedb:create,然后运行rakedb:migrate,我得到->1.9.3-p194(master)rakedb:migrate--trace**Invokedb:migrate(first_time)**Invokeenvironment(first_time)**Executeenvironmentrakeaborted!PG::Error:ERROR:relation"roles"doesnotexistLINE4:WHEREa