codedump的电报频道
4.43K subscribers
151 photos
4 videos
2 files
622 links
发布个人博客(主页 codedump.info)、想法、推荐等。RSS订阅地址:https://rsshub.app/telegram/channel/codedump_notes,过往汇总搜索可以到:https://app.shokichan.com/c/tg/codedump_notes。
Download Telegram
#设计模式
看到推友关于设计模式的一句话:“设计模式的本质是为了弥补语言抽象能力不足产生的东西。比如 visitor 模式也就 OOP 在用,支持点 pattern matching / lambda 的 FP 向语言基本不用。”

我是比较同意这个说法的,写多了Rust之类的非OOP语言,确实没怎么感觉设计模式的存在,因为非OOP类语言自有自己的一套解决这类问题的方案。

不过,这并不意味着设计模式就一点都不值得学习,某种程度上我认为设计模式教会了我:在哪些地方,常用哪些招式来封装变化,每个招式都有哪些优缺点,等等。“封装变化”以使项目更好得适应变化、高内聚低耦合等等,就与具体的语言无关了,是软件设计都必须面对的问题。而至于当时初学时为了设计模式而用设计模式导致的过度封装,又是另外一回事了。

https://twitter.com/the_foreverbell/status/1553780395778654208
👍17
#文章

《【老万】谷歌新语言 Carbon 能干翻 C++ 吗?》

乍一看题目,是那种标题党文章,但是作者之前在Google(按文章的说法参与了gtest、gmock等google开源的C++项目开发)与Carbon作者有过共事和近距离接触,姑且当靠谱些的技术八卦看吧。
👍12
#Rust

Rust里面的宏有点难度,以至于要单独拿出来写一份专门的教程了:
The Little Book of Rust Macros
9👍3
#技术推
这条推下面的讨论太好玩了:

“职业生涯见过的最脑洞大开的代码是在10多年前的一个C++网络游戏项目。
大致情况是在服务端new一结构体,设置好相关字段后把指针放在消息包里传给客户端。
刚毕业的我直接被惊掉下巴:指针是服务器的内存地址,发到客户端怎么能用呢?而且指针也没留副本,那个结构体不会内存泄漏吗?
👇评论区揭晓答案”

( 原推链接:https://twitter.com/disksing/status/1555444153588543488

其中提到了 TensorFlow的一个优化,做法如截图,可以说是大开眼界了。

《案例分享 | TensorFlow 大规模稀疏模型异步训练的分布式优化》
👍9
#博客
《周刊(第23期):图解Blink-Tree:B+Tree的一种并发优化结构和算法》

引言:《Efficient Locking for Concurrent Operations on B-Trees 》论文中提出了一种称为“Blink-Tree”的数据结构,这个数据结构提供了B+Tree并发访问的一些优化方式,本文对这篇论文进行解读。

公众号:https://mp.weixin.qq.com/s/Yb6OcCoM_Hhc4U8ESTYVbg
博客:https://www.codedump.info/post/20220807-weekly-23/
邮件订阅:https://www.getrevue.co/profile/lichuang
👍4
#文章
早上起来,翻知乎读到姚勇的一篇文章:

《软件技术人员的瓶颈,35岁之后做准备》

很同意里面的一句话:“我发现对一个程序员最大的阻碍,就是一种对解决问题极限难度的感受。 他决定了你最差的情况。或者收入。这个很有可能和性格有关。半天生。”

这个素质天生与否不好说,但是同意前半句面对难题的态度决定了这个人在技术方向上的走向。

BTW:姚勇是前水木清华成员,作家王小波的侄子,主业现在应该是游戏公司的老板,可以看看百度百科对他的介绍
👍22😁1
#书单

Rust打造的KV库 sled 作者的 推荐书单,不得不说里面好些书都没听过,即便听过也没有读过,其中很多主题是关于调试、软件检测的,马克一下。
👍6
#文章
上周有感而发写了一条推

“人际交往里,“兼容”别人最好的人,可能是最被忽视感受的那个人。

软件也是一样,越能容忍用户输入、需求的,最后虽然用户面更广,但是要处理的各种边界条件也更多,而且口子一开难以收敛。

有时候大胆说个“不”明确一下边界,不见得就不好。”

下面的回复里有人推了这两篇文章:

《复杂度是不灭的,只会转移,难道一切都是徒劳的吗?》
《架构设计-复杂度是不灭的》
👍7
Forwarded from Rust 视界
【趣文】用 Rust 收获 HATETRIS 的世界纪录

世界上有一款俄罗斯游戏的变体,叫做 [Hatetris](https://qntm.org/files/hatetris/hatetris.html) (“可恶的俄罗斯方块”,亲自去玩一下就知道这个版本的俄罗斯方块有多么令人抓狂,我最多消了三行。。),号称世界上最难的俄罗斯游戏,是由程序员和科幻作家Sam Hughes于 2010 年编写的俄罗斯方块版本。曾经的世界纪录也只能做到消去32行(32分),然后在去年被一个日本选手 knowjade 推到了66 分。 现在这个分数已经被(痴迷于一个问题并付诸实践且刚学了几天 Rust)的两个开发者给推到了 86 分高分。

该团队最初选择了三门语言来实现:Mathematica、python 和 Rust。

Mathematica 平均每场比赛耗时 4.3 秒,Rust 平均每场比赛耗时 0.035 秒。这是一个如此大的差异,所以该团队认为与 Rust 的借用检查器进行谈判的所有麻烦和斗争都是值得的。

他们尝试的实现:
- MCTS(蒙特卡洛树搜索)是游戏模拟中的一条行之有效的路径。核心理念是将游戏中的每一步都变成树状结构,然后探索树。然后他们从树搜索重构为 DAG 搜索,产生了可喜的结果。(MCTS 中的“Graph vs Tree”实际上是这个专业圈子里有争议的,并有相关论文)
- 他们尝试 rust + pytorch-c绑定制作了AlphaHATETRIS,但是失败了
- 实现了一个模拟器,然后受 knowjade 写的相关文章启发,使用了 heuristic beam search (启发式光束搜索,https://gist.github.com/knewjade/586c9d82bd53f13afa8bcb7a65f8bd5a),但是他们得到的分数是 53 分,而不是 knowjade 的66分。
- 从图论中得到启发,结合 heuristic beam search ,经过优化参数, 奢侈地使用了 aws 上的一个实例,然后花了56 个小时得到了 86分。一共花费140美元。

收获的教训:

- 学会了使用火焰图分析程序性能:字符串格式化代码占用总运行时间 17% ; 避免循环嵌套;使用 clone() 解决借用问题,但并没有花费什么时间成本,因为编译器将它们优化掉了。
- 切换数据结构。他们需要一个读取速度和插入速度都比较平衡的数据结构,所以从 Vec(读O(1), 写O(n)) 换成了 BTreeSet (读写都是O(log(n)))。
- 再多的优化代码都不会消除对机器学习硬件的荒谬需求。不管你的模拟器有多好,你玩游戏的速度有多快……大量的训练数据和所需的训练时间使得尝试解决消费硬件上的复杂问题变得非常具有挑战性。

这篇文章涉及很多算法细节,感兴趣的可以点击原文阅读

https://hallofdreams.org/posts/hatetris/
👍11
#游戏技术

前阵子,看到一篇文章讲述游戏技术在各领域的应用:《游戏技术已成为一个国家技术创新能力重要标志》

正好最近看到一部纪录片《青年理工工作者生活研究所》里面有一集也讲了 游戏技术的应用

N年前刚开始从业的时候,看了一本书DOOM启示录》,详细讲述了卡马克、DOOM、QUAKE的故事,那时候就对做“游戏引擎”很感兴趣。可是自身基础差、从业机会少等各方面原因,最终还是没能如愿。

尽管未能相关从业,并不影响《DOOM启示录》在我心中的位置,书中有卡马克有一句名言:“在信息时代,进入编程领域的壁垒完全不存在了。即使有也是自我强加的。如果你想着手去开发一些全新的东西,你不需要数百万美元的资本。你只需要足够的比萨和健怡可乐存在你的冰箱里,有一台便宜的PC用于工作,以及让你坚持下来的奉献精神。”。这段话对我这样的技术宅男来说可谓有很大的激励作用。

(英文原文:“In the information age, the barriers [to entry into programming] just aren't there. The barriers are self imposed. If you want to set off and go develop some grand new thing, you don't need millions of dollars of capitalization. You need enough pizza and Diet Coke to stick in your refrigerator, a cheap PC to work on, and the dedication to go through with it. We slept on floors. We waded across rivers.” 见 维基百科的卡马克页面

BTW1:说起“游戏引擎”这个技术,算是游戏开发领域的掐脖子项目,国内几个最好的游戏公司,好像也只有网易有自研并落地到项目中使用的自研游戏引擎,只是因为未开源以及没有在外部使用,所以并不太为人所知,可以看这些文章的介绍

*专访网易Messiah自研引擎领衔者:“做真正made in China的游戏”》
*8年时间,29款产品,揭秘网易自研引擎的背后故事》

BTW2:为什么腾讯这么有钱,却没有去自主研发“游戏引擎”这类卡脖子的技术?答案是有钱,买就完了。当前世界上最流行的两款商业级别的游戏引擎,Unity和Unreal,背后都有腾讯的投资。见:Unity美股IPO,腾讯成大赢家:一文带你了解游戏引擎》。(补充:据知乎的这个问题记载,腾讯是有自研引擎并得到应用的《如何评价腾讯的QuicksilverX游戏引擎?》)

BTW3:通常聊到“游戏引擎”,很多人都会认为只有图形图像引擎才被称为“游戏引擎”,实际上也存在服务器端的“游戏引擎”。基于服务器的游戏引擎,开发者通常只需要写脚本层的业务逻辑即可,网络收发、数据库访问、自动的负载均衡等技术都在引擎底部实现了,比如“BigWorld”这款服务器引擎,曾经创下过最高在线玩家数的世界纪录。

我的上一份工作还在游戏行业,如果当时能给我去做服务器端的游戏引擎,可能不会离职离开这个行业。之前的周报里也写过一篇游戏服务器技术的文章:《周刊(3期):一个前游戏开发者眼中的游戏后端技术》
👍18
#项目
Databend v0.8版本正式发布:这个版本历时5个月,全球120多位贡献者参与,5000+ commits, 4600+ file changes,新增420K行代码,160K行代码被删除,几乎把Databend每个模块都迭代了一遍。新的调度器、新的执行计划和优化器、完整支持复杂的JOIN和子查询(TPC-H),让Cloud Warehouse更加Cloud。Databend v0.8 release:

What's Fresh in Databend v0.8 Databend项目地址:https://github.com/datafuselabs/databend
👍6
#八卦
前两天的有关游戏引擎的推送里,评论区提到了腾讯的Milo。很多人知道他,都是因为他的开源项目、知乎上的回答、翻译的书籍。

实际Milo在这之前,就以一种很意外的方式出现在中文技术圈里过。

这是2010年的一篇关于0 bug--C/C++商用工程之道》的书评《有点失望》,大体过程是Milo在这篇书评里指出了这本书的很多错漏,但是作者并不接受随后也一口咬定Milo及之后其他批评他的人都在故意抹黑他,进而引发了当时中文技术圈的一场声势不算小的讨伐。

这个事情当时的围观群众很多,也让人们认识了当时不知道哪里冒出来的Milo,再过了几年Milo就入职腾讯、开源RapidJson、翻译《游戏引擎架构》一书,这些都是后话了(我才发现Milo的知乎账号已经停用了)。

Milo自己关于这个事情的一个记录:《《有点失望》的经过及其背后意义》

我后来也写过一本书,如果有一天被人公开指出各种错漏,不知道到时我该怎么应对。所以当写过一本书之后,真心体会到“心智成本”是非常高的,因为别人付费买了你的产品,就不能出现纰漏,何况是纸质出版物这种印刷出来了就很难修改的输出品。所以我现在不太想写书,时间、心智等等成本太大,除非有特别想写的主题,怕是以后都很难写书。还是写写博客好,读者不付费就能看我大可以抱着“爱看不看”的态度,而且有错误了修改起来很方便,更重要的是以这种方式来学习,反馈路径短更有利于整理学习知识。
👍7👏1