如果我们现在接到一个任务,写一个排序算法,我想单个人用个记事本就够了。不过,排序算法不会单独存在,它更可能是大项目中的一小部分。例如,微软的office可能有几千万行代码, 这数量级的代码一个人是不可能做到的,为了构建大型程序,程序员会使用哪些工具和方法呢?
面向对象思想
通常我们会把大项目分解成更小的函数,可以让许多人同时工作,这样我们每个人不用操心整个项目,只要关心自己的函数就好了。比如说你的任务是写一个排序算法,你只需要确保它排序高效正确就可以了。
但是,仅仅把代码封装成函数是不够的,只是这样做的话,微软的office可能还有数十万个函数,这虽然比处理几千万行代码要好一些,但对于单个程序员或团队来说还是太多了。解决办法是把函数打包成层级分明的体系 ,将相关代码合并为对象。
例如,现在要开发一个汽车软件,其中功能可能有若干个和定速巡航相关的函数,假设有设定速度,加减速度,查看速度等等,这些函数都是相关的,可以包装成一个定速巡航对象。如下所示:
markdown
object 定速巡航对象
function1 设定速度
function1 加减速度
function1 查看速度
variable1 速度变量1
variable2 速度变量2
...
但是定速巡航 功能只是汽车引擎软件的一部分,其他功能可能还有火花点火功能,气门控制功能,驾驶模式选择功能等等,因此我们可以创建一个父对象,即引擎对象 ,包含所有子对象 , 除了子对象外,引擎对象可能有自己的函数,开启或关闭引擎等等,如下所示:
typescript
object 引擎对象
object 定速巡航对象
object 气门控制
object 驾驶模式选择
function 开启引擎
function 关闭引擎
...
然后引擎对象只是汽车对象的一部分,汽车对象还包括传动装置,车轮,车门,车窗等等。如下所示:
csharp
object 汽车对象
object 引擎对象
object 传动装置
object 车轮
...
现在作为程序员,如果我想对定速巡航进行设置,我需要怎么做呢?
我需要按照对象层级 从最外层对象一层层的深入,直到找到我需要的,最后找到想执行的函数 ,代码如下:
scss
Car.Engine.CruiseControl.setCruiseSpeed(80)
编程语言经常用类似的语法包装对象,而这种思想叫面向对象编程。
应用程序编程接口-简称API
对于汽车系统这样一个大型软件,我们把它拆分成一个个函数单元,团队中的一位程序员负责其中一些函数。
现在回到定速巡航的例子,它的代码要用到引擎软件其它部分的函数,来保持车速不变,但定速巡航团队不负责这部分代码,是另一个团队负责编写。 因为是其它团队写的代码,所以定速巡航团队需要文档帮助了解代码以及应用程序编程接口 -简称API。
API是程序员让多个模块协作互动的一种方式。例如在点火控制对象中,可能有设置发动机转数的函数,定速巡航团队需要用到这个函数,但他们对点火系统知之甚少,如果他们误调用一些不该被允许调用的函数,可能会出现意想不到的bug。
API允许正确的人有权使用正确的函数和数据,面向对象的语言让你指定函数的**public
或 private
**来做权限设置, 当函数标记为private
时,意味着只有同一个对象的其它函数才能调用它。
csharp
object 引擎软件对象
public function1
public function2
private function3
private function4
。。。
在上面这个例子中,只有引擎软件对象内部的其它函数,比如function1函数,才可以调用function3函数,另一方面,由于function1函数被标记为public,其它对象可以调用它。这种隐藏内部数据和复杂性的做法,以及有选择性地暴露出一部分功能,是面向对象编程的本质,用这种方式处理大型复杂项目非常有效,所以广受欢迎。
IDE
编写的代码在编译前就只是字母而已,正如前面提到的,可以在记事本或任何古老的文字处理器中写代码,但一般来说,现代的软件开发者会应用特定的工具来编程,它集成了很多有用的工具来编写,组织,编译和测试代码,集成了所有你需要的东西,所以它们又叫"集成开发环境",简称IDE。
所有IDE都提供了可以写代码的编辑器界面,以及附带一些有用的功能。如代码高亮来提高可读性,许多IDE还提供实时语法检查等等,总而言之IDE可以让开发者高效的组织并浏览代码。
IDE一般还可以直接编译代码以及运行代码,如果你现在写一段程序崩溃了,IDE可以定位到崩溃的那一行代码,并且提供额外信息去帮助你解决bug,这个过程叫调试(dubug)。 调试很重要,因为大多数程序员会花70~80%时间调试,而不是纯写代码。IDE里这些工具极大的帮助了程序员防止和发现错误,很多开发者拥有一款他们喜爱的IDE。
除了代码开发和调试,程序员工作的另一个重要部分,是给代码写文档,文档一般写在一个叫README 的文件里, 告诉其它程序员在深入研究代码前先看这个。代码文档也可以以注释的形式出现在源代码中【一般用/**/包裹注释文字】当编译代码时,注释会被忽略掉。
注释存在的唯一作用就是帮助开发者理解源代码,好的文档能帮助开发者在几个月后看自己的代码时快速理解。 而且对其他人也至关重要。我想重申一遍很糟糕的事情,就是别人给了你一大段代码,但没有任何注释或文档,结果你得逐行读代码,理解到底是干嘛的,别这样做。。。
源代码管理
除了IDE,还有一个很重要的软件可以帮助团队协作大项目,名叫源代码管理 ,也叫版本控制。在大型软件公司,通常都会把代码集中放到服务器上,叫代码仓库。
当程序员想修改一段代码时,他们可以checkout,一般这种操作可以直接在IDE里完成。接着我们可以在自己的电脑上编辑这段代码,添加新功能,测试功能是否正常。当我们觉得代码能正确运行了,所有测试都通过了,可以将代码放回代码仓库,以供其他人使用。
当一段代码被checkout,并可能正在被优化或改动,其他开发者就不会去动这一段代码,以此来预防代码冲突以及重复劳动。这样多名程序员可以同时编写代码,来建立庞大的系统。
重要的是,我们不希望有人提交错误的代码,因为其他人和团队可能依赖这些代码,导致他们的代码崩溃。存在服务器上的代码稳定版本 编译不应该出错,并且应该尽可能没有bug 。源代码管理软件可以跟踪所有的变化,如果发现bug,可以回滚到更早的稳定版本,源代码管理也会记录是谁修改了哪些代码。
大型软件开发除了稳定版本,通常还包括Beta版本 和Alpha版本 ,例如vue3版本发布。这两个版本都不建议在生产环境中使用。
Alpha版本是软件开发的早期阶段,通常仍然存在较多的缺陷和不完善的功能。这个版本通常是供内部团队或少数限定用户进行测试和反馈意见的阶段,以收集用户反馈并进一步改进软件。
Beta版本是相对于Alpha版本而言的后续阶段,意味着软件已经相对稳定,大部分功能已完善,但仍然可能存在一些问题和缺陷。这个版本通常会扩大测试范围,将其提供给更多的外部测试人员,以便更广泛地测试和发现潜在问题。
结束语
大型软件开发还有很多其它要素,例如代码测试等等,不过写下这篇文章主要是记录自己一个开发阶段的感悟,给工作和学习留下点痕迹。