
说起来挺有意思的t3code这个代号最初只是我本地文件夹里的一个名字——tech tools code的缩写用来装散落的脚本和笔记。做着做着它慢慢从一个文件夹变成了一套完整的个人开发者工作流。今天想把这个代号背后的完整思路和落地过程整理出来包括我踩过的坑、改过的方案、以及那些真正让效率产生质变的细节。这篇文章写给两类人一类是刚开始整理自己代码库的初学者另一类是已经有一套工作流但想参考别人方案的老手。无论你处于哪个阶段我希望这篇文章能给你一个可以直接复制的参考模板而不是空泛的要规范口号。1. 整体设计与思路拆解t3code到底在解决什么问题先说清楚t3code不是某个开源框架也不是一个我看过的教程项目。它是我自己搭建的一个个人技术工作区核心目标是解决三个很具体的问题碎片化知识的归集、可复用代码的沉淀、以及开发环境的快速重建。1.1 碎片化知识的归集做开发这么多年最痛的不是不会写代码而是我记得我写过类似的东西但找不到了。以前我的电脑里散落着各种命名混乱的文件test1.py、final_final.js、工具脚本(3).zip。每次要用的时候都得翻半天翻到之后可能还要读一遍代码才能想起来当时是怎么实现的。t3code的第一步就是把这些碎片统一收拢到一个结构化的仓库里让找得到变成最基本的要求。我选用了本地目录 Git仓库 Markdown索引三层结构。本地目录负责物理存储Git负责版本追踪和时间轴回溯Markdown索引负责语义化的导航。三层各司其职你不需要为了找一个脚本去打开庞大的项目管理工具也不需要担心误删文件找回不了。这套结构还解决了另一个隐性问题知识的半衰期。当你的片段以问题描述 解决方案 适用场景的形式沉淀下来时即使几个月后再翻到也能在十秒内恢复上下文。而以前那种裸文件隔段时间再看往往得重新推导一遍。1.2 可复用代码的沉淀第二个痛点是重复劳动。我统计过自己的开发节奏很多工具函数的逻辑其实是高度相似的比如时间格式化、数组分组、接口错误处理。以前每次写新项目都要重新写一遍或者去网上搜一段搜来的还要改格式改风格。t3code把这类高频代码做成标准模块统一风格、统一注释、统一测试新项目直接复制或通过包管理器引用。这个思路的关键在于沉淀时机不是做完了才沉淀而是每写完一段通用的代码当场就把它抽出来放进仓库。很多人做知识管理失败就是因为收集和整理分得太开攒了一大堆再整理会很累。我自己用的原则是5分钟内完成沉淀超过5分钟就先记个TODO稍后再补。1.3 开发环境的快速重建第三个问题来自换机器。以前换电脑或者重装系统的日子就是灾难日环境变量能配一天依赖装到崩溃还总有漏网之鱼。t3code里专门有一个env/目录用来管理shell配置、编辑器设置、常用工具清单再加上一键初始化脚本。实测下来从裸系统到完整可用环境的时间从一整天压缩到了大概一个半到两小时剩下的时间主要花在等下载上。这个设计背后其实是一个很朴素的理念把环境当作代码来管理。配置文件用版本控制安装步骤写成脚本这样在任何一台新机器上你都能通过同样的方式复现自己的工作环境。环境不再是一个不可言说的黑盒而是一份可以审阅、可以回滚的资产。2. 核心细节解析与实操要点目录设计、工具选型与规范这一节我直接把t3code的目录结构和具体工具选择摊开来讲。为什么这么分、为什么选这个工具都会给出理由方便你根据自己的情况调整。2.1 目录结构功能边界要清晰先看我的目录设计t3code/ ├── README.md # 总入口说明这个仓库是什么、怎么用 ├── scripts/ # 可复用的脚本和工具函数 │ ├── python/ │ ├── shell/ │ └── javascript/ ├── notes/ # 技术笔记和踩坑记录 │ ├── database/ │ ├── frontend/ │ ├── backend/ │ └── devops/ ├── templates/ # 项目模板和脚手架 │ ├── flask-api/ │ ├── react-web/ │ └── cli-tool/ ├── env/ # 环境配置和初始化脚本 │ ├── shell/ │ ├── editor/ │ └── setup.sh └── docs/ # 较完整的文档和方案设计这个目录结构的核心原则是按生命周期分而不是按语言分。scripts/放的是成熟可复用的代码notes/放的是半成品思想和踩坑记录templates/放的是整块的项目骨架env/放的是环境相关。这样你在写新代码的时候不会在旧笔记里翻来翻去你在记笔记的时候也不会被已经成熟的代码干扰。有一个细节值得强调scripts/里面按语言分子目录但notes/按技术领域分子目录。为什么因为脚本的复用单位是语言而笔记的检索单位是领域。你在写Python的时候去找Python的工具函数比按领域找更快你在排查数据库问题的时候去找数据库的笔记比按语言找更合理。这个区分看起来微小实际用起来体验差异很大。2.2 工具链选型为什么是Git、Makefile和VS Code工具选型我坚持少而稳的原则。核心工具只有三个Git做版本管理Makefile做任务编排VS Code做日常编辑。Git的选择没什么悬念它解决的是回溯和同步两个问题。我用Git管理t3code的整个目录配合一个私有远程仓库做多设备同步。初始化的那一批代码可能不怎么规范但没关系Git的价值恰恰在于允许你随时提交一个不完美的中间状态关键是每个阶段都有据可查。Makefile可能有些人觉得过时了但我觉得它依然是任务编排里最直白、最少依赖的方案。我不需要安装额外的自动化工具只需要在根目录写一个Makefile把常用的操作封装成快捷命令。比如setup: # 初始化环境 bash env/setup.sh test: # 运行所有测试 python -m pytest scripts/python -q lint: # 代码风格检查 ruff check scripts/python sync: # 提交并推送所有改动 git add -A git commit -m sync: $(shell date %Y-%m-%d) git push然后我只需要记住几个命令make setup、make test、make lint、make sync。不需要背一大串git命令也不需要Excel表记录我该怎么做。Makefile在这里的定位不是构建工具而是命令的收纳盒把反复敲的命令压缩成一个词。VS Code作为编辑器是我权衡后的选择。它的优势不在于功能多而在于生态成熟、配置即文件。我的整个编辑器配置都放在env/editor/里面包括settings.json和推荐插件清单。新机器上装完VS Code导入配置文件十分钟回到熟悉的编辑体验。这里有个技巧把常用的插件列表写进一个extensions.txt然后用code --install-extension批量安装比手点快得多。2.3 规范制定可执行比完美更重要做个人项目的时候最忌讳的就是定一套宏大但根本执行不下去的规范。t3code的规范只有三条命名有意义、提交信息可读、代码必须有注释头。命名有意义文件或者目录的名称必须能让人不看内容就知道大概用途。比如你看到split_csv_by_date.py就知道这是个按日期拆分CSV的脚本而test333.py就不行。我甚至会把日期 用途作为脚本的命名模式例如2025-06-01_fix_encoding.py这样在文件管理器里按名称排序时间线和用途都一目了然。提交信息可读Git提交信息用type: description的格式。feat:表示新功能fix:表示修复docs:表示文档变动refactor:表示重构。这套规则其实就是Semantic Commit的简化版个人项目不需要走完整规范但前缀的作用不能丢——它让你的提交历史变成一张可阅读的时间线。代码必须有注释头每个脚本开头必须有三行注释用途说明、使用方法、依赖项。这三行注释的成本极低但价值极高。你想想一个只有20行的脚本可能过三个月你就忘记它是干嘛的了但如果开头写了从API拉取订单数据输出Excel依赖requests库三秒就能恢复上下文。这三条规范看起来很简单但如果你能坚持仓库的可维护性会提升一个量级。我一个很深的体会是写代码的时候花30秒写注释能省下将来搜索和回忆的30分钟。3. 实操过程与核心环节实现从零搭建t3code这一节我从实际操作的角度逐步记录搭建t3code的过程。每一步都会说清楚做了什么、为什么这么做、以及执行时的现场情况。3.1 初始化仓库与目录骨架首先创建目录骨架。我在本地建了t3code文件夹然后用手动命令创建了上述的各个子目录。为什么不用cookiecutter之类的脚手架因为此时我还在摸索期结构随时可能调整手动创建更灵活成本也最低。mkdir -p t3code/{scripts/{python,shell,javascript},notes/{database,frontend,backend,devops},templates,env/{shell,editor},docs}这条命令用了bash的大括号扩展一行就创建了所有子目录。如果你是Windows用户用PowerShell或者直接右键新建文件夹都行结构一致即可。目录建好后我在根目录运行git init把整个文件夹变成Git仓库。紧接着创建一个README.md不写废话就写四件事这个仓库是什么、目录结构说明、怎么初始化环境、怎么贡献内容。README的定位是总入口是给一个月后的自己看的操作手册。很多个人项目的README写得像公司官网我觉得没必要你自己用就写对你最有用的信息。3.2 搭建环境配置与初始化脚本环境配置是t3code里我最满意的部分之一因为它直接改变了换机器这个场景的体验。我先把当前的shell配置整理出来.bashrc或.zshrc里面的别名、函数、环境变量都抽离到env/shell/下的独立文件里然后在主配置中统一source这些文件。# env/shell/aliases.sh alias llls -alF alias gsgit status alias gpgit push alias uuiduuidgen | tr A-Z a-z # 生成小写UUID写脚本时常用为什么要把别名抽成独立文件因为隔离职责。主配置只管加载具体的内容按功能分散。花半天时间把散落多年的别名、函数、变量全部归类以后维护只需要改对应的文件而不是在几百行的配置文件里CtrlF。初始化脚本setup.sh做的事情很直接检测当前系统、安装基础工具、配置Git全局信息、导入编辑器设置。核心逻辑是幂等性——重复执行不会出问题。这一点非常关键因为初始化脚本往往要跑很多次如果第二次运行就报错这个脚本你就不想用了。#!/usr/bin/env bash set -euo pipefail # 检测包管理器 if command -v apt-get /dev/null; then PKG_MANAGERapt-get elif command -v brew /dev/null; then PKG_MANAGERbrew elif command -v pacman /dev/null; then PKG_MANAGERpacman else echo 未知的包管理器请在脚本中手动配置 exit 1 fi # 安装基础工具按需扩展 basics(git curl wget jq python3 tree) for tool in ${basics[]}; do if ! command -v $tool /dev/null; then echo 正在安装 $tool ... $PKG_MANAGER install -y $tool else echo $tool 已安装跳过 fi done # 导入shell配置 for f in env/shell/*.sh; do # shellcheck source/dev/null source $f echo 已加载 $f done echo 环境初始化完成。注意这段脚本里我用了set -euo pipefail这行命令的意思是遇到错误立即退出-e、变量必须提前定义-u、管道中的失败也要被发现-o pipefail。个人脚本特别建议加上这行否则出错了还会继续执行最后搞出更大的问题。另外每个工具的安装都先检测是否已存在避免重复安装浪费时间。3.3 编写模板与标准脚本以通用脚本为例目录骨架搭好之后真正的价值在于里面的内容。我先从最常用的模板开始写。第一个模板是Python命令行工具的标准骨架。我在templates/cli-tool/下放了这样一套文件templates/cli-tool/ ├── README.md ├── requirements.txt ├── cli.py └── tests/ └── test_cli.pycli.py的开头固定使用模板#!/usr/bin/env python3 用途一句话说明这个脚本做什么 用法python cli.py --input 文件 --output 目录 依赖pandas, requests import argparse import sys def parse_args(): parser argparse.ArgumentParser(description脚本说明) parser.add_argument(--input, requiredTrue, help输入文件路径) parser.add_argument(--output, requiredTrue, help输出目录路径) return parser.parse_args() def main(): args parse_args() print(f输入: {args.input}) print(f输出: {args.output}) # TODO: 在这里实现你的核心逻辑 if __name__ __main__: sys.exit(main())这个骨架的价值是什么是把你从空文件面前发呆的状态里解放出来。看到这个骨架你只需要改三处开头的注释、参数定义、main函数里的TODO。这比我以前每次从零开始敲import sys快得多也更不容易漏掉参数校验。第二个我沉淀的高频模块是文件时间线命名的小工具脚本。它的作用是把散乱的文件按照YYYY-MM-DD_description.ext的规则批量重命名。因为我的桌面、下载目录常年被截图和导出文件塞满这个脚本可以直接扫描指定目录、解析文件修改时间、生成新文件名并重命名。写这个脚本只花了不到半小时但它每个星期都帮我省下至少十分钟的整理时间属于典型的切小刀越用越顺手。写完这些模板之后我意识到一个事情模板和脚本的边界在于可变性。如果一段代码每次使用时变化的只有参数那它是脚本如果每次使用时连结构都要改那它应该做成模板。这个判断标准让我的仓库分类非常清晰不会有这个带参数的脚本到底放scripts还是templates的纠结。3.4 建立索引与检索机制仓库内容变多了以后新的问题出现了我知道某个东西在仓库里但忘记放在哪了。为了解决找得到的问题我引入了索引机制。最底层是README.md中的目录说明它只负责宏观导航。真正承担检索职能的是每个子目录下的INDEX.md。比如notes/database/INDEX.md里会列出每篇文章的标题、日期和摘要# 数据库笔记索引 ## 2025-01-05 MySQL索引失效场景梳理 - 场景联合索引最左前缀、or条件、函数包裹 - 结论explain看type避免全表扫描 ## 2025-02-12 Redis缓存更新策略 - 场景Cache Aside vs Write Through - 结论写多读少的场景用Cache Aside配合TTL兜底这个INDEX.md就是我的数据库知识地图。每次记录新的笔记时顺手在索引里加一行成本几乎为零但检索效率的收益非常高。我甚至不需要打开笔记正文扫一眼索引就能定位到需要的内容。检索机制的最后一环是全文搜索。VS Code的全局搜索CtrlShiftF配合文件名搜索CtrlP基本覆盖了95%的检索需求。我没有引入更复杂的全文搜索引擎不是因为不支持而是因为对于一个个人仓库复杂工具的维护成本可能会高于它的收益。先把简单方案用到极致不够再说。4. 常见问题与排查技巧实录我踩过的坑和解决思路任何项目做到第四个月都会遇到一堆意料之外的问题。这一节我挑几个典型问题记录当时的现象、排查思路和最终解决方式。4.1 问题一Git推送冲突导致本地工作区混乱有一段时间我在公司和家里两台电脑上交替更新t3code结果某一次在家里提交完推送失败公司这边拉取又报冲突。当时我对Git的了解只停留在add/commit/push/pull这四板斧冲突解法靠着反复搜索最后还是把工作区弄乱了。现在的方案是先拉后推、有冲突先看状态再动手。具体操作是git status # 先看本地有哪些改动 git stash push -m temp # 有改动但不想丢先暂存 git pull --rebase # 用rebase方式拉取 git stash pop # 把暂存的改动放回来 git push # 确认没问题再推送pull --rebase是我的常用首选因为rebase会把你的本地提交叠放在远程提交之后历史是一条直线更清爽。相比merge自动生成一个合并提交rebase的历史干净很多。但这里要特别提醒不要在多人协作的分支上随意rebase。个人仓库随便玩团队仓库还是听项目负责人的约定。t3code是单人仓库所以选rebase没毛病。4.2 问题二Python脚本依赖冲突系统环境被搞乱早期我直接pip安装了一堆包某次装了一个需要旧版requests的库结果把另一个脚本的环境搞坏了。排查过程很痛苦脚本A能跑脚本B报错实际上都是依赖版本不一致造成的。现在我的规矩很明确每个Python脚本项目必须带requirements.txt或使用虚拟环境。更简单一点的做法是常备一个名为venv的虚拟环境所有开发安装优先进入这个环境而不是污染系统Python。在setup.sh里我把这步自动化了python3 -m venv .venv source .venv/bin/activate pip install --upgrade pip pip install -r requirements.txt实测下来用了虚拟环境之后依赖冲突的概率基本降到了零。还有个小技巧pip freeze requirements.txt虽然常用但会把所有传递依赖都锁进去导致升级时很痛苦。更好的做法是手动维护requirements.txt只写直接依赖注释写明版本下限。4.3 问题三笔记写了不更新索引知识库变成垃圾堆索引机制刚建好时挺好用过了一个月再看有些笔记忘了更新索引导致INDEX.md和实际内容脱节。这时候我意识到一个好的机制必须配有触发点否则坚持不下去。我的解决办法是给沉淀流程做一个极简规则每记一条笔记两分钟之内同步更新所属目录的INDEX.md。如果当时没时间就在笔记文件头部加一行状态标记status: pending-index周末统一扫一遍pending-index的笔记补齐索引。这个规则听起来很小但它让索引不依赖记忆而是依赖即时动作。人的记忆不可靠动作可以养成习惯。类似的标记还有status: draft表示草稿、status: done表示完整。我用这些状态标记管理笔记的生命周期避免仓库里堆满写了一半不知道是否可靠的内容。搜索时也可以直接过滤status: done来寻找可信内容。4.4 问题四模板更新了旧项目怎么同步模板不是一成不变的随着实践深入templates/cli-tool的骨架也在迭代。问题是已经用旧模板创建的项目怎么拿到新模板的改进我试过直接覆盖旧项目的文件结果把人家项目里改过的部分也冲掉了。后来想出一个更稳的做法模板仓库的CHANGELOG.md记录每次变化每个模板目录下都有这个文件。旧项目想升级时对照CHANGELOG.md手动挑需要的改动而不是无脑覆盖。这个做法牺牲了一些效率但保证了安全性。毕竟个人项目里的代码很多都是能跑就别动的状态贸然覆盖才是最大的风险。最后再分享一个小技巧做t3code这段时间我觉得最有价值的不是哪个脚本或哪份笔记而是它让我养成了一种随时沉淀的肌肉记忆。写代码的时候顺手抽通用函数遇到坑时顺手记笔记新增工具时顺手写进环境脚本。每次只花几分钟但几个月的积累下来你会拥有一个真正属于自己的知识资产。如果你也想搭一套自己的t3code不用照着我的目录结构全盘复刻。抓两条主线就行一是让常用的东西找得到二是让折腾过的环境可重建。具体怎么组织用Git还是别的工具都可以根据你的习惯调整。唯一要记住的是这套系统是给你自己用的它的好坏只有你用起来才知道。别一开始想太复杂先跑起来用着用着自然会找到最适合你的节奏。