我目前正在开发用于政府土地规划的Web应用程序。该应用程序主要在浏览器中运行,使用ajax加载和保存数据。
我将进行初始开发,然后毕业(这是学生的工作)。此后,其余团队将根据需要添加偶尔的功能。他们知道如何编码,但他们大多是土地规划专家。
考虑到Javascript技术的变化步伐,我如何编写从现在起20年后仍然可以使用的代码?具体来说,我应该使用(或避免使用)哪些库,技术和设计思想来对我的代码进行过时的验证?
我目前正在开发用于政府土地规划的Web应用程序。该应用程序主要在浏览器中运行,使用ajax加载和保存数据。
我将进行初始开发,然后毕业(这是学生的工作)。此后,其余团队将根据需要添加偶尔的功能。他们知道如何编码,但他们大多是土地规划专家。
考虑到Javascript技术的变化步伐,我如何编写从现在起20年后仍然可以使用的代码?具体来说,我应该使用(或避免使用)哪些库,技术和设计思想来对我的代码进行过时的验证?
Answers:
为这样的寿命规划软件是困难的,因为我们不知道未来会怎样。有一点背景:Java于21年前于1995年发布。XmlHttpRequest最初作为Internet Explorer 5的专有扩展而可用,发布于17年前的1999年。它花了大约5年的时间才在所有主要浏览器上可用。您要展望的20年就是富Web应用程序甚至已经存在的时间。
从那以后,某些事情肯定保持不变。一直在大力进行标准化,并且大多数浏览器都很好地符合所涉及的各种标准。15年前跨浏览器工作的网站仍然可以正常工作,前提是该网站可以工作是因为它针对所有浏览器的公共子集,而不是因为它为每个浏览器都使用了变通方法。
其他事物来去去去-最显着的是Flash。Flash存在各种导致其消失的问题。最重要的是,它由一家公司控制。Flash和HTML5之间没有竞争,而没有Flash平台内部的竞争,因此HTML5赢得了胜利。
从这段历史中,我们可以得出一些线索:
保持简单:无需使用任何变通办法即可立即进行操作。由于向后兼容的原因,这种行为很可能在将来很长一段时间内仍然可用。
避免依赖专有技术,而选择开放标准。
当今的JavaScript世界相对不稳定,具有大量的库和框架。但是,它们在20年内几乎没有关系-可以肯定的是,那时唯一仍将使用的“框架”是Vanilla JS。
如果要使用某个库或工具,因为它确实使开发变得容易得多,请首先确保它基于当今得到良好支持的标准。然后,您必须下载该库或工具,并将其包含在您的源代码中。您的代码存储库应包括使系统可运行所需的一切。任何外部的依赖都可能会在将来中断。一种有趣的测试方法是将代码复制到拇指驱动器,转到具有不同操作系统的新计算机,将其与Internet断开连接,然后查看是否可以使前端工作。只要您的项目由普通的HTML + CSS + JavaScript加上也许一些库组成,您就很可能会通过。
比代码存活20年甚至更重要的是,数据存活20年。很有可能是值得保留的东西。如果您的数据易于使用,则使用较新技术在其之上构建备用系统将很容易。
一旦有了这些,就可以简化应用程序的前瞻性,因为它是数据模型的包装器,例如,如果在十年内没有人使用Javascript,并且您需要将应用程序迁移到该模型,则可以替换该应用程序。 WASM之类的。保持模块化,减少相互依赖性,可以使将来的维护更加容易。
[1]对该答案的大多数评论都强烈反对将Oracle用于数据库,因为有很多完全合理的理由使Oracle难以使用,学习曲线和安装开销也很大。在选择Oracle作为数据库时,这些都是完全有效的关注点,但是在我们的案例中,我们并不是在寻找通用的DB,而是主要关注可维护性的对象。Oracle自70年代末以来一直存在,并将在未来很多年内得到支持,并且有庞大的顾问和支持选项生态系统可以帮助您保持运行。对于许多公司来说,这是否定价过高?当然。但是它将使您的数据库运行20年吗?很有可能。
不仅仅是浏览器;设备也很重要。
阿蒙(Amon)提到了一个事实,即“一个在15年前跨浏览器工作的网站仍然可以正常工作”,这是事实。但是,请看看创建于十五年前的网站,而不是创建于十年前的网站,这些网站在创建时可以在大多数浏览器中为大多数用户使用。如今,很大一部分用户将根本无法使用这些网站,这不是因为浏览器发生了变化,而是因为设备可以使用。这些网站在移动设备的小屏幕上看起来会很糟糕,如果开发人员决定依赖JavaScript click
事件,而又不知道tap
事件也很重要的话,这些网站最终将根本无法工作。
您正在关注错误的主题。
技术变更是一回事,但更重要的是需求变更。产品可能需要缩放,或者可能需要具有其他功能,或者可能需要更改其当前功能。
无关紧要的是浏览器,设备,W3C或...。
如果您以可以重构的方式编写代码,那么该产品将随着技术的发展而发展。
如果您以没人能理解和维护的方式编写代码,那么技术就无关紧要:任何环境变化都会使您的应用程序瘫痪,例如迁移到其他操作系统,甚至简单的事情就是自然数据增长。
例如,我从事软件开发工作已有十年。在数十个项目中,由于技术的缘故,我决定更改的项目只有两个,更确切地说,是因为PHP在过去十年中发展了很多。这甚至不是客户的决定:如果站点使用PHP的命名空间或闭包,他也不会在乎。但是,与新要求和可伸缩性相关的更改很多!
您不打算持续20年。干净利落。相反,您将目标转移到了分区。
您的应用数据库是否不可知?如果您现在必须切换数据库,可以吗?您的逻辑语言是否不可知。如果您现在必须用全新的语言重写应用程序,可以吗?您是否遵循良好的设计准则,例如SRP和DRY?
我的项目的寿命超过20年,我可以告诉你情况发生了变化。就像弹出窗口一样。20年前,您可以依靠弹出窗口,而今天则不能。XSS并不是20年前的事情,现在您必须考虑CORS。
因此,您要做的是确保逻辑完全分开,并且避免使用任何将您锁定到特定供应商的技术。
有时这可能非常棘手。例如,.NET非常适合公开其MSSQL数据库适配器的逻辑和方法,该适配器在其他适配器中没有等效项。今天,MSSQL似乎是一个不错的计划,但它会保持20年吗?谁知道。如何解决此问题以使数据层与应用程序其他部分完全分离的示例。然后,在最坏的情况下,您只需要重写整个数据层,其余的应用程序就不会受到影响。
换句话说,将其视为汽车。您的汽车将无法使用20年。但是,有了新轮胎,新发动机,新变速箱,新车窗,新电子设备等,同一辆车可能会行驶很长一段时间。
@amon和其他一些人的答案很棒,但我想建议您从另一个角度看待这个问题。
我曾与大型制造商和政府机构合作,他们依赖已经使用了20多年的程序或代码库,而且它们都有一个共同点-公司控制硬件。当您控制某项内容运行时,使其具有20多年的可扩展性并不难。这些小组的员工在现代化的机器上开发了比部署机器快数百倍的代码...但是部署机器被及时冻结了。
您的情况很复杂,因为网站意味着您需要规划两种环境-服务器和浏览器。
对于服务器,您有两种常规选择:
依靠操作系统来获得各种支持功能可能要快得多,但是这意味着可能需要“及时冻结”操作系统。如果是这种情况,您将需要为服务器准备一些操作系统安装的备份。如果10年后发生崩溃,您不想让某人疯狂尝试重新安装OS或重写代码以在其他环境中工作。
在给定的语言/框架内使用版本控制的库,虽然速度较慢,但可以打包在虚拟环境中,并且可能在不同的操作系统或体系结构上运行。
对于浏览器,您需要将所有内容托管在服务器上(即,您不能使用全局CDN托管文件)。我们可以假设未来的浏览器仍将运行HTML和Javascript(至少出于兼容性考虑),但这实际上是猜测/假设,您无法控制。
大多数应用程序的核心是数据。数据是永远的。代码更易消耗,可变,可扩展。但是,必须保留数据。因此,请专注于创建真正可靠的数据模型。保持架构和数据干净。预计可能会在同一数据库的顶部构建一个新的应用程序。
选择一个能够强制执行完整性约束的数据库。随着时间的流逝,不受约束的约束往往会被违反。没有人注意。充分利用诸如外键,唯一约束,检查约束以及可能的触发条件等功能。有一些技巧可以滥用索引视图来强制执行跨表唯一性约束。
因此,也许您需要接受该应用程序将在某个时间被重写。如果数据库是干净的,将几乎没有迁移工作。就劳动力和所造成的缺陷而言,迁移非常昂贵。
从技术角度来看,将大多数应用程序放置在服务器上而不是JavaScript形式放在客户端上可能是一个好主意。借助虚拟化,您可能可以在相同的OS实例中运行很长时间。这并不是很好,但这是保证该应用程序从现在起20年后可以正常工作,而无需任何昂贵的维护和硬件成本。这样做至少可以让您继续运行旧的,有效的代码而又安全又便宜。
此外,我发现某些技术栈比其他技术栈更稳定。我想说.NET具有目前最好的向后兼容性故事。微软对此非常认真。Java和C / C ++也非常稳定。Python已经证明,随着Python 3的重大更改,它非常不稳定。实际上,JavaScript对我来说似乎非常稳定,因为对于任何浏览器供应商而言,断网都不是可行的选择。但是,您可能不应该依赖任何实验性的或时髦的东西。(“ Funky”被定义为“当我看到它时就知道”)。
其他答案确实有意义。但是,我认为对客户端技术的评论过于复杂。在过去的16年中,我一直从事开发工作。以我的经验,只要保持客户代码直观,就可以了。因此,不会出现带有框架/ iframe等的“骇客”。仅在浏览器中使用定义明确的功能。
您始终可以在浏览器中使用兼容模式来保持它们的正常运行。
为了证明我的观点,就在几个月前,我为一个已经运行其Web应用程序17年的客户修复了javascript代码中的一个千年错误。仍然可以在最新的机器,最新的数据库,最新的操作系统上使用。
结论:保持简单和清洁,应该没问题。
一些公理:
最稳定的技术和标准(那些最不容易过时的技术和标准)往往是非专有的并且被最广泛地采用。采用范围越广,几乎对任何形式的变革的惯性就越大。专有的“标准”总是容易受到其所有者和竞争力量的命运和幻想的影响。
在计算机行业,二十年是很长的时间。五年是一个更现实的目标。在五年的时间内,您的应用程序要解决的整个问题可以完全重新定义。
一些例子说明:
C和C ++已经存在很长时间了。他们几乎在每个平台上都有实现。C ++仍在不断发展,但是“通用”功能(在所有平台上都可用)几乎可以保证永远不会被弃用。
Flash几乎成为通用标准,但它是专有的。公司决定在流行的移动平台上不支持它的地方基本上注定了它-如果您是为Web创作的,则希望您的内容在所有平台上都可以使用;您不想错过主要的移动市场。
WinTel(Windows / x86)尽管是Microsoft和Intel的专有软件,但在一个不太理想的平台上开始使用(内部16位/ 8位外部8088与同时代的Apple Macintosh 32位内部/ 16位外部68000)和侵蚀对于苹果公司而言,在消费者市场上仍然是商务平台的事实上选择。在过去的所有时间(25年)中,对向后兼容性的承诺阻碍了未来的发展,并激发了人们很大的信心,认为旧机器上的内容仍然可以在新机器上使用。
最后的想法
JavaScript可能不是实现业务逻辑的最佳选择。出于数据完整性和安全性的原因,应在服务器上执行业务逻辑,因此客户端JavaScript应限于UI行为。即使在服务器上,JavaScript也不是最佳选择。尽管对于小型项目而言,与其他堆栈(Java或C#)相比,它更易于使用,但它缺少形式化的功能,当情况变得更复杂时,形式化功能可以帮助您编写更好,更组织化的解决方案。