解铃还须系铃人,我们看看胡渊鸣博士本人是如何解决这个问题的。
在他专栏那篇分享编写taichi过程的文章里,他提到了这么一件事。
在费城一个烟雨蒙蒙的晚上,我们几个作者(Yu Fang,Ziheng Ge,Ziyin Qu)集中在蒋老师的实验室,经过一系列讨论,我突发奇想:既然APIC的affine velocity field和MPM里面的deformation gradient update需要的都是velocity gradients,那能不能用moving least squares统一两种离散化?我快速的实现了一下,发现确实可行,但是问题是这个新离散化理论上是否有原来的MPM的精度?那天晚上我们去吃了顿中餐,一路上一直在讨论这个问题。吃饱了饭,晚上我们一直工作到凌晨3点,当时我已经困得不行了,只记得蒋老师突然兴奋的说了一句“weak form推出来了!算法是weak-form consistent的!” 我看了一眼蒋老师草稿纸上的推导,平均每个符号有3个上下标(alpha, eta, i, j, k,下划线,双下划线,等等),似懂非懂,只知道有了这张草稿,算法的物理正确性算是有了保证。后来我花了两整天的时间才弄懂蒋老师那晚上推出来的公式。(蒋老师是中科大少年班毕业,只比我大四五岁,却已经当了一两年教授了。相比之下我那时候还没开始读PhD...)
注意我加粗的部分。
蒋老师半天解决的问题,作为姚班的大神,胡博士花了两天才看懂。蒋老师当了一两年教授了,胡博士比他小四五岁,却还没开始读博士。
从推物理公式的能力上来讲,胡博士跟蒋老师差的很远。从学术职称获得的速度上来说,那差的更远了。蒋老师开始做教授的年纪,胡博士可能博士还没毕业,更别提之后的博后生涯。
那么,胡博士是如何应对这一差距的呢?
他到底要如何才能减少自己同蒋老师的差距,如何才能加速自己的毕业,加速自己的学术职称获取,有没有可能弯道超车拿到更大的头衔去盖过蒋老师呢?
答案是,他并没有拿自己去跟蒋老师比较。
他继续开展自己的工作,希望可以做出对行业有贡献的成果。
由于种种原因,我的Ph.D.第一年很难说过得有多愉快,不过还是发了6篇paper。在“一年内发出的ACM Transactions on Graphics的数量”这个指标上,我感觉可能很难再刷新自己的记录了。“既然已经发了足够的SIGGRAPH,不需要再追求数量,现在也没有太大毕业压力,不如用剩下来的时间和科研自由做点真正有意义的事情,比如说提高整个社区的生产力。” 我这么想。
众所周知,发一篇SIGGRAPH的工作量实在是太大了。大部分SIGGRAPH项目耗时1-2年,在北美有2-3篇SIGGRAPH一作一般就能PhD毕业了。功利地说,最近几年发SIGGRAPH的性价比是比较低的:工作量大,要求高,发出来引用量还比较少。尽管如此,我还是很佩服在这种模式下做出的高质量文章,比如朱教授PhD期间的codimensional流体模拟系列。要么不发,发了就要保证高质量、问心无愧,做出突破性的工作,这也是我的目标。
从这两段话当中我们看到,胡博士本人并没有太过考虑别人的成果对他的压力,也没有太在意优秀的同行同他的对比。
他想的是,我的文章够了,那么我应该做点对行业有帮助的工作。这个领域的工作性价比不高,但是可以做出突破性的工作,那么这就是我的目标。
就连比较,他也是在和自己比较——这个指标上,我感觉可能很难再刷新自己的记录了。
事实上,我看到的各个行业内做出成果的人,都有一个很重要的素质:习惯同自己比较,专注于解决自己的问题。
同外界进行比较,和现有工作横向对比,确定自己的位置和能力,这确实是我们认识世界认识自己的重要手段。但是,认清自己,是为了更好地完成自己的工作,而不是把终极目标定成【同别人的强弱】,否则就因果错乱,生活就拧巴了。
胡博士在图形学、物理仿真、编写引擎、优化算法甚至蒸鸡蛋方面可能都比你强。
但是,这并不代表你的能力突然就变弱了,你还是你自己,有自己面对的问题,有自己的学习方法和成长路线,有自己的技能包和知识库,你接下来做的事并不是沉溺于自己同别人的差距,而是扎实学习自己领域的知识,培养自己的能力,解决更多更复杂的问题。
你不可能突然变成别人,你有你自己要完成的使命。
他让你看到,作为一个真实的人类,确实是可以在年轻时就取得领域重大成果、造福一个行业的。
但这些都应该是促进你工作的动力,而非你自我贬损的理由。
基本上只要肯花时间,所有的知识你都能学会
问题是你没有时间
所以你要有所取舍
你写不出这样的代码只是你没有投入那么多时间去学
不代表你智商不够
每个人都有自己的专攻的方向
关键是你如何选择
选择一个适合自己的方法去钻研
你也可以成为领域专家
搞一个自己的技能树
没人能够通晓所有的知识
关键是选择
在回答里看到很多不着调的鸡汤,以及很多阴阳怪气的言论什么99行怎么不封装成1行的论调。我想说几句:
目录
首先,很负责任地说,媒体为了搏眼球确实是什么标题都敢写,这99行代码不但没有“实现冰雪奇缘”, 甚至也没有实现 冰雪奇缘 中雪仿真所使用的算法。要实现当中完整的算法,大概需要约200行,但任然距离实现“冰雪奇缘”所使用的系统有一定距离,离实现“冰雪奇缘”有更多的距离。
这里分两点来看,第一冰雪奇缘中的MPM算法,是一个隐式的MPM算法,其中还要包括一个迭代求解的过程来提高mpm数值积分的稳定性以达到总体上更为经济的运算速度,详见论文的第6页到第8页。所展示的实现,是一种显式的时间积分,媒体报道存在偏差。
离制作冰雪奇缘中雪仿真的“系统”(或说工具),还有一定距离,在这一点上,或许得要再加一定数量的C++代码以及几十行(甚至几百千行)前端代码,才有可能实现一个带UI,能让艺术家用鼠标操作, 能加载不同的美术资产,能用来制作雪仿真镜头的制作工具。比如集成一下轮子哥 @vczh 的GacUI。 当然对于胡同学,这不是难事。
那么离作出“冰雪奇缘”我相信智商正常的人都知道,那个距离更远了。
接下来我要说说为什么是99行,不是1行, 不是command line....因为见到太多的阴阳怪气的评论了,所以在此为胡渊鸣同学正名。所以我要解释一下taichi_lang到底做了什么,为此我要分出几个小标题:
2.1 什么是稀疏数据结构?什么叫low-level engineering?高性能计算为什么要关心这个?
2.2 太极语言的重要贡献是什么?它还有什么问题?
2.3 物理仿真的可微分编程并不玄乎。
为了逐步引导大家能与 @胡渊鸣 “对话”,我要先帮大家建立一下知识体系。在这个知识体系中, 最重要的一个概念是运算的 内存连续性(或说缓存命中率)。
我们来看一个最简单的例题: 有一个巨大的数组, 我们要对其每一个元素做一个运算f,使得输出x(i) = f(x(i)). 写成for循环大概是这样
for (int i=0; i<num; i++) { x[i] = f(x[i]); }
串行的代码,我们等之一个个执行就完事了。但假设此时你有多个计算核心,你很自然地就想去并行化这个运算,假设你有N个线程, 每个线程你想让他处理k=num/N 个数, 你的并行程序大概是这样写的:
parallel for N threads: { int tid = getThreadIdx(); for (int i=tid*k; i<tid*k+k; i++) { x[i] = f(x[i]); } }
但是这个并行法并不是最优的。(呼,终于引出我们的知识点了)
我们来仔细看一下到底发生了什么, 首先内存在系统中是连续存储的, 一般来说, 当我们对内存进行操作的时候,cpu实际上会加载一小段连续的内存到cache里面去。
如果我们紧接着的操作就是对cache里的内容进行的话,效率是极高的!
上面那段并行程序, 当线程0在处理第0个元素的时候, cache中比如说加载了大约第0~64个元素。 当它在进行计算f(x)的时候, 系统切换到线程1,但是线程1却要去加载第k = num/N个元素! 如果k>64, 就会使得系统不得不扔掉cache中的元素,再加载第 k~k+64 的元素进cache,这就造成了一次cache miss,导致了你的程序低效。
我们再来看第二种写法
parallel for N threads: { int tid = getThreadIdx(); for (int i = tid; i<num; i+=N) { x[i] = f(x[i]); } }
在这个并行写法中, 假设有N个线程的话, 第0个线程会处理第0个, 第N个, 第2N个,第3N个。。。元素, 第1个线程会处理第1个, 第N+1个, 第2N+1个元素以此类推。。。。。
在有些情况下,第二种写法会比第一种写法的运算速度快出不少。这是为啥?因为当第一个线程在执行f(x)这个计算的时候,切换到第二个线程,第二个线程要处理的内存就在cache里!。
注:这不总是对的, 事实上,运算的效率和你分配线程的方法完全取决于你的物理核心的数量以及每个物理核心上的线程数量,但为了简化讨论不引入更多的麻烦,让我们假设每个物理处理器会handle多个细粒度的线程然后同一个处理器上的线程会去接触同一个cache.
这便是缓存连续性。
那么这和物理运算有什么关系? 和稀疏结构又有什么关系? 其实稀疏结构,物理运算以及缓存命中这几个概念,在和物理,应用数学有关的高性能计算领域基本上是常识。
首先我们来考虑一个2维的热扩散问题:
程序1:
for(j=1:DIMY-1) for(i=1:DIMX-1) in parallel x_new(i, j) = x(i,j) + dt * nu/h^2 * (x(i-1, j) + x(i+1, j) + x(i, j-1) + x(i,j+1) - 4*x(i,j))
以及一种最简单(naive)的内存存储方案。
x_new(i,j) = data[j*DIMX + i];
这里的问题是, 由于每个 x(i, j) 的 update,都需要访问其上下左右四个格子的值 ,其中在访问左右两个值的时候,缓存命中率是极高的, 但是在访问上下两个值的时候, 缓存命中率是极低的!!
因为访问x(i, j+1)需要在线性内存上去拿data[j*DIMX + i + DIMX]的值, 由于DIMX通常都不小,这就导致了计算机要把自己的cache里的内容扔出来,然后再加载新的内存区的内容到cache里, 更糟糕的是接下来再去访问下面那个元素的时候缓存又miss了。
这就导致了计算的低效。
那什么是高效的计算呢?????
比如我们可以设计一种新的数据layout 方式:
数据结构1:
double block8x8[64]; std::vector<block8x8> grid; grid.resize(32*32); // which means a compute domain of size 256x256;
此时会发生什么?凡是一个2D 8x8 block内的元素, 都在连续内存段上!即当你在处理第(i,j)个元素的时候, 它的上下左右元素大概率都在高速cache里面。(除了边上那些, 事实上边上那些还需要通过预读取以及优化的遍历顺序来做)
但此时你的for循环, 再也不能那么naive地来写了!。。。。你的for循环大概得这么写:
程序2
for num_threads in parallel: int blockIdx = getThreadIdx()>>5; //(a/64) int block_i = (getThreadIdx()&63)&7;//(a%64)%8 int block_j = (getThreadIdx()&63)>>3;//(a%64)/8 for (int b=blockIdx; b<total_blocks; b+=num_threads/64){ double value = grid[blockIdx][block_j<<3 + block_i] + balabala; grid[b][block_j<<3 + block_i] = value; }
在这段并行程序中, 你的第0~63号线程都在处理第0个block中的元素(全在一个cache里)第64~127号线程都在处理第1个block中的元素,以此类推。
稀疏结构则比这个更多一步, 再用一个额外的hash过程来储存这个block, 目的是那里有物质, 才对那里进行计算。
到了3维的真实的物理问题的时候, 会更麻烦一些, 速度分量u v w是不是放在一起?是打包成float4 block4x4x4[64](AOS array of structure ), 还是打包成4 x {float block6x6x6[216]; }(SOA struct of array ), 还有AOSOA, SOAOS。。。。。到底那个更划算?
所以taichi这个工作的其中一个目的是:你写一个程序1, 然后给定数据结构1, 自动的把程序2给翻译出来, 彻底地解耦数学逻辑的书写和数据结构的设计,把算法设计者从low level engineering中解放出来。
为了达到这个目的, 它不是一个封装和调用的过程, 而是在执行一个解释和编译(翻译)的过程。
那99行, 不是在调用一些封装好的功能, 而是确确实实地写了一个算法,然后这个算法被解释器成为了高性能的cpu或gpu并行代码。其中这99行东西, 不是太极的工作, 背后那将这99行东西解释为c++/cuda代码的东西,才是太极做的事情。
那么太极语言存在什么问题?
扫一下这99行代码, 出于内行的敏感, 还是比较容易发现一些很严肃的问题的:
for p in range(n_particles): # Particle state update and scatter to grid (P2G)
在这一行代码之后, 执行了一个particle scatter to grid的操作,P2G
这个操作是具有racing condition的。两个距离较近的粒子是需要把某个计算过的加权值累加到同一个网格点上的, 如果两个线程在管理这两个粒子的话就会产生racing condition。
此时的太极语言从编程模型的角度讲可以有以下几种策略:
这就有些小问题了:如果我的写入操作是:
for p in range(n_particles): # Particle state update and scatter to grid (P2G) [i,j,k] = computeParticleIJK(p.x) [ii,jj,kk] = do some huge computation(i,j,k) grid[ii,jj,kk] = 1
咋整?这个corner case将是一个很狡猾的无需考虑racing condition的却某种意义上存在racing condition的操作。还是用操作3来执行, 效率明显低了。这样的狡猾的case,还能举出很多。
更有甚者。。。。如果反过来把grid的结构写得很差, 写成一个grid = arrayof[block256x256x256] 的结构, 这个逻辑肯定是要卡死。
所以此处小结一下, 太极语言, 其出发点是一个为稀疏MPM仿真计算设计的语言, 其编程模型也就极大地被“稀疏结构”和MPM这个需要p2g和g2p操作的计算模型给限制住了。(此处对MPM的优势和劣势的讨论不展开了)。
比如说, 并不是很容易想到怎么用太极来写一个有限元仿真, 或者用太极来实现一个通用目的渲染器(太极展示了渲染稀疏体素粒子的渲染器, 渲染三角形和贴图的光线追踪渲染器是non-trivial的)。在这些问题中, 要处理的几何元比粒子更为不工整, 且稀疏体素数据结构能帮上的忙会更有限。
当然做有限元的话, 有一个叫simit的语言( https://github.com/simit-lang/simit ), 选择了matlab的语法,然后编译为高性能的c++/cuda程序, 运算效率随便快个几千倍。 所以这么玩,在图形学界不新鲜。
不过我相信, 这些都难不住胡渊鸣, 并且他还没解决这些, 就一定是在解决这些的路上。
关于这个, 介于篇幅, 我会再写一个文章做详细介绍
硬核的图形学是一个交叉学科, 交叉了物理, 数学, 计算机科学, 编程等, 很多现在你们尚不明白的知识, 在你们学习, 掌握, 训练更多以后, 对你们来说就是常识。
先学熟爱因斯坦记号法, 再拿出纸和笔,虔诚地一页页地把物理仿真相关的course notes推几遍, 然后自己从头到尾实现一些论文, 数值线性代数, 数值分析, 数值偏微分方程, 凸优化, 这些书没事就看上几遍,曾经弃如敝履的泰勒级数、傅里叶分析、全微分偏导数,常偏微分方程,拓扑,线代,常拿出来学而时习之。有朝一日, 你也会发现一些胡渊鸣抓破脑袋都想不到的算法和点子。
我一个朋友一直以胡渊鸣为偶像, 但术业有专攻, 他后来也做出了一个算法让胡渊鸣佩服不已。
正如我在第一节所说的,
“太极离制作冰雪奇缘中雪仿真的“系统”(或说工具),还有一定距离,在这一点上,或许得要再加一定数量的C++代码以及几十行(甚至几百千行)前端代码,才有可能实现一个带UI,能让艺术家用鼠标操作, 能加载不同的美术资产,能用来制作雪仿真镜头的制作工具。
那么离作出“冰雪奇缘”我相信智商正常的人都知道,那个距离更远了。“
即使你自认做不出太极这样的工作, 你可以去学习Blender API, Maya API, HoudiniAPI, 把太极集成为面向艺术家使用的插件和工具啊, 在这一层上, 你和胡渊鸣的贡献是同等重要的。
甚至你可以基于taiji语言为MPM算法添砖加瓦, 设计出更好的数值方法和理论来进行物理仿真。
说了这么多,最后总结一下。习惯就好。
因为你不具备实事求是的态度。
如果你具备实事求是的态度,对一个你看不懂的东西,你不会自卑,不会崇拜,你会去研究它,了解它,等你了解了这项工作究竟是什么,你最终才能评价它,在这之后,或许你才会崇拜,才会自卑。
故而,你崇拜早了,自卑早了。
而一个实事求是的人永远不会神话。
如果你发现你不具备了解这项工作的知识储备,比如你不是计算机专业,比如你没学过编译原理,比如你不懂计算机图形学,比如你从事社会科学工作,对计算机科学并不了解。
那么你也不应该在现在就崇拜,就自卑。
因为当你不具备评价一个事物的知识储备的时候,你也应该明白一个道理:
唯有实践才是检验真理的唯一标准。
这个工作的贡献在哪里,意义在哪里,不是现在所决定的,不是现在有多少媒体流量所决定的,不是现在有多少人士拥趸所决定的,而是由时间,由实践所决定的,由未来几年后的,几十年后对工业界,对学术界所做的实实在在,切切实实的贡献所决定的。
当年:
“他选四卷”出齐以后,不少人建议他接着出第五卷。他认为新中国成立以前的著作,已经经过了实践和时间的检验,而之后的著作还不像之前的著作那样经过检验,所以,他不愿意仓促出版之后的著作。(来自他选集_百度百科)
看看,这便是他的态度,实践才是检验真理的唯一标准。
故而,在这种情况下,你依然崇拜早了,自卑早了。
我本科是计算机专业,我写过编译器前端,我了解一点计算机图形学,那篇专栏文章我也没看懂,没完全看懂,10个专业名词里面大概知道5个,我得到的结论是这项工作是一个库,更快,更抽象,更友善。
没有其它评价了,因为我也不懂,也不是我所在的研究方向,超出了我的知识储备。
至于这项工作能不能像TensorFlow一样,像pytorch一样,这需要实践和时间的检验。
所以,对于一个你不懂的东西,你究竟在崇拜什么,自卑什么呢?
我很费解,也很理解。
你是不是只注意到了清华,注意到了姚班,注意到了MIT,注意到了媒体狂欢,注意到了大V吹捧?
你怎么就没注意到这项工作之前二十年的研究过程呢?
你怎么就没注意到这项工作的其他几位合作者呢?
你怎么就没注意到这位胡渊鸣博士生在本科就实现了多篇相关的paper所带来的积累呢?
我觉得,是因为你没有用唯物主义来看待问题,反而倾向于英雄主义。
没有马云,也有赵云,没有胡渊鸣,也有陶渊明。
社会大势浩浩汤汤,我狭隘的经验主义告诉我:我越来越觉得世界并不需要谁。
以及,产生自卑也是不好的。
为什么要自卑?
我以前也很自卑,几年之前,我还在上大二,遇见好看的女生自卑,遇见名校的学生也自卑。
我遇到一个很好看的华东师大的女生,不敢追。
我遇到家境好的女生,也自卑,就是想追,就是不配。
有一次我看到一个答主的资料,清华还有CMU。
我当时不知道CMU,没听过,还以为是啥野鸡学校,我还在想为什么清华的学生要去这种没听过的学校,后来我知道CMU了,很惭愧。
我有段时间特别自卑,我当时看到有些人的学历是斯坦福,UC Berkeley就瑟瑟发抖,自惭形秽。
我当时看到一个知乎大V就觉得好厉害。
后来我读书越来越多,代码越敲越越慢,眼界越来越宽,受过的打击越来越大,自卑渐渐就治好了。
越过一座又一座围城,才发现城里住的人都没多大区别。
我是13级高考,这位胡渊鸣博士生也是13级的。
我考上江南大学,他保送清华姚班。
我至今没有paper,他已经......不说了。
作为同龄人,我是不是应该更加自卑,更加无地自容,更加膜拜大佬?
很多年前,我也这么想,后来我终于意识到,我已经在自己的人生里做到最好了,他过我的人生,过得不一定比我好。
我记得李吟李归农说过:
我想,最重要的就是要学会相信自己,像你这样动不动就请教大神的做法,在精神气质上就不对,恐怕很难达到高超的境界。只知道人云亦云,亦步亦趋,没有自己的主见,就算能成为一个优秀的人,也不可能达到卓越的水准。而现在体制内那些所谓优秀的人,大都失去了自己的个性和道德良知,只不过是一些精致的利己主义者,遇事不敢发表自己的观点,噤若寒蝉,这样是不可能做出真正有价值的创造的,最多就是在数学上做几个习题自娱自乐。
在精神气质上猥琐,即使再努力也是没有用的。我要是像你一样,整天崇拜这个大神,向那个大神请教,那我今天大概膝盖都直不起来了。但是我从不认为任何人是不可超越的,始终相信自己假以时日可以达到比他们更高的境界。无论是智力不如别人,还是学得不如别人扎实,这些事情都是可以弥补的,没什么了不起。如果智力低就多花点时间,如果不扎实就多学点东西。数学知识的深度和广度对于数学研究的帮助是等价的,绝不存在深度比广度更重要的情况。要知道,作为一个数学家,应该是一个自由的个体,没有人有资格强迫你具有某种特定的工作风格。就算你连十以内加减法都要摁计算器,只要你能做出有价值的工作,还是会得到应有的承认。
至于什么叫学得好,也没有固定的标准。你可以学一点点东西,很扎实,然后这辈子的数学生涯就是在一个小方向上工作。也可以学很多东西,不很扎实,只要你在不会的时候能找到合适的reference或者靠谱的合作者,照样可以做出大气的好工作。中国的舆论总是喜欢让学生单一化,都去做那种在小方向默默耕耘的人,这不利于数学发展。
上面的回答里有人说不要管做什么方向,有人说做什么方向要看遇到什么导师,嫁鸡随鸡,嫁狗随狗,难道这样你就满意了?人生最重要的事情是快乐,做数学也应该或多或少服务于此,如果连快乐都没有了,就把自己看成一个任人剥削的民工,请问这是要成为数学家呢?还是要去卖身?鉴于中国的社会环境,中国人总是有一种奴性,这种奴性也在影响着学生。我想,有自己的想法,确定大致的研究方向,是本科阶段必须要做的事情。至于怎么选择靠谱的导师,我已经在多个问题里解释过。只要follow我的建议,足以保证你在数学生涯中不会受到剥削和利用。
作者:李归农 链接:https://www.zhihu.com/question/59953183/answer/177500730 来源:知乎 著作权归作者所有,转载请联系作者获得授权。
自从李吟李归农离开知乎之后,我再也没在知乎上见过这样强大的男人,肯定是有的,可能没兴趣答题。这个回答当年给我力量,今天我把这份力量介绍给你。
故而,我服张益唐,我敬刘玄德。
刘玄德织席贩履,袁本初四世三公。
刘玄德当年见袁本初自不自卑?
刘玄德的同龄人曹孟德都快统一天下了,他还一事无成,他自不自卑?
刘玄德欲伸大义于天下啊。
刘玄德要伸大义,唐三藏要取真经。
又有吴起啮臂,终军不还,定远投笔,苏秦负剑,从此天下风云事,皆因一念出乡关。
这些男人究竟要做什么?
这些男人究竟想做什么?
你为什么仅仅对现在的一名博士生耿耿于怀,却对中国历史上无数英雄豪杰的所作所为无动于衷?
做一件事情吧,李白说,天生我材必有用,一个男人活在这个世界上,就要做事。
做舍我其谁之事。
你活那么多年,他活那么多年,肯定有什么事只有你能做,只有你想做。
有一天,你终会发现男人总是沉默的理由,因为大丈夫以实绩说话。
也希望你多对自己做自我批评,少对自己做自我否定。
年轻人,很容易犯左的错误,英雄主义,盲动主义,机会主义,冒险主义。
也很容易犯右的错误,妄自菲薄,保守主义。
希望你能时刻警醒自己,注意左的错误,同时防止右的错误。
两千多年前,孔子说:知之为知之,不知为不知,是知也。
两千多年后,他说:没有调查,就没有发言权。
这话说了两千年,实事求是,希望你能够做到它。
克劳备忘录也好,凯南电报也好,有两大共同点。首先,都是以现实主义的眼光去分析双方的关系。然后,给出的建议都是阳谋,并不是什么不可告人的阴谋,执行起来需要的不是鸡鸣狗盗的小聪明,而是惊人的意志力。
而美国现在战略界现实主义被边缘化,我推测,布热津斯基,基辛格那帮人应该写过不少。不过没所谓,美国能执行大战略的时代过去了。现在这一代精英上半年能管下半年就已经很了不起了。一个需要两代人以上持之以恒去完成的大战略,搞出来他们也执行不了。
冷战时期,从杜鲁门艾森豪威尔到肯尼迪尼克松,最后到李根老布什,个人性格和政治偏好差距不要太大,但是都忠实地完成了他们历史任务,沿着围堵政策做下去。这种战略定力和延续性,世间少见。在中国领导集团上能看见一些相似的东西,但是我们离得距离太近,反而看不清。但在美国精英层身上完全看不到这一点。
个人愚见。