代码改进
您已将代码推送到所有测试中,它们又变成绿色。 持续集成流水线贯穿了整个过程。 功能列表上的所有复选框均已选中。 所有便利贴已移至墙的完整部分。 ew
诱人的是将代码调用完成并在假期出发。 这是你应得的。 团队赢得了它。 让代码做点事情。 这不是我们写这本书的全部理由吗? 把它扔在墙壁上,它会嗡嗡作响吗?
las,自满和坐着的日子已经过去了。 这些天什么都还没完。 仅仅因为您排除了错误并交付了可运行的程序并不意味着您应该放松。 您仍然可以做很多事情来改进代码。 一些人是好公民的标志,他为下一个团队的到来进行清理。 一些是增长和占领新市场的机会。 有些是新旅程的开始。
当您从放松和恢复中恢复过来时,这里有16件事。
[也在JavaWorld上: 开发安全Java应用程序的13条规则 。 ]
皮棉
称为lint或lint的工具就像一个执行数百条语义规则的代码审查机器人。 也许有数千个。 有些是由编程方面的强迫性责骂而写的,该部门计算空白字符,并谴责使用过多或过少的字符。 有些是由认真的人写的,他们已经标记出了细微的语义模式,这些语义模式可能会导致以后的安全漏洞。 您的编程团队可能已经选择了一个linter集合,现在是运行它们的时候了。
个人资料
Don Knuth曾经说过:“过早的优化是万恶之源”,因为花时间改进只偶尔运行的部分代码是愚蠢的。 现在,您已经完成编码,是时候启动分析器并查找那些热点了。 通常10%的代码90%的时间都在运行。 有时会有紧密的内部循环吸收99%的循环。 如果您现在可以标记它们,那么一些调整确实可以奏效。
删除调试工具
为了以防万一,很容易保留生产代码中嵌入的详细日志记录选项,但是一旦代码运行起来,就该清理这些工具并关闭调试选项了。 多余的数据会使计算机杂乱无章,甚至可能由于填满一些磁盘驱动器而威胁性能。 将调试排除在生产服务器之外。
用AI分析
老程序员使用基本的正则表达式和语句来查找问题。 现代程序员还拥有人工智能工具。 例如,据说亚马逊的CodeGuru “利用机器学习模型”来搜索不良代码。 这是一个基于分析和严格分析的全自动过程。
整理数据
在构建应用程序时,很容易理会数据库和日志文件。 现在您已经完成了该应用程序的工作,是时候开始针对速度和稳定性来优化数据库了。 在右列中添加索引以加快查找速度。 添加镜像并及时备份以提高断电或磁盘崩溃后的稳定性。
现在是时候权衡存储成本和数据丢失成本了。 日志文件到底有多有价值? 他们需要多少维护费用? 地理上不同的备份计划的成本与数据中心的灾难性故障发生的可能性有多少? 这些不是容易回答的问题,但是一旦您了解了备份成本,就可以决定要赌多少钱。 这就像去拉斯维加斯的一次付费旅行,只有随着职业和周围其他人的工作而掷骰子。
优化数据流
许多应用程序都可以从服务器上的高速缓存中受益,也可以通过内容分发网络在Internet上分布广泛。 添加分布式内存缓存或集成CDN是提高用户体验的最简单方法之一。
优化数据
并非所有的数据都需要尽可能大。 图像是减少尺寸而又不付出太多代价的最简单的方法之一。 精美的背景等样式细节可以由CSS指令代替,以进行渐变填充,而这些填充仅占用磁盘空间和带宽的一小部分。 摄影师和艺术家经常喜欢在需要时保留尽可能多的信息和细节,以RAW格式存储图像。 诸如ImageOptim之类的工具将去除用户感知阈值以下的许多不必要的细节,同时还删除跟踪相机镜头等多余信息的EXIF值。 结果是下载速度更快,带宽费用更低。
添加一个API
许多架构师从结构良好的API入手,用于将前端显示代码与下面的业务逻辑分开,但是有时有一个很好的机会通过添加另一扇门或窗户来扩展代码库的用途。 诸如Swagger之类的API工具箱通过提供解析,路由甚至文档提供了相对容易的操作。 如果您有一些不错的功能,可以干净地输入当前代码块的入口点,将它们胶合到新的API中可以启用用于自动化和集成的新选项。
捆绑到图书馆
您编写的某些代码作为已集成到其他项目中的库,将具有第二,第三或第四个生命。 优秀的架构师会期望其中的一些选项,并在开始时将代码分为库,但有时会在之后激发灵感。 将代码重构到库中是为工作赋予新生命的良好开端。
文件
哈哈! 今天的文件记录比以前不那么重要了,但是在正确的剂量下仍然有用。 如果您正在编写结构清晰的代码,并使用线索填充的变量名和简单的结构,则该代码将不需要很多本地注释。 但是,勾勒出每个部分的基本角色,或者指出数据如何流经代码,仍然很有帮助。 指出代码可能存在的一些问题,并说明代码如何从异常中恢复(如果有的话),这也很有帮助。
拆分为微服务
越来越多的建筑师将他们的宏伟愿景变成现实,并知道维护多个小型应用程序通常比维护一个大型应用程序容易。 开发人员可以同时进行不同部分的工作,分别进行编码和测试,然后再进行最终集成测试。 项目通常会随着时间的推移而增长,尤其是当您要在最后添加额外的功能时。 有时,当您接近终点线时,将作品分成小块的优势变得更加明显。
集装箱化
越来越多的代码在指定新源文件的容器映像中保存生命,并明确指出了需要哪些库和其他服务。 在某些情况下,制作此配置文件可能非常简单,但是有很多机会变得聪明。 一些团队喜欢将代码拆分为多个容器,以防某些情况可能单独使用。 通常,每个微服务都生活在其自己的容器中,但是可能会有它们共享的原因。 一些开发人员甚至提倡更极端的方法,例如为每个文档创建单独的容器 。 有足够的辩论空间。
部署到无服务器
现在无服务器计算选项变得越来越普遍,从代码中提取基本功能并将其部署到AWS Lambda或Azure Functions之类的无服务器平台可能是明智的。 帐单是通过通话计算的,因此,在没有传入流量的情况下,您无需为休假期支付任何费用。 如果您的代码已经很好地构建并且不需要任何本地状态,那么通常很容易从应用程序中提取业务逻辑并将其重新包装到无服务器系统使用的简单函数调用中。
部署到手机
现在,大多数优秀的Web应用程序都是为移动显示而构建的,它们通常在智能手机上运行良好,以至于创建独立应用程序的需求越来越少。 此外,网络并不会迫使开发人员跳过数十个障碍和评论,而只是被App Store或Google Play列出。 但是有时有充分的理由将基于Web的应用程序转换为本机iPhone或Android应用程序,并且有好几个好的工具可以通过将Web服务器包装为嵌入式版本的浏览器来简化转换过程。
纯粹主义者会争辩说,在嵌入式网页中运行JavaScript并不是真正的本机,并且他们认为对某些应用程序(例如激烈的游戏)的性能可能会落后,这是正确的,但是对于许多应用程序来说,这是将某些东西放入商店的最简单方法。 还有其他优点。 本地应用程序可以通过在本地缓存大量网站来更仔细地控制数据传输。 这样可以为开发人员和移动用户节省带宽,从而使交互速度更快,带宽费用更低。
移至网路
在大多数情况下,朝另一个方向发展并重新捆绑您的应用程序作为网站需要做更多的工作。 除非您使用为Web编码而设计的工具箱之一,否则您将很大程度上重写用Java,Swift或Objective-C编写的本机代码。 尽管如此,构建Web浏览器仍可以使您摆脱应用商店评论的专横,并且还可以使用相同的代码为台式机提供服务。
继续
一些聪明的程序员更名了重写代码的想法,因为“重写”一词听起来像是您第一次犯错。 “重构”具有更好的效果。 重构不允许先前的错误,这使得自我变得更容易。 改进代码的过程(通常只需一点点跳动)是在“完成”之后立即开始的一个好主意。 几乎没有什么改进和修复可以立即纳入代码中。
许多团队每天甚至每小时都在不断地重构,交付或部署新版本。 这些微小的变化本身看来并不重要,但是在数周和数月的时间里,它们共同构成了重大的改进。 迭代是如此频繁,以至于它们开始模糊完成代码与重新启动之间的界限。 这只是一个连续的改进和部署周期。
翻译自: https://www.infoworld.com/article/3530434/16-ways-to-improve-your-code-after-its-finished.html
代码改进