这是“十分之一”的重写时间吗?

2024-01-01

如果可以避免的话,我非常反对重写应用程序。我理解这样的规则:十分之九,最好进行重构,但我所处的情况可能是十分之一,我正在寻找这条线。

目前的情况是:

  • 我接手了一个 VB6/SQL 应用程序的维护。
  • 总代码行数为 75-100k(代码隐藏、模块和类)。
  • 原来的开发人员离开了,所以只有我一个人,没有机会扩大团队,至少几年内是这样。
  • 该程序没有架构(只是以代码隐藏形式以纯文本形式进行直接 SQL 调用)。
  • 不尝试遵循 DRY 或 OAOO 原则。
  • 数据库有一些主键,但没有外键。
  • 在这个系统到位之前,一切都是在大型电子表格中管理的,所以这个系统确实比他们现有的系统有了巨大的改进,但并没有达到他们的设想。
  • 我能够自己编写一些工具,用常量和查找替换表名和列名的所有文字实例,并且我编写了一个快速代码生成脚本来从数据库生成这些常量和查找,所以现在我可以安全地进行数据库更改并查看所有损坏的地方。我已经开始“边缘”规范化数据库,但只完成了 3%。
  • 没有单元测试,因此每次更改数据库时,我基本上都必须重写其上的任何逻辑,并且我使用两个版本来比较功能并确保它是相同的。到目前为止,一切都很好。
  • 我一开始只是尝试修复关键错误以止血,我可以有把握地说这已经大部分完成了,所以现在我退后一步来看看大局。
  • 管理层对他们的期望表示支持和合理。
  • 无论如何,长期目标是将其转换为.NET......

所以,我正在权衡这些选择:

  1. 继续标准化数据库并修改 VB6 应用程序(最终是逐步重写)
  2. 将 VB6 置于仅维护状态(无新功能),一次选择一个功能模块,并在标准化数据库结构之上用 .NET 重写该部分。

我的想法是,如果我选择选项 1,那么最终我只有一个 VB6 应用程序,他们仍然想升级到 .NET,我已经对此进行了研究,它既昂贵又耗时,即使使用您所使用的工具仍然会得到一些有点像弗兰肯斯坦的东西。如果我选择选项 2,我相信我可以更快完成,并且我会直接跳到目标技术。

在我在规范化过程中已经重写的小规模部分中,结果是对已有模块的改进,因此在重写过程中增加了价值。

现有的应用程序尽管存在种种缺陷,但却是一个很好的讨论话题。使用它的人可以告诉我什么对他们有用,什么对他们无效,所以这种方式肯定有很多价值。

那么,这是否符合“十分之一”的次数之一?


我有一个最初用 VB6 编写的项目,他们雇用我将其转换为 .NET。我最近离开了那份工作。我相当确信该程序可能不应该被重写。

如果您采用重写方法,需要考虑以下一些因素(基于我的项目)

  • 这不会是直接重写。一旦消息传出,就会出现重新编写的新功能请求,并且将会有相当多的重新设计/重新架构
  • 如果没有很大的阻力,人们不会接受“仅维护”模式。有一段时间,每个错误都将是“关键任务”
  • 将 VB6 应用程序移植到 .Net 不应被视为比将 C++ 应用程序移植到 .Net 或 Haskell 项目到 .Net 更容易。有一些共性,但最终,它的代码库有 99% 不同(现有方程可能有 1% 不同)
  • 假设该程序正在生产中(即使是在内部),您的新程序很可能达不到标准,至少在最初是这样。您会听到“但是以旧方式......”或“它曾经......”
  • Assuming your customers are not other IT people, they WILL NOT understand:
    • 什么事要花这么长时间
    • 为什么它不像旧程序(在外观和感觉上)
  • 虽然当前应用程序是随着时间的推移而开发的,但您的应用程序可能会在上线后在更短的时间内拥有 100% 的功能。

这些都是现实生活中从 VB6 迁移到 .Net 的经历。我是唯一的 .Net 开发人员。没有资源来雇用额外的帮助。我的情况和你的情况之间的主要区别是 1. 原始开发人员仍然存在 - 只是担任新角色(有时会变得更困难),2. 原始应用程序不需要大量错误修复。

我想如果我能重来一次,我会尝试创建一些 .NET dll 并将它们合并到 VB6 应用程序中。逐段转换为.net。因此,也许您可​​以将应收帐款的数据和业务逻辑移至.NET。所有其他方面保持不变。 GUI、其他功能等。然后在推出并标记为完成后,进入“运输”部分并执行相同的操作。最后一步是创建一个使用 DLL 的新 .NET GUI。

这给你带来了几个好处

  • 最后应用程序是用.NET编写的
  • 允许您慢慢地推出您的更改。您不会在“上线”那周同时调试运输、应收账款和人力资源等
  • 允许您使用更现代的工具,而不会破坏整个程序。想要使用 NHibernate、PLINQ 或 MEF?一次执行一个模块。学习该工具并采取小步骤
  • 允许 GUI 上的灵活性。最后,您可以使用您的核心 DLL 来完成 WinForms、WPF 或 Web 项目。
  • 不会立即向用户提供大量更改。您已经重写了应收账款部分,但用户没有任何线索,因为 GUI 是相同的。然后,当您推出 GUI 时,您就知道后端正在工作。
  • 将使以后的重构变得更加容易。您已经将项目分解为小块。您可以进一步研究它们,了解它们的影响等。

作为一个开发人员,我会非常厌倦决定重写这个应用程序并向他们提供一个工作产品。我认为保守估计(假设没有范围蔓延等)将是 24 个月。更有可能是3-4年。

我离开的项目已经工作了 3 年并且可以使用,但还不能 100% 替代原始应用程序。就像我说的......即使这意味着我没有工作,我认为它不应该被重写。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这是“十分之一”的重写时间吗? 的相关文章

  • 从另一个项目/dll 引用的 Asp.NET 用户控件具有 NULL 属性

    试图将一个常用的自定义控件移到一个新的类库中 也尝试了一个新的web项目 以便其他项目可以使用它 但是在另一个项目中使用时它的属性始终为NULL 不幸的是 搜索类似的问题并不能帮助解决我的问题 我将 web base config 中的新控
  • .NET 中有什么方法可以以编程方式侦听 HTTP 流量吗?

    我正在使用浏览器自动化来测试网站 但我需要验证来自浏览器的 HTTP 请求 即图像 外部脚本 XmlHttpRequest 对象 有没有一种方法可以以编程方式实例化代理以供浏览器使用以查看其发送的内容 我已经在使用 Fiddler 来监视流
  • 检查内部异常的最佳方法?

    我知道有时 innerException 为 null 因此以下操作可能会失败 repEvent InnerException ex InnerException Message 有没有一种快速的三元方法来检查innerException是
  • 使用 linq 2 实体检查 where 子句的两个条件

    嗨 我有一个名为 产品 的表 其中包含列 product id prodcut name prodcut price values like 1200 2000 3000 100 prodcut desc category id 1 2 3
  • TargetType="controlType" 和 TargetType="{x:Type controlType}" 之间的区别

    在 WPF 中 您可以设置TargetType类型的名称 或者您可以将其设置为 x Type nameOfType 有谁知道有什么区别 没有什么 由于属性类型是Type XAML 解析器知道尝试将您提供的任何内容转换为Type 在其他情况下
  • 使用 DbContext 进行模型优先,无法初始化新数据库

    我放弃 我找到了这个 http blogs msdn com b adonet archive 2011 03 15 ef 4 1 model amp database first walkthrough aspx http blogs m
  • VB.NET 中的“阴影”与“覆盖”

    这两个关键词有什么意义Shadows http msdn microsoft com en us library 1h3wytf6 aspx and 覆盖 http msdn microsoft com en us library k777
  • 如何确定 Console.Out 是否已重定向到文件?

    如果我的程序正在打印到控制台 我会根据 Console WindowWidth 通过插入换行符以某种方式执行自动换行 这非常有效 但是 如果程序的输出被重定向到文件或另一个程序 我希望它跳过自动换行 当出现这种情况时我该如何检测 Conso
  • 数据表内部索引已损坏

    我正在使用 C 中的 NET WinForms 应用程序 针对 3 5 NET 框架运行 在此应用程序中 我设置 Expression 成员DataColumn in a DataTable 像这样 DataColumn column dt
  • Visual Studio 多个启动项目之间存在延迟?

    如何在解决方案中的启动项目之间添加一些延迟 我希望客户端项目在启动 WindowsService 后 2 3 秒后启动 为什么我需要这个 WindowsService运行socket服务器 Client运行socket来连接服务器 Wind
  • 安装了哪个版本的 .NET Core SDK

    如何知道安装了哪些版本的 NET Core SDK 我如何知道正在使用哪一个 dotnet version 显示正在使用的版本 dotnet list sdks 列出已安装的版本 需要 NET Core SDK 2 1 及更高版本 另请参见
  • 如何获取我的应用程序已创建的应用程序域的列表?

    我有一个服务应用程序 它在长时间运行的任务的使用过程中创建AppDomain 我一直通过将它们存储在具有唯一 ID 的哈希表中来跟踪它们 任务完成后 服务应用程序会卸载分配给该任务的 AppDomain 然后将其从 appdomain 哈希
  • Silverlight本地存储

    您可能知道 Silverlight 支持本地存储 我们正在考虑创建可在离线模式下工作的 Sl 应用程序 该应用程序可能需要在客户端缓存相当多的数据 显而易见的解决方案 由于性能问题 使用具有某种基于 XMl 结构的本地存储将无法像我们的 P
  • 转换BitmapImage后内存未释放

    我遇到以下 C 测试 代码的问题 public static void TestBitmap2ByteArray BitmapImage bitmap JpegBitmapEncoder encoder new JpegBitmapEnco
  • 在 .NET 中使用 Settings.settings 文件时,配置实际存储在哪里?

    在 NET 中使用 Settings settings 文件时 配置实际存储在哪里 我想删除保存的设置以返回到默认状态 但找不到它的存储位置 有什么想法吗 这取决于您选择的设置是在 用户 范围还是 应用程序 范围 用户范围 用户范围设置存储
  • 服务层设计。将事物放入服务层的原因

    我有一些与设计相关的问题 should service layer interfaces居住在一个domain layer 例如user service 将代码部分移动到单独层的主要原因是什么 should service layer居住在
  • 为什么 IsAssignableFrom() 不适用于 int 和 double?

    这是错误的 typeof double IsAssignableFrom typeof int 这是错误的 typeof int IsAssignableFrom typeof double 但这有效 double a 1 0 int b
  • 并行应用程序的可变与不可变[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在我正在编写的应用程序中 我需要编写大量基本类型 这些类型很可能是不可变的 但我想知道并行应用程序中可变类型与不可变类型的比较如何 您可以对可变
  • 为什么我的 COM 对象不显示组件服务中的方法?

    我正在尝试创建一个 COM 对象并将其注册到 COM 下 一切似乎都很顺利 但是当我查看组件服务并深入了解时 控制台根目录 组件服务 电脑 我的电脑 COM 应用程序 测试通讯 组件 TestCom Com MyCom 接口 MyCom 方
  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu

随机推荐

  • 使用 pywinauto 自动化点击开始按钮

    我是 python pywinauto 的新手 我想自动执行一个简单的步骤 即单击 Windows 开始按钮打开控制面板并选择管理工具 最后想检查该复选框是否已选中 我陷入了如何单击 Windows 开始按钮的第一步 from pywina
  • jQuery datepicker 获取显示的月份和年份不是当前的

    我试图在点击日期选择器标题左侧和右侧的 下一个 和 上一个 链接后获取 显示的 月份和年份 目前我正在使用获取月份 var selectedMonth calendar datepicker getDate getMonth 1 但它只返回
  • 将多个工作簿中的数据复制并粘贴到另一个工作簿中的一个工作表

    我希望你能帮忙 我目前有一段代码 请参见下文 我希望它做的是允许用户选择包含工作簿的文件夹 然后打开每个工作簿 从每个工作簿中选择一个名为 SearchCaseResults 的工作表 将每个 SearchCaseResults 中的数据从
  • 显示从 MySQL 填充数据集的进度

    我目前正在使用 C 和 MySQL 数据库后端开发一个应用程序 我的程序最终可能会从数据库加载大量数据并添加到数据集中以在 DataGridView 中显示 我希望能够显示数据集填充的进度 但不确定如何获取它在数据库中位置的引用 下面是我目
  • 从 NuGetV3 API 获取包

    我有兴趣使用非 NET 语言为 NuGet v3 API 编写客户端库 获取包裹需要哪些请求 响应是什么样的 i e 获取 包版本 获取 包版本 您还可以链接到涵盖此场景的官方文档吗 Here https learn microsoft c
  • python中有strncpy()等价的函数吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 python中C语言的strncpy 有等价的函数吗 我想用第一个字符串替换第二个字符串中的 6 个字符 美妙 应改为 美丽 下面是C中的
  • 使用 Google 地图 API 或任何其他方式进行旅行推销员

    我有一个地址列表 需要找到到达每个地址并返回起点的最佳路线 我认为使用 Google Maps API 可以用 8 个路径点来计算 但 8 个路径点不足以满足我的目的 有没有人提供超过 8 个航点的路线优化 我的意思是一定有 对吗 这是许多
  • win32com + Excel + Django + Apache = 问题

    我在 Web 应用程序中打开 Excel 文档时遇到一些问题 在 Apache mod wsgi Windows 2008 Server 下运行 没有 当应用程序在 django 开发服务器上运行时出现问题 一个线程 My code def
  • 单击播放按钮时,YouTube 视频在 webView 中显示黑屏

    我尝试了这个 但它不起作用 webView getSettings setJavaScriptEnabled true webView loadUrl String valueOf https techx pk youtube videos
  • 如何配置播放框架以将我的工件存储库用于所有依赖项?

    我正在尝试添加一个本地 Maven 存储库 该存储库是我使用用于缓存 Maven 存储库的神器设置的 继依赖指令 http www playframework org documentation 1 2 3 dependency我已经找到了
  • 平衡二叉搜索树

    我需要构建一个平衡二叉搜索树 到目前为止 我的程序插入了从 1 到 26 的数字 但我的程序没有将其构建成平衡二叉搜索树 如果有人可以查看我的代码并帮助我 我将不胜感激 public class TreeNode TreeNode left
  • 如何在 UML 类图中显示私有继承关系

    在 C 中 由于私有继承不被视为is a关系 它应该如何在类图中显示以及是否显示为has a那么如何区分组合和私有继承呢 它应该是一个组合关系 子类一侧的实心黑色菱形 因为 私有继承的意思是 根据 实现 但在这方面它可以简单地视为与 具有
  • Solr 查询过滤文档,数组中至少有一个值(指定值除外)

    有没有一种方法可以过滤查询 这样我将获得具有特定数组字段的文档 其中包含除我传递的值之外的至少一个其他值 例如我有 3 个文档
  • 在 IEquatable 实现中需要进行引用检查

    我有一个实现的类IEquatable
  • 计算 Mandelbrot 集以获得更高的精度

    是否有任何实用的方法来执行计算 例如涉及生成曼德尔布罗特集以精确计算值的计算double or long double可以提供 我正在考虑可能有两个变量 双精度或长整型 一个存储类似于科学记数法的值 另一个存储该值的负 log10 但我不确
  • Linux 上有对应的 WinSCP 吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 I love WinSCP https en wikipedia org wiki WinSCP对于 Windows Linux 上最好的
  • 如何截断浮点值?

    我想从浮点数中删除数字 以便在点后有固定数量的数字 例如 1 923328437452 1 923 我需要作为字符串输出到另一个函数 而不是打印 另外我想忽略丢失的数字 而不是四舍五入 round 1 923328437452 3 See
  • 获取从 PubSub 事件触发的 Google Cloud Functions 的执行 ID

    对于从 HTTP 触发的 Google Cloud Functions 可以通过检查 HTTP 请求的标头来检索执行 ID Function Execution Id package p import fmt net http func F
  • Angular 2.0.2 - 静态解析符号值时遇到错误

    在运行 i18n 时 我还遇到了著名的错误 静态解析符号值时遇到错误 不支持函数调用 请考虑将函数或 lambda 替换为对导出函数的引用 解析符号 我已经做了很多研究 而且我没有使用 lambda 函数 当我将以下导入语句添加到我的基本模
  • 这是“十分之一”的重写时间吗?

    如果可以避免的话 我非常反对重写应用程序 我理解这样的规则 十分之九 最好进行重构 但我所处的情况可能是十分之一 我正在寻找这条线 目前的情况是 我接手了一个 VB6 SQL 应用程序的维护 总代码行数为 75 100k 代码隐藏 模块和类