Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
142 changes: 142 additions & 0 deletions translate_to_english_slugs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
#!/usr/bin/env python3
"""Translate Chinese article titles to English slugs and re-migrate articles"""
import re
from pathlib import Path
from typing import Dict
import yaml

# Manual mapping of Chinese titles to English slugs
TITLE_TO_SLUG_MAPPING = {
"工程实践分享-把小事做好": "engineering-practice-doing-small-things-well",
"工程实践分享写代码不是第一步": "engineering-practice-coding-is-not-first-step",
"同学为什么我建议你关注-1024-实训营": "why-you-should-join-1024-techcamp",
"当-ai-能写代码工程师的核心竞争力是什么": "engineer-core-competitiveness-in-ai-era",
"我眼中的优秀工程师特质": "qualities-of-excellent-engineers",
"一行之差为什么你的文件末尾应该留一个空行": "why-end-files-with-newline",
"从类型系统理解-xgo-编译器的实现": "understanding-xgo-compiler-through-type-system",
"ai-重构软件开发从工具到规则的范式革命": "ai-reshaping-software-development-paradigm-shift",
"许式伟聊-ai-时代下的工程师发展观": "xu-shiwei-on-engineer-development-in-ai-era",
"许式伟发布-xgo-全景图ai-时代的全民编程语言": "xu-shiwei-releases-xgo-roadmap-programming-for-all",
"github-pr-合并三选一主分支该怎么选": "github-pr-merge-strategies-which-to-choose",
"如何才算完成一个ai应用": "what-makes-ai-application-complete",
"从类型系统理解-llgo-编译器的实现": "understanding-llgo-compiler-through-type-system",
"code-review-不是什么": "what-code-review-is-not",
"架构设计该从何入手": "where-to-start-architecture-design",
"关于架构设计的几点认知体会": "insights-on-architecture-design",
"spx-algorithm构建多模态搜索服务的一些心得": "spx-algorithm-building-multimodal-search-service",
"代码不是核心从-xlink-项目看产品开发的决策层次": "code-is-not-core-decision-layers-in-xlink-project",
"llpyg-llgo-快速集成-python-生态的桥梁": "llpyg-bridge-for-llgo-python-integration",
"x绘图-让ai融入产品": "xdraw-integrating-ai-into-products",
"让ai融入产品": "integrating-ai-into-products", # Alternative
"x绘图-我们是如何让AI更好的融入我们的产品的": "xdraw-integrating-ai-into-products",
"llgo-python-编译与运行时集成": "llgo-python-compilation-and-runtime-integration",
}

def extract_frontmatter(content: str) -> tuple[dict, str]:
"""Extract YAML frontmatter and body from markdown content"""
match = re.match(r'^---\n(.*?)\n---\n(.*)$', content, re.DOTALL)
if not match:
return {}, content

frontmatter_text = match.group(1)
body = match.group(2)

try:
frontmatter = yaml.safe_load(frontmatter_text)
return frontmatter, body
except yaml.YAMLError as e:
print(f"Error parsing YAML: {e}")
return {}, content

def get_english_slug(chinese_slug: str, title: str) -> str:
"""Get English slug from mapping or generate from title"""
# Try direct mapping first
if chinese_slug in TITLE_TO_SLUG_MAPPING:
return TITLE_TO_SLUG_MAPPING[chinese_slug]

# Try to extract from title
clean_title = title.replace('"', '').replace("'", "").strip()
if clean_title in TITLE_TO_SLUG_MAPPING:
return TITLE_TO_SLUG_MAPPING[clean_title]

# Fallback: simple transliteration
slug = re.sub(r'[^\w\s-]', '', chinese_slug.lower())
slug = re.sub(r'[-\s]+', '-', slug)
return slug.strip('-')

def migrate_article(md_file: Path) -> bool:
"""Migrate a single article to English slug"""
print(f"\nProcessing: {md_file.name}")

# Read current file
with open(md_file, 'r', encoding='utf-8') as f:
content = f.read()

# Extract frontmatter
frontmatter, body = extract_frontmatter(content)

if not frontmatter:
print(f" ⚠️ No frontmatter found, skipping")
return False

# Get current slug and title
current_slug = frontmatter.get('slug', '')
title = frontmatter.get('title', '')
date = frontmatter.get('date', '')

# Generate English slug
english_slug = get_english_slug(current_slug, title)

print(f" Current slug: {current_slug}")
print(f" English slug: {english_slug}")

# Update frontmatter with new slug format
frontmatter['slug'] = f"/blog/2025/{english_slug}"

# Generate new filename
# Extract date from current filename
filename_parts = md_file.stem.split('-', 3)
if len(filename_parts) >= 3:
year, month, day = filename_parts[0], filename_parts[1], filename_parts[2]
new_filename = f"{year}-{month}-{day}-{english_slug}.md"
else:
new_filename = f"{english_slug}.md"

new_filepath = md_file.parent / new_filename

# Build new content with updated frontmatter
frontmatter_yaml = yaml.dump(frontmatter, allow_unicode=True, sort_keys=False, default_flow_style=False)
new_content = f"---\n{frontmatter_yaml}---\n{body}"

# Write to new file
with open(new_filepath, 'w', encoding='utf-8') as f:
f.write(new_content)

print(f" ✅ Created: {new_filename}")

# Delete old file if different
if new_filepath != md_file:
md_file.unlink()
print(f" 🗑️ Deleted: {md_file.name}")

return True

def main():
blog_dir = Path('website/blog')
migrated_count = 0

# Get all 2025 articles (excluding welcome.md)
articles = sorted([f for f in blog_dir.glob('2025-*.md') if 'welcome' not in f.name])

print(f"Found {len(articles)} articles to migrate\n")
print("="*70)

for md_file in articles:
if migrate_article(md_file):
migrated_count += 1

print("\n" + "="*70)
print(f"✅ Successfully migrated {migrated_count}/{len(articles)} articles")

if __name__ == '__main__':
main()
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
---
slug: /blog/2025/engineering-practice-doing-small-things-well
title: 工程实践分享 | 把小事做好
authors:
- techcamp
tags:
- ai
- architecture
- career
- compiler
- engineering
- go
date: 2025-01-15
description: 在日前举办的第三期 1024 实训营结营成果展示会上,导师杨寒星基于同学们的展示,分享了他的一些看法,也阐述了为什么做好小事对开发者的个人成长具有积极的意义。
---

在工程实践中,做好小事非常重要。

在日前举办的第三期 1024 实训营结营成果展示会上,导师杨寒星基于同学们的展示,分享了他的一些看法,也阐述了为什么做好小事对开发者的个人成长具有积极的意义。

* 杨寒星 GitHub:https://github.com/nighca

## 一些启发
![pic-1](/img/blog/工程实践分享-把小事做好/11111.png)

要在3个月内实现Go+ Builder向导系统,这是一个复杂且工作量巨大的任务。同学们需要涵盖从调研到设计再到实现的整个流程。而且,Go+ Builder项目已有一定基础,需在此基础上进行设计、添加功能和编写代码,必然会面对一定的复杂性。此外,同学们还需在实现过程中解决许多具体问题(例如,如何实现代码检测)。

这个过程对我也有一些启发。以代码检测为例,我们在设计这一功能时,考虑过逐字符匹配、正则表达式,甚至通过编译器解析代码并检查抽象语法树(AST)来判断用户输入是否正确。经过多种方案的思考,我们最终想到利用大模型解决这个问题。这是一个典型的例子,展示了大模型如何改变我们既有的交互范式,进而影响我们解决问题的方式。

## 把小事做好
![pic-2](/img/blog/工程实践分享-把小事做好/22222.png)

这次实训过程,因为时间紧、任务重,我们在过程中对很多“似乎暂时不影响功能实现”的细节关注得并不多,但今天我想借这个机会再来分享一下,我是如何看待这些“小的事情”的。

小事是指哪些事情呢?它可能包括:是否在设计/产品/技术文档中进行了精准的表述、文档的格式细节是否正确、每个模块在集成之前是否做了充分的自测、代码中的实例在生命周期结束时其副作用是否被正确清理、类型安全问题、在做复杂客户端应用时经常面临的时序问题等等。

![pic-3](/img/blog/工程实践分享-把小事做好/33333.png)

无论是文档方面,还是代码方面,这些“小事”暂时不处理似乎也没什么问题,反正项目可以继续、功能也能实现、用户也能使用,但其实,把小事做好,无论是对项目,还是对个人,都是很有意义的。今天,我们主要谈谈,“把小事做好”对个人的积极意义。

**做好了刚才提到的那些小事,也许只能把一个项目从 80 分变成 90 分,或是从 60 分变成 80 分,但这个过程所需要的个人知识技能则可能是从 20 分变成了 80 分。根据二八原则,当你掌握 20% 的技能,你就能够搞定 80% 的事情,但如果你想额外搞定 10-20% 的事情,这可能就会需要你再增加 80% 的知识技能。**

比如,如果你要在文档中进行准确表述,这就会对你的逻辑梳理是否清晰、表达能力是否良好有很高要求;如果你总是在集成模块前做充分自测,那你就会主动提高自己代码的可测试性,进而去了解/借鉴好的编程范式,当你提高了代码的可测试性之后,也许你就可以尝试通过编写自动化的测试用例来做测试,即使不能完全自动化,你去手动构造测试用例的过程也会变得更简单;为了做好代码副作用的管理,你得去了解并遵循系统/框架中既有的副作用的管理机制,或在必要时自己构建这样的机制;如果你总是想尽可能可靠地、体验更好地解决时序问题,那么你就不得不去了解 UI 框架的渲染行为的细节,再更深入一些的话,你甚至会发现不同框架的渲染行为的细节是有共同相似点的,其实它们反映的是交互界面的代码编写过程会遇到的一些共性问题,你只有深入细节才有可能去看到这些背后的共性的问题。所以,关注细节是个人技术成长很重要的一个驱动力。

关注细节、尝试把这些看上去好像不重要的事情做好,也有助于让你对“坏味道”敏感——文档写得不准确、设计不完善导致有风险、代码隐藏了潜在问题等等。这就好像一个有洁癖的人,他总是能第一时间感知到周围环境的不干净。当你养成了对“坏味道”的敏感,它对你个人后续的产出效率、产出质量,也是有好处的。

## 附:Go+ Builder 向导系统项目简介
Go+ Builder 为创作者而生! 它不仅仅是一个游戏编辑器,更是一个旨在帮助用户提升计算思维和系统设计能力的教育工具。通过 Go+ builder,用户可以直观地理解和构建复杂系统,培养解决问题的能力。

基于 Go+ Builder 的发展现状,本期实训同学们将实现 Go+ Builder 的向导系统,降低用户的使用门槛与学习成本,可能的手段包括但不限于:UI 引导、交互式教程、使用文档、帮助机器人等。
* Go+ Builder Github Repo: https://github.com/goplus/builder
* Go+ Builder 线上环境: https://builder.goplus.org

更多实训项目详情与干货分享,欢迎点击「阅读原文」,

或在B站搜索「七牛云」官方账号,

观看「1024实训营(第三期)」视频合集。
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
---
slug: /blog/2025/engineering-practice-coding-is-not-first-step
title: 工程实践分享|“写代码”不是第一步!
authors:
- techcamp
tags:
- ai
- architecture
- compiler
- engineering
- go
- llgo
date: 2025-01-17
description: 在 2025 年 4 月 7 日晚举办的第三期 1024 实训营结营成果展示会上,来自七牛云 Go+ 团队的技术专家、Goproxy.cn
开源项目作者、大学生创业者、连续创业者盛傲飞,作为 LLPkgStore 小组的带教导师,为同学们带...
---

## 引言

在 2025 年 4 月 7 日晚举办的第三期 1024 实训营结营成果展示会上,来自七牛云 Go+ 团队的技术专家、Goproxy.cn 开源项目作者、大学生创业者、连续创业者盛傲飞,作为 LLPkgStore 小组的带教导师,为同学们带来了一场极具启发性的项目总结分享——以过去三个月实训项目为蓝本,阐述了软件开发实践中"写代码不是第一步"的核心命题,并针对本次实训项目开展了一段小结性质的内容分享。

- 盛傲飞 GitHub 个人主页:https://github.com/aofei

## “写代码”不是第一步

![RUNOOB 图标](/img/blog/工程实践分享写代码不是第一步/导师总结分享的PPT模板_01.png)
实训过程中,让我印象挺深的是,同学们接到任务后,比起先进行设计或讨论,普遍都更偏好直接开始写代码。这看起来非常“积极主动”,但后面发现这会带来重复返工、接口没对上、理解不统一等各类问题。

并不是说写得快就是不好的,我自己以前也经常这么干。但慢慢地,我会意识到,写代码不应该是第一步。

尤其是现在我们身处 AI 时代,GitHub Copliot、Cursor 等各类 AI 编程工具,已大幅降低了写代码的门槛。于是,“怎么写”已经不是最大的问题了,反倒是“写什么”、“怎么设计”这些问题变得更难、也更重要。

很多时候,真正要花时间动脑子的,是写代码之前的那部分工作——我们到底要解决什么问题、输入输出是什么、和其他模块该怎么协作、以及什么才是更简单或更合适的解决方案等。

同学们可以尝试养成一个小习惯,哪怕只是写一页草稿,也要提前把目标、输入/输出接口这些问题想清楚,这能帮你省下很多后续的沟通成本、返工时间。这不仅是为了更好的交付,也是一种更顺畅的团队合作方式。没画图纸就盖楼,盖得快,也塌得快。有时候一开始慢一点点,其实能让你走得更稳,也走得更远。

## 项目小结:依赖管理,不必重头来过

![RUNOOB 图标](/img/blog/工程实践分享写代码不是第一步/导师总结分享的PPT模板_02.png)
另外,我想针对本次课题做一个小结性质的内容分享。

在 LLPkgStore 这个项目中,我们面对的第一个挑战是 C/C++ 库的依赖到底该怎么管理?这类库不像 Go 生态那样有统一的版本规范、标准的模块机制,甚至有时候连个固定格式的版本号都没有。一开始我们想过是不是该从 0 开始去设计一套全新的依赖管理系统,彻底推翻重来。但最后,我们还是选择了不另起炉灶,而是在 Go Modules 的机制之上做延展。

这个决策的出发点其实挺简单的:

(一)Go Modules 已经解决了依赖管理中最核心的一些问题,比如它有清晰的版本语义模型(SemVer + MVS),为我们提供了基础保障的约束版本演进的逻辑。

(二)它的工具链非常完善,像是 Go Get、Go List、Go Module Proxy 等都是现成能用的,开发者也都对它们非常熟悉,这意味着迁移成本非常低,学习门槛也非常低。

(三)还有比较重要的一点,它具备天然的对可复现构建的支持。我们特别想强调一下,没有可复现构建保证的系统,其实本质上不能算是一个真正的依赖管理系统。如果一个系统今天构建得出来,明天因为网络、下游变动等变量因素就构建不出来了,或者说构出来的内容不一样了,那它就完全不具备可被信任的基础。Go Modules 的版本号、代码快照、构建路径都固定下来了,本质上是为了让每次构建都是可验证的,可复现的。这是我们在做跨语言依赖管理时,必须要继承下来的一个底线!

我们希望把 Go Modules 当做一个稳定的地基,在上面做一些针对性的增强。我们做了三件事:

(一)引入了 LLPkg 这个概念,把 C/C++ 库封装成 Go Modules 的风格的单元,统一了消费方式。

(二)为官方 LLPkg 设计了 llpkgstore.json 映射机制,在一定程度上弥补了 C/C++ 库原始版本号混乱的问题。

(三)构建了一套自动验证、构建与分发的工作流,补上了 Go Modules 无法覆盖的那部分,比如,二进制管理。

所以,我们并没有从 0 开始写一套全新的东西,而是搞清楚什么是已有系统里真正有价值的部分,然后在它之上构建新的能力——我们不是在重新造轮子,而是让轮子跑得更远。

## 附:LLPkgStore 项目简介

本期实训营的同学们围绕「LLGo 依赖管理」展开探索,重点讨论如何让 LLGo 能像管理普通 Go 包一样来管理 C/C++ 库。

在本次实训中,同学们提出了 LLPkgStore 方案,通过维护版本映射表、引入多层验证与可复现性构建,并结合 C/C++ 专用的二进制管理器(Conan),尝试为 LLGo 构建更完善的依赖管理机制。最终目标是让 LLGo 开发者能更加便捷地使用和分发 C/C++ 库,为跨语言开发带来更多可能。

从依赖版本的语义化转换,到官方/第三方包的分发与安全审计,再到自动化的构建测试流程,本期实训营通过一系列实战与迭代,搭建起了 LLGo 的全新生态雏形。未来,随着更多工具链和社区力量的加入,LLGo 有望进一步打破语言边界,成为跨语言开发的一站式解决方案。

- LLGo 官方仓库:https://github.com/goplus/llgo

- LLPkgStore 工具链仓库:https://github.com/goplus/llpkgstore

- LLPkg 产物仓库:https://github.com/goplus/llpkg

更多实训项目详情与干货分享,欢迎点击「阅读原文」,

或在 B 站搜索「七牛云」官方账号,

观看「1024 实训营(第三期)」视频合集。
Loading