突然资讯网
首页 >> 科技 >> 正文

2020,我将介绍我学习到的最有价值的20条准则,20,经典的软件工程书籍

日期:2021-01-22 14:08:58 来源:互联网 编辑:小狐 阅读人数:17

CSDN编者按每个人在工作中,工作内容不同,得到的收获和教训也不同。而及时的总结,给自己反馈,则会在下一步的工作中得到印证。

出品 CSDN(ID:CSDNnews)

2020,我将介绍我学习到的最有价值的20条准则,20,经典的软件工程书籍(图1)

2020年是我正式成为软件工程师的第一年,也是我在旧度过的第一年。受疫情的影响,我没有太多机会去探索这座新城市,只能呆在家里练习烘培技术和刷剧。然而,事情也有好的一面,我有大量的时间宅在家里做自己的项目。这一年里,我学习了很多有关软件工程的最佳实践,在本文中,我将介绍我学习到的最有价值的20条准则。

提高代码的可读性

再举一个例子,网上有很多一行代码的解决方案。例如,如下判断回文数的写法非常聪明(注:回文数指的是像 14641 这样“对称”的数,即:将这个数的数字按相反的顺序重新排列后,所得到的数和原来的数一样)

defisPalindrome( self, x:int)-> bool:

a=liststrx

returna==a【 :-1】

但是,非常难以理解。一行代码的解决方案很有性,不建议在多人共同维护的代码库中采用这种写法。

重构的价值

你可以考虑,将不紧急的重构分配给新来的团队成员练手,这样他们不但有机会学习,同时也能贡献价值。

将技术负债视作财务负债,可以适量承担一些

有时,从业务的角度出发,尽快有价值的功能可以获取更大利益,比如赶在竞争对手发布类似的功能之前,即使这个时候的功能还不够完美也没关系,只要你可以建立计划,赶在债台高筑,被“利息”压得透不过气来之前,及时地改善代码。如果技术负债的积累速度超过你的偿还能力,那么就会出现问题,代码库的处理难度就会越来越大。

例如,在时间紧迫的情况下,在完成之前就发布某项功能也可能是正确的业务决策,但是事后你需要立即补上。如果你拖延,很快这些未的代码之上就会出现新的代码,未经就发布的功能也会相继出现,那么偿还这部分技术负债的难度就会越来越大,很难再还给团队一个维护良好的代码库。

不要制造惊喜

团队成员会假定你的代码遵循常见的惯例,所以你不应该偏离这些惯例,不要给他们制造惊喜。

例如,如果你编写了一个函数 isButtonEnabled,那么团队成员肯定会假定这个函数是在检查某个按钮,它会返回一个布尔值,因为绝大多数的这类函数名称都以“is-”开头。如果你的函数还做了其他处理,那么就应该在名称中澄清。

命名的长度应该视范围而定

例如,for 循环中可以使用 i 和 j 之类的变量名,但是全局常量的名称应该更加精准地表达它的意图。

函数也需要保证可读性,而不仅仅是为了避免重复

一般,我们常说重复三次以上的代码都应该写成函数,但我还想再加两点应该写成函数的情况:1)当需要添加注释解释这段代码的用途的时候;2)当嵌套超过3层的时候。

举个例子,假设我编写了下列UI函数:

funsetupViews

// set up textView

textView.isVisible = …

textView.text = …

more textView setup…

// set up imageView

imageView.image = …

imageView.backgroundColor = …

more imageView setup…

重复的呈现形式有很多种

DRY(Dont repeat yourself,不要重复你自己)是一个众所周知的软件工程原则。一般,最常见的重复就是完全相同的代码,但是也有一些重复的形式并没有那么明显,例如实现的重复。

举个例子,对于如下定义的类:

classTreeNode

valvalue: String

varchildren: List

valisLeaf: Boolean

funaddChild(node: TreeNode)

children.add(node)

isLeaf = false

funremoveChild(node: TreeNode)

children.remove(node)

if(children.isEmpty) isLeaf = true

其实,你不需要在每次 child 的时候设置 isLeaf, 你可以添加 fun isLeaf = children.isEmpty,如此一来,在这个类的时候,你就无需检查 isLeaf 是否被了。

不要重复其他人的工作

在实现某个功能之前,首先你应该先检查一下代码库中是否已有现成的实现。

例如,你需要处理时间,常量 SECONDS_PER_MINUTE 可能已经存在了,你可以直接重用,而不应该在同一个代码库中多次定义这个常量。

学习并遵守项目的编程风格

一套统一的指南可以方便团队成员理解彼此的代码,也可以方便新来的成员。通常,实际的规则并不重要,重要的是你需要确保这些规则被贯彻执行了。例如,我曾见过一些 Kotlin,所有包含扩展函数的文件名都以“-Ext”结尾,而其他文件则使用“-s”结尾。实际的选择并不重要,重要的是所有人的选择必须统一,只有这样程序员才知道哪里能找到 Foo 的扩展函数,是在 FooExt.kt 中还是在 Foos.kt 中?

通过 lint 规则提升代码的整洁度

如果你在项目中使用了lint工具,而且你经常手动调整格式,或者在代码审核时经常有人提出格式方面的建议,那么就应该考虑一下增加一条新的lint规则。

学习使用 IDE

现代 IDE(比如Android Studio 和 VSCode)非常强大。你应该学习如何使用 IDE 的各种小工具(比如调试器)以及键盘快捷键,虽然这需要投入一定的时间,但从长远打算来看能够为你节省很多时间。

注释应该解释原因,而不是实现方式

理想情况下,代码应该不言自明,不需要添加注释。程序员在修改代码的时候,经常忽略注释,时间久了,注释就会不准确,与实际的代码大相径庭。在你打算写注释,解释代码的功能时,不妨考虑一下重构代码,让代码不言自明。

然而,仅靠代码自身还不足以解释为什么你选择这种方式。注释可以上下文,比如帮助你做出决策的产品需求、限制或出于效率的考虑。

不要将代码视作二等公民

在编写生产代码的时候,你可能需要花点时间计划代码,确保在功能发布之前达到良好的品质,但是程序员通常都会忽视代码,只要能正常运行就可以了。然而,代码也需要维护,如果这些代码很难理解,那么就会增加维护的负担。

部分问题是代码一般都不需要经过严格的审核。大家会花费大量时间审核生产代码,却觉得代码没这个必要,因为毕竟已经通过了。

表格驱动

在常规单元中,通常每个输入只有一个函数。最后会导致很多函数都有重复的代码,而且很容易漏掉一些输入。表格驱动有一个单独的函数,还有一个表格囊括了所有可能的输入以及预想的输出,只需要一个函数,就可以所有输入。

采用新库有风险

每个库都有预发布的版本,很有可能会已有的功能。

在新发布的库中,易于可能是次要考虑因素,如果你想在大型项目中采用新库,事先必须验证这些库是否能够通过你的代码,并兼容生产代码。

在社区广泛采纳某个库之前,遇到问题时,很难找到资源。而且可能这个库永远也不会被广泛采纳,项目本身也会被维护人员遗忘。

对于有些库,看似每个人都在使用,但是真正的项目中采用了这些库吗?还是说只是出现在演示程序中?

向团队成员寻求帮助时,应该注意他们的方法,而不只是解决方案

注意团队成员使用的资源和工具,如果将来再遇到类似的问题,你能够更好地武装自己,靠自己的力量解决问题。发现新的资源和工具都很有价值,比如文档资源、Git命令、键盘快捷键等。

审核人员对代码变更感到不解或产生误解,则说明代码有问题

按照自己喜欢的方式学习

上大学的时候,除了课堂上的学习之外,你的知识主要来自自己的业余项目,在找工作的时候,这些经验会帮助你脱颖而出。但是,在之后的工作中,如果你想跳槽,则与自己的业余项目相比,实际工作项目的经验更能赢得面试官的青睐。

任何人都可以通过互联网发表技术博客文章。如果你打算通过某篇博客文章学习新技术,却发现其中的内容不太合理,那么可能只是因为文章本身写的不怎样,你不必就此放弃,而是应该尝试其他资源。

的资源和教程通常都是很好的切入点。会议演讲以及公司的技术博客的质量一般也都比较高,因为这些资源都经过了严格的。

最后

说到学习资源,以下是我常去的一些网站,本文提及的很多准则也正是来自这些资源:

Refactoring Guru:一个网站,介绍了如何编写和重构整洁的代码。

Clean Code:经典的软件工程书籍。有些内容有点过时,而且还与Refactoring Guru有重叠,但是仍然值得一读。

Android Weekly newsletter:一份周刊,精选了很多技术文章、播客以及演讲。仅限于Android,但是其他平台也有类似的周刊。

Yelp Android school:科技演讲GitHub存储库。有一半是Android为主,还有一半讨论的是软件工程。

☞滴滴开源的损失!章文嵩将离职,曾是阿里开源“赶集人”投身开源 20 年

☞ 红帽急了:新年的 RHEL 将有低成本或免费版

点收藏

本文相关词条概念解析:

代码

代码就是程序员用开发工具所支持的语言写出来的源文件,是一组由字符、符号或信号码元以离散形式表示信息的明确的规则体系。代码设计的原则包括惟一确定性、标准化和通用性、可扩充性与稳定性、便于识别与记忆、力求短小与格式统一以及容易修改等。源代码是代码的分支,某种意义上来说,源代码相当于代码。在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码的最终目的是将人类可读的文本翻译成为计算机可以执行的二进制指令,这种过程叫做编译,它由通过编译器完成。

网友评论