wangpin34 / blog

个人博客, 博文写在 Issues 里
5 stars 0 forks source link

2021/10/15: 中国的技术困境 #83

Open github-actions[bot] opened 2 years ago

github-actions[bot] commented 2 years ago

封面

alex-escu-TUo4sMV5XGM-unsplash

Photo by Alex Escu on Unsplash

本周主题

最近,网络上出现了很多关于中国技术困境的问题,有讨论操作系统的,有讨论浏览器内核的,不同领域各有不同的关注点,看起来纷繁复杂。但核心问题是相通的,那就是,中国企业为什么没有做出这样的产品。

为什么呢?

很多热门回答解释说,欧美已经在中国的前面做出了这样的产品,而且已经形成占领市场的事实。中国企业只要拿来用就好了,没有必要做,不划算。

更有回答说,这些产品的技术含量并不高(来自某音技术博主),中国企业决心做,就一定做的出来。既然这么容易就能做出来,也就不用担心。只要想要,分分钟做出来。

也有道理,市场上有免费的东西可以用,为什么不用呢?非要自己搞一套,又是何苦?对吧。所以中国企业不做,是正确的,智慧的。反之欧美企业都是人傻钱多。

但是,欧美企业为什么总是偏执的要搞一套呢?为什么苹果不用塞班,非要搞一套 IOS?为什么谷歌不用塞班,非要投资 Android?微软 IE 如何中天时,谷歌干嘛要做 Chrome 呢?

还有最近,中国的华为,又为什么要搞自己的鸿蒙 OS 呢?

上面的那些公司,在国际上是什么地位,不用我多说了吧。华为,是欧美无比忌惮的中国公司。而谷歌,你们知道谷歌为什么被赶出去吗?微软在欧洲吃了多少反垄断罚单,感兴趣的可以去查查。

他们之所以被针对,是因为他们太大太强。他们太大太强,是因为他们蠢。市面到处都是免费产品,他们不用,非要自己干。蠢不蠢?

蠢,反而做大做强,你说奇怪不奇怪。

中国的技术困境,相当一部分的原因,就在于中国人不蠢。不仅不蠢,反而绝顶聪明。什么硬核技术,有电商赚钱吗?很多人跑到国外,看到老外的App简陋到无以复加,连个扫码支付都没有,就觉得祖国强大。可是在这看起来美好的强大背后,是太多太多关键的技术领域,没有中国力量。

最近两年在芯片领域,中国各种被卡脖子。软件领域其实也不安全。前段时间有新闻说,中国高校被限制不能使用 MATALAB,一个工业软件。当你并不掌握某项技术,也没有等价物可以交换,就会面临这样的风险。别人想卡你就卡你,丝毫不担心你报复。

现在回头看前面的言论,是不是不再觉得头头是道了。的确,当我们总是绕开核心问题,总是轻描淡写的拿来主义时,的确节省了很多时间精力财力,但是免费的东西自有其代价。这个代价就是,你会依赖它。当它弱小时,这种依赖还不强烈,当它变得强大,拥有了自己的知名度,生态圈,社区,粉丝,这种依赖就成为根深蒂固的顽疾。你的客户,员工,周边的舆论,都在围绕着它做文章,再谈摆脱依赖,谈何容易?

最后,那些看起来愚蠢的欧美同行,反而走在了前面。

读书

冰与火之歌

艾德信任小指头,是让人非常迷惑的行为。初见小指头时,艾德非常不齿其为人,反感厌恶溢于言表,但兴许是凯特的从中协调,艾德开始接纳小指头。在很多场合,艾德对小指头的信任让人惊讶,比如,拜托小指头拉拢都城守卫队。但同时,艾德对小指头为人轻佻的反感,一直都没有消失。所以,艾德其实是矛盾的,一方面,艾德不喜欢小指头的作风,另一方面,因为凯特的缘故,艾德不得不信任小指头。而且,艾德似乎有一种简单的特质,一旦他选择相信,就深信不疑。这种选择,在领主的位置上,那叫做用人不疑,是加分项。但是在疑云诡谲的君临城,作为一个根基浅薄的外来户,这却是无比危险的行为。就像小指头所说,你不该信任任何一个人。他没有说错。

当然,艾德之死的确是一个意外。如果没有乔佛里,他会披上黑衣,会成为黑城堡的下一任司令官,会在与异鬼的战斗中建立功勋抑或战死沙场。可是没有如果。

折腾 TL

我最近在折腾一个类似 codesandbox 的项目, 名字叫 TL,与 codesandbox 不同的是,我打算支持更灵活的构建配置。这就需要用到 Docker。每个 sandbox 对应一个 Docker Contailer。这当然有点奢侈,如果未来 sandbox 数量太多,服务器的资源消耗是个大问题。这也是为什么 codesandbox 选择用浏览器构建这种重客户端轻服务端的方式来组织底层,因为横向扩容没有限制。sandbox 增长需要的只是更多硬盘容量,而不是 CPU。

当然,目前我并不需要担心这些事情。

假设用户创建了一个 sandbox,如何运行 sandbox 呢?简单来说,经历以下步骤:

  1. 服务器下载 sandbox 的源码,找到 Dockerfile,build 出来一个 image
  2. 启动一个 Contailer 加载 image,随机分配一个端口,假设为 8080
  3. 服务器端用 nginx 将 Contailer 的服务代理到对应路径上

这里比较关键的问题在于,如何动态的匹配路径。比如,对于 8080 端口而言,用户会前往(当然是前台打开这样的 tab 或者 iframe)https://tl.io/sandbox/8080 查看 sandbox。如何在 nginx 做这样的映射呢?

nginx 的 location 支持正则表达式,所以

location ~* /sandbox/[^/]+/ {
    proxy_pass http://localhost:$1;
}

当然这并不完美,在 URL 里放 8080 这样看起来就是端口号的方式,既不安全,又不美观。最好的办法莫过于用一个 Redis,存放 uuid 和 端口号的映射。前台拿到的是 uuid,后台,nginx 参考 Redis 的记录动态匹配。这里我还没折腾明白。

另外一个事情,是如何自动化 Docker。前面所属的三个步骤,前两个与 Docker 相关,现在都是我手动的。这个当然是要放在 service,当用户启动 sandbox,service 自动完成代码下载,Docker 构建启动。用程序语言操作 Docker 是可行的,只是貌似只有 Golang 和 Python 的支持,而我想写 TypeScript。

至于如何优化,我想到的一些,缓存 image,Contailer 存活时间,热启动,这些都需要慢慢打磨。

还有,看到 wasm 这么强大,是不是可以在浏览器端低成本的引入golang的构建。

想做的事太多。奈何时间有限。