软工个人作业 -- 分析与提问
软工个人作业 – 分析与提问
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | 2023 年北航软件工程 |
| 这个作业的要求在哪里 | 个人作业-阅读和提问 |
| 我在这个课程的目标是 | 了解软件工程的方法论、获得软件项目开发的实践经验、构建一个具有我的气息的艺术品 |
| 这个作业在哪个具体方面帮助我实现目标 | 初步了解软件工程的内涵和内容,为下一步的实践提供了一定的理论基础。对于深入浅出的文风有了一个更深刻认识 |
软件工程不能只有干巴巴的原则,“人”才是工程的最重要因素。
—— 读《构建之法》有感
问题 1:
| 条目 | 内容 |
|---|---|
| 问题 | 单元测试是要在写技术模块的规格说明书的时候就要写好吗? |
| 定位 | P25,第二章,小飞与阿超对话 |
| 原因 | 对推理过程有疑问 |
阿超:在写技术模块的规格说明书 ( Specification ) 的时候 , 要越详细越好 , 最好各项要求都可以表示为一个单元测试用例 。
小飞:如果不能表示为一个单元测试用例呢 ?
阿超:那就是你写得还不够细。
按照书中的说法,单元测试用例似乎是需要在进行具体编码之前就要完成,如果是这样的话,那么基本上可以推断,单元测试是“功能”粒度的。但是在实际编程的过程中,程序员会将功能以一种“不确定“的方式进行细分,比如说对于输出 Hello, world 的功能
实现一
#include<iostream>
using namespace std;
int main()
{cout<<"Hello,World!"<<endl;return 0;
}
实现二
#include<iostream>
using namespace std;
void print1()
{cout << "Hello," << end;
}void print2()
{cout << "World!" << endl;
}int main()
{print1();print2();return 0;
}
在实现一中一个主函数就可以完成的事情,在实现二中变成了独立的两个函数。按照原文的意思,我们需要针对 “hello, world!” 的输出编写一个单元测试样例,那么如果在具体编码的时候,程序员采用实现二去实现代码,那么其实“单元测试”并不是“单元”的,它并没有测试每一个函数的功能。但是如果在编码前就“未卜先知”的编写了这两个函数的功能样例,这无疑又限制死了 Hello, world! 程序的其他版本的实现,换句话说,单元测试的书写限制了代码的可能性。
针对这个问题,我个人的理解是不应当让“单元测试”成为编程中的“金科玉律”,它应当像画家起稿时用的辅助线,随着作品的进行不断调整,而不是让编程的过程了无生趣,成为了为了迎合“单元测试”而不得不进行的“苦力活”。
在 Rails 中,单元测试是可以根据所书写的方法自动生成的,我们只需要调整单元测试的用例即可,单元测试是“伴随”编程过程进行的,而不是“先写测试,后编程”这种泾渭分明的方式。
问题 2:
| 条目 | 内容 |
|---|---|
| 问题 | 软件工程是否在异化编程的人? |
| 定位 | P57,第三章,关于单人乐队的讨论 |
| 原因 | 因为自己的假设和书中的不同 |
当一个小孩说长大了要做音乐家,你会让他走上单人乐队的道路么 ?
这是出现在书上的一个反问句,在这句话中表达了作者对于“单人乐队”的不赞同观点,引申出作者对于某种“全面人才”的批判,相反的,据我了解,作者可能更加赞同的是“作曲家”式的“全面人才”:
一个作曲家在写一首交响乐的时候,他可以写各个乐器的乐谱,充分发挥不同乐器的特点。
确实,似乎单人乐队与作曲家相比,显得并不是那么的专业,这突然让我想起了马哲课上对于“异化”的定义:
在异化活动中,人的能动性丧失了,遭到异己的物质力量或精神力量的奴役,从而使人的个性不能全面发展,只能片面发展,甚至畸形发展。
社会分工固化是异化的根本根源。
然后我就查询了一些更加近代的观点,比如近代哲学家卢卡奇的观点
这是科技所带来的巨大力量让人们产生了一种难以遏制的自负,而人类的自负又加剧了科技的自负。
人类已经被一种虚幻地、自满自足地考虑实践构造的科学遗弃了;这种科学所从属并为之服务的实践,就好像某种在科学界限之外的东西一样;这种科学满足于思想与行动的分离。
我个人的思考是这样的:
首先我的小孩将来如果要做音乐家,他如果希望去当一个单人音队的演奏家,我是可以接受的。不可否认,“音乐家”是一个需要社会认可的,高难度的,殿堂级的称谓,确实与“单人乐队”啥都要掺和一下的特性不符。但是同时,我个人认为“音乐家”的落脚点是“音乐”而不是“家”,相比于“家”所代表的专业性,我更看重“音乐”所代表的快乐和自然。我小时候常去南美洲多个国家玩耍,单人乐队的形式在桑巴中十分常见,我不认为我的小孩去做一个给美丽热情的巴西姑娘跳桑巴的时候配乐的人,有什么不合适的。
但是同时,我也认为,在软件工程中,确实是需要“分工”的,就好像我即使既会前端又会后端,但是对于大的项目,我也不可能一手操办,那么就不是工程了,“一个人干的不是工程”。
但是确实分工会影响人的“全面发展”,就好像大多同学,如果在数据库大作业中作为后端,那么在软工中,也会主动或被动的担任后端,可以想见,如果写简历,那么工作经历也会只有后端,那么应聘到的工作大概率也只能是后端,这显然是十分悲哀的。
但是这否是一种异化呢?还是一种简单的分工呢?
问题 3:
| 条目 | 内容 |
|---|---|
| 问题 | 结对编程的文档是变多了还是变少了? |
| 定位 | P87,P89 第三章,关于结对编程的解释 |
| 原因 | 不懂书中的术语 |
驾驶员:写设计文档, 进行编码和单元测试等 XP 开发流程 。
领航员:审阅驾驶员的文档; 监督驾驶员对编码等开发流程的执行; 考虑单元测试的覆盖率 ; 思考是否需要和如何重构; 帮助驾驶员解决具体的技术问题。领航员也可以设计 TDD 中的测试用例 。
对于结对编程中的分工,可以看到分工是十分复杂的。我觉得这是一个自然的现象,因为合作就意味着沟通,而沟通就需要代价,就好像 P89 页以跳舞举例,一开始一定是互相踩脚的,那么这个时候文档应该是会变多的,因为文档是一个良好的沟通手段。
但是 XP 又是极限编程的意思,它属于是敏捷编程,它的定义也可以找到
敏捷方法论有一个共同的特点,那就是都将矛头指向了“文档”,它们认为传统的软件工程方法文档量太“重”了,称为“重量级”方法,而相应的敏捷方法则是“轻量级”方法。正是因为“轻量级”感觉没有什么力量,不但不能够有效体现灵活性,反而显得是不解决问题的方法论似的。因此,就有了一次划时代的会议,创建了敏捷联盟。
这么看似乎需要花费大量时间的文档会在结对编程中得到弱化。那么文档量应该会减少。这应该是因为结对的两个人心意相通,所以省去了一些常见的沟通步骤,文档量也就减少了。
那么是不是可以这么理解,结对编程就好像长期投资一样,需要先投入一定的资金(早期大量的文档),然后才能有利润,并且利润越来越大(文档越来越少)?
问题 4:
| 条目 | 内容 |
|---|---|
| 问题 | 如何让团队每个成员对团队的目标、角色、产品都有统一的理解? |
| 定位 | P111 第五章,对于 TSP 的定义 |
| 原因 | 书中的描述和你的经验(直接经验或间接经验)矛盾 |
TSP 原则:
- ……
- 团队的各个成员对团队的目标 、 角色 、 产品都有统一的理解 。
- ……
我在数据库大作业的实践中,发现让团队成员有一个统一的理解是十分困难的事情,因为大家从小的教育和生长环境并不相同,所以很难对于一个事务有统一的理解(甚至连基础的理解都做不到)。比如说团队一开始希望做一个电影推荐网站,但是团队中有人连基础的“院线”的概念都不知道,那显然是无法为项目的设计贡献自己的一份力量的。
我认为“统一的理解”是一个很重要的事情,因为可以明显感受到,如果团队对于一个项目是有“想法”的,是有“见解”的,那么开发的热情和效率会大很多,但是这并不是一个容易的事情,我自己总结了如下方法:
- 选择大家更有共同话题的选题,比如说学校平台、笔记软件等。
- 选择更有可能有共同话题的同学组成团队。
- 利用自身的人格感染力和频繁平等的会议,让大家的理解统一起来。
- 将任务细化到不需要统一的理解为止。
虽然衍生了一些的方法,但是我觉得依然是缺少科学的、可复现的、高效的且正面的“让团队每个成员对团队的目标、角色、产品都有统一的理解”的方式,希望能在软工中有所学习。
问题 5:
| 条目 | 内容 |
|---|---|
| 问题 | 架构师是如何选择或者培养出来的? |
| 定位 | P228 第十章,功能驱动的设计的定义 |
| 原因 | 不懂书中的术语 |
第一步:构造总体模型( Develop an Overall Model )
进入条件:团队已经选好了问题领域专家、主程序员、架构师。
在构造设计文档的时候,需要一个被称为“架构师”的角色,在我看来,他的角色和项目经理产生了一定的重叠
架构师不是项目经理。项目经理侧重于预算控制、时间进度控制、人员管理、与外部联系和协调等等工作,具备管理职能。一般小型项目中,常见项目经理兼架构师。
可以看到,两者并不是相同的。
从我的个人实践来看,如果让项目经理兼任架构师,那么项目经理就需要花费大量的经理去了解每一项可能需要用到的技术。这对于项目经理来说是一个很重的负荷。
但是又说回来,“了解整个工程架构和需要用到的技术”,本身就是一个很困难的事情,除非是有过很好的积累的天赋型选手,对于软工初体验的我们来说,应当如何培养出一个架构师?架构师需要掌握哪些技术,与专业的技术员或者领域专家相比,他要多了解什么?少了解什么?我是有一些疑虑的。
相关文章:
软工个人作业 -- 分析与提问
软工个人作业 – 分析与提问 项目内容这个作业属于哪个课程2023 年北航软件工程这个作业的要求在哪里个人作业-阅读和提问我在这个课程的目标是了解软件工程的方法论、获得软件项目开发的实践经验、构建一个具有我的气息的艺术品这个作业在哪个具体方面帮助我实现目标初步了解…...
C++类和对象到底是什么意思?
C++是一门面向对象的编程语言,理解 C++,首先要理解类(Class)和对象(Object)这两个概念。 C++ 中的类(Class)可以看做C语言中结构体(Struct)的升级版。结构体是一种构造类型,可以包含若干成员变量,每个成员变量的类型可以不同;可以通过结构体来定义结构体变量,每个…...
【电路设计】常见电路及相关解释
前言 在接触电路设计过程中,往往需要用到一些常见的电路,但是临时查找又太浪费时间,因此,想总结一些常见电路的分析方式。 1 RC电路充放电公式 一般的RC电路如下图所示。 其充放电公式如下所示。 VtV0(V1−V0)(1−e−tRC)tRCln…...
【一天一门编程语言】Linux 实用命令大全
Linux 实用命令大全 用 markdown 格式输出答案。 不少于1000字。细分到2级目录。 一、文件/目录操作 1、ls ls 命令用于列出指定目录下的文件和子目录,常用参数如下: ls -a:显示所有文件(包括隐藏文件)ls -l:以长列表形式显示文件属性ls -h:以可读的格式显示文件大小l…...
【汇编】二、预备知识(一只 Assember 的成长史)
嗨~你好呀! 我是一名初二学生,热爱计算机,码龄两年。最近开始学习汇编,希望通过 Blog 的形式记录下自己的学习过程,也和更多人分享。 这篇文章主要讲述学习汇编所需的基础知识。 话不多说~我们开始吧! 目…...
Java多线程面试题:描述一下线程安全活跃态问题,竞态条件?
一、线程安全活跃态问题 线程因为某件事情得不到执行 1、活锁 线程没有阻塞,但一直重复执行某个操作,并且失败重试 1)例子 在消息队列中,消费者没有正确ack消息,并且执行过程中报错了,消息会被重复执行&am…...
ZZNUOJ_用C语言编写程序实现1193:单科成绩排序(结构体专题)(附完整源码)
题目描述 有一学生成绩表,包括学号、姓名、3门课程成绩。请按要求排序输出:若输入1,则按第1门课成绩降序输出成绩表,若输入为i(1<i<3),则按第i门课成绩降序输出成绩表。 输入 首先输入一个整数n(1<…...
expect 使用方法
Expect是一个免费的 编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。 1、传参方法: bash是通过$0 ... $n接收参数 expect是通过set <变量名称> [lindex $argv <param index>], 2、判断语法 if { condition } { …...
Spring AOP详解-Spring官方原版
一、概述 面向方面编程(AOP)补充了面向对象编程(OOP) 提供了另一种思考程序结构的方式。模块化的关键单元 在OOP中是类,而在AOP中,模块化的单位是方面。方面 实现跨越问题(如事务管理)的模块化 多种类型和对象。(这种关切通常被称为“跨领域”关切 Spring 的关键组件之…...
链表习题精选(持续更新中)
第一题给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。请注意,偶数组和奇数组内部…...
【log】操作类日志处理 与 报错类日志处理logback
文章目录一、操作类日志处理【环绕增强】aop环绕增强导包第一步:自定义注解interface第二步:在Controller写一个测试的方法:第三步:编写LogAspect增强类与增强方法日志写入数据库(使用mybatis)第一步&#…...
百度网盘好友发来的文件手动输入JS选择代码批量保存
基本代码:document.getElementsByClassName(global-clearfix)[3].getElementsByTagName(li)[0].getElementsByTagName(a)[0].click();范围选择函数:这个要手动全部取消选择function sel(a,b){var alidocument.getElementsByClassName(global-clearfix)[3…...
【CS224W】(task6)Google的PageRank算法
note 求解pagerank:用power iteration(幂迭代)方法求解 rM⋅r\mathbf{r}\mathbf{M} \cdot \mathbf{r}rM⋅r ( MMM 是重要度矩阵)用random uniform teleporation解决dead-ends(自己指向自己)和spider-traps(…...
Python安装拓展库及常用的pip命令及其用法
Python安装拓展库 在Python中,库是一些预先编写好的代码和函数,它们可以帮助你解决特定的问题。如果你想要扩展Python库,通常有两种方法:使用现有的第三方库,或者编写自己的库。 1.使用现有的第三方库 Python社区中…...
这9道软件测试面试题,就能刷掉90%的软件测试员
转眼就要到“金三银四”了,没点真本事真技术,没点面试经验,不了解点职场套路,如何过五关斩六将?如何打败面试官?如何拿下那梦寐以求的offer? 如果你的跳槽意向已经很确定,那么请往下…...
【大数据】大数据Hadoop生态圈
文章目录大数据Hadoop生态圈-组件介绍1、HDFS(分布式文件系统)2、MapReduce(分布式计算框架)3、Spark(分布式计算框架)4、Flink(分布式计算框架)5、Yarn/Mesos(分布式资源…...
python读取tif图像+经纬度
python读取tif的包很多,但大都只能读出图像像素值,不能读取到经纬度信息。原因:TIFF 简单理解就是一种图像格式,类似于 jpg、png 等。GeoTIFF 就是在普通 TIFF 文件上增加了地理位置、投影信息、坐标信息等,常用于遥感…...
Kali安装配置vulhub
一、vulhubVulhub是一个基于docker和docker-compose的漏洞环境集合,进入对应目录并执行一条语句即可启动一个全新的漏洞环境,主要利用于漏洞复现。Vulhub的官方地址为www.vulhub.org。二、搭建vulhub靶场2.1 开启kali虚拟机2.2 安装docker先更新一下软件…...
【进击的算法】动态规划——不同维度的背包问题
文章目录前言动态规划的维度二维动规leetcode416、分割等和子集leetcode1049. 最后一块石头的重量 IIleetcode494、目标和三维动规leetcode474. 一和零结语前言 大家好久不见,这次我们一起来学习一下动态规划中怎么确定维度,和对应问题如何解决。 动态…...
udiMagic 导入 Excel to Tally ERP Crack
关于 udiMagic 软件 udiMagic 是一款可帮助您快速轻松地将数据导入 Tally ERP 的应用程序。它由 Shweta Softwares 创建和分发,于2007 年首次推出。 您可以在 USB 闪存驱动器 [旅行许可证] 中携带 udiMagic,并在具有任何 Tally 版本的任何计算机上使用…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...
leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑 在电子商务领域,转化率与网站性能是决定商业成败的核心指标。今天,我们将深入解析不同类型电商平台的转化率基准,探讨页面加载速度对用户行为的…...
