构建之法-读书笔记
这个作业属于哪个课程 | 课程的链接 |
---|---|
这个作业要求在哪里 | 作业要求的链接 |
我在这个课程的目标是 | 通过这本书的学习,能够清晰理解软件工程、程序、和开发过程所需要的知识 |
这个作业在哪个具体方面帮助我实现目标 | 看书写博客,在做项目的同时,关注需求分析、设计实现、测试与维护等必要过程 |
介绍自己
我是一个来自计算机科学学院软件工程专业的大三学生,当初选择计算机专业时,我就想着要努力把计算机学好学扎实,积极进取,不辜负这大学美好时光。之前选择计算机专业并不是我的本意,当时本想学医,治病救人,但由于一些原因选择了计算机专业。最开始的时候,本以为自己对计算机不感兴趣,随着对计算机的深入了解,也渐渐感受到计算机的魅力。利用计算机,我们可以开发出自己以前做不到的东西,学习HTML、CSS制作前端页面,js、jquery通过渲染,将页面的丰富化等等,这些都是我们学习计算机带来的好处。
同时,我也是一个性格开朗,对一切新鲜事物都感到好奇的人。我喜欢说话,我也习惯于倾听。我内心细腻,能够很好的倾听别人的话语,因此大家都愿意向我倾诉他们的问题,并且我能提出很好的建议,帮助他们。我喜欢倾听别人经历的故事,不管是喜还是悲,我也喜欢听一些光怪陆离的故事,每个人都有自己不同的成长,都会经历不一样的故事,这些故事可以是令人难忘的,也可以是震撼人心的,我喜欢把它们记录下来,当自己碰到问题感到迷茫的时候,拿出它们,向他们的做法学习,攻克这丝迷茫。别人的经历是我们最好的老师。我喜欢听音乐,喜欢听一些舒缓的音乐,我也喜欢看书,喜欢逗小孩等等。我的逻辑推理能力比较好,我喜欢在数学、物理方面花时间和功夫,只要我理解了一道题,今后这种类似的题就不会出现问题。而对于专业课,我希望在最后这两年大学生活里能学到更多的知识,充实大脑。
阅读与思考
(1)我初入大学时对我所在专业的畅想
我是一个理科思维比较好的人,当初高中数理化考试都能得到一个满意的分数。当时高三的时候,我就下定决心要考川大的临床系,但由于高考发挥失常,导致高考后分数不够,没上到这个学校,因此我爸就提议,要不就学计算机吧,计算机的前景也很好,而且也和数学这些逻辑联系的比较紧密,因此就选择了计算机。当时的我还未从从医的梦想中醒过来,还想着读其他学校的临床系,由于分数的限制,我不得不选择计算机专业,从此我就踏上了求计算机学之路了。虽然不情愿,但随着对计算机的深入了解后,我才发现我对计算机的喜爱也在逐年增加。通过计算机系统的基层学习,我了解到一个程序是如何在计算机中存储的,其中的数据又是怎样在寄存器或栈又或者堆中存储的,这些一切的一切,都是我在努力学习计算机组成原理后得到的重要知识。
大一大二两年接触到很多课程,像C语言、数据结构、计算机系统基础、软件设计模式、计算机科学基础等等专业课,都是技术层面上的专业课,在刚开始还不懂计算机时,以为计算机课程很是无聊枯燥,每天对着一台电脑,敲着键盘,盯着屏幕,日复一日得生活,而当我真正接触到计算机时,我才知道计算机底层是多么得奥妙,计算机所有的内部结构都有它一定的道理,每个结构对应的功能都是非常有条理的。计算机专业是我喜欢的专业领域,因为它涵盖的东西很多,可能是其他专业接触不到同时很难理解,因此如果说高考再有一次机会选择专业的话,我一定还是会选计算机专业的。虽然计算机不是我擅长的专业,但却是我喜欢的专业。如果我的技术学的够好,能够有机会在腾讯的总部深圳去了解更多关于计算机的奥秘,我愿意用更多的时间去了解它。前端的网页设计是我一直想要学习的,如果能有一个好的前端技术支持的话,我想将我的好的设计理念运用在前端设计中,将我的想法和思考用网页的形式表达出来。
(2)对照前人们走过的路和描述未来发展,现在的我
大一大二这两年里,我学到了很多知识,除了学习计算机的部分语言(C、C#、Java)外,还学了一点专为web网页设计的脚本语言HTML,为了将网页做的更加美观大方,又去学习了HTML5、CSS3和JavaScript,学习了这三种脚本语言后,我能够自己独立的完成一个简单的网页设计,比如说,登陆注册界面、导航栏、下拉列表等一些通过js渲染过后的功能更加多的简单界面。比如登陆注册界面选择使用邮箱验证或者添加验证码来确保用户的真实信息等验证方法。为简化 JavaScript 编程,我又去学习了jQuery,它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互,具有高效灵活的css选择器,并且可对CSS选择器进行扩展,极大简化了JavaScript的书写,用起来非常方便。为了加快网页的开发效率,我又去学习了Bootstrap框架,Bootstrap框架提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。它包含了丰富的Web组件,根据这些组件,可以快速的搭建一个漂亮、功能完备的网站。而且,Bootstrap自带了13个jQuery插件,对于jQuery的使用,大大加快了网页的制作。利用Amazing UI跨屏前端框架,更好的了解到了网页制作的乐趣。为了学习这些web前端的网页制作,我先要看网上的教程,但在看教程时,我都是用“意念“编程,很少去学习写自己的网页,因此当我真正做项目时,我才发现自己不能很流畅快速的写代码,因此我开始了学习web网页制作的代码之旅,虽然没学多久,但现在的网页制作的代码量也应该有2000以上了。而我做过最复杂的项目则是做一个购物平台,这个购物平台不只是静态的展示商品,还要动态的从数据库中添加商品信息到网页上,并以动态的形式展现出来,出来登陆注册界面,还要添加商品展示的主界面,每个商品详情信息页面,购物车的信息页面,每个商品的分类等一系列的页面,而购物车不仅需要展示我的订单管理,还要实现数据的增删改查等功能,难度确实有点大。若要成为一个合格的本科毕业生,在专业知识、技能、能力上还要有很大的提升。比如说数据库的运用。当今社会是一个数据量繁重的人工智能时代,而数据除了相互要增删改查等功能,而且还需要最重要的一点,怎样去安全的存储这些数据是我们需要解决的,因此这学期的目标是希望能够努力将数据库学好,能够很好的利用数据库为我们做事。一些技术上的知识也还有很多没有学,因此,除了数据库以外,我还应该学习有关web网页的其他知识,为自己能够快速有效的做出一个优秀的网页而努力。
(3)目前是一个人生选择的十字路口,考研、工作、考公、出国,不同的选择在大三就有不同的努力方向。而无论考研还是工作的每条路径,也有许多不同的分支。
我可能是一个摇摆不定的人,大一时,目标明确,一心想要开始工作,想着大学毕业后就能找到一份和专业对口的薪酬不错的工作。大一结束后还是秉承着毕业就找工作的宗旨,可到了大一暑假实训才发现自己的能力是多么的弱,和班上的同学一比较,就发现自己在专业技术上不达标,一些专业知识也只是学了皮毛,根本没有深入了解,因此我的选择发生了变化 -- 想要考取公务员,得到一个稳定的工作,安安稳稳度过一生。但上了大二,我努力学习专业知识后,才发现计算机的专业知识没有我想象中的那么难,只要认真努力肯下功夫肯花时间就一定能学好,因此大二时,我又选择就业。现在,大三了,我对计算机又有了一个新的认识。计算机是一门新兴的学科,由于之前大一大二花费在专业课上的时间很少,使得我的计算机代码方面很弱,而高度的考研复习阶段可以帮助自己把大一大二浪费的专业课时间补出来,如果能考上研究生,就能在研究生的这段时间里更好的了解计算机,学习计算的内部结构和组成原理,增强对计算机的认识,当然也可以在研究生这三年里把握当今计算机行业局势,跟随潮流的变化,把自己学的更加强大,为自己就业做准备。因为我的逻辑推理能力和算法能力比较好,而且能在短时间内接受新兴事物,因此我觉得自己可以尝试一下考研。为了顺利考上研究生,我需要在大三这一整年里开始着手准备数学、英语、思想政治、专业课。因为学习英语是个长期的积累过程,因此现在就可以开始英语的复习了,而数学科目包括高数、现代、概率统计,这些科目也都需要大量的时间去学习,而思想政治对于我们理工科的学生们来说,可能需要的也还是时间,合理运用这些时间,争取考个好的成绩,报考好的大学,不负这些年的准备。如果能考上研究生,我想学习web前端页面的设计,做一个平面UI设计师,这是我的梦想,也是我要努力的方向,为了实现它,我更应该好好努力,一步一个脚印,不要急功近利。首先我需要努力奋斗一年考上研究生,考上研究生后,学会合理利用自己的零碎时间,一步一步充实自己,最后实现自己的梦想。
提有质量的问题
学习了《构建之法》这本书,我了解了很多有关软件工程的模式,文档的作用是我们软件开发者的非常重要的一点。何为软件,软件就是程序加上相关文件,按照特定顺序组织的计算机数据和指令的集合。因为邹欣老师的这本《构建之法》,让我对程序,软件、软件工程、文档、团队合作、敏捷开发有了更深一步的了解。但还是有些不懂得地方:
1.第六章敏捷流程
敏捷开发是一种新型软件开发方法,也是一种能应对快速变化需求的软件开发能力。敏捷开发(AgileDevelopment)是一种以人为核心、迭代、循序渐进的开发方法。它不是一门技术,它是一种开发方法,也就是一种软件开发的流程,它会指导我们用规定的环节去 一步一步完成项目的开发;而这种开发方式的主要驱动核心是人;它采用的是迭代式开发。敏捷开发需要每日例会,需要团队每个成员在同一时间,同一地点,在相同的地方面对面开会汇报昨天或者当天所做的工作量。但如果 团队成员不能满足以上条件,那怎么办?敏捷每日例会的要求达不到,不能面对面沟通,不能了解其他人在做什么,当前项目计划进展如何,是否遇到了问题,减少了发现问题的机会,这个时候又该怎么做?而书上113页只提到了这个问题,却没有明确的指出该问题的解决方法。虽然需要文档和其他辅助工具的帮助,但如果长期不能面对面交流又该怎样解决?
2.第八章需求分析
需求分析也称为软件需求分析、系统需求分析或需求分析工程等,是开发人员经过深入细致的调研和分析,准确理解用户和项目的功能、性能、可靠性等具体要求,将用户非形式的需求表述转化为完整的需求定义,从而确定系统必须做什么的过程。 但需求分析是软件开发中非常重要的一步,若我们的开发模型是按照瀑布开发模型开发的,若我们对用户需求没有一个好的认识和了解,等软件开发完成后,用户不能按照自己期待的软件功能,降低了用户满意度,可能导致后面很多补课预料的结果。因此,如何在我们软件开发前能更好的了解用户的需求?书中P151中提到软件团队可以分析技术的发展趋势以及产业的变化,社会的发展趋势,推测用户的新需求。那么应该怎样设身处地,替用户着想引出用户需求呢?我们又该如何掌握用户的新需求?如果软件开发不能一次性满足所有的利益相关者的要求,那我们又应该怎么做呢?需求分析相关资料
3.第九章项目经理
一个项目经理能正确的协调团队内部外部,调配各部门资源和时间,有效的进行风险管理,保证一个项目顺利按计划结项,根据时长和用户需求,协调各部门资源,正确的把我产品的定位和方向,解决用户的痛点,持续优化产品。教材P188页针对项目经理PM需要的能力进行了分析:观察、理解和快速学习能力;分析管理能力;一定的专业能力。这些能力都是一个项目经理必不可少的能力要求,但我认为一个优秀的项目经理应该具备更多的能力,如:
1.应变能力:应变能力是指自然人或法人在外界事物发生改变时,所做出的反应,可能是本能的,也可能是经过大量思考过程后,所做出的决策,对于一个好的项目经理,应该具有随机应变的应变能力以适应当前社会的变化;
2.影响力:一个良好的影响力,不仅能增加团队成员对项目经理的信服力,还能让团队成员将项目经理所提出的建议放在心上,并付诸实践。
3.项目经理要与明确的目标定位和整体意识。项目是一个错综复杂的整体,它可能含有多个分项工程、分部工程、单位工程,如果对整个项目没有目标定位和整体意识,势必会顾此失彼。
4.第十章典型用户和场景
根据书上Stone网站中卖家吴石头通过他儿子吴小石头在网站上卖石头的例子告诉我们,软件不是为所有人服务的,因从小部分出发,明确的定义谁是我们的用户,最后确定我们的用户群体(简称典型用户)。利用 吴小石头和刘兰的故事,告诉我们场景的不同之处。但是,场景应该怎么区分?怎样找到场景的特殊之处?怎样重点描述场景中的特殊因素?这个场景如何让用户满意?P213中通过讲简单的故事来传递信息,那么,怎样讲故事?讲故事的技巧又是什么?P214中“增量开发,逐渐构件整个系统"中的”增量开发“又是什么?如何做到增量开发?增量开发的优缺点?为什么不能用瀑布开发?原型开发?它们之间的区别又是什么?(资料详看:增量开发 瀑布模型、增量开发、原型化开发、统一过程模型(RUP)之间的区别)
5.第十一章软件设计与实现
表达数据的流动(Data Flow Diagram)简称DFD。DFD从数据传递和加工角度,以图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程,是结构化系统分析方法的主要表达工具及用于表示软件模型的一种图示方法。如书中P227页所示,当我们关注数据在不同的实体之间依赖一定的规则流动的时候,DFD是一个非常合适的工具。P228中提到,DFD可以将数据分成很多不同的数据流,如果将数据的操作进一步细分,又会形成一个新的、更低层次的DFD,这些数据流能引导设计者全面设计系统的信息处理流程。但是,怎样合理的将数据中的数据进行划分来表示不同数据的流动?又怎样将已划分的数据流进行再一次的细分以得到安全的系统设计?若盲目的胡乱划分出现了严重的后果后又该如何去做?
了解和调查源程序版本管理工具
软件版本管理
源程序版本管理也称源代码版本控制,源代码版本控制的基本原理如下:
在服务器端建立该项目的数据库,并保存你选定的项目源文件的第一个版本。客户端任一用户要获得某源文件的修改权利,需进行check out操作。之后客户端一般每完成一个无编译错误的版本想保存的时候,进行check in操作,将当前版本保存在服务器端上并成为最新版本(注:不是覆盖以前的)。任一客户端可以方便地得到服务器上的文件的任意版本(如果有权限的话)。一般还实现了一个重要的功能是版本比较,任一客户端可以利用版本控制工具对某文件的不同版本进行版本比较,它会标记出不同版本的同名文件的不同点,可以轻易地看出版本内容的演化。
软件版本管理是指通过执行版本控制、变更控制的规程,以及使用合适的配置管理软件,来保证所有配置项的完整性和可跟踪性。版本管理是对工作成果的一种有效保护。
软件版本的优点:
如果没有软件版本管理,最大的麻烦是工作成果无法回溯,发生工作成果被覆盖或丢失等问题。随着工作的进展新的程序覆盖了老的程序,当突然发现新程序有问题而老程序正确时怎么办?那只能重写老的程序来覆盖新的程序。过一段时间又发现原来的老程序有问题,而解决方法在原来的新程序中……为了避免成果被覆盖,很多人早期采用手工管理版本的方式,例如当一个新版本产生时用当时的日期来命名文件夹,然后再复制一下以后的修改在复制的文件夹内进行,这样上一个版本就被保存下来了,周而复始不同的版本不会被覆盖。
虽然这种方式可以从某种程度上解决版本的回溯问题,但它存在的缺点是显而易见的:
1.如果保留结果过于频繁,将会导致产生大量的有着重复内容的文件夹,庞大的物理空间,管理起来很麻烦;
2.如果保留旧版本的时间间隔太长,可能产生某些有用的老程序无法回溯;
3.容易产生版本的混乱,如果是团队开发软件,这种简单的方法更难解决问题的本质了。
软件版本管理规范
软件研发和管理过程中会产生许许多多的工作成果,例如文档、程序和数据等,都应当妥善地保管起来,以便查阅和修改。如果把所有文件一股脑的塞进计算机里,那么使用起来很麻烦。
凡是纳入版本管理范畴的工作成果统称为配置项主要有两大类:
1.属于产品的组成部分,例如需求文档、设计文档、源代码、测试用例等等;
2.在管理过程中产生的文档,例如各种计划、报告等。每个配置项的主要属性有名称、标识符、文件状态、版本、作者、日期等。配置项及历史纪录反映了软件的演化过程。
版本控制的目的是按照一定的规则保存配置项的所有版本,避免发生版本丢失或混乱等现象。配置项的状态有三种:“草稿”、“正式发布”和“正在修改”
配置项的版本号与配置项的状态紧密相关:
(1) 处于“草稿”状态的配置项的版本号格式为:0.Y.Z
(2) 处于“正式发布”状态的配置项的版本号格式为:X.Y。 一般只是Y值递增,当Y值到达一定的范围时X值才发生变化。
(3) 处于“正在修改”状态的配置项的版本号格式为:X.Y.Z。 一般只增大Z值,当配置项修改完毕,状态重新变成“正式发布”时,将Z值变为0,增加X.Y值。
项目管理软件
项目管理软件是指专门用来帮助计划和控制项目资源、成本与进度的计算机应用程序。主要用于收集、综合和分发项目管理过程的输入和输出。传统项目管理软件包括时间进度计划、成本控制、资源调度和图形报表输出等功能模块,但从项目管理的内容出发,还应包括合同管理、采购管理、风险管理、质量管理、索赔管理、组织管理等功能。如果把这些软件功能集成、整合在一起,即构成项目管理信息系统。
其中比较Github、Microsoft TFS和Bitbucket的优缺点:
Github:
优点:
1.Github支持多人同时维护庞大的开源代码(linux),所以它的分支能力强大,体验好。
2.Github除了基本的服务以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。
3.Github使用的基于Web的代码托管服务.
4.Github支持离线提交,分布式推送拉取,使得代码层面的协作相当流畅。
缺点:
1.Github提交大文件无法成功
2.Github不是捕捉创意过程和记录创意点子的最佳工具
Microsoft TFS:
优点:
1.Microsoft TFS是一个团队工具,贯穿需求,开发,测试,发布各个流程提供自动化工具。(与开发工具无缝集成)
2.Microsoft TFS提供源代码管理、 数据收集、 报告和项目跟踪(与Project工具集成,方便任务跟踪)。
3.Microsoft TFS内置BUG管理工具,提高开发效率
4.开箱即用的Microsoft TFS就集成的自动生成和发布功能。可以实现修改代码以后,生成和发布自动完成。
5.Microsoft TFS的所有源代码和版本信息都存储在数据库中,在大型软件研发团队中,可以大幅提升数据的查询和存储速度。同时,基于数据库存储,系统管理员可以方便的备份和还原Microsoft TFS中的任何数据。
缺点:
- Microsoft TFS定位并不是源代码管理
2.Microsoft TFS能应用起来的团队、公司的数量极少,多数真正用起来,也就是源代码管理这部分,这也仅仅是占TFS极小部分功能。
Bitbucket:
优点:
1.Bitbucket免费支持私有仓库,提交大文件时速度很快,而且私人项目免费,且不限容量
2.Bitbucket无限制的磁盘空间
3.Bitbucket灵活的权限控制、Bug 跟踪等优点
缺点:
1.Bitbucket不开源