2014年6月24日星期二

【原】开启你的读书2.0时代 - Tony Zhao

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
【原】开启你的读书2.0时代 - Tony Zhao  阅读原文»

目录:

一、引子

二、正文

三、相关主题

一、引子

  下面的内容是几天前我在公司的“读书俱乐部”上的分享,经过整理以后,在这里分享给园子里的朋友们,希望能为你开启“读书2.0时代”!

二、正文

  首先非常感谢公司一直以来对员工个人成长的重视,让大家不仅能免费申请到好书最后还可以拿到奖,我想并不是哪家公司都有这种魄力来作这件事情的,所以非常非常感谢。

  然后,借这个非常难得的机会,我想和大家来分享一些我在读书方法上的一些心得体会,希望能和大家产生一些共鸣。大概在两年前,我在我的博客上发表了一篇叫作《到底怎么样才叫看书》的文章,没想到后来文章发表以后得到了很多的人支持,也被很多网站转载,我得到的反馈就是这种方法是被大家普遍认同的读书方法,所以,今天我也把这种方法推荐给大家,希望能给你带来一点启发。

  首先,我想问一下大家,你有没有想过今天的我们有互联网、有手机、有Ipad,是否还需要选择最原始的读书作为获取信息手段呢?现在IT技术发展的速度非常快,人们每天能够从各种途径获取到的信息总量都是前所未有的,在今天,你可以去读去看的东西实在太多了,借助移动设备,你可以干很多少事情,比如看电影,看电视剧,看小说,看新闻,刷微博,刷朋友圈,等等等等。。。每天大家可能都会花很多时间来处理这些内容,既然天天这么充实,那我们还需要买书,还需要看书吗?

  答案不用说你们也知道,肯定是需要的。不仅是需要,而且今天的我们比过去更加需要读书。互联网的发展在给我们带来了大量唾手可得的信息和便捷的应用的同时,也在渐渐的在吞噬掉我们的独立思考的能力。相信我们大部分人,利用网络的主要目的还是娱乐,真正用来学习的时间很少很少。为什么会这样呢,是不是我们都懒得学习呢,其实不是,很多人还是想利用网络来提升自我价值的,但是,网络上的信息噪声确实太大了,一个内心并不十分强大的人,很难抵挡网络上各种各样信息的干扰,除非是非常有自控力人,一般人想要认认真真踏踏实实的学点东西真的是太难了。所以脱机和脱网学习应该是一个明智的选择,那就是回归到最传统的读书上来。大家都知道亚马逊的Kindle在全球卖的非常火,可它仅仅是一个单一功能的、只能看电子书的设备而已,然而正因为它的单一功能,帮你把不必要的信息噪声隔离开了,你才能更安心的沉浸于读书的兴趣当中,而不会去想着再去上上网或者打打游戏。

  读书貌似人人都会,但是我认为读书这件事并不应该是一个“随便”的事情。大家可能都深有体会,从小大到你读过的书不计其数,可是真正形成你思想,对你的成长有真正帮助的,能有多少?我觉得读书这件事多多少少应该是一种功利的事情,在你准备阅读这本书之后,你应该想清楚,通过看这本书你想了解到什么,你想完善自己的哪些方面的能力,或者你要掌握一种什么样的技术,在这样的驱动下开始阅读才能达到阅读的目的。但如何去读,这是要讲求方法的。不是说,一本书拿过来,从头到尾用了几个小时或者几天的时间只用眼睛看过一遍就算完事了,以为这样就算是读书了。如果是小说的话,可以这样处理,但如果是非小说或者非消遣类的书籍,这样看书的方式就等于浪费时间。因为大家都知道艾宾浩斯曲线,记忆的内容是会随时间而遗忘的。比如你今天看了一本书,内容很精彩,你当时印象非常深刻,这里面的很多观点你都非常认同,你当时可能会觉得”不管以后在什么时候,我都能在大脑里把书中的这个观点提取出来为我所用“。但这其实只是一个美好的幻觉而已,可能仅仅过了一周时间,你就对这些话变得印象模糊了,又过了一周,你可能完全不能记得这些观点是什么了。然后几个月之后,这本书又跟没有看过一样了。 然后你去干嘛了呢?什么都没想,又直接奔下一本书去了。同样的过程,导致了同样的结果。这其实就是我们大多人长期以来的读书习惯。在这样的循环里,你不停的去看新书,然后又不停的把旧书忘的一干二净,结果就是书确实看过很多,但对个人的提升却非常有限,依旧没有形成自己的思想,生活状态也没有太大改变。不知道大家有没有同样的感受呢?

  今天我给大家推荐的方法,其实是一个大家都知道但没有被重视起来的方法,那就是读书笔记。

  首先必须要搞明白什么是笔记。开会的时候记一些零散的支言片语这不是笔记,上课时照抄老师的板书这也不叫笔记。笔记应该是经过自己整理的,有助于加深理解的,有条理,有深度,有持久价值的东西。

  我们平时看一本书的时候,需要关注的应该是那些超过了自己当前心智水平的内容,这部分才是真正对你有用的东西,也只有去消化这些东西,才能让你提高。这部分的内容不只是需要你当时很明白,更需要你去写下来,以后能不断提醒你。那你说,我在书的旁边作注解行不行?我的回答是不行,我们的目的其实不是这本书,而是要从这本书里吸出营养,然后把这本书彻底扔掉。营养是什么,就是形成读书笔记啊。以后你只要有笔记就够了,因为精华都在笔记上,重要的观点、知识点、你的理解等等,都已经被你拿到了,还要这书干嘛?等你真正的养成这个读书记笔记的习惯以后,你就会发现,很多书是没有必要读的,因为你读过了一遍都找不出有几句话值得记在这个本子上的,这其实就是烂书的特征,烂书往往都是非常幼稚的笔法和全篇空洞的内容。看烂书不仅会浪费你的时间,可能还会误导你,可能会害了你。

  下面来讲一下应该如何作笔记。

  我觉得对于不同的类型的书作笔记的要求并不完全一样。如果你看的是专业技术类的,就需要很认真的按照章节把每章的知识脉络都梳理出来,最后你就能得到关于这个技术或都这个学科比较全面的知识系统。如果是经管类的或者心灵成长类的书,你应该把每一个值得思考和借鉴的观点记录下来,可能是一句话也可能是一段话,通过你自己的理解把它记下来,帮助你以后反复理解。反正,不管你读的是什么书,都不应该只读不记,而要把形成读书笔记作为读这本书的主要目标。当然,作笔记可能会拖慢你的阅读速度,但是它不会让你白读,通过笔记的梳理你会更加理解作者想要传达给你的信息究竟是什么。

  关于作笔记我有几个建议:

  首先,作笔记一定要找个厚点的本子,品质要好,但不要过于花哨的,简约的最好。因为你要能预见,当你养成这个好习惯以后,你会经常往这个本子上记新的东西,如果页数太少了,你又要换个新的,这样就会对你的知识系统产生分隔,你会更偏向于经常翻看新的本子,旧的本子就被你束之高阁起来了,旧的内容也会被你渐渐遗忘。

  再有,记笔记的本子坚持用一个,不要总换,也不要给笔记本分类,一个记工作,一个记单词,另一个记读书笔记,不要这样,新的内容就直接追加到旧的内容的后面,这样更容易在你的大脑里形成一个更加全面的知识系统。

  最后一点也就最重要的一点是,一定要经常翻看。记笔记其实就是对大脑缓存的一个整理,就好比你存在计算机内存里的内容永远是不稳定的,一关机断电就丢了,而你一旦写入硬盘,这个安全性有保证了,道理是一样的,你今天对一个问题理解了,但不表明你两天后返回来还能理解到那个程度,最好的办法就是把你理解东西用自己说话的方式记录下来,并且随时翻看,可以说,只要你的这个本子不丢,你就永远能记得这个问题,或者这句话。

  今天我也把我的笔记本带来了。这是三个本让我用胶粘到一块了,这就解决了知识系统被分隔的问题。然后,这个本子我经常带着,也经常翻看,所以只要是我记到这上面的东西,我都能在以后不断的重现,用来帮助我来思考和回忆一些内容。大家有兴趣可以拿去看,给大家作个示范吧。

  时间的关系,我的读书心得就和大家先分享到这,希望以后有机会能和大家作更多交流。 谢谢大家。

  

(这是三个被胶粘在一起的笔记本,马上就要再粘第四个本了)

三、相关主题

《到底怎么样才叫看书》


本文链接:【原】开启你的读书2.0时代,转载请注明。

使用XCB编写X Window程序(01):快速起步 - 京山游侠  阅读原文»

  估计现在已经没有谁使用XCB这么底层的库写应用程序了,要用也是用经过精心封装的Motif, LessTiff, GTK, Qt, EWL, ETK或者Cairo等高层次的库。我之所以这么费心地去折腾XCB,其实主要也是为了学习。毕竟,使用最接近底层的UI库写代码是学习X协议及GUI编程原理的最好方法。

  XCB的主要教程可以参考这里:http://xcb.freedesktop.org/tutorial/

  和X协议有关的文档,在这里:http://www.x.org/releases/X11R7.7/doc/

  在这里要继续吐槽freedesktop.org。没错,XCB的官网又是在freedesktop.org,而且正如我前几篇随笔中提到的Xft、Freetype一样,文档极其不完善。不过在其XcbApi页面有这样的提示“Refactoring this page...please be patient...”,那就耐心等待吧。好在代码是最好的文档,在Fedora 20中安装libxcb-devel软件包后,可以直接到/usr/include/xcb目录下查看XCB库的头文件,所以真要学习XCB也不是很难。如下图,我系统中的XCB库的头文件:

  下面是一个最简单的XCB程序,它的功能是创建一个窗口。由于没有任何事件处理的机制,所以使用了pause()让程序暂停,要退出程序,必须得按Ctrl+C。

1 #include <stdlib.h>
2 #include <sys/time.h>
3 #include <unistd.h>
4 #include <xcb/xcb.h>
5 #include <stdio.h>
6
7 double get_time(){
8 struct timeval timeval;
9 gettimeofday(&timeval, NULL);
10 return (double)timeval.tv_sec + (((double)timeval.tv_usec)/1000000);
11 }
12
13 int main(){
14 double start_time = get_time();
15
16 xcb_connection_t *connection = xcb_connect(NULL, NULL);
17 const xcb_setup_t *setup = xcb_get_setup(connection);
18 xcb_screen_iterator_t iter = xcb_setup_roots_iterator(setup);
19 xcb_screen_t *screen = iter.data;
20
21 xcb_window_t window = xcb_generate_id(connection);
22 xcb_create_window(
23 connection,
24 XCB_COPY_FROM_PARENT,
25 window,
26 screen->root,
27 100,100,
28 400, 300,
29 10,
30 XCB_WINDOW_CLASS_INPUT_OUTPUT,
31 screen->root_visual,
32 0, NULL);
33 xcb_map_window(connection, window);
34 xcb_flush(connection);
35
36 printf("花费时间:%f秒。",get_time()-start_time);
37 fflush(stdout);
38
39 pause();
40 xcb_disconnect(connection);
41 return 0;
42 }

  从这段代码可以看出,要创建一个简单的窗口程序,必须经过如下步骤:

  1、连接到XServer的Display,通过xcb_connect()函数进行,返回一个xcb_connection_t的指针,在这一步中,同时可以获得该Display有多少个Screen;

  2、获得xcb_setup,通过xcb_get_setup()函数进行。xcb_setup里面保存的是应用程序和XServer之间通讯时需要用到的信息,包括协议的版本、字节的顺序等。一般情况下,我们不需要关注这些细节;

  3、获得Screen对象,这一步很重要,也很复杂。重要是因为只有获得一个Screen后,才能在屏幕上创建窗口,创建窗口时需要用到Screen中的一些信息。复杂是因为一个Display可以有多个Screen,所以通过xcb_setup_roots_iterator()函数返回的是一个迭代器,可以通过该迭代器对所有的Screen进行遍历。如果只有一个Screen,则返回的第一个迭代器中的data就指向该Screen。XCB中使用xcb_screen_t结构来保存Screen的信息;

  4、创建窗口并显示窗口,这需要三步,第一步先使用xcb_generate_id()函数生成一个ID,第二步使用xcb_create_window()函数创建一个窗口,第三步使用xcb_map_window让窗口显示出来。

  通过以上的代码,我还学到了一个技巧,那就是使用gettimeofday()函数来获取一个精确到微秒的时间,用来查看应用程序的耗时。

  程序运行如下图:

  这个新创建的窗口自己没有背景,所以它创建的时候屏幕上有什么,它窗口里面就有什么。对于程序中用到的数据结构和枚举的含义,可以直接查看xcb的头文件,配合ctags和taglist.vim插件使用的话,只需要按Ctrl+]键,就可以自动跳转到这些数据结构的定义处(在Vim中使用taglist的方法见这里Linux江湖02:打造属于自己的Vim),如下两图:

  最后,我对第一个简单的程序进行适当的扩展,看看怎么获取Display中有几个Screen以及怎么遍历Screen,最后显示Screen的一些信息。程序如下:

1 #include <stdlib.h>
2 #include <sys/time.h>
3 #include <unistd.h>
4 #include <xcb/xcb.h>
5 #include <stdio.h>
6
7 double get_time(){
8 struct timeval timeval;
9 gettimeofday(&timeval, NULL);
10 return (double)timeval.tv_sec + (((double)timeval.tv_usec)/1000000);
11 }
12
13 int main(){
14 double start_time = get_time();
15 int screen_number;
16
17 xcb_connection_t *connection = xcb_connect(NULL, &阅读更多内容

没有评论:

发表评论