现代软件工程讨论第一章-第四章

第一章

1、代码如下

#include <iostream>

#include <cstdio>

#include <time.h>

 

using namespace std;

 

int main(){

    srand(time(0));

    while(1){

        printf("随机生成的一个小学四则运算题目,除法省去余数\n");

        int num1 = rand() % 10;

        int num2 = rand() % 10;

        int index = rand();

        int expectAns;

        index %= 4;

        if(num1 == 0){

            num1++;

        }

        if(num2 == 0){

            num2++;

        }

        if(num1 < num2){

            int temp = num1;

            num1 = num2;

            num2 = temp;

        }

        printf("%d ",num1);

        if(index == 0){

            printf("+");

            expectAns = num1 + num2;

        }else if(index == 1){

            printf("-");

            expectAns = num1 - num2;

        }else if(index == 2){

            printf("*");

            expectAns = num1 * num2;

        }else if(index == 3){

            printf("/");

            expectAns = num1 / num2;

        }

        printf(" %d = ",num2);

        int ans;

        scanf("%d",&ans);

        if(ans == expectAns){

            printf("结果正确\n\n");

        }else{

            printf("结果不正确\n\n");

        }

    }

    return 0;

}

 

2.在我使用手机应用的时候,往往会出现闪退的问题,或者这款软件很长时间没有更新。在一些软件中往往存在一些BUG,往往是我们作为用户的时候才发现的,经过开发人员的进一步修改和优化,发布更新版本后,我们用到的软件应用会比以前的好用。

从中我觉得软件的一些本质是:一个软件不会是完美的,开发者往往能够做到时让软件趋近于完美,给用户一个更好的体验。软件是一个逐渐完善和更新的过程。

 

3.目前流行的源程序版本管理软件有Microsoft TFS和Github。项目管理软件有P3、P6。

TFS的优点是它是一个集成的项目管理软件,可以存储文档和代码,并且文档和代码能够进行连接。目前许多其他的产品可以和TFS的功能相结合,同时,TFS具有燃尽图等功能,但是TFS并不是开源软件,使用时可能会支付一定的费用。Github的优点是,他是一个具有开源代码库以及版本控制系统。具有庞大的客户,是管理软件开发首选方法。Github独特的买点在于从另一个项目进行分支的简易型,为一个项目贡献代码非常简单,在Github上用户可以找到海量的开源代码。Github将越来越多的程序转到云端,则会带来一定的安全隐患。P3、P6作为项目管理软件,通常是对实际的工程进行管理,他可以绘制进度图,网络图,可以对一个项目进行WBS分解等操作,能够在具体的工作中非常方便的使用,但是这两个软件经常用在实体的项目建设过程中,在软件项目开发中的应用还不是很广泛,而且这两款软件都有一定的年代,同时也面临更新换代的可能。

 

4.  Dijkstra曾经提到:“Software engineering, of course,presents itself as another worthy cause,but that is eyewash: if you carefully read its literature and analyse what its devotees actually do,you will discover that software engineering has accepted as its charter ‘How to program if you cannot.’” 软件工程是不是教那些不怎么会写程序的人开发软件? 你怎么看?

 

这个答案并不唯一。因为每个人一开始都不懂软件,都是从什么都不会慢慢学习,而且软件工程这个概念可大可小,大到一门学科,一个研究领域,小到一个软件开发必须的过程,所以软件工程这个学科肯定是要教不会的人学会如何开发软件,但是只有懂得如果做软件,才能运用软件工程这个过程科学的开发软件。

 

5.  你所在的学校有计算机科学专业和软件工程专业么?相关专业的教学计划和毕业出路有什么不同?阅读有关软件工程和计算机科学的区别的文章,谈谈你的看法。文章:http://www.drdobbs.com/architectureand-design/software-engineering-computer-science/217701907 

 

我是软件工程的研究生,我本科的大学同学毕业之后,大都工作在外企和民企,如百度,阿里巴巴,微软等大型软件企业,也有工作在小公司中,但是工作岗位都是测试,开发。他们每天很忙碌,加班在刚上班之后已经成为家常便饭,但是工作在国企的同学们相对比较轻松,不会熬夜加班等,但待遇也相对的减少一些。在我看来,软件工程这个专业和计算机相比,更偏向了工程,实践。在学校学习的时候,就多了很多课程设计,专业实训以及做项目的时间,所以本科工作的比较多,动手能力比较强,而计算机专业的学生选择深造的较多,做学术研究等。

 

6.(1).我认为是合法的,因为抢票软件的使用并没有违反法律规定,使用这些软件也是你情我愿的情况,并且在一定程度上是有利于一部分人群的。(2).但是并不能用是否符合道德的规范去评定这件事,就例如买黄牛票的那些人,虽然国家并不支持这种行为,但是在它也增加了一些就业机会、满足了特定人群的需求。(3).属于“软件工程”的研究范围。因为软件是在市场人群需求的驱动下产生并发展壮大的,在不违法的情况的下可以为大家提供更好的用户体验,满足大家的需求,也是一个好的软件的标准吧。

 

7.我认为不是。“银弹”是说能找到一种可以使软件成本像计算机硬件成本一样降低的宝物。现在针对这么多繁杂的编程语言来说,有些已经成熟完善了,也有很多熟悉这些语言的编程大牛们,但是在他们做软件的时候,并没有大大提高开发的效率。软件的特性使得它具有了一些固有的困难,例如你将它规格化、设计和测试的这些必备的过程及不可避免的人为因素等,这些造成了软件开发缓慢的现象,并不只在于你编程时所使用的语言。对于中文编程”而言,可能它的出现及以后的普遍使用会加速人们的编程,使得更多人能参与进来,但是它并不是能改变软件复杂度等固性的决定性因素。

 

10. 课上同学们应该根据自己的爱好和情况组成了5-6 人的项目小组。 并且报告了助教。

10.1: 请每个小组在 cnblogs.com 上面创建团队博客,第一个博客把小组成员都介绍一下  #团队博客作业1

我们组的成员有樊向宇,刘科含,马书博,杨天培。我们四人均为天津大学本校保研学术研究生,这也说明我们在本科是在专业成绩排名前列。我申请的博客链接为http://www.cnblogs.com/flym/。博客名称为现代软件工程讨论组,樊向宇同学在本科就是ACM校队成员,代表学校参加多次比赛,精通C,刘科含同学成绩优异,本科就多次做项目,并去公司实习,锻炼自己,精通Java,马书博同学细心谨慎,理论知识扎实,擅长设计和文档整理,杨天培同学在本科加入实验室锻炼动手能力,并做了国创等项目,精通C#。

 

10.2 对之前团队的采访

问题一:当时的项目有多少用户,给用户多少价值? 现在还有人用吗?

当时的项目有大概200人左右的用户,帮助学院管理创新基金项目。现在还有人在用。

问题二:这个项目能否为我们团队继续开发,源代码/文档还有么?

         这个项目仍然在进行继续的开发,因为前后开发的是两个团队,因此我们项目的源代码和文档都比较完全。

问题三:项目开发有什么经验和教训?

         我们在进行团队开发的时候,遇到了很多之前个人没有遇到的问题,软件工程的思想和规范在团队开发中起到了非常重要的作用。团队成员紧密的合作和流程的规范是项目成功的关键。

问题四:对学好软件工程有什么建议?
         软件工程是一门实践性比较强的学科,想要学好软件工程,必须多多实践,将软件工程课堂上学到的东西真正使用在实际的开发中去,才能发现软件工程其中的妙处。

 

第二章

1 基本作业

(1)

 

#include <stdio.h>

 

int main(){

         printf(“Hello World”);

return 0;

}

 

(2)

 

#include <stdio.h>

 

int findMax(int num[],int length){

    int max = -9999999;

    int i,j;

    for(i = 0;i < length;i++){

        int temp = num[i];

        int tempMax = temp;

        for(j = i + 1;j < length;j++){

            if(temp + num[j] < 0){

                break;

            }

            temp += num[j];

            if(temp > tempMax){

                tempMax = temp;

            }

        }

        if(tempMax > max){

            max = tempMax;

        }

    }

    return max;

}

 

int main(){

    int d[] = {1, -2, 3, 5, -1};

    int b = findMax(d,5);

    printf("%d\n",b);

    int a[] = {1, -2, 3, -8, 5, 1};

    b = findMax(a,6);

    printf("%d\n",b);

    int c[] = {1, -2, 3,-2, 5, 1};

    b = findMax(c,6);

    printf("%d\n",b);

    system("pause");

    return 0;

}

 

 

(3)

#include <iostream>

#include <string>

 

using namespace std;

 

string reverseString(string input){

    string output = "";

    string temp = "";

    for(int i = 0;i < input.length();i++){

        if(input[i] != ' '){

            temp += input[i];

        }else{

            if(output == ""){

                output = temp;

            }else{

                output = temp + " " + output;

            }

            temp = "";

        }

    }

    if(output == ""){

        output = temp;

    }else{

        output = temp + " " + output;

    }

    return output;

}

 

int main(){

    string str;

    while(1){

        getline(cin,str);

        cout << reverseString(str) << endl;

    }

    return 0;

}

 

(5)

问题1:这个程序要找的是符合什么条件的数?

在2到31中只有两个数不是它的约数,并且这两个数是相邻的。

问题2:这样的数存在么?符合这一条件的最小的数是什么?

这样的数不存在。

问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间精确到分钟(电脑:单核CPU 4.0G Hz,内存和硬盘等资源充足)。

2147483648分钟

问题4:在多核电脑上如何提高这一程序的运行效率?

使用并行优化最外层的循环。

 

3  效能分析的讨论

果冻:噫吁唏,危乎高哉!我以前一直害怕做效能分析,看来是否会用效能分析工具来提高程序质量是一个优秀程序员的标志之一。我在今天之前都是盲人骑瞎马。

小飞:改成盲人摸象更恰当。我听说,如果一个程序员从来没有用过效能分析工具,那他就不是一个程序员,只是一个编程爱好者罢了。

我的WC 程序事实上是最快的。但是在今天的程序评比之前,我想更进一步,就再优化了一下,估计能把速度提高2%。没想到出了一个小错误,导致报告的结果(行数、词数、字数)仅仅差了1。由于程序不正确,因此不能参加速度评比。我才是最需要大喊“噫吁唏”的人。

阿超:这有两个教训:

(1)先保证正确性,再提高效能。一个“仅仅差了1”的错误可能会导致缓冲区溢出(Buffer Overflow[i])的严重漏洞。

(2)如果效能的提高效果在5%以下,用户不会注意到程序效能的区别。所以要考虑那些微小的提高是否值得。

另外,WordFreq算法的时间复杂度是多少?能否再优化?请写实际程序加以验证。

荔荔:怎么才能快捷地得到有适量重复文字的文件,来帮助我们进行测试和效能分析?

小飞:我是这样做的,在电脑的根目录下,运行“dir /s > c:\temp\test.txt”命令。

阿超:好主意,大家还有没有别的办法?

 

第三章

1、  选第三种医生。

我们认为软件工程师是需要职业证书的,但是Coder是不需要的。

 

2.我觉得软件开发应该是工程、艺术、手艺三者的结合,说它是一门工程,因为软件的开发,就是一项虚拟工程的建立,它虽然不像建筑工程一样现实存在,但是它和实体工程具有一样的流程,都具有项目管理者,劳动者,开发者等。一行行代码就像是砖头和钢筋。堆砌成一个庞大的软件。说它是一门艺术,软件行业本身就是一次创新,它从现实工程到虚拟工程的转变,以软件解决了人们好多的问题和需求。是一门手艺,会编码的人很多,但是编的好的人却不多,就好比手艺的精通与否,以及能否掌握一定的算法提高软件开发的效率。

    艺术家指具有较高的审美能力和娴熟的创造技巧并从事艺术创作劳动而有一定成就的艺术工作者;既包括在艺术领域里以艺术创作作为自己专门职业的人,也包括在自己职业之外从事艺术创作的人。是上天遗留在人间的一个天使。是一个原于自然,发于心灵的艺术作品创作者。

创造能力是善于运用前人经验并以新的内容和形式来完成工作任务的能力。是公共关系人员应具备的能力之一。开展公共关系活动既要遵循一定规律,又不能囿于固定的模式。应该随着社会的发展,环境的变化和工作的需要不断地对其内容和形式进行新的创新、补充和完善,使之更为丰富。

 

3.软件业发展启示:软件的开发的流程会更加标准、语言更加简洁、质量也会提高,但是也意味着会有更多的人去向这个方向发展。

个人发展启示1.在软件大环境改善的同时,个人应该注意自身的发展和提高,不应该因为多了那些更自由高级的开发工具而忽略了自身的基础知识的学习锻炼,不能依赖于环境的改变,这样才可以适应任何的时代环境2.大家都会想去热门行业发展,要想保持自己的优势地位,不应该期待维持现状,应随着大流去发展,去掌握更新的知识,有超前的想法和市场观察预测能力。

4 案例

程序员小飞原计划三天完成某个任务,现在是第三天的下午,他马上就可以做完。但是在实现功能的过程中, 他越来越意识到自己原来设计中的弱点,他应该采取另一个办法,才能避免后面集成阶段的额外工作。但是他如果现在就改弦更张,那势必要影响自己原来估计的准确性,并且会花费额外的时间,这样他的老板,同事会因此看不起他。如果他按部就班,最后整个团队还要花更多时间在后续集成上,但那就不是他个人的问题了。怎么办?

 

这种情况,他应该在设计上修改了自己的缺陷之后,去报告老板,如果忽略这个问题继续完成,那么后面遇到的困难和需要修改的时间更大,不能因为自己的问题影响整个团队。

 

第四章

4.7.1

总结1:结对编程跟个人单独编程完全不一样,不但大大提高了编程的正确率,两个人更能及时地发现程序中的bug,而且在coding和review的过程中,两个人相互学习,对个人技术的提升也有非常大的帮助。如果项目组来了一个新人的话,使用结对编程的方式能让他快速地融入到团队中来。

4.7.2 经过测试,我的测试类型为ISFP。

SJ类型:他们在项目工作中的风格为循规蹈矩,按照以前的经验和模式。他们更注重于工作所带来的财产和物质。但是他们在工作中往往是混乱无序无组织的。在合作中与这种类型的队友相处,带来的影响是,容易按照以前的模式,没有创新,为物质利益所趋,没有一定的组织能力,容易散漫。在应对时,应该加强对其的管理。能够达到限定要求,关注细节,关注氛围和融入。

SP类型:这种类型的合作者在项目的影响与SJ略有相同,他们通常都是按照常规例行公事,所以鲜有创新。但是他们注重行动,同时可以对

队友进行排忧解难。

NT类型:这种类型的合作者往往注重寻求能力,但是达不到目标后容易产生无能感。但是他们有一定的远见,和SP类型的队友进行合作应该会有一定的帮助。在团队合作中能够产出高质量的新观点。特别是在紧张危险的环境中,能够解决具体的问题。

NF类型:这种类型的合作者可以给他人一定的心里支持,具有一定的人格魅力,但是较为敏感,所以在合作过程中应给予一定的鼓励和夸奖,从而达到更高的效率。对团队合作中具有一定的影响力和号召力,适合领导方面的工作。

 

4.7.3对于是否需要有代码规范[vi],请考虑下列论点并反驳/支持:

这些规范都是官僚制度下产生的浪费大家的编程时间、影响人们开发效率, 浪费时间的东西。

 

反驳,因为代码规范影响的不仅是个人,更影响了团队合作的效率,如果没有代码规范,可能三个月后你读自己的代码都看不懂,甚至看不下去。

 

我是个艺术家,手艺人,我有自己的规范和原则。

 

反驳,代码规范不应该是一个人的规定,而是一个工作组,或者大到一个部门,一个公司统一制定的,如果每个人制定一个,那还是只有自己能看懂自己的部分,影响团队合作的效率。

 

规范不能强求一律,应该允许很多例外。

 

反驳,因为规范就是规范,不能因为个别人破例,而是大家都应该自觉按照这个代码规范去规范自己的代码,编写习惯。

 

我擅长制定编码规范,你们听我的就好了。

反驳,代码规范不应该由单独一个人制定,而是符合大众的。

 

4.7.4 代码复审的讨论

1.代码复审的地位同QA测试一样很重要,并且更容易发现和架构及时序相关等较难发现的问题,还可以帮助团队成员提高编程技能,统一编码的风格

2.代码复审对于团队的培养也是十分重要的。可能在开始比较费时费力,但有了一定基础后,整个团队的编码质量也会提高

 

posted @ 2014-10-13 18:54  SCS-FLYM  阅读(413)  评论(0编辑  收藏  举报