当前位置: 首页 > news >正文

软工个人作业 -- 分析与提问

软工个人作业 – 分析与提问

项目内容
这个作业属于哪个课程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 原则:

  1. ……
  2. 团队的各个成员对团队的目标 、 角色 、 产品都有统一的理解 。
  3. ……

我在数据库大作业的实践中,发现让团队成员有一个统一的理解是十分困难的事情,因为大家从小的教育和生长环境并不相同,所以很难对于一个事务有统一的理解(甚至连基础的理解都做不到)。比如说团队一开始希望做一个电影推荐网站,但是团队中有人连基础的“院线”的概念都不知道,那显然是无法为项目的设计贡献自己的一份力量的。

我认为“统一的理解”是一个很重要的事情,因为可以明显感受到,如果团队对于一个项目是有“想法”的,是有“见解”的,那么开发的热情和效率会大很多,但是这并不是一个容易的事情,我自己总结了如下方法:

  • 选择大家更有共同话题的选题,比如说学校平台、笔记软件等。
  • 选择更有可能有共同话题的同学组成团队。
  • 利用自身的人格感染力和频繁平等的会议,让大家的理解统一起来。
  • 将任务细化到不需要统一的理解为止。

虽然衍生了一些的方法,但是我觉得依然是缺少科学的、可复现的、高效的且正面的“让团队每个成员对团队的目标、角色、产品都有统一的理解”的方式,希望能在软工中有所学习。


问题 5:

条目内容
问题架构师是如何选择或者培养出来的?
定位P228 第十章,功能驱动的设计的定义
原因不懂书中的术语

第一步:构造总体模型( Develop an Overall Model )
进入条件:团队已经选好了问题领域专家、主程序员、架构师。

在构造设计文档的时候,需要一个被称为“架构师”的角色,在我看来,他的角色和项目经理产生了一定的重叠

​ 架构师不是项目经理。项目经理侧重于预算控制、时间进度控制、人员管理、与外部联系和协调等等工作,具备管理职能。一般小型项目中,常见项目经理兼架构师。

可以看到,两者并不是相同的。

从我的个人实践来看,如果让项目经理兼任架构师,那么项目经理就需要花费大量的经理去了解每一项可能需要用到的技术。这对于项目经理来说是一个很重的负荷。

但是又说回来,“了解整个工程架构和需要用到的技术”,本身就是一个很困难的事情,除非是有过很好的积累的天赋型选手,对于软工初体验的我们来说,应当如何培养出一个架构师?架构师需要掌握哪些技术,与专业的技术员或者领域专家相比,他要多了解什么?少了解什么?我是有一些疑虑的。

相关文章:

软工个人作业 -- 分析与提问

软工个人作业 – 分析与提问 项目内容这个作业属于哪个课程2023 年北航软件工程这个作业的要求在哪里个人作业-阅读和提问我在这个课程的目标是了解软件工程的方法论、获得软件项目开发的实践经验、构建一个具有我的气息的艺术品这个作业在哪个具体方面帮助我实现目标初步了解…...

C++类和对象到底是什么意思?

C++是一门面向对象的编程语言,理解 C++,首先要理解类(Class)和对象(Object)这两个概念。 C++ 中的类(Class)可以看做C语言中结构体(Struct)的升级版。结构体是一种构造类型,可以包含若干成员变量,每个成员变量的类型可以不同;可以通过结构体来定义结构体变量,每个…...

【电路设计】常见电路及相关解释

前言 在接触电路设计过程中&#xff0c;往往需要用到一些常见的电路&#xff0c;但是临时查找又太浪费时间&#xff0c;因此&#xff0c;想总结一些常见电路的分析方式。 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 的成长史)

嗨~你好呀&#xff01; 我是一名初二学生&#xff0c;热爱计算机&#xff0c;码龄两年。最近开始学习汇编&#xff0c;希望通过 Blog 的形式记录下自己的学习过程&#xff0c;也和更多人分享。 这篇文章主要讲述学习汇编所需的基础知识。 话不多说~我们开始吧&#xff01; 目…...

Java多线程面试题:描述一下线程安全活跃态问题,竞态条件?

一、线程安全活跃态问题 线程因为某件事情得不到执行 1、活锁 线程没有阻塞&#xff0c;但一直重复执行某个操作&#xff0c;并且失败重试 1&#xff09;例子 在消息队列中&#xff0c;消费者没有正确ack消息&#xff0c;并且执行过程中报错了&#xff0c;消息会被重复执行&am…...

ZZNUOJ_用C语言编写程序实现1193:单科成绩排序(结构体专题)(附完整源码)

题目描述 有一学生成绩表&#xff0c;包括学号、姓名、3门课程成绩。请按要求排序输出&#xff1a;若输入1&#xff0c;则按第1门课成绩降序输出成绩表&#xff0c;若输入为i&#xff08;1<i<3)&#xff0c;则按第i门课成绩降序输出成绩表。 输入 首先输入一个整数n(1<…...

expect 使用方法

Expect是一个免费的 编程工具语言&#xff0c;用来实现自动和交互式任务进行通信&#xff0c;而无需人的干预。 1、传参方法&#xff1a; bash是通过$0 ... $n接收参数 expect是通过set <变量名称> [lindex $argv <param index>], 2、判断语法 if { condition } { …...

Spring AOP详解-Spring官方原版

一、概述 面向方面编程(AOP)补充了面向对象编程(OOP) 提供了另一种思考程序结构的方式。模块化的关键单元 在OOP中是类,而在AOP中,模块化的单位是方面。方面 实现跨越问题(如事务管理)的模块化 多种类型和对象。(这种关切通常被称为“跨领域”关切 Spring 的关键组件之…...

链表习题精选(持续更新中)

第一题给定单链表的头节点 head &#xff0c;将所有索引为奇数的节点和索引为偶数的节点分别组合在一起&#xff0c;然后返回重新排序的列表。第一个节点的索引被认为是 奇数 &#xff0c; 第二个节点的索引为 偶数 &#xff0c;以此类推。请注意&#xff0c;偶数组和奇数组内部…...

【log】操作类日志处理 与 报错类日志处理logback

文章目录一、操作类日志处理【环绕增强】aop环绕增强导包第一步&#xff1a;自定义注解interface第二步&#xff1a;在Controller写一个测试的方法&#xff1a;第三步&#xff1a;编写LogAspect增强类与增强方法日志写入数据库&#xff08;使用mybatis&#xff09;第一步&#…...

百度网盘好友发来的文件手动输入JS选择代码批量保存

基本代码&#xff1a;document.getElementsByClassName(global-clearfix)[3].getElementsByTagName(li)[0].getElementsByTagName(a)[0].click();范围选择函数&#xff1a;这个要手动全部取消选择function sel(a,b){var alidocument.getElementsByClassName(global-clearfix)[3…...

【CS224W】(task6)Google的PageRank算法

note 求解pagerank&#xff1a;用power iteration&#xff08;幂迭代&#xff09;方法求解 rM⋅r\mathbf{r}\mathbf{M} \cdot \mathbf{r}rM⋅r ( MMM 是重要度矩阵)用random uniform teleporation解决dead-ends&#xff08;自己指向自己&#xff09;和spider-traps&#xff08…...

Python安装拓展库及常用的pip命令及其用法

Python安装拓展库 在Python中&#xff0c;库是一些预先编写好的代码和函数&#xff0c;它们可以帮助你解决特定的问题。如果你想要扩展Python库&#xff0c;通常有两种方法&#xff1a;使用现有的第三方库&#xff0c;或者编写自己的库。 1.使用现有的第三方库 Python社区中…...

这9道软件测试面试题,就能刷掉90%的软件测试员

转眼就要到“金三银四”了&#xff0c;没点真本事真技术&#xff0c;没点面试经验&#xff0c;不了解点职场套路&#xff0c;如何过五关斩六将&#xff1f;如何打败面试官&#xff1f;如何拿下那梦寐以求的offer&#xff1f; 如果你的跳槽意向已经很确定&#xff0c;那么请往下…...

【大数据】大数据Hadoop生态圈

文章目录大数据Hadoop生态圈-组件介绍1、HDFS&#xff08;分布式文件系统&#xff09;2、MapReduce&#xff08;分布式计算框架&#xff09;3、Spark&#xff08;分布式计算框架&#xff09;4、Flink&#xff08;分布式计算框架&#xff09;5、Yarn/Mesos&#xff08;分布式资源…...

python读取tif图像+经纬度

python读取tif的包很多&#xff0c;但大都只能读出图像像素值&#xff0c;不能读取到经纬度信息。原因&#xff1a;TIFF 简单理解就是一种图像格式&#xff0c;类似于 jpg、png 等。GeoTIFF 就是在普通 TIFF 文件上增加了地理位置、投影信息、坐标信息等&#xff0c;常用于遥感…...

Kali安装配置vulhub

一、vulhubVulhub是一个基于docker和docker-compose的漏洞环境集合&#xff0c;进入对应目录并执行一条语句即可启动一个全新的漏洞环境&#xff0c;主要利用于漏洞复现。Vulhub的官方地址为www.vulhub.org。二、搭建vulhub靶场2.1 开启kali虚拟机2.2 安装docker先更新一下软件…...

【进击的算法】动态规划——不同维度的背包问题

文章目录前言动态规划的维度二维动规leetcode416、分割等和子集leetcode1049. 最后一块石头的重量 IIleetcode494、目标和三维动规leetcode474. 一和零结语前言 大家好久不见&#xff0c;这次我们一起来学习一下动态规划中怎么确定维度&#xff0c;和对应问题如何解决。 动态…...

udiMagic 导入 Excel to Tally ERP Crack

关于 udiMagic 软件 udiMagic 是一款可帮助您快速轻松地将数据导入 Tally ERP 的应用程序。它由 Shweta Softwares 创建和分发&#xff0c;于2007 年首次推出。 您可以在 USB 闪存驱动器 [旅行许可证] 中携带 udiMagic&#xff0c;并在具有任何 Tally 版本的任何计算机上使用…...

Redis实现分页和多条件模糊查询方案

导言 Redis是一个高效的内存数据库&#xff0c;它支持包括String、List、Set、SortedSet和Hash等数据类型的存储&#xff0c;在Redis中通常根据数据的key查询其value值&#xff0c;Redis没有模糊条件查询&#xff0c;在面对一些需要分页、排序以及条件查询的场景时(如评论&…...

【H5 | CSS | JS】如何实现网页打字机效果?快收下这份超详细指南(附源码)

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…...

Airbyte,数据集成的未来

Gartner 曾预计&#xff0c;到 2025 年&#xff0c;80% 寻求扩展数字业务的组织将失败。因为他们没有采用现代方法来进行数据和分析治理。数据生态是基础架构生态的最重要一环&#xff0c;数据的处理分发与计算&#xff0c;从始至终贯穿了整个数据流通生态。自从数据集中在数据…...

00.内容安排

内容安排如下01.Linux基本命令0.2 vim编辑器&#xff0c;gcc、gdb、makefile、动/静态库制作使用03.文件 I/O 常用函数、文件读写原理、进程控制快概念、阻塞、非阻塞概念04.文件常用操作函数、目录常用操作函数、重定向05.进程控制fork、exec函数组、进程回收 wait/waitpid06.…...

FreeRTOS任务基础知识

单任务和多任务系统单任务系统单任务系统的编程方式&#xff0c;即裸机的编程方式&#xff0c;这种编程方式的框架一般都是在main&#xff08;&#xff09;函数中使用一个大循环&#xff0c;在循环中顺序的执行相应的函数以处理相应的事务&#xff0c;这个大循环的部分可以视为…...

JDBC-API详解、SQL注入演示、连接池

文章目录JDBC1&#xff0c;JDBC概述1.1 JDBC概念1.2 JDBC本质1.3 JDBC好处2&#xff0c;JDBC快速入门2.1 编写代码步骤2.2 具体操作3&#xff0c;JDBC API详解3.1 DriverManager3.2 Connection &#xff08;事务归我管&#xff09;3.2.1 获取执行对象3.2.2 事务管理3.3 Stateme…...

C 学习笔记 —— 动态分配内存(malloc)

文章目录分配内存malloccallocrealloc创建数组方式free的重要性举例常见动态分配内存错误忘记检查所请求的内存对NULL指针进行解引用对分配的内存越界访问释放一块内存后&#xff0c;继续使用释放一块内存的一部分是不允许的内存泄漏分配内存 当一个数组声明时&#xff0c;需要…...

RK3588通用布线设计指南

&#xff08;1&#xff09;走线长度应包含过孔和封装。&#xff08;2&#xff09;由于表贴器件的焊盘会导致阻抗降低&#xff0c;为减小阻抗突变的影响&#xff0c;建议在表贴焊盘的正下方按焊盘大小挖去一层参考层。常用的表贴器件有&#xff1a;电容、 ESD、共模抑制电感、连…...

ChatGPT也懂如何设计开发板!?

到底应该如何设计一款开发板&#xff1f;我们问了一下最近风很大的ChatGPT&#xff0c;得出了这样的回答&#xff1a; 或者这样的回答&#xff1a; 显而易见&#xff0c;RK3568开发板是一款功能丰富&#xff0c;性能优异&#xff0c;易于开发的高性能开发板&#xff0c;适用于各…...

去了字节跳动,才知道年薪40W的测试居然有这么多?

今年大环境不好&#xff0c;内卷的厉害&#xff0c;薪资待遇好的工作机会更是难得。最近脉脉职言区有一条讨论火了&#xff1a; 哪家互联网公司薪资最‘厉害’&#xff1f; 下面的评论多为字节跳动&#xff0c;还炸出了很多年薪40W的测试工程师 我只想问一句&#xff0c;现在的…...