什么样的项目需要怎样的方案都是需要根据实时需求来决定,本文一起来看看作者与 React 的故事……

编译 | 弯月    责编 | 张文

出品 | CSDN(ID:CSDNnews)

故事发生在 2018 年的夏天。我们接到了一个大项目,要求将某个大规模的桌面 WPF 应用程序迁移到云 Web。

在经过一番询问和探讨之后,我总结出了几个非功能性的需求:

  • 这是一个大型的应用程序,包含 220 多个页面,其中大部分是维护页面,大约 20%是高度定制的页面。

  • 需要显示大量的数据,尤其是以各种表格的形式:分组、列冻结、行扩展、自定义列等等。

  • 模块化架构,可以由多个团队同时分担项目。

  • 长期项目。新功能将随着时间的推移而不断增加。

  • 不需要离线支持。

  • 需要让新的团队成员快速适应工作,特别是开发桌面应用程序的.NET开发人员。

架构师的职责是提出技术方案,包括架构细节、方法、路线图和指南等,最重要的是决定我们即将采纳的技术栈。

由于客户提到他们不赞成 Angular,因此在经过多番考量以后,最终我敲定了 React 和 Redux。但是,我万万没想到,两年后我会为这个决定而后悔。

.NET 开发人员加入团队

经过概念验证后,我们决定让客户的外包团队(.NET 开发团队)加入这个项目。然而,很快客户就提出了一系列的问题:

  • “依赖注入在哪里?为什么我们不需要依赖注入?比如说这个 InversifyJS 就需要!”

  • “函数组件?不,我们不喜欢函数组件,我们想使用类组件!”

  • “为什么这些函数都是独立的?为什么不把它们封装在服务类中,让它们静态化?”

  • “API 的重试策略在哪里?我们用 PollyJS 实现一个吧。”

  • “为什么文件名使用了短线,而类名是驼峰式大小写?文件名应该反映类名,我建议从现在开始,文件应该命名为 SomePageComponent.tsx。”

  • “怎样才能在 VisualStudio 上运行代码?我不想使用 Visual Studio Code。”

很明显,他们想使用.NET 准则和设计模式编写 React 代码。这种情况很常见,开发人员很难适应新技术的工作方式。所以,我也不害怕向他们解释他们的做法不符合 React 的惯例。

通过这个问题,我也意识到 Java 或.NET 开发人员不适应 React。在这种情况下,可能 Angular 才是更好的选择,因为它们的设计模式很类似。

我们要考虑的远不止 React 本身

React 是一个没有观点的库,这意味着对于如何实现跨领域的问题,它没有任何主张。因此,如何使用 React 的责任就落到了我们团队肩上,尤其是采用哪些其他的库。当然,你肯定会使用第三方库,因为谁都不想重新发明轮子。然而,在 React 中,有很多库可供选择。

为了进行概念验证,针对应该如何处理跨领域的问题,我提出了自己的看法。接下来,我们需要与新的团队成员一起重新验证。讨论的主要问题包括:

  • 应该使用哪个路由库?

  • 除了 Redux 之外,异步操作还应该使用什么?Thunk?Saga?

  • 应该使用 Axios,还是 fetch 浏览器 API?

  • Redux-Forms、Formiq 还是 Final-Form,哪个更好?

  • 应该使用 styled-components、makeStyle、SASS 还是纯 CSS?

  • 国际化库用哪个?

所以说,我们需要再花三个星期来做出这些决定。可能有人会说,挑选这些库根本不需要三个星期。

但是,在企业项目中,每一个决定,你都必须创建决策标准、考察研究、创建概念证明、验证发现、提出发现、在决策日志中记录所有过程,并保持库的更新。这需要花费大量的时间,但一点乐趣都没有。

此外,每一位开发人员都需要花时间学习所有的第三方库。我从未见过两个 React 项目具有相同依赖项、项目结构和准则。这意味着知识无法在项目之间传播,就像在 Angular 或 Vue 中一样。

我们花了三周的时间,而功能开发方面毫无进展,客户开始担心了。

React Hooks 广受好评

九个月后,我们创建了 50 多个页面。开发人员发现函数组件并不比类组件差,于是,他们开始使用函数组件。项目也不遵循原始的编码准则了。这是每一位开发人员的个人选择,我并不在意。

后来,React Hooks 发布了,而且广受好评。我们团队内出现了分歧。有些开发人员对于 ReactHooks 提出的一些观点(比如“类不仅让人类感到困惑,而且机器也不是很明白”)感到不满,还有一些开发人员则非常热衷于这种新式的编程方式。

我们使用的所有第三方库都增加了对 Hooks 的支持,似乎整个 React 世界都在朝着这个方向发展。那我们该怎么办呢?我们应该偏离最初的编程准则,并添加实现组件的第三种方法吗?似乎我们已无退路,只能将现有的页面和组件迁移到 Hooks!

我们团队赞成使用 Redux Hooks,因为我们不需要使用 Redux 的 connect(),并将界面组件与容器分开。这很合理,于是我们同意从现在开始,新建的页面和组件都使用 Hooks。但旧的页面和组件保持不变。

因此,我们中间出现了第三种处理方式,一致性不复存在了。

更糟糕的是,一些开发人员提出了一个想法:放弃 Redux,使用 useState。这意味着我们将彻底抛弃保持统一的思想。

Suspense 仍然是实验性的功能。我担心发布之后的情况。

开发速度减慢

当初持续集成刚建立起来的时候,构建大约花了三分钟,包括 npm 安装。但是,一年以后,大约需要 15 分钟。

此外,我们还必须配置 Node.js,将 RAM 扩展到 4GB,因为 2GB 不够用了。这不是什么大问题。但令人担忧的是,开发人员开始抱怨构建时间太长,在开发进行 45~60 分钟后,热重载就不能正常工作了,而且重启需要 5 分钟的时间,尤其是 Windows 用户(很显然 Node.js 在 Linux 系统上的运行速度要快得多)。有时,他们不得不完全删除 node_modules,然后重新下载依赖项,否则就无法正常工作。

当一个系统的总大小超过了 600MB,node_modules 中有 1200 多个依赖项时,你觉得情况会怎样?

对于企业应用程序,一切都要考虑成本。假设开发人员每天必须重启6次系统,他们的时薪为:每小时 40 美元,那么 6 次/天 x 5 分钟/次 x 240 天/年 x 40 美元/小时 x 8 个开发人员 = 38,400美元/年。对于企业而言,这可不是一个小数目,但是对于项目发起人来说,这是一笔不错的年终奖金,可以购买一辆全新的特斯拉 Model 3了。

Redux-Saga 慢慢走向衰落

大多数开发人员不同意我的观点,但是我认为企业的大部分业务逻辑都在 Redux 的异步操作内。大多数时候,这是唯一可以进行验证、API 调用、错误处理、触发 redux 变更或触发通知的地方。如果说这些不属于前端应用程序业务逻辑,那是什么?

我们使用了 Redux-Saga,但这是一个糟糕的决定,因为它增加了不必要的复杂性。当初要是选择 Thunk 就好了。

在企业应用程序中,你必须不时地升级并重新验证依赖关系。这是一个好习惯,因为你想要安全更新、性能改进和小幅的 API 更新,同时还希望没有重大变化。似乎 Redux-Saga 已经落伍了。上一次更新是在一年以前,GitHub 上的议题数量仍在不断增加,但没有人修复。

开发人员喜欢 React 的原因有三个:简单,灵活和生态系统。React 的团队喜欢尝试新的想法,但对于这个生态系统来说,这种做法弊大于利。他们应该勇敢承担责任。

实际上,React 大多是向后兼容的,但是 React 周围的生态系统却不是。开发人员和第三方库总是会使用最新的功能和架构模式,而旧的实验都会被淘汰。对于中小型项目而言,这应该不成问题,因为你随时可以调整。但是对于大型的长期项目来说,这些实验都具有破坏性。

最终,我决定将 React-Saga 记入技术指导委员会的风险评估结果。因为 30%的业务逻辑都在 saga 中,所以我将其标记为高风险。

于是,客户终于按捺不住了,开始发脾气,指责我做出了错误的决定。接下来,我收到了一连串的质问:

  • “为什么我们必须花那么多时间来升级库?”

  • “为什么开发速度会减慢?”

  • “为什么应用程序有那么多 bug,而且不稳定?”

后来,这件事情惊动了高层。我花了大量时间来寻找证据,证明我们的决定是当初那个时间点上的最佳决定。我们开了几次反省大会,后来一切回归了平静。毕竟,项目已经做的差不多了,即将进入维护模式。

总结

我喜欢 React。论起个人项目或新创业项目,我还是会推荐 React。但是,在经历了这么多不太愉快的事情后,我不鼓励企业应用程序选择 React。

参考链接:https://medium.com/better-programming/i-almost-got-fired-for-choosing-react-in-our-enterprise-app-846ea840841c

☞平均 15144 元、软件工程师占比最高,2021 年 2 月程序员工资最新出炉!
☞乐视视频 App 图标改为“欠 122 亿”,网友:我在别家分红包,却在你家随份子!
☞PHP、Python 竟上榜最慢的现代编程语言

点分享

点收藏

点点赞

点在看

因为在企业软件中采用了React,我差点被公司开除相关推荐

  1. 32个企业软件门类名称和释义

    明道云编撰 企业软件在全球发展了半个世纪,诞生了无数软件门类和产品.我们摘编了数十个骨干的门类,并结合市场实践给出有价值的释义,帮助企业用户厘清各个企业软件产品的边界,从而帮助自己更好地规划数字化建设 ...

  2. 高质量软件中的7项自动化要求

    目录 翻译内容 Summary(摘要): 正文 关于作者 Sammy Tam 原链接 翻译内容 Summary(摘要): An advanced, efficient test automation ...

  3. 传统企业软件的互联网化

    文 / 池建强 在我个人长达十几年的IT从业过程中,一直从事软件产品和服务的研发.我有幸经历了第一波互联网浪潮,现在又正值IT技术发展的黄金时 期,无论是传统企业软件,还是互联网服务,都在高速发展.这 ...

  4. 因不满被拒,研究员公开 IBM 企业安全软件中的4个 0day

     聚焦源代码安全,网罗国内外最新资讯! 作者:Swati Khandelwal 编译:奇安信代码卫士团队 Agile 信息安全公司的研究员 Pedro Ribeiro 公开了影响 IBM 企业安全软件 ...

  5. 企业如何CRM管理软件中受益

    CRM管理软件为个体经营者的客户管理做了什么?以下小编就为您讲道: 企业如何CRM管理软件中受益? 1.可以帮助企业创建一个客户体系的数据库,根据需求储存重要的客户信息,可以高级筛选不同维度的客户信息 ...

  6. invalid project description._[Project教程] 在Project软件中如何处理加班工时

    在微软Project软件中有处理加班工时的功能,但是我在系统课程中没有讲,为什么呢?就像Project软件中的[进度线]功能,这个功能还不够完善,所以暂时不建议大家使用.加班工时这个问题也是如此,总体 ...

  7. 《企业软件交付:敏捷与高效管理精要》——1.5 对企业软件交付的需求是如何演变的呢...

    1.5 对企业软件交付的需求是如何演变的呢 对企业软件系统的交付来说,一个非常重要的转变是由几个相辅相成的因素推动的. 最终用户的期望.最终用户要求获得更及时的同步信息,要随处.随时.无需停机.这种访 ...

  8. 《企业软件交付:敏捷与高效管理精要》——1.6 结论

    1.6 结论 企业软件交付面临的压力在不断增长.要削减成本,同时又要对业务承担更大的责任,这些都要求企业软件交付机构在他们提供的系统和维护中加快创新步伐.企业软件交付的成功,在很大程度上取决于机构是否 ...

  9. 关于企业信息化中审计流程“寻租”现象的探讨

    关于企业信息化中审计流程"寻租"现象的探讨 企业信息化,刚开始研究这个方向时,等着导师给出一个清晰概念,岂料导师给了个80年代国内某大型企业开展企业信息化的案例.感觉那段时间就是对 ...

最新文章

  1. 本月与上月对比数据叫什么_财务人事应会Excel数据对比Vlookup函数快速核定变动...
  2. (转)Oracle中实现行列转换的方法
  3. leetcode103. 二叉树的锯齿形层次遍历(bfs)
  4. centos java mvn_Linux(centos7)安装JDK1.8与maven
  5. Spring Cloud Config Server
  6. 报错,sql语句中尽量不要使用*,只查询需要的字段出来
  7. MuPlayer『百度音乐播放内核』
  8. 计算机水平拼音怎么写,电脑上的拼音到底是怎么敲出来的
  9. CNTV视频回看下载地址
  10. php pandoc,搭建Pandoc+Markdown写作环境
  11. 实现透明效果时,开启深度测试,关闭深度写入
  12. 用vivo手机拍照一定要先打开这个设置,不然白浪费这么强大的手机
  13. Qt实现双击可编辑的QLabel,输入文本后回车确定
  14. [错误解决]centos中使用kubeadm方式搭建一个单master的K8S集群
  15. 用python实现相声、评书自动下载(六)
  16. 网易运营微专业_用户运营
  17. 【C语言】qsort函数使用(详解)
  18. 【GNSS】gfzrnx-用法
  19. 聊天室c语言程序,socket 多线程聊天室的实现(C语言)
  20. python笔记01:我和 Python 第一次亲密接触

热门文章

  1. 斯隆奖新晋得主宋舒然:从视觉出发,打造机器人之「眼」
  2. 字节AI Lab总监李磊离职加入UCSB,马维英后又一大牛回归学界
  3. 旷视AI「炼丹房」Brain++ 再升级!首席科学家孙剑发AI「灵魂」三问
  4. 我是AI产品经理,就必须掌握AI技术吗?
  5. 爱立信将在加拿大建立人工智能实验室
  6. 听说H2O能让大家都会用机器学习?
  7. python-回调函数和递归函数
  8. 深度玩转神经网络——基于Keras
  9. 神经网络的叛离:32年前从心理学与生理学分离的瞬间
  10. 吴恩达机器学习笔记 —— 3 线性回归回顾