我有一个下午要赞扬.NET相对于VB6的好处……我怎么说?[关闭]


9

我的公司是一个只有20人的小型工程公司。此处的所有应用程序编程都是由两个人在VB6中完成的,他们在过去25多年的工作经验中都来自汇编背景并自学VB6。

结果,VB6代码充满了可怕的代码味道,例如成吨的字符串型变量,非常长的函数,数百个公共全局变量(其中某些优先于传递参数和返回值),而不是单个对象类。重构几乎是不可能的,任何更改都需要对代码进行过多挖掘,一旦进行,似乎总是会带来更多漏洞。

我的老板意识到VB6是一项过时的技术,并愿意听取我提出的向.NET进行新开发的请求。我们正在向.NET迈进,但是他认为这是保持与较新Windows OS兼容性的一种方式,而不是一种编写更好的代码的方式。

除了单纯的最新性,我如何最好地解释.NET语言相对于VB6的好处?我能说什么来最好地强调,向.NET迁移是一个很好的举措,但是这也意味着我们当前的编程范例也应该开始改变?当我的老板听到Visual Basic .NET看起来像VB6一样时,我知道他的第一个直觉是将我们旧的代码混乱简单地转换为.NET。

据我所知,它会在一个下午是不可能改变任何人的观念,但我怎么能至少说服我的组装身背老板,事情喜欢强类型的变量,自定义类,以及私人领域是不是一个的时间浪费和能量?


4
VB6开发人员是垂死的品种吗?尝试招募.NET开发人员和VB6开发人员。查看每个获得的简历。一旦两个老计时器退休,就不会有替代品(或者替代品,非常昂贵的替代品),这一事实足以引起争议。
奥德

3
我很欣赏他可能会尝试,但是大多数自尊的开发人员都不会使用一门枯燥的语言。不确定MS何时停止停止支持VB6,但是找到资源变得越来越困难(产品寿命终止是反对VB6的另一个理由)。不确定这有多大帮助,但请研究:msdn.microsoft.com/en-us/vstudio/ms788708.aspx-2008年是 IDE生命周期的尽头。而且我喜欢“ Microsoft可能会提供自定义支持协议”,我想知道这笔费用是多少……
Oded

1
@Oded不幸的是,这些论点都没有真正涉及到VB.NET可作为VB6,全局公共变量和所有内容的替代品的事实。一旦使用了.NET,我们如何真正利用它的所有优势?
dlras2 2012年

1
也许通过例子来解释。在VB6中是否存在一些难以解决的问题,而在VB .NET中则更容易解决?您能否从代码库中挑选一些示例,并说明如何将它们清理为.NET中更好的代码,而VB6中的功能则无法做到这些?
FrustratedWithFormsDesigner 2012年

1
@DanRasmussen VB.NET无法正确导入VB6项目(已修复?)。升级并非易事。

Answers:


16

简短的回答:您无法根据问题中列出的标准来改变主意,这些标准都是技术性的。这相当于一场宗教辩论。最快的失败途径是提出一个并非从听众(在这种情况下是企业主)的角度出发的论点。

更长的答案:业务变化仅由一件事和一件事驱动。盈利至底线。

...我至少如何说服我的大会老板,强类型变量,自定义类和私有字段之类的东西并不会浪费时间和精力?

它们不仅浪费时间和精力,而且更重要的是,它们会浪费您的!您必须能够定量显示您的建议会随着时间的流逝带来可观的利润。只是声称干净的代码“更好”是不够的,因为干净的代码更成本的方式生产。

如果你能说出利用现代技术的成本将如何导致($COST + X) * TIME = $PROFIT,这里X是一个不平凡的阳性数量和TIME相对较短,您可以创建一个引人注目的场景。

计算投资回报率(投资回报率)的另一种方法

投资回报率公式

如果此ROI / ROR是微不足道的数字,尤其是在很长一段时间内,那么您也没有太多的业务案例。

您的公司实际上是如何赚钱的?

多少行代码?有多少客户?该软件每年产生多少收入?收入主要是支持合同吗?或新许可证?目标市场是否稳定?扩大?承包?该软件是其他利润更高的产品的损失领先者吗?

一个好商人很难忽视摆在桌上的钱。

当然,您必须能够用确凿的事实来备份您的陈述。这意味着您需要能够提供真实的数字,以显示您真正了解实际业务,而不仅仅是学术技术细节。

不只是专业人士

还提供了详细的风险分析,以及这些风险$COST发生时将如何说服他们,使您确信您有一个现实的案例,而不仅仅是抱怨您不想再使用VB6。

教老狗新花样

...我能说什么,最好的一点是,当且仅当我们当前的编程范例也开始发生变化时,转向.NET才是一个好举动?...

更改或不更改编程范例以使新技术尽可能地惯用是风险分析的一部分。但这只是一个单独的论据,只有当您证明首先要做出改变才能赚到很多钱。

就像技术人员倾向于听技术案例一样,商人倾向于听商业案例。您所质疑的所有案例都具有技术优势,这在您所处的情况下最好是学术性的。

预测

我在这里做一些假设,VB6应用程序,小型商店,少量开发人员,2个较老的开发人员/企业主都指向一个利基市场应用程序,该应用程序可能已经成熟(已知错误和变通方法),相当完整且相对稳定,无论代码库的“混乱”。这使我相信少量的用户群也不会逐年急剧增长,这使我得出以下结论。

确实没有任何真正令人信服的商业理由来更改此应用程序的技术方向。而高达移植到VB.Net是在浪费时间,以及因为你只会有混乱,但现在有更多的它,和开发团队的2/3不是专门学习新的东西。祝好运。


2
不幸的是,至少在短期和中期,重写(加上培训,再加上专业知识)的成本通常超过保持应用程序运行的成本。但是,从长远来看,您可能会有重写自身可能需要用$ next_new_technology重写的风险。
gbjbaanb 2012年

4
+1宗教辩论。如果OP想要在.NET中工作,那么他应该在.NET商店中找到工作;我想说这家公司从VB6迁移到.NET是一项重大风险,但收益却令人怀疑。
Kirk Broadhurst,2012年

很好的答案,只是您略过了他的部分:“重构几乎是不可能的,任何更改都需要对代码进行过多挖掘,并且一旦完成,似乎总是会带来更多漏洞。” 这是对企业最有价值的声明。证明他们在不花费大量商业费用的情况下就无法更改代码库,这是与您的答案一致的非常有效的论据。当然,必须有度量标准来备份该语句。

@ GlenH7我个人认为您所引用的内容是戏剧性的个人见解和言论,因为OP除了推动他们的个人见解和议程外,对其他任何问题均不表示关注。我的答案是建议他们不要考虑真正的变革驱动力是什么,而不是他们认为或已经考虑的问题。我的观点是,从长期来看,“昂贵”的增量更改将始终比其在相同时间内提出的更改要便宜。使他们说的话和您引用的话站不住脚。

同意声明中有一定程度的措辞。一些商店(而且不,它们通常不是很小的商店)跟踪故障/逃逸,因此有可能生成关于错误的硬性指标。太太(OTOH),大多数商店都不会保留这些信息,而无非就是一种“胆量感觉”,这种感觉在商业演示中并没有多大用处。

11

我有一个客户,其旗舰产品使用VB6编写并由3个人维护。我之所以来帮助他们,是因为他们有一个合作伙伴,希望他们调用网络服务。在VB6中很难做到这一点,但在VB.NET或C#中却很容易,我为他们编写了一个.NET程序集,它看起来像VB6的COM组件,因此他们可以调用它。然后,他们需要向某人提供Web服务。然后他们想编写一个独立的实用程序,它将需要对一些信息进行加密和解密,以及解析一些XML。我教他们在.NET中编写代码。在过去的5年左右的时间里,即使旗舰产品根本没有缩减,他们的代码也越来越多地在.NET中。他们讨厌其中的一部分-每个应用程序都拥有它们-并且在哪里可以将它们拉出(现在开始缩小)并将其放入服务或单独的实用程序中。其余的将全部转换为.NET。是的,错误的变量名以及所有这些-在我看来,即使不更改当前的编程范例,使用.NET也有很多好处。这些包括:

  • 您可以将最新的Visual Studio与更好的搜索,更好的Intellisense,更快的构建等一起使用
  • 您可以与体面的源代码控制系统(即不是VSS)集成
  • .NET附带有一些免费的库,这些库可以简化诸如加密,XML解析,图像处理等工作。
  • 在.NET项目中,进行国际化和本地化要容易得多(这需要大量加拿大客户的咨询,因为他们需要法语和英语版本,可能已经为我的客户节省了余款)
  • 廉价的控制库(Telerik,Infragistics,ComponentOne等)为您提供了惊人的功能,几乎无需花费
  • 在花时间教他们VB6不值得的情况下(像夏天的学生一样),找到临时帮助会容易得多(不要讨论您对新的全职员工教它的感觉)
  • 您的应用程序将支持UAC,因此它将在Vista,7和8上更好地运行。无需在XP兼容模式下运行

还有更多,但肯定够了吗?

编程范例,强类型输入,编译器是您的朋友,封装是您的朋友等,在我看来(我得到这些观点的报酬)完全分开。如果您想在那座山上死去,那就继续吧,但是您会因为打开VB6副本而垂死。


您的结尾段落是什么意思?
dlras2 2012年

6
“转移到.NET”和“让所有程序以不同的方式”是不同的,并且,如果您选择与第二种战斗,那么您不仅不太可能成功,而且几乎肯定不会将它们转移到。 NET使用这种方法。我的意思是我同意他们应该以其他方式编程。但是,通往.NET的最佳途径是“就像现在一样,但要撒上巧克力酱!”
凯特·格雷戈里

我了解将它们作为不同的问题进行处理的好处,但是问题在于,将它们作为单独的问题进行处理可以确保仅在.NET中同样无法维护的程序。
dlras2 2012年

1
您将拥有更好的应用程序(更好的控件,更多的功能)和更好的流程(潜藏在源代码控件中,甚至可以跟踪工作项),以及那些现在发现可以以不同的方式完成工作并且值得付出改变的痛苦的开发人员。因为这些巨大的好处。他们将更容易接受您要求他们提出的下一件事。而且“不可维护”不是二进制的。代码虽然不好,但是情况仍然会比以前好。您还将获得公认的信誉。
凯特·格雷戈里

8

几年前,我从一个VB6项目(公司的自定义ERP系统)开始,然后慢慢地将其迁移到.NET。它大约完成了一半。

首先,从VB6转换为VB.Net几乎总是一个坏主意(我对此进行了大量研究)。有太多不同。另外,如果您的老板认为VB.Net与“ VB6一样”,那么他就完全错了,您必须快速改变其观点。

我的策略是将两个代码库分开并分别维护,然后将整个模块从VB6缓慢移至.NET,但前提是该模块即将发生重大变化,因此我们可以分摊一些成本。即使这样,重写也是一项昂贵且冒险的大任务。

有两种方法可以将现有的VB6与新的.NET代码集成在一起(您可能会花很长时间这样做,所以最好习惯一下这个想法)。我采用的第一种方法是开始在.NET中编写小型模块,然后让主要的VB6应用程序通过传递一些命令行参数来启动.NET可执行文件。这行得通,但是警告说.NET的启动时间只有4到10秒,因此您在执行此操作时受到限制。

一旦开始变得非常痛苦,我就翻转策略,并使用此CodeProject文章中的方法在主.NET应用程序中显示现有的VB6表单。一旦走上这条路,我就只能承受一次.NET启动时间的冲击,并使用ClickOnce进行部署,与以前的VB6应用程序的部署方式相比,这真是天赐之物。

就是说,这是我在.NET中相对于VB6的优势:

  • 更好的持久性框架(NHibernate,EntityFramework,Linq2Sql等)
  • LINQ(我很难强调这有多么重要)
  • 泛型!
  • Lambda语法(优雅地解决了“中间的洞”之类的整个问题)
  • 类似ActionFunc类型
  • 反射(您很少使用的东西,但是当您这样做时会很大)
  • 更好的单元测试支持(当然,我怀疑您会说服其他员工进行单元测试,但应该这样做)
  • ReSharper(和其他重构/配置工具)(比MZ-Tools好10倍)
  • ClickOnce和/或安装程序/安装程序项目
  • Windows服务项目
  • 真正的面向对象的支持(VB6基于COM,在此部门确实很糟糕。)
  • 静态打字
  • 嵌入XML支持
  • WPF和Windows窗体(VB6的控件非常有限)
  • 世界足球联合会
  • 在线更多示例代码
  • 异常(相比之下,VB6的错误处理绝对可怕)
  • Visual Studio的源代码控制集成
  • Decimal 类型(即使VB6具有CDec,也从来没有一流的十进制类型)
  • 一流的支持 Guid
  • 一流的支持64位整数
  • 更好的收藏库
  • 报表查看器
  • 多线程任务并行库

VB6的缺点:

  • 您会注意到它的表现。担心可能还不够,但是请相信我,您会注意到的。毕竟,VB6会编译为本地代码。

公平地说,维护组合的VB6 / .NET解决方案存在一些缺点:

  • 维护两个数据访问层(假设您的VB6应用程序实际上有一个)
  • 额外的布线以暴露服务/表格/等。从一侧到另一侧
  • 两倍的复杂性/体系结构可以掌握

现在,正如您所暗示的,如果您开始在.NET中编写代码,那么您确实应该从头开始重新构建体系结构。但是,听起来您公司中的任何人都不熟悉.NET和/或Java编程领域,这是大型企业框架所共有的许多模式和实践的来源。

如果您带某个人来拖动表单上的按钮,双击它,然后直接在click事件处理程序中编写一些SQL字符串,并且这种方法一直在为他们工作,那么很难使他们看到遵循SOLID的优势设计原则。另一方面,如果您硬着头皮决定要通过自动化的单元测试来覆盖所有新代码90%或更多,那么您将很快意识到,除非您采用SOLID设计原则,否则这确实很难做到。

因此,您需要非常认真地了解实际情况。就我而言,我是唯一的程序员,尽管我没有经验,但我决心对所有新代码进行单元测试。我无法承受太多压力,这会对我在第一周,甚至第一个月的工作产生负面影响。尽管如此,我还是下定了决心,并得到了管理层的支持。大多数人没有那么奢侈。现在,我有很多代码,并且我刚刚完成了一次大型重构,几乎没有任何问题。

实际上,您不会进行单元测试,这意味着很难证明对团队成员进行依赖注入等原则。您将不得不凭借架构优势以外的其他优点出售.NET 。您必须专注于更好的库支持和更好的工具。那是唯一会引起共鸣的东西。我会在您的演示中建议以下内容:

  • 创建一个Windows Forms项目(远离WPF和xaml-太令人震惊了)
  • 连接到SQL数据库(某些测试数据库)
  • 使用Linq2Sql或EntityFramework为其生成数据模型
  • 创建一个存储库类,该存储库类具有一种返回实体列表的方法
  • 使用linq在该方法中编写查询,指出智能感知
  • 指出linq适用于所有对象,而不仅仅是实体
  • 表明如果更改数据库并重新生成模型,则会出现编译错误
  • DataGridView在主窗口上放一个
  • 通过使用存储库中的实体填充网格来演示数据绑定
  • 指出所有比VB6更好的有关网格的有趣内容
  • 创建一个.rdlc文件(报告)
  • 在Visual Studio中制作一个简单的报告
  • 将报表查看器放在窗口上,然后在报表查看器中呈现报表
  • (显然,您需要安装ReportViewer并已首先实践了所有这些方法)
  • 提出一个“中间漏洞”的问题,然后通过创建一个以a Action作为参数的方法来演示如何解决该问题。首先通过传递另一个方法作为参数来执行此操作,然后通过使用lambda语法传递匿名委托来打动他们
  • 通过使用List<T>Dictionary<T1,T2>集合类演示泛型,并演示如何创建强类型代码(VB6具有类似的内容,但它是动态类型的)
  • 编写一个foreach令人尴尬地并行的循环,System.Diagnostics.Stopwatch用于测量执行时间,然后使用任务并行库将循环更改为Parallel.Foreach循环并演示加速,假设您使用的是多核计算机。
  • 演示添加全局异常处理程序的能力(这是VB6无法做到的)

那就是我会做的。


1

在我看来,这是一种情况,您需要戴上政治家的帽子而不是编程。您必须非常注意如何提出自己的观点,并且不要与听众抗衡。确保您显示.Net的优点,而不是显示VB的缺点。争论VB的劣势会使您的同事处于需要捍卫自己的决定的地位,并迫使他们承认自己投入大量精力的一种语言是一种糟糕的语言。相反,向他们展示如何迁移到.NET将如何丰富他们可用的工具并使他们的生活更轻松。

我提出此论点的理想方法是找到每个人经常抱怨的任务或一段代码,并使用.NET对其进行修复。我对VB并不是特别熟悉,但是这里列出了一些烦人的任务,通过使用.NET而不是VB可以使这些任务变得更容易。

  • 字符串操作
  • XML解析
  • 搜索/匹配/正则表达式
  • 数学(较新的语言通常具有更快,更全面的数学库)
  • GUI构建/设计

选择上述任务中的任何一项,或者选择特定于您通常从事的项目的其他任务,然后与他们坐下并实际编写一些代码,从头开始,即可快速,轻松地解决问题。实际演示编写代码的过程将展示出新版VS带给桌面的工具,并提供证据表明,迁移到.NET不会使任何人的生活变得更艰难。

要做到这一点,您绝对肯定要做功课。如果您不确定工具的工作方式,或者代码无法正常工作,那么您将永远无法将其赢得您的支持。


0

您首先要说的是Microsoft不再支持VB6。尽管可以保持运行,但从长远来看,您必须了解它的选择。我什至不知道VB6应用程序是否将在Windows8上运行,或者IDE本身是否将在Win8上运行。

因此,您实际上必须最终进行重写,如果是这样,您最好现在就开始而不是晚些,从而给您足够的时间来确定要使用的新技术(而VB.NET听起来很理想,这是您尝试更前沿技术(例如使该应用程序在iPad上运行)的机会。

在短期内,您可以通过引入新部分作为现有应用程序要使用的COM组件来减轻一些问题,希望这些组件在不可避免的重写发生时仍会保留。

对于.NET为什么比VB6更好,我不会打扰技术争论。在那里,您将面临失败的争论,技术本身永远无法解决问题。这取决于您如何应用该技术,如果VB6应用程序正在为您解决问题,则没有论据可以回答。您可以谈论易于维护或经验丰富的员工的可用性,但是一旦您这样做,您就承认您现有的员工没有新技术方面的专业知识,必须接受培训,然后花一些时间才能完全掌握最新技术。用它。您还必须回答有关大量重写最终会比原始项目差的问题(有时是由于缺乏专业知识,有时是由于设计过大)。


MS将在运行Windows 8的Intel / AMD PC上支持VB6。您不能在VB6中编写Metro应用程序,但也不能在.NET中编写Metro应用程序。两者都是基于Win32构建的。至少用C#for .NET编写的代码应该更容易移植到WinRT以便在Metro上运行,但是不要指望它是简单的重建。
斯科特·惠特洛克

0

给他“新车与旧车”的比喻:

是的,两者都可能将您带到目的地。但是,新车不需要曲柄,不需要节流阀,不需要地图,急刹车时车轮不会锁定,最终您更有可能摆脱车祸。

  • VB6是旧版,它是新的COBOL
  • .NET具有更好的框架
  • .NET具有更好的工具
  • .NET具有更好的性能
  • .NET具有更好的IDE
  • .NET具有更好的语言支持
  • .NET具有更好的功能
  • .NET具有更好的社区支持

7
汽车类比通常会失败,而您的情况也不例外。一件事,一个老车已经是一个新车不是支付!如果您拥有一辆出租车并付了钱,而它赚的钱多于维护费用,那么一辆新车要付的钱要比您付的钱多,而您想当商务人士呢?

2
@JarrodRoberson这是有偿的,但他们倾向于刹车频繁,过一会儿就不再工作了。汽车类比很棒。:)
史蒂芬·杰里斯

1
其实,这车比喻是好的。OP的老板正在坐出租车,OP在接近他时应考虑到这一点。一个完整的切换不可能在一天之内发生,但让我们开始逐个移动碎片,更换碎片。
ZJR 2012年

1
企业主亲自设计和建造了这个。它很可能已经为自己付出了很多倍的代价,并且维护是免费的,因为只有3个开发人员,而他是其中之一。就像我说的那样,汽车类比非常糟糕,这一点尤其如此,您以完全不符合商业惯例的论点为我指出了我的观点。新软件充其量充其量只能使他的利润每年最多减少很多,而在最坏的情况下可以无限期地赔钱。

2
应用程序没有像物理物品那样的磨损熵,它们也不自然萎缩,因此它们不会磨损,也不会因使用而破裂,因此与物理物品(尤其是汽车)的类比不适用。只要能够达到目的,应用程序将永远运行。我几年前工作的一家公司拥有一台基于MS-DOS的旧机器,该机器控制门上的读卡器。软件磨损的想法很愚蠢。那就是说应该永远有一个好的寿命计划。即使那个计划是永远不要重写软件。

0

首先,我认为您应该更改问题(不是在stackexchange上,而是在公司内部)。.Net比VB6更好的原因不是很多,但更像是因为不再支持 VB6所以该继续前进了,而是继续前进。问利益相关者,“新”技术应该是什么?也许不是.Net。

但这听起来好像您需要转向一项新技术,并掌握适当的编程模式和实践。第二部分的答案要困难得多。您可能必须在应用程序的小部分中完成它,并证明它值得一试,即它更稳定,更易于维护等。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.