《实施控制软件》第三次作业<构建之法>读书笔记,自我能力评定及学习规划 ~张照博 U201410606

Part 1

虽然是作业,但是我也准备好好地评估一下自己的能力,看看自己到底有多菜鸡,好给自己一个响亮的耳光来督促后面的自我学习!所以我就好好地给自己评估下(参照第二次作业的内容):

PSP2.1 Content Chinese/中文 我的技能需求 耗时
Plan-Estimate 计划-任务时间 幕布-思维导图 2
Devolopment-Analysis 开发-分析需求 博客园作业指导 Github_Readme.md 2
Devolopment-Spec 开发- 设计文档 简书 2.5
Devolopment-Review 开发-设计复审
Devolopment-Standard 开发-代码规范 Qemu调试 1.5
Devolopment-Design 开发-具体设计 阅读老师示例代码 0.5
Devolopment-Coding 开发-具体编码 Mac_sublime C编码 5
Devolopment-Code Review 开发-代码复审 gcc代码(语法)调试结合Github实时更新 1
Devolopment-Test 开发-测试 Ubuntu下Qemu测试 3
Record Time Spent 记录用时
Test Report 测试报告 简书,博客园博客作业总结 1.5
Size Measurement 计算工作量 PSP评估 0.5
Postmortem 事后总结 简书 1
Process Improvement Plan 提出过程改进计划

从上面的不合理的时间分配可以看出来,我真的还只是一个写程序的而不是写软件的,那些很基本的流程里面我缺了很多,基本上是想到什么就写什么。 用GitHub也不是为了团队合作,只是为了版本控制和方便多台电脑之间切换工作环境。


结合上面的一些自我认知,以及《构建之法》的PSP体系介绍,我有如下的一些关于工作需要的能力的认知:

技能 需求 学习路径
精修的编程语言 C/C++、Python、Java、Javascript、PHP、Ruby、Shell、C#等任选 C/C++、Python
标准库的学习 很多轮子已经做好了,我们学会用就好了,公司需要对常用标准库和一些新型的框架要多认识 C/C++11标准库,Python Flask等框架
调试 能够用常用的IDE进行单步测试,代码Debug等调试任务 Xcode单步测试、《C++ Primer》
Debug 能找出错误进行修正 暂未定计划
科学上网 很多代码的错误最开始都是在国外出现解决办法,所以要能沟通世界 Shadowsocks、SSH反隧道流量、VPN
画UML图 能够把需求变成图形,促进更好的沟通 幕布-思维导图、流程图-Visio

下面是基础能力,与技能不同,这些是永不过时的!!

基础能力 推荐学习路径
软件工程的认识 《构建之法》《编程之美》
算法数据结构 牛客网、Letcode、算法导论
效率 知识管理、效率软件--印象笔记+幕布
编程能力 一万小时定律
搬轮子能力 Github、码云、Stack Overflow
造轮子能力 由于情景是初入职,暂不考虑
硬件认识、计算机组成 这些是不可避免的,要想做高端的程序员,你连你最好的合作伙伴都认识不彻底,怎么可能?
  • 在构建之法的第三章中有说到考级之路,我在大二大三分别将计算机等级考试全部考完(下图中是我的四级成绩)。
  • 另外也已经注册了中国计算机学会的学生会员,准备参加近期的CCF能力认证(学生会员会费50,330的报名费可以减到180,想要报考的强推买会员),我的导师给我的任务是280分,有点虚,但是听前辈说不是很困难。我尽力而为。
  • 前阵子也想去参加中级软件设计师的资格认证,但是因为那个时候还要考研,所以就停下了脚步。后来保研了已经错过了报名时间。我准备看看大四下能否参加,好取得更多的能力认证!


Part 2

瀑布模型(Waterfall)

优点:
  • 1. 强调开发的阶段性,各阶段具有顺序性和依赖性 ,各个Part分模块,格子封装,暴露接口,然后耦合在一起组成一个整体

  • 2. 强调早期调研和需求分析,推迟编码实现的观点,在《构建之法》第二章的PSP对比大学生和软件工程师的时候。可以发现,实际的操作中更注重于前期准备和后期的完善,对于编码,不仅仅是由于丰富的资源库,也是因为有了几年的工作经验可以迅速的编码。所以现实中使用模型比较多。不论是模型带动工程师,还是工程师推动模型发展,两者之间的联系都是固定的!

  • 3.  提供了一个摸板,这个摸板使得分析、设计、编码、测试和支持的方法可以 在该摸板下有一个共同的指导。相同的模板下,方便后来的工程师阅读前辈写下来的模块。另外也方便任务的交接,同时还可以更方便的借用网络上开源的库,这些都是模型化设计模型的优点。

缺点:
  • 1. 文档驱动,用户无法及时了解产品的情况。因为很多程序员甚至不知道自己写的代码的全部部分,API接口的使用使得更多的源代码对于程序员不可见了!所以经过程序员的手,到达用户手中之后就更别说了。很多时候出了问题基本就没法找到具体的“事发”地址。对于后期的维护十分麻烦。这是牺牲了底层构建,实现迅速开发的代价。

  • 2. 依赖早期调研和需求分析,很难适应在许多项目开始阶段必然存在的不确定 
    性。 因为毕竟是模型开发,很多时候为了追求速度会采用一些现成的代码。这样必然存在兼容性问题。而且具体的功能需要对应的模块实现。比较依赖于初期的调研,不然后期修改很麻烦。

  • 3.  流程单一,必须要完成前一阶段的任务,才能进行下一阶段,开发过程中的 成功经验无法用于本产品。 瀑布模型这儿特点很僵硬,无法实现并行开发。

  • 4.  测试在后期引入,对于系统存在的重大缺陷,如果在可执行程序评审之前没有被发现,将可能造成重大损失。 求取速度所必须付出的代价!!


总结来说,基于模型的设计真的是一种对劳动力的巨大解放,让我们可以站在巨人的肩膀上安心的搬运轮子来建造自己的宝马,比如说,代码自动生成,文档自动化图形化设计这些,都能够给工程师,设计人员带来巨大的便利。但是,这种情况下如果没有Bug那还好说,但是一旦有了Bug并且没被发现,那就一定是深层次的Bug,这样的一个设计,在推广开来后所要付出的代价与前期开发代价之和,要远远的大于一步步开发自身的设计的方法,但是从头开始添砖加这种事情也只有大公司背得起,互联网公司如果不能迅速的开发出想要的功能,拿不到风投,那就可能夭折,所以说,基于模型的设计利弊皆有,但是目前从实际情况来看,还是利大于弊的。

另,附《构建之法读书笔记》如下:

正文之前

首先,说句实话:真的写得好,让我情不自禁就给我的学长推荐了,读完绪论我就有预感,我会放下我手头读的如痴如醉的《C++ Primer》,转而把这本构建之法读完我再回头读,因为作为一个跨院保研到计算机的人,我目前最不缺的是时间和技巧的学习。但是我极度的缺乏一种思想的锤炼,我现在是披着机械人的皮,走到了机械的十字路口,一年后准备拐弯到计算机去!所以我还有这足够的时间去培养我自己的思想,让我成为一名合格的程序员,而非是“码农”!


正文


不得不说邹欣老师这本书非常合我的胃口,所以一上手,就再也停不下来了。首先在第一版前言中给的那四个形象,我觉得就非常的有意思,直接把《构建之法》这本书与一般的编程手册什么的区别开来了。另外致谢部分,我看到了浙江大学计算机学院的陈越老师,这是我非常喜欢的一个MOOC上的老师,她的数据结构真的是让我受益匪浅。倒数第二段:“最后要感谢我的家人,他们容忍我一个人在厨房里对着电脑长时间发呆,有时还给我煮绿豆汤喝”。 这句话瞬间将老师从一个高高在上的作者拉近到了我们生活中的层面来。读这本书,就没有那种被填鸭式教育的感觉,反而是仿佛与老师一起在黑暗的夜里,敲着字,听着歌,享受着别人煮给自己的绿豆汤,那是多么的一种幸福呀!


然后当看到老师对当代教育体系中的师生关系有如此深的研究的时候,我感觉非常的庆幸,也带点遗憾!庆幸的是:终究还是有很多人是在乎学生与老师之间的关系,把寓教于乐这种崇高的理念贯彻到了生活中,遗憾的是并不能在老师手下学习,反而是在老师口中说的那种传统的,刻板的教学方式中度过了我的大学三年。不过其实我觉得老师描述的学生与老师的关系就好比是健身学员与健身教练之间的关系,这一点,还是要有一点补充:我们学生必须要取得一定的学分,获得一定的成绩,然后才能毕业。但是由于你在健身学员这个关系中是处于消费者模式,也即是上帝模式,所以说你是完全可以不理会教练不去上课的,虽然最后你获得的只是一个生了巨多累赘的身心,但是没有人会追究你的责任,而教育体制不一样!你如果毕不了业,那么你就获得不了任何的肯定了。当然,如果健身房这种地方还有毕业证书这一说,那当我没说


我十分同意,老师在书中说的给授课老师和助教的建议。另外我发现我们《实时控制软件设计》这一门课,老师或多或少的遵守着邹欢老师说的这一套规定。比如说简明公开的规则课堂打分制度,以及很有可能会挂的危险,另外还有各种成绩的加权计算,或多或少都有着这本构建之法中推荐的方法的影子。另外也有循序渐进激励不断总结阶段性成果等先进优秀的理念。首先 个人博客Github账号,这两点我们课堂老师贯彻的非常彻底。还有就是,对于打酱油的同学绝不姑息,这一点我觉得做的非常的好。“这门课不水”,这是我在陈志平同学的博客的评论里面看到的。我觉得用来总结这门课是最好的啦。期待我们后面也会按照更多的邹欢老师推荐的教学制度来。还有我很喜欢老师总结的这一句:**我们学生所需要的环境,是一个自然的、有批判精神的、学习的环境。还有就是在第13页中:“有些系领导会说没有资金支持助教,这是无能的借口,非不能也,是不为也”。我觉得这句话,讽刺中带点幽默,相当有趣。


Chapter 1

要点如下表所示:

  • 程序=算法+数据结构
  • 软件=程序+软件工程.
  • 软件企业=软件+商业模式

画张图就清晰多了:

具体来说是让我认识到了以下几个概念:源代码管理,配置管理,质量保证,软件测试,需求分析。程序理解,软件维护,服务运营,合称为软件的生命周期。另外"将软件与程序分隔开来的就是用户体验 " 这个理念,直接将我们平时写的代码无情的归类到程序,心累。

软件系统是把系统的、有序的、可量化的方法应用到软件的开发、运营和维护的过程。包括:需求分析、设计、构建、测试和维护这几个过程。

软件一般具有下面几个特性:

  • 复杂性(所以钱多话少,因为没时间、特别忙)
  • 不可见性(对于大多数人来说计算机部分硬软件)
  • 易变形(每个bug都是一顿大餐)
  • 服从性(成就感的来源)
  • 非连续性(。。。)

在软件开发的四个不同阶段:玩具阶段,业余爱好阶段,探索阶段,成熟的产业阶段。我现在大概处于玩具阶段到业余爱好阶段之间更偏向于业余爱好阶段。希望可以尽早的度过业余爱好阶段,进入探索阶段,成熟产业阶段,那肯定是工作以后的事了。

另外由于我明年就要去计算机学院博士生,而且走的领域大概就是计算机体系结构/云计算/网络安全这三个里面选一个(体系结构可能性比较大),我这才知道原来体系结构是偏向于实践的领域,我之前一直以为计算机体系结构是要构建计算机的底层,抽象于硬件,但是低于或等同层于操作系统。想不到居然是偏实践的领域啊!!!对于计算机科学与软件工程,我一直以来都是用研究与应用两个观点来区分,现在看来倒是与老师的观点不谋而合。


第一遍读老师的书并没有太深太大的感触,所以只能通过练习来加深印象。迫于时间所限,我写了第一题。至于博客什么的早就有了。版本控制软件,我一直以来都只知道GitHub。貌似还有GitLab吧。还有第六题的Dijkstra这个人,他不是图的广度优先算法里面的缔造者吗?他这个名字当年考研的时候深恶痛绝的抄了几遍才记下来!

//第一题,用于给小朋友随机发放四则运算的题目(vector是之前的,不管不管)
#include <iostream>	
#include <string>
#include<vector>
#include <ctime>
#include <stdlib.h>
using namespace std;

void Cal(int a,int b,int c)
 {
 	switch (c)
 		{
 			case 0:
 				cout<<a<<" +"<<" "<<b<<"  ="<<"  ";
 				cout<<a+b<<endl;break;
 			case 1:
 				cout<<a<<" -"<<" "<<b<<"  ="<<"  ";
 				cout<<a-b<<endl;break;
 			case 2:
 				cout<<a<<" X"<<" "<<b<<"  ="<<"  ";
 				cout<<a*b<<endl;break;
 			case 3:
 				cout<<a<<" /"<<" "<<b<<"  ="<<"  ";
 				cout<<a/b<<"···"<<a%b<<endl;break;
 		}
 }

int main()
 {
 	srand((unsigned short)time(0));
 	int num=10;
 	while(num--)
 	{
 		int a=rand()%50+1;
 		int b=rand()%20+1;
 		int c=rand()%4;
 		Cal(a,b,c);
 		int delay=10000;
 		while(delay--)
 		{
 		}
 	}
        return 0;
}


Chapter 2

第二章的内容,大部分我都能看懂,但是连在一起之后就是似懂非懂。大概是因为我没有真正的负责过一个软件的设计与开发以及维护吧!毕竟我是一个大部分时间都在写程序而不是软件的人哪!!而且我的本命语言是C++/C以及Python。对于接近硬件底层的C#不是很了解。而且对于用集成工具平台,我也没经验。大多数时候都是用编辑器编写之后,再用gcc或者是mingw来编译。不过在2.2后半段提到的效能分析工具,这个我大概有了一点想法,说不定可以自己写一个!但是时间比较紧迫,所以这先不写了。我应该只能写一个代码注入的效能分析。其实很简单嘛,在每一个大括号后面加一个对全局变量的自增操作。那么就可以直接用全局变量来统计这个函数调用的次数。另外,在2.3个人开发流程中了解到的那个PSP概念,让我有了一个对软件开发的整体流程的观念,一定程度上弥补了我先天不足的缺点。这个部分我后面还会继续再看。另外,对于大学生和软件工程师两个群体的调查,我发现确实工程师在需求分析以及测试两方面明显要花更多的时间。至于原因,那是显而易见的:软件工程师不只是玩玩而已,他们要对用户负责,而大部分的大学生都是自娱自乐,属于自high型。而且大学生代码编辑能力普遍不够,所以说更多的时间都会花在代码编写上的。

第二章,实践部分,我也就写个题目来巩固一下吧。

// wc.exe 只能统计行数,单词数目,字符数目
#include <iostream>	
#include <string>
#include<vector>
#include <ctime>
#include <stdlib.h>
using namespace std;

int main()
 {
 	string s;
 	getline(cin,s);
 	int word;
 	int line=1;
 	int alpha;
 	for (int i = 0; s[i]!='\0'; ++i)
 	{
 		char &c=s[i];
 		if (isalnum(c))
 			++alpha;
 		if (c==';' ||  c=='\n')
 			++line;
 		if (isalnum(c)&&(!isalnum(s[i+1])))
 			++word;
 	}
 	cout<<"一共有 "<<line<<"  行,有  "<<word<<" 个单词,有  "<<alpha<<" 个有效字符"<<endl;
return 0;
}

另外在2.4.1里面我也有了几个算法的想法。

  • 首先输出一个整数数组中子数组最大的值。

    • 1、 这个的话直接使用一个对数组的循环遍历,遇到负数就跳过不管
    • 2、 遇到正数就直接加到一个累加器中
    • 3、 最后输出就可以了。
  • 字符串操作。

    • 4、 我们可以用字符串类型来定义一个接受这个字符串字面值。
    • 5、 保守的办法是直接用下标配合字符串类型的求字符串长度内置函数size(),循环遍历从string[s.size()-i-1开始输出]
    • 6、 另外一个稍微冒险一点办法,因为没有实现所以不敢说对不对:那就是用迭代器。从尾指针开始一路往回读,不知道能不能实现。当然,如果用指针直接指向s[s.size()-1]然后用指针的自减操作读到begin()的话那确实可以!

正文之后

读书完毕,关电脑,睡觉~~ 咦 先把作业交了!!

posted @ 2017-10-10 13:53  HustWolfzzb  阅读(582)  评论(11编辑  收藏  举报