花半秒钟就看透事物本质的人,和花一辈子都看不清事物本质的人,注定是截然不同的命运。
《教父》
当年大促保障,师兄力战群雄
在大促零点到来的那一刻,无数支付请求如巨浪般涌入我们的支付系统,如果我们的系统在那时没有撑住,影响了到了千万用户的购物体验,后果会非常严重。
因此,支付系统能否承受海量支付请求在瞬间带来的压力,就成了技术同学们在大促期间最关心的事情。
为了确保万无一失,在大促前一个月,我们便会开始对系统做压力测试。
所谓压力测试,就是我们自己模拟用户在大促零点时的支付行为,制造出数倍于大促当天的海量请求疯狂抽打自己,以这种方式来找到系统的短板并予以优化。
这就好比下周三你要参加三千米赛跑,于是你在比赛前一个月就开始对自己进行魔鬼式训练——比如,每天跑三个六千米,周六周日都不休息。
那么,在比赛前,如果你没有把自己跑死,那么在正式比赛的时候你肯定可以拿第一名,毕竟没有人比你更卷了。
压测大抵也是如此,这是一个属于卷王的游戏。
我第一次参加大促保障,是在参加工作之后的第二年。
当时的我只能算是个新人,而保障大促又是一个高风险的活动,所以我在其中必然只能打个酱油——在压测时帮老人盯紧系统监控。
为了无限接近真实,压测一般都是在生产环境进行的。如果在压测的过程中把系统玩儿崩,也会影响线上用户的支付,后果同样很严重。
因此,在压测的过程中,需要有人时刻看着监控。
说实话,这个任务真的很简单,只需我要时刻看着浏览器里的监控页面,在发现交易成功率下降或者系统出现大量报错之前,提醒压测小组停止压测即可。
在那个年代,虽然当时我们的系统已经对接了监控报警,系统报错时大家都能收到报警短信,但是短信一般会滞后几分钟才能收到,不如直接看监控来的直接。另外,在压测的时候,为了避免被大量的报警淹没,我们还会主动关闭报警。
所以,“盯盘”这种类似“看门狗”的角色必须人肉来做。至于说具体谁来做,大家一致认为,没有比新人更好的人选了。
那么,老人们在大促保障中都在做什么呢?
资深一点的同事,就做执行类的工作,一般就是执行变更预案之类的,除了繁琐之外,这些操作往往有一定的危险性。比如,提高压测流量,或者打开某个系统的缓存或者对某个系统降级等等。
为了保证万无一失,几乎每个组都会派一到两个资深的同学参加大促。
再资深一点的,就负责指挥,名曰大促值班长。这个角色一般只有一人,人多了必然打架,做好了可以扬名立万,做不好就身败名裂。
那年,我们组带我一起参加大促保障的师兄就是一位介于资深和非常资深之间的师兄。
他是一位身经百战的高手,而那年大促的保障就是最好的证明。
那年的大促给我的印象非常深刻,因为从一开始压测就进行的极为不顺利,压测流量还没有加上去多少,我们的系统就扛不住了,交易成功率直线下跌,短信的提示音在作战室此起彼伏,各路老板开始在应急群里始询问情况。
一开始众人着实摸不着头脑,大家埋头看了半天监控,各自负责的系统都没有问题,怎么合在一起就爆炸了呢?
事后我们才知道,这里其实有一个盲点。因为我们不知道出问题的系统是负责投递消息的消息中心,这是一个基础系统(学名:中间件)。
这些中间件如同空气,没事的时候你根本感觉不到他们的存在,一旦出事就是猝不及防,你都不知道是哪里出了问题。
就像现在这样——大家都变成了无头苍蝇,根本找不到问题所在。
许久之后,就在众人还在对着电脑屏幕发呆的时候,我的师兄定位出了中间件的问题,他给大促值班长提议道:
“消息中心的机器不够,无法处理压测时产生的巨量消息,导致消息中心宕机,对策是增加消息中心的机器。”
二话没说,值班长立马找人扩容,问题随即解决。
又过了几天,压测再次出了问题,众人看了半天依旧无解,又是我的师兄定位出了问题,他给大促值班长提议说:
“这次消息中心够了,但是下游的机器又不够了,于是出现了雪崩,解法是让下游的x系统扩容,扩个y台机器就可以了。”
让人意外的是,师兄的提议一提出便遭到了负责x系统的z同学的强烈反对,因为这个问题应该是他们先看出来的,显然师兄抢了他的功。
z同学面红耳赤,言辞非常激烈,作战室里终于有了一丝作战的感觉。
当时,两个人隔着桌子对峙着,其他人都默不作声地观望着二人的反应。
最后,还是值班长站出来力排众议,让大家顾全大局,命令下游系统的同学扩容。
扩容之后,问题再次得到解决。
就这样好不容易熬到最后,本以为可以松一口气了,结果在大促前最后一次压测时,新问题又出现了。
这次虽然压测流量已经达到目标峰值,但是在这个目标值上,我们的系统一触即溃,根本坚持不了原计划的十分钟。
这次依旧无解,众人再度摸不着头脑,结果又是师兄出马,对值班长说:
“这次我们的系统已经到最大吞吐量了,只能通过对入口的支付请求量做限制,我们要修改限流值,之前那个值算得不对,应该配成xxxx(师兄说了一串数字)。”
我想你可能听说过这个,在一个组织里,扬名立万的方式有两种:让自己变得很厉害,或者,让别人显得很愚蠢。
而我的师兄,可能连他自己都没有意识到,当时他两个方面都占了。
所以,后面的剧情连我这个头脑迟钝的新人都猜到了:网关负责限流配置的a同学听到师兄的话立马跳起来反对,说师兄睁着眼睛说瞎话。
a同学同样面红耳赤,言辞比之前的z同学还要激烈。
再加上之前显然还没消气的z同学,此时他也在怒气冲冲地盯着师兄,作战室里的紧张气氛和系统监控中代表压测流量峰值的尖刺一样冲到顶点。
这个时候,如果再有哪个好事者出来拱上一把火,大家非得打起来不可,掀桌子那种。
当时,我把头埋在电脑屏幕后,用余光左右扫视,在心里计算着打起来时我们获胜的概率。
好在精通人性的值班长很快就察觉到了气氛的不对,他迅速把两波人拉出作战室,去天台上抽了几包烟,畅谈了一番人生理想、国际局势以及宇宙奥秘。
许久之后,众人陆续回到作战室。
看起来谈心的效果应该不错,反正饼肯定是吃了不少。
回来之后,a同学二话不说便修改了限流值,z同学的面目也变得和善了起来,大家说话的语气也缓和了很多,整个作战室里再度充满了活跃的空气。
最后,谢天谢地,大促压测终于圆满结束了。
双十一当天,因为技术团队前期压测准备顺利,同时,也因为业务总是对交易量有着过于乐观的估计,当天过了零点之后的支付流量其实没有任何惊喜和惊吓。
大石落下、喜笑颜开的值班长过来拍了拍师兄的肩膀,然后便混在众人里一起开始为交易量欢呼。
今天的成功是属于大家的,当然最终是属于值班长的,不过这事儿一点都不重要。
我和师兄坐在电脑前看着代表每分钟交易量的曲线,零点的高潮早已过去,支付曲线已经跌落到谷底。
若不是身在其中,你很难想象就是这么一小会儿功夫,海量的钞票已经从一些人的口袋里跑到了另外一些人的口袋里去了。
用不着等到明天早上,这个小小的支付高潮便会在整个国家的运输系统上掀起滔天巨浪,不计其数的人将会参加到这场把包裹从起点送到终点的马拉松里来,这可得消化个好几天。
而那些刚刚按下支付按钮的人们——此时他们还在回味着秒杀带来的快感,又或者,此时他们早已伴着第二天打开门就能收到包裹的期待满意地睡去了。
“一骑红尘妃子笑,无人知是荔枝来。”
没错,今天的成功是属于大家的,不过这事儿一点都不重要。
……
当时,反正也没事,我便向师兄请教,他是如何快速解决那三个问题的。
师兄说,本质上那三个问题都是同一个问题。
我问,什么意思?
师兄说,你应该去学习一点模型思维,本质上那三个问题都可以用同一个模型解决。
数学建模我是知道的,这个大家其实并不陌生,毕竟我们在小学就在给汽车建模:已知速度和时间算距离那种。
但是我不知道师兄说的具体是什么模型。
师兄说,生产者-消费者模型呀。
我恍然大悟:
消息中心,不就是一个典型的生产者消费者模型吗?
再进一步,上游系统和下游系统,不也是一个典型的生产者消费者模型吗?
再进一步,外部支付请求和我们支付系统的吞吐能力,不还是一个典型的生产者消费者模型吗?
明确生产者和消费者是谁,问题不就好解决了吗?
消费者不够,那么就减少生产者或者增加生产者。生产者不够,也有办法处理。
这就是师兄说的模型思维吗?
回想起来,我在研究生时的课题就是利用数学工具建立一个无线网模型,然后在其上优化无线网路由算法的功耗。
那时候真的没有多想,直到现在,在工作两年后的双十一大促上,师兄一句话点醒了我。
“你应该去学一点模型思维。”
再后来,我又参加过多次大促保障,虽然我们的业务越来越复杂,保障过程越来越有挑战性,但是以后的大促再也没有那次让我印象深刻。
一旦掌握了大促背后的那些模型并且在实践中都经历过了,大促就变成了一件重复的事情,褪去了它的神秘感,于我就不再有什么吸引力了。
但是,模型思维又是什么呢?
什么是模型思维
在谈论模型思维前,不得不提到模型。
模型是什么
模型(model),是一种对现实世界中某个事物进行简化和抽象之后的“装置”。
这种装置,可以是思维上的,也可以是物理存在的。
比如,我们熟悉的象棋就是一种模型,他是对“战争”的抽象和简化。
当然,象棋主要还是用于娱乐,可以让玩的人体验古代战争的形式感和博弈带来的乐趣。
还有一种比象棋更复杂、更专业的“战争”模型——兵棋推演。
从第一次世界大战开始,兵棋推演就用来预判战争双方的行动和战争进程。
但是,模型不能仅仅只是一个装置,不然就成了装置艺术,模型必须是有用的。
那么,模型都有什么用呢?
模型有什么用
首先,模型的出现,是为了解释或解决者某个问题。
为了解释人们在观察行星运动时的行星的各种轨迹,人们先后创立明了日心说和地心说。
前者是以地球为中心的太阳系行星运动模型,而后者是以太阳为中心的太阳系行星运行模型。
而结果我们都知道了,显然日心说能够更好地回答“太阳系行星”运行的问题。
类似的例子不胜枚举。
比如,在设计飞机时,人们会先做出等比例缩小的飞机模型,然后在风洞中用气流吹这个模型,以此来验证飞机的空气动力学特性,反复对模型修改和测试之后,才会建造全尺寸模型。全尺寸模型也会被放到风洞中吹,直到确保一切都符合预期之后,人们才会制造原型机。
其次,除了可以解释现在之外,模型还可以预测未来。
就像在已知汽车的行驶速度和行驶时间,我们就可以求出汽车的行驶距离一样。
借助相应的模型,我们可以预测未来将要发生的事情,并对这个结果作出反应。
这是模型所具备非常重要的能力。
比如,在第一次世界大战中的坦能堡战役中,东普鲁士借助兵棋推演以少胜多,干翻了2倍于自己兵力的俄国。
第一次世界大战中的坦能堡战役,是一场东普鲁士以15万人的军队击败了28万人的俄军,是一场以少胜多的经典战例。
有趣的是,在这场战役中,作为交战双方的俄国和东普鲁士在战前都做了兵棋推演。
在推演的过程中,俄国总参谋部发现,若要让从马苏里湖北面进攻的第一方面军和从马苏里湖南面进攻的第二方面军对东普鲁士首府形成合围之势,两个方面军必须以适当的时间先后出发,否则就有可能被敌人逐个击破。
也许是人数众多带来的傲慢与偏见,俄军当时并没有重视推演的结果。
几乎在同一时间,东普鲁士在推演过程也发现了这个问题,相反的是,普鲁士人为此制定了预案。
战役打响后,和兵棋推演的结果一样,俄两个方面军果然被马苏里湖分割,无法相互呼应。而东普鲁士则利用这个时间差,在坦能堡歼灭了俄第二方面军,之后又转头歼灭了第一方面军。
又比如,气象学家通过为全球天气系统建模,便可预测未来几天的天气,这对避免自然灾害的发生有非常大的帮助。
类似的模型还有预测股票大盘走势的模型,很多聪明的头脑都在尝试为股票市场的走势建模,这样他们就可以快他人一步、从中套利。
甚至,就连我们平时刷的短视频的推荐算法,都是在利用“推荐算法”(推荐模型)来预测使用者的喜好。
最后,比起直接处理原始问题,从模型开始处理问题是低成本的,是可以推广和复用的。
在设计阶段,建造一架飞机模型肯定比建造一架真正的飞机更省钱。
通过兵器推演战争走势肯定比真枪实弹地打一仗更高效。
研究数百亿光年外的天体运动,通过数学模型肯定比实际考察更有可行性。
模型可以是看得见摸得着的,比如一架飞机模型;
模型也可以是抽象的概念和规则,比如一个简单的数学公式(数学模型),一句歇后语(人生经验),一段代码(推荐算法)。
虽然模型出现的形态千差万别,但是模型一定是低成本的。 总之,模型是对生活中实际问题的简化和模拟、总结和归纳,它为我们解决实际问题、预测未来的可能性提供了重要的参考甚至行动指南。
(但问题同样也出在这里,我们很多人都把模型和现实搞混了,这一点将在下文讨论)
所以模型思维是……
而模型思维,就是在面对现实问题时能够建立模型、使用模型、最终借助模型解决问题的能力。
一般来说,我们掌握的模型越多,我们就能愈发从容地应对自己遇到的问题。
因此,模型思维可以说是人生智慧的同义词。
在《模型思维》这本书中,有这样一张图:
我想这张图可以这样理解:
第一,反推。通过信息看到“世界”的模型:数据 -> 信息 -> 知识(基本原理) -> 智慧(模型/结构)
第二,正推(通过自己的模型指导自己的行动):数据 <- 信息 <- 知识(基本原理) <- 智慧(模型/结构)
那么,这种智慧从何而来呢?
又或者,我们该如何建立一个模型呢?
如何建立一个模型
建模的过程
我们遇到了问题,我们想要解决这个问题,此时我们需要一个模型来刻画这个问题,这就是模型思维。
总的来说,建模和使用模型的过程如下:
识别问题 > 建立模型 > 验证模型 > 推广模型
不同类型的问题,对应着不同类型的模型,所以这里先我们从模型的分类开始说起:
模型的分类
可以看到,问题类型的不同也就意味着模型类型的不同。而不同类型的模型,在构建方法上也是不同的。
按照问题类型的不同,我把模型分为三类:
- 黑盒模型
- 白盒模型
- 沙盒模型
黑盒模型——通过观察和经历来构建
对于黑盒模型,我们对建模对象的内部机理并不了解,只能通过外部观察的方式推测对象的行为模式。
如果这个对象有输入和输出,那么我们便可以通过改变输入的方式获得输出,并以此来为这个对象进行建模。
比如,所谓的“人性”,就是一个黑盒模型。
这样的模型往往是通过经验来构建的,所以黑盒模型有另外一个称呼——“经验法则”。
生活中比较常见的经验法则就是歇后语和俗语。比如,“不要考验人性”,“不要再夜里做决定”,“好事不出门、坏事传千里”,“宁做鸡头,不做凤尾”,“木秀于林,风必摧之”等等。
因为黑盒模型是通过观察和对过去的经验的归纳来构建的,所以,以这种方式构建出来的模型只能是定性的模型。
说一个模型是定性的模型,这就意味着它大面上可能是对的,但是别指望这玩意儿会有多精确。
直到统计科学出现之后,人们可以借助统计学工具研究研究对象的行为模式,这才使得对黑盒模型的定量分析成为可能。
但是,统计分析也只是在统计意义上进行分析,具体到个体上就不一定正确了。
感受一下下面这句话:
“不要考验人性,因为人在60%的情况下都是不靠谱的。”(笔者注,这只是一个例子,没有什么科学根据)
请问,你敢为了人性那靠谱的40%,而冒险相信一个陌生人吗?
白盒模型——通过数学建模来构建
如果我们对研究对象的内部原理完全了解,那么我们就能够通过定量的手段进行建模。
比如,在已知汽车的行驶速度和行驶时间,我们就可以得到汽车的行驶距,这就是建模。
又比如,通过数学建模分析战斗机的空气动力学特性。
上述的这些东西,对于学过理工科的朋友一定很熟悉,其实关于建模还有一个更为大家熟悉东西——那就是贯穿我们的学业的那些“应用题”。
应用题,实际上就是把数学等手段应用到某个领域上,并解决这个领域的问题。
对于某个领域的内部原理这种非常有门槛的东西,在建模领域我们还有另外一个同义词——领域知识。
在掌握了领域知识之后,我们就可以给研究对象建模了。
比如,学习了空气动力学原理,了解了战斗机的气动结构之后,我们就可以为战斗机构建数学模型,通过构建好的数学模型,我们就能分析战斗机的气动特性。
又比如,博弈论中,经典的“囚徒悖论”其实就是一个典型白盒模型——它揭示了人与人之间难以建立短期信任的事实。
可见,了解的领域知识越多,掌握的领域的内在规律(模型)越多,我们就越有可能通过模型作出精确的判断。
沙盒模型——通过数学建模+实时推演来构建
一个复杂系统,往往既不是全是白盒又不全是黑盒,而是由无数黑盒和白盒一起组成的,这样的模型更加接近真实世界的情况,这时就需要沙盒(沙盘)来实时模拟系统的运行过程。
模拟一场战争的敌我动态,从一个士兵、一个连队乃至一个集团军的士兵,我们需要为沙盘上的每一个单位建模,并在推演这场战争时,根据他们的状态,推算他们的行为。
我们甚至可以把桌游看作是一种沙盒模型,游戏中每个角色必须按照情景中的设定行事,直到最后“发展”出一种结局。
我们常玩的RTS(即时战略)游戏,如星际争霸,也是一种沙盒模型,只不过受限于个人电脑的性能,在RTS游戏中模拟的要素相对会少很多。
而对于那些更加复杂的沙盒模型,比如天气模型和传染病模型的计算,往往都需要大量的计算资源,所以这样的沙盒推演只能运行在超级计算机上。
验证模型
构建好模型之后,我们需要验证模型的有效性。
验证的方法很简单——用历史数据进行测试,看模型是否能够得到和真实数据接近的结果。
(若是量化分析的模型,我们还得搞清楚有多接近)。
如果测试的结果与实际不符合,那么我们就得搞清楚为什么不符合,并且调整模型的设计。
模型的适用范围
没有包治百病的灵丹妙药,模型也是如此。
所以在建立自己的模型时,我们还应当明确模型的使用条件。
很多人都忽视了这一点,他们成天把各种高大上的名词挂在嘴边(如,长期主义,终局思维,第一性原理,黑暗森林法则,墨菲定律,短板理论,囚徒悖论……这个名单还可以拉得很长),但骨子里却是彻头彻尾的教条主义和嘴炮高手。
所以,当你拿到一个新的模型时(或者听到一个新的概念时),你就得格外小心了,你得问自己:
“这个模型的适用范围是什么呢?”
没有适用范围的模型是没有使用价值的。
复用你的模型
一旦模型建立完毕,你就可以使用这个模型了——模型始终是要用起来的,我们的构建模型的目的,不就是为了解决现实当中的问题吗?
而使用模型的时候往往是最快乐的。
因为透过模型这块透镜来观察世界的时候,我们看到的东西和他人看到的是完全不同的。
我们会因此而获得更多的新知,甚至,这种新知可能会对我们的心智带来巨大的冲击——颠覆我们原有的认知。
在另外一些时候,使用模型则会为我们带来经济上的收益——因为我们用模型解决了某个一直困扰着我们的问题。
再次强调,模型最后一定要在现实世界中使用,那些只是在纸面上写写算算而没有实践的模型——它永远只是一个装置艺术罢了。
打造自己的模型工具箱
掌握的模型越多,我们解决问题的能力就会越强。
而模型又是抽象的、非实体的、不占据空间的,所以我们可以收集尽可能多的模型,以备不时之需。
实际上,只要活在这个世界上,我们无时无刻不在观察和感受着这个世界的运行,潜移默化,这其实就是一个建模的过程。
但是,与其这样被动地被输入,为什么不能发挥我们的主观能动性、主动出击寻找自己想要的模型呢?
甚至,笔者认为,我们每个人都应该有一个自己的模型工具箱(另外一种说法是,我们得有一个自己的外脑)。
那么,如何打造属于自己的模型工具箱呢?
我想充实自己的模型工具箱有两种方式:
其一,自己构建模型
这个没什么好说的,鞋合不合适只有脚知道,自己建的模型更符合自己的需求。
只是,自己构建模型对综合能力要求较高,你可能需要学习数学、统计学、工程学、社会科学甚至是人文历史等等。
至于具体制作的方法,前文已经大概描述过了,这里就不复述了。
其二,参考别人的模型
参考前人建好的模型往往是最简单的。
现如今,通过google就可以检索到一大堆模型。
具体需要什么样的模型取决于你所要解决的问题,所以这就也不再复述了。
值得一提的是,在使用别人的模型时应该格外小心,因为别人的模型所适用情况和你的情况未必相同。
使用模型思维其他关键点
关于模型思维的构建和使用,大概可以写成一本厚厚的书。但是受限于篇幅,本文仅讨论三个关键点:
其一,通过模型推演产生的结果和实际结果并不相同。
在使用模型时,这一点务必要时刻提醒自己:由于模型是对现实的简化和抽象,所以用模型预测的结果并不等于实际的结果,千万不能混为一谈,很多人都在这里栽了跟头。
模型预测结果只能代表了一种可能性,至于实际的结果,只有实际做了之后才能看到。
毕竟,天气预报也有不准确的时候。
其二,收集的模型越多,你就越游刃有余,但是也会越因循守旧。
由于模型是用来解决问题的,所以如果我们手头有足够多的模型,理论上我们就能解决这个世界上的所有问题。
这句话听起来是对的,但是如果我们做事只是按照模型的计算结果去做,那么我们就把选择权交给了模型,那么我们就和死板无趣的算法没什么区别了。
而做个刻板教条的人,这恐怕不是我们想要的。
模型不是规则,我们也无需画地为牢,手头的模型越多,我们越要小心。
有时候,不妨抛开模型和理性的计算,跟着感觉走两步。
其三,不同的模型组合在一起,可以构建出一个新的系统
为了解决一个问题,我们可以把不同的模型有机地组合在一起,这种组合可以是串联也可以是并联。
比如,汽车的自动驾驶系统之所以能够实现,就是把道路识别模型、汽车动力模型等组合到了一起。
又比如,把业务模型和经济模型组合在一起,公司就出现了。公司又可以通过之前讲过的“飞轮思维”建模,而飞轮思维本身就要求,把业务拆解成3-4个独立的模块(模型)。
当不同模型组合在一起的时候,就变成了系统,一个系统会因其组成部分的不同而表现出不同的性质和行为。
若我们从系统的角度去看问题,这就是系统性思维,当然这已经本文所要讨论的范畴,我将在下一章专门讨论“系统思维”。
整合起来
现在,让我们把之前学过的思维工具和本章的模型思维整合起来。
在应用模型思维时,我们可以分为构建模型和使用模型两个方面:
第一,在构建模型时,可以使用的工程师思维有:迭代思维、根因思维和飞轮思维。
第二,在使用模型时,可以使用的工程师思维有:灰度思维、根因思维和复盘思维。
和模型思维有关的工程师思维有:飞轮思维,因为飞轮思维中的飞轮本身就是一种“模型”。
本章小节
模型思维告诉我们,在解决实际问题时,可以对问题进行建模,然后通过模型来指导我们解决问题。
这样做的好处是,一旦模型建成,不但可以用这个模型解决自己的当前的问题,还可以用这个模型解决别人的和未来的问题——这在有时会给我们带来经济上的利益。
这也是为什么,我们建议大家在平时就留心收集解决各种不同问题的模型,打造属于自己的模型工具箱,不要等到需要时才手忙脚乱。
但是,尽信书不如无书,模型也是类似。尤其需要注意的是,通过模型推演产生的结果和实际结果并不相同,千万不要把两者混同——这是非常危险的。
模型推演的结果仅仅只是一个参考,真正的结果,只有实际做过之后才知道。
最后,不要过于依赖模型,把自己活成了算法,进而失去了生活的乐趣。
有时候,抛开模型,跟着感觉走几步,真的死不了人。
(本章完,版权归作者王晓辰所有,若要转载,请标明出处)
作者简介
王晓辰,软件研发工程师,8年+金融科技从业者,文字价值和文字理想的信仰者和践行者,公众号“架构师的白日梦”的作者。
他坚信用心写就的文字具有无穷的能量,可以穿越时空的阻隔,向读者传达最纯粹的经历、最质朴体悟以及最深邃的思索,最终完成思想的启迪和灵魂的交流。
架构创造未来,文字打败时间!
作者专栏