回顾我和编程之缘

回顾自己十六年来的编程经历,我很乐意分享我和计算机编程结缘的过程。 高中毕业的时候,我从邻居家借到一本Basic语言的书籍,我被它迷住了,那时候我没有计算机,只是在草稿纸上模仿书本上的例子进行四则运算和解方程运算。事实上我从小梦想是做一名数学家,所以我大学专业是数学与应用数学。那时候计算机在中国是热门专业,所以数学系也开了很多计算机的课程,我认真学了一个学期的C语言程序设计,我一直被计算机编程的能力震撼,那时候我知道Matlab和Mathematica可以调用C语言的类库进行非常复杂的数值运行,我在大学参加数学建模比赛就是用计算机算法去验证数学模型。 大二的时候我第一次接触Delphi,第一次接触Pascal语言,被它的简洁语法吸引,不过Delphi那时候已经走下坡路,微软的MFC已经蚕食它的市场份额,而Delphi的创始人安德斯海尔斯伯格也被比尔盖茨挖到微软。大二结束的时候我参加学校编程社团,第一次学习C#并且使用ASP.NET WebForm开发网站,从同学那里,我也了解C#的创始人海尔斯伯格的传奇经历,我被两者深刻吸引。 大学毕业的时候我很幸运加入一家有名的软件公司方正集团,我继续使用C#和.NET开发网站,那时候我独立开发了一个CMS系统,虽然很简单但是非常实用,后来我深入参与电子报纸和电子图书的算法设计和软件开发。移动互联网刚刚诞生的时候,我和另外一位工程师基于Mac版本的FBReader开发了ios版本的图书阅读器,那时候我第一次接触object-c。 我也喜欢linux,自己会安装linux操作系统来学习,所以我在工作之余自学了php语言,但是我更喜欢C#这门语言,所以我一直没有转移到其他开发语言。微软和我Windows的闭源一直是我心疼之痛,后来我接触开源Mono,这是.NET在linux的一个实现,但是Mono的重点在桌面和游戏开发。 我加入百度公司之后有机会在linux生态系统下进行软件开发,我们使用php语言和mysql,这段经历扩宽了我的技术视野,让我对编程语言有了更深刻的理解:语言大同小异,最核心的还是算法和数据结构,以为优秀的开发人员应该能同时使用多种编程语言。 离开百度之后,我加入一家初创企业,我负责组建团队并开发互联网产品和软件,选择公司技术栈的时候我面临在php和c#之间二选一。那时候.NET已经开源,Mono的作者也创立了新公司Xamarin,专注于使用C#开发跨平台的移动应用。加上结合公司的情况,我继续选择使用C#作为主开发语言,但是我们也使用mysql、memcached和Redis等技术。我们的第一个移动应用也用C#来开发,那时候是属于很前卫的选择,还好我们坚持了下来,因为到了2016年微软换CTO了,开始拥抱开源,紧接着是收购Xamarin,还有筹划.NET Core的开发。我一直关注.NET Core的进展,后来看到StackOverflow使用.NET Core2.1,他们极大提升了性能,于是我开始在我们的新开发产品中使用.NET Core,到了.NET Core3.1的时候开始将legacy code迁移到.NET Core。 这里不得不提一段我学习深度学习的插曲,2018年左右我认真学习了Michael A. Nielsen的《神经网络与深度学习》,并熟读第二章的多元微积分公式和证明,我甚至在纸上推导了全过程,这是我再次接触神经网络算法(大学数学建模的时候我学习过)。我似乎又回到了大学学习数学分析的时候,这本书写得非常好,作者从最根本最朴素的思想开始,结合实践进入深度神经网络,我认为这本书堪称神经网络的几何原本。我没有继续深入到深度学习中去,但是我认为它最根本的核心还在这本书里。也许哪一天,我还会重新捡回这段技术经历。

March 25, 2025

扬帆远洋

返京 启程之前,我们提前几天回到了北京,回到这座我们最熟悉的中国城市。 此时的南方已经有了初春的气息,路边的木棉开始抽出新芽,空气里也带着一点潮湿的暖意。北京却依然停留在冬天的尾声里,街道两旁的树木光秃秃地站着,灰白色的枝干伸向天空,远远望去似乎没有一丝生机,但是我知道,它们并没有死去。 大约二十年前,我第一次坐火车穿越华北平原。那是一个阳光灿烂的下午,车窗外的田野和村庄不断向后退去。那时候我从南方来,对北方的冬天毫无概念,看着那些光秃秃的树木,竟天真地以为它们已经死了,小熊告诉我它们其实都活得好好的呢。生命有时候并不表现为枝繁叶茂,而是隐藏在沉默之中,等待某一个时刻重新生长,许多事情其实都是如此。 北京于我,也是这样。这座城市有过我人生中最重要的十六年,那些奋斗、挣扎、收获与失落,都已经深深嵌入生命之中,即便离开了这里,也不会因此消失。 这几天,我们就待在亚运村附近,不远处就是国家体育场鸟巢。夜幕降临的时候,巨大的钢结构在灯光下泛着柔和的光泽,周围则分布着这些年陆续建成的国家级场馆。这里是新北京最具时代象征意义的区域之一,也是无数人记忆中的奥运地标。而对我来说,这里还有另一层意义。 很多年前,我和爱人常常来这里放风筝。那时候刚刚毕业不久,我们租住在附近,偶尔骑车来到这片开阔地,看风筝在天空里越飞越高,也谈论那些尚未实现的梦想。后来有了自己的家,搬去了更远的地方,来的次数越来越少。再后来,孩子出生,生活被工作、家庭和责任填满,那些悠闲的下午逐渐成为记忆。 现在这里的场馆更多了,道路更宽了,周边的建筑也比从前壮观许多。可是站在那里时,我最先想起的却不是这些变化,而是当年那两个在草地上奔跑的年轻情侣。那时候的我们不会想到,二十年后自己会以这样的方式再次经过这里。 我们又去了一趟王府井,去了一趟前门,也去了附近的奥林匹克森林公园,这些曾经是我们恋爱时最常去的地方。很多城市都有著名景点,但真正属于一个人的城市记忆,往往不是景点本身,而是与某些人共同经历过的时光。 启程 今日惊蛰,按照节气,万物应当开始苏醒,可北京依旧笼罩在阴霾之下。 今天也是两会的开幕式,新闻里到处都是相关报道,街道上增加了许多安保力量,整个城市似乎都在围绕着某种宏大的叙事运转。但是如同过去的十年,那种热闹属于他们,我们有自己的世界。 知道我计划的同事问过我:你有这么好的职位和待遇,为什么要离开?这个问题真的很难用一句话回答。如果只是抱怨,那么任何地方都能找到无数离开的理由;如果只是留恋,那么任何地方也都有值得留下的东西。北京如此,中国亦如此。 这里有很多让人难以理解的事情,有时甚至会让人感到无力。与此同时,这片土地又拥有独特而深厚的文化传统,那些古老的诗歌、历史、语言和记忆,早已融入我们的血液之中。很多年前读高行健的《灵山》,书中始终在追问一个问题:人在庞大压抑的集体叙事之中,如何寻找真正属于自己的自由和自我。 后来我慢慢明白,对于许多人来说,即便身处各种约束之中,也依然能够活出自己的精神世界。 我其实一直是个乐观主义者,我相信未来肯定会变得越来越好,哪怕是螺旋式地发展,而且也相信无论身处何种环境,人都可以保留独立思考的能力、也能够创造属于自己的生活。 然而,生命终究是有限的。特别是当你提前看见了一些东西,看见了更多可能存在的人生路径之后,就很难再假装自己什么都没有看见。选择本身未必意味着否定什么,很多时候它只是承认另一种可能同样值得尝试。 这些年,我越来越认同余英时先生的一种精神态度:“我们在哪里,哪里就是中国。”对于我而言,故乡其实比国家更重要,那里是族人们生活了几百年的地方,甚至超越历史、政治和国家。“我们在哪里,哪里就是壮乡。”故乡未必只是地图上的一个坐标,它也是一种语言、一种记忆、一种生活方式。只要这些东西还存在于我们身上,它们就不会因为地理位置的变化而消失。 远航 吃过早餐,我们拖着四个超大的行李箱和两个小行李箱来到首都国际机场。曾经人潮汹涌的大厅现在门可罗雀,去年我们两次从这里东渡扶桑就是这样的情景,这是经济发展的一个信号,未来不容乐观。航班信息在电子屏幕上滚动更新,孩子们显得有些兴奋,他们把这当成一次普通的旅行,不停讨论着飞机和目的地。对于他们来说,这只是一次出发;他们或许还不知道,这实际上将成为他们人生中的一个重要转折点。 我和爱人则都很安静,经历了过去将近一年漫长的准备、整理、告别与等待之后,真正走到这里时,反而没有太多情绪。 飞机开始滑行,发动机的轰鸣声越来越大,当机轮离开地面的那一刻,我看着窗外逐渐缩小的城市轮廓,内心出奇地平静,甚至没有离开故乡时那种强烈的不舍。我想也许原因很简单:故乡连接的是血缘、童年和生命最初的记忆;而国家、城市、制度和时代,则终究是为具体的人而存在。我认同爱因斯坦的那句名言:国家是为人而设立的,而人不是为国家而生存。无论身处哪个时代,个人先于国家存在,毕竟人并不是为了某种宏大的概念而活着,而是为了自己有限而珍贵的一生。 飞机穿过云层,阳光从舷窗照射进来,北京被留在了身后。前方是什么,其实谁也不知道。但人生很多重要的时刻,本来就不是因为看清了终点才出发,而是在确认方向之后,愿意扬帆远航。而此刻,漫长的远航终于开始了。

March 5, 2025

樟宜机场

又一次在樟宜机场中转。 机场还是那座机场,兰花依旧盛开,航站楼里依然安静得像一座花园。只是同行的人,一次比一次多了。 十年前,两个人。那是蜜月,我们飞往马尔代夫。年轻得仿佛未来没有边界,背着简单的行李,心里装着整个世界。飞机降落樟宜时,我们还特意在机场里慢慢逛,拍了许多照片。那时候觉得,只要两个人在一起,哪里都是远方。 五年前,三个人。女儿还小,目的地是澳大利亚和新西兰。第一次真正走进发达国家,第一次看见那些辽阔的草原、纯净的天空,也第一次感受到人与自然可以如此和谐地相处。那趟旅行,让我们看见了另一种生活的模样,很多后来的人生选择,或许都可以追溯到那次旅行埋下的一颗种子。 现如今,再次来到樟宜机场,这一次已经是四个人。女儿会帮着推行李,儿子已经跟姐姐上次经过这里的年龄一样,可以满机场跑。我们也不再像年轻时那样急着奔向目的地,而是更享受一家人在一起的过程,这最值得珍藏的风景。 飞机一架架起飞,人也在一次次启程中慢慢长大。樟宜机场没有变,变的是我们;而那些关于爱、关于家庭、关于未来的故事,就这样随着一次次中转,悄悄写进了岁月里。

March 5, 2025

部署NextJS到Azure WebApp Deployment Error报错: cannot find module ../server/require-hook

当我将nextjs应用程序部署到azure web应用程序的时候报错:cannot find module ../server/require-hook。 我通过github-actions构建和部署成功完成,但是部署后,我在url 中收到错误,并且在azure日志流利发现这个错误。刚刚开始我不明白是什么原因造成的,因为“npm start”在我的本地机器上使用相同的 npm 版本构建和运行。 通过网上查找,发现是因为githhb的action默认不会把.next文件夹打包加入zip并且发布到azure。所以需要在默认的工作流基础上修改: 1、adding “startAzure”: “./node_modules/next/dist/bin/next start” in package.json; 还需要在azure应用程序网站的配置立加上 the startup command of the azure web app like “npm run startAzure” 2、添加这个到azure的 pipeline (在创建 zip了之后) - name: Zip artifact for deployment run: zip release.zip ./* -r - name: Add .next folder to zip artifact for deployment run: zip -r release.zip ".next"

February 27, 2025

昆明,两次相遇

大约十年前,毕业实习的时候,我曾在昆明住了将近一个月。 直到今天,我依然忘不了住处楼下那家不起眼的小店,五块钱一碗土鸡米线。现在想来,那时候应该没有什么所谓的“科技”,一锅鸡汤,大概只有盐和味精调味,放上两三片鸡肉,撒一点韭菜叶,再舀一勺本地炒辣椒酱,就是一碗热气腾腾的米线。我们几个实习的同学几乎每天早上都去吃,却从来没有觉得腻。 那一年正赶上亚洲杯,那时候的中国队还能争冠。白天去公司实习,晚上回到住处,一群年轻人围着电视看比赛,为每一个进球欢呼。很多比赛的比分我早已忘记,但那个夏天的昆明却一直留在记忆里:清晨街边飘着米线的香气,傍晚凉风吹过树梢,大家对未来都有些迷茫,却又都相信未来一定会很好。 我是最后一个抵达昆明的人。出发去实习前,我先绕到北京去找小熊,那趟绕远的旅程,对年轻的自己来说是一次壮举。青春就是这样,总会为了想见的人,多坐一程火车,多走一段路,而丝毫不会觉得麻烦。 这次我带着小熊和孩子们,一起重返昆明,看见的却是另一座城市。 学生时代来昆明,眼里只有实习、足球和米线,从未认真了解过这座城市。我们参观了云南陆军讲武堂,那里陈列着中国远征军的资料,这支部队属于国民政府领导下的国民革命军,他们远征缅甸,保卫滇缅公路,许多人再也没有回来。还有有驼峰航线的故事,那些飞越喜马拉雅山的飞行员,在没有现代导航和气象保障的年代,一次次驾驶运输机穿越雪山,把武器、药品和希望送进中国。展厅里还有一张宋美龄与驼峰飞行员的合影。照片中的人都很年轻,隔着几十年的时光,依然能感受到那个时代的勇气。 反法西斯战争中,国军承担了正面战场的主要作战任务,无数将士血战淞沪、武汉、长沙、常德、桂林… 今天回望那段历史,无论后来政治如何变迁,他们的牺牲都不应被遗忘。 昆明也是一座承载着厚重历史的城市。这里曾是吴三桂受封平西王后的大本营,很多人看到“平西王”三个字,脑海里都会浮现昆明,现在还会想到另外一个轰动政治的人物。历史有时很奇妙,同样一个称号,在不同年代会让人想到不同的人物,不禁令人莞尔。 同一座昆明,两次相遇。第一次带给我的是青春,第二次带给我的是历史。而当这两段记忆慢慢重叠在一起时,我才发现,一座真正值得怀念的城市,从来不只是因为风景和美食,更因为它曾经收藏过我们的青春,也收藏过一个民族的记忆。

February 18, 2025

故乡

县城 同样的季节,我们又回来了。 车子驶入主城区的时候,窗外掠过的街道并没有带来太多陌生感。离开这些年,县城也在不断变化,越来越多的新建筑,商业街热闹了许多,但整体的轮廓依然还是记忆中的样子,那条标志性兴武大道依然如故。岭南小城的冬天几乎没有北方那种肃杀感,树木依旧浓绿,阳光也很温暖,空气里甚至还残留着一些秋天的气息。爱人出生并成长于城区,我则来自乡下,高中时我曾在这里度过三年时光。 这次我们决定住上一段时间,没有太明确计划,也没有必须完成的事情。每天睡到自然醒,饭后陪孩子在大草坪戏耍,或者到南门菜市,看街边的人来人往,听市场里讨价还价的声音。县城里的时间似乎总是比大城市慢一些,而正是这种缓慢,让人重新感受到生活的另一种质地。 我几乎每天早晨都出门打粉,太阳还没升起,街边小店早已经升起热腾腾的蒸汽。空气里混杂着各种米粉的味道,老友粉、卷筒粉、桂林米粉,还有只有这一带才常见的生榨米粉。对于外地人来说,生榨米粉那种微微发酵后的酸香未必容易接受,但对于从小闻着这种味道长大的人而言,那几乎就是故乡最具体的气息。很多时候,人怀念的并不是某一种食物本身,而是食物背后的岁月。高中外出买生活用品后吃上一碗粉,偶尔和同学在街上闲逛到傍晚,那些已经模糊的人和事,往往会因为一种熟悉的味道重新浮现出来。 闲下来以后,我开始恢复跑步。有一天兴致来了,决定绕着县城跑一圈,导航显示十六公里。我从城区主干道出发,往南跑到路的尽头,然后顺着环线一路向前,几次跨越西江河,再绕回起点。沿途经过的风景其实并不壮观。文江塔依旧静静地立在那里,像一位沉默的老人,看着河水一年年流过,也看着无数人在这里长大、离开,又偶尔回来。西江河的水缓缓向前,傍晚时分的阳光落在河面上,碎成一片金色的波光。我依然记得高中时期在这里跑步的那些日落黄昏,此时的记忆与现实浮现在脑海,宛如时空交错。 跑到最后几公里时,县城的灯光已经陆续亮起,街边的烧烤摊开始营业,熟悉的烟火气重新弥漫开来。我突然意识到,自己对县城已经熟悉地如同乡下的老家,那些转弯、坡度和街角的位置,像是某种埋藏在记忆深处的本能,只要重新回来,就会自然地被唤醒。 故乡 春节期间,我又回到了乡下的老家。年轻的时候总觉得故乡太小,小到装不下自己的理想,所以一心想着离开;等真正走过许多地方,再回头看时,才发现故乡从来没有离开过自己,它只是安静地停留在原地,等待着某一天的归来。 这些年其实经历过很多次告别。离开家乡去上大学算一次,毕业后远行算一次,后来决定在遥远的北国定居,每次往返也都算一次。但过去的每一次离开,心里总觉得还有回来的一天,所以离别并不显得沉重。而这一次,当我站在祖屋门前,看着已经斑驳的墙壁和那些摇摇欲坠的瓦片时,却第一次清晰地感受到不一样的情愫。 村子的后山窑角岭依然在那里,我的记忆也不曾改变,我与这片土地的连接从未断绝。只是山脚下的村庄早已在不知不觉中变了模样:楼房取代了瓦房,宅基地一步步挤占农田,后山的松林变成了速生桉林,现代生活的垃圾也渐渐多了起来。曾经自然生长的乡土,已经被一种“田园现代化”的改变重新塑造。 小时候眼中的长辈逐渐老去或离去,当年的孩子成为父母,新一代的孩子又在村子里追逐奔跑。生命就是这样一代代向前延续,而每个人都只是其中短暂的一段。以前读到贾平凹《带灯》那句话——“你生在那里,其实你的一半就死在那里,所以故乡也叫血地”,总觉得其中更多的是乡愁与苍凉。到了今天才慢慢明白,故乡之所以特殊,并不只是因为那里有亲人和房屋,而是因为那里保存着自己最初的样子。那些已经无法回去的童年、少年时代,那些早已消失的人和事,都沉淀在那里。故乡像一本不会再更新的旧书,里面记录着人生最开始的章节。 然而人终究不能永远停留在过去。故乡给予我出发的地方,却未必是最终停留的地方,就像西江河里的水不会因为眷恋岸边而停止流动。这些年我越来越喜欢余华说过的一段话:“我家附近就是大海,课本里说海水是蓝色的,我经常想为什么我都看不到蓝色呢?有一天,我游了很长一段距离,一边游一边想着:我要一直游,一直游到海水变蓝。” 山川依旧,河流不息,故乡一直是故乡。只是每次当我回望,才发现自己眷恋的,不仅是眼前的山水,也不仅是房屋和亲人,更是那些自己在这片土地上度过的岁月。 ​

February 15, 2025

今日离京

昨天我开车去了南边的市场,一路经过那些熟悉又陌生的道路,曾经无数次往返的高架桥、路口和辅路,依旧保持着记忆中的样子。处理完事情后,我经过四号线生物医药基地站,这个地方我们当年也来看过房子。那时候孩子还没出生,对未来有着各种具体而清晰的规划,我们站在售楼处的沙盘前,认真计算着首付、月供和通勤时间,仿佛只要把这些数字安排妥当,未来就会按照预想的轨迹展开。 这么多年过去,再次站在那里,除了新建起来的楼盘、旧了一些的居民楼和商厦,似乎并没有太大的变化。地铁口依旧是匆匆赶路的人。街边的小店依旧亮着灯,大概率晚高峰的人潮依旧拥挤。人还是那些人,城市还是那座城市,变化最大的,反而是自己。 无论如何,该处理的事情都已经处理清楚,那些压在心头许久的事务,在签字、确认、交接之后,终于落下帷幕。走出最后一道门的时候,没有想象中的如释重负,反而有一种说不出的恍惚。就像一本翻了很多年的书,忽然合上,手还停留在最后一页。 对于北京,我有感激,也有遗憾;有留恋,也有释然。它见证了我最重要的十六年,而我把十六年的青春时光,都留在了这里。从一个背着行李、怀揣着各种幻想的年轻人,到如今两鬓渐添风霜,身边有了爱人,有了孩子,也有了属于自己的故事。回头看,这十六年几乎走完了一个普通人在大城市里最完整的人生轨迹。 恋爱、买房、结婚、生子。每一个阶段都曾经觉得漫长,等真正走过之后,却发现不过是转眼之间。我把所得一切主要归功于运气,北京没有亏待过我,它给过机会,也给过回报;给过希望,也给过挫折。那些为了生活奔波的清晨,那些加班到深夜的灯光,那些堵在路上的焦躁,那些拿到结果时的欣喜,都已经成为生命的一部分。 当然,我对这座城市也有很多不满。它拥挤、昂贵、节奏飞快;有时候让人觉得渺小得像一粒尘埃。很多时候,你拼尽全力,也未必能够追上它前进的速度,年轻时总觉得自己能够改变什么,后来才明白,个人终究改变不了一座城市。 幸运的是,人可以改变自己,接受自己的局限,接受时代的变化,也接受人生不同阶段的选择。 今天早晨吃完早餐,我们坐高铁出发。车站里行李箱轮子在地面滚动,西站依然熙熙攘攘,有人刚刚抵达,有人准备离开。人生很多时候也是如此,有人进入一段故事,有人结束一段故事。 车子驶出西站的时候,我没有刻意回头,因为真正重要的东西,其实早已带在身上。那些一起奋斗过的岁月,那些结识过的人,那些深夜里的梦想和迷茫,那些属于青春的热烈与倔强,都不会因为离开而消失,它们已经成为生命的一部分。 列车即将驶向远方,窗外的风景会不断后退,新的风景也会不断出现。人生终究是一场向前的旅程。 告别不是结束,而是另一段故事的序章。带着对过往的感激,带着对未来的期待,我们终于出发。

January 18, 2025

行走在北京胡同:历史没有如果,但仍有温度可守

入秋以来,我给自己安排了一场漫长的城市漫游。十多天时间里,几乎每天步行两万步以上,穿行于北京二环内纵横交错的胡同巷陌之间。从寻常百姓的小门小院,到昔日王公贵族的深宅大院;从熙熙攘攘的街市,到香火隐约的古寺庙宇;从规整修缮后的历史街区,到那些地图上甚至没有名字的狭窄角落。我像一个迟来的访客,试图在城市飞速变化的今天,重新认识这座古老都城的肌理。 有时,我也会壮着胆子走进那些看起来有些凌乱的院落。斑驳的墙面、堆放的杂物、晾晒的衣服、停靠的自行车,以及院子深处偶尔传来的锅碗碰撞声和家长里短的交谈声,共同构成一种真实而具体的生活景象。这些地方或许并不美观,甚至显得拥挤杂乱,但正是在这样的空间里,我感受到一种难以复制的城市温度。 每一次走进胡同,仿佛都是一次时空切换。仅仅隔着一条主干道,外面的世界是车流、人潮、商场和写字楼,是不断更新的广告牌和闪烁的霓虹灯。而拐进胡同之后,仿佛进入了另一个维度。除了偶尔匆忙穿行的外卖电动车,更多时候能够听见的只是自行车轮压过地面的细微声响,以及行人不紧不慢的脚步声。 这里没有现代都市常见的压迫感。低矮的屋檐、曲折的巷道、树木投下的阴影,以及那些历经岁月洗礼的砖墙,共同营造出一种缓慢而安静的节奏。行走其中,人会不自觉地放慢脚步,开始留意门楣上的砖雕、墙角的石墩、残存的匾额,甚至是一棵从院墙里探出枝叶的老树。 每当这种时候,我总会产生许多关于历史的假设。如果北京的老城墙能够完整保留下来,会是怎样的景象?如果那些规模宏大的城门、角楼和护城河至今依旧环绕着老城,北京是否会拥有另一种独特的气质?如果大量四合院没有被改造成大杂院,也没有在城市建设浪潮中被拆除,那么今天的人们是否还能更完整地感受到传统居住文化的魅力?如果那些散布于街巷之间的古老庙宇、牌楼和历史街道没有遭到破坏,北京又会呈现出怎样丰富而完整的历史层次? 然而,历史终究没有如果。 城市的发展从来不是静止的。北京能够成长为今天这样一座现代化国际都市,离不开过去几十年的快速建设与扩张。宽阔的道路、高耸的楼宇、发达的交通网络以及繁荣的商业中心,共同支撑着数千万人的工作与生活。 我当然喜欢西单和王府井的热闹繁华,也深知国贸、金融街和中关村对于这座城市的重要意义。那里汇聚着资本、技术、人才与机会,是现代北京最具活力的象征。 我甚至向往东四环那些环境优越的高端社区,以及京郊掩映在树林与湖泊之间的低调别墅。现代化带来的便利、舒适和效率,没有人能够轻易否认它们的价值。 但与此同时,我仍然认为,由短视和人为因素造成的文化断层,是这座城市无法回避的遗憾。这种遗憾并不仅仅体现在某一座建筑的消失,或者某一条街道的改变,而是在于一个完整文化生态的断裂。城市真正珍贵的东西,往往不仅是那些被列入保护名录的古建筑本身,更是建筑背后的生活方式、邻里关系、空间结构以及代代相传的记忆。当这些东西被整体切断之后,即便未来投入再多资源进行复原,也很难重新获得原有的生命力。 因为建筑可以重建,生活却无法复制。这些年,关于胡同的存留与改造,始终存在着各种不同观点和争论。有人认为胡同代表落后的居住条件,应该让位于更高效、更现代的城市空间;也有人认为胡同是北京最独特的文化遗产,必须最大限度地保护。作为一个普通的行走者,我并非城市规划专家,也无法给出复杂问题的标准答案。只是经过这些天的观察与思考,我越来越觉得,与其进行大刀阔斧的彻底改造,不如给予这些空间更多自然生长的可能。因为我有一个非常深刻的体会:胡同里那些杂院和小杂货铺所散发出的市井气息,往往比大门紧闭的单位院落和空无一人的豪华大院更具生命力。 清晨开门扫地的老人,坐在门口择菜聊天的邻居,经营了几十年的小卖部,修车铺门前停放的自行车,放学后奔跑追逐的孩子,甚至是一只趴在墙根晒太阳的猫——这些看似微不足道的日常场景,恰恰构成了一座城市最真实的灵魂。城市的价值,不仅在于它拥有多少摩天大楼,也在于它是否还保留着普通人的生活痕迹。 那些杂乱、拥挤、甚至略显陈旧的空间,未必符合现代审美,却承载着人与人之间最自然的联系。它们不是博物馆里的标本,而是仍然在呼吸、在生长、在变化的生活现场。当越来越多城市变得相似,当商业综合体和标准化街区不断复制扩张的时候,北京胡同最珍贵的地方,或许正是这种无法被复制的烟火气。 历史没有如果,失去的许多东西也无法重来。但至少今天,当我们仍然能够走进这些胡同,听见自行车铃声,看见院墙上的爬山虎,闻到早点铺升起的热气时,就意味着这座城市与自己的过去还没有完全失去联系。或许,对于北京而言,最重要的不是把胡同变成一件被精心陈列的展品,也不是将其彻底改造成整齐划一的新社区,而是在保护与更新之间找到一种克制而审慎的平衡。 让历史继续存在,让生活继续发生。 因为一座城市最动人的部分,从来不只是它的过去,而是过去仍然活在今天。

October 23, 2024

小提琴演奏主要基本功

小提琴的演奏技术来说,要练好以下几个主要基本功: 一、运弓 优秀的演奏家能在小提琴上发出千变万化的声音,就运弓而言,取决于运弓的速度、弓在弦上的压力以及弓和弦的接触点这3种因素的不同结合。小提琴的弓法繁多,就其主要的有以下几种: ①分弓:一弓演奏一个音; ②连弓:一弓演奏许多音; ③顿弓:音与音之间断开; ④跳弓:弓毛离开琴弦。 这4类弓法是最基本的,在20世纪中期,连顿弓,即在一弓中连续快速演奏许多音与音之间是断开的音,被人视为绝技,所以人们把小提琴演奏艺术称之为“运弓的艺术”。 二、揉弦 通过左手手指在弦上的颤动,使声音的音高产生有规律的波动,称之为揉弦。 揉弦是小提琴演奏中极为重要的表现手段。揉弦分为手指的、手腕的和手臂的。优秀的演奏者不仅要掌握这3种揉弦方法,而且要学会使用不同速度和不同幅度的揉弦,在演奏不同作家,不同作品,不同乐句时,富于变化地运用揉弦。从揉弦的运用,可以使听众明显地辨认出不同演奏家的音乐个性。 三、把位 左手手指在指板上的位置,称之为把位。靠近琴头的把位为低把,靠近琴马的为高把。从一个把位换到另一个把位,称为换把。 换把位的方法有多种,例如空弦换把,同指换把,不同指以及泛音换把等。换把时产生非音乐需要的滑音,是技巧训练不足的标志。滑音可以使音与音之间的连接富于变化,特别是结合换把使用滑音,是一种富于表现力的演奏手段。 四、双音与和弦 小提琴可以同时演奏两个音甚至是3个音,也可以分奏4个音的和弦,这不仅丰富了它的表现力,并可不依赖其他乐器的伴奏进行单独演奏。小提琴的三度、六度、八度以及十度双音音阶,是演奏双音的基础,也是小提琴家必须终身练习的一项基本功。小提琴演奏中的左手颤音、泛音、拨弦等,都是一些高深的技巧。

September 28, 2024

React官网力荐Next.js

随着前端技术的快速发展,React作为一款领先的JavaScript库,不断推动着前端开发的变革。近期,React官网的一个显著变化引起了广大开发者的关注:它不再推荐使用Create-React-App作为构建React应用的默认工具,而是转向了Next.js。 那么,Next.js究竟有何魔力,让React官网做出如此决策?本文将为你详细解析。 一、Next.js:React应用的“升级版” Next.js并不是一个全新的框架,而是基于React的服务器端渲染框架。它提供了许多开箱即用的功能,使得开发者能够更高效地构建复杂、高性能的React应用。与Create-React-App相比,Next.js更像是一个“升级版”,它为React应用带来了以下显著的优势: 性能优化:Next.js支持自动静态优化(Automatic Static Optimization)和服务器端渲染(Server-Side Rendering),使得页面加载速度更快,用户体验更流畅。此外,Next.js还支持预渲染(Pre-rendering)和动态导入(Dynamic Imports),进一步提升了应用的性能。 数据获取简化:Next.js内置了数据获取功能,使得开发者能够更方便地从API或其他数据源获取数据,并将其注入到组件中。这种无缝的数据获取流程大大简化了开发过程,提高了开发效率。 强大的路由功能:Next.js提供了基于文件系统的路由功能,使得页面之间的导航变得简单直观。开发者只需创建相应的页面文件,Next.js就能自动为其生成路由。这种方式不仅易于理解,还能减少错误和提高可维护性。 更好的SEO支持:由于Next.js支持服务器端渲染和预渲染,因此它能够更好地处理页面渲染和加载问题,从而提高网站的搜索引擎优化(SEO)效果。 二、Create-React-App的局限性 虽然Create-React-App为React开发者提供了一个快速搭建项目的脚手架,但随着项目规模的扩大和复杂度的增加,其局限性也逐渐显现: 配置不灵活:Create-React-App为开发者提供了一套固定的配置,虽然这降低了入门门槛,但对于有特定需求的开发者来说,这种固定配置可能会成为束缚。 性能优化有限:Create-React-App主要关注于项目的快速搭建和开发体验,对于性能优化方面的支持相对有限。对于需要高性能的应用来说,开发者可能需要花费更多的时间和精力进行手动优化。 扩展性不足:随着项目的发展,开发者可能需要集成更多的功能和工具。然而,Create-React-App的扩展性相对有限,可能无法满足一些高级需求。 三、React官网推荐的背后 React官网之所以推荐Next.js而非Create-React-App,背后有多重原因。 首先,Next.js作为React的“升级版”,在性能、数据获取、路由等方面提供了更强大的支持,能够更好地满足现代Web应用的需求。 其次,随着前端技术的不断发展,开发者对于高性能、易扩展的应用框架的需求也在不断增加。Next.js正好符合这一趋势,能够为开发者提供更高效、更灵活的开发体验。 最后,React官网的推荐也反映了社区对于Next.js的广泛认可和支持。越来越多的企业和项目采用Next.js构建应用,证明了其在实际应用中的价值和优势。 四、结语 React官网推荐使用Next.js而非Create-React-App,是基于对现代Web应用需求的深入理解和对前端技术发展趋势的敏锐洞察。对于广大React开发者来说,了解和掌握Next.js将是一个值得投入时间和精力的选择。它将帮助你更高效地构建高性能、易扩展的React应用,提升你的开发能力和竞争力。

September 9, 2024