《构建之法》阅读-第一次作业
构建之法第一次作业
阅读与准备作业
作业属于的课程:
作业的要求:
我在这个课程的目标:
(1)系统分析作为我们专业的核心必修课程,其在软件组织中,分析与设计的作用是举足轻重的。自己也是希望利用这门课程,把大一、大二两个学年所学到的在软件开发过程中最重要的一些核心思想、设计模式等方面的知识贯穿起来,使自己能够有一个更加完整的知识体系结构,深刻对软件工程的理解。
(2)无论从提升自己的专业动手能力,还是为获得一个更高的分数。自己都应该认真高质量的完成每一次的作业。自己也感觉到每一次的作业设计的都很合理。特别是团队和个人项目时,应该利用所学的理论,从相反方面加以讨论软件系统分析与设计的方法、流程、工具与文档。实现从理论和实践两方面的能力同时提升。
这个作业在哪个具体方面帮助我实现目标:
本次作业针对性对博客园优秀的博文和教材进行了大量阅读,也使自己对软件工程这门课程和博客园这个工具有了一个更深入的认识。同时也是第一次在博客园写文章,接下来的日子也会利用好这门课程的每一次作业和博客园的丰富文章来极大的丰富和完善自己的知识体系。
一、 建立博客并介绍自己
自己的博客地址:https://www.cnblogs.com/slow-walker/
自我介绍:
我叫王柄钞,是来自2017级软件工程卓越班普通程序员一枚,爱好爬山、打篮球、喜欢到处陪“girl”一起吃吃逛逛。自己认为自己动手能力还是不错,追求突破和解决困难问题之后的成就感,遇事能够比较成熟稳重思考之后再做决定,能够吃苦、敢于挑战,记得曾经做的一个比赛,大概熬了一个月的通宵本来是不可能完成的项目,最终提交作品的时候还是做出了比较满意的作品也取得了意想不到的成绩。有些时候总觉得自己学东西总是比人家慢了一个节拍一样,但是相信自己只要能够持续性的努力就一定不会比人家差,正如自己的博客名slow-walker,i’ am slow-walker ,but i never walk backwards.
二、 阅读与思考
(1) 回想一下你初入大学时对你所在专业的畅想
当初你是如何做出选择你所在专业的决定的?
回首两年前选专业的场景,其实那个时候自己对计算机这个行业不是很了解,也仅仅就知道他在未来就业还非常好,对于我们这种家庭没有特别厚的背景的人学计算机能够通过自己的能力,走出属于自己的一片天地。模模糊糊就选了这个专业,从大学进来的时候自己想着,自己在大学里面一定要好好学,因为这专业学好了自己能够凭借自己的技术去创业开公司。
你认为过去一(两)年中接触到的课程是否符合你对你自己所在专业的期待,为什么?
在过去两年里自己接触和学习的东西主要来自两个方面,第一个就是学校开始的课程的学习,第二个就是来自自己阅览和看的视频所学的感兴趣的方向的知识。都比较满意自己在刚刚大一之处对自己这两年的规划,唯一还有点不足的是自己学习的知识还是比较零散,也希望通过自己这一年的学习巩固和加强丰富自己转也课程体系。
你觉得你所在的专业是你喜欢的领域吗,它是你擅长的领域吗?
自我感觉软件工程学生未来有很多发展方向,因此针对自己也选了一个自己的未来发展方向,我喜欢大数据领域,我相信自己通过这三年一直朝着这个目标前进,不断曾强自己在这方面的知识,相信到即将大三结束工作面试活动研究生面试都能取得自己一个较满意的结果。
将来你会选择从事和你专业相关的工作吗?是的话给出你想去的城市、公司和岗位,否的话给出原因
将来的我会选择从事现在所学专业的工作,当然想去的城市能够留在成都当然也是挺不错的,公司的话还是希望自己起初实习以及起初正式工作不应该只看中眼前的工资,而应该考虑未来五年深知十年的薪水,所以起初应该本着对未来学习和发展更有帮助的公司去上班。期望的当然还是bat这种大公司,岗位还是想做大数据研发这一块,大数据架构。
(2)对照前人们走过的路和描述未来发展,现在的你
自我感觉你已经具备的专业知识、技能、能力有哪些?已经写过的代码量是多少?描述你做的最复杂的项目/作业。
自我感觉自己以及具备基本的c、c#、java、python、php基本的程序设计能力,能够熟练的使用mysql数据库,对面向对象、设计模式有比较深刻的认识。自己写过的代码量至少应该有3万行+,自己做过最复杂的项目印象最深刻的有两个。
第一个就是石工设计大赛给斯伦贝谢公司做的一个petrel插件,其实在开发这个插件业务不是很复杂,难的就是他的开发框架要用他自己的ocean框架是集成在vs里面的。遇到的最大的困难就是要去学习这些全英文开发文档,要去明白他的数据域以及数据结构是怎么样的。从项目启动到结束持续性的花费了一个月的时间,基本上每天最早睡觉也是两点。但最后还是取得了一个满意的成绩。最终在这个过程提升的是自己的一个快速学习和克服问题解决问题的能力,使自己在未来开发过程中有了更加向前的动力。
离成为一个合格的本科毕业生,在专业知识、技能、能力上还差距哪些?
其实针对自己现在像一个合格的本科生出去工作的话,自己专业知识上也主要差在自己学的东西还很零散,基础不够扎实,不能融会贯通,动手能力上还有待加强。在与人沟通协作的技能上还有一定的差距,特别是在编码这一块,自我感觉一个真正合格计算机本科毕业生,本科毕业至少也得应该有10万+行代码量,也正是需要这样的代码量的不断练习我们学的知识,才能丰富和融会贯通,使得我们的知识体系结构更加完整,才能在写代码的过程中不断改进,提升代码质量,我想这也是有些人能进一些大厂,然而有些人也只能进一些小公司的原因所在。
(3)目前是一个人生选择的十字路口,考研、工作、考公、出国,不同的选择在大三就有不同的努力方向。而无论考研还是工作的每条路径,也有许多不同的分支。
对照以上你阅读的前人们的经历,你的选择是什么?
针对在老师们列出的优秀博文,其实他们很多都讲了一个共同的特点就是刚刚开始也比较菜,但是自己不愿意待在舒适的环境,都是通过一次次失败一次次前进,并在这个过程中厚积薄发,最终达到了自己既定的目标。同样,自己的选择也是,我也首先会选择考取研究生,想通过这样一个平台不断提升自己的能力,再到后面工作的时候自己应该起步五年应该主要沉下心来厚积薄发,后面五年到十年才会实现由量变到质变的一个过程。
在这种选择下,你认为你相比其他同学来说有何优势,有何劣势?
优势的话主要是通过自己更高水平的研究生学习,相信自己未来的起点一定会比人家高,自己的未来对事物的认知水平也会有更加不同的高度。劣势就是相比于同龄进入社会的人,自己晚出去三年,也许到自己毕业的时候人家已经是有很强经验的项目经理了。
针对你的选择,你给自己的大三设定的规划安排是什么?
设定的目标,努力学好自己的课程,将自己的绩点有所提升,更加完善自己的动手能力和丰富自己的专业知识结构体系。争取把六级过了,争取能够有一篇尽量高一点水平的文章和一张含金量较高的国奖。
你对于实现自己的梦想已经做了或者计划做什么样的准备?
所做的计划,首先就是每天认真按照自己的规定计划完成当天的英语学习,其次未来提升代码量和成绩自己努力完成每一次老师课后布置的作业,并上课积极与老师交流互动。针对课后,自己也正在准备参加数学建模国赛,以及后期的泰迪杯,以及主动学习相关的研究,相信自己能够在大三关键的一年多出一些成果。
三、提有质量的问题
针对所遇到的问题以及思考:
问题一、
针对第二章中单元测试的学习,对之前写过的一些程序试了一下更加深单元测试的理解,之前对这个没什么概念写代码就只管写代码了。也理解到了自己在写单元测试时应该要跟软件同步更新,并且单元测试要覆盖所有代码路径,单元测试可以把我们的软件能做的不能做的事都在“单元”中表达出来。并且也感受到了有单元测试的话后期出现的bug修复起来也比很容易。
针对自己的写的一个测试自己暑假写的java代码,感受到单元测试的一个重要标准就是保持每个测试的孤立性,即只测试本方法内的逻辑,如果遇到其它模块或其它借口的调用,则尽量使用mock object来代替,在实际测试过程中,如果一个类a中的一个方法需要调用到接口b、c、d、e、f、g(或更多)接口的时候,通常的做法,也是junit框架推荐的做法是将这些其它接口通过参数传递的方式供a使用,但这样造成的最直接后果就是a方法中的参数过多,代码难以维护且不美观,可能有些得不偿失。
然而过程中也遇到的问题,怎么保持单元测试的孤立性呢,而且存在的问题还有就是,假如测试方法中的参数过多就会造成在被测试方法业务逻辑复杂,而且会频繁调用其它接口,如何减少参数呢?
问题二、
针对第六章的敏捷开发的整个流程和疑惑,敏捷开发的路程,个人觉的如果能够掌控好开发的流程和节点,及时的了解进度与遇到的问题,及时发现可能隐患的延时问题,就能掌控好开发的流程了;针对于复杂的开发确实很有用,回想之前自己开发的几个程序,只是简单的执行,使用敏捷开发并不适用,简单的东西也许敏捷反而不敏捷了;
回头先之前的开发过程,也都感觉使用了里面的部分路程,自己最后总结的流程,首先是,快速的竟品分析。对市面上的同类竟品进行深入的分析,提炼出产品框架,分析对比各竟品的优缺点,去其糟粕,取其精华。其次对用户行为数据分析。通过问卷,访谈等调查用户使用此类产品遇到的问题,收集反馈意见。再通过设计多套概念产品方案。设计产品框架,主要任务流程,最初可以设计多套交互方案,最后评审选出最优方案。再快速的视觉实现。定义产品主色和辅助色系,快速在一个典型的界面上进行多套方案的尝试,通过简单的用户测试,决定出符合用户预期的风格方案。最终高效配合,敏捷开发。技术人员根据交互原型和典型界面的视觉方案进行技术储备和框架搭建,最后对各模块精细化实现,最后产品上线。
问题三、
在本书的第11章,我看了这一段文字“小飞:你是说构建就像是运球、传球。。。”,对于代码重构不是很清楚。我查了资料,基本上都是在强调重构的好处优点,重构就是软件产品最初制造出来,具有良好架构。由于随着时间的发展,需求发生变化,为了实现达到软件对的雪球,不得已要打破之前的架构方式。然而新修订的入户软件已经使得之前的变得面目全非,并限制之后功能的扩展。从而这个软件如果要重构的花费还比不如重新开发一个软件成本高。而重构在“软件系统的过程, 它不会改变代码的外部行为, 同时改善其内部结构。 这是一种严格的清理代码的方法, 它可以最大限度地减少引入错误的可能性。重构的实质就是,在编码能够考虑之后的维护和功能的扩展。”
然而现在对重构还有似乎疑惑,针对何时重构,在刚刚开始开发的时候应该在那些方面应该考虑后面的重构?
问题四、
针对第13章的阅读各种的软件测试,确实软件测试是软件工程中的一项重要的步骤,缺一不可,然而书中学会到了单元测试、构建验证测试、“探索式”的测试等待,然而我感觉可以加一种测试方法,就是将用户和测试人员相结合的方式一起进行测试,这样的话通过用户的角度就能够更多的去发现问题,同事在他们测试过程过程中,也能让他们发现问题,并及时解决问题,不至于到最后交付项目时候出现偏差。
问题五、
针对在在第16章中,阅读针对创新,文中谈到了创新,谈到了创新时机、创新的迷思和招数等。同事举例了创新的产品,其中对于一个魔方的销售,针对不同的客户使用了一些不一样的商业模式。然而针对软件工程开发领域创新到底什么样的才叫创新?要达到什么要求水平才能称得上创新?新的开发技术的出现算是软件工程的创新吗?
四、了解和调查源程序版本管理工具
管理工具 |
简介 |
优点 |
缺点 |
git |
开源的分布式的vcs(version control system)版本控制系统 |
可以先存储在本地,不会存在服务器死机就影响工作,拥有丰富的资料来进行学习查阅,开源的,大小项目均可管理,拥有良好的分支机制 |
兼容性不好,可能在上个版本的项目内容放到另一个git版本会出错。 |
gitup |
|
1、适合分布式开发,强调个体; 2、公共的服务器压力和数量都不会太大; 3、速度快, 成熟的架构,开发灵活; 4、任意两个开发者之间可以很容易的解决冲突; 5、离线工作,管理代码成本低,不需要依赖服务器; 6、部署方便。基本上下个命令就可以用; 7、良好的分支机制,可以让主干代码保持干净。 |
1、资料少,学习成本比较大,学习周期比较长,要求人员素质比较高; 2、不符合常规思维; 3、代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。 4、不支持中文,图形界面支持差,使用难度大。不易推广。 |
rational |
一种面向对象的统一建模语言的可视化建模工具。用于可视化建模和公司级水平软件应用的组件构造。 |
rose在uml建模方便太方便了,而且速度也比较快,支持分包,支持对软件过程的全程管理 |
rose好像不能做数据库设计,之前用的不支持c#,不能转化成c#框架代码,正逆向工程不是特别出色 |