目录
根据个人编程习惯,我选择了python语言作为我本次学习的工具,并配置了相关集成开发环境
一,个人情况介绍
本人在上此课之前对于软件开发方面的知识掌握度基本上为0,编程方面的知识也仅限于大一所学的python,c语言的基础知识,没有完成过什么复杂项目或者工程。但是我认为计算机和软件开发是非常重要的领域,在我未来从事网络安全领域时也会经常与开发人员打交道,所以我希望通过此次学习,让我大致了解整个开发过程的流程以及如何对这些流程进行管理,如果遇到了一个感兴趣的项目,我也会为此付出大量的时间与经历进行实战训练。
二,理论学习方面
1,总体方面
我完成了学堂在线平台的《软件工程》慕课的第一章与第二章的学习,并完成了配套练习,同时阅读了构建之法的配套讲义与《人月神话》。
2,《人月神话》读后感
当教员推荐《人月神话》这本书时,我还以为是本神话小说 ,当教员简单介绍了之后,我才明白人月是一个单位,是计算机编程的表示工作量计量的单位。由此可见,我们对于软件工程了解的确实很少。当读完这本书,我意识到,在很多方面,这本书都有其深远意义。
在第一章,作者将软件系统开发比作吞噬了恐龙、剑齿虎等史前巨兽的焦油坑,许多大大小小的团队被软件开发的焦油坑所吞噬,讲述了几十年前的软件工程管理的流程经验。在阅读之前,我原本以为软件开发是比较容易的,只要有了新的想法,用计算机语言去实现,就会有对应的软件产品出现,然而,与之相对应的要求,时间,质量,成本都是我们需要考虑的因素,在任何一点出问题,都不算一个好产品,好项目。
在学习之前,一直认为只需要增加人手,便可以实现高效率的开发工作,然而,当阅读第二章后发现编程并不是人越好,人和时间并不是一个正比例比例关系。人数越多,所需时间未必就越少;人越多,项目不一定完成得越好,这便是著名的 Brooks 法则。人数变多时,相应的沟通成本也在不断变高,因而可能出现人数变多,所需时间也变多的可能。在一个项目里,我们应该弄清楚的是到底安排多少人手是最合理最高效的。同时,在外科手术的章节中,也使我明白,人数往往不是重点,人员的质量才是重中之重,优秀的外科手术专家往往效率远高于众多的普通者合作。在生活中许多其他的方面又何尝不是如此。
”经验是最好的老师,但智者还能从其他的地方有所收获“,由此我们可以看出,在计算机,软件开发领域,经验固然重要,但是更重要的是不断从身边的各处去获得各种各样的知识,不断去创新,在学习马原时,我们也知道了,只有实践是检验真理的唯一标准,是我们创新的根基。
书中还讲述了在开发第二个系统过程中过度设计将带来的后果,第二个系统是设计师设计的系统中危险性最大的一个。曾经在第一次系统中被小心翼翼地放在次要位置的给系统添加了很多修饰功能和想法都会泛滥。OS/360是典型的二次开发导致的后果。结构师不可能跳过第二次系统,但在第二个系统中,要注意不要过度自信,保持警觉,应该让初始的概念和目标得到充分的体现,而不让一些次要的功能喧宾夺主。应该有意识地注意到系统的特殊危险性,利用自我约束规则避免功能上的过度修饰,根据系统的基本思想和目的而改变。这些对于每个软件学习者来说都是非常受用的。
作者主张概念完整性是系统设计中最重要的考量因素,并以OS/360系统的发展为观点作了证明。完整的系统的设计过程更有条理,分工更更清晰地设计出系统的每一部分,并且在错误发生时更容易纠正。
在整个过程中,对于我而言最受用的莫过于学习到了团队的作用以及人与人交流的重要性。作者在开篇便讲述了开发者的职业乐趣(自己选择软件工程的原因也是喜欢编程序的乐趣),之后通过Babelenta讲述了沟通的重要性,以及在外科团队团队的分工的问题。这些都涉及到团队中的人与人之间的互动,只有一个不断沟通,保持热情并积极向上的团队,才有可能成就一个了不起的团队。在这本书里,讲述的许多案例都离不开团队,离不开人,离不开交流。不管是什么事,什么人,人与人之间的交流都十分必要且一定的,在软件开发的过程中,更是如此。当善于沟通,便能大大减少沟通成本,也能更好提高个人能力和团队配合程度,从而实现相对完美的软件开发,反之,则可能一团糟。
我觉得《人月神话》这本书适用于各类人,不管是小白还是资深软件工程师,虽然它讲述的是几十年前的事,但是放到现在来看,仍然具有较为深远的现实教育意义,能给我们带来许多启发,也能在我们开发过程中不断提醒我们软件开发应注意到什么弊端从而更好的完成软件开发的任务。
三,实践学习方面
1,编译环境配置及相关知识学习
-
根据个人编程习惯,我选择了python语言作为我本次学习的工具,并配置了相关集成开发环境
-
在学习过程中,我接触到了软件工程中十分重要的一个概念,自动化单元测试。因此,在正式完成编写一个程序的全流程之前,我还花费了大量时间学习了下python关于自动化单元测试的知识(前后大约12小时),并作了相关记载和进行了相关实操,以便于更好的让工作形成闭环。
xuexishili的文件正是我在学习过程中进行的实操训练。
2,码云相关操作
-
码云上建立代码仓库并与集成开发环境进行集成
-
熟悉代码仓库的pull、push、fork等操作
代码仓库地址分别为:https://gitee.com/mao-yihuan/nextday.githttps://gitee.com/mao-yihuan/test-a.git
3,程序编写与上传
-
未加单元检测的编程块
def runnian(year):
if year % 400 == 0:
return True
elif year % 100 == 0:
return False
elif year % 4 == 0:
return True
else:
return False
def nextday(year, month, day):
if month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10:
if day == 31:
month += 1
day = 1
else:
day += 1
elif month == 4 or month == 6 or month == 9 or month == 11:
if day == 30:
month += 1
day = 1
else:
day += 1
elif month == 2:
if runnian(year) == True:
if day == 29:
month += 1
day = 1
else:
day += 1
else:
if day == 28:
month += 1
day = 1
else:
day += 1
else:
if day == 31:
year += 1
month = 1
day = 1
else:
day += 1
return year, month, day
year, month, day = map(int, input().split())
year, month, day = nextday(year, month, day)
if month > 12:
print('输入日期有误')
elif day > 31:
print('输入日期有误')
elif day > 30:
if month == 4 or month == 6 or month == 9 or month == 11:
print('输入日期有误')
elif month == 2:
if runnian(year) == True and day > 29:
print('输入日期有误')
elif runnian(year) == False and day > 28:
print('输入日期有误')
else:
print(f'the next day is {year}-{month}-{day}.')
else:
print(f'the next day is {year}-{month}-{day}.')
# print(f'the next day is {year}-{month}-{day}.')
在整个编译过程中遇到的问题如下:
在区分是否为闰年时,需要考虑一定的逻辑顺序;
在下一天的函数编写过程中,最容易考虑不到的并不是二月末尾的后一天,而是容易忘记编写平常日期的后一天以及在12月31号的后一天容易忘记年份加一,我在编写过程中就犯了这些错误;
在最后,还忘记了输入不合规的情景,也是在思考之后才在输入前采用强制转换int,因此如果输入的不是日期,则会报错,且如果输入的日期有误,如大于12月等也会通过返回的输入日期有误进行提醒;
对于输出的位置也有着考量,在不同位置print的效果也不一样,如代码最后两句便有所体现。
-
加了单元测试的程序
import unittest
import nextday2
day1 = 100, 3, 1
day2 = 400, 3, 1
day3 = 300, 1, 1
day4 = 300, 5, 1
day5 = 300, 8, 1
day6 = 1978, 11, 19
class csnd(unittest.TestCase):
def setUp(self) -> None:
print('用例开始')
def tearDown(self) -> None:
print('用例结束')
def test_csnd1(self):
self.assertEqual(False, nextday2.runnian(100))
self.assertEqual(nextday2.runnian(2000), True)
self.assertEqual(nextday2.runnian(404), True)
def test_csnd2(self):
self.assertEqual(day1, nextday2.nextday(100, 2, 28))
self.assertEqual(day2, nextday2.nextday(400, 2, 29))
self.assertEqual(day3, nextday2.nextday(299, 12, 31))
self.assertEqual(day4, nextday2.nextday(300, 4, 30))
self.assertEqual(day5, nextday2.nextday(300, 7, 31))
self.assertEqual(day6, nextday2.nextday(1978, 11, 18))
if __name__ == '__main__':
unittest.main()
在整个编译过程中遇到的问题如下:
自动化单元检测除了检测日期函数模块外,在此之前应该还要检测年份是否为闰年才能形成完整闭环;
在自动化单元测试过程如何引用同目录下的其他python文件成为了遇到的难题,在此过程中又翻阅了大量文章了解如何引用同目录以及不同目录下的pyhton文件;
调试如下
import sys
sys.path.append#(相对路径)
from test2 import nextday1
'''def runnian(year):
if year % 400 == 0:
return True
elif year % 100 == 0:
return False
elif year % 4 == 0:
return True
else:
return False
aa=runnian(100)'''
aa = nextday1.runnian(100)
print(aa)
测试用例的挑选也十分重要,既要挑选到月份有变化的,也要挑选到年份有变化的,以及闰年或者非闰年的二月的最后一天和随机普通的一天。
测试结果如下:
由此可见,编写的程序通过了自动化单元检测,应该不存在大问题。
-
程序的上传以及多次提交
更改的项目保存在本次
项目多次提交
四,学习有感
在整个学习过程中,我从一开始连python的基本用法都需要百度,任何东西都需要查资料,还要耗费大量时间到能够通过资料提高效率,独立思考完善程序,从崩溃,完全没有办法理解到坦然,改变经历了一段相当漫长痛苦的过程,在上这门课的第二次课便是教授了自动化单元测试的概念,在此之后的一周内有时间我就看相关资料,视频,从python的使用到unittest的用法,才浅浅编出了这样一个对于我来说相对满意的程序,再到后来第三次课讲授码云的使用让我也云里雾里,也是通过课后的学习才掌握了其基本操作方法,好在学习效率有所提升,花费的时间也远没有之前的多,在之后的几次课便是完成虚拟机的安装,相对应的实验以及撰写实验报告,整个过程非常非常痛苦,但是同时我也学到了很多东西,比如如何利用网络上的开源资源找到代码,软件开发的大致流程等等,再比如鼓起勇气面对,比如如何找到最适合自己的资料,比如如何向他人请教,这些是受用一生的东西而非仅仅适用于此课程,所以,我很感谢教员给的学习机会,也很感谢自己没有放弃,也许我的进步非常微弱,对于别人来说甚至都不值一提,但是我十分满足。现将任务完成情况记录如下表所示,有不当之处恳请批评指正。
软件工程慕课学习及配套练习 | 已完成 |
---|---|
阅读构建之法配套讲义 | 已完成 |
阅读人月神话及撰写读后感 | 已完成 |
配置编译环境 | 已完成 |
学习相关工具(自动化单元测试,gitee平台的使用) | 已完成 |
程序编写及上传 | 已完成 |
完成另一位教授布置的各项实验并撰写实验报告 | 已完成 |
附:实验报告链接在此http://t.csdnimg.cn/JmgKp