📒浅谈计算机教育中缺失的一课&学习笔记

字数 3710阅读时长 10 分钟
2026-7-6
2026-7-8

写点什么

💡
最后一次更新:2026.7.8
missing-semester,这门课是以前就刷到过,也断断续续看过的一门课,名字中谈到在讲计算机教育中缺失的一课,很吸引人,主要是介绍shell,vim,git,agentic / vibe coding,开发规范,贡献与协作的相关内容。
虽然说这门课面向新生,但是他的难度已经比较大,我认为至少要在有一定linux的操作和理解基础的情况下,才能理解这里面的观点和内容。后面的开发规范的内容,更是应该建立在对python或者某种语言,已经有比较强的理解和开发能力。
💡
一言以蔽之,这一门课并不足够基础,但确实有意思。这些零碎的点一般不会有人直接提出来详细讲,甚至很多内容已经“落伍”。在一个Agent已然成为主流的时代,怕是很难有人或者学校愿意再来讲一讲vim,再来讨论shell的命令,,,毕竟大家已经习惯于在tui界面中写自然语言,还要美其名曰自己在终端开发。
可是这些内容就不重要了吗?未来不再会处理ssh连到没有界面的服务器上运维了吗?就不会有人再自己写代码和测试吗?AI Agent就能解决所有问题了吗?我还是悲观的认为不能。开发/运维……的位置难以被AI所直接替代
 
以我自己现在的水平来看,Lecture 6 和 9 值得在了解更多python,docker知识后再来学习和强化理解。
 
 

学习笔记

Lecture 1 : Introduce to shell

shell是一个程序,运行在终端中
Shell与Bash,Zsh,Powershell,语法不同
Shell本质=自动化,组合程序

Shell是什么?

~ 主目录的简写 提示符输入命令即可
echo 原样传递
echo hello world 是两个参数!!echo中通过空格分割参数
参数非常容易遇到引号问题 Bash可以稳妥处理任何参数
\ 转义符,“别把后一个字符当做特殊字符”,解析参数时,“\ ”就是普通空格,相当于参数里面的普通空格
双击与单击Tab,显示全部(双击)和补全(单击)
PATH:环境变量,名字对应字符串,依次检查文件夹
notion image
通配符:常用*?等…..
find命令很复杂 find默认递归 参数顺序会有影响,很恶心 -maxdepth 1 指定当前文件夹,0的话啥都搜不到
 

Lecture 2 : Command-line Environment

shell特有的概念
一般参数位置不重要,程序可接受多个参数,对每个参数执行相同操作

退出码&&短路求值规则

linux shell执行完命令后,整体返回一个值:
执行成功,返回0;执行失败,返回非0,一般为1
短路求值:(偷懒,看有没有必要)
a && b :如果a返回0(成功),才执行b。因为如果a返回非0,即失败,则没有执行b的必要
a || b:如果a返回0(成功),则跳过b。因为a成功意味着式子值为真,无需继续执行。即只有a返回非0(失败),才执行b。
grep -q即—quite,静默执行不输出,此处只用返回码所以就这样写
如果在file.txt中找到了hello(返回0),则&&后逻辑被执行,输出“找到了”, || 逻辑则不执行
如果没找到,&&逻辑不执行,|| 逻辑被执行

Signal 信号机制

Ctrl+C就是向程序发送信号使其停止,程序可接受这个信号并处理,使其不停止
 

SSH

ssh [email protected] ssh密钥 ssh-copy-id 把公钥拷到服务器
tmux可分屏,先按Ctrl+B,在按C开新窗口
先按Ctrl+B,再按0,1,2,3即可在多个窗口间切换
tmux能保持状态,补货断开连接,适合做持久化
 

自定义Shell

sudo apt install tmux
rg import -t py //grep的升级版
export PATH=”$PATH:path/to/append” 会在PATH的后面加上:path/to/append(注意,这样做只会保证当前Shell和继承Shell中修改PATH,并未持久化。打开新的Shell再执行echo $PATH就会发现值并没有变,如果要变PATH,需要改配置文件)
.bashrc 交互式shell的配置 .bash_profile 一般性shell
💡
今年的这一节课里面都出现llm和claude code了,太感动了,老师还开了claude pro
 

Lecture 3 : Development environment and tools

Cursor!!!!这是VS Code的衍生版哦

Vim(modal editor 模态编辑器)

一种针对开发场景优化的文本处理方式 Vim相当于编程语言
三种模式:Normal,Insert,Command(Visual)
💡
Normal to Insert : i Insert to Normal : Esc
Normal to Command: :
Normal
方向键直接用,w向前挑一个词,b向后跳一个词,0回行首(5w就是w执行五次),a追加文本,直接进insert
大幅度:m中间,g到底部,gg回顶部,Ctrl+D下翻,Ctrl+U上翻
:123 跳转行
f+字母或字符 跳转下一个出现该字符
/字符
 
Command
:wqa w写入,q退出,a强制
 

IDE

LSP协议,语言服务器。通过该协议,ide与对应编程语言进行通信
善于使用内联聊天,推荐github copilot?
 

Lecture 4 : Debugging and Profiling

打印调试,日志,日志分级,分部分进行日志分析
gdb,lldb,linux上的rr(可能影响程序的运行,所以使用确定性调度器)
反向调试,rr可以反向执行,但对虚拟机兼容性不好,需linux
(感觉太抽象了,硬听听不懂,下一节)
 

Lecture 5 : Vision Control and Git

git的根本:快照,相当于顶层树
文件为 “blob” ,文件夹为“tree” 建模
git是有向无环图,一组父节点(每次的提交都指向上一层的父节点) ,提交通过指针指向上一次提交的sha1(40位),sha1与blob,提交,树绑定并用于识别
notion image
Reference 引用
将sha1绑定到提交上,是一种映射关系
Git的历史是不可变的?改图的话hash会变,所以就不能改前面的提交内容。所谓“雪崩效应”,就是在尝试篡改git历史后,会出现sha1值的变化,引起指向他的提交的hash被改变,导致后续hash全部无效
数据不可变,但git可以rebase,尝试“修改历史”,原有的链被废掉但是没删掉,所以从网安向的角度考虑,通过.git中的文件来恢复原有的链,从而恢复commits
notion image
网安向可参考Githack,通过.git泄露对整个仓库的重建
GitHack
lijiejieUpdated Jul 7, 2026
 
了解git的工作方式:git cat-file
查看快照文件的内容:用git cat-file [xxxxxxxxxxx](sha1)一层一层看,现看commit,再看tree,最后看到file
 

Lecture 6 : Packaging and Shipping Code

 

Dependency

python to pip 递归遍历所有依赖项,从父依赖向子依赖注册安装,pip list
依赖冲突:找不到兼容的版本
 
对管理python环境的思考:
1.在常规情况下,使用pyenv和venv来管理,python原生,麻烦,还是uv香
2.使用更现代化的uv集成管理python环境(推荐,也简单)
uv tree 查看依赖树
语义化版本号,a.b.c,a:Major,b:Minor,c:Patch
对于开发应用,期望所有用户体验一致时,使用精确版本号范围(直接依赖,甚至指定间接依赖);对于开发组件,则使用宽泛版本号范围
 

Docker(后面学)

Dockerfile
 
学习发布pip包?可以用test.pypi.org
要学docker相关内容,待补充
 

Lecture 7 : Agentic Coding

开场就是用claude code
迭代
了解各种接口
llms.txt
可复用提示词

Lecture 8 : Beyond the Code

工程师必备的软技能

技术写作

注释:应该写无法直接从代码中所读出来的信息;Todo也写,适合用grep去查找;为什么没选默认项?;写好自己的思考
Readme.md:干啥的?为啥有意思?咋用?咋装?保持简洁,快速查阅
commit message:演变的记录,为啥要这么做?什么问题促使了更改?考虑了其他办法?权衡或影响?做出了取舍,就应该说明。AI写?应该确保上下文包含细节。
逻辑和语义上独立的,加入到独立的commit中,便于独立查看变更。
尊重读者的时间:如果我来读?我愿意认真看吗?仔细审查AI的文本。
 

协作

多花精力,确保提交能高效利用maintainers的时间。
让贡献更有价值,写好 bug 报告:预期结果,实际发生,复现步骤,已试过的办法,看过代码(?)等情况。提供一个最小的错误示例,只保留出现bug的部分。
不要制造噪音。只真正comment有意义的内容。
要提交:先看项目的Lisence,看好许可。contributing.md也很重要,看清楚维护的方式。为他人的长期维护做好准备,他人会为代码负责。
少用全局变量,会影响测试。
运用了AI就应该明确指出,要坦诚
 

Lecture 9 : Code Quality

Code formatter 代码格式化器

eg.单引号or双引号,二元运算符要空格吗?
通过.editorconfig进行编辑器设置的同步
 

linters

通过规则,在静态情况下进行检查。做语法与语义化检查,找潜在问题
 

tests

分离测试和集成测试
在意代码覆盖率:就是已通过test覆盖的代码,多进行测试能提升功能稳健性
基于值的测试 和 基于属性的测试(会生成大量符合属性的随机值来确保代码稳健)
可以设置 git pre-commit hooks 来设置在每次提交前进行测试
 

Regex 正则表达式(独立)

字符串模式去匹配 用于处理字符串集合和替换
(用的时候查询吧,或者问AI)
在网页上写测试数据,可查看是否能被匹配