支持或反对.NET(野兽)的理由

92
我所在的公司使用C++ Builder 6,自创立以来一直开发本地代码。我们的旗舰产品完全采用本地代码编写。
然后出现了具有各种特色的.NET框架,我迅速被吸引住了,并说服管理层,让.NET成为我们所有新软件开发的新框架,要尽快迁移现有的代码线。由于它带来的众多好处,这并不需要太多的说服。像往常一样,他们接受了我的建议。
此时,我开始开发我的第一个.NET应用程序,一切都按计划进行。该项目仅是我们产品中的一个组件。然后我到了创建这个新组件安装程序的阶段。我们公司以使用户操作尽可能简单而自豪。即使是拥有数千名开发人员的微软也无法做到像我们这样创建安装程序。例如,当您安装Microsoft CRM时,您只会获得一份需要安装的失败和前提条件列表,然而我们则不会如此。如果您需要某些东西,我们将为您安装它。
这使我们的安装过程变得非常简单。.NET Framework未安装?没问题!我们会为您安装它。需要SQL Native客户端?好的!
问题是,现在我们的解决方案中有一个组件是使用.NET编写的,这使得安装过程变得非常复杂。在我甚至开始安装我们的产品之前,我需要执行以下操作:
- 检测先决条件是否已安装 - 如果没有安装,则安装它 - 验证其是否已成功安装 - 下一个先决条件
为了安装.NET Framework,我首先需要Windows Installer 4.5。但是不同的操作系统有不同的版本,因此我添加了操作系统检测并启动正确的EXE。哦,.NET框架已经与2k8打包在一起,安装程序exe无法在其中运行,必须使用参数运行OCSetup.exe进行安装。

于是事情继续发展下去。接着需要安装SQL Express 2005,依赖性再次增加。

我对管理层提出质疑,即使微软也没有为用户做到这么简单。他们的回应是我们没有理由不在这方面超越他们。我无法反驳这一点,但我认为他们采用这种方法有非常好的理由。

突然之间,我们的安装程序变得非常庞大。所有.NET的先决条件,更不用说64位支持了,这需要安装整个范围的EXE文件。现在问题来了,我们希望用户能够下载一个“快速”的评估版本。真是一个笑话,你需要下载500MB才能运行30MB的应用程序。大部分的安装包都是先决条件。

管理层认为我们有太多的依赖关系/先决条件。我完全理解。他们建议我们摆脱.NET框架,回到原生领域,在安装方面仍然很“容易”。这就是其中一部分想要为.NET辩护的我,向他们解释大局中的好处,改进的开发体验,更容易的维护和总体代码质量。另一部分则完全同意他们!在.NET中开发只需要安装过多的其他先决条件,这使得安装变得复杂。

是的,一些.NET支持者会声称所有东西都应该安装在修补和更新的操作系统上。这是真的,但并非所有客户端都有这个条件,简单地说“对不起,请先更新”是行不通的。请记住,我们以整体用户体验为傲。

现在我们正在考虑重新编写本地代码,我知道我们在开发速度和.NET带来的各种好处方面正在失去优势。但在这个领域,无论你从大局来看还是不是,我们都取得了进展。因为我们拥有本地代码开发技能,而.NET对我们来说实际上是新的领域,所以回归原生代码甚至是有意义的。

我的问题是:如果这确实是一个问题,那么贵公司对该问题的看法是什么?假设我想继续将我们所有的产品迁移到.NET,我向管理层提出的业务案例会是怎么样的呢?


23
谢谢,这是一个可爱的故事。 - jgauffin
25
难道没有针对 .NET 的存根安装程序,会随着需要下载组件吗?将完整的安装程序捆绑在 DVD 发行版中是正确的做法,但如果他们已经下载了评估版,你可以合理地假设他们在线以进行 .NET 的在线安装。 - Rup
4
具有讽刺意味的是,我在大学学习.NET时候阅读的一些书籍中提到XCOPY部署是其主要优势之一 :) - Madhur Ahuja
25
您忘记了在Windows上运行的依赖关系,这需要额外几个G的空间。请使用引导程序。 - Hans Passant
13
有趣的故事,标题应该是,“如何不要根据阅读一些营销材料并在了解正确使用新框架所需步骤之前改变整个公司的业务方式”。 - Andrew Barber
显示剩余8条评论
7个回答

50

这就是为什么许多公司已经转向使用Web安装程序,从您的主页上动态下载所有先决条件。因为在大多数情况下,如果使用Windows更新进行了更新,则操作系统已经拥有所需的99%。

我不会把x64和x32的所有内容都放在同一个安装程序中。应该创建两个安装程序,每个架构对应一个。


2
我不相信你可以将x64和x86的安装包放入一个单独的MSI数据库中。 - David Heffernan
没错。我刚刚回应了“突然间,我们的安装程序变得非常庞大。所有的.NET先决条件,更不用说64位支持需要安装一整套单独的EXE文件。” - jgauffin
6
任何软件都需要单独的x86和x64安装程序!抱怨... - abatishchev
4
如果这个软件只是一个编译为“任意”架构的 .NET 二进制文件,那么就不需要单独安装 x86 和 x64 版本。只有在你需要安装 .NET 框架本身时才需要分别安装不同版本的安装程序。 - Gabe
如果您编写网页安装程序,请一定要记住那些使用代理服务器的用户。即使是微软也经常忘记那些使用ISA代理服务器的用户(我在看你,Web开发者安装程序)。 - Egor Pavlikhin

39

Paint.NET很好地包装了先决条件的安装,而默认情况下没有将.NET框架与之捆绑。最终结果是一个无管理的shim可执行文件,它检查.NET框架和其他一些东西,并在安装过程中指导您;随着需要的内容的实时下载。然后,他们运行一个WinForms应用程序,该应用程序pInvokes进入MSI以进一步将安装程序包装在棉花中。

值得一搜一下。

此外,许多客户机可能已经安装了某个版本的.NET Framework,因为它是Microsoft Update的一部分--这使得在商业世界中更容易使用。

Paint.NET关于安装的博客文章:

http://blog.getpaint.net/2008/08/24/the-paintnet-install-experience-part-1-version-3xx/

http://blog.getpaint.net/2008/08/25/the-paintnet-install-experience-part-2-version-40/ (谢谢Rup!)

更深入地了解这个故事,大概管理层至少经历过一次使用C++应用程序的部署痛苦,但现在已经完成,并被归类为“容易”。把一些时间投入到部署中,向管理层展示这一点,并隐藏痛苦,向他们展示安装是多么容易 :)


感谢提供链接。第二部分链接为http://blog.getpaint.net/2008/08/25/the-paintnet-install-experience-part-2-version-40/(我在第一页上没有看到链接,但实际上它在标题中)。 - Rup
@Rup 发现得不错!我简单看了一下,没有发现它。我会修改我的答案来展示它。 - Adam Houldsworth
我想知道是否有类似于Paint.net 4.0的开源安装程序。对于任何分发 .net 应用程序的人来说,这将非常有用。 - dbkk
1
@dbkk 你告诉我!Paint.NET曾经发布程序和安装程序的代码,但由于抄袭者未给作者信用而被撤回。 - Adam Houldsworth
1
如果你在打开Visual Studio的情况下安装/更新Paint.NET,它可能会破坏Visual Studio。所以我认为他们的安装程序仍需要改进。 - Greg
@Greg 哦,很有趣。我在谷歌上搜索了一下,在Paint.NET论坛上找到了一些类似的评论 - 哦,我从来没有说过它是完美的,但用户体验非常好,而且有很多定制工作已经完成。 - Adam Houldsworth

37

让我们回到你最初想从本地代码转向.NET代码的原因:作为程序员,这对你来说更加高效。在.NET中很多事情比在C++(或者你使用的其他本地语言)中更容易,因此你可以更快地开发应用程序。

那么,你开发应用程序所花费的时间与开发安装程序所花费的时间相比如何呢?即使你必须花费几个星期来钉定安装程序(特别是框架设置部分),那也应该是你唯一需要完成的工作。

对于所有未来的应用程序,你将使用几乎相同的安装程序。你仍然会执行所有先决条件检查,但是与其将文件复制到C:\Foo,你现在将复制一些不同的文件到C:\bar。

在我看来,这是一个简单的经济问题。是的,为.NET应用程序开发一个(好的/完整的)安装程序更加昂贵,但如果这是你需要采取的步骤之一,以大大提高你的开发时间,那就是一个不言而喻的选择。你的投资回报率可能会在几周内实现。


1
一个良好的.NET安装体验很难确定,但正如你所说,应该只需要一次。拥有大部分样板代码都可以通过System.Something.Class轻松获取的好处几乎是无价的,值得忍受安装程序带来的一两个头疼。 - Adam Houldsworth
2
我非常期待_Wix Burn_的发布,这将是第一个真正可用的引导程序(我希望如此)。目前我正在使用DotNetInstaller和NSIS。但是它们在UAC处理方面仍然远远不够完美。 - Uwe Keim
1
@Uwe 看起来 Wix Burn 将与 Duke Nukem Forever 大致同时发布。 - dbkk
那太好了。我已经看到了《Duke Nukem Forever》的预览截图。所以它应该很快就会出现了;-) - Uwe Keim

17

我觉得有必要对这个说法进行回应:

是的,一些.NET的支持者会声称所有东西都应该安装在已经打了补丁和更新的操作系统上。这是正确的,但并不是所有的客户都有这样的操作系统,仅仅说“对不起,请先更新”是不够的。记住,我们自豪于整体用户体验。

如果你的用户执意使用一个供应商已经告知其不再适用的系统,那么你就没有太多可以“帮助”他们的方法了。我知道这让我看起来像一个傲慢的活动家,但我把它看作手工业者可能会看待的方式——顾客有责任确保我所工作的环境是健康的,并适合该产品。如果不是,我将接受更多的报酬来完成该工作,但这可能仍然会给他们带来额外的工作,因为他们没有预见到确保他们理解他们购买的是什么。

我认为软件客户已经被允许保持无知很长时间了,现在应该要求他们了解他们所购买的内容。运行未经适当修补的企业IT环境与继续运行经过制造商召回的车辆是一样的——Windows服务包在许多方面相当于召回。你没有法律义务遵守召回,但这对你作为企业最有利,并且你可能会因为逃避责任而被追究责任。


2
我认为制造商的召回有点过头了,这只是一个类比 - 我会说,这更像是开一辆没有安全气囊或防抱死系统的老车 - 新功能不断推出,提高了质量和标准。旧东西并没有突然变得损坏或危险,现在只是被认为低于今天的标准,我相信Windows 95团队会争辩说他们当时认为标准已经很高了!:-) 尽管如此,我同意你的观点,无知地忽视质量的进步并不是一种美德。 - Adam Houldsworth
11
我完全不同意。顾客们要求了太长时间的知识渊博。我为什么需要知道我是x86还是x64?我为什么需要知道我正在运行哪个服务包?让我购买你的软件,你来解决让它运行所需的问题。消费级软件正在不可避免地向iOS/Android/AppStore模式转移,任何要求用户了解设备除基本细节外的任何信息的开发者都会落后。 - kubi
1
@kubi 当然,iOS的类比是建立在硬件不变的前提下,因为它是由供应商控制的。而PC是完全可配置的,所以需要一些了解需求的知识或意识,或者至少需要意识到需要有懂行的人来操作。如果我要更换轮胎,我要么知道我的轮胎尺寸,要么把车交给懂行的人。 - Adam Houldsworth
3
@kubi:我同意你对于普通用户模式的看法。不同之处在于,没有理由让用户不将所有技术问题(如平台版本)委托给制造商或者像我一样的开发者。因此,这些并不是问题。真正成为问题的是企业用户,他们可能无法决定自己的配置,并且应该雇用有能力的IT提供商来解决这些问题。 - Tom W
4
无论我们的论点有多么充分,用户都不在意。他们只想使用你的软件...但如果安装过程太麻烦,他们可能会放弃。他们并不关心是谁的问题 —— 是微软公司的问题,供应商的问题,还是他们自己的问题。 - dbkk
显示剩余2条评论

7
任何Visual C++应用程序都有前提条件/外部依赖项:运行时6.0、2003、2005、2008或2010?没有SP、SP1或SP2?x86还是x64?2005 SP2需要哪个版本的Windows Installer?2008 SP1呢?等等,等等。
因此,这些都是牵强附会的论点!就像Joel关于.NET的抱怨一样。看看现在!

3
+1 是为了链接到 Joel 的网站。 - Security Hound
-1 用于链接到Joel的网站。 - Phill
你可以静态链接到运行时,这样就不需要那些依赖项了。 - Tony Edgecombe
1
@Tony:21世纪还静态链接?绝对mauvais ton(不合时宜);) - abatishchev
+1 链接到 Joel 的网站。 - Shahid M Zubair

3
我不明白为什么使用.NET的先决条件比C++ Builder多得多。你抱怨SQL Server,但你忽略了你也必须在C++ Builder上安装一些数据库。你抱怨x64与x32,但.NET不需要任何更改,相同的exe在两者上都可以运行(并为任何环境进行最佳编译)。C++ Builder就不能这样做。你可能需要单独的SQL Server版本,但这同样适用于C++ Builder(除非你只在所有设备上安装x32)。
是的,有新的安装程序版本问题,但这些组件并不是很大。你真的可以让安装程序只下载和安装必要的部分。
C++ Builder对你来说可能更容易,因为你已经投入了时间创建一个好的安装程序。你需要为.NET做同样的事情,然后你可以根据实际问题进行选择,而不是这个问题。
顺便说一句,微软之所以选择这样做,是因为许多用户,尤其是企业用户,不喜欢自动安装东西(也许是因为他们有一个应用程序依赖于特定版本的库,然后你来了,用一个新版本擦掉了它,他们不能轻松地卸载)。
你认为“让不太熟练的人更容易”的东西实际上让那些知道自己在做什么的人更难做。
这里有一个很好的例子。我绝对讨厌的一件事情是,当我安装一个需要SQL Server的应用程序时,它会安装自己的SQL Server实例,即使我可能已经有几个实例可以使用。对于初学者来说很容易,但对于我来说,让你的应用程序与我的单个实例配合工作非常麻烦。

1
如果您的应用程序在Mono下运行,则使用Mono运行时将更加轻松。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接