软工alpha阶段个人总结
一、个人总结
类别 | 具体技能和面试问题 | 现在的回答(大三下) |
---|---|---|
语言 | 最拿手的语言之一,代码量是多少? | java,代码量在一万行左右 |
语言 | 最拿手的语言之二,代码量是多少? | C语言,代码量在五千行左右 |
软件实现 | 你有没有在别人代码的基础上改进,你是怎么读懂别人的代码?你在开发过程中碰到的最复杂的bug是什么,你是如何去解决的?这个bug出现的原因是什么,你在将来应该怎么去避免bug再出现? | 有在别人代码的基础上改进过,在阅读别人代码时通常会先看他写的函数或者接口具体功能是什么,然后理清楚大概的框架结构。开发过程中碰到的最复杂的bug(嗯,历史久远,记不太清楚了,)就说说在本次开发过程中,比较复杂的bug应该是判断活动是否结束或者尚未开始,首先要获取到所选择的活动的开始时间和结束时间,然后获取当前时间,进行比较判断。这个bug出现的原因是前期在开发的时候根本没有考虑到这个问题。将来如何去避免bug产生,就是考虑问题的时候要更全面、细致一点。 |
软件测试 | 你如何测试你自己写的代码?你如何测试别人的代码?你掌握了多少种测试工具和方法?你写过测试工具吗?你如何对一个网站进行压力测试和效能测试?你如何测试一个软件的人机界面? | 通过写单元测试来测试自己的代码,通过断点调试来测试别人的代码。 |
效能分析 | 你写过最复杂的代码是什么?你是如何测量和改进它的效能的,用了什么工具,如何分析 | 最复杂的代码是之前做的学生信息管理系统,并未进行测量和改进 |
需求分析 | 你做过多少个有实际用户的项目,用户最多有多少?你的项目有什么创新的地方? | 暂时没有做过有实际用户的项目 |
行业洞察力 | 你最感兴趣的领域的什么?这个领域在过去10年经历了哪些创新?你分析过这个领域的前10名产品么?请分析一下他们的劣势,你要进入这个领域,应该如何创新? | 我感兴趣的领域是软件开发,这个领域在过去十年内经历的创新,并不了解。 |
项目管理 | 你参与过项目管理么?请描述一下当下流行的开发方法在你的项目中的具体应用情况;请问你如何决定项目中各种任务的优先次序,有什么理论来支持你的作法? | 参与过项目管理,采用敏捷开发方法,首先分配任务,然后小组队员认领任务,接下来是每日例会,进行连续的冲刺。关于任务的优先次序,有些任务是要在其他任务完成后才能进行的,就可以把它排到后面,通过这种方法来确定。 |
软件设计 | 你做过架构设计,模块化设计,接口设计么?请说明一下你为什么是这样设计,你比较过什么不同的设计方式,你的设计取得了什么成果? | 在java中接触过Dao接口设计,将接口的设计与实现分离,这样在实现的时候可以考虑多种实现方法,但是接口的设计不用修改 |
质量意识 | 你是怎么做代码复审的,你加入我们团队后能帮我们提高代码质量么,请具体说明怎么提高? | 自己一行行查看自己的代码,看是否符合代码规范,检查自己写的代码是否存在一些细节问题 |
工具/社区 | 你在各种开发平台都使用过什么样的工具,自己写过什么工具来改进工作效率?给社区贡献过什么工具和代码?Github有分享代码么? | 在微信开发在微信开发平台使用微信开发者工具,没有写过工具,未对社区有贡献,Github无分享代码。 |
团队协作 | 请描述你在项目中如何说服同伴采用你提出的更好的解决方案或者你如何听取了别人的意见改进自己的方案?你如何说服懒惰的同伴加紧工作,实现团队的目标? | 之前由于对服务器配置不太熟练,我们先是把数据库和服务器端都放在了本地,但是我们的小程序最终是要发布的,建在本地不是长久之计,我们还是应该把数据库及服务器端放到云服务器上。而且,我已经查到相关资料了,只要在服务器上下载相关软件,更改软件的一些配置,把代码拷过去就行。 |
理论素养 | 你上过什么数学,计算机或其他理论课,请举出具体的例子,说明你学到的理论如何帮你解决实际问题 | 我上过高等数学,线性代数,离散数学,计算机组成原理,操作系统,计算机网络等理论课。 |
自我管理 | 全年级你专业排名多少?你从刚入学(大学一年级)到现在的排名有变化么?如何解释你的排名变化? | 专业排名在15名左右,与大一相比,排名越来越靠后。当初刚入学时,积极向上,对学习比较有热情,越学到后面,越不想学习,态度不端正。 |
2.软能力评价
1.保持高标准,不要受制于破窗理论(broken windows theory)当你看到不靠谱的设计、糟糕的代码、过时的文档和测试用例的时候,不要想 “既然别人的代码已经这样了,我的代码也可以随便一点啦”
a) 从来没听说过; b) 我就是这样随便过来的; c) 如果有明确要求,我可以做好。 d) 一直主动这样做; e) 不但主动做, 还会影响同事一起做好
2.主动解决问题。当看到不靠谱的设计,糟糕的代码的时候,不要想“可能别人会来管这个事情” ,或者“我下个月发一个邮件让大家讨论一下”。要主动地把问题给解决了。
a) 不懂啥是靠谱的设计; b) 随便应付一下即可; c) 如果有明确要求,我可以做好。 d) 一直主动这样做; e) 不但主动做, 还会影响同事一起做好
3.经常给自己充电,身体训练是运动员生活的一部分,学习是软件工程师职业的伴侣。每半年就要了解和学习一些新的相关技术。通过定期分享(面对面的分享,写技术博客等)来确保自己真正掌握了新技术。
a) 从来不看书;b) 看了就忘;c) 有时分享。 d) 一直主动这样做e) 不但主动做, 还会影响同事一起做好
4.DRY (Don't Repeat Yourself)——别重复。在一个系统中,每一个知识点都应该有一个无异议的、正规的表现形式。
a) 从来没听说过; b) 听说过,但是认为意思不大; c) 这要讲场合。 d) 一直主动这样做;e) 不但主动做, 还会影响同事一起做好
5.消除不相关模块之间的影响,在设计模块的时候,要让它们目标明确并单一,能独立存在,没有不明确的外部依赖。
a) 从来没听说过; b) 出了问题再说吧; c) 想做,但是不知道怎么衡量效果。 d) 能够在多种语言和架构中做到 e) 不但主动做, 还会影响同事一起做好;
6.通过快速原型来学习,快速原型的目的是学习,它的价值不在于代码,而在于你通过快速原型学到了什么。
a) 从来没听说过; b) 把原型直接用于产品,不然就浪费了;c) 不用原型,一直在产品中直接改。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
7.设计要接近问题领域,在设计的时候,要接近你目标用户的语言和环境。
a) 从来没听说过; b) 按我的想法设计,用户以后会适应的; c) 大概同意,但是怎么接近用户呢? d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
8.估计任务所花费的时间,避免意外。在开始工作的时候,要做出时间和潜在影响的估计,并通告相关人士,避免最后关头意外发生。工作中要告知可能的时间变化,事后要总结。
a) 做完了,就知道花费了,不用事先估计; b) 大概估一下,不必在意时间 c) 如果有明确要求,我可以做好。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
9.图形界面的工具有它的长处,但是不要忘了命令行工具也可以发挥很高的效率,特别是可以用脚本构建各种组合命令的时候。
a) 一直用鼠标和GUI; b) 到时候问牛人; c) 正在学习命令行工具。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
10.有很多代码编辑器,请把其中一个用得非常熟练。让编辑器可以实现自己的定制,可以用脚本驱动,用起来得心应手。
a) 只用老师教的一个; b) 随意; c) 没有任何定制。d) 会定制,并且分享给其他人 e) 还会学习和使用各种编辑器的扩展。
11.理解常用的设计模式,并知道择机而用。设计模式不错,更重要的是知道它的目的是什么,什么时候用,什么时候不用。
a) 从来没听说过; b) 模式没用; c) 每写100行程序,我就尽量用一个模式。 d)有实际使用的经验 ; e) 能用具体代码说明模式的利弊
12.代码版本管理工具是你代码的保障,重要的代码一定要有代码版本管理。
a) 从来没听说过; b) 用QQ,u盘即可; c) 领导要求才用。 d) 经常用 e) 不但主动做, 还会影响同事一起做好
13.在debug的时候,不要惊慌,想想导致问题的原因可能在哪里。一步一步地找到原因。要在实践中运用工具,善于分析日志(log),从中找到bug。同时,在自己的代码里面加 log.
a) 从来没听说过; b) 只会printf; c) 加log 太麻烦,我的代码不会有bug 的。d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
14.重要的接口要用形式化的“合同”来规定。用文档和断言、自动化测试等工具来保证代码的确按照合同来做事,不多也不少。使用断言 (assertion) 或者其他技术来验证代码中的假设,你认为不可能发生的事情在现实世界中往往会发生。
a) 从来没听说过; b) 太麻烦,不用; c) 想用,但没有时间。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
15.只在异常的情况下才使用异常 (Exception), 不加判断地过多使用异常,会降低代码的效率和可维护性。记住不要用异常来传递正常的信息。
a) 从来没听说过; b) 抓住所有异常 c) 如果有明确要求,我可以做好。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
16.善始善终。如果某个函数申请了空间或其他资源,这个函数负责释放这些资源。
a) 从来没听说过; b) 随缘; c) 有时这样做。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
17.当你的软件有多种技术结合在一起的时候,要采用松耦合的配置模式,而不是要把所有代码都混到一起。
a) 从来没听说过; b) 没有实践的机会; c) 代码都在一起比较好管理。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
18.把常用模块的功能打造成独立的服务,通过良好的界面 (API) 来调用不同的服务。
a) 从来没听说过; b) 拷贝代码过来用也可以 c) 如果有明确要求,我可以做好。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
19.在设计中考虑对并行的支持,这样你的API 设计会比较容易扩展。
a) 从来没听说过; b) 并行不会出错的; c) 任何代码都应支持并行。d) 考虑在适当的层次支持并行e) 不但主动做, 还会影响同事一起做好
20.在设计中把展现模块 (View) 和实体模块 (Model) 分开,这样你的设计会更有灵活性。
a) 代码都在一起比较好改; b) 随缘啦; c) 没搞清楚啥是V,啥是M。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
21.重视算法的效率,在开始写之前就要估计好算法的效率是哪一个数量级上的(big-O)。
a) 从来没听说过; b) 我的数据量不大,无所谓; c) 不会有效率问题的,现在CPU 都快了 d) 主动测试程序效率,以验证估算 e) 不但主动做, 还会影响同事一起做好
22.在实际的运行场景中测试你的算法,不要停留在数学分析层面。有时候一个小小的实际因素 (是否支持大小写敏感的排序,数据是否支持多语言)会导致算法效率的巨大变化。
a) 从来没听说过; b) 想用,但不知道工具 c) 主要靠肉眼观察算法效率。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
23.经常重构代码,同时注意要解决问题的根源。
a) 从来没听说过; b) 任何修改都可以叫重构; c) 每天应该重构两次。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
24.在开始设计的时候就要考虑如何测试 ,如果代码出了问题,有log 来辅助debug 么? 尽早测试,经常测试,争取实现自动化测试,争取每一个构建的版本都能有某些自动测试。
a) 从来没听说过; b) 我的代码不会出问题的; c) 项目没有安排时间,我也没有提这事d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
25.代码生成工具可以生成一堆一堆的代码,在正式使用它们之前,要确保你能理解它们,并且必要的时候能debug 这些代码。
a) 从来没听说过; b) 从来不看那些代码; c) 那些代码没有bug。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
26.和一个实际的用户一起使用软件,获得第一手反馈。
a) 从来没听说过; b) 用户太蠢,不值得听反馈; c) 想做但是没有机会。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
27.在自动测试的时候,要有意引地入bug,来保证自动测试的确能捕获这些错误。
a) 没听说过;b) 不必这么麻烦;c) 如果有明确要求,我可以做好。d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
28.如果测试没有做完,那么开发也没有做完。
a) 从来没听说过;b) 签入代码,就是做完了; c) 如果有明确要求,我可以做好。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
29.适当地追求代码覆盖率:每一行的代码都覆盖了,但是程序未必正确。要确保程序覆盖了不同的程序状态和各种组合条件。
a) 从来没听说过; b) 覆盖20% 就好了; c) 要覆盖至少60%。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
30.如果团队成员碰到了一个有普遍意义的bug, 应该建立一个测试用例抓住以后将会出现的类似的bug。
a) 从来没听说过; b) 每个bug都是特殊的; c) 测试用例不值得加 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
31.测试:多走一步,多考虑一层。如果程序运行了一星期不退出,如果用户的屏幕分辨率再提高一个档次,这个程序会出什么可能的错误?
a) 从来没听说过; b) 如果有问题,用户会报告的,我们不用测这些; c) 如果有明确要求,我可以做好。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
32.(带领团队)了解用户的期望值,稍稍超出用户的期望值,让用户有惊喜。
a) 从来没听说过; b) 我们决定用户的期望; c) 如果有明确要求,我可以做好。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
33.(带领团队) 不要停留在被动地收集需求,要挖掘需求。真正的需求可能被过时的假设、对用户的误解或其他因素所遮挡。
a) 从来没听说过; b) 用户不说的,我们不做; c) 如果有明确要求,我可以做好。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
34.(带领团队)把所有的术语和项目相关的名词、缩写等都放在一个地方。
a) 从来没听说过; b) 都记在我脑子里; c) 大家看代码就好 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
35.(带领团队)不要依赖于某个人的手动操作,而是要把这些操作都做成有相关权限的人士都能运行的脚本。这样就不会出现因为某人休假而项目被卡住的情况。
a) 从来没听说过; b) 我们没有休假的,没关系; c) 出了问题再说 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
36.(带领团队)要让重用变得更容易。一个软件团队要创造一种环境,让大家有轻松的心态来尝试各种想法 (例如,模块的重用,效能的提升,等)。
a) 都听领导的; b) 团队严肃紧张最好;c) 不必尝试,失败的可能性太大。 d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
37.(带领团队)在每一次迭代之后,都要总结经验,让下一次迭代的进度安排更可靠,质量更高。
a) 没有时间总结,直接做下一版; b) 总结用处不大; c) 如果上级有要求,就做一下; d) 一直主动这样做 e) 不但主动做, 还会影响同事一起做好
38.(带领团队)团队中往往会有矛盾产生,作为领头人,怎么办?
a) 我没看见矛盾。 b) 和稀泥,过得去就行 ; c) 如果没有捅到上级那里,就打哈哈,希望他们自己搞定;d) 有明确和一致的处理矛盾的原则 e) 不但有明确和一致的处理原则,而且对于影响团队士气的任何事情追究到底
二、回答问题
1.我反对作者的观点,作者认为
单元测试必须由最熟悉代码的人(程序的作者)来写。代码的作者最了解代码的目的、特点和局限性。所以,写单元测试没有比作者更合适的人选了。
我认为单元测试也可以由他人代写,代写代码的人要和程序的作者做好交流沟通。程序的作者的确是最熟悉代码,但他往往也很容易忽视掉一些细节问题。在做Java的pta实验时,常常会碰到提交的结果无法通过。自己会对其中的某个类及一些参数做测试,有一次测试了很久,还是无法找出问题。这时候,我就去找同学及老师帮忙测试,后来找出了问题的所在,有个英文单词打错了。
在alpha阶段中,我深刻体会到作者所说的“单元测试必须由最熟悉代码的人来写”,因为他人可能并不懂你写的代码的逻辑,也并不了解你所写代码的具体作用。在本次冲刺中,我们做的是微信小程序,很多东西都是新学的,像php,javascript,wxml,wxss等,每个人学的东西不太一样,让他人来做测试显然是不太合适。
2.我看了这一段文字,
注释也要随着程序的修改而不断更新,一个误导的注释往往比没有注释更糟糕。另外,注释(包括所有源代码)应该只用ASCII字符,不要用中文或其他特殊字符,否则会大大影响程序的可移植性。
有这个问题”在给程序写注释时,到底应该用中文还是英文?”,我查了资料有这些说法,
(1)最开始的时候一直用中文注释,直到某次换了个环境,然后全部乱码了,后来默默的双语注释。。。
(2)目前用的中文,代码注释大部分是自己以及项目组的成员看,注释还是感觉中文方便点。
我觉得对于”在给程序写注释时,到底应该用中文还是英文?”这个问题,我的看法是要考虑看代码的人是谁,来考虑用中文还是用英文。例如,我们以小组为单位来做项目,那么代码注释大部分是给自己及项目成员看,而我们都习惯看中文注释,自然在给程序写注释时是用中文,若是用英文来写,可能还得去查一下是什么意思,更耗时间。
3.我反对作者的观点,
好的用户体验当然是所有人都想要的,如果它和产品的质量有冲突,怎么办?牺牲质量去追求用户体验么,用户能接受么?
GE公司的总裁杰克.韦尔奇讲过这个故事:20世纪90年代,韦尔奇注意到核磁共振机的通道特别狭窄,在长达几十分钟的检查过程中,病人常常有得了幽闭恐惧症的感觉。韦尔奇做过类似的检查,深有体会。他问专家,能不能把通道做得宽一些?专家说那样会降低扫描成像的质量。他又问,对于那些不需要太高精度的检查,能否牺牲一些成像质量换取用户的良好体验呢?专家说,他们会考虑的......然后就没有下文了。不久,竞争对手推出了宽通道的扫描设备,并夺取了大量的市场份额。GE被动迎战,花了两年时间才赶上对方。
作者举GE公司为例,来说明当用户体验和产品质量有冲突时,应该牺牲质量去追求用户体验,我认为是比较片面的。以三星手机为例,因为Note7爆炸的影响,三星的销量大幅下滑。其根本原因在于产品的质量问题。用户在挑选一件产品时,首先考虑的是这件产品的质量是否过硬,剩下的才会回归到体验效果上。
用户在选择软件时,首先会考虑的是用户体验,其次是产品质量。例如,我们有很多个团队做微信记账小程序,大致的功能都是差不多的,那我在去选择该用那个的时候,我首先就会看它们的界面是否友好,然后看功能方面如何,用户体验哪个会更好一点。比如,可能有些记账小程序中加入了消费的报表,但是加入这个功能后,让小程序整体界面不太和谐,用户在用记账小程序时大部分只要它能够记账就行,就会选择其他用户体验更好的小程序。当用户体验和产品质量有冲突时,可以适当牺牲产品质量来换取良好的用户体验。
三、再提问题
1.我看了这一段文字,
有些燃尽图只是列出了任务的数目, 这种图无法展现项目的拖延, 一个任务有大有小, 它们在图表中都是一个点, 一个16小时的任务需要3 天完成, 一个2小时的任务处于种种原因也花了3天时间, 他们在图表中的表现是一样的。 在实践中, 我个人认为以时间为度量的燃尽图更有效果.
我反对作者的观点,我认为以任务为度量的燃尽图更有效果。燃尽图如果以时间为度量的话,往往我们实际花费的时间要大于预估时间,经常会有“燃尽图已经燃尽,但是实际上并未实现基本功能”这种情况。实际开发过程中,我觉得以任务为度量的燃尽图看起来更直观一点,项目的总体进度如何比较清晰明了。当然,我有个疑问,“如何划分图中任务数目比较合适?”。在Alpha阶段中,我们组任务数目设置的太少了,任务应该再进行一下细分,但是细分的话,要划分到哪个程度比较合适?8个小时可以完成的一项算作一个任务?我查了资料,发现网上并未有相关回答。
2.我看了这样一段文字,
软件工程师在长期的实践中,摸索出一套经验公式:实际时间花费主要取决于两个因素—对某件事的估计时间X,以及他做过类似开发工作的次数N。
Y = X ± X ÷ N //注:Y是实际时间花费。中间的 ±表明或者加上,或者减去。
有这个问题,“像我们组做的是微信打卡小程序,我们此前并未有类似开发经历,那我们在前期对任务进行时间估计时,应该如何做,才能使得我实际耗费时间接近于我的预估时间?”。我们在项目开发过程中,发现我们一个任务的实际耗费时间远远超过我们的预估时间。一个是小组成员都需要学习新的技术知识,还有一个是使用新的语言写代码不熟练,原理不是特别清楚,开发速度慢。
3.我看到这样一段文字,
PM负责除开发和测试之外的所有事情。
有这个问题,“PM是不是不应该由开发人员来担任,而应该由专门负责管理的人来担任,来把握项目的进度?”。在本次冲刺过程中,我负责后端开发,且担任PM一职,既要敲代码又要安排任务,有时候感觉力不从心,很疲惫。
4.我看了这样一段文字,
首先,我相信有分工是好事,软件团队中应该要有独立的测试角色。所有人都可以参与QA的工作,但是最后要有一个角色对QA这件事负责。
有这个问题,“虽说开发和测试应该是同时进行的,那前面又说到单元测试应该由最熟悉代码的人来写,如果将测试角色独立出来,那么测试人员前期在干嘛?写测试计划吗?写团队计划的时候就应该包括了测试计划这一块。”。根据我自己的经验,就我们的项目而言,我觉得冲刺阶段中没有必要将测试角色独立出来,开发时间比较紧,项目若没有完成,而何来后面的测试呢?
5.我看了这样一段文字,
另外,学生们都是匆忙组队,有些技术强的同学想多尝试一些不同的项目,有些同学发现和伙伴合作并不愉快,想换一个环境。因此,在团队项目的Alpha 和Beta阶段之间,要安排一个转组的活动,每个团队必须至少有一个同学离开,转到另一个小组。这样能促使人才合理流动,也能让一些同学体会一下,理解如何融入一个新团队,在别人写的代码上继续开发—这才是软件工程实践的好案例。
有了这样的问题,”如果一个团队相处的很融洽,配合度也不错,为何要换人?新换进来的人,与新的团队之间还要有个磨合期。换人机制一定要执行吗?“。我个人认为可以让有换人意愿的团队之间进行互换,原本团队就挺和谐的就不用换了,像我们团队的队员我觉得都挺好的。