我是一家汽车租赁公司的出租代理/经理,该公司在1972年编写的出租系统上运行。我决定也许是时候进行更新了。作为一点背景,下面是我们每天必须从此程序中处理的疯狂的简短示例:
租赁代理商必须记住,在一个屏幕上进行打印时,在ACT字段中使用“ MXC”(所有内容均基于短代码),这令人困惑地表示“在合同上显示最大数量”,而在另一个屏幕上则需要PR(对于PRint)。 ACTION字段,但有几个屏幕在PT(对于PrinT)字段中使用Y,而另一个屏幕在PRT(对于PRinT)字段中使用Y,而另一个屏幕要求用户点击Enter(但不点击字母,因为这是换行符,必须是数字键盘上的回车键),然后是F8,一个不同但相关的屏幕仅需F8,某些屏幕上有一个标有PRT的字段,该字段应用于PRinT,但实际上该字段什么也不做,经过几次提示后,打印会自动完成,还有更多屏幕带有标有PRINT Y / N的字段,对于其他地点已经交付文书工作的操作,默认为Y;对于其他经销商将需要文书工作的操作,默认为N。
我决定可以做得更好,因此我决定与公司中的负责该更新的人联系。我最终与负责该计划的IT副总裁取得了联系。我从他那里得到了一些信息,并且得知我的汽车租赁公司的租赁程序是用IBM大型机组装程序编写的,其中混入了一些COBOL。他说,目前没有职位空缺,但是我应该无论如何,请给他发送我的简历给他(以防万一)。
这使我想到了我的问题。
首先是技术。考虑到将来改善可维护性的想法,我的想法是用比汇编语言更高级的语言来重写它。我的经验领域是C ++,因此这对我来说是显而易见的选择。该公司迫切需要一种更简便的方法来更新程序,正如我最近读到一篇文章时所引用的,当时与我交谈的那个人说,该团队工作很努力,他们很自豪地宣布该程序现在支持5位数字的位置代码(而不是4)和8位的车号(而不是7)。我的更新哲学,即使在这种可怕的情况下,也符合乔尔的观点:http : //www.joelonsoftware.com/articles/fog0000000069.html简而言之,重写应该是渐进式的,而不是扔掉以前的一切然后重新开始。
有没有一种简便的方法可以将IBM Assembly与C ++集成在一起,如果可以,该怎么办?我隐约知道了asm关键字,但是我不知道最好使用它还是做其他事情。这样的计划不明智吗?我在使用g ++和GNU make的Linux上完成大部分工作,因此欢迎您回答特定的答案,但绝对不需要(因为我不知道它们没有哪种构建系统,但我怀疑几乎没有)。
第二个问题更具政治性。我应该如何说服该公司他们需要进行转换?理论上的成本节省是巨大的(根据我的估计,该公司每年在浪费额外的百万美元左右,仅是增加了学习如何与该程序交互的培训成本),但是我建议的更改可能会将所有当前的程序员失业,应该将他们制定出来,因此存在很大的结构性变革阻力。
编辑:我应该解释为什么我修改公司已经拥有的东西对我来说似乎是最好的解决方案。我仍然愿意接受其他建议,因为这是程序的庞然大物。我以前从未从事过编程工作,因此请对我可能给出的任何错误分析进行更正。
首先,有现成的解决方案。
从我与几位中层管理人员的讨论中,切换到新系统的主要问题之一是,许多忠诚的员工已经在公司工作了数十年,并且对系统很满意。 。如果我有能力修改已有的内容,则可以将当前接口保持为某种“兼容模式”。用户已经必须登录才能使用当前系统,因此我可以添加在用户首次登录(在我进行此更改之后)时激活设置的功能,在此用户可以选择使用“经典”界面或“新”界面。我无法找到一种现成的解决方案来实现这一目标,
我公司还拥有我们使用的软件;我们不许可。这意味着我正在与之交谈的管理层实际上是可以授权我进行更改的同一个人。使用第三方解决方案,除了获得开发我们所使用产品的公司的必要权利外,我还必须获得公司的批准,这增加了另外的障碍。这还需要说服公司放弃“他们的”产品并购买其他产品,这似乎比尝试更新我们现有的产品更大的障碍,但是在这个问题上我很可能是错误的。
最后,展望未来,我不仅要改善用户界面并修复一些错误。在更新了这些“紧急”问题之后,我希望更新与技术相关的公司运营的基本方式。在这类问题上花了1-2年的时间后,我的计划是回到管理层并提出更重大的变化。公司目前有很多方法可以通过根本不使用的技术从根本上加以改善。例如,每个区域几乎都以相同的方式运行。当地的主要机场是分发汽车的中央枢纽。它们主要按需要发送。但是,机场被用作所有行动的基地。他们会用一辆车派两个人到我的位置,从我们这里接我们不需要的车,然后带着他们进来的汽车返回机场,再加上他们要收回的东西(我们距机场32英里)。然后,他们将乘坐两辆车到达距离我们5英里的位置,将其中一辆降下,然后将另一辆车返回机场。即使我们退还的汽车与他们在我们附近所需的汽车相同,他们也会这样做。我已经在该公司工作了大约两年,而我似乎只在最极端的汽车短缺紧急情况下才偏离了这一点(大约有过三次)。我将用一个自动调度系统代替在每个地区工作的4个人,该系统可以确定要去哪辆汽车,并尝试找到所需的时间最少的里程+里程+驾驶员来将所有汽车交付到需要的位置。我希望有一天可以添加更高级别的修复示例。
但是,在我提出所有建议之前,我认为通过执行较小的任务(例如更新接口)来了解公司和代码库将很有帮助。诸如外包或其他方式的解决方案将消除这种可能性。
if (m_newInterface)
意大利面条式代码开始出现在整个代码库中。解耦和重构花费了足够长的时间,以至于完成后,大多数用户已经迁移到了新界面(请考虑数年)。