C/C++语言的五个层次

今天我们聊聊C/C++语言的五个层次。 这已经是C语言系列文章的第四个了,前面的三个文章分别为:

为什么C语言不会过时?
什么教材适合零基础的C语言学习者?
为什么C语言很难?

首先是第一个层次。在这个层次你知道基本的语法,能写个hello world,给女朋友打印个心形,读写个文件啥的。要是经历过正统的本科计算机教育,还可以构造个链表,整个vector和map 往里赛个整数,字符串啥的!总之,大部分人这个时候基本上就以为C/C++语言也就这样了,没啥可学了呢。在自己的简历中,非常自信地写上了“精通C/C++语言”。

然后,你开始参加工作了,开始做一个实际点的C++项目。这种项目无论大小,只要是实际上还有点用处的,你一定是踩过if(a=1)这种坑,一定吃过3/4等于0这种亏。你也一定经历过程序昨天还好好的,在老板面前demo的时候就 segmentation fault了。同时,你开始有了疑问,啥时候需要用static,啥时候需要用const。什么时候使用模版的特化和偏特化 ?什么时候使用函数指针?声明和定义的区别?编译单元又是什么东西?你有点对自己的C++语言水平不自信了。你开始对数组和指针小心翼翼了。你突然发现stack overflow原来是这么有用的一个网站。 恭喜你,你现在开始进入第二个层次了。

经过如干时间,你终于搞清楚了上面这些问题的答案。现在你也基本可以编写一个实际的 C++ 的小型项目了。这个时候你最大的困扰是为啥你的C++语言总是用的像C语言一样。现在你的年龄也有点大了,你妈妈不时催促你找个对象,你也开始认真思考什么是面向对象。 假设你现在有这样一个场景:一个人,一颗心,一个牙刷,这个人的媳妇,老妈和朋友,你如何设计一个类了?如果你写出这样的类定义,恭喜你,你开始进入到第三个层次了。这个时候你开始充分利用面向对象的语言来熟练的描述现实中的各种关系了。同时以前你怎么都读不懂《设计模式》现在能读出点滋味了。

class Person{
    Heart heart;
    Unique_prt<Brush> brush;
    Person* wife;
    Person& mother;
    LendMonday(Person* friend); //this is a function
}

好了,我们再接再厉。在第四层中,你开始实现一个编译器了。你开始了解g++中各种优化开关背后的含义,你开始查看编译器产生的Intermediate represent语言, 这个时候,以前困惑你的char+int为什么要把char先变成int这个问题,终于不再困惑你了。你开始明白为什么需要this指针了。你知道了大头和小头。你进入第四层了。 这里需要澄清一下,这个层次并不是说自己了解编译器,而是自己参与实现编译器。目前C++主流的编译器就三个,g++, Clang, VC++。 如果你再对编译器的要求苛刻点,可以把VC++去掉。那么问题是,你是这些编译器的核心开发人员吗?如果不是,对不起,你还没有进入第四层呢。

都开始玩编译器了,才进入第四层,那第五层到底是个啥?第五层是制定C++语言的标准了。这个层次大约有100多个人。不定期开个会制定新的C++标准。这里是一张会议照片。

我强烈怀疑这些人能不能写出来一个没错任何错误的hello world。因为你从标准里根本读不到“CPU”,“内存”,“简单”,“喜欢”这些词。只有什么“右值引用”,“浅拷贝”,“模版元”,“类型推导”这类的词语。我曾经误打误闯地搞了一年多的编译器,所以必须硬着头皮,读过几页的C++标准,我可以用我的性别担保,它们真的很难读,不服来战下面这段:
Unless otherwise indicated (8.2.2), a prvalue shall always have complete type or the void type. A glvalue shall not have type cv void. [ Note: A glvalue may have complete or incomplete non-void type. Class and array prvalues can have cv-qualified types; other prvalues always have cv-unqualified types. See Clause 8. — end note ]

总结一下:整个的过程是这样,标准对编译器说,你听我的。编译器对C++语言说,你听我的。C++对实际问题说,你听我的。实际问题对程序员说,你听我的。作为程序员,你有两个选择。你可以说,我都精通C++语言了,我谁也不听。那你就可能一辈子停留在精通这个阶段。如果你选择,我听!那么好,你仔细听,你会慢慢地开始听见C++语言怎么说,编译器怎么说,标准怎么说。

真的别再说自己精通C++语言了,上面照片里那一百多人都不敢说他们精通C++语言,这是因为他们知道C++有多大,有多复杂!写完这篇文章,我信心满满地说:我了解C++语言,并且掌握一些。你呢?

为什么C语言不会过时?

赵岩 http://zhaoyan.website

这是C语言系列博客的第3篇,如果对前2篇感兴趣,可以点击下面的链接:
什么教材适合零基础的C语言学习者?
为什么C语言很难?

评价任何一门编程语言,都是招人骂的。 永远是这样。就像是春寒料峭的季节, 街上穿棉袄和穿单衣的擦肩而过,双方一定是同时在心里出现了两个字:“傻逼!”这个在心理学上有个专业的名字:叫做“二逼”现象!

那我为啥还要做这个挨骂的事呢?作为《C语言点滴》《drop of knowledge of C++》书籍的作者,《C语言新思维,第二版》的译者。我觉得我有责任系统的介绍一下这本语言,他的特点,还有他的未来。这个问题对很多刚刚踏入程序猿这个行业的新手至关重要。因为他们有深深的担忧,万一C语言就像Fortran,perl语言那样过时了怎么办?

先上一个表,这个就是著名的TIOBE语言排行榜。目前它是一个最权威的一个语言流行度的排行榜,从这个排行榜上看,你会得到一个最直观的结论。Java和C都在下降,而下降的部分被第三名以后的语言所瓜分。

对所有的编程语言,他们的最后的目的其实就是两种:提高硬件的运行效率和提高程序员的开发效率。遗憾的是,这两点是不可能并存的!你只能选一样。在提高硬件的运行效率这一方面,C语言没有竞争者!举个简单的例子,实现一个列表,C语言用数组int a[3],经过编译以后变成了(基地址+偏移量)的方式。对于计算机来说,没有运算比加法更快,没有任何一种方法比(基地址+偏移量)的存取方法更快。C语言已经把硬件的运行效率压缩到了极致。这种设计思想带来的问题就是易用性和安全性的缺失。例如,你不能在数组中混合保存不同的类型,否则编译器没有办法计算正确的偏移量。同时C语言对于错误的偏移量也不闻不问,这就是C语言中臭名昭著的越界问题。C语言自诩的“相信程序员”都是漂亮的说辞,它的唯一目的就是快,要么飞速的运行,要么飞速的崩溃。C语言只关心程序飞的高不高,不关心程序猿飞的累不累。就是这样!

现在来看看那些非C的语言,他们的长处都在于提高程序员的开发效率上。或者支持动态的列表,或者支持安全的列表。但是加入任何的中间层,加入任何的安全检验,它不可能比(基地址+偏移量+无检验)的方式更快。这个世界上不存在“开发容易,运行快”的语言,开发容易毕竟来源于对底层的一层一层又一层的包装。就像是这个世界上根本就不存在“我就看看,什么也不买”,不存在“我就抱抱,什么也不干”。

现在回答两个最普遍的问题:硬件这么便宜了,有必要让软件更快吗?有这种疑问的人大部分都是网吧的固定客户,他们理解的计算机只在电脑城,他们理解的计算只是游戏和播放硬盘中的小电影。不要玩个游戏开个挂就乐得不行不行的,别忘了还有全实景仿真,还有3D渲染,还有自动驾驶。人在开车的时候,每秒要收集60个不同的物体,然后根据这60个物体的不同组合和反映来做20个最重要的决定。然后从这20多个决定中选一个执行。所以就算用上最快的硬件,自动驾驶现在还不敢说能像人那样开车。就算是自动驾驶成功了,下一步还要自动飞行呢?因为我们老早就预言了:你咋不上天呢!所以说:计算速度永远是不够的!因为新的应用会越来越复杂,越来也实时。对了!我还忘了一个更重要的限制:计算的能耗!NASA飞行器上的CPU最多就是32位的,说出来你可能不信,国际空间站上没有一个CPU是64位的,我猜一个最主要的原因是航天员不爱看硬盘小电影吧。

另外一个流行的疑问是:我可以发明一种同样快的语言,但是没有C语言那么多的坑。想法是可以的,而且还真巧有这个语言,真巧它的名字叫D语言,真巧没有太多的人用!这是因为一个基本的事实。现在有太多,太多太多的C代码,他们大部分都在正常工作,就像Linux, Window, MacOS,Unix,Vxworks。你没有看错,这些操作系统的内核都是C,我虽然不确定C在Window中所占的比例,但是我相信微软的人不会傻到用C#去全部改写一个操作系统的内核。你想让这些人去用你的全新的语言,这就不是“有点”很傻,很天真了!而且有些代码,我们根本就不能改!NASA一个简单的5个CPU飞控软件编写完毕后,要进行一种“全覆盖”测试。如果CPU A坏了会发生什么?如果CPU A,B坏了呢?如果CPU A,C坏了呢。。。。?如果你愿意,你可以做个简单的数学组合。测试完毕后,别说重写,就算加个注释都不行。因为主管payload的大妈会非常严肃的质问你,为什么你上报的东西数量增加了,但是质量没有增加?你需要和她详细的解释:硬件和软件是不同的,硬件是那种摸起来硬硬的东西,但是软件不是那种摸起来软软的东西。看着大妈鄙夷的眼神,这个时候你会非常后悔自己手欠加入的哪一行注释。你还别不当真,这个是NASA的真实故事。

哪为什么C语言还下降这么多呢?很简单,有些任务本身就不是C语言的。我上学的时候还用C语言编过窗口界面呢?然后很快微软的人就推出了MFC,就是一大堆宏把底层的C windowAPI包装了起来。再后来这个技术也过时了。因为微软的人认识到,带有窗口的应用程序说到底不是C语言的本职工作,再这么一层一层包下去就有露馅的危险,于是他们发明了一个全新的语言C#来负责这个任务。Java也是这样,突出网络,易用,安全,跨平台。无论是Java, c#还是python, 他们都有意避开提高硬件的运行效率这个问题,因为这个问题上没办法和C竞争,也无法撼动Linux, Unix,GNU tool这些已有C代码的位置。剩下的就只是提高程序员的开发效率上大作文章。这对C语言是好事,把自己不善长的东西去掉,让自己跑的更快!

伴随着嵌入和实时系统的兴起,AI,机器人,自动驾驶等。这些都是C语言的核心应用,而且在这种应用上面,C语言没有竞争者。所以我感觉C语言会稳定在自己核心的应用中,并开始逐步回升。但是Java语言我个人不乐观。小型和灵活性上,Python更胜一筹。一行python代码后,你根本不知道自己还是不是duck类型?平台领域,每个平台都推出自己专属的语言。Windows会继续支持C#,苹果偏爱Swift, Android推出Kotlin,Google用go。Java宣称自己可以自由到每家做客,但是无论是到谁家,都会发现客厅里面坐着一个亲儿子,这个时候自己这个干儿子多多少少有点尴尬。所以我猜测,最后Java会稳定在对跨平台有严格要求的,大型非实时应用上。

最后说点闲话,C++不会淘汰C语言。有了对象后你会发现再简朴的对象也耗费资源,而且有了对象以后,总是不由自主的去想继承这个事,一但继承实现了,你会发现继承带来的麻烦远超过你的想象。Java的发明人James被问到如果可以从新设计Java语言的话,第一个要做什么事?他说:“去掉对象”!作为一个已婚,有两个孩子的程序猿,我感同身受。如果大家感兴趣,我可以再写一个博客,聊聊C++和C的真实区别所在。

如果你看到这里,还什么都没记住。那就只记住一点:没人能预测未来。
--------------------------
全世界只需要五台电脑 -IBM创始人
640K内存足够了 -微软创始人
没必要在家里用电脑-DEC创始人
--------------------------
如果再有人对你说C语言已经过时了,最好自己思考一下,能求真最好,如果不能,至少要做到存疑。

什么教材适合零基础的C语言学习者?

赵岩 http://zhaoyan.website

最近收到一个微博网友提出的这个问题,下面我简单地回答一下。
我没有读过很多的C语言教材。有一本谭浩强老师的《C语言程序设计》,貌似是很经典的,你可以考虑一下。我在哈尔滨工业大学教C语言的时候,使用的是工大苏小红老师的《C语言程序设计(第一版)》,个人感觉还可以。这本书目前好像出第二版了,但是我个人还是推荐第一版。

简单地说,这个问题就回答完了,下面再啰嗦几句,你要有时间就看看,没时间也看看,因为下面的话更有价值。我想说的是,教材就这么回事,大部分教材内容都差不多。也就是说,如果你看教材A没明白,那么教材B你也看不明白。教材的主要作用就是,教会你一些基本的概念,然后由这些基本的概念开始,你要开始简单的实践并产生一些问题,并尝试解决这些问题,这是你进步的开始。

下面再啰嗦几句,有没有时间都要看看!下面的话才是最重要的。既然你要开始学习C语言了,我要告诉你道理,知识和技能这三者之间的区别。这三者中,道理,有的时候以段子或者名人名言等面目出现,它是目前微信圈最流行的。它的最主要的特点就是一个字:贱!产出贱,传播贱,收获贱。大师们一不小心憋出一个段子,“像富人那样思考,追寻梦想去奔跑!”,然后按几下键传到微博,微信上。你打开手机按一下键,看到段子后热血沸腾,感觉整个人都不一样了!当然了,出去奔跑是有点累的,所以最后你决定转发一下,证明自己对人生有了崭新的理解和认识。不过你有没有想过,这个世界上最终是能量是守恒的。你按一下键获得的东西,这种东西到底有什么用?

段子流行后面的真实原因是人都是懒惰和想投机取巧的。举个例子来说,要想健康说起来是很简单:少吃,多动,早睡就好了。但是这三点做起来真是太TM的难了!你一边享受着自己喜欢的但是不健康的生活方式,一边深深的自责并瘫痪在床上翻看着手机。这个时候一位满面红光的养生专家发段子了,他说你不用担心,你可以把吃出来的病再吃回去的,只要你每天吃5种不同颜色的食物就可以了!这个时候长相甜美的营养专家也发帖了,她说你只要饭后吃一个蓝色的小药丸就可以了,只要988,五脏六腑乐哈哈!这个时候仁波切也发帖了,他说:南无无量天尊,该吃吃,该喝喝,啥事别忘心里搁!看完这些你心情大好,豁然开朗的同时并且还有点饿了。最后你妈妈来了,她让你别看手机并且早点睡觉。你不耐烦地说知道了。看到没,如果再有人告诉你什么21天从入门到精通的话,你要提高警惕。骗子成功的主要原因就是我们都想不劳而获,切记!

下面说说知识,这个东西你要获得,你就必须要付出成本了。无论是自学还是上学,你都要付出相当的金钱成本和时间成本。所以老师和学校的存在,你也可以理解为一种是半强制的措施,保证你能完成这个相对无聊,枯燥的学习过程,而不至于轻易地半途而废。无论你是通过在线学习,还是自己的兴趣驱动,我都真心希望你,坚持下来一个完整,系统的学习周期。 在学习知识的过程中,好的老师和好的书会让你少走些弯路。好的老师就是我!好书包括《C语言点滴》和《C程序设计新思维(第二版)》,前一本书会回答你看教材时产生的各种问题,后一半书介绍了一个完整的C语言的生态系统。前一本书深入,后一本书广阔。另外,别指望着通过看几本书精通C语言,记住一点,知识和技能是不一样的。

和知识相比,技能不可能通过看书获取,因为技能的获取完全靠自己的实践。所以100%带有强制性,例如你的毕业论文,你公司的任务等。 你要忍受任务带来的压力,要面对现实中各种复杂的问题和挫折。实验,思考,分析,解决。在这个令你最劳累的过程中,你失去了头发,获得了技能。技能的获取没有捷径,拿C语言来说,别人都说C语言坑多,解决这个问题的方法其实非常简单,就是每个坑你就踩一遍!顺便告诉你,这个过程中你是没时间,也没心情去转发段子的!

不过我要恭喜你,根据能量守恒定律,失去头发而获得的技能是最值钱的。在你未来的生活中,你要靠你的技能来赚取你的工资,你的技能的水平也决定了你的生活水平。举例来说,现在美国家庭的平均年收入是6万美元,而一个有技能的C/C++程序猿的年薪在8万~10万之间(一般公司的保守值,大公司在12万左右)。这个数字并不是再鼓励你,相反它是在警告你,学习C语言的路上,其实没有多少人能坚持到最后!当你的第一个hello world程序编译的时候,你面对满屏幕的错误和警告,再一次问问自己,是要继续和世界打招呼,还是转行去当专家和大师!

航空伪专家介绍Jame Webb望远镜

赵岩 http://zhaoyan.website

航空真小白:专家您好,请介绍一下照片中的这个货。
航空伪专家:小白您好,照片中是NASA最新的Jame Webb望远镜,他是哈勃望远镜的继任者,将于2018年10月发射升空。目前在Houston NASA中心做最后的测试。

航空真小白:哈勃就已经很牛逼了,作为他的继任者,Jame Webb 有什么更牛逼的地方呢?
航空伪专家:他的主要改进有三个方面:第一是个头大,哈勃的镜片直径大约是1.5米,而 Jame webb 的镜片直径是大约7米。整体上哈勃像一个公交汽车,而Jame webb像一个波音747。第二个特点是Jame Webb主要观测红外光。第三个特点是它部署的远,月亮距离地球30万公里,Jame Webb部署在距离地球150万公里的地方,所以它并不绕地球飞,而是和地球同步地绕太阳飞。

航空真小白:那么它的最核心的任务是什么呢?
航空伪专家:目前它还没有非常具体的任务,但是由于它主要观测红外光,由于宇宙一直在膨胀,由于开普勒效应,所以很远的星系发出的光到达地球的时候都是红外光,这使得Jame Webb可以看的更远。目前我们能看到的最远的星系的距离大约是100亿光年,也就是说,我们现在看到的光,其实是走了100亿年后,才到达地球的,再换句话说,我们现在看到它的样子,是它100亿年前的样子,但是非常遗憾,目前的哈勃只能看这么远,而且基本上最远的地方看到的只是一个小红点了。

航空真小白:那么宇宙现在大约多少岁了?
航空伪专家:大约130亿年了。所以有了Jame Webb,我们甚至可以看到宇宙刚刚出生的时候的样子。另外红外光可以穿透尘埃,我们可以看到星云后面新的恒星的孕育和诞生。红外光还可以帮助我们更有效的分析行星的大气层的成分,目前通过开普勒望远镜已经发现了3000颗行星,如果我们可以分析这3000个行星的大气层,一旦在光谱中发现了水和氧气的成分,几乎可以肯定我们发现了新的生命形式,想象一下,通过宇宙微波背景辐射,我们可以听到宇宙的第一声啼哭,通过Jame Webb我们可以看到宇宙出生的样子,这是一件多么伟大的事情!另外。。。

航空真小白:对不起打断一下,我们聊点别的吧!望远镜上是金子吗?涂上金色有审美上的考虑吗?
航空伪专家:是金子!第二个问题中,你貌似在批评我们NASA的工程师缺乏审美,这一点我必须要更正一下,我们NASA的工程师不是缺乏审美,而是根本就没有!用金子的唯一原因是它在所有金属中反射红外线最好,达到了98%。 我知道你希望涂成黑色,这让人想起了:“黑色给了我黑色的眼睛,我却用它来寻找光明!”或者涂成蓝色,“天蓝蓝,海蓝蓝”等等。但是很遗憾,最后就是金色。再说了,这种散发着浓郁的农家富足喜乐的金色,看习惯了也不错!

航空真小白:既然是金子,那么这个望远镜一定很贵吧?
航空伪专家:是很贵。最开始的预算是0.5亿,但是目前已经花费了将近20亿美元。并不是因为金子贵,整个望远镜上用的金子,还不到半个高尔夫球大。贵的原因在生产工艺上。举两个栗子:镜片需要非常的平整,如果把整个镜片放大到整个美国那么大,那么高度的差别都不超过几个英寸。那是真正的苍蝇打滑,蚊子劈叉。另外金子不是涂上去的,是先把金子蒸汽化,然后冷凝到镜片上,我们都知道真金不怕火炼,所以把金子蒸汽化是如何做到的呢?

航空真小白:我听说过一个故事,NASA用100万美元做一个没有重力下也能使用的笔,而苏联用铅笔解决了这个问题。是不是钱都让你们NASA的人贪污了?
航空伪专家:首先,这个故事是假的!这个传说流传甚广的原因是它基于如下几个确实存在的事实,现在我把这几个事实单独的列出来。1)确实有微重力下使用的笔,它是由一个公司自己投资开发的。2)NASA以每只6美元的价格采购了4000只,苏联同期也买了1000只。3)最开始NASA和苏联都是用铅笔了,但是很快发现了一个潜在的危险,铅笔芯是导电的!导电的!导电的!如果铅笔头断了,那么如果它飞到电路板上,会引起短路或者火花。。。4)6美元换成现在大约是50美元,也是很贵的。但是你别忘了,航天器上的任何东西,都是考虑极端的电磁辐射,极端的温度和极端的可靠性。所以价格都是地球上同类东西的10到100倍。
总体来说,NASA是一个很高效的部门。不过这个故事确实对NASA的公关形象造成了一定的影响。NASA园区同时也是一个很著名的旅游景点,所以在我们NASA内部由严格的规定,严谨在有游客出现的地方如停车场,食堂等地方睡觉!!!

航空真小白:那么花这么多钱,值得吗?
航空伪专家:当我们还是猴子的时候,我们坐在树上,仰望头上的明月,我们会问自己,那上面有桃子吗?慢慢地,当我们进化成人类,我们再一次仰望明月,我们还会问自己,那上面有仙女吗?
航空真小白:您是想说,当我们从猴子变成了人,我们的需求改变了!
航空伪专家:嗯。。。不是!我是想说,在我们进化的过程中,好奇心已经深深刻画在我们的基因中,这种好奇心一直促使我们问一些问题:我们孤单吗?生命是如何被创造出来的?。。。
航空真小白:那不还是找仙女这个事吗?
航空伪专家:嗯。。。今天先聊到这吧。如果你还有什么除了仙女以外的问题,请给我写信:yan.zhao@nasa.gov 我会第一时间回答你。谢谢!

为什么C语言很难?

赵岩 http://zhaoyan.website

前两天,有个学校要给高中生开一门编程的课,大家讨论用什么编程语言授课,大部分人推荐用JAVA, 一部分说用Python,但是几乎所有的人都说:C语言太难了!

作为《C语言点滴》的作者,《C语言新思维》译者,这种语言坑我一般都绕开的,因为无论我说什么,没私心也显得有私心。但是“C语言太难”这句话太扎心,搞得我有点伤心。(文章排比对账,我只服自己!)我决定站出来为C语言说两句公道话!首先我个人必须承认,大家认为的都没错,相比较另外两种语言,C语言确实是最难学的。但是C语言为什么难?我认为锅不能C语言一个人背!背后还有三个主要的原因,那就是:面对任务难,开发环境难,底层难。

首先是面对任务难。我不认为用{}就比用缩进难!声明一个变量的类型就比不声明一个类型难!需要编译一遍就比直接运行难!就像你认为英语难,还分he, she;还有a, the。老外却不这么想。换位思考一下,下面这个牌匾也会让老外抓狂的。

说到底,这种语法级别的难度比较其实没有任何意义,只是一个使用习惯,一个小程序python用10行,C语言可能用20行,就因为多敲了10行你就难受的不要不要的,我只能对你说:要身残志坚!

不同与JAVA和python,C语言面临的任务几乎都是要求实时,高速或者是嵌入的。例如医疗,军事,飞控,航天,金融等领域。举个栗子,NASA大部分软件要基于三个不同的时钟系统,自转(公转)时间,CPU的晶振时间和原子钟时间。一秒要分成500份,基于2毫秒的基础进行操作同步;同时用全球的原子钟时间均值对所有时钟系统调整。在这种环境下,JAVA那种“大约一分钟以后”的虚拟机管理方式一定是不行的。 所以我在NASA工作所接触的软件,几乎都是C语言编写的。可想而之,这种软件的开发难度,当你阅读这种程序代码的时候,你说C语言太难了,这是否有点不公平?

其次是开发环境难。C语言一开始就和UNIX(LINUX)有不解之缘,它们是伴生的系统。所以要想发挥C语言的全部威力,最好的开发环境就是UNIX(LINUX)系统。但是问题来了,UNIX(LINUX)系统里的各种开发工具,每一个都不是省油的灯。它们设计的最初目的就是效率,而不是易学性。再举个栗子,gcc的各种编译开关就很复杂了,make系统为了解决gcc的部分问题,自己随之带来了更大的问题。git目的就是帮你保存历史备份,但是你会发现你经常会串改历史,或者干脆迷失在历史中。就连最简单的一个编辑器VIM,头一个月内,你最多的使用体验就是“恨不得拽自己的头发把自己提溜起来。”

好吧,外面的世界太凶险!让我们回到Windows妈妈哪里。虽然Windows的大部分内核都是C语言写的,但是它对C语言的支持缺最差。Why?如果你用Window的编译器去编译C语言,你会发现变量必须要写到函数的开头。它是唯一一个只支持到C89标准的编译器。Windows本身不想去抢这份实时,高速,嵌入的市场,老老实实做消费电子市场就好,这种市场要求开发容易,发布快。所以C#语言和后面的.Net平台才是它发展的重心。像玩LEGO那样的编程,你需要做的就是把一个个控件拽到窗口上,用鼠标来编程!所以还是算了吧,毕竟你也不想你在做飞机的时候,飞机上控制降落的电脑突然蓝屏了吧!所以如果你是一个C程序员,你唯一能做的就是在linux下使用哪些臭名昭彰的难学的工具。这笔账难到也要算到C语言的头上吗?

最后是底层难。这必须要要聊聊C语言两个最受诟病的特性,位操作和指针。这两个概念本身很简单。但是通过这两个概念,它把很多底层操作系统的知识和体系结构的知识都暴露了出来。指针指向地址后,马上引入了一大堆内存管理知识。什么是堆?什么是栈?这个地址在内存的那个区域?这个区域可以修改吗?这个区域自动回收吗?指针指向函数后,又引入了一堆操作系统知识,什么是回调函数啊?什么是事件驱动啊?以及位操作后面的二进制,溢出,浮点数精度等等一系列的问题。我用手指指向了一本《相对论》,然后就有人跑过来对我说,你这个手指头太难了!

如果编程只是你的业余爱好,使用那种语言真的无所谓。大部分初学者面临的任务规模下,三种语言的开发难度都差不多。 就是打个招呼,英语的“hello”,中文的“你好”,或者是日语的‘牙买碟’,我实在看不出这有什么难度上的区别。但是如果你立志要当一名高水准的程序员,C语言你是逃避不开的。或者编程序是你的饭碗,你也要认真考虑一下C语言。语言的易学性在就业上是一把双刃剑。如果一个公司招聘C程序员,你第一个反应就是他为什么不去招聘满大街的JAVA程序员?你面临的一定不是什么图书管理系统,也一定不是一个什么网站。想明白了这一点,就完全有理由要一个高价钱!

C语言很难,要逃避这种难,却很难!C语言很简单,要理解这种简单,却不简单(文章排比对账,我只服自己!)

《21st Century C, 2nd Edition》译者序

最近非常有幸的接受了人民邮电出版社胡俊英和陈冀康编辑的邀请,翻译《21st Century C, 2nd Edition》这个书,这是一本非常经典的C语言著作,目前已经是第二版了。计算机书出了很多年,大家对其自有判断,最简单的办法就是根据书名,90年代末期出版过几本比较经典的计算机图书,书名为:《**入门到精通》,《21天学会**》等。不过很快大家就开始借用这种书名,最后搞得有些良莠不齐。更有甚者,最近出现了好多,《**从入门到放弃》, 《**从入门到入院》 系列丛书,彻底颠覆了以前程序员中这么神圣的书名。好在还有O’Reilly出版社的动物丛书,目前还都是品质和经典的象征。经典到有的时候在圈内人们都忘了书名,只记得动物的名字。例如Perl语言的 “骆驼书”以及Git的“蝙蝠书”等等。

当完成最后一个字的录入,作为这本书的译者,应该系统的给这本书做个总结了。首先,这是一本经典的C语言图书,amazon有50多个评论,评分达到4分。这个骄人的成绩主要来自于本书的两个优点:第一个优点就是系统性和大局观。C语言最开始作为开发UNIX操作系统的工具,它和UNIX操作系统有着不可分割的关系。无论UNIX派生的POSIX标准以及GNU运动,C语言都是其核心的开发语言和工具。所以如果想真正发挥C语言的威力,那必须要把这个语言放到一个更大的编程环境中去。这本书通过对POSIX标准库,GNU编译器,Shell 脚本,Make,GIT以及文档和测试等一系列内容的介绍,建立了一个高效整合的开发环境,C语言作为这个环境的核心开发语言,通过各种开发工具和库的配合,将开发环境的优点淋漓尽致地发挥出来,从而能显著地提高你的开发效率。

第二个优点就是新思维和反规则。作为物理学的爱好者,我用物理来做一个类比 。牛顿创立了经典力学和万有引力。正当我们认为物理学已经完胜的时候,爱因斯坦在一边幽幽地说了一句:“光会拐弯”。在爱因斯坦的结论在观测日全食得到验证以后,这位天才自信心爆棚并宣称:“一切都是可以通过计算来确定的”,这个时候研究量子力学的波尔却传给了他一个纸条说:“上帝掷骰子!”。也许,我是说也许,我们一直都相信的规则或者答案过于片面。 就像有一天我6岁的女儿小米粒问我,“我们人类从那来啊?”我说:“有人说是猴子变得,有人说是神创造的,你信哪个都可以?你告诉爸爸,你信那个啊?”我的女儿想到没想就回答到:“是神把猴子变成人的!”说完她飘然而去。

我们人类总是有一种倾向,一旦形成了自己的某些规则,那么就会自然地排斥和否定另外的反规则。而这本书的难能可贵之处就在于,它不仅提出了C语言的一些反规则,而且通过一些例子证明这些反规则是合理的。例如,我们可以建造高效和准确的宏,我们可以不需要斤斤计较对内存的使用,哪怕有点内存泄漏,我们可以用goto,但是对switch却完全可以放弃等等。现代物理有一个反物质学说,当物质和反物质遇见,二者会立即湮没,并爆发出巨大的能量。这里我借用一下:当你熟悉了规则,同时也理解了反规则,这个时候你的心中就没有了规则。剩下的就是巨大的能力。此时小李飞刀已经不带刀,此时无招已经胜有招。

俗话说:“优点不说没不了,缺点不说不得了。”下面说说本书的缺点,那就是:对每一部分的内容并没有详细地介绍。所以你不要指望着阅读完本书,你能熟练地使用shell脚本,写出复杂的makefile并通过Git高效地与人协作。坦白的说,这也并不算是缺点。这本书的目的就是告诉你,当你想干XXX的时候,有YYY工具你可以用,而YYY工具的基础用法是ZZZ。 当你发现ZZZ并不够用的时候,你可以去找专门的介绍YYY的书。这个时候你会发现完整介绍YYY的书,它的厚度足以挡住狙击步枪射出的子弹。客观点说,这也算不上啥缺点。没办法,任何和UNIX相关的东西,都有吓人的学习曲线。你想要“会当凌绝顶,荡胸生层云”,那么曲线必须要很陡才行!

最后说说本书面相的对象:首先,这本书并不是教材,虽然本书的后面有一个简短的介绍C语言的附录,我没有骗你,它确实是很简短。请注意我的用词,我只是说“简短”,并没有说“简单”。所以如果你是一个C语言的初学者或者是零基础,这本书并不适合你。

这本书的面相对象是:有一定C语言基础的高年级学生,或者是一些使用C语言作为主要开发语言的工程师。对于高年级的学生,它们缺乏的是一种对大的编程环境的认识。 而对于使用C语言的从业人员,这本书会让你对C语言有不一样的认识,它对你多年使用C语言形成的习惯和风格提出了挑战,让你有一种“原来C语言也可以这些用”的赞叹!然后让这些反规则去湮没你心中存在多年的规则,从而爆发出巨大的能量!

有的时候,书和读者之间是讲点缘分的。 有的时候读者会问什么是好书?我认为:你看懂的,有收获的都是好书。有些人看见花,有些人看见草,而我只是把你带到草地上。最后,我为本书做了一个网站: http://zhaoyan.website/xinzhi/c21/book.php 里面对每一章都有我的观点,推荐的补充内容等。对于本书的“每部分内容过于简短”这一缺点,我做了一些有益的补充和修正 。Enjoy It!

赵岩
02/11/2017

《C语言点滴》读者来信及回复

赵岩老师您好!我是一位来自四川的大二的男同学,是一名C语言的初学者,那天我冒着大雨在成都书店看C方面的书,最后买了您的那本《C语言点滴》(现在想想冒着大雨还是真值得哈:),您的书实在很有趣,我并不是计算机专业的学生,但您的书让我能了解了很多其他的东西,生动而有趣。我那天晚上花了一晚上去看一个关于 列指针和行指针的程序,看了半天头疼,翻开您的书看了指针那一章,我一下子就开窍了! 非常感谢您用生动的语言让我这样自己抱着各种书本自学C语言的学生体会到了轻松的味道! 我是一名自学者,现在学完了C语言的入门内容,我尝试编写了闹钟程序和通讯录程序,但是我现在有点迷茫,我的目标其实一方面是想学些编程方面的东西来自娱自乐,但是更多的方面其实是有那么一天我能帮我爸编写一个期货方面的软件,也就是说,我学C其实是想编写软件吧! 我想请教老师,如果我的目标是编写软件,我现在应该去学习和锻炼哪方面的内容,在您书内有一张这样的图,关于以后学习的方向,我是不是应该朝着“产品开发”方向去学习呢?我有没有必要学习其他的语言呢?

————————————回复———————————-
首先是感谢你喜欢这本书。尤其是冒着大雨,我猜一定是买完本书以后,又把书顶在头上跑回了家。最开始出版的时候,我就告诉陈冀康编辑书价要尽量便宜,陈编辑补充说再便宜也要塑封皮。如何分辨女孩背的是否是山寨包,一到下雨天立马就知道了,顶头上的都是山寨包!塞到衣服里的都是正品。为了提高本书在下雨天的销量,不得不佩服,编辑就是高!

我本来想写点鸡汤文鼓励你一下。但是现在人已经不再看完鸡汤文就跟打了鸡血般兴奋了!所以还是说点白话。总结为三个建议:

第一,我个人感觉不需要学习其他的语言,你需要把C/C++两种语言精通即可。我说的精通是指深入的精通,不仅需要知道每个语言的特性,还要知道为什么要有这个特性?这个特性最常用在什么地方?等等深层次的问题,而不要仅仅停留在语法层面上。 就像我书中介绍的C语言的函数指针,彻底了解它,你就会知道C#中一定有对应的东西存在,只不过叫做“代理”了。它们背后的概念和思想才是最有价值的,就是模拟出一个接口,来提高系统的模块化。至于在C#中如何定义一个代理,我写不出来。但是有一台联网的电脑,写出来也就是一分钟的事。

第二,多动手。以英语为例,你一定有这个体会,你可以看懂一篇文章,现在让你说一遍这篇文章的大意,你立马傻眼。背后的原因在于知识分为被动知识和主动知识。那些看到就明白,自己却不会用的是被动知识。对你有用的其实是主动知识,而且人的主动知识是被动知识的一个很小,很小的子集。要把被动知识变为主动知识,唯一的途径就是去使用,去动手。用过几次,错过几次,才能变成你的主动知识。切记,切记,切记!

第三,有没有想过为什么人一磕瓜子就停不下来,而一看书就不行?这是因为磕瓜子把一个大任务分解为很多小任务,而每个小任务都有回报!而看书恰好相反。所以在学习的路上,按照磕瓜子的战略去学习。不要上来就想编一个期货软件,今天写个hello world,明天打印个心型,后天在心上加个箭。。。。。。。

最后,说点题外话。这个世界并不是按照程序在运行。你发慢慢发现原来小成靠勤,中成靠命,大成靠爹!C/C++语言可能改变不了你的命运,但是你磕你的瓜子,毕竟也是带壳的!如果学习C/C++语言能带来些快乐,那就做一个快乐的程序员吧!(结尾上碗鸡汤,老磕瓜子人也容易上火。)

川普当选证明了一件事!

起了这么一个废话标题,主要是怕你不看正文。现在人们早上一睁眼就有200个奏章要批阅,10个需要回复,50个需要转发,100个需要点赞。一秒钟几十亿的买卖,那有什么时间看正文啊。好吧,我就买个关子,不把答案放到标题里:)

早上国内的大姐问我,是你喜欢的总统吗?我也不知道怎么回答。要说喜欢,那一定是谈不上的。我和身边的大部分人都有一个共识:这次总统选举,只是选择一个你更不讨厌的!从结果上看,川普赢得有明显优势。什么原因让希拉里这位又有钱,又有媒体支持的候选人一败涂地呢?下面我只说说我的个人感受。

首先,对于具体的政见,我完全无感。治大国如烹小鲜。这并不是说治理国家容易,而是说治理国家很难,如果剧烈翻炒,小鲜一定不保(要说文章对账押韵,我只服自己。)增加税收好,还是减少税收好?我完全不知道。 大部分两个人的政见,其实都是一些没有标准答案的open question. 你又不是专家,就算你是专家,社会问题和经济问题的复杂性也已经远远超出了你的想象。 一些貌似靠谱的想法,一旦运行起来,效果可能不那么靠谱。更何况大部分总统一旦选上,马上就把承诺的想法丢出了窗外。更甚的是,有些政见已经有点滑稽了!排在第二位的是让墨西哥出钱修墙,排在第一位的是和中国谈判。这些可笑的政见其实都反复的证明了一件事:“天才总是缺乏自信,而蠢货总是自信满满!”

如果不靠政见,那靠什么选总统?靠人品吗?现在有两位候选人:一位是不诚实的政客,会星象占卜,有婚外情的老烟枪和酒鬼。 另一位是一位受勋的战争英雄,素食,会画画,不抽烟喝酒。你选后者吗?其实上面两位的名字分别是丘吉尔和希特勒。我只想选总统,不想选什么共和国脊梁或者什么感动中国。你让人民过好日子,这就够了!你真不真城?你交不交税?这些都是小问题。再说了,如果回顾历史,好的政治家中有几个是好人?明朝的永乐皇帝,首创“灭十族”。唐朝的李世民,杀兄弟。华盛顿卖奴隶,克林顿嗯嗯嗯。正所谓:保暖思淫欲,贫寒起盗心,人哪有好时候啊!

我想你也快烦了,叨逼叨逼半天,你到底要说啥?我要说的是:川普当选证明了一件事,那就是不要忽略了沉默的大多数!

举个例子:你在微信上建了一个500人的群:今天发个美颜,20个人点赞。你很兴奋。你觉得大家都喜欢你。这20个赞鼓舞了你,你再接再厉,发个笑话,又有15个人点赞。这太好玩了,你继续发一个动态,又有10个人点赞。现在问题来了,第一你有点上瘾了,第二点赞的人越来越少了。怎么办?你开始发红包,开始要求你的朋友去给你点赞,开始开挂,开始圈粉。整个过程貌似完美,但是你忽略了一件很重要的事,群里其它455位从来不说话的人。

也难怪,他们从来不说话,所以你默认他们都是喜欢你的。即使不喜欢,那也应该不是讨厌才对,因为它们从来也没说过啊!你忽略了一件基本定理:赞美这个事,大家是会说出来的,而且通常会组团说。而讨厌这种情绪,这是非常个人的感情,而且一般人们不会说出来。所以真实的情况就是:当你发第一张美颜的时候,30个男人觉得你穿的多了,30个女人觉得你臭显摆。当你发第二个笑话的时候,10个有烦心事的人就不那么痛快。当你完全没有意识到这一点,开足马力开始开挂,圈粉,开始催促别人去给你点赞的时候,讨厌的情绪开始蔓延。而你对此却一无所知。

现在回头看看民主党,看看希拉里。最开始默许同性恋,收获了一片点赞,并宣城这是人权的伟大胜利。这个时候,如果批评,政治就不正确了,再说和我又没什么关系。我就是一个吃瓜群众,如果聚会管盒饭,我也去参加表示支持。

再然后就是同性结婚合法了,好多同性恋者骄傲的对外宣布出柜并结合,这又是人权的一大胜利。这个时候我有点小情绪了。这个东西要是合法了,万一有人在我面前不怀好意的丢一块肥皂怎么办?可能有点想多了,只要不是碰上特别喜欢油腻口味的,我就是安全的。不过人家都骄傲的出柜,回头看看自己女性的妻子,突然间情绪就痴狂起来。不仅想起了红楼梦里的一个经典片段:“孽障!你生气,要打骂人容易,何苦摔那命根子!”宝玉满面泪痕泣道:“家里姐姐妹妹都没有,单我有,我说没趣,如今来了这么一个神仙似的妹妹也没有,可知这不是个好东西。”贾母忙哄他道:“你这妹妹原有这个来的””!(要说讲段子,我只服自己。)

这个时候希拉里已经对点赞上瘾了,她完全忽视了那455个沉默的人。她开始圈粉了。允许男性根据自己的性别认识进洗手间!坦白的说,对同性恋这这件事,我已经很宽容了。我不会反对他们,但是我会和他们保持距离,因为我想大部分人都会和我一样,或多或少地感觉到werid。但是现在,你偏要把这件事硬塞到我的日常生活中,这让我有点难以接受了。 虽然我还是沉默,但是讨厌的情绪已经迅速攀升。

上面只是一个例子,希拉里的很多主张,其实都在重复这个错误的路,政治无比正确的开始,只有赞美而没有批评后的变本加厉。然后是越走越远,使得讨厌的情绪在沉默的大多数里开始蔓延,而她却完全不知或者忽视那些沉默的大多数!

说了上面这些话,并不代表我喜欢川普。美国政治最大的优点就是各种力量互相制衡。所以谁上台都不会有什么天翻地覆的革命性的变化,只是在一个合理的范围内或左或右。无论是你想骑驴还是想摸象,饱含东方智慧的一句谚语送给你:**不能靠政府!**是通配符,可以代表任何事。

生活就是一场修行

是时候谈谈宗教了,这是一个敏感的话题,无论中外。(Never talk about politics and religions at the dinner table)。不过周围越来越多的朋友都加入了基督教,甚至还有我的家人。除了正规的宗教以外,家人中还有人对怪力乱神很是感冒,甚至起个名字都要去问一问大师。不过最近听说大师的儿子被公安抓起来了,具体原因不详。正是印证了那句名言:我参得透生死,但是参不透政府!

你们以为我要开始喷宗教了?错!我对宗教很是尊重的。而且我从以前的无神论者变成了现在的未知论者了。

个人认为对宗教有两个错误的认识,其一就是:试图用自然科学去推翻它。宗教本身就不是理科的范畴,我明明是大眼睛,双眼皮,却偏偏喜欢林忆莲。而你也解释不清楚为啥会喜欢一首歌。有的人长的像个猪头,可是他妈就是觉得他好看,他媳妇还就怕别人来抢。这都没办法解释清楚。

就算回归自然科学本身。它本身还不是完备的。现在还是没有办法回答一些根本的问题。例如:极大无外,极小无内。那么宇宙是最大的吗?不知道!最小的东西又是什么呢?科学家最近热衷的弦理论,认为弦就是最小的不可再分的能量单元。而且据说从数学公式的角度推导是成立的。但是如果公式成立,那么需要有11纬的空间存在。而且进一步推导,平行宇宙也是成立的!

Monkey-With-Shocking-Face-Funny-Image

好吧,我懂了! 科学家说有平行宇宙,上帝和佛说有天堂和地狱。其实它们都是一样一样的啊!

再来说说最近的量子卫星,量子物理里有一个有趣的实验:从电子枪里射出电子,通过前面两个小缝,会在墙上留下衍射图案(条状条纹)。这是高中物理就讲过的波的衍射,没啥稀奇的。但是如果我们每次让枪只射出一个电子。然后反复重复多次后,你会发现衍射依然存在。这个就有点说不清楚了。
Double-slit

为了搞清楚怎么回事,科学家在一个缝上安装了一个探测器,这样如果一个电子从一个缝上经过,那么它就会被探测到。结果就是安上探测器后,衍射消失了。目前经典的解释就是我们测不准它,因为我们一旦测量它,就改变了它的状态。那么不测量前它是个什么东东呢? 听听科学的解释吧:如果你不测量它,他就是一团概率,然后概率一分为二,从两个缝隙穿过,最后发生了衍射。

maxresdefault
好吧,我懂了!我射出一团概率,现在先不测量它,十个月以后,我就知道是男孩还是女孩了!

人工智能的发展,最牛逼的就是alphaGo了。做为一个计算机从业者,我还是要说两句的。很多人都说这是人工智能的一个转折点,一场革命等等。如果就从这个例子出发,人工智能的转折点不在于赢,而在于如何能够体面的输。例如你和习大大下围棋。这个时候最优解就不是赢,而是输。这还不容易,只要你按照五子棋的规则去下围棋,一定就是输的。不过这种输不仅虚伪,而且还暴露了自己智商 。这个时候最优解就是全盘都要激烈缠头,形势十分接近。眼看着在最后难分难解的情况下,你表面输了,但实际上你赢了!哪位计算机大拿来帮我实现这个模型?

20150603143200

好吧,我承认我以我的小人之心去为难科学了,那么也请你不要用半懂不懂的科学之心去为难神学,中不?

对宗教的第二个错误的认识,就是其中的神力和功利。目前世界上有三大宗教,佛教,基督教,还有伊斯兰教。伊斯兰教的教义我不是很懂。有一次我看见了三个伊斯兰的妇女,准备好好了解一下它们的文化。但是问了半天,它们也不说话。最后才发现原来是三个阳伞。

home

在佛教和基督教中,神力和功利都是存在的。如果我们仔细分析这三大宗教,你会发现这三大宗教都是伴随着一个帝国的发展,经过了自己的拐点以后,从而发展,壮大。佛教借助于中国的唐帝国,基督教借助于罗马帝国,而伊斯兰教更是借助于阿拉伯帝国弯刀的扩张。纵观历史,政权和神权都是有套路的,那就是你给我授权,我帮你收钱!而其它的宗教,如果不要套路出牌,结局就是:太平天国遇到了曾剃头;某轮遇到了某江!说到底,宗教的发展还是要借助于俗世的力量,所以说神力是否真实存在,我一直心存疑问。说到底,神学最好也别和自然科学冲突,要互相尊重。把自然科学的问题留给自然科学解决。你的电脑坏了,最好找人来修,这个时候祈祷是帮不了你的。

另外就是宗教中的功利性我也不喜欢?如果你信了,你会如何如何!如果你不信,那么如何如何!宗教不都是讲究大爱吗?如果这样功利,人家不信就倒霉,人家信你就走运。这个到底又有什么道理呢?

我的感觉是:我们每个人,无论是谁,目标都很简单:就是吃的好点,喝点好点,每个人都听我的。但是这个世界并不是只有你自己。当这个世界有两个人的时候,无论是从经济学,哲学,还是科学,如果把眼界放宽,把眼界放远,你会发现每个人吃一半,每个人喝一半,每个人听一半话。这才是最终的全局最优解。而宗教的作用不应该是用神力或者功利来保证你独占,而是要帮助你克服你的自私和贪念,能够让你愉快地和别人分享和共处,而这才是宗教的本源。

世界上没有神力,控制它的也只是概率。你能做的就是坦然的面对各种事件。生活就是修行,辛苦上班是修行,抚养子女是修行,尊老爱幼是修行。 孩子闹人,你想上去踹她一脚,这个时候神出现了,他对你说:亲生的,亲生的!你后来蹲下来和孩子讲道理;你和老公吵架,想摔东西打架,神又对你说:你选的,你眼瞎!你后来到别的屋安静了一会;你老板让你加班,你把菜刀放到了背包, 神又对你说:他给钱,他给钱!你后来取出了菜刀,放进了笔记本电脑;总而言之,做一些必须干的事,虽然有些未必喜欢。远离一些事情,虽然这些事情自己很喜欢。而所有这些,其实都是修行!而我认为,这种修行要比念经,要比礼拜来的实在。你这样修行,结局未必保证就好。但是日积月累,你的生活不会太差。能够保证不差,难道这还不美好吗?

中越之战系列2—一场失败的胜利战争

前一阵看完了凤凰大视野的《燃烧的主峰-老山主攻团记实》,随后写了一篇博客,博文如下:http://zhaoyan.website/blog/index.php/2016/05/28/laoshan/

这个周末又看了凤凰大视野《烈火战车-坦克兵越战亲历记》,对这场战争的了解又深了一步,这里首先感谢凤凰大视野,以亲历者的角度,没有感情色彩地讲述故事,剩下的留给你自己思考。正是有了这个节目,你知道了洪秀全发烧30天后,醒后自称上帝的弟弟,创办了太平天国,知道了袁世凯的小站练兵。 知道了戴笠成功诱降周佛海,搞死李士群。知道了更多的蒋公的抗日和毛公的文革,而所有这些,在你的历史课本中,往往就是一句话。这一句话的后面,有你不知道的壮阔,也有你想不到的不堪!

回归正题,中越之战可以分为两个部分:1979年2月到3月之间一个月的进攻作战,我方以40个师的兵力,从云南和广西两个方向突入越南境内80多公里。以及后来我方全面撤兵,开始了1979-1989年十年之间边境地区武装对峙和拔点,反拔点作战。我上一篇博客写的是十年之间拔点作战的经典战争,老山之战。而这篇博客描述的是1979年2月17日开始的进攻作战。

先说结果,个人观点认为一个月的进攻作战是一场失败的战争。原因如下:
1)我方战略目的之一,迫使越南从柬埔寨撤军!当年围魏救赵的前提是你可以放开手打击魏国,但是当时的国际环境却不允许你这么做,越南和苏联已经是军事同盟,美国也公开表态,要求中国撤兵。当发现越南没有从柬撤军后,邓小平不敢再将战争扩大化,所以只能从越南全部撤军。

2)我方战略目的之二,全歼越南北方精锐师。原本通过大迂回,快穿插来切断敌人后路。结果却是越军最后从容撤离。在上一篇博客中我已经批评过穿插了,这里就不累述了。

3)越军的战略目标就是节节阻击,有效杀伤。结果战争完全按照越南人的节奏在进行。我军付出大量人员伤亡,在越军主力从容撤退后,占领了空城高平,随后又无奈撤退回中国。

造成这场战术失败的原因很多,主要有两点:我方大部分都是新兵+糟糕到令人发指的指挥。

先说兵员,1979年,我军连以下的军人都是没有经过战场的新兵,而另一面是刚刚和美国缠斗了多年的越南兵。当时越南方面的推测是在军事素养方面,越方一个士兵顶中方十个。有些夸张,但是也有其道理的。武器方面大家不相上下,我方有一门大杀器:毛泽东思想。而越方也刚刚从苏联那得到了很多装备,包括冰雹式反坦克火箭筒。

再说糟糕的指挥,高平是越南北方重镇,距离中国边境线80公里。上级的任务是坦克团3个小时穿插到哪里,然后就可以阻敌后路,然后就可以全歼,然后就可以。。。。

经过整整一天的战斗后,我方坦克团穿插了3公里!!好吧,敬爱的指挥员通知,你们有没有想过为啥美国人在越南从不用坦克,而只用直升飞机呢?美国没有坦克吗?战场上都是用秒计算的,你们这3个小时穿插80公里是咋算出来的呢?无所谓了,谁还不出点昏招呢,我理解。

接下来,新的命令又来了,由于越南境内有很多地雷,所以坦克搭乘步兵一起前进,为了不从颠簸的坦克上掉下来,很多步兵把自己捆在了坦克的扶手上。然后坦克带着这些反应式“装甲”出发了。结局我想你会猜到了。很快,大约半天以后,命令就取消了。在这半天里,到底发生了什么呢?

别苦笑,因为昏招还没完呢?开战都快两天了,指挥员的命令又来了:坦克脱离步兵,独自穿插!好吧,继续开。脱离了步兵以后,坦克威风凛凛,一路冲杀到复杂地形的博山后,遭到越军伏击。坦克炮仰角有限,毫无还手之力。一个13岁的越南孩子用冰雹火箭筒,敲掉中国的三辆坦克!

好吧,损失了45辆坦克,死了45个人(45个人是官方数据,大部分损失的坦克都是殉爆方式,而那个时候中国坦克的乘员是4人。)坦克团终于到达了距离高平几公里的地方。上级命令又来了,停止前进,原地布防。为啥呢?这个时候,战争已经进入第四天,我方的指挥员可能有点明白了,越南人这个时候可能,大概,保不齐,也许都跑了!坦克再穿插到高平已经毫无意义可言了。

大部分的老兵回忆起这场战争,用的最多的一个词就是“窝囊”,除了看见自己战友的尸体外,根本就没遇到多少越南人。我能理解他们。仗打到这份上,确实有点窝囊。

失败就失败了,为何又是一场胜利战争呢?我们把视野放远。伤亡数字应该是高度机密的,但是我想邓小平会知道这个数字。在兵员比例接近20:1的情况下,中方的伤亡数字一定让邓公很不满意。为啥呢?在1985年,邓小平评价自己的军队“虚胖”,然后开始百万裁军。这个说起来容易,一个路边摆摊的,你去掀人家摊子,人家都跟你拼命呢!更何况是一百万军人(大老粗),你去砸人家饭碗,困难可想而知。各种困难报上来后,小平用浓重的川音说了一句:“想不通就换头头。”可见决心之大。经过这场战火,我们暴露了软肋,也感谢这场战火,我们才能有了现在这支较为现代化的军队。

于此同时,中国进行了改革开放,加入世贸等等。而反观越南,经此一仗的胜利,越南人全民动员,在穷兵黩武的道路上越走越远,直到十年后苏联解体,那个时候,越南国内几乎都吃不上大米了。如今看来,经此一役,中国已经不是中国,但是越南还是越南,这么说来,这场战争最终是我们胜利了!

战争对人的伤害是巨大的,每牺牲一个人,就是一个家庭的灭顶之灾。每伤残一个人,这个家庭就会陷入无助的贫困。就算是全身而退的战斗英雄,也面临着post-traumatic stress disorder;PTSD(创伤后压力障碍)的困扰。这个时髦的词我还是从美国媒体上听到,我还一致疑惑为啥中国没有这个病,直到我看到了老山战斗英雄刘亮华的故事,http://phtv.ifeng.com/program/lnrs/detail_2014_05/07/36192827_0.shtml 我才知道它确确实实存在。

现代战争的残酷,已经远远超出人类精神所能承受的上限。你想去捡个钢盔,却发现里面有半个脑袋,这半个脑袋上的一只眼睛还睁的大大的看着你。一声炮响,你身边的战友的头骨就被削掉了一块,红红绿绿的东西就流了出来。坦克殉爆后,你去捡回战友的半截身子,浇上柴油烧,这个时候你得戴上防毒面具,因为这个味道你根本就受不了!!

另外的地方,在每一个烟熏火燎的烧烤摊,大家正在热烈讨论着南海应该先派那只舰队?舰队应该什么样的阵型?你这样不行,按照我说的才能干掉美军的航母!现代人对战争的认识大部分来源于连续剧《亮剑》和电脑游戏。我必须承认,我也是爱国的!南海是中国的,南海里面沉睡的小鱼也是中国的!那么,邢台村庄里面沉睡的小孩是谁的?他们也是中国的吗?