牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

[转载]学习时注意思考方法——只献给初学者

来自CU的文章,我觉得很有价值,大家都可以看看的:)
原文:http://bbs.chinaunix.net/viewthread.php?tid=880434&extra=page%3D21


不管是在现实中还是网上,总遇到一些人再问一些奇怪的问题。很多问题让大牛
们哭笑不得,总是推荐这些人看一些经典的书籍。结果过了一段时间,其他人的
知识已经沧海桑田,不少人成了大牛,大牛们已经成了大大牛。这些人还在重复
着类似的问题。本人不是大牛,但是觉得大牛们在技术上帮助别人的同时还应该
更多的传播思维方法。如果大牛们没有时间,那么小弟只好抛砖引玉,谈一些不
成熟的见解,同时希望大牛们多提意见,我再把你们的经验总结起来一齐奉献给
大家。

1)分层思考
在我的同学中有一个人算是经典案例,他学习起来很用功,但似乎不管长时间也
没有气色。并且常问一些让人哭笑不得的问题。我花可长时间也无法让他明白学
校开的课程到底和实际的开发有什么联系。有一天我突然发现,我用如何处理以
太网侦来举例子来说明如何是用C语言的struct的使用他居然就轻易的弄懂了。之
后我总结出来的结论是:他在学习的时候总是尝试一次弄清楚涉及的每一个细节,
结果就陷入了无穷个疑问中,每次都把自己弄的晕头转向。

这里引出了一个对于学习者最终要也是最基本的思考方法:分层。可以说99%论
坛上的哭笑不得的问题是因为没有分层思考造成的。遇到这样的人只能先教他们
学会如何的进行分层思考,再向他们推荐学习资料。

练习分层思考其实非常简单,你考虑拓扑时,就不要考虑数据流程,考虑数据流
程时就不要考虑存储,考虑网络间的协议时,就不要考虑一台机器上的数据是如
何处理的。只要忽略具体的细节,每次只弄懂和问题相关的最小的部分。等你全
部弄懂之后,再考虑层次之间的联系。经常假设“它就是那个样子”,跳过一些问
题也是好的方法,当你发现跳过一些问题会加速自己的理解时,这些跳过的问题
往往就是处于不同层次下的,甚至当你发现一些问题是属于其他层次的时候,问
题本身不复存在了。

分层思考在读书的时候是很容易掌握的,因为大牛们的书本来就会用科学的方法
向你表述他的思想。难在读代码,或者在hacking几乎没有教材的技术的时候,需
要灵活掌握。

2)从整体到局部,从局部到整体
当学会了分层思考后,掌握2)就变得十分简单了。在每个层次上,很多的问题是
相互独立的,将他们归纳出来,如果有必要了解,逐个击破。很多人会抱怨某某
东西很难,其实加上分层再划分之后,逐个解决起来就容易多了。分层是为了获
得综览,划分局部是实际解决问题的必要的步骤。

整体到局部的另一个好处是,实际上你获得了某个技术的最小单位。这些最小单
位通常也会被其他的技术所采纳。举个例子,你了解LDAP时熟悉的FQDN、OID、
realm、BNF等等,在了解电子邮件,HTTP,Keberos的时候也会有用。事实上划分
是再自然不过的方法,只是对于初学者,也许需要特别强调一下。

此外,有些局部的技术可能是不需要了解的,比如说UPnP,可能你只有在解决实
际环境的问题的时候才需要考虑,虽然它哪里都可以见到,但是你绝大部分情况
可以忽略它,无论是在考虑拓扑时,还是在分析代码时。

3)创造和发现问题
创造和发现问题并不一定在你完全掌握了某个技术之后。而是在1)、2)的前提
下,能够在学习的过程中提出建设性的问题。这些问题绝大多数会在学习的过程
中自然的获得答案,少数会在论坛的讨论中得到结论。如果还有剩下的,那么可
能你发现了技术本身存在的缺陷,恭喜你。

事实上创造和发现问题的人很少出现“迷惘”,或者找不到“实践的途径和方法”的
情况。如果出现了这种情况,很可能1)、2)的条件都没有具备。如果1)、2)
都具备了的话,才有下面的方法训练:

多问“如果”。典型的就是在1)时,先问自己,如果是自己会怎样设计?把这个问
题从开始保留到结束。
多问“为什么”。配合“如果”,多问别人为什么这么设计,并且把让这个问题贯穿
到整个的学习过程。
多问“哪些”,哪些东西是可以替换的?通常配合2),这样可以发现实现同一目
的不同方法,很容易发现当前协议的不足之处以及更好的解决办法。

总结
事实上通篇的内容可以归纳为:不断的问下面5个问题:What(1)、Which(2、
3)、What if(3)和Why(3)。仅仅是自己的一点不成熟的经验,而且也写的比
较匆忙,漏洞很多。希望大家指正,也希望真正牛人们多多介绍自己的经验,我
会抽出时间来帮助你们整理,然后奉献给大家。

posted on 2007-03-19 21:56 杨粼波 阅读(968) 评论(7)  编辑 收藏 引用

评论

# re: [转载]学习时注意思考方法——只献给初学者 2007-03-20 00:06 璞石

好文章,虽然编程好几年了,但是有时还是不自觉的陷入某些细节不可自拔,越来越混乱。有良好的思维通常能事半功倍  回复  更多评论   

# re: [转载]学习时注意思考方法——只献给初学者 2007-03-20 01:35 lovedday

谢谢,受益了。  回复  更多评论   

# re: [转载]学习时注意思考方法——只献给初学者 2007-03-20 11:28 空明流转

有道理。其实跟人感受是,有些东西,理解了固然更好,如果一时之间没有理解,那就记住它,迟早是会理解的。  回复  更多评论   

# re: [转载]学习时注意思考方法——只献给初学者 2007-03-20 15:31 Corner Zhang

文章很好,可有些偏颇!
说实话,我学生时就是学习很用功,但成效不大的那个样子,现在看来这样也有好处,是成为所谓大牛前的磨砺阶段。
把学习比作人生的话,就是每个人都处于自身成长过程中不同境遇下时,采用的不同发展策略而已。  回复  更多评论   

# re: [转载]学习时注意思考方法——只献给初学者 [未登录] 2007-03-20 17:45 随意

我已经出来一年了,
在我看来,
学校是积累基础的时刻,
而工作是学以致用的时刻,
在这一年我思考了很多,改变了很多.
过去的一年是痛苦的,
但是却是值得的,
让我成长了很多很多.

做程序本来就是靠脑力吃饭,
如果以为是体力活,
那么就永远都没有长进,
做的永远都是体力活.

我最初写的代码很糟糕,
维护性很差,
但是不断的重构中变得更可维护了,
维护一份维护性很差的代码是体力活;
但是维护一份维护性很好的代码就是脑力活了.

万物相通,
人生的道理可以用在程序中,
程序中的道理可以用于人生.
只有多思,多想,多问(不一定问别人,可以自问),多学才行啊....  回复  更多评论   

# re: [转载]轻轻松松从C一路走到C++系列文章之一 2007-03-20 20:30 asdf

摘要

C++技术固然是很时髦的,许多C用户都想在尽可能短的时间内为自己贴上C++的标签。介绍C++的书很多,但只有那些已经侥幸入门的用户才偶尔去翻翻,仍有不少在C++门口徘徊的流浪汉。

本文只针对C用户,最好是一位很不错的老用户(譬如他在遇到最简单的问题时都尝试着使用指针),通过一些C和更好的C++(本文用的是Borland C++3.1版本)例程介绍有关C++的一些知识,让读者朋友们“浅入深出”,轻轻松松C to C++!

一、标签!标签!

快快为你的程序贴上C++的标签,让你看起来很像个合格的C++用户……

1.注释(comment)

C++的注释允许采取两种形式。第一种是传统C采用的/*和*/,另一种新采用的则是//,它表示从//至行尾皆为注释部分。读者朋友完全可以通过//使你的代码带上C++的气息,如test0l:

//test01.cpp#include <iostream.h>//I'm a C++user!//…and C is out of date. void main(){ cout<<"Hello world!/n"; //prints a string}


Hello-world!

如果你尝试着在test0l. exe中找到这些高级的注释,很简单,它们不会在那里的。

2. cincout

你可能从test0l中嗅出什么味儿来了,在C++中,其次的贵族是cout,而不是很老土的printf ( )。左移操作符’<<’的含义被重写,称作“输出操作符”或“插入操作符”。你可以使用’<<’将一大堆的数据像糖葫芦一样串起来,然后再用cout输出:

cout << "ASCII code of "<< 'a' << " is:" <<97; ASCII code of a is:97


如何来输出一个地址的值呢?在C中可以通过格式控制符”%p”来实现,如:

printf ("%p,&i);

类似地,C++也是这样:

cout << & i;

但对字符串就不同啦!因为:

char * String="Waterloo Bridge";

cout << String; //prints ‘Waterloo Bridge'

只会输出String的内容。但方法还是有的,如采取强制类型转换:

cout<<(void *)String;

cin采取的操作符是’>>’,称作“输入操作符”或“提取操作符”。在头文件iostream.h中有cin cout的原型定义,cin语句的书写格式与cout的完全一样:

cin>>i; //ok

cin>>&i; //error. Illegal structure operation

看到了?别再傻傻地送一个scanf()常用的’&’地址符给它。

C++另外提供了一个操纵算子endl,它的功能和’/n’完全一样,如test0l中的cout语句可改版为:

cout << ”Hello world!”<

3.即时声明

这是笔者杜撰的一个术语,它的原文为declarations mixed with statements,意即允许变量的声明与语句的混合使用。传统C程序提倡用户将声明和语句分开,如下形式:

int i=100;float f; //declarations i++;f=1.0/i; //statements


而C++抛弃这点可读性,允许用户采取更自由的书写形式:

int i=100;i++;float f =1. 0/i;


即时声明常见于for循环语句中:

for(int i = 0; i < 16; i++) for(int j = 0; j < 16; j++) putpixel(j i Color[i][j]);


这种形式允许在语句段中任点声明新的变量并不失时机地使用它(而不必在所有的声明结束之后)。

特别地,C++强化了数据类型的类概念,对于以上出现的”int i=1 j=2;”完全可以写成:

int i(1) j (2);

再如:





http://www.itfensi.com/exploit/Cjj/  回复  更多评论   

# re: [转载]学习时注意思考方法——只献给初学者 2007-03-21 08:46 hehe

大牛,真正的大牛!
对我这样的新手,太好了

最近在看侯杰的<深入浅出>,我被绕晕了,快要放弃了...  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理