<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tony Bai &#187; 读书</title>
	<atom:link href="http://tonybai.com/tag/%e8%af%bb%e4%b9%a6/feed/" rel="self" type="application/rss+xml" />
	<link>https://tonybai.com</link>
	<description>一个程序员的心路历程</description>
	<lastBuildDate>Mon, 08 Jun 2026 23:32:23 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>《走近周恩来》读后感</title>
		<link>https://tonybai.com/2021/09/15/getting-closer-to-zhou-enlai/</link>
		<comments>https://tonybai.com/2021/09/15/getting-closer-to-zhou-enlai/#comments</comments>
		<pubDate>Wed, 15 Sep 2021 14:02:49 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[读书吧]]></category>
		<category><![CDATA[不忘初心]]></category>
		<category><![CDATA[中国共产党]]></category>
		<category><![CDATA[习大大]]></category>
		<category><![CDATA[信仰]]></category>
		<category><![CDATA[周总理]]></category>
		<category><![CDATA[周恩来]]></category>
		<category><![CDATA[国际歌]]></category>
		<category><![CDATA[实事求是]]></category>
		<category><![CDATA[微信读书]]></category>
		<category><![CDATA[毛泽东]]></category>
		<category><![CDATA[读书]]></category>
		<category><![CDATA[读书会]]></category>
		<category><![CDATA[走近周恩来]]></category>
		<category><![CDATA[邓小平]]></category>
		<category><![CDATA[革命斗争]]></category>

		<guid isPermaLink="false">https://tonybai.com/?p=3287</guid>
		<description><![CDATA[本文永久链接 &#8211; https://tonybai.com/2021/09/15/getting-closer-to-zhou-enlai 不写书评/读后感，那是没有遇到真正让你内心感动的书！ 实际上我并没有读这本书，而是在连续一周多的驾车途中通过“微信读书”将这本书听完的。 虽然是听书，并且听的还是AI机器人的播讲，但书中记录的那份真实且炽热的情感却无法隐匿在AI机器人那稍有些怪异的声线中。几乎每天都有书中的情节让我在途中泪目。 好了，不卖关子了。这本书就是权延赤的纪实文学作品《走近周恩来》(封面如下图)。 本书的主人公是我们敬爱的开国总理，建国后在总理这个岗位上为人民、为国家操劳26年的周恩来。 这本书的主要内容来自对1940年来跟随周恩来的警卫、副官、秘书等的采访，作者以“何树英”这个名字来指代这些在总理身边工作的人。正如本书作者所说，这是一本纪实文学，不是档案资料，有些地方是有文学加工的并有作者自己的观点掺杂于其中。但这完全不妨碍对总理光辉一生的真实展现。 作为普通老百姓，我无法站在历史的高度用那些高大上的词汇来概括周总理伟大的一生。这里就结合2018年习大大在“纪念周恩来同志诞辰120周年座谈会上的讲话”中对周总理的客观评价（作为子标题）以及书中内容，让我们重新认识一下周恩来。 “实事求是”的自我认知 周恩来在革命战争期间所做出的伟大贡献以及建国后26年的总理生涯均受益于周恩来实事求是地自我认知。 下面内容摘自书中： 在一次涉及人事分工的会议上，毛泽东望着周恩来：“恩来同志，你来怎么样？”周恩来摆手：“不行不行，主席，你是了解我的，我不是帅才。我理理家可以，做不了帅……”。 “我不是帅才”这是周恩来在多年工作实践之后对自己的自我认知。周恩来知道自己不能逞匹夫之勇地去争取最高权力，去拿中国革命的前途当赌注。从南昌起义到遵义会议，周恩来的持续的自我反省让他认识到毛泽东才是中国革命道路上那个唯一的领袖，于是在遵义会议上全力推荐毛泽东领导中国革命的“枪杆子”。用本书作者的话：“这一切都不能叫作伟大的谦让，而是伟大的自知之明和知人之明”。一个人“最大的勇敢莫过于看清事实且敢于实事求是”。 遵义会议后，明确了自我定位、明确了未来方向的周恩来甘愿做好中国革命的大管家，一心一意辅佐毛泽东，让毛泽东专注于思考中国革命的未来道路和实现战略，而他则将日常琐事包揽于身。 周恩来自我认知与知人之明的另外一个典型事例是对邓小平的评价： “从愿望上说，我更欣赏小平同志的‘举重若轻’，但说实在话，我这个人做不到这一点。我同伯承同志一样，在工作上常常是‘举轻若重’。这也许是同我长期负责具体的执行工作有关吧……”。 周对邓的欣赏也体现在其晚年力荐邓小平接班中央核心工作，为中共第二代领导核心的形成贡献了自己的一份力量。 现在看来，敢于“实事求是”的自我认知是周恩来伟大一生的基础与前提，也成就了中国共产党领导核心的优良传承。 不忘初心、坚守信仰的杰出楷模 周恩来从小立志“为中华之崛起而读书”，这颗种子深深扎根在周的心中。青年时期的周恩来更是坚定了“革命理想高于天”，这一信仰直接决定了周日后的思想路径和重大人生行为。 坚守信仰的周恩来在面临两次配偶选择时，都坚定的站在了“一切有利于革命斗争”原则的一边。 第一次是南开中学前身严氏学塾的校长严修十分器重周恩来的人品和才学，经过长期观察，慎重考虑，决定将自己的女儿嫁给周恩来，并亲自托人向周恩来提亲。但年轻的周恩来却很有礼貌地婉辞了这次提亲。周恩来当时的想法是：“我是个穷学生，刚入学时，学习和生活费用靠伯父支持，现在虽然靠成绩好，做了免费生，生活费用还要靠自己解决。以我这种情况，假如和严家结了亲，我的前途一定会受严家支配。所以我辞却了这门亲事”。周恩来的这次拒绝在常人看来很难理解，但是如果从周恩来始终秉持的“救国抱负和自尊自强”来看，这一切显得又十分正常。 第二次是在周恩来在法国勤工俭学期间，周恩来曾经有一位比较亲近的朋友，是个漂亮的姑娘。然而，好朋友未必适合做妻子。一旦作为婚姻来考虑，这位漂亮的姑娘就不行了。因为她仅仅是同情革命，而周恩来需要的是“能一辈子从事革命”，“能经受革命的艰难险阻和惊涛骇浪”的伴侣。于是周恩来对这第二位候选配偶做出了否定的决定。 后来的事情大家都知道了，周恩来在法国期间就物色好了那个“能一辈子从事革命”，“能经受革命的艰难险阻和惊涛骇浪”的伴侣，那就是邓颖超同志，他们通过书信来往确定了恋爱关系，并从此相伴革命的一生。 周恩来对信仰的那种坚守足以让人泪目。下面是书中的一段文字，各位读者自行体会： 医生替总理注射了杜冷丁。片刻，总理稍稍喘息平稳。他两眼淡漠地望着天花板，像是凝思。忽然，那眼里闪了一下亮，转向我们：“拿、拿《国际歌》，放、放一放……”我们忙找出《国际歌》的歌片，为他播放。当那磅礴的旋律盈满一室时，总理的嘴唇分明在翕动，在吟唱！这是总理生前最后一次听歌，最后一次唱歌。这支歌是《国际歌》。连放三遍，总理对守在身边的邓颖超说：“我坚信全世界共产主义一定能实现。团结起来到明天，英特纳雄耐尔就一定要实现。”他讲这个话的声音很细微，给我的震动却很大。他已近弥留阶段，最后唱这支歌，显示了真正不移的信仰。人生尽可信仰不同，能够为信仰奋斗终生，奉献一切，那么，就连他的敌人也会为他的人格肃然起敬。许多资产阶级政治家、理论家、学者，就是由于这个原因，在周恩来死后，也对他表示了极大的哀悼和敬意！ 对党忠诚、维护大局的杰出楷模 虽因远在欧洲没能参加中共一大，但周恩来是中国共产党最早的党员之一，参与发起成立中国共产党的活动。无论后来的革命时期自身身处之地有多危险，革命之路有多么坎坷，周恩来从没有失去信念与对党的忠诚。 周恩来始终从党内大局出发考虑问题，即便是自身遭到严厉批评，工作遭遇严重挫折，心里十分难过的情况下，他首先考虑到的依旧是党内大局的团结。下面是书中提到的一个典型的例子： 由于周恩来和陈云指示报纸社论提出“反冒进”，激怒了毛泽东。他认为“反冒进”就是右倾保守，就是给社会主义建设的热情泼冷水，就是不要发展生产的高速度，因此在会上会下多次严厉批评“反冒进”，不许再这样提，再这样提就是右倾。于是，周恩来也会上会下地多次作检查。那天，周恩来把他的理论秘书范若愚找去了，请他帮助写检查。范若愚从周恩来那里回来后，脸色很沉重。过了几天，我们才知道，周恩来对他谈了毛泽东批评“反冒进”的事。总理心里很难过，有几次谈到伤心处，眼里都含了泪。周恩来躲不开，他是总理，而且必须配合毛泽东搞工作，为大局为团结，他只能作检讨。党内公认总理的组织观念最强，从不犯自由主义。我们这些身边的工作人员还没听到过他背后议论哪位同志的缺点，总是讲这个人有什么什么长处，那个人如何如何好，有什么什么贡献。对于缺点错误，他坚持当面提或公开讲。这次为了“反冒进”而挨批评的事，他也一样不议论不提别人有什么“错误”，只谈自己的“错误”，谈自己的担心和苦恼，找认识上的差距，设法跟上毛主席的想法。 热爱人民、勤政为民的杰出楷模 周恩来从立志走上革命道路为共产主义奋斗一生那一天起，他就知道了自己的一生一定不仅是属于自己的，更是属于国家、属于民族和人民的。在这本书中，总理“勤政为民”的事例比比皆是。如果说周恩来是有史以来第二繁忙的中国共产党人，估计没人敢说自己是第一。就连国内国外许多有名有影响的人都著文说：“无疑，周恩来是这个世界上工作最忙、工作最多的一个人。” 下面是书中反映总理工作繁忙程度的一些段落摘录： “正常情况下，总理的睡眠时间也往往只有三四个小时。在那长达十几小时的连续劳作中，给我们留下的印象不但有精力超人，更有坚持和苦撑的感人毅力” 我跟随总理几十年，听惯了他的一句口头禅：“你们不要怕我忙嘛，我不怕忙你们怕什么？我能忙过来。” 我曾目睹周恩来连续工作一星期，只休息了13个小时。这是当时的总理卫士长成元功同志一分一秒计算出来的，从总理上床计时，到起床止，不论是否睡着，累计躺下休息13个小时。就这样的劳作，总理仍是笑着说：“不要紧，我能忙过来。”他出访亚非十四国时，我们一分一秒算计，他平均每天睡眠只有两个小时，却仍然精神抖擞地说：“我可以，我不怕忙。” 他工作太投入，处于一种忘我的境界，所以疲劳开始袭来时，他并不自觉，完全是出于生理上的自卫本能，打个哈欠或抬起头做一下深呼吸。疲劳在悄悄加重，终于影响到办公效率，并且迫使他不得不一次又一次抬起头来深呼吸。这时，他意识到累，第一个反应就是大口大口喝浓茶，以刺激渐渐麻木的神经重新兴奋起来。这样坚持一段后，似乎茶碱已失去效力，总理会烦躁地突然站起身，围绕办公桌快速地走几圈，并配合着揉揉眼窝和太阳穴，然后坐下继续办公。他终于感到这样也不解决问题了，便拿起办公桌上放的那件“宝”，打开铁盒，用手指擦点清凉油，抹在额头和太阳穴上。这时，仿佛冥冥中有什么心灵感应，邓大姐会出现在总理办公室的门口，悄悄地在门外转圈，忧虑而心疼地朝里面伏案劳作的总理投去一瞥又一瞥。她轻易不进总理办公室，不去干预总理的公事，这是结婚时就有的协议。总理的办公室有三把钥匙：一把在警卫手中，警卫交接班时，钥匙属于交接内容之一；另一把在秘书手中，一般是放在机要秘书那里；总理自己有一把，睡觉时放枕下，起床时揣兜里，从来不离身。邓大姐没有钥匙，总理不在，她就进不了办公室；总理在，她也极少走进去，在门口转了一阵，终于向着门里轻轻唤一声：“恩来呀，该休息一会儿了。”总理掀起眼皮，目光从镜框上方望一眼邓颖超，点点头，却马上又伏进了文件堆，继续他的批阅修改。这样又坚持一段时间后，疲劳便达到了难以克服的地步，眼皮会不知不觉地耷拉下来，手中的笔在总理瞬间的迷糊瞌睡中，在文件上留下一些点或道的墨迹。出现几次这样瞬间的迷糊瞌睡，总理会痛苦地拍拍额头，搓搓脸，猛地丢下笔，朝后仰身靠在椅背上，大声吩咐：“给我一条热毛巾！”一边用热毛巾拼命地擦脸，揉眼窝，一边继续批阅文件。总理是在尽力聚集全身仅存的一点热能，投入劳作中去。这样坚持一会儿，又会大声吩咐：“谁有烟？给我一支烟吸。” 1973年6月上旬的一天(这时周恩来已经被查出膀胱癌，处于治疗期间)，周恩来已是三十多个小时没合眼。究竟处理了多少文件，接待了多少人，恐怕秘书也算不清楚。夜里一点多，似乎他老人家该歇口气了，秘书却看着手表提醒：“总理，还有14分钟。”“唔，你们做准备，我刮个胡子。”我看到周恩来往起站时，已经十分吃力，用双臂撑着才站起来；他的手抖颤不止，身体晃了晃才站稳，然后竭力用平时惯有的那种快步朝卫生间走去。&#8230;.. 总理“失踪”了！正有些慌乱，忽然有人说：“哎呀，总理不是说要刮胡子吗？”总理要是用电动剃须刀，不会耽误这么久，因为他常是拿着刀上车，在车上顺便就刮了胡子。想到总理的胡子又多又硬，稍长点电动剃须刀就刮不动了，我就忙朝卫生间找。他也许见电动剃须刀刮不动又用了安全刀片呢……我在前面走，后面跟了几个人。进门的一刹那，所有人都怔住了：不会说，不会动，甚至停止了呼吸。唉，我们的总理哟！他垂落的左手下，有一条面巾；他微屈的右臂，手里仍虚握着沾有肥皂沫和胡子茬的刮脸刀，他就歪在镜子前边睡着了！他英俊的面孔曾使所有的中国人为之骄傲，现在却变得那么瘦削灰黄；他的眉毛依然威武，双唇仍然露出善良和慈爱，可是他的眼窝却是深深地、深深地沉陷了下去……。 一些很有研究的医生对我讲，像总理那样的劳心劳力，鞠躬尽瘁，换其他任何人也不会活得比诸葛亮长。“总理是累死的。如果做一项试验，选10万人在总理那样的重负下经受总理那样的劳作，不出一年会倒下1万，不出5年会倒下3万……” 周恩来是不折不扣地勤政为民的伟大践行者! 严于律己、清正廉洁的杰出楷模 周恩来非常注重个人形象，在影视图片资料中我们看到的总理总是那么衣冠楚楚，风度翩翩。但只有总理身边人才知晓，这种外在的光鲜的背后是总理的勤俭廉洁，清正律己。 那时，北京裁缝手艺最好的大约就是红都了。五六十年代，只有外国使馆和中国高级官员才能在那里做衣服，用现在话讲，是中央首长做衣的“指定厂家”。我陪总理来到红都，有关服务人员迎来，见到总理的激动喜悦自不必说，他们都知道总理的衣装关系中国人的形象，将各种高级衣料向总理介绍：“为满足出国人员需要，我们进口了一些英国呢料和澳大利亚毛料，各型各色比较齐全……”总理摇摇头：“不要进口的，要国产的。”服务员马上理解，向总理详细介绍国产衣料。总理向我们交代：“今后我做衣，无论毛料布料，必须用国产的。” 总理穿衣还有个大讲究，是只有我们这些身边人才知道的，外界难以知晓。就是讲究保密，有时甚至是“严格保密”。从莫斯科到阿尔及尔，从日内瓦到雅加达，许多国家的服务员都知道周恩来总理有个皮箱子，警卫人员看守很严，里边不知藏有多少重大机密或钱财。特别是到第三世界国家，一旦决定给他们援助，有的服务员就指指那箱子，悄悄问我们的同志：“你们援助我们的钱都锁在那个箱子里面吧？”每逢这时，我们只能笑着摇摇头，但马上又感慨万千地点点头，心里别有一番酸涩的滋味。实在说，给他们的每一项援助，都与这个皮箱有着最直接的关系。这其实是总理的行李箱，里边装有他的生活用品。有件睡衣，进城时就穿着，早磨光了绒毛。由于总理睡前有办公习惯，背部着床多，所以那里首先磨薄磨破。先破小洞，我们就动手补，渐渐磨成大洞，补不胜补，就将整个后背换掉。破了再补，补丁摞补丁，一直穿到总理去世他也舍不得买新的。有三双袜子，没一双不带补丁，特别是脚掌部分，几乎每星期都要由我们拿去补一次两次。卫士成习惯了，总理一上床，就检查他的袜子，发现新洞，马上拿走去补，第二天早晨再提着袜子进来交给总理穿。这种情况直到有了尼龙袜子后才稍好些。尼龙袜子结实，不那么容易破。总理的毛巾更不好见人。擦脸巾磨得没了绒毛，渐渐像块纱布，渐渐磨出洞，洞越来越大时，总理就将毛巾从中间剪开，将两边换到中间对缝起来继续用。因为毛巾都是中间使用多，先被磨破，而两边很少磨损。总理的擦脚巾更不好说，是用废纱布缝起来当脚巾，几十年就是这样用着纱布。总理用的牙杯上，印有“保家卫国”字样，这个牙杯用到去世。无须多说，“保家卫国”四个字，就说明了这个杯子的年头和质量。 总理的内衣内裤，件件补丁摞补丁。因为怕国外有传染病，我们要保证总理的安全，所以他的内衣内裤不能拿到街上去洗。何况总理的内衣裤补丁那么多，拿出去影响未必好。万一是用洗衣机，这样的衣服肯定会被搅破。在家我们可以帮总理洗衣，在国宾馆显然没办法，没法拿出去晾晒，万一被照张相，还不知会引出什么故事来。所以，出国就只能交大使馆，请使馆里的女同志帮忙洗。每逢这时，都是大使夫人亲自动手为总理洗，许多大使夫人都是边洗边哭。记得总理在马里访问时，大使赖亚力的夫人看到总理穿的衣服，有的补丁摞补丁，有的布都糟了，稍一用力就破个洞；所有这些衬衣，只有领口袖口是换了新的，露在外面一圈不会被人发现里面的内衣破旧成什么样。她一边洗一边流眼泪，轻轻喃出几声“总理……”，就是说不出一句完整话。 作为我们一个六七亿人口的泱泱大国的总理，穿这样破旧的衣服，叫外国服务员看到了会怎么议论？他们不了解我们的国情，和我们的价值观、道德观也不同，难免不理解，所以还是向他们严格保密为好。所以，每天早晨总理一起床，首先由我们的卫士进去，该收的收，该藏的藏，行李箱锁严实了，才放服务员进。到了晚上，总理再休息时，才开锁取出卧具、牙具和衣物。服务员见不到开箱子，自然以为里面都是贵重之物。但是，以总理为代表，中国人民正是这样节俭奋斗，才尽自己所能省出了钱物支援那些第三世界的国家和人民。 周总理的清正廉洁做的有时候让身边人感觉有些“过分”，他的回答则是： “我这样做是不是有点过分？”他像是问我们，又像问自己，带着沉思的表情停顿片刻才又说：“我看不过分。前提是我们国家还一穷二白。这里有两种考虑。六七亿人口的中国，不就是我一个总理吗？再穷也不缺我几身新衣服，何况对外还有个影响问题。这话不是没道理。但我们不能少了另一个考虑：身为六七亿人口大国的总理，我怎样做不是我一个人的事，这表明我提倡什么。六七亿人口是应该提倡节俭，还是现在就不顾国情去追求享受？我更多考虑的是后者。” 总理公私分明，在解放后，一直坚持私人用车要自费。工资发下后，钱归我管，工资表他一定要过目，就是检查是否扣除了用车费和外出用餐费等。他把看戏、跳舞、到公园散步、到饭店理发算作私事，把去医院看病人、到民主人士家拜访及看望外国朋友这类亦公亦私的事也都算作私事用车，都坚持自费。他乘车的记账，先由我记，后来嫌我记的账有疏漏，转交钟步云记。老钟遇空难后，就直接交由司机杨金明本人记账了。总理说：“你开车你记账，这样不会出现疏漏。” 小结 能做到“鞠躬尽瘁，死而后已”的中共高级干部中，周恩来一定是做的最好的那个。 能做到“毫无私心，一心为公”的中共高级干部中，周恩来一定是做的最好的那个。 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="https://tonybai.com/2021/09/15/getting-closer-to-zhou-enlai">本文永久链接</a> &#8211; https://tonybai.com/2021/09/15/getting-closer-to-zhou-enlai</p>
<p><strong>不写书评/读后感，那是没有遇到真正让你内心感动的书</strong>！</p>
<p>实际上我并没有读这本书，而是在连续一周多的驾车途中通过“微信读书”将这本书听完的。</p>
<p>虽然是听书，并且听的还是AI机器人的播讲，但书中记录的那份真实且炽热的情感却无法隐匿在AI机器人那稍有些怪异的声线中。几乎每天都有书中的情节让我在途中泪目。</p>
<p>好了，不卖关子了。这本书就是权延赤的纪实文学作品<a href="https://book.douban.com/subject/26670864/">《走近周恩来》</a>(封面如下图)。</p>
<p><img src="https://tonybai.com/wp-content/uploads/getting-closer-to-zhou-enlai-1.jpg" alt="" /></p>
<p>本书的主人公是我们敬爱的开国总理，建国后在总理这个岗位上为人民、为国家操劳26年的周恩来。</p>
<p>这本书的主要内容来自对1940年来跟随周恩来的警卫、副官、秘书等的采访，作者以“何树英”这个名字来指代这些在总理身边工作的人。正如本书作者所说，这是一本纪实文学，不是档案资料，有些地方是有文学加工的并有作者自己的观点掺杂于其中。但这完全不妨碍对总理光辉一生的真实展现。</p>
<p>作为普通老百姓，我无法站在历史的高度用那些高大上的词汇来概括周总理伟大的一生。这里就结合2018年习大大在“纪念周恩来同志诞辰120周年座谈会上的讲话”中对周总理的客观评价（作为子标题）以及书中内容，让我们重新认识一下周恩来。</p>
<h3>“实事求是”的自我认知</h3>
<p>周恩来在革命战争期间所做出的伟大贡献以及建国后26年的总理生涯均受益于周恩来实事求是地自我认知。</p>
<p>下面内容摘自书中：</p>
<blockquote>
<p>在一次涉及人事分工的会议上，毛泽东望着周恩来：“恩来同志，你来怎么样？”周恩来摆手：“不行不行，主席，你是了解我的，我不是帅才。我理理家可以，做不了帅……”。</p>
</blockquote>
<p>“我不是帅才”这是周恩来在多年工作实践之后对自己的自我认知。周恩来知道自己不能逞匹夫之勇地去争取最高权力，去拿中国革命的前途当赌注。从南昌起义到遵义会议，周恩来的持续的自我反省让他认识到毛泽东才是中国革命道路上那个唯一的领袖，于是在遵义会议上全力推荐毛泽东领导中国革命的“枪杆子”。用本书作者的话：“这一切都不能叫作伟大的谦让，而是伟大的自知之明和知人之明”。一个人“最大的勇敢莫过于看清事实且敢于实事求是”。</p>
<p>遵义会议后，明确了自我定位、明确了未来方向的周恩来甘愿做好中国革命的大管家，一心一意辅佐毛泽东，让毛泽东专注于思考中国革命的未来道路和实现战略，而他则将日常琐事包揽于身。</p>
<p>周恩来自我认知与知人之明的另外一个典型事例是对邓小平的评价：</p>
<p>“从愿望上说，我更欣赏小平同志的‘举重若轻’，但说实在话，我这个人做不到这一点。我同伯承同志一样，在工作上常常是‘举轻若重’。这也许是同我长期负责具体的执行工作有关吧……”。</p>
<p>周对邓的欣赏也体现在其晚年力荐邓小平接班中央核心工作，为中共第二代领导核心的形成贡献了自己的一份力量。</p>
<p>现在看来，敢于“实事求是”的自我认知是周恩来伟大一生的基础与前提，也成就了中国共产党领导核心的优良传承。</p>
<h3>不忘初心、坚守信仰的杰出楷模</h3>
<p>周恩来从小立志“为中华之崛起而读书”，这颗种子深深扎根在周的心中。青年时期的周恩来更是坚定了“革命理想高于天”，这一信仰直接决定了周日后的思想路径和重大人生行为。</p>
<p>坚守信仰的周恩来在面临两次配偶选择时，都坚定的站在了“一切有利于革命斗争”原则的一边。</p>
<p>第一次是南开中学前身严氏学塾的校长严修十分器重周恩来的人品和才学，经过长期观察，慎重考虑，决定将自己的女儿嫁给周恩来，并亲自托人向周恩来提亲。但年轻的周恩来却很有礼貌地婉辞了这次提亲。周恩来当时的想法是：“我是个穷学生，刚入学时，学习和生活费用靠伯父支持，现在虽然靠成绩好，做了免费生，生活费用还要靠自己解决。以我这种情况，假如和严家结了亲，我的前途一定会受严家支配。所以我辞却了这门亲事”。周恩来的这次拒绝在常人看来很难理解，但是如果从周恩来始终秉持的“救国抱负和自尊自强”来看，这一切显得又十分正常。</p>
<p>第二次是在周恩来在法国勤工俭学期间，周恩来曾经有一位比较亲近的朋友，是个漂亮的姑娘。然而，好朋友未必适合做妻子。一旦作为婚姻来考虑，这位漂亮的姑娘就不行了。因为她仅仅是同情革命，而周恩来需要的是“能一辈子从事革命”，“能经受革命的艰难险阻和惊涛骇浪”的伴侣。于是周恩来对这第二位候选配偶做出了否定的决定。</p>
<p>后来的事情大家都知道了，周恩来在法国期间就物色好了那个“能一辈子从事革命”，“能经受革命的艰难险阻和惊涛骇浪”的伴侣，那就是邓颖超同志，他们通过书信来往确定了恋爱关系，并从此相伴革命的一生。</p>
<p>周恩来对信仰的那种坚守足以让人泪目。下面是书中的一段文字，各位读者自行体会：</p>
<blockquote>
<p>医生替总理注射了杜冷丁。片刻，总理稍稍喘息平稳。他两眼淡漠地望着天花板，像是凝思。忽然，那眼里闪了一下亮，转向我们：“拿、拿《国际歌》，放、放一放……”我们忙找出《国际歌》的歌片，为他播放。当那磅礴的旋律盈满一室时，总理的嘴唇分明在翕动，在吟唱！这是总理生前最后一次听歌，最后一次唱歌。这支歌是《国际歌》。连放三遍，总理对守在身边的邓颖超说：“我坚信全世界共产主义一定能实现。团结起来到明天，英特纳雄耐尔就一定要实现。”他讲这个话的声音很细微，给我的震动却很大。他已近弥留阶段，最后唱这支歌，显示了真正不移的信仰。人生尽可信仰不同，能够为信仰奋斗终生，奉献一切，那么，就连他的敌人也会为他的人格肃然起敬。许多资产阶级政治家、理论家、学者，就是由于这个原因，在周恩来死后，也对他表示了极大的哀悼和敬意！</p>
</blockquote>
<h3>对党忠诚、维护大局的杰出楷模</h3>
<p>虽因远在欧洲没能参加中共一大，但周恩来是中国共产党最早的党员之一，参与发起成立中国共产党的活动。无论后来的革命时期自身身处之地有多危险，革命之路有多么坎坷，周恩来从没有失去信念与对党的忠诚。</p>
<p>周恩来始终从党内大局出发考虑问题，即便是自身遭到严厉批评，工作遭遇严重挫折，心里十分难过的情况下，他首先考虑到的依旧是党内大局的团结。下面是书中提到的一个典型的例子：</p>
<blockquote>
<p>由于周恩来和陈云指示报纸社论提出“反冒进”，激怒了毛泽东。他认为“反冒进”就是右倾保守，就是给社会主义建设的热情泼冷水，就是不要发展生产的高速度，因此在会上会下多次严厉批评“反冒进”，不许再这样提，再这样提就是右倾。于是，周恩来也会上会下地多次作检查。那天，周恩来把他的理论秘书范若愚找去了，请他帮助写检查。范若愚从周恩来那里回来后，脸色很沉重。过了几天，我们才知道，周恩来对他谈了毛泽东批评“反冒进”的事。总理心里很难过，有几次谈到伤心处，眼里都含了泪。周恩来躲不开，他是总理，而且必须配合毛泽东搞工作，为大局为团结，他只能作检讨。党内公认总理的组织观念最强，从不犯自由主义。我们这些身边的工作人员还没听到过他背后议论哪位同志的缺点，总是讲这个人有什么什么长处，那个人如何如何好，有什么什么贡献。对于缺点错误，他坚持当面提或公开讲。这次为了“反冒进”而挨批评的事，他也一样不议论不提别人有什么“错误”，只谈自己的“错误”，谈自己的担心和苦恼，找认识上的差距，设法跟上毛主席的想法。</p>
</blockquote>
<h3>热爱人民、勤政为民的杰出楷模</h3>
<p>周恩来从立志走上革命道路为共产主义奋斗一生那一天起，他就知道了自己的一生一定不仅是属于自己的，更是属于国家、属于民族和人民的。在这本书中，总理“勤政为民”的事例比比皆是。如果说周恩来是有史以来第二繁忙的中国共产党人，估计没人敢说自己是第一。就连国内国外许多有名有影响的人都著文说：“无疑，周恩来是这个世界上工作最忙、工作最多的一个人。”</p>
<p>下面是书中反映总理工作繁忙程度的一些段落摘录：</p>
<blockquote>
<p>“正常情况下，总理的睡眠时间也往往只有三四个小时。在那长达十几小时的连续劳作中，给我们留下的印象不但有精力超人，更有坚持和苦撑的感人毅力”</p>
<p>我跟随总理几十年，听惯了他的一句口头禅：“你们不要怕我忙嘛，我不怕忙你们怕什么？我能忙过来。”</p>
<p>我曾目睹周恩来连续工作一星期，只休息了13个小时。这是当时的总理卫士长成元功同志一分一秒计算出来的，从总理上床计时，到起床止，不论是否睡着，累计躺下休息13个小时。就这样的劳作，总理仍是笑着说：“不要紧，我能忙过来。”他出访亚非十四国时，我们一分一秒算计，他平均每天睡眠只有两个小时，却仍然精神抖擞地说：“我可以，我不怕忙。”</p>
<p>他工作太投入，处于一种忘我的境界，所以疲劳开始袭来时，他并不自觉，完全是出于生理上的自卫本能，打个哈欠或抬起头做一下深呼吸。疲劳在悄悄加重，终于影响到办公效率，并且迫使他不得不一次又一次抬起头来深呼吸。这时，他意识到累，第一个反应就是大口大口喝浓茶，以刺激渐渐麻木的神经重新兴奋起来。这样坚持一段后，似乎茶碱已失去效力，总理会烦躁地突然站起身，围绕办公桌快速地走几圈，并配合着揉揉眼窝和太阳穴，然后坐下继续办公。他终于感到这样也不解决问题了，便拿起办公桌上放的那件“宝”，打开铁盒，用手指擦点清凉油，抹在额头和太阳穴上。这时，仿佛冥冥中有什么心灵感应，邓大姐会出现在总理办公室的门口，悄悄地在门外转圈，忧虑而心疼地朝里面伏案劳作的总理投去一瞥又一瞥。她轻易不进总理办公室，不去干预总理的公事，这是结婚时就有的协议。总理的办公室有三把钥匙：一把在警卫手中，警卫交接班时，钥匙属于交接内容之一；另一把在秘书手中，一般是放在机要秘书那里；总理自己有一把，睡觉时放枕下，起床时揣兜里，从来不离身。邓大姐没有钥匙，总理不在，她就进不了办公室；总理在，她也极少走进去，在门口转了一阵，终于向着门里轻轻唤一声：“恩来呀，该休息一会儿了。”总理掀起眼皮，目光从镜框上方望一眼邓颖超，点点头，却马上又伏进了文件堆，继续他的批阅修改。这样又坚持一段时间后，疲劳便达到了难以克服的地步，眼皮会不知不觉地耷拉下来，手中的笔在总理瞬间的迷糊瞌睡中，在文件上留下一些点或道的墨迹。出现几次这样瞬间的迷糊瞌睡，总理会痛苦地拍拍额头，搓搓脸，猛地丢下笔，朝后仰身靠在椅背上，大声吩咐：“给我一条热毛巾！”一边用热毛巾拼命地擦脸，揉眼窝，一边继续批阅文件。总理是在尽力聚集全身仅存的一点热能，投入劳作中去。这样坚持一会儿，又会大声吩咐：“谁有烟？给我一支烟吸。”</p>
<p>1973年6月上旬的一天(这时周恩来已经被查出膀胱癌，处于治疗期间)，周恩来已是三十多个小时没合眼。究竟处理了多少文件，接待了多少人，恐怕秘书也算不清楚。夜里一点多，似乎他老人家该歇口气了，秘书却看着手表提醒：“总理，还有14分钟。”“唔，你们做准备，我刮个胡子。”我看到周恩来往起站时，已经十分吃力，用双臂撑着才站起来；他的手抖颤不止，身体晃了晃才站稳，然后竭力用平时惯有的那种快步朝卫生间走去。&#8230;.. 总理“失踪”了！正有些慌乱，忽然有人说：“哎呀，总理不是说要刮胡子吗？”总理要是用电动剃须刀，不会耽误这么久，因为他常是拿着刀上车，在车上顺便就刮了胡子。想到总理的胡子又多又硬，稍长点电动剃须刀就刮不动了，我就忙朝卫生间找。他也许见电动剃须刀刮不动又用了安全刀片呢……我在前面走，后面跟了几个人。进门的一刹那，所有人都怔住了：不会说，不会动，甚至停止了呼吸。唉，我们的总理哟！他垂落的左手下，有一条面巾；他微屈的右臂，手里仍虚握着沾有肥皂沫和胡子茬的刮脸刀，他就歪在镜子前边睡着了！他英俊的面孔曾使所有的中国人为之骄傲，现在却变得那么瘦削灰黄；他的眉毛依然威武，双唇仍然露出善良和慈爱，可是他的眼窝却是深深地、深深地沉陷了下去……。</p>
<p>一些很有研究的医生对我讲，像总理那样的劳心劳力，鞠躬尽瘁，换其他任何人也不会活得比诸葛亮长。“总理是累死的。如果做一项试验，选10万人在总理那样的重负下经受总理那样的劳作，不出一年会倒下1万，不出5年会倒下3万……”</p>
</blockquote>
<p>周恩来是不折不扣地勤政为民的伟大践行者!</p>
<h3>严于律己、清正廉洁的杰出楷模</h3>
<p>周恩来非常注重个人形象，在影视图片资料中我们看到的总理总是那么衣冠楚楚，风度翩翩。但只有总理身边人才知晓，这种外在的光鲜的背后是总理的勤俭廉洁，清正律己。</p>
<blockquote>
<p>那时，北京裁缝手艺最好的大约就是红都了。五六十年代，只有外国使馆和中国高级官员才能在那里做衣服，用现在话讲，是中央首长做衣的“指定厂家”。我陪总理来到红都，有关服务人员迎来，见到总理的激动喜悦自不必说，他们都知道总理的衣装关系中国人的形象，将各种高级衣料向总理介绍：“为满足出国人员需要，我们进口了一些英国呢料和澳大利亚毛料，各型各色比较齐全……”总理摇摇头：“不要进口的，要国产的。”服务员马上理解，向总理详细介绍国产衣料。总理向我们交代：“今后我做衣，无论毛料布料，必须用国产的。”</p>
<p>总理穿衣还有个大讲究，是只有我们这些身边人才知道的，外界难以知晓。就是讲究保密，有时甚至是“严格保密”。从莫斯科到阿尔及尔，从日内瓦到雅加达，许多国家的服务员都知道周恩来总理有个皮箱子，警卫人员看守很严，里边不知藏有多少重大机密或钱财。特别是到第三世界国家，一旦决定给他们援助，有的服务员就指指那箱子，悄悄问我们的同志：“你们援助我们的钱都锁在那个箱子里面吧？”每逢这时，我们只能笑着摇摇头，但马上又感慨万千地点点头，心里别有一番酸涩的滋味。实在说，给他们的每一项援助，都与这个皮箱有着最直接的关系。这其实是总理的行李箱，里边装有他的生活用品。有件睡衣，进城时就穿着，早磨光了绒毛。由于总理睡前有办公习惯，背部着床多，所以那里首先磨薄磨破。先破小洞，我们就动手补，渐渐磨成大洞，补不胜补，就将整个后背换掉。破了再补，补丁摞补丁，一直穿到总理去世他也舍不得买新的。有三双袜子，没一双不带补丁，特别是脚掌部分，几乎每星期都要由我们拿去补一次两次。卫士成习惯了，总理一上床，就检查他的袜子，发现新洞，马上拿走去补，第二天早晨再提着袜子进来交给总理穿。这种情况直到有了尼龙袜子后才稍好些。尼龙袜子结实，不那么容易破。总理的毛巾更不好见人。擦脸巾磨得没了绒毛，渐渐像块纱布，渐渐磨出洞，洞越来越大时，总理就将毛巾从中间剪开，将两边换到中间对缝起来继续用。因为毛巾都是中间使用多，先被磨破，而两边很少磨损。总理的擦脚巾更不好说，是用废纱布缝起来当脚巾，几十年就是这样用着纱布。总理用的牙杯上，印有“保家卫国”字样，这个牙杯用到去世。无须多说，“保家卫国”四个字，就说明了这个杯子的年头和质量。</p>
<p>总理的内衣内裤，件件补丁摞补丁。因为怕国外有传染病，我们要保证总理的安全，所以他的内衣内裤不能拿到街上去洗。何况总理的内衣裤补丁那么多，拿出去影响未必好。万一是用洗衣机，这样的衣服肯定会被搅破。在家我们可以帮总理洗衣，在国宾馆显然没办法，没法拿出去晾晒，万一被照张相，还不知会引出什么故事来。所以，出国就只能交大使馆，请使馆里的女同志帮忙洗。每逢这时，都是大使夫人亲自动手为总理洗，许多大使夫人都是边洗边哭。记得总理在马里访问时，大使赖亚力的夫人看到总理穿的衣服，有的补丁摞补丁，有的布都糟了，稍一用力就破个洞；所有这些衬衣，只有领口袖口是换了新的，露在外面一圈不会被人发现里面的内衣破旧成什么样。她一边洗一边流眼泪，轻轻喃出几声“总理……”，就是说不出一句完整话。</p>
<p>作为我们一个六七亿人口的泱泱大国的总理，穿这样破旧的衣服，叫外国服务员看到了会怎么议论？他们不了解我们的国情，和我们的价值观、道德观也不同，难免不理解，所以还是向他们严格保密为好。所以，每天早晨总理一起床，首先由我们的卫士进去，该收的收，该藏的藏，行李箱锁严实了，才放服务员进。到了晚上，总理再休息时，才开锁取出卧具、牙具和衣物。服务员见不到开箱子，自然以为里面都是贵重之物。但是，以总理为代表，中国人民正是这样节俭奋斗，才尽自己所能省出了钱物支援那些第三世界的国家和人民。</p>
</blockquote>
<p>周总理的清正廉洁做的有时候让身边人感觉有些“过分”，他的回答则是：</p>
<blockquote>
<p>“我这样做是不是有点过分？”他像是问我们，又像问自己，带着沉思的表情停顿片刻才又说：“我看不过分。前提是我们国家还一穷二白。这里有两种考虑。六七亿人口的中国，不就是我一个总理吗？再穷也不缺我几身新衣服，何况对外还有个影响问题。这话不是没道理。但我们不能少了另一个考虑：身为六七亿人口大国的总理，我怎样做不是我一个人的事，这表明我提倡什么。六七亿人口是应该提倡节俭，还是现在就不顾国情去追求享受？我更多考虑的是后者。”</p>
</blockquote>
<p>总理公私分明，在解放后，一直坚持私人用车要自费。工资发下后，钱归我管，工资表他一定要过目，就是检查是否扣除了用车费和外出用餐费等。他把看戏、跳舞、到公园散步、到饭店理发算作私事，把去医院看病人、到民主人士家拜访及看望外国朋友这类亦公亦私的事也都算作私事用车，都坚持自费。他乘车的记账，先由我记，后来嫌我记的账有疏漏，转交钟步云记。老钟遇空难后，就直接交由司机杨金明本人记账了。总理说：“你开车你记账，这样不会出现疏漏。”</p>
<h3>小结</h3>
<p>能做到“鞠躬尽瘁，死而后已”的中共高级干部中，周恩来一定是做的最好的那个。<br />
能做到“毫无私心，一心为公”的中共高级干部中，周恩来一定是做的最好的那个。</p>
<p>如果现在的干部们做到哪怕只有周总理十分之一的程度，中国何愁不更加强大，民族何愁不更早复兴！</p>
<p>强烈向大家推荐权延赤的《走近周恩来》。同时也给自己一个任务：<strong>有机会一定要去周恩来邓颖超纪念馆瞻仰一下伟人的风采</strong>。</p>
<hr />
<p>Go技术专栏“<a href="https://www.imooc.com/read/87">改善Go语⾔编程质量的50个有效实践</a>”正在慕课网火热热销中！本专栏主要满足广大gopher关于Go语言进阶的需求，围绕如何写出地道且高质量Go代码给出50条有效实践建议，上线后收到一致好评！欢迎大家订<br />
阅！</p>
<p><img src="https://tonybai.com/wp-content/uploads/imooc-go-column-pgo-with-qr.jpg" alt="img{512x368}" /></p>
<p>我的网课“<a href="https://coding.imooc.com/class/284.html">Kubernetes实战：高可用集群搭建、配置、运维与应用</a>”在慕课网热卖中，欢迎小伙伴们订阅学习！</p>
<p><img src="https://tonybai.com/wp-content/uploads/imooc-k8s-practice-with-qr.jpg" alt="img{512x368}" /></p>
<p>Gopher Daily(Gopher每日新闻)归档仓库 &#8211; https://github.com/bigwhite/gopherdaily</p>
<p>我的联系方式：</p>
<ul>
<li>微博：https://weibo.com/bigwhite20xx</li>
<li>微信公众号：iamtonybai</li>
<li>博客：tonybai.com</li>
<li>github: https://github.com/bigwhite</li>
<li>“Gopher部落”知识星球：https://public.zsxq.com/groups/51284458844544</li>
</ul>
<p>微信赞赏：<br />
<img src="https://tonybai.com/wp-content/uploads/wechat-zanshang-code-512x512.jpg" alt="img{512x368}" /></p>
<p>商务合作方式：撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。</p>
<p style='text-align:left'>&copy; 2021, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2021/09/15/getting-closer-to-zhou-enlai/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2013小结</title>
		<link>https://tonybai.com/2014/01/04/my-summary-of-2013/</link>
		<comments>https://tonybai.com/2014/01/04/my-summary-of-2013/#comments</comments>
		<pubDate>Fri, 03 Jan 2014 23:54:46 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[生活簿]]></category>
		<category><![CDATA[2013]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Blogger]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[Kindle]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[Programmer]]></category>
		<category><![CDATA[ZooKeeper]]></category>
		<category><![CDATA[个人总结]]></category>
		<category><![CDATA[博客]]></category>
		<category><![CDATA[咨询]]></category>
		<category><![CDATA[女儿]]></category>
		<category><![CDATA[工作]]></category>
		<category><![CDATA[工作总结]]></category>
		<category><![CDATA[年终总结]]></category>
		<category><![CDATA[思考]]></category>
		<category><![CDATA[感悟]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[程序员]]></category>
		<category><![CDATA[读书]]></category>
		<category><![CDATA[豆瓣]]></category>
		<category><![CDATA[跑步]]></category>
		<category><![CDATA[转型]]></category>
		<category><![CDATA[香港]]></category>

		<guid isPermaLink="false">http://tonybai.com/?p=1470</guid>
		<description><![CDATA[2013年的个人年终总结比以往来得晚了一些，至于原因，我也说不清楚，拖延症也罢，其他原因也罢，总之是晚了。 写年终小结已经有小几年了，风格一直如一，无非是老三样：工作得失、生活酸甜以及新年展望，今年也不利外。 * 工作篇 我们部门在所在行业里已经摸爬滚打了10多年了，经 历和见证了这个行业从诞生、增长、成熟到如今的衰退的整个过程。也正是由于处于行业的衰退期，2013年部门的运营十分艰难。十年对于任何一个行业来说， 可能都已经过了其巅峰期，真心不能再期望这个行业还能会有下一个高峰了，对于个人来说也是如此。转型、业务突破变成了领导常挂在嘴边的词汇，但做起来又何 其艰难。 2013年，我们的业务转型依旧是围绕着我们的&#8220;金主&#8221;，虽然他们的业务营收也受到了微信等OTT业务的极大影响，传统业务投资也在缩减。对于个人而言， 除了负责传统产品线，转型、业务突破也成了我的绩效目标的一部分。于是在2013年，写文档比写代码多了一点，出差比常年多了一点，周六周日的连续加班也 多出了一点。在这些尝试中，以5月份某运营商某信的重构项目最为让人印象深刻。为了这个合同额几个亿的项目，我们近30人连续奋战了一个多月编写技术建议 书和投标方案，过程辛苦但却颇感充实，最终我们拿到了两个第二、两个第三的成绩。也许这个结果对于公司来说算是一种失败，但对于我个人来说，我获得了些许 转型的信心，以至于在后续的几次投标资料编写过程中，面对较新的领域，我也可以镇定自若。 掐指算来，这一年我以咨询顾问的临时角色参与了8个大大小小项目的前期交流以及投标支持工作，其中六个标以失败或不了了之而告终，还有两个标尚未有最终结 果。对于这样的结果，我也只能表示无奈。虽然我心里也十分清楚，对于国内这类解决方案项目的投标，技术往往不是最重要的，况且对于这些新领域，我们的技术 储备还不够系统，积累较为浅薄，落地的也的确较少。但面对这样的局面，我们还能怎么做呢？我也期待新一年能得到一个新的答案。 当然2013的工作中不全是遗憾，年末之前新系统的上线算是为我的2013划上了一个还算不错的句号，毕竟这是我两年来为之付出最多，也是最重要的一个工作目标。另外2013年继续整理和总结自己的一些管理经验和工作原则。在过程方面继续深入改善，尤其在代码质量方面。 在技术精深方面，今年没有太多进步。年初的时候曾探讨过如何在现有项目中使用一些成熟的开源技术和产品，比如memcached、zookeeper等， 为了保持手热，还尝试做些算法类的编码，这个在experiments库中有体现。在其他方面，可谓是&#8220;三无状态&#8221;：无技术书籍翻译、无技术杂志投稿、无 新开源项目发起。另外今年没有尝试去学习什么新语言，理由在此。 在年末的绩效评审时，观察到一些现象：那些绩效最末尾的人，往往并非是自身不够努力，而是领导赋予的目标不明确，这会给下属带来更多的不安，多数下属也会因为工作目标的不明确，而表现出更为糟糕的绩效。 * 生活篇 我个人十分注重工作和生活的平衡，不知道这种理念对于一个革命尚未成功的人来说算不算正确。 今年写了56篇博文，只完成了计划值的3/4，算是可接受范围，博文质量有所提升，访问次数和评论反馈也多了许多。文章以技术理解偏多，深入的偏少。技术攻关还是留给年轻人去吧。另外就是经验总结和感悟偏多，这也许与工作年头多有关系吧。 读书方面，据豆瓣不完全统计一共读了61本，这照比去年要多出不少，想必是有了Kindle PaperWhite的缘故吧，使得碎片时间得到充分利用。技术、商业书籍依旧占较大比例，小说尤其是科幻小说也不少。同样是因为电子书，今年纸质书籍购 买减少了（痛定思痛后的决定），双十一、双十二以及圣诞促销均没有出手。不过豆瓣上想读的书单依旧还有上百本^_^，任重道远啊。 今年爱上了跑步，坚持到11月末，因出差和天气转深寒等原因，决定暂停一段时间，等春节后气温回升时再拾起这个好习惯，相信不是大问题。跑步的确让我的身体状况大为好转，至少感冒次数大为下降。 &#160; &#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; 今年的一些家庭目标也多已实现，比如和老婆一起去香港、带孩子去海边玩等。数码装备也更新了一圈。 果果这个小家伙那叫一个茁壮成长啊。年中给她换了一个大的幼儿园，她也变得十分喜欢和小朋友在一起玩了，有时候还觉得在家里没有意思。每周果果还要上一节 她最喜欢的舞蹈课，我们的初衷就是让她多与小朋友老师接触，也不指望她能学出什么样子来，不过她学得倒是有模有样，十分认真。现在的果果简直就是一个小大 人，每天从早到晚说个不停，精力那叫一个充沛，有时候不得不强迫她去睡觉^_^。 * 新年展望 感觉这一年的进步有些差强人意，心底真心感觉自己的努力还是太少了，于是立下了&#8220;少睡觉，多干活&#8221;的目标。 新的一年，无论是个人还是工作，都要更多的思考如何将知识、技能和经验转化为更多价值，如何将业务经验、技术积累转化为合同。 新的一年，要主动适应转型，无论是工作上的还是个人方向上的，争取在这一年里能找到正确的方向，并成功入门。最好给自己做一个三年到五年的布局。 新的一年，尝试继续保持生活与工作的平衡，也许这将变成一种奢侈的期望。 新的一年，还有什么比全家健康快乐更重要的呢。 &#169; 2014, bigwhite. 版权所有.]]></description>
			<content:encoded><![CDATA[<p>2013年的个人年终总结比以往来得晚了一些，至于原因，我也说不清楚，拖延症也罢，其他原因也罢，总之是晚了。</p>
<p>写年终小结已经有小几年了，风格一直如一，无非是老三样：工作得失、生活酸甜以及新年展望，今年也不利外。</p>
<p><b>* 工作篇</b></p>
<p>我们部门在所在行业里已经摸爬滚打了10多年了，经 历和见证了这个行业从诞生、增长、成熟到如今的衰退的整个过程。也正是由于处于行业的衰退期，2013年部门的运营十分艰难。十年对于任何一个行业来说， 可能都已经过了其巅峰期，真心不能再期望这个行业还能会有下一个高峰了，对于个人来说也是如此。转型、业务突破变成了领导常挂在嘴边的词汇，但做起来又何 其艰难。</p>
<p>2013年，我们的业务转型依旧是围绕着我们的&ldquo;金主&rdquo;，虽然他们的业务营收也受到了微信等OTT业务的极大影响，传统业务投资也在缩减。对于个人而言， 除了负责传统产品线，转型、业务突破也成了我的绩效目标的一部分。于是在2013年，写文档比写代码多了一点，出差比常年多了一点，周六周日的连续加班也 多出了一点。在这些尝试中，以5月份某运营商某信的重构项目最为让人印象深刻。为了这个合同额几个亿的项目，我们近30人连续奋战了一个多月编写技术建议 书和投标方案，过程辛苦但却颇感充实，最终我们拿到了两个第二、两个第三的成绩。也许这个结果对于公司来说算是一种失败，但对于我个人来说，我获得了些许 转型的信心，以至于在后续的几次投标资料编写过程中，面对较新的领域，我也可以镇定自若。</p>
<p>掐指算来，这一年我以咨询顾问的临时角色参与了8个大大小小项目的前期交流以及投标支持工作，其中六个标以失败或不了了之而告终，还有两个标尚未有最终结 果。对于这样的结果，我也只能表示无奈。虽然我心里也十分清楚，对于国内这类解决方案项目的投标，技术往往不是最重要的，况且对于这些新领域，我们的技术 储备还不够系统，积累较为浅薄，落地的也的确较少。但面对这样的局面，我们还能怎么做呢？我也期待新一年能得到一个新的答案。</p>
<p>当然2013的工作中不全是遗憾，年末之前<a href="http://tonybai.com/2013/12/26/just-for-being-relieved/">新系统的上线</a>算是为我的2013划上了一个还算不错的句号，毕竟这是我两年来为之付出最多，也是最重要的一个工作目标。另外2013年继续整理和总结自己的一些<a href="http://tonybai.com/2013/08/04/more-thoughts-on-improving-efficiency/">管理经验</a>和<a href="http://tonybai.com/2013/08/19/my-personal-work-principles/">工作原则</a>。在过程方面继续深入改善，尤其在<a href="http://tonybai.com/2013/07/08/code-review-from-rule-of-man-to-rule-of-law/">代码质量</a>方面。</p>
<p>在技术精深方面，今年没有太多进步。年初的时候曾探讨过如何在现有项目中使用一些成熟的开源技术和产品，比如<a href="http://tonybai.com/2013/11/01/a-case-of-applying-memcached-cas/">memcached</a>、<a href="http://tonybai.com/2013/08/28/implement-config-sync-for-distributed-system-with-zookeeper-services/">zookeeper</a>等， 为了保持手热，还尝试做些算法类的编码，这个在<a href="https://github.com/bigwhite/experiments">experiments库</a>中有体现。在其他方面，可谓是&ldquo;三无状态&rdquo;：无技术书籍翻译、无技术杂志投稿、无 新开源项目发起。另外今年没有尝试去学习什么新语言，理由<a href="http://tonybai.com/2013/10/22/some-experience-about-learning-programming-language/">在此</a>。</p>
<p>在年末的绩效评审时，观察到一些现象：那些绩效最末尾的人，往往并非是自身不够努力，而是领导赋予的目标不明确，这会给下属带来更多的不安，多数下属也会因为工作目标的不明确，而表现出更为糟糕的绩效。</p>
<p><b>* 生活篇</b></p>
<p>我个人十分注重工作和生活的平衡，不知道这种理念对于一个革命尚未成功的人来说算不算正确。</p>
<p>今年写了56篇博文，只完成了计划值的3/4，算是可接受范围，博文质量有所提升，访问次数和评论反馈也多了许多。文章以技术理解偏多，深入的偏少。技术攻关还是留给年轻人去吧。另外就是经验总结和感悟偏多，这也许与工作年头多有关系吧。</p>
<p>读书方面，据豆瓣不完全统计一共读了61本，这照比去年要多出不少，想必是有了Kindle PaperWhite的缘故吧，使得碎片时间得到充分利用。技术、商业书籍依旧占较大比例，小说尤其是科幻小说也不少。同样是因为电子书，今年纸质书籍购 买减少了（痛定思痛后的决定），双十一、双十二以及圣诞促销均没有出手。不过豆瓣上想读的书单依旧还有上百本^_^，任重道远啊。</p>
<p>今年<a href="http://tonybai.com/2013/10/09/love-running/">爱上了跑步</a>，坚持到11月末，因出差和天气转深寒等原因，决定暂停一段时间，等春节后气温回升时再拾起这个好习惯，相信不是大问题。跑步的确让我的身体状况大为好转，至少感冒次数大为下降。 &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;</p>
<p>今年的一些家庭目标也多已实现，比如<a href="http://tonybai.com/2013/06/18/a-hongkong-macau-trip/">和老婆一起去香港</a>、带孩子去海边玩等。数码装备也更新了一圈。</p>
<p>果果这个小家伙那叫一个茁壮成长啊。年中给她换了一个大的幼儿园，她也变得十分喜欢和小朋友在一起玩了，有时候还觉得在家里没有意思。每周果果还要上一节 她最喜欢的舞蹈课，我们的初衷就是让她多与小朋友老师接触，也不指望她能学出什么样子来，不过她学得倒是有模有样，十分认真。现在的果果简直就是一个小大 人，每天从早到晚说个不停，精力那叫一个充沛，有时候不得不强迫她去睡觉^_^。</p>
<p><b>* 新年展望</b></p>
<p>感觉这一年的进步有些差强人意，心底真心感觉自己的努力还是太少了，于是立下了&ldquo;少睡觉，多干活&rdquo;的目标。</p>
<p>新的一年，无论是个人还是工作，都要更多的思考如何将知识、技能和经验转化为更多价值，如何将业务经验、技术积累转化为合同。</p>
<p>新的一年，要主动适应转型，无论是工作上的还是个人方向上的，争取在这一年里能找到正确的方向，并成功入门。最好给自己做一个三年到五年的布局。</p>
<p>新的一年，尝试继续保持生活与工作的平衡，也许这将变成一种奢侈的期望。</p>
<p>新的一年，还有什么比全家健康快乐更重要的呢。</p>
<p style='text-align:left'>&copy; 2014, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2014/01/04/my-summary-of-2013/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《Understanding and Using C Pointers》要点先睹为快</title>
		<link>https://tonybai.com/2013/05/28/understanding-and-using-c-pointers-keypoint-preview/</link>
		<comments>https://tonybai.com/2013/05/28/understanding-and-using-c-pointers-keypoint-preview/#comments</comments>
		<pubDate>Mon, 27 May 2013 19:00:05 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[Aliasing]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Blogger]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[C11]]></category>
		<category><![CDATA[C99]]></category>
		<category><![CDATA[C标准]]></category>
		<category><![CDATA[GCC]]></category>
		<category><![CDATA[O‘Reilly]]></category>
		<category><![CDATA[Pointer]]></category>
		<category><![CDATA[Programmer]]></category>
		<category><![CDATA[struct]]></category>
		<category><![CDATA[union]]></category>
		<category><![CDATA[内存]]></category>
		<category><![CDATA[内存管理]]></category>
		<category><![CDATA[函数]]></category>
		<category><![CDATA[博客]]></category>
		<category><![CDATA[字符串]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[对齐]]></category>
		<category><![CDATA[工作]]></category>
		<category><![CDATA[常量]]></category>
		<category><![CDATA[指针]]></category>
		<category><![CDATA[数组]]></category>
		<category><![CDATA[程序员]]></category>
		<category><![CDATA[结构体]]></category>
		<category><![CDATA[编译器]]></category>
		<category><![CDATA[联合体]]></category>
		<category><![CDATA[读书]]></category>

		<guid isPermaLink="false">http://tonybai.com/?p=1282</guid>
		<description><![CDATA[如果你问十个C程序员：你觉得C语言的核心是什么？这十个程序员都会回答：指针。 指针具备成为C语言核心的两个关键要素：强大与争议。 * 指针的强大源自于其天生与机器内存模型的适配。使用指针让代码紧凑，并可获得仅次于汇编代码的执行效率；使用指针可以让C程 序员毫不费力地尽情操纵着内存中的每个byte甚至是bit；使用指针可以为C程序员提供无与伦比的操作灵活性。总之，在C语言中指针几乎是无所 不能的代名词。得指针者得天下，没有指针，C语言将变得平庸。 * 成也指针，败也指针。指针的争议之处就在于其在赋予C程序员无比强大的Power的同时，也常常带来无穷的烦恼甚至灾祸，比如 内存问题、调试困难或因指针导致的程序崩溃等。就好比人类社会，做核心人物有争议是难免的，比如足球界有马拉多纳，跳水界有菲尔普斯，斯诺克界有 奥沙利文^_^。 好了，言归正传，我们回到C语言图书上来。目前市面上的C语言书籍，无论国内国外，无论经典还是山寨，基本都是百科大全型，将C语言讲的面面俱 到。比如最近的一本大而全的经典应当属《C Programming , A Modern Approach》，中文版书名为《C语言程序设计：现代方法》第2版。以至于发展到今天，C语言似乎也没啥可讲的了，新出的C语言书大多是与前辈们雷同 的作品。近两年来也有O&#39;reilly出版的C语言书籍，比如： *《Head First C》 *《21st Century C &#8211; C Tips from the New School》 前者是典型的Head First风格的C教程，后者则是另辟蹊径，结合C语言外延（构建、调试、打包、版本控制、面向对象与C、知名C语言开源库等)进行讲解。这两本书虽形式 有变化，但终究脱离不开百科大全型，针对C的核心-指针并未有较多的深入探讨。而市场上专门写指针的书也稀少的很（似乎鬼子国那边有一本，叫什么 《征服C指针》），唯一的一本书名与指针扯上关系的书《Pointers on C》（中文名&#8220;C和指针&#8221;）其实依旧是一本C语言大全。于是乎国外著名出版社O&#39;Reilly今年5月出品了一本专门讲解C语言核心 &#8211; 指 针的书《Understanding and Using C Pointers》，以满足C程序员深入理解C语言核心并实现进阶的诉求。O&#39;Reilly就是O&#39;Reilly，总是能抓住C语言书籍方面的深度阅读需 求^_^。 《Understanding and Using C Pointers》是个小册子，拢共才200多页，但内容却全部是围绕C语言指针展开的，从最基本的指针声明与操作、C内存模型、动态内存分配，讲到指针 与数组、结构体、字符串的关系，再到最后指针的高级特性：强制转换、Strict Aliasing、线程共享、多态支持等，由浅入深的进行细致的剖析。其作者认为作为C语言核心的指针值得花200页篇幅去讲解，而且期望所有读者在读完 此书后能对C指针有个扎实的理解。总之，这本书对系统C程序员理解C语言的核心-指针是大有裨益的。在其中文版（已经由图灵出版社引进版权了）尚 未出版之前，这里带你先了解以下本书的要点： 第一章 [...]]]></description>
			<content:encoded><![CDATA[<p><i>如果你问十个C程序员：你觉得C语言的核心是什么？这十个程序员都会回答：指针。</i></p>
<p>指针具备成为C语言核心的两个关键要素：<b>强大</b>与<b>争议</b>。</p>
<p>* <b>指针的强大</b>源自于其天生与机器内存模型的适配。使用指针让代码紧凑，并可获得仅次于汇编代码的执行效率；使用指针可以让C程 序员毫不费力地尽情操纵着内存中的每个byte甚至是bit；使用指针可以为C程序员提供无与伦比的操作灵活性。总之，在C语言中指针几乎是无所 不能的代名词。得指针者得天下，没有指针，C语言将变得平庸。</p>
<p>* 成也指针，败也指针。<b>指针的争议</b>之处就在于其在赋予C程序员无比强大的Power的同时，也常常带来无穷的烦恼甚至灾祸，比如 内存问题、调试困难或因指针导致的程序崩溃等。就好比人类社会，做核心人物有争议是难免的，比如足球界有马拉多纳，跳水界有菲尔普斯，斯诺克界有 奥沙利文^_^。</p>
<p>好了，言归正传，我们回到C语言图书上来。目前市面上的C语言书籍，无论国内国外，无论经典还是山寨，基本都是百科大全型，将C语言讲的面面俱 到。比如最近的一本大而全的经典应当属《C Programming , A Modern Approach》，中文版书名为《<a href="http://book.douban.com/subject/4279678/">C语言程序设计：现代方法</a>》第2版。以至于发展到今天，C语言似乎也没啥可讲的了，新出的C语言书大多是与前辈们雷同 的作品。近两年来也有O&#39;reilly出版的C语言书籍，比如：</p>
<p>*《<a href="http://book.douban.com/subject/6919383/">Head First C</a>》<br />
	*《<a href="http://book.douban.com/subject/11229717/">21st Century C &#8211; C Tips from the New School</a>》</p>
<p>前者是典型的Head First风格的C教程，后者则是另辟蹊径，结合C语言外延（构建、调试、打包、版本控制、面向对象与C、知名C语言开源库等)进行讲解。这两本书虽形式 有变化，但终究脱离不开百科大全型，针对C的核心-指针并未有较多的深入探讨。而市场上专门写指针的书也稀少的很（似乎鬼子国那边有一本，叫什么 《<a href="http://book.douban.com/subject/21317828/">征服C指针</a>》），唯一的一本书名与指针扯上关系的书《Pointers on C》（中文名&ldquo;<a href="http://book.douban.com/subject/3012360/">C和指针</a>&rdquo;）其实依旧是一本C语言大全。于是乎国外著名出版社O&#39;Reilly今年5月出品了一本专门讲解C语言核心 &#8211; <b>指 针</b>的书《<a href="http://book.douban.com/subject/20491037/">Understanding and Using C Pointers</a>》，以满足C程序员深入理解C语言核心并实现进阶的诉求。O&#39;Reilly就是O&#39;Reilly，总是能抓住C语言书籍方面的深度阅读需 求^_^。</p>
<p>《Understanding and Using C Pointers》是个小册子，拢共才200多页，但内容却全部是围绕C语言指针展开的，从最基本的指针声明与操作、C内存模型、动态内存分配，讲到指针 与数组、结构体、字符串的关系，再到最后指针的高级特性：强制转换、Strict Aliasing、线程共享、多态支持等，由浅入深的进行细致的剖析。其作者认为作为C语言核心的指针值得花200页篇幅去讲解，而且期望所有读者在读完 此书后能对C指针有个扎实的理解。总之，这本书对系统C程序员理解C语言的核心-指针是大有裨益的。在其中文版（已经由图灵出版社引进版权了）尚 未出版之前，这里带你先了解以下本书的要点：</p>
<p><b>第一章 简介</b></p>
<p><i>1、指针与内存</i></p>
<p>&nbsp;&nbsp; 【指针声明语法】<br />
	&nbsp;&nbsp;&nbsp; <font face="Courier New">int *pi;</font></p>
<p>&nbsp;&nbsp; 【理解复杂指针声明】<br />
	&nbsp;&nbsp;&nbsp; 方法：从后向前读，例子：</p>
<p><font face="Courier New">&nbsp;&nbsp; const int *pci;</font></p>
<p><font face="Courier New">&nbsp;&nbsp; pci is a variable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pci<br />
	&nbsp;&nbsp; pci is a pointer variable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pci<br />
	&nbsp;&nbsp; pci is a pointer variable to an integer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int *pci<br />
	&nbsp;&nbsp; pci is a pointer variable to a constant integer&nbsp;&nbsp;&nbsp;&nbsp; const int *pci</font></p>
<p>&nbsp;&nbsp;&nbsp; 【地址操作符】<br />
	&nbsp;&nbsp;&nbsp;&nbsp; <font face="Courier New">pi = &amp;num;</font></p>
<p>&nbsp;&nbsp;&nbsp; 【输出指针值】<br />
	&nbsp;&nbsp;&nbsp; 通过%x、%o、%p输出(printf)指针的值，一般使用%p（%p输出结果不一定等同于%x，是与实现有关的）。例子如下：<br />
	<font face="Courier New">&nbsp;&nbsp; &nbsp; int num = 0;<br />
	&nbsp;&nbsp;&nbsp;&nbsp; int *pi = &amp;num;<br />
	&nbsp;&nbsp; &nbsp; printf(&quot;Address of num: %d Value: %d\n&quot;,&amp;num, num);<br />
	&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;Address of pi: %d Value: %d\n&quot;,&amp;pi, pi);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; Address of num: 4520836 Value: 0<br />
	&nbsp;&nbsp;&nbsp;&nbsp; Address of pi: 4520824 Value: 4520836</font></p>
<p>&nbsp;&nbsp;&nbsp; 【通过间接访问操作符解引用指针】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 间接访问操作符*，使用例子如下：<br />
	<font face="Courier New">&nbsp;&nbsp; &nbsp; int num = 5;<br />
	&nbsp;&nbsp;&nbsp;&nbsp; int *pi = &amp;num;<br />
	&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;%d\n&quot;,*pi); // Displays 5<br />
	&nbsp;&nbsp;&nbsp;&nbsp; *pi = 200;<br />
	&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;%d\n&quot;,num); // Displays 200</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 【指向函数的指针】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font face="Courier New"> void (*foo)();&nbsp; // 这个变量声明中的foo就是一个指向函数的指针</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 【Null概念】</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; null concept<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 赋值为NULL的指针变量表示该指针不指向任何内存地址。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; null pointer constant<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; null concept的具体支撑实现，其常量值可能是常量值0，也可能不是。依具体实现而定。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL macro<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在许多标准库实现中，NULL定义如下：<font face="Courier New">#define NULL ((void *)0)</font>，这也是我们对NULL的通常理解。当然这是依Compiler的具体实现而定的。如果编译 器使用非全0位模式实现了NULL，那该编译器就要保证在指针上下文中使用的NULL或0是null pointer。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASCII NUL<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个全0的字节。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; null string<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个不包含任何字符的空字符串。C字符串在最后都放置一个结尾0值。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; null statement<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只包含一个分号的空语句。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指向void的指针<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 指向void的指针被成为通用指针，可以用于引用任意类型的数据。它有两个属性：<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 指向void的指针与指向char类型的指针具有相同的内存表示与内存对齐约束。<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &#8211; void指针永远不等于其他类型指针，两个赋值为NULL的void pointer是相等的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 任何指针都可以被赋给一个void pointer，并且之后还可以被转换回其原来的类型。<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; int num;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int *pi = &amp;num;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void* pv = pi;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pi = (int*) pv;</font><br />
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br />
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; void pointer用于数据指针，而不是函数指针。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 全局void pointer或static void pointer在程序启动时被初始化为NULL。</p>
<p><i>2、指针大小与类型</i><br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在多数现代平台上，指针的大小都是相同的，与其类型无关。指向char的指针与指向结构体的指针大小相同。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指向函数的指针可能与指向数据类型的指针大小有差异，这要依具体实现而定。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
	&nbsp;&nbsp;&nbsp;&nbsp; 【内存模型】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在不同机器和编译器下，C语言原生类型的大小是不同的。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 描述不同数据模型的一般记法：<font face="Courier New">I In L Ln LL LLn P Pn</font>，例如LP64、ILP64、LP32等。<br />
	&nbsp;<br />
	&nbsp;&nbsp;&nbsp;&nbsp; 【预定义的指针相关类型】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Courier New">size_t</font> 用于表示对象的大小的一个安全类型。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Courier New">ptrdiff_t</font> 用于处理指针运算<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Courier New">intptr_t和uintptr_t </font>用于存 储指针地址</p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; int num;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intptr_t *pi = &amp;num;</font></p>
<p><i>3、指针操作符</i></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 【指针运算】<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pointer + integer<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指针实际移动的字节数 = integer + sizeof(integer_type)<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void* pointer的指针运算操作行为是未定义的，依赖Compiler的具体实现。</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pointer &#8211; integer<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指针实际移动的字节树 = integer &#8211; sizeof(integer_type)。</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pointer1 &#8211; pointer2<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 两个指针所指地址间的差值，常用于判断数组中元素的先后次序。</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比较pointers</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 【指针比较】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指针可以使用标准的比较操作符（&gt; and &lt;）进行比较，可用来判断数组中元素的先后次序。</p>
<p><i>4、指针的通常用法</i><br />
	&nbsp;&nbsp;&nbsp;&nbsp;<br />
	&nbsp;&nbsp;&nbsp;&nbsp; 【多级间接寻址】<br />
	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 双指针(double pointer) &#8211; 指向指针的指针。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Courier New">char *titles[] = {&quot;A Tale of Two Cities&quot;,<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Wuthering Heights&quot;,&quot;Don Quixote&quot;,<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Odyssey&quot;,&quot;Moby-Dick&quot;,&quot;Hamlet&quot;,<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Gulliver&#39;s Travels&quot;};<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char **bestBooks[3];<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bestBooks[0] = &amp;titles[0];<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bestBooks[1] = &amp;titles[3];<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bestBooks[2] = &amp;titles[5];</font><br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 间接寻址的级数并没有限制，但过多的级数会让人难以理解。<br />
	&nbsp;&nbsp;<br />
	&nbsp; &nbsp; 【常量和指针】</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指向常量的指针<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const int limit = 500;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const int *pci = &amp;limit;</font><br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Courier New">*pci = 600；/* Error， 我们不能解引用一个常量指针并修改其所指的内存值 */</font><br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Courier New">const int *pci &lt;=&gt; int const *pci;</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指向非常量的常量指针<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int num;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int *const cpi = &amp;num;</font><br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Courier New">*cpi = 25; /* 可以解引用常量指针并修改其所指的内存的值 */<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int limit;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cpi = &amp;limit; /* Error，我们不能为常量指针重新赋新值 */</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const int limit1 = 300;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int *const cpi1 = &amp;limit1; /* Warning: 指向非常量的常量指针被用常量 的地址初始化了 */<br />
	&nbsp;<br />
	&nbsp; &nbsp; &nbsp; 指向常量的常量指针 &nbsp;&nbsp;&nbsp;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const int limit = 300;<br />
	&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; const int *const cpci = &amp;limit; </font>/* 声明后，我们不能通过cpci修改limit，也不能为cpci重新赋值 */</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指向&ldquo;指向常量的常量指针&rdquo;的指针<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const int limit = 300;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const int *const cpci = &amp;limit;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const int *const *pcpci = &amp;cpci;</font></p>
<p><b>第二章 C语言动态内存管理</b></p>
<p>在运行时通过函数手工从heap分配和释放内存的过程称为动态内存管理。</p>
<p><i>1、动态内存分配</i><br />
	&nbsp;&nbsp;&nbsp; 【使用malloc函数】<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp; &nbsp; int *pi = (int*) malloc(sizeof(int));<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pi = 5;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(pi);</font></p>
<p>&nbsp;&nbsp;&nbsp; 【内存泄漏】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 丢失了内存地址<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &#8211; 没有调用free函数释放内存</p>
<p><i>&nbsp;2、动态分配内存函数</i><br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; malloc、realloc、calloc、free<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否对malloc出的内存起始地址进行强制转型<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Courier New">int *p = (int*)malloc(4);</font><br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void *pointer可以转换为任意类型指针，没有强制转型也可以。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但显式的强制转型可以通过代码看出意图，并且与C++编译器(包括早期C编译器)兼容<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你不能用内存分配函数分配的内存去初始化全局或Static变量。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alloca函数用于在栈上动态分配内存，函数结束时，这块内存自动释放；但alloca不是标准C库函数，移植性差。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C99支持可变长度数组(VLA)，数组声明时的元素个数可以是运行时才能确定值的变量，但数组size一旦在运行时被确定，数组大小就无法再做改变：<br />
	<font face="Courier New">&nbsp; &nbsp; &nbsp;&nbsp; void compute(int size) {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char* buffer[size];<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;<br />
	&nbsp;&nbsp; &nbsp; &nbsp; }</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p><i>&nbsp;3、悬挂指针</i><br />
	<i>&nbsp;&nbsp;&nbsp;&nbsp; </i>被free后依然引用原先内存地址的指针，称为dangling pointer。<br />
	&nbsp;&nbsp;&nbsp;&nbsp; 悬挂指针可能导致如下问题：<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 如果访问其引用的内存，将导致不可预期的结果<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 如果内存不可访问了，将导致段错误<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 存在潜在的安全风险。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 悬挂指针引起的问题调试起来十分困难，以下几种方法用于避免发生悬挂指针问题或快速查找悬挂指针问题：<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; free后，设置指针为NULL；<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 编写一个替代free的函数；<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 用特定值填充free的内存块，便于快速定位dangling pointer问题<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 使用第三方工具检查dangling pointer问题</p>
<p><b>第三章 指针与函数</b></p>
<p>当与函数一起使用时，指针有两个方面发挥重要作用：<br />
	&nbsp;&nbsp; &#8211; 当指针以参数形式传递给函数时，允许函数修改指针所指内存区域的值，并且这种传递方式更加高效；<br />
	&nbsp;&nbsp; &#8211; 声明函数指针时，函数的名字被求值为函数的地址。<br />
	&nbsp;<br />
	<i>1、程序栈和堆</i></p>
<p>&nbsp;&nbsp;&nbsp; 【程序栈】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 栈和堆共享一块内存区域。栈在这块区域的低地址部分，堆在高地址部分。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序栈用于存放栈帧(stack frame)，栈帧中存放的是函数的参数与local变量。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 栈增长方向：向上；堆的增长方向：向下。</p>
<p>&nbsp;&nbsp;&nbsp; 【栈帧的组成】<br />
	&nbsp;&nbsp;&nbsp;&nbsp; 一个栈帧包含如下几个元素：<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 返回地址<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 本地变量<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 函数参数<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 栈指针(Stack pointer)和栈帧指针(base pointer or frame pointer)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; Stack pointer和frame pointer用于运行时系统对栈的管理。前者总是指向栈的顶端；后者指向栈帧内的某个地址，比如函数的返回地址；frame pointer辅助程序访问栈帧内的元素。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 栈帧的创建，见下面例子：<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Courier New">float average(int *arr, int size) {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int sum;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;arr: %p\n&quot;,&amp;arr);<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;size: %p\n&quot;,&amp;size);<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;sum: %p\n&quot;,&amp;sum);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;size; i++) {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum += arr[i];<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (sum * 1.0f) / size;<br />
	&nbsp;&nbsp;&nbsp; }</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; average的栈帧中沿着栈&ldquo;向上&rdquo;的方向，依次推入的是：<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 参数 size、arr （与声明的顺序恰好相反）<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 函数average调用的返回地址<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &#8211; 本地变量sum（如果有多个本地变量，推入栈的顺序也与变量声明顺序相反）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个线程通常都在自己的栈中创建栈帧。</p>
<p><i>2、指针作为参数和返回值</i></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C语言的参数是&ldquo;按值传递&rdquo;的，包括指针本身，函数内使用的是参数的copy。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在处理大数据结构时，将指针作为参数传递给函数或作为返回值会使得程序执行起来更加高效（只是copy一个指针大小的数据，而不是指针所指向的数据对象大 小）。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外一个以指针作为函数参数的目的是希望在函数内部对数据进行修改。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当传递一个指向常量的指针给函数时，其意图为不希望函数内部对指针所指的数据进行修改。例如void passingAddressOfConstants(const int* num1, int* num2)，不希望num1所指数据被修改。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将指针作为返回值返回时，应避免以下几个常见问题：<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 返回未初始化的指针<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 返回指向非法地址的指针<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 返回指向函数本地变量的指针<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 返回指针后，没有释放其所指的内存块<br />
	&nbsp;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果函数要修改的不是参数中指针所指的数据，而是指针本身所指的内存地址，那么应以double pointer形式作为函数参数：</p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void allocateArray(int **arr, int size, int value) {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *arr = (int*)malloc(size * sizeof(int));<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(*arr != NULL) {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;size; i++) {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *(*arr+i) = value;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int *vector = NULL;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allocateArray(&amp;vector,5,45);</font></p>
<p><i>3、</i><i>函数指针</i><br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 函数指针就是存放函数地址的指针。&nbsp;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用函数指针可能导致程序运行变慢（可能感知不到），因为函数指针的使用可能导致CPU无法正确的运用分支预测，导致CPU流水线中断。</p>
<p>&nbsp;&nbsp;&nbsp; 【声明函数指针】</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 函数指针的声明看起来像函数原型，比如：void (*foo)(int i);<br />
	&nbsp; &nbsp; &nbsp; 程序员应该确保通过函数指针调用函数的正确使用，因为C编译器不会检查是否正确的为函数指针传入正确的参数（类型、顺序以及个数）。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通常我们用typedef声明一个函数指针类型，比如：<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef void (*funcptr)(int i)；<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; funcptr fp = foo;</font></p>
<p>&nbsp;&nbsp;&nbsp; 【函数指针强制转型】<br />
	&nbsp;&nbsp;&nbsp; &nbsp;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个类型的函数指针可以被强制转为另外一种类型函数指针。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 转型后的指针 == 转型前的指针<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; typedef int (*fptrToSingleInt)(int);<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; typedef int (*fptrToTwoInts)(int,int);<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int add(int, int);<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fptrToTwoInts fptrFirst = add;<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fptrToSingleInt fptrSecond = (fptrToSingleInt)fptrFirst;<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fptrFirst = (fptrToTwoInts)fptrSecond;<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf(&quot;%d\n&quot;,fptrFirst(5,6));</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在函数指针间转换，很可能导致函数调用失败。</p>
<p><b>第四章 指针与数组</b></p>
<p><i>1、数组概述</i></p>
<p>数组与指针记法关系紧密，在特定上下文中可以相互替换。<br />
	数组内部表示中并没有数组长度信息。<br />
	&nbsp;<br />
	&nbsp; 【一维数组】<br />
	&nbsp;&nbsp;&nbsp; <font face="Courier New">int vector[5];</font></p>
<p>&nbsp;&nbsp;&nbsp; 一维数组是一个线性结构。数组下标起始于0，终止于(元素个数-1)。</p>
<p>&nbsp; 【二维数组】<br />
	&nbsp;&nbsp;&nbsp; <font face="Courier New">int matrix[2][3] = {{1,2,3},{4,5,6}};</font></p>
<p>&nbsp;&nbsp;&nbsp; 二维数组使用行和列标识数组元素。这类数组需要被映射到一个一维地址空间中。<br />
	&nbsp;&nbsp;&nbsp; 在C中，二维数组的第一行放在内存的最开始处，接下来是第二行，&#8230;，直到最后一行，这就是所谓的&ldquo;行主序&rdquo;。</p>
<p>&nbsp; 【多维数组】<br />
	&nbsp;&nbsp;&nbsp; <font face="Courier New">int arr3d[3][2][4] = {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {{1, 2, 3, 4}, {5, 6, 7, 8}},<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {{9, 10, 11, 12}, {13, 14, 15, 16}},<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {{17, 18, 19, 20}, {21, 22, 23, 24}}<br />
	&nbsp; };</font></p>
<p>&nbsp;&nbsp;&nbsp; 二维以上的维数的数组称为多维数组，其元素内存分配依旧遵守二维数组那种映射方式。</p>
<p><i>2、指针记法(notation)与数组</i></p>
<p>&nbsp;&nbsp;&nbsp; 指针记法与数组记法在一定场合可以互换，但两者并不完全相同。<br />
	&nbsp;&nbsp;&nbsp; 数组名单独使用时，我们得到的是数组的地址；该地址等同于数组内第一个元素的地址。</p>
<p><font face="Courier New">&nbsp; int vector[5] = {1, 2, 3, 4, 5};<br />
	&nbsp; int *pv = vector;<br />
	&nbsp; int (*pv)[5] = &amp;vector;</font></p>
<p>&nbsp;&nbsp;&nbsp; vector与&amp;vector不同，前者返回指向一个整型变量的指针（int *），后者返回一个指向整个数组的指针(int[5] *)。<br />
	<font face="Courier New">&nbsp; pv[i] &lt;=&gt; *(pv + i)<br />
	&nbsp; *(pv + i) &lt;=&gt; *(vector + i)</font></p>
<p>&nbsp; 【指针与数组间的不同】</p>
<p>&nbsp;&nbsp;&nbsp; <font face="Courier New">int vector[5] = {1, 2, 3, 4, 5};<br />
	&nbsp; int *pv = vector;</font></p>
<p>&nbsp;&nbsp;&nbsp; sizeof(vector) = 20 != sizeof(pv)</p>
<p>&nbsp;&nbsp;&nbsp; pv是lvalue，可以被修改而指向不同的地址；比如pv = pv + 1<br />
	&nbsp;&nbsp;&nbsp; 而vector不能被修改。vector = vector + 1这个表达式是错误的，不过pv = vector + 1是ok的。</p>
<p>&nbsp; 【使用malloc创建一维数组】<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp; int *pv = (int*) malloc(5 * sizeof(int));<br />
	&nbsp;&nbsp;&nbsp; pv[3] = 10;</font><br />
	&nbsp;&nbsp;&nbsp;&nbsp; 可使用realloc改变malloc创建的数组的大小。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;<br />
	3<i>、传递一维数组</i><br />
	&nbsp;&nbsp;&nbsp; 两种记法：数组记法和指针记法，分别如下：<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp; void displayArray(int arr[], int size);<br />
	&nbsp;&nbsp;&nbsp; void displayArray(int* arr, int size);</font></p>
<p>&nbsp;&nbsp;&nbsp; 无论哪种，displayArray函数体内int arr[]或int *arr都将以int *arr方式使用，即数组名退化为指针，sizeof(arr) = 指针长度，而不是数组总长度。</p>
<p>&nbsp;&nbsp; 【一维指针数组】<br />
	&nbsp;&nbsp;&nbsp;<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp; int* arr[5];<br />
	&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;5; i++) {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr[i] = (int*)malloc(sizeof(int));<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *arr[i] = i;<br />
	&nbsp;&nbsp;&nbsp; }</font></p>
<p>&nbsp;&nbsp; 【指针与多维数组】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 多维数组可以看成是由子数组组成的，就好比二维数组的每行都可以看成是一个一维数组。<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int matrix[2][5] = {{1,2,3,4,5},{6,7,8,9,10}};<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int (*pmatrix)[5] = matrix;</font></p>
<p>4<i>、传递多维数组</i></p>
<p><font face="Courier New">&nbsp;&nbsp; void display2DArray(int arr[][5], int rows)；&lt;=&gt;<br />
	&nbsp;&nbsp; void display2DArray(int (*arr)[5], int rows)；</font><br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面两个版本是等价的。两个版本都指定了列的值，因为编译器需要知道每行的元素个数。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 注意第二个版本不等价于<font face="Courier New">void display2DArray(int *arr[5], int rows)</font>；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在void display2DArrayUnknownSize(int *arr, int rows, int cols)的 函数体实现中，你不能使用arr[i][j]，因为arr并未被声明为二维数组。</p>
<p><i>5、动态分配二维数组</i></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 【采用不连续的内存分配方式】</p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; int rows = 2;<br />
	&nbsp;&nbsp;&nbsp; int columns = 5;<br />
	&nbsp;&nbsp;&nbsp; int **matrix = (int **) malloc(rows * sizeof(int *));<br />
	&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; rows; i++) {<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; matrix[i] = (int *) malloc(columns * sizeof(int));<br />
	&nbsp;&nbsp;&nbsp; }</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 【采用连续内存分配的方式】</p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; int rows = 2;<br />
	&nbsp;&nbsp;&nbsp; int columns = 5;<br />
	&nbsp;&nbsp;&nbsp; int **matrix = (int **) malloc(rows * sizeof(int *));<br />
	&nbsp;&nbsp;&nbsp; matrix[0] = (int *) malloc(rows * columns * sizeof(int));<br />
	&nbsp;&nbsp;&nbsp; for (int i = 1; i &lt; rows; i++)<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; matrix[i] = matrix[0] + i * columns;</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or</p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; int *matrix = (int *)malloc(rows * columns * sizeof(int));</font></p>
<p><b>第五章 指针与字符串</b></p>
<p><i>1、字符串基础</i></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 字符串：以ASCII结尾&#39;\0&#39;字符结尾的字符序列。<br />
	&nbsp;&nbsp;&nbsp;&nbsp; 分类：字节字符串(byte string) &#8211; char类型字符序列<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 宽字符串（wide string) &#8211; wchar_t 类型字符序列（每个字符16bit or 32bit，依编译器实现而定）<br />
	&nbsp;&nbsp;&nbsp;&nbsp; 字符串声明：<font face="Courier New">char header[32]</font> or<font face="Courier New"> char *header</font>；</p>
<p>&nbsp;&nbsp;&nbsp; 【字符串字面量池(String literal pool)】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符串字面量定义后将被放在字面量池中。这块内存区域存放的是组成字符串的字符序列。当一个字面量多次使用时，通常在字面量池中只存储一份该字符串。这将 降低程序的内存使用量。并且通常情况下，字面量池中的字符串是immutable的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大多数编译器都提供了编译开关，用于指示是否关闭字符串字面量池，比如Gcc的-fwritable-strings。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 【字符串初始化】、<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font face="Courier New">char *header = &quot;Media Player&quot;;</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char header[] = &quot;Media Player&quot;;</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char header[13];<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(header,&quot;Media Player&quot;);</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *header = (char*) malloc(strlen(&quot;Media Player&quot;)+1);<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(header,&quot;Media Player&quot;);</font></p>
<p><i>2、标准字符串操作</i></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比较字符串：strcmp<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 拷贝字符串：strcpy<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 连接字符串：strcat</p>
<p><i>3、传递字符串</i></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 传递简单字符串：<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp; &nbsp; size_t stringLength(char* string) ;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_t stringLength(char string[]);</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 传递字符串常量：<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_t stringLength(const char* string);</font></p>
<p><i>4、返回字符串</i></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个字面量：<font face="Courier New">return &quot;Boston Processing Center&quot;</font>；<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 动态分配的内存：<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char* spaces = (char*) malloc(number + 1);<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230; &#8230;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return spaces;</font><br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回local字符串的地址是危险的。</p>
<p><i>5、函数指针与字符串</i></p>
<p><b>第六章 指针与结构体</b></p>
<p><i>1、简介</i></p>
<p>&nbsp;&nbsp;&nbsp; 【如何为结构体分配内存】 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 结构体的大小往往大于该结构体所有字段大小之和，因为有数据对齐的需求，导致编译器在进行结构体内存分配时进行了padding操作。特定数据类型具有一 定的对齐要求，比如short类型的字段要求其地址能被2整除，而integer类型的字段要求其起始地址能被4整除。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 考虑到这些多余分配的内存，你应该谨慎对待如下操作：<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 小心使用指针运算<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 结构体数组的元素间有多余内存空间</p>
<p>&nbsp;&nbsp;&nbsp; 【结构体内存释放】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为结构体分配内存时，运行时不会自动为结构体内的指针字段分配内存；同理，释放结构体内存时，运行时也不会自动释放结构体内指针字段所指向的内存。</p>
<p>&nbsp;&nbsp;&nbsp; 【避免malloc和free的额外开销】<br />
	&nbsp;&nbsp;&nbsp;&nbsp; malloc和free多次重复调用时，会给程序带来额外的开销。一个解决方法就是自己维护一份已分配的结构。需要时，从这个池里取出一份，释放时，直接 返回给池中。如果没有可用的结构时，才考虑新创建一个。</p>
<p><i>2、使用指针支持数据结构</i></p>
<p>无论是简单还是复杂的数据结构，指针都提供了更加灵活的支持，包括链表、队列、栈以及树等。</p>
<p><b>第七章&nbsp;安全问题以及不当使用指针</b><br />
	&nbsp;&nbsp;&nbsp;<br />
	深入理解指针以及其正确的使用方法有利于开发出安全可信赖的应用。</p>
<p>OS引入了一些提升安全的技术，比如 Address Space Layout Randomization和Data Execution Prevention。</p>
<p>【Address Space Layout Randomization (ASLR) ，地址空间布局随机化】<br />
	&nbsp; ASLR技术使得程序的数据区域随机布局，数据区域包括：代码、栈、堆。随机的放置这些区域让代码攻击行为很难精确预测特定代码的内存地址并使用它们。</p>
<p>【Data Execution Prevention(DEP)，数据执行保护】<br />
	&nbsp; DEP技术会阻止执行非执行数据区域中的代码。在一些攻击中，一些非执行数据区域中的数据被恶意覆写为代码，执行权也被转移到那里。但有了DEP后，这些 恶意代码将无法执行。</p>
<p><i>1、指针声明与初始化</i></p>
<p>&nbsp;&nbsp; 【不正确的指针声明】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;<font face="Courier New"> int* ptr1, ptr2;</font><br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr1是指针，但ptr2只是一个整型变量。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正确声明方法：<font face="Courier New">int *ptr1, *ptr2; /* 更好的做法是每行仅声明一个变量 */</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面做法存在同样的问题：<br />
	<font face="Courier New">&nbsp;&nbsp; #define PINT int*<br />
	&nbsp;&nbsp; PINT ptr1, ptr2;</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用typedef就没有问题了：<br />
	<font face="Courier New">&nbsp;&nbsp; typedef int* PINT;<br />
	&nbsp;&nbsp; PINT ptr1, ptr2;</font></p>
<p>&nbsp;&nbsp; 【使用指针前未初始化】<br />
	&nbsp;&nbsp;&nbsp;&nbsp; 使用前未做初始化的指针，常称作野指针（wild pointer)：</p>
<p><font face="Courier New">&nbsp;&nbsp; int *pi;<br />
	&nbsp;&nbsp;&nbsp; &#8230;<br />
	&nbsp;&nbsp; printf(&ldquo;%d\n&rdquo;,*pi);</font></p>
<p>&nbsp;&nbsp;&nbsp; 【处理未初始化的指针】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指针脸上没有写自己是否做过初始化^_^。通常有三种方法用于对付未初始化的指针：<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &#8211; 总是将指针初始化为NULL；<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 使用assert函数<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &#8211; 使用第三方工具<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br />
	<i>2</i><i>、指针使用问题</i><br />
	&nbsp;&nbsp;&nbsp;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缓冲区溢出(Buffer overflow)可能由以下原因导致：<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 访问数组元素的时候没有检查下标值<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 做数组指针相关运算时不够谨慎<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 用gets之类的函数从标准输入读取字符串<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 使用strcpy和strcat不当</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 【测试NULL】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用malloc后，总是检查返回值是否为NULL。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 【误用解引用操作符】<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int num;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int *pi;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pi = &amp;num</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 【悬挂指针】</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 【访问数组越界】</p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char firstName[8] = &quot;1234567&quot;;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char middleName[8] = &quot;1234567&quot;;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char lastName[8] = &quot;1234567&quot;;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; middleName[-2] = &#39;X&#39;;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; middleName[0] = &#39;X&#39;;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; middleName[10] = &#39;X&#39;;</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 【错误计算数组大小】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当将数组作为参数传递给函数时，务必将函数的Size一并传入，这个Size信息将避免数组访问越界。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 【误用sizeof操作符】<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int buffer[20];<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int *pbuffer = buffer;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;sizeof(buffer); i++) {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *(pbuffer++) = 0;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; sizeof(buffer)=&gt;sizeof(buffer)/sizeof(buffer[0]);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【总是匹配指针类型】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【有界指针(bounded pointer)】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【字符串安全问题】<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 对strcpy和strcat使用不当，会导致缓冲区溢出。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在C11标准中加入了strcat_s和strcpy_s函数，如果发生缓冲区溢出，它们会返回错误。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【函数指针问题】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不要将函数赋值给签名不同的函数指针，这很可能将导致未定义行为发生。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
	<i>3、内存释放问题</i><br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【两次free】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【清除敏感数据】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个良好的实践是覆写哪些不再需要的敏感数据。</p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *name = (char*)malloc(&#8230;);<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(name,0,sizeof(name));<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(name);</font></p>
<p><i>4、使用静态分析工具</i></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如Gcc -Wall等。</p>
<p><b>第八章 &nbsp;其他零碎的知识点</b></p>
<p><i>1、指针转型</i><br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指针转型有几个原因：<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 访问特定目的的地址<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 分配一个地址代表一个端口<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 决定机器的endianess</p>
<p>&nbsp;&nbsp;&nbsp; 【访问特定的地址】<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define VIDEO_BASE 0xB8000<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int *video = (int *) VIDEO_BASE;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *video = &#39;A&#39;;</font></p>
<p>&nbsp;&nbsp;&nbsp; 【访问一个端口】<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define PORT 0xB0000000<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned int volatile * const port = (unsigned int *) PORT;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *port = 0x0BF4; // write to the port<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value = *port; // read from the port</font></p>
<p>&nbsp;&nbsp;&nbsp; 【判断机器的endianess】<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int num = 0&#215;12345678;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char* pc = (char*) &amp;num;<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 4; i++) {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(&quot;%p: %02x \n&quot;, pc, (unsigned char) *pc++);<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><i>2、Aliasing、Strict Aliasing和restrict关键字</i></p>
<p>两个指针同时指向一块相同的内存地址，这两个指针被称为aliasing。</p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; int num = 5;<br />
	&nbsp;&nbsp;&nbsp;&nbsp; int* p1 = &amp;num;<br />
	&nbsp;&nbsp;&nbsp;&nbsp; int* p2 = &amp;num;</font></p>
<p>aliasing的使用对编译器生成的代码强加了限制。<br />
	如果两个指针引用相同位置，每个指针都可以修改这块地址。当编译器生成读写这块内存的代码时，不总是可以通过将值存储在寄存器中这种办法来优化代 码。对每次引用，将强制使用机器级别的低效load和store操作。</p>
<p>Strict Aliasing：另外一种形式的aliasing。strict aliasing不允许不同类型的指针指向同一块内存区域。下面代码：一个指向整型的指针alias了一个指向float类型的指针了，这违反了Strict Aliasing的规则。</p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; float number = 3.25f;<br />
	&nbsp;&nbsp;&nbsp; unsigned int *ptrValue = (unsigned int *)&amp;number;<br />
	&nbsp;&nbsp;&nbsp; unsigned int result = (*ptrValue &amp; 0&#215;80000000) == 0;</font></p>
<p>如果仅仅是符号标志和修饰符不同，是不会影响strict aliasing的，下面的语句是符合Strict aliasing规则的：</p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; int num;<br />
	&nbsp;&nbsp;&nbsp; const int *ptr1 = &amp;num;<br />
	&nbsp;&nbsp;&nbsp; int *ptr2 = &amp;num;<br />
	&nbsp;&nbsp;&nbsp; int volatile ptr3 = &amp;num;</font></p>
<p>有些场合，相同数据的不同表示是很有用处的，下面一些方法可以避免与Strict aliasing规则冲突：<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &#8211; 使用Union: 多个数据类型的联合体可以规避strict aliasing<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8211; 关闭strict aliasing ：利用编译器提供的开关将strict aliasing关闭（不建议这么做哦），<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比如Gcc提供的一些开关：<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -fno-strict-aliasing 关闭strict aliasing<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -fstrict-aliasing 打开strict aliasing<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -Wstrict-aliasing 针对strict aliasing相关问题给出警告</font><br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &#8211; 使用char pointer：char pointer可以alias任何对象。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【使用Union实现一个值的多种方式表示】<br />
	<font face="Courier New">&nbsp;&nbsp;&nbsp;<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; typedef union _conversion {<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; float fNum;<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;&nbsp; unsigned int uiNum;<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } Conversion;<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int isPositive1(float number) {<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;&nbsp; Conversion conversion = { .fNum =number};<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;&nbsp; return (conversion.uiNum &amp; 0&#215;80000000) == 0;<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于没有指针，所以不存在违反Strict aliasing的问题。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【Strict Aliasing】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编译器假设多个不同类型的指针不会引用到同一个数据对象，这样在strict aliasing的规则下，编译器才能够实施一些优化。如果假设不成立，那很可能发生意料之外的结果。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 即使是两个拥有相同字段，但名字不同的结构体，其对应的指针也不能引用同一个对象。但通过typedef结构体类型指针与原类型指针可以引用同一个数据对象。</p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; typedef struct _person {<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; char* firstName;<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; char* lastName;<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned int age;<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } Person;<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; typedef Person Employee;<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Person* person;<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Employee* employee;</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【使用restrict关键字】<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用restrict关键字，意即告诉编译器这个指针没有被alias，这样编译器将可以进行优化，生成更为高效的代码。通常的优化方法是缓存这个指针。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不过即便使用了restrict关键字，对编译器来说也只是一个建议，编译器可自行选择是否进行优化。<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 建议新代码中都要使用restrict关键字。</p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void add(int size, double * restrict arr1, const double * restrict arr2) {<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; size; i++) {<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; arr1[i] += arr2[i];<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; double vector1[] = {1.1, 2.2, 3.3, 4.4};<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; double vector2[] = {1.1, 2.2, 3.3, 4.4};<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; add(4,vector1,vector2);</font><br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 以上是add函数的正确用法。</p>
<p><font face="Courier New">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; double vector1[] = {1.1, 2.2, 3.3, 4.4};<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; double *vector3 = vector1;<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; add(4,vector1,vector3);<br />
	&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; add(4,vector1,vector1);</font></p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 这个例子中vector3与vector1指向同一份数据，也许add可以正常工作，但这个函数的调用结果并不那么可靠。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 标准C库中有多个函数使用了restrict关键字，比如void *memcpy(void * restrict s1, const void * restrict s2, size_t n)等。</p>
<p style='text-align:left'>&copy; 2013, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2013/05/28/understanding-and-using-c-pointers-keypoint-preview/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>谋划2013</title>
		<link>https://tonybai.com/2013/03/11/2013-plan/</link>
		<comments>https://tonybai.com/2013/03/11/2013-plan/#comments</comments>
		<pubDate>Mon, 11 Mar 2013 04:49:32 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[生活簿]]></category>
		<category><![CDATA[2013]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Blogger]]></category>
		<category><![CDATA[Buildc]]></category>
		<category><![CDATA[Opensource]]></category>
		<category><![CDATA[Programmer]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[健康]]></category>
		<category><![CDATA[博客]]></category>
		<category><![CDATA[女儿]]></category>
		<category><![CDATA[家庭]]></category>
		<category><![CDATA[工作]]></category>
		<category><![CDATA[开源]]></category>
		<category><![CDATA[思考]]></category>
		<category><![CDATA[感悟]]></category>
		<category><![CDATA[旅游]]></category>
		<category><![CDATA[果果]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[目标]]></category>
		<category><![CDATA[读书]]></category>

		<guid isPermaLink="false">http://tonybai.com/?p=1215</guid>
		<description><![CDATA[眼看2013年已经过去1/6了，这个谋划显然有些晚了。之所以晚，根本原因还是之前有些很多事情没有想清楚，即便是现在可能依旧比较朦胧。鉴于去年的目标执行情况不甚理想，尤其是工作目标方面，因此今年在谋划策略方面变得更加务实和收敛，期望能说到做到或做的尽可能的多。 一、个人目标 * 鉴于去年的执行情况，今年将blog定在80篇（大约每5天一篇）应该问题不大，毕竟blog已经成为我生活的一个重要组成部分了。 * 阅读是必不可少的。今年计划将读书目标定在40本（大约每9天一本）。去年的读书效率下降许多，感觉更多是因为自己变得懒散了。所以今年除了&#8220;扫库存&#8221;之外，还增加了一个改善措施：从省图书馆借书读。俗话说：书非借而不能读也^_^。借书读，一方面降低书架上的书增长的速度，减少了开支；另一方面还可能提高读书效率，借的书毕竟是要还的么^_^。昨天在整理果果的书时发现我的书架已经接近满员了，所以以后非经典书/非紧急书就不打算买了，不知道能否借此戒掉&#8220;买书瘾&#8221;，想必到时侯还是会纠结一番的^_^。最后在读书方面还是要给自己设置一条主线的，尽量围绕自己的目标达成去选择读哪些而不读哪些，读自己所需要的，按照自己的思路去读，千万不要人读己亦读。 * 学习新编程语言方面。每年一门新语言，但今年目标不甚明确。对函数式语言有些担心，前途似乎没有看起来的那么美，可预见到情况是将长期持续在小众领域徘徊。今年的策略是看缘份了^_^。在日常工作中，Python这门语言的使用是愈来愈多了，今年在Python方面肯定是要继续深入研究一点点的。 * 开源方面。我将继续和同事一起推进buildc的演进，至少会完成已经策划已久的0.3.0版本的设计与实现。在开源方面目前尚未参与过其他人发起的项目，这块更多还是自己找点子，期望今年能有一些新的想法。 * 个人健康方面。前些日子得了肺部感染，连续挂了近两周点滴才控制住病情，钱没少花，罪没少遭，还好目前看起来像是痊愈了。恰因为此，今年才把这个单独拿出来作为个人目标的一部分。事后分析，之所以被细菌感染，更多是因为自己的免疫力太低了。事实上也是这样的：去年一整年都没有什么锻炼身体的活动，免疫力不低就怪了。所以今年打算把晨跑提上日程，记得11年是晨跑坚持时间最长的一年，每天跑上3km，各方面的感觉的确是非常好的。 * 关注代码。和2012相比，今年期望能抽出更多的时间和精力编写自己的代码、阅读和评审其他人的代码。对于程序员出身的我而言，代码的魔力是我无论如何都无法抗拒的。 * 其他能力提升方面。今年重点想提升一下当众Speaking能力。目前当众讲话是没啥问题的，但如何当众把话讲的更好更具吸引力，这方面还需要专门的学习和训练。 二、工作目标 不得不承认去年工作方面的失意让我对工作的热情有所衰退，所以今年在工作目标方面尽量收敛一些，也不想在这里把一些具体目标展开说明了，唯一所求的就是踏踏实实把重点任务做好。另外任何事情做久了，都想期待有一些变化。 三、家庭目标 虽然去年的家庭目标完成的十分不错，不过有了去年的家庭目标做铺垫，今年的目标达成难度加大了许多，压力山大啊。这里先列出一些简单的： * 更新数码装备：本本、手机、相机、平板、电纸书等。 * 给果果转到规模较大的幼儿园，接受更为规范的教育。 * 常回父母家看看。 * 家庭成员省内、国内、境外游至少各一次。 &#8230;. 这里省略很多更难实现的家庭目标。 与工作相比，感觉我在家庭生活上的掌控力更弱一些，让我纠结的事情也更多一些。至于原因么，男人都懂的。 总体来说，至少从这篇blog的篇幅上来看，2013的目标比2012年要收敛许多，尤其在工作方面。有些事情等做完了再说也未尝不好。&#160; &#169; 2013, bigwhite. 版权所有.]]></description>
			<content:encoded><![CDATA[<p>眼看2013年已经过去1/6了，这个谋划显然有些晚了。之所以晚，根本原因还是之前有些很多事情没有想清楚，即便是现在可能依旧比较朦胧。鉴于去年的目标执行情况不甚理想，尤其是工作目标方面，因此今年在谋划策略方面变得更加务实和收敛，期望能说到做到或做的尽可能的多。</p>
<p><strong>一、个人目标</strong></p>
<p>* 鉴于<a href="http://tonybai.com/2012/12/18/my-summary-of-2012/">去年</a>的执行情况，今年将blog定在80篇（大约每5天一篇）应该问题不大，毕竟<a href="http://tonybai.com/2012/12/19/my-blog-outlook/">blog</a>已经成为我生活的一个重要组成部分了。</p>
<p>* 阅读是必不可少的。今年计划将读书目标定在40本（大约每9天一本）。去年的读书效率下降许多，感觉更多是因为自己变得懒散了。所以今年除了&ldquo;扫库存&rdquo;之外，还增加了一个改善措施：从省图书馆借书读。俗话说：书非借而不能读也^_^。借书读，一方面降低书架上的书增长的速度，减少了开支；另一方面还可能提高读书效率，借的书毕竟是要还的么^_^。昨天在整理<a href="http://tonybai.com/2013/02/18/my-daughter-monologue-about-2013-spring-festival/">果果</a>的书时发现我的书架已经接近满员了，所以以后非经典书/非紧急书就不打算买了，不知道能否借此戒掉&ldquo;买书瘾&rdquo;，想必到时侯还是会纠结一番的^_^。最后在读书方面还是要给自己设置一条主线的，尽量围绕自己的目标达成去选择读哪些而不读哪些，读自己所需要的，按照自己的思路去读，千万不要人读己亦读。</p>
<p>* 学习新编程语言方面。每年一门新语言，但今年目标不甚明确。对函数式语言有些担心，前途似乎没有看起来的那么美，可预见到情况是将长期持续在小众领域徘徊。今年的策略是看缘份了^_^。在日常工作中，<a href="http://tonybai.com/2013/01/24/the-module-import-way-under-python-package/">Python</a>这门语言的使用是愈来愈多了，今年在Python方面肯定是要继续深入研究一点点的。</p>
<p>* 开源方面。我将继续和同事一起推进<a href="http://code.google.com/p/buildc">buildc</a>的演进，至少会完成已经策划已久的0.3.0版本的设计与实现。在开源方面目前尚未参与过其他人发起的项目，这块更多还是自己找点子，期望今年能有一些新的想法。</p>
<p>* 个人健康方面。前些日子得了肺部感染，连续挂了近两周点滴才控制住病情，钱没少花，罪没少遭，还好目前看起来像是痊愈了。恰因为此，今年才把这个单独拿出来作为个人目标的一部分。事后分析，之所以被细菌感染，更多是因为自己的免疫力太低了。事实上也是这样的：去年一整年都没有什么锻炼身体的活动，免疫力不低就怪了。所以今年打算把晨跑提上日程，记得11年是晨跑坚持时间最长的一年，每天跑上3km，各方面的感觉的确是非常好的。</p>
<p>* 关注代码。和2012相比，今年期望能抽出更多的时间和精力编写自己的代码、阅读和评审其他人的代码。对于程序员出身的我而言，代码的魔力是我无论如何都无法抗拒的。</p>
<p>* 其他能力提升方面。今年重点想提升一下当众Speaking能力。目前当众讲话是没啥问题的，但如何当众把话讲的更好更具吸引力，这方面还需要专门的学习和训练。</p>
<p><strong>二、工作目标</strong></p>
<p>不得不承认去年工作方面的失意让我对工作的热情有所衰退，所以今年在工作目标方面尽量收敛一些，也不想在这里把一些具体目标展开说明了，唯一所求的就是踏踏实实把重点任务做好。另外任何事情做久了，都想期待有一些变化。</p>
<p><strong>三、家庭目标</strong></p>
<p>虽然去年的家庭目标完成的十分不错，不过有了去年的家庭目标做铺垫，今年的目标达成难度加大了许多，压力山大啊。这里先列出一些简单的：</p>
<p>* 更新数码装备：本本、手机、相机、平板、电纸书等。<br />
	* 给果果转到规模较大的幼儿园，接受更为规范的教育。<br />
	* 常回父母家看看。<br />
	* 家庭成员省内、国内、境外游至少各一次。<br />
	&#8230;. 这里省略很多更难实现的家庭目标。</p>
<p>与工作相比，感觉我在家庭生活上的掌控力更弱一些，让我纠结的事情也更多一些。至于原因么，男人都懂的。</p>
<p>总体来说，至少从这篇blog的篇幅上来看，2013的目标比2012年要收敛许多，尤其在工作方面。有些事情等做完了再说也未尝不好。&nbsp;</p>
<p style='text-align:left'>&copy; 2013, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2013/03/11/2013-plan/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>2012小结</title>
		<link>https://tonybai.com/2012/12/18/my-summary-of-2012/</link>
		<comments>https://tonybai.com/2012/12/18/my-summary-of-2012/#comments</comments>
		<pubDate>Tue, 18 Dec 2012 07:43:04 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[生活簿]]></category>
		<category><![CDATA[2012]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Blogger]]></category>
		<category><![CDATA[Programmer]]></category>
		<category><![CDATA[世界末日]]></category>
		<category><![CDATA[女儿]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[家庭]]></category>
		<category><![CDATA[小结]]></category>
		<category><![CDATA[工作]]></category>
		<category><![CDATA[思考]]></category>
		<category><![CDATA[总结]]></category>
		<category><![CDATA[感悟]]></category>
		<category><![CDATA[果果]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[程序员]]></category>
		<category><![CDATA[管理]]></category>
		<category><![CDATA[读书]]></category>
		<category><![CDATA[豆瓣]]></category>

		<guid isPermaLink="false">http://tonybai.com/?p=1149</guid>
		<description><![CDATA[趁着世界末日尚未到来，赶紧将2012年总结一番，即便是末日也不能留遗憾不是^_^。 2012年总体过得还算充实： *《七周七语言》终于出版了； * 写了近80篇Blog，虽离目标预期还有差距，但也给我带来了不小的精神愉悦； * 为《程序员》杂志写了两篇文章，虽然都是短文； * 读了30多本书，还有10多本尚未读完，不过年初制定的&#8220;扫存书&#8221;目标没能达成，因为依然不断地有大量的新书加入^_^； * 学习了一门编程语言Go（而不是年初确定的Clojure等）； * 将自己的一些关于工作方法、团队建设和管理的认知和实践总结了出来，算是一个阶段性的小结，内容包括绩效目标制定、绩效面谈、高效会议、写好Mail、个人时间管理、知识管理新认知、团队经营等诸多方面。也许后续还有补充。 2012年在工作方面的表现略显平淡。恰应了那句古语：有心栽花花不活。年初和团队成员共同确定了今年的年度主题词为&#8220;收获&#8221;，但一年下来的结果 却是差强人意：我最重视的一个关键项目没能如期发布，可谓是今年之最大憾事。我的责任自然不能脱掉，主因在于我年初过于乐观的估计。至于在其他方 面即便有较大进展，也无法弥补这一遗憾给我带来的不快。 2012年将buildc实际应用到了产品构建中，同时发现了诸多问题，也收到了许多同事的反馈。buildc也因此在持续演进，从0.1.4版本到 目前的0.2.1版本。近期正在酝酿0.3.x版本，这次改动较大，调整了很多当初的设计思路，与0.2.x版本并不兼容了。 2012年在家庭方面自我感觉收获还是颇多的。从数字上看，年初确定的年度家庭目标80%都实现了，这些目标有对父母的、有对孩子的，也有对LP 的，这让我颇为欣慰啊。最让我欣喜的是看到了女儿果果的成长，尤其是其语言能力的提升，让我们从此不必再担心了。现在面对果果这样一个已经可以与 我进行语言交流的小家伙儿，心中总是有一种莫名的感动，感谢上天赐予我这个可爱的小家伙儿 ^_^。将心比心，现在真心感觉到父母对待子女可真是没有半点私心，都是全心全力的为儿女服务，所以每个人都更应该善待父母。今年下半年，母亲得了眼 病，做了一个小手术，我也请假回家照顾。平时和父母不在一个城市生活，方方面面无法顾及，甚感惭愧，这次回家让我心灵有了些许慰藉，也让我第一次有了尽孝道的感觉。以后我每年都会设定家庭目标，但今后的家庭目标实现难度都很大，尽力而为吧^_^。 读书已然是生活中不可缺少的一部分了，但2012年似乎有些懒惰了。虽然读的书目也不少，但总感觉缺少些效率。 过去的都过去了，2012虽有小成，但觉得进步有限。身旁的人与物太过熟悉稳定，人就会变得像温水中的那只青蛙。 2013，期待能有些变化。 &#169; 2012, bigwhite. 版权所有.]]></description>
			<content:encoded><![CDATA[<p>趁着世界末日尚未到来，赶紧将2012年总结一番，即便是末日也不能留遗憾不是^_^。</p>
<p>	2012年总体过得还算充实：</p>
<p>	*《<a href="http://tonybai.com/2012/05/08/translate-seven-languages-in-seven-weeks/">七周七语言</a>》终于出版了；<br />
	* 写了近80篇Blog，虽离目标预期还有差距，但也给我带来了不小的精神愉悦；<br />
	* 为《程序员》杂志写了<a href="http://tonybai.com/2012/10/26/some-practice-on-improving-tech-preach/">两篇文章</a>，虽然都是短文；<br />
	* 读了<a href="http://book.douban.com/people/tony_bai/collect">30多本书</a>，还有<a href="http://book.douban.com/people/tony_bai/do">10多本</a>尚未读完，不过年初制定的&ldquo;扫存书&rdquo;目标没能达成，因为依然不断地有大量的新书加入^_^；<br />
	* 学习了一门编程语言<a href="http://tonybai.com/tag/Go">Go</a>（而不是年初确定的<a href="http://clojure.org">Clojure</a>等）；<br />
	* 将自己的一些关于工作方法、团队建设和管理的认知和实践总结了出来，算是一个阶段性的小结，内容包括<a href="http://tonybai.com/2012/11/17/several-important-factors-in-making-performance-goals/">绩效目标制定</a>、<a href="http://tonybai.com/2012/12/13/some-opinions-about-performance-interview/">绩效面谈</a>、<a href="http://tonybai.com/2012/12/03/how-to-organize-and-hold-meetings-efficiently/">高效会议</a>、<a href="http://tonybai.com/2012/11/28/how-to-write-a-good-email/">写好Mail</a>、<a href="http://tonybai.com/2012/11/23/some-experience-on-personal-time-management/">个人时间管理</a>、<a href="http://tonybai.com/2012/11/04/the-amateur-way-of-knowledge-management/">知识管理</a>新认知、<a href="http://tonybai.com/2012/11/01/some-experience-on-team-management/">团队经营</a>等诸多方面。也许后续还有补充。</p>
<p>	2012年在工作方面的表现略显平淡。恰应了那句古语：有心栽花花不活。年初和团队成员共同确定了今年的年度主题词为&ldquo;收获&rdquo;，但一年下来的结果 却是差强人意：我最重视的一个关键项目没能如期发布，可谓是今年之最大憾事。我的责任自然不能脱掉，主因在于我年初过于乐观的估计。至于在其他方 面即便有较大进展，也无法弥补这一遗憾给我带来的不快。</p>
<p>	2012年将<a href="http://code.google.com/p/buildc">buildc</a>实际应用到了产品构建中，同时发现了诸多问题，也收到了许多同事的反馈。buildc也因此在持续演进，从<a href="http://tonybai.com/2012/04/12/buildc-0-1-4-release/">0.1.4</a>版本到 目前的<a href="http://tonybai.com/2012/12/06/buildc-0-2-1-release/">0.2.1</a>版本。近期正在酝酿0.3.x版本，这次改动较大，调整了很多当初的设计思路，与0.2.x版本并不兼容了。</p>
<p>	2012年在家庭方面自我感觉收获还是颇多的。从数字上看，年初确定的年度家庭目标80%都实现了，这些目标有对父母的、有对孩子的，也有对LP 的，这让我颇为欣慰啊。最让我欣喜的是看到了女儿<a href="http://tonybai.com/2012/11/27/some-growing-up-details-of-my-two-years-old-daughter/">果果的成长</a>，尤其是其语言能力的提升，让我们从此不必再担心了。现在面对果果这样一个已经可以与 我进行语言交流的小家伙儿，心中总是有一种莫名的感动，感谢上天赐予我这个可爱的小家伙儿 ^_^。将心比心，现在真心感觉到父母对待子女可真是没有半点私心，都是全心全力的为儿女服务，所以每个人都更应该善待父母。今年下半年，母亲得了眼 病，做了一个小手术，我也请假回家照顾。平时和父母不在一个城市生活，方方面面无法顾及，甚感惭愧，这次回家让我心灵有了些许慰藉，也让我第一次有了尽孝道的感觉。以后我每年都会设定家庭目标，但今后的家庭目标实现难度都很大，尽力而为吧^_^。</p>
<p>	读书已然是生活中不可缺少的一部分了，但2012年似乎有些懒惰了。虽然读的书目也不少，但总感觉缺少些效率。</p>
<p>	过去的都过去了，2012虽有小成，但觉得进步有限。身旁的人与物太过熟悉稳定，人就会变得像温水中的那只青蛙。</p>
<p>2013，期待能有些变化。</p>
<p style='text-align:left'>&copy; 2012, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2012/12/18/my-summary-of-2012/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>翻译《七周七语言》的那些事儿</title>
		<link>https://tonybai.com/2012/05/08/translate-seven-languages-in-seven-weeks/</link>
		<comments>https://tonybai.com/2012/05/08/translate-seven-languages-in-seven-weeks/#comments</comments>
		<pubDate>Tue, 08 May 2012 03:09:31 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Blogger]]></category>
		<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[Haskell]]></category>
		<category><![CDATA[IO]]></category>
		<category><![CDATA[Jolt]]></category>
		<category><![CDATA[Opensource]]></category>
		<category><![CDATA[Programmer]]></category>
		<category><![CDATA[Prolog]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[translation]]></category>
		<category><![CDATA[七周七语言]]></category>
		<category><![CDATA[互动出版网]]></category>
		<category><![CDATA[亚马逊]]></category>
		<category><![CDATA[剪刀手爱德华]]></category>
		<category><![CDATA[博客]]></category>
		<category><![CDATA[图灵教育]]></category>
		<category><![CDATA[开源]]></category>
		<category><![CDATA[心得]]></category>
		<category><![CDATA[感悟]]></category>
		<category><![CDATA[星际旅行]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[翻译]]></category>
		<category><![CDATA[读书]]></category>
		<category><![CDATA[雨人]]></category>

		<guid isPermaLink="false">http://tonybai.com/?p=889</guid>
		<description><![CDATA[今天在互动出版网看到《七周七语言：理解多种编程范型》一书已经开卖了。看到自己参与翻译的第一本书出版了，心中还是很愉悦的，因为自己的辛苦付出终于有了结果。 一、缘起 能够参与到这本书的翻译完全是机缘巧合。记得2011年初我启动了一个《Programming in Haskell》的公共翻译项目，可是由于欠缺版权的考虑，中途不得不终止了该书的翻译。当时经dreamhead介绍联系到图灵的刘江总编，希望人邮能 引进版权以促成该书的翻译，但刘总编考虑到该书是有关Haskell这门&#34;小众&#34;语言的，引进后受众面小，书很可能卖不出去，商业价值不高(后得知该书作 者Graham Hutton博士已经在与某出版社谈中文版版权的事宜了，并已经委托其一位同事进行中文版的翻译工作了)。不过刘总编说图灵当时已经引进了《Seven Languages in Seven Weeks》一书的中文版权，但第一译者戴玮因工作学习繁忙，可能无法按期完成全部翻译，问我是否愿意参与翻译。我的最初目标就是翻译一本英文技术书籍， 有这样的机会，而且书还可以在国内出版，于是我就欣然接下了这个翻译工作。 二、翻译过程 经过试译审核，顺利与图灵签订了翻译合同，我将负责翻译该书的Prolog、Scala和Haskell三个章节。正式翻译是在2011年春节后开始的， 为了能在合同规定的第一个时间点交稿，我连续N天翻译到凌晨下半夜，工作日中午午休时间也在抓紧时间翻译，周末也不放松。因为是第一次翻译，生怕自己翻译 的不好，于是对原书中的每句话都字斟句酌，仔细揣摩。另外虽说此书是一本技术书籍，但作者给每门编程语言都赋予了一部电影中的典型人物角色，并用电影中的 情节或人物角色的特征作为章节的导引，这使得每章的开篇十分难于翻译，特别是当我不熟悉语言所对应的那部影片中的那个角色时，翻译更是举步维艰。为此，我 特意看了一遍&#34;雨人(Rain Man)&#34;和&#34;星际旅行(Star Trek)&#34;，重温了&#34;剪刀手爱德华(Edward Scissorhands)&#34;，为的就是能够更精确地定位本书作者所要表达的意思。Scala一章的第一稿提交后，我收到了图灵编辑不错的反馈。于是再接 再励，在2011年4月末交了全部初稿，5月中旬完成了中耕校对；2012年3月份完成排后稿的校对。 三、关于翻译方法和心得 这是我第一次参与翻译项目，说实在的真没有资格谈什么翻译方法，我也不是什么专业翻译人员。但在这本书的翻译过程中还是有若干经验和教训可以与大家分享的。 * 心态 我认识的参与过技术书籍翻译的朋友都说：翻译不是为了赚钱(那些以翻译为谋生手段的职业翻译除外)，这点我深表认同。翻译工作是一件枯燥、辛苦甚至是费力 不讨好(出版后可能被拍砖)的工作。因此翻译前就要摆正心态，弄清楚自己为何要翻译，有了良好心态，才会有持续不断的动力，否则译着译着人就容易产生懈 怠，进度和质量都会下降，你需要这样一种战胜懈怠并持续下去的手段。 * 你是翻译质量的决定者 不要过于期望诸多编辑朋友会拿出百分百的时间对你的翻译内容进行校对，出版社的编辑们太忙了，一个人估计要至少负责10本以上书籍的出版工作，因此你才是翻译质量的决定者，从开始翻译的那一刻你就要保持高质量水准。 * 第一遍就要保持高质量，不要期待你能回头做二次翻译 第一遍翻译时，务必保证按顺序逐字逐句的高质量的翻译，一次到位；遇到难点也不要跳过，而是要集中精神搞定这个难点；否则你就会发现你积蓄的难点越来越 多，严重影响你后续翻译的情绪和心理。不要有回头做全面二次翻译的想法，因为你会发现那基本不可行，二次翻译时你会发现你的思路严重受制于第一次翻译的思 路，因此不仅不会提高什么质量，还会使你变得更加烦躁，严重影响翻译进度。 * 前后一致 保持前后章节的术语、句型等翻译的一致性。这点在翻译和校对时都要重点关注。 * 除了认真还是认真 不是所有人都是翻译天才，大部分译者，特别是技术书籍的译者，可能只是那个领域的从业人员(比如我)，在翻译能力上存在不足。但万事就怕认真，认真可以尽量袮补在能力上不足，也是出品高质量译文的必要条件。 四、关于《七周七语言》一书 从本书的中文名字，你也许会将其与&#34;21天学会C语言&#34;之类的捷径书籍混为一谈，但本书的初衷与那些捷径书籍显然不同。本书意在让你在短时间内了解到多种 编程语言的范式和主要特性，并做简单的对比了解。书的作者也许并不期望你在看完某种语言后就彻底学会了这门语言，那显然不是本书的意图。如今也许是另一个 编程语言百家争鸣的时代，新的语言层出不穷，作者试图帮助大家在如此繁多的语言当中找到一些适合你投资、学习和使用的有前途的编程语言。 书的最终版本我也没有拿到，我也只是看了我所翻译的那三章，因此书的内容好坏我也不能妄加评论。这里是Amazon.com上关于此书的一些书评(中文翻译版)，另外从本书获得了2011年Jolt大奖可以看出本书还是被业内专家一致看好的。 个人感觉出版的有些晚了，如果能与Jolt大奖的公布同步推出也许效果会更好。书的最终纸质版本我也没有拿到，尚不知书的印刷质量如何，另外翻译的质量如何还得需要大家评判。 最后十分感谢翻译过程刘江、杨海玲 、傅志红、李松峰、丁晓昀等各位老师对我的帮助。 &#169; 2012, bigwhite. [...]]]></description>
			<content:encoded><![CDATA[<p>今天在<a href="http://www.china-pub.com/">互动出版网</a>看到《<a href="http://product.china-pub.com/199312">七周七语言：理解多种编程范型</a>》一书已经开卖了。看到自己参与翻译的第一本书出版了，心中还是很愉悦的，因为自己的辛苦付出终于有了结果。</p>
<p>	<strong>一、缘起</strong></p>
<p>	能够参与到这本书的翻译完全是机缘巧合。记得2011年初我启动了一个《<a href="http://code.google.com/p/programming-in-haskell-cn/">Programming in Haskell</a>》的<a href="http://tonybai.com/2010/11/14/the-chinese-translation-project-for-programming-in-haskell/">公共翻译项目</a>，可是由于欠缺版权的考虑，中途不得不终止了该书的翻译。当时经<a href="http://dreamhead.blogbus.com">dreamhead</a>介绍联系到<a href="http://www.ituring.com.cn/">图灵</a>的<a href="http://weibo.com/turingbook">刘江</a>总编，希望人邮能 引进版权以促成该书的翻译，但刘总编考虑到该书是有关<a href="http://haskell.org/">Haskell</a>这门&quot;小众&quot;语言的，引进后受众面小，书很可能卖不出去，商业价值不高(后得知该书作 者Graham Hutton博士已经在与某出版社谈中文版版权的事宜了，并已经委托其一位同事进行中文版的翻译工作了)。不过刘总编说图灵当时已经引进了《<a href="http://pragprog.com/book/btlang/seven-languages-in-seven-weeks">Seven Languages in Seven Weeks</a>》一书的中文版权，但第一译者<a href="http://www.douban.com/people/loveisp">戴玮</a>因工作学习繁忙，可能无法按期完成全部翻译，问我是否愿意参与翻译。我的最初目标就是翻译一本英文技术书籍， 有这样的机会，而且书还可以在国内出版，于是我就欣然接下了这个翻译工作。</p>
<p>	<strong>二、翻译过程</strong></p>
<p>	经过试译审核，顺利与图灵签订了翻译合同，我将负责翻译该书的<a href="http://en.wikipedia.org/wiki/Prolog">Prolog</a>、<a href="http://www.scala-lang.org">Scala</a>和<a href="http://en.wikipedia.org/wiki/Haskell_(programming_language)">Haskell</a>三个章节。正式翻译是在2011年春节后开始的， 为了能在合同规定的第一个时间点交稿，我连续N天翻译到凌晨下半夜，工作日中午午休时间也在抓紧时间翻译，周末也不放松。因为是第一次翻译，生怕自己翻译 的不好，于是对原书中的每句话都字斟句酌，仔细揣摩。另外虽说此书是一本技术书籍，但作者给每门编程语言都赋予了一部电影中的典型人物角色，并用电影中的 情节或人物角色的特征作为章节的导引，这使得每章的开篇十分难于翻译，特别是当我不熟悉语言所对应的那部影片中的那个角色时，翻译更是举步维艰。为此，我 特意看了一遍&quot;雨人(<a href="http://en.wikipedia.org/wiki/Rain_Man">Rain Man</a>)&quot;和&quot;星际旅行(<a href="http://www.startrek.com/">Star Trek</a>)&quot;，重温了&quot;剪刀手爱德华(<a href="http://en.wikipedia.org/wiki/Edward_Scissorhands">Edward Scissorhands</a>)&quot;，为的就是能够更精确地定位本书作者所要表达的意思。Scala一章的第一稿提交后，我收到了图灵编辑不错的反馈。于是再接 再励，在2011年4月末交了全部初稿，5月中旬完成了中耕校对；2012年3月份完成排后稿的校对。</p>
<p>	<strong>三、关于翻译方法和心得</strong></p>
<p>	这是我第一次参与翻译项目，说实在的真没有资格谈什么翻译方法，我也不是什么专业翻译人员。但在这本书的翻译过程中还是有若干经验和教训可以与大家分享的。</p>
<p>	* 心态</p>
<p>	我认识的参与过技术书籍翻译的朋友都说：翻译不是为了赚钱(那些以翻译为谋生手段的职业翻译除外)，这点我深表认同。翻译工作是一件枯燥、辛苦甚至是费力 不讨好(出版后可能被拍砖)的工作。因此翻译前就要摆正心态，弄清楚自己为何要翻译，有了良好心态，才会有持续不断的动力，否则译着译着人就容易产生懈 怠，进度和质量都会下降，你需要这样一种战胜懈怠并持续下去的手段。</p>
<p>	* 你是翻译质量的决定者</p>
<p>	不要过于期望诸多编辑朋友会拿出百分百的时间对你的翻译内容进行校对，出版社的编辑们太忙了，一个人估计要至少负责10本以上书籍的出版工作，因此你才是翻译质量的决定者，从开始翻译的那一刻你就要保持高质量水准。</p>
<p>	* 第一遍就要保持高质量，不要期待你能回头做二次翻译</p>
<p>	第一遍翻译时，务必保证按顺序逐字逐句的高质量的翻译，一次到位；遇到难点也不要跳过，而是要集中精神搞定这个难点；否则你就会发现你积蓄的难点越来越 多，严重影响你后续翻译的情绪和心理。不要有回头做全面二次翻译的想法，因为你会发现那基本不可行，二次翻译时你会发现你的思路严重受制于第一次翻译的思 路，因此不仅不会提高什么质量，还会使你变得更加烦躁，严重影响翻译进度。</p>
<p>	* 前后一致</p>
<p>	保持前后章节的术语、句型等翻译的一致性。这点在翻译和校对时都要重点关注。</p>
<p>	* 除了认真还是认真</p>
<p>	不是所有人都是翻译天才，大部分译者，特别是技术书籍的译者，可能只是那个领域的从业人员(比如我)，在翻译能力上存在不足。但万事就怕认真，认真可以尽量袮补在能力上不足，也是出品高质量译文的必要条件。</p>
<p>	<strong>四、关于《七周七语言》一书</strong></p>
<p>	从本书的中文名字，你也许会将其与&quot;21天学会C语言&quot;之类的捷径书籍混为一谈，但本书的初衷与那些捷径书籍显然不同。本书意在让你在短时间内了解到多种 编程语言的范式和主要特性，并做简单的对比了解。书的作者也许并不期望你在看完某种语言后就彻底学会了这门语言，那显然不是本书的意图。如今也许是另一个 编程语言百家争鸣的时代，新的语言层出不穷，作者试图帮助大家在如此繁多的语言当中找到一些适合你投资、学习和使用的有前途的编程语言。</p>
<p>	书的最终版本我也没有拿到，我也只是看了我所翻译的那三章，因此书的内容好坏我也不能妄加评论。这里是Amazon.com上关于此书的一些书评(<a href="http://www.ituring.com.cn/article/details/1260">中文翻译版</a>)，另外从本书获得了2011年Jolt大奖可以看出本书还是被业内专家一致看好的。</p>
<p>	个人感觉出版的有些晚了，如果能与Jolt大奖的公布同步推出也许效果会更好。书的最终纸质版本我也没有拿到，尚不知书的印刷质量如何，另外翻译的质量如何还得需要大家评判。</p>
<p>	最后十分感谢翻译过程刘江、<a href="http://weibo.com/turingbookyanggu">杨海玲</a> 、傅志红、李松峰、丁晓昀等各位老师对我的帮助。</p>
<p style='text-align:left'>&copy; 2012, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2012/05/08/translate-seven-languages-in-seven-weeks/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>也谈技术布道 &#8211; 影响因素及有效实践</title>
		<link>https://tonybai.com/2012/04/24/influencing-factors-and-effective-practice-about-driving-technical-changes/</link>
		<comments>https://tonybai.com/2012/04/24/influencing-factors-and-effective-practice-about-driving-technical-changes/#comments</comments>
		<pubDate>Tue, 24 Apr 2012 06:34:55 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[思考控]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Blogger]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[Programmer]]></category>
		<category><![CDATA[博客]]></category>
		<category><![CDATA[图灵教育]]></category>
		<category><![CDATA[布道之道]]></category>
		<category><![CDATA[思考]]></category>
		<category><![CDATA[感悟]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[持续集成]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[程序员]]></category>
		<category><![CDATA[职场]]></category>
		<category><![CDATA[设计模式]]></category>
		<category><![CDATA[读书]]></category>

		<guid isPermaLink="false">http://tonybai.com/?p=886</guid>
		<description><![CDATA[昨天中午收到图灵出版的《布道之道 &#8211; 引领团队拥抱技术创新》一书，晚上就迫不及待地翻看开来。这是我读过的第一本有关推动组织内部技术变更/创新实践方面的书，感觉书作者对受众的分类很是准 确到位，很多布道技巧也十分值得借鉴。但就我个人多年来的体验来看，组织内部技术布道的结果，不仅仅与受众的类型有关，还与布道者自身的资历、所担任的角 色、组织内部的文化和环境、布道路线以及布道时机和对象的选择有一定关系。下面就是我在这方面的一些粗略心得。 一、技术布道结果的影响因素 我个人也算是组织内部的一个技术布道者，经过多年的碰壁和反思，感觉技术布道的结果好坏与下面的一些因素或多或少有些联系。 * 布道者的资历 无论国内国外(国内可能尤甚)，职场资历这个因素在任何职场活动中都会是一个影响因素，技术布道也不例外。如果你是一个职场新人，也许工作年头不超过一两 年，甚至是刚刚进入职场，你势必人微言轻，并尚未在组织内建立起信任，更重要的是你可能并未深入理解大家面对某种新技术或新实践时遇到的真正困惑以及问题 是什么，这时如果你在组织内尝试大力推动某种技术或实践，效果可能不甚良好：你会发现关心你的提议的受众会很少(除非之前就赢得了上层领导的支持)，你会 受到大家对你的资历的质疑：&#34;你才刚来，这东西你自己用过吗？你怎么就知道这东西会对组织带来价值？你讲的这些我都知道，但我们遇到的问题你并没有真正解 决&#34;。记得2007年一位刚刚入司不到半年的新同事(我们得承认这位同事很有技术潜质，也很有技术热情)就在项目组内部大力推广设计模式，并多次在项目组 内部以技术沙龙的方式分享设计模式相关的知识，但效果并不好，以至于若干个月后，这位同事离职后，大家依旧如故的行事，设计模式也并未真正被用到产品代码 设计中。 相比之下，一些组织内资深的布道者反倒更容易推动组织内的技术变革。 * 布道者的角色 一般来说，技术布道的发起者多为组织内的纯技术人员或技术管理者，但也不能排除非技术人员(如：过程改善人员或高层管理者)发起技术或优秀实践的布道。纯 技术人员或技术管理者因其技术背景并深处其中，布道过程中其同理心更强，布道思路更符合大家的胃口，但效果因人因地而异；而过程改善人员或管理人员多半采 用是行政命令的灌输式的方法，强行推进技术或过程改革，这样做常常会遇到抵触或反对意见，短期内可能有效果，但长期结果却往往不佳(当然也有例外)。 * 组织文化的开放度 如果你所在的组织内的成员都抱有一个Open的心态，那恭喜你，你真是太幸运了。你的布道实践一定是相对顺利的。但实际情况中，大多数组织的文化可能没有 想象中的那么Open，大家对变化的第一反应就是&#34;抵触和反感&#34;&#8211; 好好的，为什么要变？你也可以说这是人的天性 &#8211; 习于安乐。显然在这种文化下进行布道，阻力将会较大，布道者需要做足准备，方可开始实施，即使如此也未必能取得很好的效果。 * 布道路线的选择 布道的路线无非两种：自上而下和自下而上。普通技术人员(包括一部分技术管理者)，多是自下而上，通过布道，说服项目组成员以及管理层使用新技术/新实 践。爬坡总是困难重重的，要想取得良好效果，需更多努力；技术管理者或其他管理人员可能采用自上而下的方式，告诉大家我们应该更换技术，采用新优秀实践， 多半相对顺利。如果你的技术的确解决了大家的问题，让大家平时的工作更&#34;舒服&#34;，自然就更受欢迎，推行起来也就水到渠成。 * 布道时机和对象的把握 变化是需要用成本买单的，既有人力成本，时间成本，甚至包括机会成本。如果你非要向一个下周就要发布的项目组推广JUnit，非要向一个工期仅有三个月且 交付后无需维护的产品线推广持续集成/交付，那你肯定是自找苦吃。这些例子都说明了一点：把握好布道的时机和对象。人家都忙得脚打后脑壳了，你还给人加添 乱，显然时机掌握错了；你推广的东西除了增加成本并未带来任何好处，显然对象选择错了。正如《布道之道》一书中提到的那样：你推广的成果(技术或工具)应 该可以让受众至少感觉到如下价值之一才行：提高了效率；降低了风险；增进了理解。否则你就找错了推广对象。 二、技术布道的有效实践 弄清楚上面的影响因素后，我们就可以谈谈一些利于收获良好结果的技术布道的有效实践了。 * 从问题出发，选择要布道的技术/工具 前面说过，你布道的成果(技术/工具/优秀实践)是需要给大家带来价值的，这其中主要的方面就是为了解决大家目前所面临的问题，比如开发效率不高、系统部 署繁琐、人工回归测试工作量巨大等等。因此只有当你觉察到这些问题，并对这些问题深入理解后，再去选择你要布道的技术/工具/最佳实践；否则如果只是为了 引入新技术而引入新技术的话，那么引入的技术和工具就好比无源之水、无本之木，没有长久的生命力。 * 选择合适的受众与时机 布道所推广的技术和工具多不具有普适性，它在一定受众范围内是有生命力的。因此在谋划布道之前就要考虑好对象。甚至可以在布道之前先深入到选定的受众当 中，对受众以及他们所遇到的问题进行相关的调查和分析，这样做才能事半功倍，布道的结果才可能更佳；另外在确定受众后，就是选择布道时机的问题了，时机的 选择因情况而异。但无论如何也不能犯上面提到的那些错误，否则你的努力将付之东流。 * 以点及面，划分阶段 受众面越大，布道的结果可能越不易理想。因此，最好先在小范围内布道并给予持续支持，直到该技术/工具/实践在小范围内变得不可取代并看到了成果，再向更 [...]]]></description>
			<content:encoded><![CDATA[<p>昨天中午收到<a href="http://www.ituring.com.cn/">图灵</a>出版的《<a href="http://book.douban.com/subject/6990284/">布道之道 &#8211; 引领团队拥抱技术创新</a>》一书，晚上就迫不及待地翻看开来。这是我读过的第一本有关推动组织内部技术变更/创新实践方面的书，感觉书作者对受众的分类很是准 确到位，很多布道技巧也十分值得借鉴。但就我个人多年来的体验来看，组织内部技术布道的结果，不仅仅与受众的类型有关，还与布道者自身的资历、所担任的角 色、组织内部的文化和环境、布道路线以及布道时机和对象的选择有一定关系。下面就是我在这方面的一些粗略心得。</p>
<p>一、技术布道结果的影响因素</p>
<p>我个人也算是组织内部的一个技术布道者，经过多年的碰壁和反思，感觉技术布道的结果好坏与下面的一些因素或多或少有些联系。</p>
<p><strong>* 布道者的资历</strong></p>
<p>无论国内国外(国内可能尤甚)，职场资历这个因素在任何职场活动中都会是一个影响因素，技术布道也不例外。如果你是一个职场新人，也许工作年头不超过一两 年，甚至是刚刚进入职场，你势必人微言轻，并尚未在组织内建立起信任，更重要的是你可能并未深入理解大家面对某种新技术或新实践时遇到的真正困惑以及问题 是什么，这时如果你在组织内尝试大力推动某种技术或实践，效果可能不甚良好：你会发现关心你的提议的受众会很少(除非之前就赢得了上层领导的支持)，你会 受到大家对你的资历的质疑：&quot;你才刚来，这东西你自己用过吗？你怎么就知道这东西会对组织带来价值？你讲的这些我都知道，但我们遇到的问题你并没有真正解 决&quot;。记得2007年一位刚刚入司不到半年的新同事(我们得承认这位同事很有技术潜质，也很有技术热情)就在项目组内部大力推广<a href="http://tonybai.com/tag/设计模式">设计模式</a>，并多次在项目组 内部以技术沙龙的方式分享设计模式相关的知识，但效果并不好，以至于若干个月后，这位同事离职后，大家依旧如故的行事，设计模式也并未真正被用到产品代码 设计中。</p>
<p>相比之下，一些组织内资深的布道者反倒更容易推动组织内的技术变革。</p>
<p><strong>* 布道者的角色</strong></p>
<p>一般来说，技术布道的发起者多为组织内的纯技术人员或技术管理者，但也不能排除非技术人员(如：过程改善人员或高层管理者)发起技术或优秀实践的布道。纯 技术人员或技术管理者因其技术背景并深处其中，布道过程中其同理心更强，布道思路更符合大家的胃口，但效果因人因地而异；而过程改善人员或管理人员多半采 用是行政命令的灌输式的方法，强行推进技术或过程改革，这样做常常会遇到抵触或反对意见，短期内可能有效果，但长期结果却往往不佳(当然也有例外)。</p>
<p><strong>* 组织文化的开放度</strong></p>
<p>如果你所在的组织内的成员都抱有一个Open的心态，那恭喜你，你真是太幸运了。你的布道实践一定是相对顺利的。但实际情况中，大多数组织的文化可能没有 想象中的那么Open，大家对变化的第一反应就是&quot;抵触和反感&quot;&#8211; 好好的，为什么要变？你也可以说这是人的天性 &#8211; 习于安乐。显然在这种文化下进行布道，阻力将会较大，布道者需要做足准备，方可开始实施，即使如此也未必能取得很好的效果。</p>
<p><strong>* 布道路线的选择</strong></p>
<p>布道的路线无非两种：自上而下和自下而上。普通技术人员(包括一部分技术管理者)，多是自下而上，通过布道，说服项目组成员以及管理层使用新技术/新实 践。爬坡总是困难重重的，要想取得良好效果，需更多努力；技术管理者或其他管理人员可能采用自上而下的方式，告诉大家我们应该更换技术，采用新优秀实践， 多半相对顺利。如果你的技术的确解决了大家的问题，让大家平时的工作更&quot;舒服&quot;，自然就更受欢迎，推行起来也就水到渠成。</p>
<p><strong>* 布道时机和对象的把握</strong></p>
<p>变化是需要用成本买单的，既有人力成本，时间成本，甚至包括机会成本。如果你非要向一个下周就要发布的项目组推广<a href="http://junit.org">JUnit</a>，非要向一个工期仅有三个月且 交付后无需维护的产品线推广<a href="http://tonybai.com/2012/02/14/install-and-configure-jenkins/">持续集成</a>/交付，那你肯定是自找苦吃。这些例子都说明了一点：把握好布道的时机和对象。人家都忙得脚打后脑壳了，你还给人加添 乱，显然时机掌握错了；你推广的东西除了增加成本并未带来任何好处，显然对象选择错了。正如《<a href="http://www.amazon.com/Driving-Technical-Change-Terrence-Ryan/dp/1934356603">布道之道</a>》一书中提到的那样：你推广的成果(技术或工具)应 该可以让受众至少感觉到如下价值之一才行：提高了效率；降低了风险；增进了理解。否则你就找错了推广对象。</p>
<p>二、技术布道的有效实践</p>
<p>弄清楚上面的影响因素后，我们就可以谈谈一些利于收获良好结果的技术布道的有效实践了。</p>
<p><strong>* 从问题出发，选择要布道的技术/工具</strong></p>
<p>前面说过，你布道的成果(技术/工具/优秀实践)是需要给大家带来价值的，这其中主要的方面就是为了解决大家目前所面临的问题，比如开发效率不高、系统部 署繁琐、人工回归测试工作量巨大等等。因此只有当你觉察到这些问题，并对这些问题深入理解后，再去选择你要布道的技术/工具/最佳实践；否则如果只是为了 引入新技术而引入新技术的话，那么引入的技术和工具就好比无源之水、无本之木，没有长久的生命力。</p>
<p><strong>* 选择合适的受众与时机</strong></p>
<p>布道所推广的技术和工具多不具有普适性，它在一定受众范围内是有生命力的。因此在谋划布道之前就要考虑好对象。甚至可以在布道之前先深入到选定的受众当 中，对受众以及他们所遇到的问题进行相关的调查和分析，这样做才能事半功倍，布道的结果才可能更佳；另外在确定受众后，就是选择布道时机的问题了，时机的 选择因情况而异。但无论如何也不能犯上面提到的那些错误，否则你的努力将付之东流。</p>
<p><strong>* 以点及面，划分阶段</strong></p>
<p>受众面越大，布道的结果可能越不易理想。因此，最好先在小范围内布道并给予持续支持，直到该技术/工具/实践在小范围内变得不可取代并看到了成果，再向更 大的受众范围推广，此时之前那些已经尝到甜头的受众将会成为你下一阶段布道的强力助手。另外阶段性的布道还有助于你进行自我挑整，修正之前的不足，找到更 为合理的策略和方法。</p>
<p><strong>* 利用局部布道成功结果的影响力说服更广范围的受众</strong></p>
<p>人们都信奉&quot;眼见为实&quot;，因此将前期小范围布道的成功结果会让更广范围的受众相信你推广的技术/工具/实践将会给自己带来价值。这要比你口若悬河般的说教好上百倍。特别是在说服管理者时，这尤为有用，甚至决定成败的那个最重要的因素。</p>
<p><strong>* 建立信心和耐心，潜移默化中布道，甚至先斩后奏</strong></p>
<p>对于一些之前布道失败(无论是否是你推广的，包括那些被管理者否定的)的技术/工具/实践，只要你认定(在对问题的深入理解的前提下作出的判断)它会带来 价值，那就不要放弃，要有些耐心。并运用上面那条实践，先在局部尝试，影响小范围受众；收到显著成果后，再扩大受众面，用现有的成果说服他人，或甚至直到 当管理者问及你是如何取得这个成果时，你再告诉他：是因为我用了XX技术/工具/实践。</p>
<p><strong>* 降低目标预期</strong></p>
<p>最后这点算不上什么有效实践。对于布道者而言，如果要想保持一个持续向前的心态，保持持续关注前沿技术的动力，降低布道结果对你的负面打击，那就在布道之前降低你的目标预期吧。</p>
<p>最后切忌犯一个错误，那就是：只懂皮毛，就去布道推广(多数都并非出于解决问题之目的)。这样做的结果只能是失败，并很可能让大家失去对你的信任。这个错误自己犯过，见过职场新人犯过，也见过牛人犯过。</p>
<p style='text-align:left'>&copy; 2012, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2012/04/24/influencing-factors-and-effective-practice-about-driving-technical-changes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2011·读过的书</title>
		<link>https://tonybai.com/2011/12/22/book-list-i-have-read-in-2011/</link>
		<comments>https://tonybai.com/2011/12/22/book-list-i-have-read-in-2011/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 13:46:00 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[读书吧]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Blogger]]></category>
		<category><![CDATA[博客]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[家庭]]></category>
		<category><![CDATA[工作]]></category>
		<category><![CDATA[年终总结]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[读书]]></category>
		<category><![CDATA[豆瓣]]></category>

		<guid isPermaLink="false">http://tonybai.com/2011/12/22/2011%c2%b7%e8%af%bb%e8%bf%87%e7%9a%84%e4%b9%a6/</guid>
		<description><![CDATA[<p>2011年我的确读了不少书，掐指算来纸版和电子版加在一起近50本，其中以技术类居多，但其他方面的也有一些。这里列出来做个简单回顾。<br />
<br />
一、技术类<br />
<br />
&#183; 《你必须知道的495个C语言问题》<br />
<br />
早在这本书出版前，其译者已经在网上完成了C FAQs的翻译(在这里)。这本书...</p>]]></description>
			<content:encoded><![CDATA[<p>2011年我的确读了不少书，掐指算来纸版和电子版加在一起近50本，其中以技术类居多，但其他方面的也有一些。这里列出来做个简单回顾。</p>
<p>一、技术类<br />
	&middot; 《<a href="http://book.douban.com/subject/3422332/" target="_blank">你必须知道的495个C语言问题</a>》<br />
	早在这本书出版前，其译者已经在网上完成了C FAQs的翻译(在<a href="http://c-faq-chn.sourceforge.net" target="_blank">这里</a>)。这本书是基于最新C FAQs做了重新整理(包含<a href="http://tonybai.com/2011/08/31/simplify-coding-in-c99/" target="_blank">C99</a>)。虽说是最新，但因C语言近几年来变化很小，内容与之前译者在网上公开的那个免费版本相差不多。这本书适应面很广，初学者可以从中了解到很多谭氏教程中没有的东西；有经验的C程序员可以把它当成一本手册，需要时翻看。对于那些很在乎C语言细节的程序员来说，翻看一遍也未尝不可。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/3420775" target="_blank">The New C Standard &#8211; An Economic and Cultural Commentary</a>》<br />
	这本书的作者真是牛X的一塌糊涂。整本书居然是对C99规范的逐句解释，而且写成了一部1600多页的大砖头。这本书应该未正式出版，我看的是作者在网上放出的<a href="http://www.knosof.co.uk/cbook/cbook.html" target="_blank">免费电子版</a>。如果你痴迷于C语言规范的细节，这本书是一本不可多得的辅助资料。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/4136222/" target="_blank">C和C++安全编码</a>》<br />
	<a href="http://www.cert.org/secure-coding/" target="_blank">Cert</a> C/C++安全编码经验的浓缩版，读一遍的确可以提高一些编码过程中的安全意识。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/1456903/" target="_blank">Practical Common Lisp</a>》<br />
	Peter Seibel编写的一本荣获Jolt大奖的<a href="http://tonybai.com/2011/06/21/hello-common-lisp/" target="_blank">Common Lisp</a>入门书。你在这里可以看到这本书的<a href="http://www.gigamonkeys.com/book/" target="_blank">免费电子版</a>，其中文版名为《<a href="http://book.douban.com/subject/6859720/" target="_blank">实用Common Lisp编程</a>》，现在在我的书架上也躺着一本，我还没抽出时间来看。如果你是Common Lisp初学者，这本书是不二的首选。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/1456906" target="_blank">ANSI Common Lisp</a>》<br />
	Lisp语言的著名吹鼓手Paul Graham的大作，成书于Common Lisp标准化之际，是一本不错的Common Lisp入门的辅助资料。个人认为将《Practical Common Lisp》与此书结合在一起来学习，会加深你对Common Lisp的理解。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/1794389" target="_blank">Haskell &#8211; The Craft of Funcitonal Programming 2nd</a>》<br />
	这是一本比《<a href="http://tonybai.com/2010/11/14/the-chinese-translation-project-for-programming-in-haskell/" target="_blank">Programming in Haskell</a>》更适合作为函数式编程语言入门的书。书中第一章对函数式编程基本概念的讲解很是到位，并且这本书已经被译成了中文，书名为《Haskell函数程序设计艺术》，在网上可以免费下载到。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/4768035" target="_blank">Seven Languages in Seven Weeks</a>》<br />
	估计大家都见过《21天学会X语言》这样的编程语言教程。21天学会某种编程语言已经有些差强人意了，但这本书更狠 &#8211; 书名的直译是&quot;七周学会七门语言&quot;，但显然本书的目标不是这样的。作者的原意是希望读者通过阅读本书了解更多的新兴编程语言以及编程范式，改变编程思维，另外通过本书的阅读可以初步掌握各种语言，并且对语言的掌握程度不仅仅是&quot;Hello World&quot;这一层次。今年年初与其他人合译了此书，也是在那时将这本书通读了一遍。我负责翻译Prolog、Scala和Haskell三个章节。在书中作者将每一门语言比作成一个电影中的人物，使得内容更加生动形象(但翻译起来就没那么容易了^_^)。特别值得一提的是：该书还荣获了今年的Jolt大奖，由此可见业界对该书的认可。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/5401851/" target="_blank">Python参考手册(第四版)</a>》<br />
	像Python这样的动态编程语言，一直以极高的开发效率著称，这也是我今年学习和使用Python的一个原因，Python强大的标准库可以帮我快速实现一些想法(<a href="http://tonybai.com/2011/12/08/buildc-a-building-assistant-tool-for-c-app/" target="_blank">buildc</a>就是用Python编写的)。《Python参考手册》这本书并不适合作语言入门之用，里面对语言细节的讲解很少，其内容更多适用于工程参考，包括库函数使用、打包、发布等，这正是当时我所需要的。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/2580604/" target="_blank">持续集成</a>》和《<a href="http://book.douban.com/subject/6862062" target="_blank">持续交付</a>》<br />
	持续集成已经是存在已久的一个最佳实践了。《持续集成》一书对这方面内容做了极其系统的讲解；持续交付将持续集成的概念做了进一步延伸，将软件开发的前段（设计、编码、单元测试）与后段（功能测试、压力测试、发布、部署、验收测试）衔接在一起，形成了一个整体，并通过自动化手段实现了这一概念。在我看来《持续交付》一书更像是一本cookbook，作者将自己实施持续交付过程中采用的方案以及遇到的问题都详实地记录在书中，分享给大家。这本书获得了今年的Jolt技术图书类最高奖，很是值得一读。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/5333562/" target="_blank">深入理解计算机系统 2nd</a>》<br />
	本书的第一版是在大学毕业后不久读的，当时真有一种相见恨晚的感觉，读完后战斗力陡增。若干年后第二版的中文版终于出炉了，我又迫不及待地买下，并通读了一遍。这本书究竟咋样，从我豆瓣上给的评语可以看出：&quot;如果只允许我为程序员们推荐一本书，那么我会毫不犹豫的将这本csapp推荐给大家。太经典了！&quot;</p>
<p>&middot; 《<a href="http://book.douban.com/subject/4251048" target="_blank">Binary Hacks</a>》和《<a href="http://book.douban.com/subject/6799412" target="_blank">Debug Hacks</a>》<br />
	讨厌日本人，但有些时候你的确还得向日本人学习，这两本书都是由日本程序员执笔的，而且内容都是有关系统编程以及OS内核编程和调试的，内容比较深，需要你静下心来细心体会，国内程序员往往比较浮躁，愿意做底层技术的很少，坚持下来的就更少了，这方面日本程序员却是我们的典范。有关系统级编程和调试经验和技巧的资料在市面上比较少了，这也凸显了这两本书的价值。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/6727874/" target="_blank">A Bug Hunter&#039;s Diary</a>》<br />
	这本书只是粗略的浏览了一些，书里的案例实在看不下去，总觉的Debug这事儿只有自己亲手去做才能有所得，就像看《盗墓笔记》一样，看完后你依旧不会倒斗，只有亲自倒一次斗才能学到真本事。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/3907181" target="_blank">Linux系统编程</a>》<br />
	知名Linux内核维护者Robert Love的作品，结合底层原理的机制讲解是本书一大特色，但总体比较平淡，有些地方更像是函数使用手册，建议有经验的程序员快速浏览一遍即可。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/3042029/" target="_blank">Linux系统管理技术手册</a>》<br />
	简直就是一本Linux系统管理的大百科全书，内容涵盖各种主流Linux发行版，如RHEL、Debian、OpenSuse、Ubuntu等，极其适合放在抽屉里随时翻阅，我就是这么做的。</p>
<p>&middot; 《Pragmatic Guide to Git》和《<a href="http://progit.org/" target="_blank">Pro Git</a>》<br />
	前者适合Git入门，后者适合Git进阶。一个版本控制工具，没有什么好说的。对于Git学习的建议是：要领悟Git背后的思想，另外不要将Git命令的含义与svn等传统版本控制工具的命令混淆，Git命令需全新认知。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/6713152/" target="_blank">软件研发之道</a>》<br />
	典型的&quot;新瓶装老酒&quot;，该书早在N年前就出过一中译版，名为《<a href="http://book.douban.com/subject/1068779/" target="_blank">微软团队 &#8211; 成功秘诀</a>》。如果你看过后者，你大可不必购买此书。不过如果你没看过这本书，那么还是建议看看，虽说书中讲的是微软当年Visual C++团队的事情，但读后你会发现其中的思想至今仍极具价值。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/1271597/" target="_blank">编程之道</a>》<br />
	这是一本奇书，一本悬在空中的书，全书通读完后，你可能依然不知作者所云，但你的内心却已被作者的思想洗礼。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/3210669" target="_blank">编程匠艺</a>》<br />
	如果你认为《代码大全2nd》是好书，那么你也会喜欢这本书，它们是一类的。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/2334288" target="_blank">大话设计模式</a>》<br />
	这类书的目标都是意图将晦涩难懂的《<a href="http://book.douban.com/subject/1052241/" target="_blank">Design Pattern</a>》一书通俗化。但一般看这类书的时候，身旁还要放上一本《Design Pattern》，随时翻阅查证。今年在考量用<a href="http://tonybai.com/tag/设计模式" target="_blank">C实现Pattern</a>时顺便读完了这本书，总体来说算是国内讲解DP比较优秀的一本了。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/1230559/" target="_blank">企业应用架构模式</a>》<br />
	Martin Fowler在2003年的作品，也是当年Jolt效率大奖获得者。当时也是企业应用架构蓬勃发展的时期 &#8211; J2EE大行其道，轻量级框架方兴未艾。作者将当时进行企业应用架构设计一些经验模式进行了详尽的总结并写成此书。在企业应用设计方面，我了解甚少，这也是今年阅读此书的一个主要原因。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/3319935/" target="_blank">走出软件作坊</a>》<br />
	为数不多的国内IT企业技术管理者的经验之谈，很多人在书中会找到自己的影子。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/6021440" target="_blank">黑客与画家</a>》<br />
	Paul Graham的又一部大作，与之前的那本不同，这本更像是Paul的散文集，看完后是否能受益，全看你的悟性了。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/3924175" target="_blank">构建高性能Web站点</a>》<br />
	我不是搞Web开发的，但此书前三章对Web站点性能影响因素的分析还是让我受益匪浅的。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/3119946" target="_blank">程序设计语言原理</a>》<br />
	从China-pub淘来的一本特价书，但读了之后我感觉即使是原价买来也是很划算的。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/1141154/" target="_blank">程序开发心理学</a>》<br />
	温伯格的经典之作。由于原著成书较早，经过几十年很多思想其实早已经通过其他渠道灌输到我们的大脑中了，但越是这样我们越是惊叹于温大牛惊人的预见力。要知道这本书最早成书于1971年。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/4317573/" target="_blank">算法技术手册</a>》<br />
	今年读的唯一算法类书籍，这本书不像《<a href="http://book.douban.com/subject/1885170/" target="_blank">算法导论</a>》那样钻理论牛角尖，也不像《<a href="http://book.douban.com/subject/3923731" target="_blank">程序员实用算法</a>》那样着重于算法的实现，它旨在赋予你精确选择算法的能力，以帮助你精确高效地解决面临的问题。</p>
<p>二、社科类<br />
	&middot; 《<a href="http://book.douban.com/subject/1313124/" target="_blank">赢</a>》<br />
	杰克.韦尔奇退休后的总结之作。记得上次陪LP参加桩考，我用了大半天时间在我的<a href="http://tonybai.com/2011/08/16/some-notes-on-using-bambook/" target="_blank">Bambook</a>上把这本书浏览了一遍。不过在我这个层次上尚无法理解杰克全部之言。这本书对于不同层次的人会有不同的价值。它就是那种需要你在不同时期反复多次阅读的一本书。也许若干年后再读此书，我会有更深刻的认识。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/6709783" target="_blank">浪潮之巅</a>》<br />
	今年我读到的最震撼之作。之前吴军在Google黑板报上连载时我并未太过在意，这次系统地通读一遍后，让我眼界大开，从书中学到了许多，同时也激发我想到了许多。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/4849382" target="_blank">搞定: 无压工作的艺术</a>》(Getting Things Done的中译版)和《<a href="http://book.douban.com/subject/3558629" target="_blank">时间管理：小强升职记</a>》<br />
	前者是GTD时间管理理论的源头，后者则是国内GTD牛人的经验之作。时间管理是今年我的一个重点改进目标，这两本书给了我很大帮助。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/4010185" target="_blank">哪来的天才</a>》<br />
	这本书向我们阐述了一个观点：刻意练习是天才的一个必要条件。如果你不认同，那么打开这本书，慢慢看吧。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/3609132/" target="_blank">把时间当作朋友</a>》<br />
	原新东方英语教师李笑来的作品，很难想象他这样的职业能写出这种题材的书。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/5320866" target="_blank">重来</a>》<br />
	来自一个创业公司创业者们的颠覆性观点。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/1775691/" target="_blank">少有人走的路</a>》<br />
	感觉没有外界宣传的那么好，也许我还没有悟到。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/1322025/" target="_blank">卓有成效的管理者</a>》<br />
	管理学大师的作品总是值得一读的，虽然你很可能已经从其他场合学到过其中的思想。</p>
<p>三、传记类<br />
	&middot; 《<a href="http://book.douban.com/subject/4860552" target="_blank">活着就为改变世界</a>》和《<a href="http://book.douban.com/subject/6798611/" target="_blank">史蒂夫&middot;乔布斯传</a>》<br />
	看《活着就为改变世界》时，乔布斯还活着；后来乔布斯去逝了，我拿到了《史蒂夫&middot;乔布斯传》。感谢京东的促销活动，让我以超低的价格买到乔帮主留给世人的这最后的礼物。两本书都告诉我一个事实：乔布斯的确与众不同，但讨厌他、憎恨他的人也大有人在。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/4010196" target="_blank">世界因你不同</a>》<br />
	以前看过李开复的《<a href="http://book.douban.com/subject/1427679/" target="_blank">做最好的自己</a>》，对李开复有些了解，所以读这本传记时也就走马观花了。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/1007313/" target="_blank">留德十年</a>》和《<a href="http://book.douban.com/subject/1062423/" target="_blank">牛棚杂忆</a>》<br />
	一直很想知道季羡林为何被称为国学大师，通过回忆录是了解这个大师的一个很好的途径。</p>
<p>四、小说类</p>
<p>&middot; 《<a href="http://book.douban.com/series/2308" target="_blank">盗墓笔记系列</a>》<br />
	这类题材的书籍总是吸引人的眼球，就如作者所说的&ldquo;盗墓代表着人类一种最原始的欲望，求得财富和探询死亡，这种刺激，恐怕是人就无法避免的&quot;。不能去倒斗，看看别人如何倒斗也能满足一些欲望^_^。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/2567698" target="_blank">三体</a>》<br />
	慕名而读，名不虚传。作者超凡的想象力让人不能不折服，至少第一部是如此。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/1774628" target="_blank">高地</a>》<br />
	今年看的唯一一部军旅题材小说，在部门旅游来回的途中把这部小说看完，情节跌宕，情感细腻，值得一看。</p>
<p>五、其他类<br />
	&middot; 《<a href="http://book.douban.com/subject/1410752/" target="_blank">准备去美国读书</a>》<br />
	为了了解美国教育是什么样子的，从图书馆借阅的，如果你和我有同样的目的，这本书还是可以满足需求的。</p>
<p>&middot; 《<a href="http://book.douban.com/subject/4279673/" target="_blank">实用IT英语</a>》<br />
	简直就是为IT人士量身定做的外语书，着重培养&quot;英语思维&quot;的形成，感觉书的内容也比较新颖。</p>
<p>很多朋友可能会问：工作这么忙，家庭生活琐事那么多，哪里还有什么时间读书呢？我又何尝不忙呢，每天8小时工作，周末还要陪果果。这里的关键还是要有坚定的读书信念，养成良好读书习惯，就好比一日三餐那样，非读不可。另外还要不断提高读书效率，充分利用零散的时间。现在市面上电纸书(比如kindle、bambook)越来越成熟，便携性也越来越好，你可以把坐车、等车以及闲暇休息这些零散时间充分利用起来，一年下来你挤出来的时间也是惊人的。</p>
<p style='text-align:left'>&copy; 2011, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2011/12/22/book-list-i-have-read-in-2011/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>2011小结</title>
		<link>https://tonybai.com/2011/12/21/my-year-end-summary-of-2011/</link>
		<comments>https://tonybai.com/2011/12/21/my-year-end-summary-of-2011/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 14:25:00 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[生活簿]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Blogger]]></category>
		<category><![CDATA[博客]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[家庭]]></category>
		<category><![CDATA[工作]]></category>
		<category><![CDATA[年终总结]]></category>
		<category><![CDATA[果果]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[读书]]></category>

		<guid isPermaLink="false">http://tonybai.com/2011/12/21/2011%e5%b0%8f%e7%bb%93/</guid>
		<description><![CDATA[<p>2011年眼看就要接近尾声了，这里也对自己在2011年的&#34;所作所为&#34;做个小结^_^。<br />
<br />
这一年来工作之外的我过得还是比较充实的，从下面的数字也可以看出：<br />
<br />
- 写了81篇博文<br />
<br />
- 开源了2个工具(CBehave和buildc)<br />
<br />
- 合译了一本书（&#34;Seven Languages in Seven W...</p>]]></description>
			<content:encoded><![CDATA[<p>2011年眼看就要接近尾声了，这里也对自己在2011年的&quot;所作所为&quot;做个小结^_^。</p>
<p>这一年来工作之外的我过得还是比较充实的，从下面的数字也可以看出：<br />
	- 写了<a href="http://tonybai.com" target="_blank">81篇博文</a><br />
	- 开源了2个工具(<a href="http://tonybai.com/2011/08/15/cbehave-a-bdd-framework-for-c/" target="_blank">CBehave</a>和<a href="http://tonybai.com/2011/12/08/buildc-a-building-assistant-tool-for-c-app/" target="_blank">buildc</a>)<br />
	- 合译了一本书（&quot;<a href="http://book.douban.com/subject/4768035/" target="_blank">Seven Languages in Seven Weeks</a>&quot;，不过尚未出版）<br />
	- 读了近50本书（通过<a href="http://book.douban.com/people/tony_bai/" target="_blank">豆瓣读书</a>统计）<br />
	- 新学了一门语言 &#8211; <a href="http://tonybai.com/tag/Common-Lisp" target="_blank">Common Lisp</a><br />
	- 新用了一门语言 &#8211; <a href="http://python.org" target="_blank">Python</a></p>
<p>学无止境。我内心中追求的是&quot;持续成长&quot;，让自己感觉每一天都有进步，哪怕仅是一点点，所以上面这些事情对我来说绝对是快乐的，有成就感的。</p>
<p>在工作方面，2011是&quot;蓄势&quot;和&quot;布局&quot;的一年。无论是在产品开发还是团队组织调整方面，我都按照我的思路进行了重新布局。这样一方面可以提携一些骨干，让他们可以在更重要的岗位上发挥出更大的能量；另一方面也可以大大减轻我个人身上的一些事务性工作，让自己可以轻装上阵，静下心来思考一些事情，踏实地去做一些对部门长远发展有价值的事情，比如<a href="http://tonybai.com/2010/12/18/thoughts-on-online-coding-review/" target="_blank">在线代码同级评审</a>、<a href="http://tonybai.com/2011/11/23/those-things-about-knowledge-management/" target="_blank">知识库</a>的建设、开发构建管理辅助工具、使用虚拟化技术改善开发测试效率、生产环境软件升级的自动化操作等。这些工作也反过来让我变得更加主动，更敢于去打破常规。</p>
<p>年初在个人工作计划中设定了多个目标，现在看来大部分已经做到。但感觉在&quot;给予下属同事更多关于高效工作方法和提高解决问题能力上的指导&ldquo;方面做的还很不足。另外感觉自己在&quot;包容他人&quot;这块的进步似乎依旧不大，甚至感觉自己的脾气愈发见长，眼睛里基本容不下沙子，看来性格秉性这东西要改起来还真难。</p>
<p>我一直告诫自己：代码还得写，千万不能让自己手冷。这方面上半年做的还不错，下半年写的有些少，这几天感觉手有些痒痒了，特想写上个三天三夜。</p>
<p>2011的家庭生活总体来说是&quot;平淡中蕴含着幸福&quot;，特别是每次下班进门时<a href="http://tonybai.com/tag/果果" target="_blank">果果</a>迎上来抱住我的大腿的时候，幸福的感觉尤甚。</p>
<p>既然是小结，那就写这么多了，都是捞干的了。至于来年的计划、目标以及愿望就留到来年再说道吧。</p>
<p style='text-align:left'>&copy; 2011, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2011/12/21/my-year-end-summary-of-2011/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>聆听编程“古训”</title>
		<link>https://tonybai.com/2011/05/10/listen-to-old-maxim-respectfully/</link>
		<comments>https://tonybai.com/2011/05/10/listen-to-old-maxim-respectfully/#comments</comments>
		<pubDate>Tue, 10 May 2011 14:17:00 +0000</pubDate>
		<dc:creator>bigwhite</dc:creator>
				<category><![CDATA[技术志]]></category>
		<category><![CDATA[Algorithm]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Blogger]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Comment]]></category>
		<category><![CDATA[Programmer]]></category>
		<category><![CDATA[代码大全]]></category>
		<category><![CDATA[博客]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[标准]]></category>
		<category><![CDATA[标准库]]></category>
		<category><![CDATA[注释]]></category>
		<category><![CDATA[程序员]]></category>
		<category><![CDATA[编码]]></category>
		<category><![CDATA[读书]]></category>
		<category><![CDATA[重构]]></category>
		<category><![CDATA[风格]]></category>

		<guid isPermaLink="false">http://tonybai.com/2011/05/10/%e8%81%86%e5%90%ac%e7%bc%96%e7%a8%8b%e2%80%9c%e5%8f%a4%e8%ae%ad%e2%80%9d/</guid>
		<description><![CDATA[<p><br />
市面上关于优秀编程风格和习惯养成的书籍还真不少，其中&#8220;叫好又叫座&#8221;的书诸如《代码大全》、《编程精粹:编写高质量C语言代码》、《编程匠艺》、《重构》以及《Clean Code》等。不过前些天我在网上下载了一本名为《The Elements of Programming Style》...</p>]]></description>
			<content:encoded><![CDATA[<p>市面上关于优秀编程风格和习惯养成的书籍还真不少，其中&ldquo;叫好又叫座&rdquo;的书诸如《<a href="http://tonybai.com/2008/11/13/coding-review-and-cc2e-and-assertion-and-others/" target="_blank">代码大全</a>》、《<a href="http://http://book.douban.com/subject/3406939/" target="_blank">编程精粹:编写高质量C语言代码</a>》、《<a href="book.douban.com/subject/3210669" target="_blank">编程匠艺</a>》、《<a href="http://tonybai.com/2006/03/28/c-refactoring/" target="_blank">重构</a>》以及《<a href="http://book.douban.com/subject/3032825/" target="_blank">Clean Code</a>》等。不过前些天我在网上下载了一本名为《<a href="http://book.douban.com/subject/1470267/" target="_blank">The Elements of Programming Style</a>》的电子书，看过此书后，我才知道开创编写优秀风格代码之路的鼻祖是谁（不知道是否还有比这本书更加古老的且系统地讲述优良编程元素的书籍了？）。</p>
<p>这本书的两位作者来头都大得很。<a href="http://en.wikipedia.org/wiki/Brian_Kernighan" target="_blank">Brian W. Kernighan</a>，K&#038;R C中的那个&ldquo;K&rdquo;，C语言的鼻祖之一。 <a href="http://en.wikipedia.org/wiki/P._J._Plauger" target="_blank">P. J. Plauger</a>，《C标准库》一书作者，同样是大师级人物，说不准你现在使用的<a href="http://book.douban.com/subject/3775842/" target="_blank">C标准库</a>还是Plauger当初操刀实现的呢^_^。这本书的出版年份为1978年，Wow，Older Than Me！距今有30多年了，在编程领域算是一本&ldquo;古书&rdquo;了。其第一版则更早，于1974年出版。这本书的中心思想是计算机程序编写不应该只满足于编译器或者某些个体的编程风格，还要满足人们对程序的&ldquo;可读性&rdquo;的要求。据说当时这本书的出版让全天下的程序员们恍然醒悟，从此大家便知道了优秀编程风格是什么样子的，优秀的代码是应该这么写的。</p>
<p>这本书我还没有全部看完，目前也只看完了前面的十几个条目和例子。本以为书中会用C语言做例子，没想到作者居然用了Fortran和PL/I，整本书&ldquo;充斥&rdquo;着用陌生的Fortran和PL/I语法编写的例子。后来我也想明白了：在那个年代，Fortran才是老大，<a href="http://book.douban.com/doulist/549603/" target="_blank">C语言</a>初出茅庐，还仅仅停留在Bell Lab中。不过也正因为如此，这本书看起来那叫一个费劲，让人头疼。于是我到网上搜出了这本书的<a href="http://www.cnblogs.com/hitszxin/archive/2008/04/03/1136726.html" target="_blank">所有条目列表</a>。完整地看完一遍这些条目后，我甚感吃惊，吃惊的是这本古书中的大多数条目对我们今天的代码编写依旧具有着非凡的指导意义，甚至可以理解为编程领域的公理（至少在目前以及可预见的时间段内都是生效的）。另外当你看完这些条目后，你会发现有些似曾相识的感觉，原因也很简单。我们看到的《代码大全》、《重构》等&ldquo;近现代&rdquo;书籍可能都或多或少的从这本古书中继承了一些内容，并结合现代编程思想加以扩展和升华了！</p>
<p>那《The Elements of Programming Style》这本&ldquo;古书&rdquo;是否还值得去读呢？毕竟我们已经有了像《代码大全》这样的百科全书了。我觉得至少应该过一遍这本书的条目列表，并且针对你感兴趣的重点条目去精读。三十多年前的古训也许更能还原出条目在当时所处的历史场景，这也许是当前一些书籍所不具备的。特别是如果你觉得《代码大全》太厚重，那么不妨可以先来聆听一下这本小书中的&ldquo;古训&rdquo;^_^。</p>
<p style='text-align:left'>&copy; 2011, <a href='https://tonybai.com'>bigwhite</a>. 版权所有. </p>
]]></content:encoded>
			<wfw:commentRss>https://tonybai.com/2011/05/10/listen-to-old-maxim-respectfully/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
