73
社区成员




项目 | 内容 |
---|---|
这个作业属于哪个课程 | 2024年北航敏捷软件工程 |
这个作业的要求在哪里 | [I.3] 个人作业:结课总结 |
我在这个课程的目标是 | 了解熟悉并探索实践软件工程的基本思想 |
这个作业在哪个具体方面帮助我实现目标 | 总结本学期课程,并思考问题,了解软件工程的基本思想 |
第 2 章提到了测试和效能分析的方法,并介绍了 VSTS。但 VSTS 只能为 .NET 测试/效能分析吗?事实上,现在通常使用什么测试/效能分析工具?
由于本学期的团队软件工程开发了 Web 应用程序,本题目围绕 Web 应用程序开发的测试 / 效能分析工具回答。
单元测试
各个框架应该有相应的单元测试工具。例如:
Django 框架中有自带的单元测试工具:https://docs.djangoproject.com/en/5.0/topics/testing/overview/。
Vue 框架中自带的单元测试工具:https://cn.vuejs.org/guide/scaling-up/testing.html#unit-testing。
API 测试
如果使用了表现层状态转移(REST, Representational State Transfer)的 Web 软件架构风格(或者其他 Web API 或 Web 服务的解决方案,例如 SOAP 和 XML-RPC),那么往往需要管理并测试 API。
常用的 API 测试工具有 Postman 和 Apifox,这两款软件有共同的优点:
直观易用的用户界面
丰富的功能
集成与协作
广泛的支持
功能测试
一个例子是:Selenium 提供了一个回放工具,用于在大多数现代 Web 浏览器上编写功能测试,而无需学习测试脚本语言。
质量测试
一个例子是:Google Lighthouse 是一种开源自动化工具,用于测量网页质量。可以针对任何网页运行,无论是公共网页还是需要身份验证的网页。
SEO 测试
搜索引擎有时可能无法很好地帮助其他用户找到开发的 Web 应用程序,一个工具是:https://www.semrush.com/siteaudit/,可以对 Web 应用程序进行 SEO 分析。
书上说:
在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作解决问题的能力更强。两人合作,还有相互激励的作用,工程师看到别人的思路和技能,得到实时的讲解,受到激励,从而努力提高自己的水平,提出更多创意。
对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
在企业管理层次上,结对能更有效地交流,相互学习和传递经验,分享知识,能更好地应对人员流动。
总之,如果运用得当,结对编程可以取得更高的投入产出比(Return of Investment)。
而博客上说:
并不是所有的项目都适合结对编程,下面是一些不适合使用的例子。
1)处于探索阶段的项目,需要深入地研究,在这种情况下,一个人长时间的独立钻研是有必要的。
2)在做后期维护的时候,如果维护的技术含量不高,只需要做有效的复审即可,不必拘泥于形式,硬拉一个人来结对唱二人转。
3)如果验证测试需要运行很长时间,那么两个人在那里等待结果是有点浪费时间。
4)如果团队的人员要在多个项目中工作,不能充分保证足够的结对编程时间,那么成员要经常处于等待的状态,反而影响效率。
5)关键是如何最大限度地发挥“领航员”的作用,如果用处不大,也就无需结对。
维基百科上说:
管理者需要在工作更快的完成以及缩减测试和调试时间和更高的编码成本之间平衡。这些因素的相对权重在不同的项目、不同的任务之间也不同。对于那些程序员没有完全理解的任务上,程序员期待更多的创造性、挑战、以及高复杂度,此时使用结对编程最有帮助。[8] 在简单的,程序员都完全了解的任务上,结对编程导致生产力的净下降。[8][9]
在两个程序员工作时,两个程序员之间传递着知识。他们分享关于系统细节的知识,并且互相学习编程技巧。[2][10] 新的员工很快地获得团队的习惯,并学习到系统的细节。[11] “混杂结对编程”,即每个程序员轮流与团队中的所有其他程序员结对编程,而不是仅与某个程序员编程,使得系统的知识在整个团队中传播,减少了程序员离开团队带来的风险。[2]
结对编程通常会带来纪律和时间管理的提升。程序员在与结对的伙伴一同工作时,不太会忘记编写单元测试,花时间上网或处理个人电子邮件,[12] 或偷工减料。结对的伙伴“让他们保持诚信”。[13][14] 人们更不愿意打断两个结对编程的人,而单独工作的人却容易被打断。[15]
经过了结对编程作业,总得来说,我认为,需要使用结对编程的任务有以下特点:
复杂性:一个人完成容易写出 Bug,结对编程随时代码走查以保证代码质量。
困难的、难以理解的:结对编程可以传递经验,分享知识。
除此之外,结对编程可以带来纪律、激励、信心,但是这也与结对编程者的性格息息相关。例如,书上提出下述问题:
人和人不一样,在和别人合作的时候,要注意各人表达观点的方式和思考的方式不尽相同。请看网上关于MBTI的文章,测试并分享各自的MBTI类型,讨论不同性格类型对合作有多大的影响,在合作的各个阶段应该如何应对。
由此可见,是否结对编程还因人而异。
我们的课程主要关注敏捷开发,该书也是。但在“表6-3 敏捷的使用范围”时提及了另外两种开发方法:计划驱动和形式化的开发方法。它们是什么?
计划驱动开发 PDD, Plan Driven Development
计划驱动的开发是一种软件开发方法,它尝试规划和开发用户在最终产品中可能想要的所有功能,并确定如何开发所有这些功能。实际上,该行动计划是基于一组有序的特定任务级别的执行。
我们可以说,无论开发过程如何进行,它都是对软件工程的一种态度。它基于项目工程的管理方法和处理大型软件开发企业的旧式方法。它使管理计划的使用得以展开来衡量进度和制定项目决策。
计划驱动的开发项目制定了项目计划,包括可用资源、工作分解、工作完成时间表等。
优点
一开始就需要有知识的人员。
适用于大型软件开发/广泛的系统和方面。
有效控制危险系统。
适合稳定的生长环境。
通过建设和指导取得的成就。
缺点
不能随时提交变更。
每次重复或增加的距离更长。
应该认为,未来不会发生变化。
在创作的整个生命周期中缺乏用户参与。
对于动态扩展环境来说昂贵。
形式化方法 Formal Methods
在计算机科学中,形式化方法是用于软件和硬件系统的规范、开发、分析和验证的数学严格技术。
这一点我们已经充分实践,因为在面向对象课程中,我们学习过 Java 建模语言(JML, Java Modeling Language)。
形式化方法分为三步:规范、开发、验证。
在面向对象课程中,我们使用形式化方法,会在规范阶段花费大量时间,但是这确保了开发精确无误,适合用于关键领域的软件开发。
“8.3 获取用户需求——用户调研”中,提出了九个用户调研方法:
焦点小组 Focus Group
深入面谈 In-depth Interview
卡片分类 Card Sorting
用户调查问卷 User Survey
用户日志研究 User Diary Study
人类学调查 Ethnographic Study
眼动跟踪研究 Eye Tracking
快速原型调研 Quick Prototype
A/B 测试 A/B Test
这些用户调研方法有的易于实施,有的不易于实施;有的能捕获到用户的态度,有的能捕获到用户的行为。那么哪些方法更容易被互联网企业采用呢?
经过网络搜索,我了解了一些用户调研方法在现实中的使用。
用户调查问卷 User Survey
这种方法在生活中见得很多。个人而言,尤其是在一些游戏中使用。游戏需要调研对应的用户画像(哪些用户更容易游玩这款游戏,这样的用户平时玩什么其他游戏?有什么兴趣爱好),以及哪些地方满意/有新的需求。
可用性测试 Usability testing
是一项通过用户的使用来评估产品是否满足用户需求的技术,由于它反应了用户的真实使用经验,在用户体验中扮演了及其重要的一环。也就是说,实用性测试是指让用户使用产品(服务)的设计原型或者成品,通过观察,记录和分析用户的行为和感受,以改善产品(服务)使其更加贴近用户习惯。产品设计出来,大都可用,但是否贴近用户,实用和易用是测试的主要目的。
眼动跟踪研究 Eye Tracking
这种方法在生活中并不熟悉。通过网络信息,我了解到一些设计、排版类似的会使用眼动跟踪研究。或许这样更容易知道用户的目光首先注视到哪里,可以把重要的内容放在该位置。
深入面谈 In-depth Interview
同样,这种方法在生活中并不熟悉。通过网络信息,我了解到该方法对访谈员的专业素质要求较高,通常访谈者会根据研究目的,事先准备一些问题或者交流的方向。与用户调查问卷类似,其旨在调查用户画像或哪些地方满意/有新的需求。但深入面谈可以提供更长的时间,可以察觉到用户的态度。
焦点小组 Focus Group
焦点小组是用户研究项目中常见的研究方法之一,依据群动力学原理,一个焦点小组应由6~8人组成,在一名专业的主持人的引导下,以一种无结构或半结构的形式,对某一主题或观念进行深入讨论,从而获取相关问题的一些创造性见解。
第 12 章提及了用户体验。
其实,计算机软件的用户界面(User Interface, UI)和用户体验(User eXperience, UX)是一个有着丰富内容的学术领域,软件工程师们在长期工作中也积累了很多相关的经验。
我也写过一些应用程序,但是用户界面的设计使人苦恼。总是发现自己设计的页面比不上专业的网站(他们可能有一些网页设计师)。
但是,我编写程序的过程中,也发现了一些最佳实践,例如字体的大小、文字排版之类的。
经过网络搜索,我获得了一些最佳实践:
简洁性与一致性:保持界面的简洁和一致性是一个良好的UI/UX设计的基本原则。避免过度设计和过多的复杂元素,注重内容的重要性,让用户能够快速理解并与应用进行交互。同时,保持界面元素的一致性,如颜色、字体、图标等,可以增加用户的可预测性和舒适感。
易用性和可导航性:一个易用的界面可以降低用户的学习曲线,并提供流畅的导航体验。确保主要功能和操作可轻松找到,并使用明确的导航元素和指示,帮助用户快速浏览和访问所需内容。
可访问性:考虑到各种用户的需求和能力,确保你的前端应用具有良好的可访问性。使用无障碍标准和最佳实践,如正确的HTML结构、合适的文本替代品、清晰可辨的对比度等,使应用对于所有用户都可用。
响应式设计:随着移动设备的普及,响应式设计已经成为前端UI/UX设计的必备技能。确保你的应用能够适应不同屏幕尺寸和设备类型,提供一致的用户体验。使用媒体查询、弹性布局和可缩放的图像等技术,使应用能够在各种设备上呈现出最佳效果。
视觉吸引力:视觉设计在UI/UX中起着重要的作用。选择适当的配色方案、使用吸引人的图像和图标,以及注重排版和布局的美观性,可以增加应用的吸引力和用户的参与度。
反馈和动画:为用户提供及时的反馈和动画效果可以增强用户体验。使用合适的动画效果来引导用户,提供操作结果的反馈,并确保用户知道他们的操作正在被处理。
用户测试和反馈:与用户进行测试和获取反馈是优化UI/UX设计的重要步骤。通过与目标用户进行交流、进行用户测试和分析,了解他们的需求和行为,以及获取实际的用户反馈,可以帮助你发现潜在的问题并改进设计。
持续改进:UI/UX设计是一个持续改进的过程。定期审查和评估你的设计,根据用户反馈和数据分析进行调整和优化。不断关注行业的最新趋势和最佳实践,保持对新技术和设计模式的学习和更新。
然而,经过了一个学期的探索,我发现了,一个美观的 Web 应用程序,需要选择使用前端框架和 UI 组件库。
前端框架
Bootstrap 是最流行的前端框架,封装了媒介查询、元素定位、元素样式重置、布局、UI 组件等功能。
UI 组件库
例如:
Tailwind UI
Ant Design
UI 组件库提供了丰富的 UI 组件。
需求
知识点:需求分析
在软件工程的团队作业中,我们采用了用户调查问卷的方式进行用户调研,但实际上,可能还需要结合其他用户调研方式。
设计
知识点:功能规格说明书和技术规格说明书
功能规格说明书和技术规格说明书分别考虑了项目的需求和可行性。只有需求可行才能考虑实现。
实现
知识点:Django。
Django 是一个高级 Python Web 框架,鼓励快速开发和简洁、务实的设计。经过实践,我认为 Django 本身并不对 REST 风格提供充足的支持,因此可能需要使用 Django REST Framework 来实现更高效的开发。
测试
知识点:单元测试、API 测试和功能测试。
在单元测试阶段,我使用了 Django 内置的单元测试框架;在 API 测试阶段,我们使用了 Apifox 测试平台进行测试;在功能测试阶段,我们使用浏览器访问 Web 应用程序。
发布
知识点:软件发布生命周期
软件发布生命周期是开发、测试和分发软件产品的过程。在最终版本或“黄金版本”向公众发布之前,它通常由几个阶段组成,例如 pre-alpha、alpha、beta 和候选版本。在本次软件工程的团队开发中,我们进行了 alpha 和 beta 阶段的开发。
Alpha 阶段是软件测试的第一阶段。在此阶段,开发人员通常使用白盒技术来测试软件。然后由另一个测试团队使用黑盒或灰盒技术进行额外的验证。
Beta 阶段是软件测试的下一个阶段。Beta 测试的重点是减少对用户的影响,通常包含可用性测试。
维护
知识点:纠错性维护
纠错性维护(Corrective maintenance)修改软件以修复错误或其他无法满足要求的问题,通常由客户报告。
尽管进行了测试和质量保证,但实际上所有软件都包含系统无法按预期工作的错误。当发现这些错误时,需要进行发布后维护来修复这些错误。
个人项目
对于个人项目,考虑到未来项目的维护(有可能需要阅读很久之前的代码,也有可能交由其他人进行维护),仍然需要考虑代码的可读性。采用易于理解的变量名,编写注释和单元测试是必要的。
结对编程
值得注意的是,并非每个任务都适合采用结对编程的开发模式。
需要使用结对编程的任务有以下特点:
复杂性:一个人完成容易写出 Bug,结对编程随时代码走查以保证代码质量。
困难的、难以理解的:结对编程可以传递经验,分享知识。
除此之外,结对编程可以带来纪律、激励、信心,但是这也与结对编程者的性格息息相关。例如,书上提出下述问题:
人和人不一样,在和别人合作的时候,要注意各人表达观点的方式和思考的方式不尽相同。请看网上关于MBTI的文章,测试并分享各自的MBTI类型,讨论不同性格类型对合作有多大的影响,在合作的各个阶段应该如何应对。
由此可见,是否结对编程还因人而异。
团队开发
对于团队项目,尤其要注意个人与个人之间的合作。为了协调个人与个人之间的合作,往往需要考虑一些问题:
实现协调
工作分配(例如,需要采用合适地方法评估某个任务所需要的工作量)
进度管理(包括个人进度管理和团队进度管理)
在实践中,我们的项目由项目管理者管理,分为前端和后端团队(实际上可能还包括运维、测试等),各个团队又分别由团队的管理者管理。这是因为各个团队的管理者了解各个团队的工作,易于进行工作分配等。
除此之外,在团队开发中,我们还采用了敏捷软件开发的开发模式。