开篇之作之——阅读与思考
这个作业属于哪个课程 | <课程的链接> |
---|---|
这个作业要求在哪里 | <作业要求的链接> |
我在这个课程的目标是 | 学会现代软件开发的整体流程,深入理解软件工程学并与实践相结合 |
这个作业在哪个具体方面帮助我实现目标 | 书中理论,作业明确目标,写博客总结,形成输出,重点掌握 |
一、初生小辈,泛泛而谈
- 小生博客: https://www.cnblogs.com/xnch/
- 小子许欢: 来自西南石油大学17级软件工程。讲真的,头一次遇到这样的作业,不过还好,小生早些时候在CSDN上还有所建树。这里顺便附上我CSDN的链接,欢迎大家前来打扰。我是半道出家的一个程序员,在经历了志愿被调剂后,在我原专业挖了一学期的石头(地质学),还别说,有些石头还挺好玩儿的。
没骗你们吧,标准的玉玺,权利的象征,好看吧,那这些玩意儿就是靠我们这些地质人满山跑给整出来的。这个石头还不叫好看,好看的在咱们学校明辨楼A区大厅下,那玩意儿,高端大气上档次,不失为西南石油大学的一道美丽的风景线啊。
然后学着学着,就各种向斜,背斜,断层什么的,各种背,各种概念。我就思考,这不是我要走的路,那我要走什么路呢,或许在我高考后填的第一志愿适合我——软件工程。来,请看:
对嘛,这才是我们嘛,我就喜欢这样,坐着动动手指是吧。俗话说得好:“我们的指尖拥有改变世界的力量”。不开玩笑,的确如此,近十年来,多少万程序员奉献了他们的头发,来使我们的生活变得更加智能。写着东西就停不下来,上面吹了这么多了,你们肯定也看累了,下面说说实际的,既然作为一个科班出生的程序员,那必须得要有掌握的一两门技术嘛。
- 小生主攻Java,也了解其他语言,未来主要是做一个后端工程师,先保证有口饭吃嘛,然后再看其他技术,搞起走就行了。有喜欢Java的小伙伴或小姑娘的话,我们可以一起探讨交流技术。最后再分享我喜欢的一句话,也是我的座右铭:“纸上得来终觉浅,绝知此事要躬行”
二、前人栽树,后人乘凉
1、回想初入大学时对所在专业的畅想
(1)当初是如何做出选择所在专业的决定的?
当初我为什么会选这个专业呢,前面也提到了,我是转专业学生,其实在高考毕业就填了这个专业,只不过被调剂了。至于为什么,我觉得首先是我表哥对我的影响吧,让我在高中就接触到过软件,当时他用C语言编写了一个贪吃蛇游戏,我就觉得挺好的,然后就产生了兴趣,想着自己能否也做一个出来。还有就是后面网页的流行,很多地方都会用到浏览器,我就想着如果自己也能做一个网站那该多好,应该是一个自豪的事情(当时人工智能和大数据还没有这么火)。
后来就是在原来专业中感觉到一天到晚摸索石头没啥意思,还有就是对自己以后发展的疑问。我以后就像这样天天玩玩儿石头了吗,或者是经常到大山里面去找石头,然后常年经常出差,工作几个月回家几个月的生活?照看不了家人,不,这不是我想要的,于是考虑转专业,正好对软件有些兴趣,然后社会上也比较火,就业什么的,工资及以后的发展都还不错,于是就选择了这个专业。
(2)过去一(两)年中接触到的课程是否符合对自己所在专业的期待,为什么?
在过去的两年大学生活中,这些课程在我学的时候,我觉得是不太符合的。就拿大一的数据结构来说,在我当时的想法中,别人已经实现了的东西,我们只需要拿来用就可以了,没有必要深入去研究它。再来到大一暑假所学的英语及概念实习(也就是C#),我决定那个英语听说没什么意思,为什么不直接给我们上专业英语呢,这或许对我们以后的发展更好。概念实习,当时跟着老师做了一个红色天空游戏,也就是小时候玩儿的飞机大战,当时很有兴趣,但是回过头来,不过只是跟着老师将老师的代码自己手动的敲了出来而已,还是一样没学到什么,反正第一学年就在抱怨中度过了。到了第二学年,我开始了给自己选定了一个方向,不管学校学什么,自己先学好那一个方向,先掌握熟练运用一门语言再说,于是我就奋力学习Java,在落后了众多团队大佬一年的时间,我只有花更多的时间努力学习。就在学了Java之后,我对计算机软件又有了新的认识,也可以说是对大一没有认真学专业的一种后悔吧,后面才意识到数据结构及算法是相当重要的。所以说按现在的我来说,我接触到的课程是完全符合我对专业的期待,包括现在这门课,我相信在学完整个课程后,我会收获到很多东西。
(3)觉得所在的专业是喜欢的领域吗,它是擅长的领域吗?
前面也已经提到过,目前我比较喜欢Java后端方向还有大数据领域。软件专业,所涵盖的领域实在是太广,我感兴趣的领域自然也就是软件范畴的领域。同时,大学注重基础,万丈高楼平地起就是这个道理。相信大家都听过厚积薄发这个词,我坚信大学里所学的东西会为我以后的发展打下坚实的基础。
(4)将来会选择从事和专业相关的工作吗?是的话给出想去的城市、公司和岗位,否的话给出原因
以后必然是会选择从事软件行业工作的,主要是想去深圳或者就在成都吧,想去的公司肯定是bat了,但是目前实力肯定不够,只能再努力了,岗位就是后端工程师。
2、对照前人们走过的路和描述未来发展,现在的你
(1)自我感觉你已经具备的专业知识、技能、能力有哪些?已经写过的代码量是多少?描述你做的最复杂的项目/作业。
我觉得具备的专业知识其实挺少的,主要是集中在编码上面,学过C/C#/Java,数据结构,然后还了解了Python,matlab等。对整体的软件开发流程,以及软件整个过程还不够了解,实际代码量也没多少,估计可能也就一千多行吧。最复杂的项目,说出来可能都不太好意思。就是在今年参加互联网+比赛做的一个跨境电商比赛项目。
引入全球化与智能化商品交易平台模式,设计满足厂商和B2C销售者实施跨境商品借卖销售的系统。对多种用户分配不同权限来实现对订单的操作,还有对于生厂商的海外仓的管理,以及对各种经销商之间的关系。对不同用户的调货系统的注册审核、登录、信息分析、信息派送、汇总发布、交易成功等。还有就是实现了企业之间的分单模式,可以分单企业,分单供应商,分单产商。最后还做了一个小论坛,主要是为了让全球用户在论坛上实现交流沟通。
(2)离成为一个合格的本科毕业生,在专业知识、技能、能力上还差距哪些?
首先,我觉得应该是找出我们和培训机构,或者职业院校出来的学生的区别。他们出来编码能力一般比我们强,那我们的优势是什么,我们可以找到本科所学的东西是他们没有的,我觉得这是首要的。那如何提升这些知识呢,那就是要把理论专业课学好,就好比这门课现代软件构建之法,以及计算机系统基础,计算机网络基础,操作系统,软件需求分析,软件体系结构,软件项目管理等,这是作为一个科班出生的程序员的基本知识。其次,在编码能力上还有很大的差距,我认为在毕业前要有1万行代码才算合格。
3、目前是一个人生选择的十字路口,考研、工作、考公、出国,不同的选择在大三就有不同的努力方向。而无论考研还是工作的每条路径,也有许多不同的分支。
(1)对照以上你阅读的前人们的经历,你的选择是什么?
在阅读了前人们的经历,再加上自己的思考,大一浪费了一年的时间,还有想去的bat,我觉得考研可能是目前最好的选择。
(2)在这种选择下,你认为你相比其他同学来说有何优势,有何劣势?
考研的话,我觉得优势可能是自己数学和专业课学得还比较好。劣势就是自己一直偏科英语,还有就是还需要比其他同学多花几年在学校里读书,自己的工作经验肯定比不过工作了的同学。
(3)针对你的选择,你给自己的大三设定的规划安排是什么?
在近几年的考研热中,特别是计算机,复试刷下去了很多人,我觉得大三在上学期的时候我就多敲代码,多做项目,把代码量给弄上去,然后大三下开始准备考研以及算法数据结构基础之类的学习,避免在复试的时候被刷。
(4)你对于实现自己的梦想已经做了或者计划做什么样的准备?
加入了新开的一个实验室,可以和研究生学长们一起交流技术,并且在做项目中增加自己的代码量,向1万行看齐。各种技术书籍,高级及底层实现以及准备好,计划着9610的工作状态度过大三。
三、小试牛刀,不懂就问
问题1:职业发展之考级之路
第三章(53页)作者谈到职业发展之考级之路。
作者谈到了些许什么国家认证,机构认证之类的专业技术资格证书。
疑问:由于我在网上,知乎,CSDN等各大平台上了解到,前人说的大多是计算机类的专业考证没有用。一般有经验的不用证书,有证书的大多没经验,拿证书还不如多花点时间锻炼下技术。然而网上的各种考证官网又极力说考证考级的各种好处,书中也是双面的简单的介绍了一下,那么这些证对我们职业发展是真的有好处吗?还是只是浪费时间考取无用的证书呢?
问题2:专与精的关系
第三章(52页)专与精的关系
作者谈到街头卖艺的单人乐队,一个人可以会多种乐器,而与之对立的是只研究一种乐器的乐手。很明显表达前专后精,好比全栈工程师与运维工程师运维不同的模块。
疑问:现在互联网公司成两种形式,前后端分离或者就是前面提到的全栈工程师。据我了解Python和PHP做全栈工程师还是比较不错的,那为什么就成了街头卖艺了呢? 的确术业有专攻,但是为什么现在社会上都需要会多项技能的人呢?就比如你技术强然后管理上又有建树,又或技术+英语,技术+文档撰写能力,公司岂不是更应该喜欢花更少的钱来请人做相同的事情吗?
问题3:软件需求之用户需求
第八章(151)软件需求之用户需求
文中提到人们为了解决现实社会和生活中的各种问题,要求助于软件,需要替用户想到他们的需求。
疑问:在开发软件时,我们如何去正确的找准市场定位与分析客户的需求?这类问题书中提到的软件寻找需求,可是用户是多变的,如何能保证精准呢,是否是用到当下流行的大数据技术,还有当用户信息量不够时,是不是就做不到精准定位?在没有这一技术时,是不是无法定位到用户的需求,产品就只能不断的修改?
问题4:测试方法之问
第十三章(277)各种测试方法
书中提到单元测试,构建验证测试,验收测试,搜索式的测试,回归测试,伙伴测试等等。那么问题来了
疑问:我们如何更好地进行软件的测试,并且要降低测试成本,即能够对各种可能会发生的情况进行测试,虽然上述各种测试方法,那怎么找到一些潜在的难以发现的bug,并且提高测试效率?经常听老师说,没有完美的软件,只有更好的软件,合格的软件,那么软件需要通过什么样的测试才能算合格?
问题5:创新和作坊所思
第十六章(370)创新和作坊
作坊很容易被新技术抛下,落后的绝技也就没有多大用处了,想开作坊的人,有些有能力的作坊,往往能找到合适的渠道和空间,实现自己的价值。
疑问:在当下这个时代,人们不谈“作坊”了,现在的“云”,“大数据”,“人工智能”,和“创新”才是讨论的热点。现在国家响应着新技术的发展,开设了大数据专业,人工智能等专业,那是否软件工程就变成了前面提到人们不谈了的“作坊”?现在的软件工程面临着什么样的难题,软件工程在新兴专业以及新兴技术下将如何继续发展?又或者说软件工程的下一个变革的方向将会在那一部分?
四、三分手艺,七分家伙
俗话说,三分手艺,七分家伙,手艺好还要家伙妙,拳头再硬也比不上锤子。孔夫子也说 “ 工欲善其事,必先利其器。”可见,利器之重要性,那么我们就来看看目前流行的源程序版本管理软件和项目管理软件。
Git
-
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
-
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
-
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
-
Git是目前世界上最先进的分布式版本控制系统。
优点
- 适合分布式开发,强调个体。
- 公共服务器压力和数据量都不会太大。
- 速度快、灵活。
- 任意两个开发者之间可以很容易的解决冲突。
- 离线工作。
缺点
- 学习周期相对而言比较长。
- 不符合常规思维。
- 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
GitHub
Github是一个代码托管平台和开发者社区,开发者可以在Github上创建自己的开源项目并与其他开发者协作编码。创业公司可以用它来托管软件项目,开源项目可以免费托管,私有项目需付费。GitHub可以托管各种git库,并提供一个web界面,但与其它像 SourceForge或Google Code这样的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性。为一个项目贡献代码非常简单:首先点击项目站点的“fork”的按钮,然后将代码检出并将修改加入到刚才分出的代码库中,最后通过内建的“pull request”机制向项目负责人申请代码合并。已经有人将GitHub称为代码玩家的MySpace。在这里我又要打个广告了,本人github:https://github.com/ordinaryload 欢迎前来打扰。
优点
- 适合分布式开发,强调个体;
- 公共的服务器压力和数量都不会太大;
- 速度快, 成熟的架构,开发灵活;
- 任意两个开发者之间可以很容易的解决冲突;
- 离线工作,管理代码成本低,不需要依赖服务器;
- 部署方便。基本上下个命令就可以用;
- 良好的分支机制,可以让主干代码保持干净。
- Git对程序源代码进行差异化的版本管理,代码库占极少的空间。易于代码的分支化管理。
缺点
- 资料少,学习成本比较大,学习周期比较长,要求人员素质比较高;
- 不符合常规思维;
- 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
- 不支持中文,图形界面支持差,使用难度大。不易推广。
Microsoft TFS
TFS是一个应用软件生命周期管理(ALM)软件,是一个软件研发平台产品,其功能覆盖了软件研发过程中的所有环节(包括源代码管理)和所有角色。
优点
- 易用性。
- 高度集成其他工具。
- 是对敏捷,msf,cmmi等项目、过程管理、过程改善的支持。
- 任务版上能将需求、项目进度一览无余,对于小团队而言,比甘特图更有用。
缺点
- 能应用起来的团队、公司的数量较少。
- 多数真正用起来,也就是源代码管理这部分,这也仅仅是占TFS极小部分功能。
Mercurial
Mercurial与一般传统的版本控制系统的最大区别在于分布式的概念。所谓分布式,就是指没有一个所谓的集中的中心(central)库,这个库一般由svn server(svn),vss administrator(vss)控制,而Mercurial就没有这样的一个库,所以使用版本控制的时候甚至都不需要一个administrator和server,本地直接建库,直接就使用,任何一个库都可以作为中心库,每个库在Mercurial看来都是平等的。
优点
- 更轻松的管理。
- 更健壮的系统。
- 对网络的依赖性更低。
缺点
- 权限控制的问题
- 分支的时候不能对单独的子目录进行,一次clone就是一个工程
----------------------------------------------------------纸上得来终觉浅,绝知此事要躬行---------------------------------------------------------