正文之前
首先,说句实话:真的写得好,让我情不自禁就给我的学长推荐了,读完绪论我就有预感,我会放下我手头读的如痴如醉的《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;
int main()
{
srand((unsigned short)time(0));
int num=30;
string d="+-x/";
while(num--)
{
int a=rand()%50+1;
int b=rand()%20+1;
char c=d[rand()%4];
cout<<b<<" "<<c<<" "<<a<<" ="<<" ";
switch (c)
{
case '+':
cout<<a+b<<endl;break;
case '-':
cout<<a-b<<endl;break;
case 'x':
cout<<a*b<<endl;break;
case '/':
cout<<a/b<<"···"<<a%b<<endl;break;
}
int delay=10000;
while(delay--)
{
}
}
}
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里面我也有了几个算法的想法。
-
首先输出一个整数数组中子数组最大的值。
- 这个的话直接使用一个对数组的循环遍历,遇到负数就跳过不管
- 遇到正数就直接加到一个累加器中
- 最后输出就可以了。
-
字符串操作。
- 我们可以用字符串类型来定义一个接受这个字符串字面值。
- 保守的办法是直接用下标配合字符串类型的求字符串长度内置函数size(),循环遍历从string[s.size()-i-1开始输出]
- 另外一个稍微冒险一点办法,因为没有实现所以不敢说对不对:那就是用迭代器。从尾指针开始一路往回读,不知道能不能实现。当然,如果用指针直接指向s[s.size()-1]然后用指针的自减操作读到begin()的话那确实可以!
正文之后
读书完毕,关电脑,睡觉~~ 咦 先把作业交了!!