201771010110-孔维滢 实验一 软件工程准备—<初步了解软件工程>

项目 内容
课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE
这个作业要求链接 https://www.cnblogs.com/nwnu-daizh/p/12369881.html
我的课程学习目标 通过课堂以及课后各种资源的学习,了解掌握软件工程知识,提高相关专业知识能力
这个作业在哪些方面帮助我实现学习目标 (1)课后学习资源的来源 (2)学习MarkDown排版,使博客更加规范整齐
参考文献 [1]邹欣. 构建之法——现代软件工程[M]. 人民邮电出版社, 2014.

实验内容

任务1-任务4已完成

任务5 构建之法与博客首秀

1.MarkDown学习

  • 此次实验,我在网上查阅学习了MarkDown排版的使用,博客也是使用了MarkDown排版。我觉得学习MarkDown排版写博客会让我养成一种规范博客整体排版的好习惯,相比在学习Java时写的博客,排版和内容更加整洁美观。

2.快速浏览邹欣老师博客或《现代软件工程—构建之法》,参照参考文章的提问模板,尝试拟定3个准备从课程学习中找到答案的问题

问题一:

软件工程和项目管理之间有什么关联与区别?“软件 = 程序 + 软件工程” 为什么程序没有包含在软件工程当中?

  • 书中1.1节提出 “软件 = 程序 + 软件工程” 这一概念,并且给出了一个例子,阿超从随手写了一段程序,再应老师请求扩展到一个附带更多功能的软件,然后到更加复杂的软件服务。
    同时,书中也提到:

程序,在这里指的是源程序,就是一段段的代码。它们是建立在数据结构上的一些算法。程序还要对数据进行操作,这些数据有些是静态的,有些是动态的,但是光有代码和静态数据还不行,工程师要把他们构建为机器能懂的可执行代码,构建不仅仅是cc和link命令,一个复杂的软件,不但要有合理的软件架构,软件设计与实现,还要有各种文件和数据来描述各个程序文件之间的依赖关系,编译参数,链接参数等等......
软件开发活动(构建管理,源代码管理,软件设计,软件测试,项目管理)相关的内容,是软件工程核心的一部分

  • 书中1.2节又提到:

软件工程是把系统的有序的可量化的方法应用到软件的开发运营和维护上的过程。
软件工程包括下列邻域:软件需求分析,软件设计,软件构建,软件测试和软件维护

  • 软件工程还要研究如何把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。而项目管理是一个管理学分支的学科 ,指在项目活动中运用专门的知识、技能、工具和方法,使项目能够在有限资源限定条件下,实现或超过设定的需求和期望。项目管理是对一些与成功地达成一系列目标相关的活动(譬如任务)的整体。这包括策划、进度计划和维护组成项目的活动的进展。
  • 我所查到的是,软件工程为我们提供的具有指导意义的软件开发方法(RUP、MSF),项目管理是更从更高的角度思考问题,它总结出了项目管理中会碰到的问题及常规的解决方案,它不仅仅针对软件开发,而可以适用任何项目工程。PMP是国际上知名的项目管理资格认证,通过学习PMBOK课程,可以获得PMP认证。在软件行业,IBM公司也总结出了一套更适合软件行业的项目管理方法,叫WWPMM。通过软件工程指导团队如何一步步进行开发,通过项目管理可以让管理人员对软件项目制定计划、跟踪计划执行情况、控制风险,通过软件工程和项目管理的结合才能保证项目沿着成功的方向迈进。
    因此我认为项目管理是为了实现一些经济目的或者管理要求而顺应产生的角色,它不仅存在于软件工程当中,比如金融、建筑行业当中也存在。但是软件工程的重点在于分析、设计、开发、维护......这是项目管理不具备的。
  • 我所理解的是一个软件服务,在其应用开发的阶段必定要使用程序,在软件工程的软件开发运营和维护阶段使用的技术手段也肯定离不开程序,那么为什么会将软件中的“程序”和“软件工程”二者区分开,而不是包含关系呢?
问题二:

代码复审的意义在于哪里,如果同时存在要修改的代码和要添加的新功能,是先进行哪一个比较合适?

  • 书中4.4节代码复审中告诉我,代码复审是要看代码是否在代码规范的框架内,正确的解决了问题。

谁来做代码复审?即最有经验、熟悉这一部分代码的人。对于至关重要代码,我们要请不止一个人来做复审。

  • 代码复审是要找出代码中存在的编码、规范、代码逻辑、算法错误,还有潜在的错误和回归性错误以及需要改进的地方。
    当开发人员查看代码时会考虑在代码中是否存在明显的逻辑错误?查看需求,是否所有用例都实现了?新的自动化测试是否足以满足新代码?是否需要重新编写现有的自动化测试用例来应对代码的变化?新代码是否符合现有的开发规范?所谓旁观者清,看问题的角度不一样更容易发现BUG或找到更简单有效的解决方案。项目很大时每个人不可能对项目的每个部分都熟悉,通过代码审查至少可以让每个人了解更多的业务模块,同时也能达到人员互备的目的。而且代码审查本身可以提高开发者的能力:被审查者从自身犯过的错误中学习,从他人的思路中学习;审查者从审查的思考过程中学习,从被审查者好的设计中学习。
  • 代码评审应该与团队的现有流程集成。例如,如果一个团队正在使用任务分支工作流,那么在所有代码编写完成并通过自动化测试之后,在代码合并之前,就会启动代码评审。这确保了代码评审人员的时间被用来检查机器遗漏的东西,并防止糟糕的编码决策污染开发主线。
  • 评估是一项团队练习。当产品知识在团队中传播时,团队会做出更好的评估。随着新特性被添加到现有代码中,原开发人员可以提供良好的反馈和评估。此外,任何代码评审人员也会综合考虑代码库的复杂性、已知的关注的问题。通过这种方式代码评审员分享了代码库中那个部分的原开发人员的知识。这种实践使得产品知识有多人了解,当大家做最终评估时,通常会使评估更加可靠。
  • 那么当代码复审发现存在问题,需要修改代码,并且用户或者老板同时又提出要求增加新的功能,是应该先修改好代码再添加功能吗?在知乎上给出的建议是这样,但是这样不会使工作更加复杂,工作量更大吗?我认为应该先添加功能,再将新功能复审后一同进行修改。
问题三:
  • 大致了解了软件工程后我很好奇软件工程师和程序员之间有什么区别呢?

所有的软件工程师都曾是码农,只是经过岁月的变迁,有些人停滞不前,有些人飞跃进步。造成如此大区别的原因就是以下五点:
01.兴趣导致理解深度不一
实质上来讲,码农大多是“代码机器”,他们通晓几门编程语言,但对于商业上面并不熟稔。他们只是把“编程”当做一种养家糊口的生存手段,只要过得去,就不愿意花时间去深入学习,多方面接触。而软件工程师则希望能够创建出一些特别出彩的东西——无论是从技术角度还是商业角度去看。在兴趣的驱动下,他们更愿意积极主动的花费时间深入研究技术、或某种工具、语言等。
02.投入精力不一
正如前面一点所说的,软件工程师更注重深度挖掘,这也意味着他非常在意最后的结果。他会比很多码农更心甘情愿地投入大量的时间和精力到公司的项目技术上面。
03.质疑精神
老板经常会头脑一热就随便做出一个决策,提出一个需求。而这时,码农往往就会拿着老板的需求直接开始执行敲代码。而软件工程师并不会盲从,至少会问问“Why”——搞清楚做新需求的意义与老板本质的需求。最后他们可能会提出另一种更简单,但不同的解决方案,既节省了自己的时间,又降低了公司的成本。
04.不拘一格
一个软件工程师的职业生涯非常重要的一步就是不再想着“我擅长什么语言”,而是开始考虑“什么工具(编程语言等)最适合解决这个特定的项目和客户?”。这在商业决策上同样如此——开发人员能发散思维,从大局着手,如果可以用开源的方案取得相同的结果,他就不会非要你去购买一些非常昂贵的软件。
05.管理者
软件工程师这个职位需要的是一名可以走向架构师,可以成为一个CTO,一个胸有成竹心胸宽广之人。甚至,不夸张的说,他应该是一个连接商业世界和代码世界的桥梁。而不仅仅一个闷头搞代码的搬运工。

  • 经过查阅资料,我了解到:程序员主要是指写代码的人。工程师着重在于设计。软件工程师不但要有编写程序代码的能力而且更重要的是要懂得如何去开发一个软件,怎样去学习实际的UI的观念。 就像工厂里面技术员和工程师,技术员是熟练工人,工程师是设计者。程序员(Programmer)是从事程序开发、维护的专业人员。一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚,特别是在中国。软件从业人员分为初级程序员、高级程序员、系统分析员,系统架构师,测试工程师五大类。软件工程师(Software Engineer),是从事软件职业的人员的一种职业能力的认证,通过它说明具备了工程师的资格。软件工程师是从事软件开发相关工作的人员的统称,包括软件设计人员、软件架构人员、软件工程管理人员、程序员等一系列岗位,工作内容都与软件开发生产相关。软件工程师的技术要求是比较全面的,除了最基础的编程语言(C语言/C++/JAVA等)、数据库技术(SQL/ORACLE/DB2等)等,还有诸多如JAVASCRIPT、AJAX、HIBERNATE、SPRING等前沿技术。此外,关于网络工程和软件测试的其他技术也要有所涉猎。
  • 程序员大多都通晓几门编程语言,但是在商业方面却并不熟悉。当然也有不感兴趣的因素在内,毕竟通常来说,他们做的只是写代码。而软件工程师不同,他们注重的不仅仅是“What & How”,他们更渴望知道“Why”。资深软件工程师可以深谙获取用户需求的技巧,也懂得市场分析、技术执行分析、价值分析估算项目的风险等。他们能独立完成项目使用文档的能力,甚至都可以独立完成一个项目。总结来讲,就是能够依靠经验和其逻辑,设计出高效地算法,更好的解决问题。

总结

通过这一周的学习,我学会了在博客中使用MarkDown排版,我发现这样确实会让我的博客看上去比之前学习Java的时候写的博客更加的整齐,其次,这周我是初次详细系统的了解到什么是软件工程,我觉得这其中包含的范围很广不仅仅是熟练掌握编程能力这么简单,工程,可见其包含的知识、内容之多。在今后的学习当中,我会提高我对软件工程的学习能力,也相信这门学科会有让我努力钻研的魅力。最后分享我在查找第三个问题答案时看到的一句话。

无论是码农还是软件工程师,其实更多地应该是勉励自己不断学习,不断进步, 除了学习更多编程领域的知识,还要提升自己的思维能力,形成不可替代的核心价值,才能在IT行业走的更远。

原文地址:https://www.cnblogs.com/Weiron/p/12406109.html