【计算机科学速成课】[40集全/文字版] - 16.软件工程

(。・∀・)ノ゙嗨,欢迎阅读计算机科学速成课!

之前花了很多时间讲排序,也写了些10行左右的排序代码,对1个程序员来说很容易写,而且代码很短,不必用专门工具,记事本就够了,真的!但排序算法很少会是独立程序更可能是大项目的一小部分,举个例子,微软的Office大约有4000万代码,4000万!太多了,一个人不可能做到,为了写大型程序,程序员用各种工具和方法,所有这些形成了"软件工程"学科,这个词由工程师MargaretHamilton创造,她帮助NASA在阿波罗计划中避免了严重问题

她曾说过:,"有点像牙根管治疗:你总是拖到最后才做但有些事可以预先做好,有点像预防性体检只不过是预防软件出错"。第12集提过,把大项目分解成小函数可以让多人同时工作,不用关心整个项目,关心自己的函数就好了。如果你的任务是写排序算法,你只需要确保高效和正确就可以了。然而把代码打包成函数依然不够,如果只是这样,微软Office会有几十万个函数,虽然比4000万行代码要好一些,但还是太多了。解决办法是:把函数打包成层级把相关代码都放在一起,打包成对象(objects)例如,汽车软件中可能有几个和定速巡航有关的函数,比如设定速度,逐渐加速减速,停止定速巡航,因为这些函数都相关,可以包装成一个"定速巡航对象",但不止如此,我们还可以做更多

"定速巡航"只是引擎软件的一部分,可能还有"火花塞点火""燃油泵"和"散热器",我们可以做一个"引擎对象"来包括所有"子"对象,除了子对象,"引擎对象"可能有自己的函数,比如开关引擎,它也会有自己的变量,比如汽车行驶了多少英里。总的来说,对象可以包其它对象,函数和变量,当然,"引擎对象"只是"汽车对象"的一部分,还有传动装置,车轮,门,窗等,作为程序员,如果想设"定速巡航",要一层层向下。从最外面的对象往里找,最后找到想执行的函数:编程语言经常用类似这样的语法,把函数打包成对象的思想叫"面向对象编程"。这种思想和之前类似,通过封装组件,隐藏复杂度,之前把晶体管打包成了逻辑门,现在软件也这样做,又提升了一层抽象!

把大型软件(如汽车软件)拆成一个个更小单元,适合团队合作,一个团队负责定速巡航系统,团队里的一位程序员负责其中一些函数。类似建摩天大楼,有电工装电线,管道工配管,焊接工焊接,油漆工涂油漆。还有成百上千人做其他事情,在不同岗位同时工作,各尽其能,直到整栋楼完成。回到定速巡航的例子,定速巡航要用到引擎的其它函数,来保持车速,定速巡航团队不负责这些代码,另一个团队负责,因为是其他团队的代码,定速巡航团队需要文档帮助理解代码都做什么,以及定义好的"程序编程接口"简称API。API帮助不同程序员合作不用知道具体细节,只要知道怎么使用就行了

例如"点火控制"对象中,可能有"设置发动机转数"函数,"检查火花塞电压"函数,"点燃单个火花塞"函数,"设置发动机转速"非常有用。"定速巡航"团队要用到这个函数,但他们对点火系统不怎么了解,让他们调用"点燃单个火花塞"函数,不是好主意,引擎可能会炸!可能啦,API控制哪些函数和数据让外部访问哪些仅供内部,"面向对象"的编程语言可以指定函数是public或private,来设置权限,如果函数标记成private,意味着只有同一个对象内的其他函数能调用它。

在这个例子里,只有内部函数比如setRPM,才能调用fireSparkplug函数,而setRPM函数是public所以其它对象可以调用它,比如定速巡航,"面向对象编程"的核心是隐藏复杂度,选择性的公布功能。"面向对象"的核心是隐藏复杂度,选择性的公布功能,因为做大型项目很有效,所以广受欢迎,计算机上几乎所有软件,游戏机里几乎所有游戏,都是"面向对象"编程语言写的,比如C++、C#、Objective-C等

其他流行OO语言,你可能听过Python和Java,有一点很重要:代码在编译前就只是文字而已,前面提过,你可以用记事本或任何文字处理器。有人确实这样做,但一般来说,现代软件开发者会用专门的工具来写代码,工具里集成了很多有用功能帮助写代码,整理,编译和测代码,因为集成了所有东西。因此叫集成开发环境,简称IDE,所有IDE都有写代码的界面,还带一些有用功能,比如代码高亮,来提高可读性,许多IDE提供实时检查,比如拼写。大型项目有很多源代码文件,IDE帮助开发者整理和看代码,很多IDE还可以直接编译和运行代码,如果程序崩了,因为你还没写完呢。IDE可以定位到出错代码,还会提供信息帮你解决问题,这叫调试(debug)

调试很重要,大多数程序员会花70%~80%时间调试,而不是在写代码,好工具能极大帮助程序员防止和解决错误。很多开发者只用一款IDE,但承认吧,VIM才是最棒的编辑器,如果你知道怎么退出的话。除了写代码和调试,程序员工作的另一个重要部分是给代码写文档,文档一般放在一个叫README的文件里,告诉其他程序员,看代码前先看这个文件。文档也可以直接写成"注释",放在源代码里,注释是标记过的一段文字,编译代码时注释会被忽略,注释存在的唯一作用就是帮助开发者理解代码。好文档能帮助开发者几个月后理解自己的代码,对其他人也很重要

我想花一秒再强调一下注释很重要,最糟糕的就是拿到一堆代码,没有任何注释和文档,结果得逐行读代码,理解到底干嘛的。我是认真的,别做那种人,文档还可以提高复用性。与其让程序员一遍遍写同样的东西,可以直接用别人写好的来解决问题,读文档看怎么用就行,不用读代码,"读文档啊"。除了IDE,还有一个重要软件帮助团队协作,源代码管理,也叫"版本控制",苹果或微软这样的大型软件公司,会把代码放到一个中心服务器上,叫"代码仓库"。

程序员想改一段代码时,可以checkout,有点像从图书馆借书,一般这种操作,可以直接在IDE内完成。然后开发者在自己的电脑上编辑代码,加新功能,测试,如果代码没问题了,所有测试通过了,可以把代码放回去,这叫提交(commit)。当代码被checkout,而且可能被改过了,其他开发者不会动这段代码,防止代码冲突和重复劳动,这样多名程序员可以同时写代码,建立庞大的系统,重要的是,你不希望提交的代码里有问题因为其他人可能用到了这些代码,导致他们的代码崩溃,造成困惑而且浪费时间

代码的主版本(master),应该总是编译正常,尽可能少bug,但有时bug还是会出现。幸运的是,源代码管理可以跟踪所有变化,如果发现bug,全部或部分代码,可以"回滚"到之前的稳定版。"源代码管理"也记录了谁改了什么代码,所以同事可以给你发讨厌的,我是说"有帮助的"邮件给写代码的人。写代码和测代码密不可分,测试一般由个人或小团队完成,测试可以统称"质量保证测试",简称QA,严格测试软件的方方面面,模拟各种可能情况,看软件会不会出错,基本上就是找bug

解决大大小小的错误需要很多工作,但对确保软件质量至关重要,让软件在各种情况下按预期运行,你可能听过"beta版"软件。意思是软件接近完成,但不是100%完全测试过,公司有时会向公众发布beta版,以帮助发现问题。用户就像免费的QA团队,你听过比较少的是beta版之前的版本:alpha版本。alpha版一般很粗糙,错误很多,经常只在公司内部测试,以上只是软件工程师用的工具和技巧的冰山一角,它们帮助软件工程师制作令人喜爱的软件,如YouTube,GTA5和PPT等等。如你所料,这些代码要强大的处理能力才能高速速度运行,所以下集讨论,计算机怎么发展到如今这么快,到时见

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值