zoukankan      html  css  js  c++  java
  • 个人作业4——alpha阶段个人总结

    一、个人总结

    第一部分、硬的问题

    类别 具体技能和面试问题 现在回答
    语言 最拿手的计算机语言,代码量多少? java,代码量大概有五七八千行而已
    软件实现 你有没有在别人的代码的基础上改进,你是怎么读懂别人的代码的,你采取了什么办法来保证你的新功能不会影响原来的功能?你在开发中碰到的最复杂的bug是什么?你是如何解决的?这个bug出现的原因是什么,你在将来应该如何去避免bug再出现? 在结对编程的作业上有对别的代码进行改进,读懂别人的代码是一件挺费时间的事情,要是在他的基础上改真是难上加难了。当时我是对一个四则运算的程序进行改进,本来是只能单个数字进行加减乘除,我改进了可以多个数字进行运算。因为只是做连续的多个数只有一个运算符号的运算功能。遇到的bug也是很难,就是在符号判断上对于正负和减号不能很好的区分,当时也没能想到一个完美的方法解决,因为对别人的代码实在是不能完全理解,加上自己的编程基础不是很好,这个bug就没能解决。
    需求分析 你做过多少个有实际用户的项目,用户人数多少,你的项目有什么创新之处? 暂无,有正在做的项目
    行业洞察力 你最感兴趣的领域是什么,这个领域过去十年有什么创新,你分析过这个领域前十的产品吗,请分析一下他们的优劣,你要进入这个领域,如何创新 对于开发这一块的兴趣不大,对于网络技术方面的领域比较感兴趣。近年来的网络的最大创新就是云计算的发展,数据的可用性以及完整性是用户使用云服务的根本。云计算因按需服务、资源池共享、按服务收费等特点,近年来在各应用领域中得到快速发展。计算机的发展历程经历了主机系统与集中计算,效用计算,个人计算机与桌面计算,分布式计算,网格计算,软件即服务( Software as a Service,SaaS ),云计算的出现等阶段。从计算模式的演变历程来看,具有集中、分散、集中的特点。
    项目管理 你参加过项目管理吗,如何决定各个任务的优先顺序,如果项目不能及时完成,你要怎么办 这次的alpha阶段尝试了项目管理,这个阶段的任务优先级就是基础记账功能这个是最优先的任务,其他任务根据程序结构运行顺序来决定。如果项目不能及时完成,那肯定得在任务时间外尽力完成。
    软件设计 你做过架构设计,模块化设计,接口设计么? 之前写代码的习惯就是什么都没考虑直接写,对这些设计没有考虑太多
    质量意识 你是怎么做代码复审的,你加入我们团队后,能帮助我们提高代码质量么,请具体说怎么提高? 我们团队的代码复审是让团队的所有人运行检查代码,直到通过所有成员的认可后才算复审成功。因为我的代码基础薄弱,暂时不能考虑代码质量问题。
    工具、社区 你在各种开发平台都使用过什么样的工具,自己写过什么工具来改进工作效率?你给社区贡献过什么工具代码?,GitHub有分享代码么?你写的技术博客坚持了多久,读者最多的是哪一篇? 我使用过eclipse、NetBeans 、CodeBlocks、微信开发者工具等,自己没有写过工具来改进工作效率。没有给社区贡献过工具代码,在码云上有分享代码。技术博客只是老师要求作业才会写,读者最多的是java课设做的学生信息系统的那篇博客。
    团队协作 请描述你在项目中如何说服同伴采用你提出的更好的解决方案,或者你如何听取别人的意见,改进了自己的方案?你如何说服懒惰的同伴加紧工作,实现团队的目标? 每个阶段有每个阶段要完成的任务,队长都会合理分配给每个成员他应该要做的任务,一般如果成员有更好的解决方案都会主动提出,我们互相之间都能积极听取别人的意见。懒惰的同伴一般都能在团队氛围的带动下都能主动完成自己的任务。
    理论素养 你上过什么数学,计算机或者其他理论课,请举具体的例子,说明你学的理论知识如何帮助你解决实际问题。 高等数学、线性代数、离散数学等数学知识,计算机知识有java,C语言,数据结构,数据库等,主要是提高的代码的逻辑思维能力,还有数学能力能很好的帮助代码的逻辑设计。

    第二部分、软的问题

    1. 保持高标准,不要受制于破窗理论(broken windows theory)[i]。
      当你看到不靠谱的设计、糟糕的代码、过时的文档和测试用例的时候,不要想 “既然别人的代码已经这样了,我的代码也可以随便一点啦。”

    c) 如果有明确要求,我可以做好。

    1. 主动解决问题。当看到不靠谱的设计,糟糕的代码的时候,不要想“可能别人会来管这个事情” ,或者“我下个月发一个邮件让大家讨论一下”。要主动地把问题给解决了[ii]。

    d) 一直主动这样做

    1. 经常给自己充电,身体训练是运动员生活的一部分,学习是软件工程师职业的伴侣。每半年就要了解和学习一些新的相关技术。通过定期分享(面对面的分享,写技术博客等)来确保自己真正掌握了新技术。

    b) 看了就忘

    1. DRY (Don't Repeat Yourself)——别重复。在一个系统中,每一个知识点都应该有一个无异议的、正规的表现形式。

    c) 这要讲场合

    1. 消除不相关模块之间的影响,在设计模块的时候,要让它们目标明确并单一,能独立存在,没有不明确的外部依赖。

    b) 出了问题再说吧;

    1. 通过快速原型来学习,快速原型的目的是学习,它的价值不在于代码,而在于你通过快速原型学到了什么。

      a) 从来没听说过;

    2. 设计要接近问题领域,在设计的时候,要接近你目标用户的语言和环境。

    c) 大概同意,但是怎么接近用户呢?

    1. 估计任务所花费的时间,避免意外。在开始工作的时候,要做出时间和潜在影响的估计,并通告相关人士,避免最后关头意外发生。工作中要告知可能的时间变化,事后要总结。

      b) 大概估一下,不必在意时间

    2. 图形界面的工具有它的长处,但是不要忘了命令行工具也可以发挥很高的效率,特别是可以用脚本构建各种组合命令的时候。

    c) 正在学习命令行工具。

    1. 有很多代码编辑器,请把其中一个用得非常熟练。让编辑器可以实现自己的定制,可以用脚本驱动,用起来得心应手。

    a) 只用老师教的一个;

    1. 理解常用的设计模式,并知道择机而用。设计模式不错,更重要的是知道它的目的是什么,什么时候用,什么时候不用。

    c) 每写100行程序,我就尽量用一个模式。

    1. 代码版本管理工具是你代码的保障,重要的代码一定要有代码版本管理。

    b) 用QQ,u盘即可;

    1. 在debug的时候,不要惊慌,想想导致问题的原因可能在哪里。一步一步地找到原因。要在实践中运用工具,善于分析日志(log),从中找到bug。同时,在自己的代码里面加 log.

    b) 只会printf;

    1. 重要的接口要用形式化的“合同”来规定。用文档和断言、自动化测试等工具来保证代码的确按照合同来做事,不多也不少。使用断言 (assertion) 或者其他技术来验证代码中的假设,你认为不可能发生的事情在现实世界中往往会发生。

    c) 想用,但没有时间。

    1. 只在异常的情况下才使用异常 (Exception), 不加判断地过多使用异常,会降低代码的效率和可维护性。记住不要用异常来传递正常的信息。

    c) 如果有明确要求,我可以做好。

    1. 善始善终。如果某个函数申请了空间或其他资源,这个函数负责释放这些资源。

    c) 有时这样做。

    1. 当你的软件有多种技术结合在一起的时候,要采用松耦合的配置模式,而不是要把所有代码都混到一起。

    b) 没有实践的机会;

    1. 把常用模块的功能打造成独立的服务,通过良好的界面 (API) 来调用不同的服务。

    c) 如果有明确要求,我可以做好。

    1. 在设计中考虑对并行的支持,这样你的API 设计会比较容易扩展。

    d) 考虑在适当的层次支持并行

    1. 在设计中把展现模块 (View) 和实体模块 (Model) 分开,这样你的设计会更有灵活性。

    c) 没搞清楚啥是V,啥是M。

    1. 重视算法的效率,在开始写之前就要估计好算法的效率是哪一个数量级上的(big-O)。

    b) 我的数据量不大,无所谓;

    1. 在实际的运行场景中测试你的算法,不要停留在数学分析层面。有时候一个小小的实际因素 (是否支持大小写敏感的排序,数据是否支持多语言)会导致算法效率的巨大变化。

    d) 一直主动这样做

    1. 经常重构代码,同时注意要解决问题的根源。

    a) 从来没听说过;

    1. 在开始设计的时候就要考虑如何测试 ,如果代码出了问题,有log 来辅助debug 么? 尽早测试,经常测试,争取实现自动化测试,争取每一个构建的版本都能有某些自动测试。

    c) 项目没有安排时间,我也没有提这事。

    1. 代码生成工具可以生成一堆一堆的代码,在正式使用它们之前,要确保你能理解它们,并且必要的时候能debug 这些代码。

    b) 从来不看那些代码;

    1. 和一个实际的用户一起使用软件,获得第一手反馈。

      c) 想做但是没有机会。

    2. 在自动测试的时候,要有意引地入bug,来保证自动测试的确能捕获这些错误。

    a) 没听说过;

    1. 如果测试没有做完,那么开发也没有做完。

    d) 一直主动这样做

    1. 适当地追求代码覆盖率:每一行的代码都覆盖了,但是程序未必正确。要确保程序覆盖了不同的程序状态和各种组合条件。

    c) 要覆盖至少60%。

    1. 如果团队成员碰到了一个有普遍意义的bug, 应该建立一个测试用例抓住以后将会出现的类似的bug。

    b) 每个bug都是特殊的;

    1. 测试:多走一步,多考虑一层。如果程序运行了一星期不退出,如果用户的屏幕分辨率再提高一个档次,这个程序会出什么可能的错误?

    c) 如果有明确要求,我可以做好。

    1. (带领团队)了解用户的期望值,稍稍超出用户的期望值,让用户有惊喜。

      c) 如果有明确要求,我可以做好。

    2. (带领团队) 不要停留在被动地收集需求,要挖掘需求。真正的需求可能被过时的假设、对用户的误解或其他因素所遮挡。

    d) 一直主动这样做

    1. (带领团队)把所有的术语和项目相关的名词、缩写等都放在一个地方。

    c) 大家看代码就好

    1. (带领团队)不要依赖于某个人的手动操作,而是要把这些操作都做成有相关权限的人士都能运行的脚本。这样就不会出现因为某人休假而项目被卡住的情况。

    b) 我们没有休假的,没关系;

    1. (带领团队)要让重用变得更容易。一个软件团队要创造一种环境,让大家有轻松的心态来尝试各种想法 (例如,模块的重用,效能的提升,等)。

    b) 团队严肃紧张最好;

    1. (带领团队)在每一次迭代之后,都要总结经验,让下一次迭代的进度安排更可靠,质量更高。

    d) 一直主动这样做

    1. (带领团队)团队中往往会有矛盾产生,作为领头人,怎么办?

    d) 有明确和一致的处理矛盾的原则
    二、回答问题
    我们在课程开始之初,曾经要求大家针对软件工程提出问题:个人阅读作业2,那么在经过alpha阶段,大家是否对软件工程有了一定的了解?请结合自己提出的问题进行回答

    Q1

    如何能让自己负责的模块功能定义尽量明确,模块内部的改变不会影响其他模块,而且模块的质量能得到稳定的、量化的保证?单元测试就是一个很有效的解决方案。
    
    
    • 如果我写程序较简单,是不是就不需要对其进行单元测试呢?如果需要,是不是会浪费时间?对于较大的程序来说,项目前期还在尽量写测试,到了后期会不会因为繁琐或者没有足够的时间而就失控放弃了呢?

    回答:对于一个软件工程的程序来说,再小也是一个工程,单元测试可以帮助开发人员编写代码,提升质量、减少bug,因为我们不希望在程序使用时出现太多bug,虽然会多花费时间,但是值得的。对于较大的程序工程来说,编写单元测试代码的过程就是促使开发人员思考工作代码实现内容和逻辑的过程,之后实现工作代码的时候,开发人员思路会更清晰,实现代码的质量也会有相应的提升。而且可以提升反馈速度,减少重复工作,提高开发效率。开发人员实现某个功能或者修补了某个bug,如果有相应的单元测试支持的话,开发人员可以马上通过运行单元测试来验证之前完成的代码是否正确,而不需要反复启动编译运行修改来验证功能,对代码质量也有很大的好处。

    Q2:

    在结对编程中,因为有随时的复审和交流,程序各方面的质量取决于一对程序员中各方面水平较高的哪一位。
    
    这样,程序中的错误就会少的多,程序的初始质量会高很对,这样会省下很多以后修改、测试的时间。
    
    • 结对编程虽然好处大,但也是两个想法相似实力相当的人才能做到很好的配合,但要是两个人的意见不合,习惯不同,也可能一个人不作为一个人做了大量工作,到头来还是一个人编程的效果,是不是说明结对编程并没有那么好呢?

    回答:结对编程的结对需要的是两个志同道合而且技术相当的人,这样的两个人才能创造出1+1>2的成果。结对编程使得两个程序员都被迫提高了工作效率。如果单独工作,在遇到困难的时候,并不是所有人都能立刻积极地去解决问题,总是会这边做点别的那边坐点别的。而结对编程有一种相互督促的作用,在一边工作疲惫状态不好使,另一边会起一个鼓励和激发斗志的作用。如果两个人并不能很好的配合工作,那么这样的结对编程是没有意义的。

    Q3

    敏捷开发的其中一条原则:
    
    经常发布可用的软件,发布间隔可用从几周到几个月,能短则短。
    
    • 敏捷开发经常对软件进行迭代更新,强调了敏捷的做法更能带来价值,但是不是会过分追求眼前的短期目标,从而导致忽略了长期的目标和未来的发展呢?

    敏捷方法对每一次迭代周期的质量都有严格要求,并不是只追求眼前的目标,而是一代一代迭代式的更新。一些敏捷方法会在正式开发功能代码之前先开发该功能的测试代码。这些都为敏捷项目的整个开发周期提供了可靠的质量保证。这也是慢慢对长期目标的靠近与实现。

    Q4

    创新的迷思之三:好的想法会赢
    
    • 对于那些长期存在而且又有稳定地位的IT产品,在此创新可能就会比较困难,那是不是就说明没有必要在这个地方创新呢?因为你再创新也打不过原来的东西,这种创新值不值得?

    怎么说呢,机会总是留给有准备的人,虽然当前的产品几乎都很完善,但世界在发展,一个好的想法、符合人们日常生活习惯的想法,兴许也能做出很大的成果,创新是要有的,不在乎他是不是值不值得。

    Q5

    • 第十六章详细介绍了IT行业的创新,虽然很详细,但对于我们在校学生而言,似乎距离比较遥远。对于我们学生而言,要如何处理应对创新浪潮呢?如果自己的能力不是很高,是否要适当放弃呢?

    创新是符合人的自然发展规律的,尤其是社会未来的大学生而言。我国高等教育正逐步走向“大众创业、万众创新”的趋势,这既是社会发展的潮流趋势也是国家政策的导向。我们大学生是我国现代化经济建设的前景,创新一直以来都是以我们大学生为主导,我国高校也一直致力于培养大学生创新创业的能力,这给我们也提供了大量的机遇。

    三、再提问题

    关于读懂并修改别人的代码,重构别人的代码、功能。
    
    • Q1:毕竟别人写代码的习惯跟自己的习惯不会相同,就算经过规范后的代码,要读懂g并重构都不是一件简单的事情,为什么要去修改一个你没有参加过的代码项目?这样是不是太费时间了?
    关于项目经理的问题
    
    • Q2:对于大多数同学来说,项目经理这个概念还是比较陌生的,对于一个完全对项目经理没有经验的人来说,需要多久的时间精力来做呢?是不是会对整个项目的进度造成影响?如果造成影响该怎么办?
    关于团队管理代码仓库问题
    
    • Q3:每个人的思想是不一样的,如果团队中的编写代码人员的意见不合,修改了团队的代码,造成另外的开发人员的麻烦,这种现象改如何解决?

    其实我对构建之法这本书没有什么太多的问题,只是在学习中,但我对软件工程这门课有一些自己的问题,如下:

    • Q4:软件工程是一个专业,但在本学期却当成一门课来上,这样的话上课的意义在哪里呢?只是想让我们了解一下软件工程这个过程吗?
    • Q5:软件工程是一门不错的课程,但对于一些不从事软件开发的同学来说,对以后的学习工作有什么帮助吗?这是我比较不理解的地方。
  • 相关阅读:
    Redis键是如何过期删除的
    使用EventBus + Redis发布订阅模式提升业务执行性能(下)
    使用EventBus + Redis发布订阅模式提升业务执行性能
    使用C#的计时器加观察者模式完成报警推送需求
    Go 语言入门教程:变量
    Go 语言入门教程:安装
    Docker 入门:Dockerfile
    Docker 入门:容器
    Docker 入门:什么是 Docker ?
    Windows 系统如何安装 Docker
  • 原文地址:https://www.cnblogs.com/leexd/p/9050156.html
Copyright © 2011-2022 走看看