"呵呵,算你小子有良心。"老C心满意足的摸着肚子。
"嗯,嗯。"小P有一搭没一搭的回答着,一边数着自己的钱包。
"哈哈,别难过了,下回我请你,还去这家。那个酱骨头味道还真是不错啊。"老C承诺道。
"哦~哦~,我看你是没有吃到刀削面怀恨在心吧,k,好像你饿了一个星期一样,没见过这样吃肉的。"小P很是伤心。
"哈哈,说好了下回我请你的……"
"我没有你吃得多……"小P有些郁闷。
"嗯,我们先把饭量问题放一边,我来帮你装eclipse和CDT吧。"老C开始转移话题。
"对了对了,正事都快忘了。"
感谢教育网的网速和老C的帮助,小P很快装好了eclipse,在老C的指导下写了一个Hello world,算是正式上路了。
"我们以后都要这样开始,"老C不知道从哪里摸出一副眼镜架在鼻子上,"一个问题,一段代码。问题就像正式项目中的需求,而代码就像我们正式的产品。在从需求到产品的过程中,我们会明白C++的哪些技术是因为哪种需求而产生的,这样以后你遇到类似的问题时,就会使用正确的方法或者技术去解决问题了。"老C扶了扶眼镜,"不过在此之前……我要去喝点茶……,好了好了,开玩笑的。不过我真的要问一个很严肃的问题,你考试成绩那么好,是不是分析问题,解决问题的能力就真的那么好呢?"
"那是自然,我的排名可是不低的呢。"
"好吧,我想问问你什么是分析问题,解决问题的能力?"
"多做题,能力自然就上来啦。当我在考试时遇到一个问题,我会想做过的类似的习题或者例题,然后采用同样的方法再做一遍啊。"
"那么要是从来没有做过的类型呢?"
"不可能,我复习的时候是很认真的。"
"……那么你遇到陌生的问题怎么办?"
"分析喽……"
"算了,看来你真是实实在在的经验主义啊。"
"那你说什么是分析问题,解决问题的能力?"
"就我的感觉,分析问题其实是对问题归类。因为在现实生活中,我们其实不用发明什么解决问题的方法,因为那么多科学家、牛人和前辈已经把解决问题的方法放到那里了,我们只是要找到这个方法而已……"老C开始口喷漠漠,“比如你解微分方程,就要看是常系数还是变系数,是齐次还是非齐次,等等,如果你将方程归入某一类,那么解法也就顺其自然了,关键是你要归类正确,然后你就站在巨人肩膀上了。"
"哦?听你一说,我感觉我做题的时候的确是要仔细阅读题目,看看它是想考察哪一类问题或方面的……那么所谓解决问题的能力你认为是什么呢?"
"我觉得所谓解决问题的能力是对细节的理解和掌握程度,细节理解得越透彻,解决问题的能力越强。同时如果你细节理解得越明白,越容易掌握此类问题的根本。"
"哦?说来听听。"
"比如让你来求解一个函数的最值问题,你会怎么做?"
"这
个难不倒我,”小P很是自信,“我数学可不赖的。我需要先对函数求一阶导数,找到它的拐点,然后求二阶倒数,看它在拐点上是上凹还是下凹,来判断这些
拐点处的数值是极大值还是极小值;如果函数在所求范围内没有极点,那么我会判断它是单调增还是单调减函数,然后看函数在所求范围的边界是否连续,边界范围
是否可达;最后不要忘了函数的非连续点,因为非连续点上函数不可导,所以要单独看看。"小P想了想,"哦,如果函数处处不可导而处处连续的话,或者根本就处处不连续,那么就要靠人品构造一些函数,运用夹逼法则,但是一般不会这么bt的。当求出以上所有点后,比较一下,最大的就是最大值,最小的就是最小值。"
"……佩服佩服,"老C鼓掌,“怪不得你的成绩好,看来你是很下功夫的。不错,这些就是对细节的了解,说明起码你
在这个方面解决问题的能力很强!看,你了解求导的前提是要连续,而且了解导数为零的地方是函数的拐点,并且也了解到有可能函数在拐点处不可导,同时你还根
据环境对函数进行了正确的分类:处处可导,处处连续但非处处可导,处处连续处处不可导和非处处连续以及处处不连续,然后根据这些分类、足够充分的细节,良
好的解决了这个问题。"
"呵呵,是啊,但是这个和C++有什么关系?"
"有关系,”老C肯定的说,“
与做高数题目是一样的道理,我们在做C++编码时,首先要注意问题发生的环境——也就是上下文,我们需要根据问题所处的环境与需求对问题分类,这需要我们
收集足够多的信息;然后根据这类问题一般的解决通法列出解决此类问题的方案,再根据具体需求和上下文在方案中挑选,或者对此方案进行修改以满足具体需求,
在这里我们需要关注足够的细节,才可以采纳较优的方案;最后根据需求进行评审,寻找是否还有更好的方案。这只是开发的一般步骤,在具体开发中这些活动是迭
代进行的,从需求分析到代码实现,这些活动重复的出现在软件开发的各个阶段——但是我们得首先解决的问题是,你先要知道可能的分类有哪些,然后再根据所处
的环境和需求,去逆向思维,寻找解决之道。综合起来讲,解决问题的方法就是一般逆向思维的方法,而逆向思维总是靠猜测和试验的,至于猜得好不好或者试验的
对不对,就要靠经验了,如果你的经验够丰富,能够根据逆向思维的结果总结出来一套方法,顺着这个方法你总可以找到正确的问题分类——那么恭喜你,你离大师
也不远了。你看看,是否和解决生活中其他技术问题的方法是一样的呢?”
“好像是的,感觉如果不是创造性的活动的话,还真是这样的,不过就算是创造性活动或者科研活动,也需要对问题进行分类,然后研究看看前人都做了哪些成就可以借鉴的。”小P点点头。
“好了,形而上的东西我们就聊这么多,现在看看形而下的东西。”老C从旁边拉过白板,在上面画了一个圆,在顺时针方向标上了箭头,并在旁边写下“谁是最后一个幸运儿?”“这是一个很常见的问题,可能出现在各大招聘笔试题目中。”
“哦?”
“话说有一帮倒霉孩子——嗯,有20个吧——排排坐,吃果果,但是由于资源匮乏,金融危机等原因,很不幸——只有一个果果。那么这个果果分给谁呢?老师决
定,把他们排成一个圆圈,按顺时针方向标号,12点钟的小朋友是1号,以此类推。然后从1号小朋友开始,依次报数,数到……嗯……7的小朋友就被踢出队
伍,下一个小朋友接着从1开始数,直到队伍中有且仅有一个小朋友。请问,如果你在这个队伍中,你会挑选几号坐位,从而吃到果果呢?”老C停了一下,“你现
在也装好了eclipse,正好可以练练,一开始先用C写吧,然后我们再谈论C++的解决之道。我刚才吃得有点多,得去喝点茶……”于是留下小P一个人,
拿着茶杯出门接开水去了。
“嗯,这个问题不是很难,”小C自言自语,“我只要有一个循环队列就可以解决了……”他先是在一张纸上画了一个圆圈,并安排了5个小朋友玩这个游戏,试了两下,觉得自己理解的差不多了,就开始在键盘上扣扣扣扣的敲代码……
老C回来后看到小P正在忙,也没有打扰他。他一边吹气一边慢慢喝完杯子里的水,顺便在起点上看了几篇yy的穿越水文,估摸着小P差不多了,转过椅子问:“怎么样?差不多了吧?”
“等等,还有一个问题……好了好了,最后一个留下的是2号小朋友。”
“你确认?”
“等等我还得再看看……”小P又是一番手忙脚乱,“好吧,我基本确定是2号小朋友……”
“?”老C很是好奇,“为什么是基本上?”
“因为……这个……我还需要一段调试时间才可以确定……”
“算了,我们来直接看看代码好了。”
“好啊,写得不好请多批评。”小P假装谦虚道,心想自己的代码应当还是不错的。
“是这个a.c文件吗?”
“是的是的,呵呵。”
老C于是做到小P旁边review他的代码。
#include <stdio.h>
void main()
{
int a[20];
int b;
int m;
int k;
int N=20;
for(m=0;m<20;++m){
a[m]=1;}
m= 0;
b =1;
while(N>1)
{ if(a[m]!=0)
{
if (b==7){
a[m] = 0;
--N;
if (N==1)
{break;
}
b=1;
}
else{
++b;
}
}
++m;
m%=20;
}
for(k=0;k<20;++k){
if (a[k]==1)
{break;}
}
++k;
printf("%d\n", k);
}
“我看不懂……”老C才看了30秒就决定放弃了。
“不会吧,我觉得我写得逻辑性还挺清楚的啊。”小P有些得意老C看不懂他写的代码,觉得可能自己写的逻辑过于高深了。
“……”老C沉默了半分钟,“这个不是C代码!”他肯定的说道,“所以我看不懂,也不想看懂。”
“?”小P有些奇怪,“这明明就是C语言写的代码啊,你看,我来给你解释解释……”
“哦,算了,这些根本不是C代码,我没有必要看懂。”
“那你说这些是什么?”小P有些不高兴了。
“这些是……”老C找着合适的形容词汇,“这些是猫爬过屏幕的脚印,我没有必要看懂脚印所代表的含义……”看到小P有些惊愕,然后开始有些生气,逐渐开始
恼羞成怒了,老C赶快对他说:“呵呵,别生气了,我开玩笑的,不过,”老C的语气严肃起来,“这些的确是很糟糕的代码,哪怕它的算法多么高效,执行效率多
么高,它都是糟糕的代码!”
“为什么?”从来没有人说过小P的代码糟糕,听了老C的评论他觉得一时无法接受。
“我们先不评论代码正确与否,单单是它的格式和缩进……”老P用鼠标在代码上划来划去,“就无法让人提起评审它的欲望。”老C真诚的看着小P,“你一定没有参加过比较大型的,3、5个人合作开发的项目吧?”
“是啊,学校里面哪里来的机会?”
“唉,所以说教育失败啊。”老C有些感慨,“即使没有参加过项目,基本的规范性的东西学校还是要教的啊,算了,这个不是你的错,是老师的错,是学校的错。”
“嗯……”听到老C说不是自己的错误,小P开始平静下来。
“言之无文,行而不远,是什么意思?”老C问道。
“就是说如果一篇文章不够优美,那么它就流传不广。”小P还是比较油菜的。
“是啊,代码也是一样的啊。如果它的格式有问题,大家不喜欢看,也就没有人维护,这样的代码很快会被替换掉,哪怕它背后闪烁着照耀银河系的智慧的光芒!”
“是吗?”小P有些不相信。
“好吧,我们试试,”老C决定不要再打击可怜的孩子了,“我们把这个代码放一段时间——就一个星期吧——反正我们这周有两个讲座要听,等到周末的时候你再讲讲你的代码,如何?”
“没有问题,就10几行代码么,我就不相信我记不住!”小P有些和老C对上了。
(to be continued...)