软件工程【I.2】个人作业:软件案例分析


项目 内容
这个作业属于哪个课程 2024年北航敏捷软件工程
这个作业的要求在哪里 个人作业:软件案例分析
我在这个课程的目标是 和志同道合的小伙伴一起开发出一款令自己满意也令市场满意,课程结束后还能维护下去的软件
这个作业在哪个具体方面帮助我实现目标 分析调研具体软件,为自己开发软件做准备

我本次调研的软件是 Manim Community,这是一款开源软件:GitHub - Manim Community

A community-maintained Python framework for creating mathematical animations.

调研和评测

软件简介

这个软件是一个 Python 命令行应用,该应用提供一个 Python 框架,用户通过编写 Python 代码生成数学动画视频。该软件也附有 vscode 插件可供使用。

该软件最初由 Youtuber 3Blue1Brown 制作。目前该软件有两个版本:一是 3b1b 自用版,另一个是社区版。本文评测的即为社区版:Manim Community v0.18.0

软件使用

我使用这个软件制作了的一个简短的有关分形几何的视频。以下是制作过程截图&最终视频gif。


软件分析

这是该软件的教程文档

该软件的使用流程为:打开自己习惯的 IDE 并编写 Python 代码,其中用于制作视频的类需要继承 manim.Scene 并重写 construct 方法,完成后打开命令行输入:manim <各种参数> <文件名> <类名> 等待视频制作完成即可。

如果用户使用 vscode,还可以安装 manim 插件,该插件提供一些简单的图形库(可以点击添加到代码中),还提供自动生成视频和预览。

由于该软件面向较为专业的用户,因此虽然该软件对新手非常不友好(从安装到使用都不友好),但是该软件很好的解决了用户的需求:其支持各种图形和 Latex,做出的动画也足够优雅和丝滑。

优缺点分析:

  • 该软件安装很复杂,除了需要安装 Python 环境外还要安装各种依赖,有需要时还需要 Latex。不过该软件提供了一个便捷的在线试用功能,用户可以使用其搭建 Jupyter Notebook 直接上手修改示例代码预览最终成品的效果。
  • 该软件根本没有 GUI 界面(vscode 插件提供的 GUI 界面可以忽略不计),因此需要较为专业的用户才会使用。
  • 该软件的准确度非常的高,由于该软件使用代码控制最终成品,所以用户有任何自定义的需求都可以自己编程轻松解决。
  • 该软件的专业用户体验很好(当然新手体验很差),该软件在 Github 上已经有 (社区版), (3b1b 版),足以证明其用户评价很高。

改进意见

我希望该软件能引入素材库社区,让社区中的人自愿将自己制作的动画模版或图形模版上传,让更多的人(甚至新手)都能够制作更高规格的动画。

用户调研

我采访了本系本年级其他软工教学班级的 YANNA 同学,她对制作动画很感兴趣,并且她也有 Python 编程基础。她希望制作一些短动画用于展示,使用 AE 这样的专业动画设计软件并不合适,因此她是 Manim 的潜在用户。

作为新用户,她在本次调研中使用了在线试用功能:
img
img

Q:使用软件的过程中会遇到的问题和亮点?
A:感觉很有趣,是我第一次接触用代码制作视频,如果是做一些的简单的演示视频,我觉得自己会有耐心好好学一下用法,但是如果是更复杂的例如做一些神经网络的动态演示视频,我可能会放弃这种视频制作方法,我会觉得学习成本有点高。但是它有一点很吸引我的是,视频做出来特别高级且流畅,是可以搬上答辩PPT演示的视频水平,而且不会像用Pr剪辑出现比较吃电脑配置的情况。

Q:从用户体验的角度来说需要改进的地方有哪些?
A:

  1. 能不能开发一个更友好的图形用户界面(GUI),使用户可以更轻松地创建和编辑动画,而无需直接使用代码。有Python编程基础的人还好接触上手,如果是这方面能力比较欠缺的,感觉会有点不友好。
  2. 有没有办法支持更多的交互式功能,如用户输入、拖放、动画控制等,使用户可以更灵活地与动画进行交互。有点像B站的那种互动视频一样。

采访截图:

评价结论

我给予该软件的评级是:d) 好,不错

理由:尽管该软件非常有用,但是其高昂的学习成本让普通人望而却步。

Bug 分析和提交

Bug 1:箭头指向的方向错误

测试环境:

  • OS: Mac Sonoma (with Apple M2)
  • Python Version: Python 3.12.2
  • Manim Version: Manim Community v0.18.0
  • FFMPEG Version: ffmpeg version 6.1.1
  • LaTeX Version: pdfTeX 3.141592653-2.6-1.40.26 (TeX Live 2024)

可复现性:必然发生

复现代码:

class Bug1(ThreeDScene):
	def construct(self):
		self.set_camera_orientation(phi = 70 * DEGREES, theta = -45 * DEGREES, zoom = 1.5)
		self.add(ThreeDAxes())
		arr1 = Arrow([0, 0, 0], [0, 2, 2], color = WHITE)
		arr2 = DoubleArrow([2, 0, 0], [2, 2, 2], color = RED) # Bug!
		self.add(arr1, arr2)

Bug 效果图片:

图中红色双向箭头的一端拥有错误的指向(但是白色单向箭头是正常的)

Bug 分析:

  • 成因分析:3D箭头的指向相关代码计算不当(尤其是摄像机位于不同方向的时候)
  • Bug 严重性:较为严重。3D箭头是非常常见的,而这个Bug非常容易发生(但有的箭头有这个问题有的又没有非常奇怪),Bug发生后需要用户自己使用代码调整或弥补。
  • 为什么不修复:测试覆盖度不够。且这是社区维护软件,开发者并没有足够时间修复。

Bug 反馈:

Bug 2:Latex 染色错误

测试环境:

  • OS: Mac Sonoma (with Apple M2)
  • Python Version: Python 3.12.2
  • Manim Version: Manim Community v0.18.0
  • FFMPEG Version: ffmpeg version 6.1.1
  • LaTeX Version: pdfTeX 3.141592653-2.6-1.40.26 (TeX Live 2024)

可复现性:必然发生

复现代码:

class Bug2(Scene):
	def construct(self):
		eq1 = MathTex(r'\int_1^n\frac{1}{x}=\ln{n}', tex_to_color_map={'^n': RED}) # Bug!
		eq2 = MathTex(r'\int^n_1\frac{1}{x}=\ln{n}', tex_to_color_map={'^n': RED})
		
		txt1 = Text("Unexpected:", font_size=30)
		txt2 = Text("Expected:", font_size=30)
		
		group = VGroup(txt1, eq1, txt2, eq2).arrange_in_grid(2, 2)
		group.scale(2)
		self.add(group)

Bug 效果图片:

期望积分上标 $n$ 被标红,但是上面那个式子的 1 被错误标红了。

Bug 分析:

  • 成因分析:MathTex 组件似乎会默认上标在前而下标在后,但如用户反过来写,则会在染色时发生预期以外的事情。
  • Bug 严重性:不严重。虽然这个 bug 容易触发,但是显然用户可以通过调整 Latex 表达式的顺序避免这个问题。
  • 为什么不修复:测试覆盖度不够。且这是社区维护软件,开发者并没有足够时间修复。

Bug 反馈:

工程分析

工程量分析

当前版本的 manim(Manim Community v0.18.0)共计有约 4 万行实际的 Python 代码(其中约 1 万行是示例和测试)和大约 2.5 万行 Python 注释,以及数万行文档,编写 manim 还需要掌握很多计算机图形学和几何学的知识,是一个非常庞大且复杂的项目。

3b1b 制作第一版 manim 距今已有 9 年之久,manim 社区版发布距今也有 4 年历史了。因此要完整实现目前 Manim 的全部功能绝对不是一个小小的软工团队能够在短期内做到的。但是实现其基础功能并具有高度可用性仍是可能的。

分解 Manim 的各项功能,需要的时间如下:

功能 介绍 工作量
Animations(动画) 过渡动画,渐入渐出,动态模糊等动画核心功能 6人月
Cameras(相机) 3D场景核心功能之一 3人月
Configuration(配置) 人机交互接口,负责控制软件各个行为 1人月
Mobjects(动画组件) 丰富的预制的图形,核心组件 18人月
Scenes(场景) 不同的坐标系和相机配置 4人月
Utilities(工具) 算法相关实现,视频输出接口等功能 12人月

按照上述粗略推断,一个 6 人的大学毕业生软工团队需要至少 1 年。

软件质量分析

纵观整个动画制作界,使用代码制作视频这种想法确实非常独特。因此由于该产品过于特殊而鲜有值得相提并论的竞品,因此完全值得评为第一名。

如果是对比专业动画制作软件(如 AE)又有一些不公平,毕竟不是同一赛道的软件,Manim 只适合数据/物理科普创作,适用于科学界,专业动画制作软件则适用于艺术创作。

至于相同赛道的竞品,我找到了 Reanimate 作为比较,那是一个类似功能的软件,只不过使用的编程语言是 Haskell。Reanimate 也是一个很出色的软件,可惜由于 Haskell 语言相比 Python 用户量太少(其实 Haskell 也有很多用户量,在 TIOBE 上排名约为 30),Reanimate 社区和用户量都远不及 Manim。

建议和规划

市场现状

  1. 市场概况:根据 Github 的 star 数量估计,Manim(包括社区版和3b1b版)大约不到 10 万。潜在用户或临时使用的用户则可能非常多。
  2. 竞争产品:就该软件来说,目前没有竞争产品,即便是和同类型的 Reanimate 也不是直接竞争关系,因为它们使用完全不同的编程语言。但是广义来说,其他可以制作数理科普动画的软件也可以称作该产品的竞品,但实际上他们没有任何潜在竞争关系。
  3. 产品定位:该产品专注于制作数学/物理科普视频,方向非常特定且单一,这也是这款软件最大的优势(专而精),同时也是最大的劣势(社区小)。

市场与产品生态

  1. 核心用户群:制作数学/物理科普视频的 Youtuber。
  2. 该产品已经形成一个非常固定的社区和用户生态,因为大多数从事数学/物理研究或科普工作的人都接触过 Python 和 Latex,因此 Manim 对他们来说就是最佳选择。

产品规划

  1. 目前产品已经非常完善,如果要新增一个革命性的功能,就需要为软件添加 GUI 编辑界面并实现代码和视频的双向编辑。如果该功能开发成功,将大幅度降低产品学习成本并吸收潜在用户,但是对现有用户的提升则有限(这也是该软件缺少此功能的原因,该软件由用户社区自愿维护,因此没有吸收新用户需求)。
  2. 如果我作为项目经理,可以招聘 6个人,并且有 16周 的时间,我会安排3~4人进行开发(研究如何做到代码和视频的双向编辑),1~2人测试(测试非常重要),最后留下1人兼职或全职美工即可(开发该软件的GUI界面并不需要华丽)。
  3. 16 周团队详细规划:
    1. (第一周)全队分析&了解现有代码设计
    2. (第二周)重点分析研讨 Manim 现有设计是如何标记物体位置的
    3. (第三周)决定选择何种方式实现双向编辑功能
    4. (第四周)决定双向编辑采用的数据保存方案
    5. (第五~八周)开发人员分别针对不同的 Scene 进行双向编辑改造,同时测试人员进行测试,美工可以开始设计和构思界面。
    6. (第九周)可以进行非 GUI 界面测试(通过修改数据文件等其他方式)
    7. (第十周)对接 GUI 界面和数据文件的更改接口
    8. (第十一~十二周)Alpha 测试,可以推广给潜在用户尝鲜
    9. (第十三~十四周)Beta 测试,向新用户和原有社区用户推广,观察用户反馈。
    10. (第十五周)根据反馈再次调整产品,完善测试和文档编写
    11. (第十六周)发布和项目总结,持续跟进原社区的更新

评论
  目录