首先道歉一下,因为个人原因,没有认真阅读课程的相关文件,没能够及时记录自己在本门课程特别是实验环节的学习记录。对于课程的相关问题,也没有好好去思考。说白了,脑子跟不上的同时,实践还没有拼尽全力。大家一样经历着疫情,为什么我不行,这是我之后学习需要关注的地方。 其次,这一段是对接下来一系列博客的一个总体说明。我在课程中的四次实验,完成的水平和内容都可以用悲惨来描述。在这里,对批改我实验的助教老师们表示歉意。那么言归正传,后续的博客将是对本学期我的学习过程的一个回顾,而本人资质有限,大概并不会做太多的内容出来,会有一些自己原创的内容(当然,经验往往是相似的,我只是茫茫人海中同质化的小小一员,我会尽力用自己的方式来表达的)并且也许会有相关的文档的翻译内容,这得看之后的复习情况了。平时没有写博客的习惯(但是博客的表达是实实在在的5分啊,XD),不周到的地方,各位看官多多包涵。 本篇将是期末前这个博客系列的开篇。接下来主要讲实验之前,关于课程内容,我个人的一些想法和理解,约2200字,作为一个内容的概括,字数不少,思想不多甚至很匮乏。辣了眼睛请多多包涵。
从课程的第一天,老师就强调了软件构造这门课的实际意义。高校的学生,不是所有人都能够很好地对接产业和科研,学部希望通过这门课,给学生们一个对未来发展的认识的机会,对更多的学生负责,并希望我们能够借这个机会在原先的学习规划中加入新的内容。 一个商品软件,它往往是循环开发的:出现一个想法 → \rightarrow →出现一个需求 → \rightarrow →给出一个设计 → \rightarrow →确定一套要求 → \rightarrow →完成一次生产 → \rightarrow →进行一系列测试并最终集成 → \rightarrow →使用并持续监督与维护 → \rightarrow →出现新的想法 而软件在这些不同状态中,我们从不同的方面看待软件所带来的效果是不同的。研究软件构造,似乎就是在研究软件在生命周期的不同时期的状态以及状态之间的转化过程。 以上是我对本门课的一个基本的认识。
软件构造是一个从无到有(源代码)、从代码(低层次)变成组件(高层次)、从构造(实验环境下的正确性)到运行(实际使用中的正确性)的过程。 看待软件的角度,我们也可以按照上面的区别来划分:时刻对应时段、代码角度对应组件角度、构建视图对应运行视图。一个简单的数学计算,三个方面的六个角度构造了一个有八个卦限的坐标系(请脑补,XD),软件的生命循环就在这八个卦限中流转。我们关注的不止是流转的关系,也要关注状态的内容。 构造阶段和运行阶段的区别是坐标系中的主向量,它们的大区别下有着如下的小区别:
从代码层次的视角来看,这意味着关注代码的函数、类、方法和接口及其间的依赖关系,即代码的逻辑组织。 从组件层次的视角来看,这代表着文档、目录、包和库及其间的依赖关系,即代码的物理组织。 站在时刻上看,这关乎源代码和组件在特定时刻的表现形式。 站在时段来看,这代表着软件形态在时间过程中的演化或转变。
软件是商品,影响用户的质量因素我们称为外部质量因素;对应地,影响软件本身和开发者地质量因素为内部因素(客户不在乎的部分XD)。因素之间可能对立可能合作,比如:高效和安全的冲突;可扩展性和可复用性的合作。 最终,我们希望得到一个权衡之后最适合客户的产品,这是软件构造这门课希望我们能够学到的。
外部因素是最重要的方面:正确性、健壮性、可扩展性、可复用性、兼容性、同构性、高效性、可移植性、易用性、功能数量度、及时性以及其它特性(商用软件的可验证性、完整性、经济性等0)。 内部因素是不受重视但合作的开发者原因持之以恒追求的内容:可读性、可理解性、清晰结构、合理大小等。
先说短的,内部因素中,可读性和可理解性我想是为了程序的维护和检错而设计的,它们的保证意味着程序更容易维护和检查错误,人毕竟不是机器。 再说长的,外部质量里,冲突就很丰富了:优化效率性往往是根据平台的特性进行的,那么就会与可移植性冲突;可扩展性往往需要时间去高度抽象,那么势必与及时性有所矛盾;再如完整性,保证软件的完整,那么意味着对插件的不友好,而方便的插件又会增长易用性。 这些冲突都是在软件的构造过程中会遇到的,开发者需要做出妥协来平衡这些特性,以保证软件产品最终可用。妥协意味着向权高的性质倾斜,那么谁的权高? 公认的一些重要因素:正确性、健壮性、效率性、可扩展、可复用。 前三个是必须的,客户忍受不了一个疯狂出错(我的糟糕代码会出现)、一触即碎(再次辱我)、耗时漫长的软件(此处辱法,曾经有法国公司为政府开发软件,结果某个命令42分钟后才完成反馈,测试人员按照故障报错,最终弃用)。后两个是为了软件的生命更长而准备的,可扩展和可复用意味着一份代码只需要进行修补就可以完成更多的工作。
对象好,可惜我没有,从面向过程编程到面向对象编程的转变我还没有适应,课程实验也是十分遗憾的。下面给出一张图,来说明面向对象好在哪:
从实验中的总结,本门课程涉及了:对代码可读性的训练、对可复用性的尝试、对正确性和健壮性的探索。而没有对于高效性的追求。 而实际上可以归结五个关键属性是需要在软件构造中涉及:容易理解、随时准备改变、经济开发、错误安全、效率能跑。