软工个人阅读作业#2
软工个人阅读作业#2
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 这个课程 |
这个作业的要求在哪里 | 在这里 |
我在这个课程的目标是 | 体会软件工程的时间流程,锻炼团队协作能力和开发能力 |
这个作业在哪个具体方面帮助我实现目标 | 通过阅读教材,学习与软件工程相关的内容,尝试常用的工具,体会持续集成/部署工具 |
阅读提问
问题1
阅读教材3.3技能的反面,作者以精通玩魔方为例表述了何谓真实的“技能”:
离开了口诀的话,我只能把魔方的一面拼出来。从这点来看,我的魔方技能应该是:“能够独立地还原一面,其他看口诀可搞定。”那么,我这真实的“技能”还值得写进简历么?看样子是上不了台面了,那什么才是“技能”呢?
又以“不精通”的IT专业大学生面试为例,说明其编程过程实际上是一个解决问题的过程,针对一些变量的定义等语法的细节,该面试者“平时都是上网查的”,所有的时间都花在解决低层次问题上,因此面试官试图考察“算法技能”或者“C#程序设计技能”的目的无法达到。这说明面试官对面试者精通一项技能的要求,在于对该技能相关的低层次问题能达到自动操作的程度。
而后文又提到:
年轻学生都志向远大,上了一些课,就很想解决高层次的问题。一些学生非常想做高层次的“科研”,觉得“工程”是基础,没意思。
是否说明此类学生掌握的技能仅通过课程学习达到的程度无法言之精通?也无法写入简历?
问题2
在软件工程师的成长中作者分享了这样一个故事:
两个劫匪在亡命的路上看到一副绞刑架,劫匪小弟说,大哥,如果这世界上没有绞刑架,咱们的职业就好干多了。大哥说:你真笨!如果没有了它,这世上做劫匪的人怕是太多,我俩恐怕竞争不过同行,早就饿死了!
在软件工具和软件工程理论发展迅速的今天,软件开发变得越来越容易,把绞刑架看作风险与原则,那么这个例子表达的应该是失去风险或失去底线的高回报产业会产生激烈的竞争。那么要上软件工程的绞刑架,应该要做到删库跑路、贩卖源码这种程度。这个问题的关键也在于竞争会给我们带来许多困难,然而激烈的竞争会造成恶劣的生存环境,最终会导致某些软件工程师扛着绞刑架变成劫匪。
如果将来成为了软件工程师,竞争的激烈程度无法预料,但是软件的开发必然在相互合作中完成,再有以下案例:
程序员小飞原计划三天完成某个任务,现在是第三天的下午,他马上就可以做完。但是在实现功能的过程中,他越来越意识到自己原来设计中的弱点,他应该采取另一个办法,才能避免后面集成阶段的额外工作。但是他如果现在就改弦更张,那势必要影响自己原来估计的准确性,并且会花费额外的时间,这样他的老板,同事也许会因此看不起他。如果他按部就班地按既定设计完成,最后整个团队还要花更多时间在后续集成上,但那就不是他个人的问题了。怎么办?
在这种个人与团队的矛盾、合作与竞争的矛盾、原则和利益的矛盾下,软件工程师能够沉下心来开发吗?
问题3
文中所言,结对编程要求不间断的复审,以达到发现、解决问题的目的:
结对编程让两个人所写的代码不断地处于“复审”的过程,程序员们能够不断地审核,提高设计和编码质量,可以及时发现并解决问题,避免把问题拖到后面的阶段去。
文中提到结对编程能够解决传统意义上的程序员之间的互相复审的问题,如缺乏对程序的深入了解,缺乏持久、定时的安排,缺乏对需求和设计的了解等,但是综合前提都是对程序员的要求,结对项目的开发过程中,代码复审所花费的时间是否有效?通过代码交流是否优于直接交流,能够避免双方各司其职的情况吗?
问题4
在阅读到PM和风险控制时,提到市场上创业公司失败的主要原因有42%为没有实际市场需求,在我看来,创业公司成功的主要原因很大程度上在于找到市场,例如短视频类软件在我国盛行前已然在国外推出,但反响不够明显,很大一部分原因就是我国市场大。
由于项目开发的投资必然被项目功能所分摊,但是在8.4竞争性需求分析的框架中对竞争产品分析时,企业除了在用户需求端与对手竞争外,还开发了占比更大的对用户无用的功能,这样的功能在市场上并无优势,却占用了不少资源,是有必要存在的吗?
问题5
文中十六章IT行业的创新中,关于创新的迷思有提到一个观点:
要成为领域的专家,才能创新。
这个想法看起来非常合理,但是:
统计数据表明,70%的创新者说,他们最成功的创新,是在他们的拿手领域之外发现的。
在我看来,这些创新者的成功之道,不仅仅在于自己是拿手领域的专家,更在于他们成为一个专家的过程中积累的能力,从而产生对于创新的可能性的敏感,进而与其他领域交叉,迸发新的灵感,才达到非凡的成就。
再者,文中提到一个迷思:
技术是创新的关键。
作者认为创新不仅仅在于技术,还有商业模式、生态系统、用户体验的创新。而我认为,企业创新的根本目的是满足用户需求,在追求创新精神的今天,倡导的是人人创新,然而,技术力不足的企业进行产品的创新是否过于盲目?
调研源代码版本管理软件
相同点:
都是基于git的项目管理软件,都能够从建立私人、免费的远程仓库,并从中拉取内容到本地、进行代码审查、支持Markdown编辑、拥有集成工具等
不同点:
GitHub是目前全球最大的编程开源平台,是团队协作编程的首选平台,项目众多,多家大型企业选择在GitHub开源。
GitLab本身开源,但是支持的仓库类型只有Git。
BitBucket还支持Mercurial,属于Atlassian并能够使用Atlassian的集成工具。
调研持续集成/部署工具
GitLab CI
1.创建maven项目以及编写简易JUnit4测试文件
2.在项目的根目录创建gitlab-ci.yml文件
3.将项目push到gitlab并触发CI
GitHub Action
在项目的根目录创建.github文件夹,再在其中创建workflows文件夹,再编写action.yml文件,最后push到github触发CI
使用CI和CD工具后的感受
CI/CD注重于将各个开发者负责的代码部分推送到代码库中,并且每次推送都根据已有的脚本对代码进行测试,最后自动部署,投入到生产环境中。
这类自动化的测试能够提高代码的质量,降低重复测试的人工成本,为团队合作提供了便利。