Home
这里记录一些学习笔记。可能有汉语可能有英语,哪种顺手就用哪个了。
联系方式:tankaohuangfeng@foxmail.com
notes
一些想法
关于AI编程的一些想法
关于AI的一些看法
注:写于2026.6,是安卓课大作业报告的一部分。
我第一次真正地设计、开发一个项目是在高二的时候。当时我的英语老师每天会发一张手写的单词单,要求我们回去查单词的汉语意思并背诵,第二天默写。但是每天晚上一个个查单词意思、在纸上一遍遍默写效率很低,很没意思。于是我想,我能不能做一个背单词的软件,自动识别单词单并给出汉语意思,再提供一个默写考查的功能。
当时我会一点Java。于是那段时间,我白天上课犯困的时候就思考软件需要怎样的功能,需要怎么去设计对应的代码;晚上回家写完作业就打开电脑偷偷写程序,往往一写就入迷了,回过神来已经是两点,第二天因为语文课睡着被班主任老师赶到教室后面站着。
在那个上古时代,ChatGPT才出现不久,只有Tabnine和Github Copilot(没错当时就有一个叫这个名字的东西了)这种工具能提供一点非常聊胜于无的简单行内补全,但是给它一个需求让它自己写代码,或者问它点什么问题是不可能的。当时我也看不懂英语论坛,也没有懂技术的人可以咨询。开发过程中遇到困难时,就只能去仔仔细细地翻两本厚厚的《Java核心技术》,或者寄希望于能在某个高人的个人博客里找到答案,一点点改代码一点点试。加之时间和精力的匮乏,项目开发的速度很慢,一天能写一百行代码就可以堪称奇迹。
古法编程很慢、开发过程很艰辛,但是这确实给我提供了一个能让我尽情释放自己的想象力和创造力的机会,让我见识到了一个非常丰富的世界。虽然我的背单词软件功能简陋,从现在的角度看有很多设计的幼稚之处,但它终究是我一行行写出来的。想到一个点子、查找相关工具、构思设计框架、最终实现代码的过程,会给我一种强烈而长久的快乐。有时我会什么都不干,就单纯地一行行浏览我的代码:每一行因何而来,有怎样的考量,实现了怎样的功能,都能给我带来强烈的快乐,是我高中生活中为数不多能逃避学业压力的方法。
后来上了大学。大一没找到什么可写的。大二手写了Java期末作业,给网协写了两个项目,又找到以前那种熟悉的快乐了。这样的编程实践,使我掌握了扎实的代码技术,获得了良好的设计能力、Debug能力、快速学习能力。我亲手写出的代码、我亲自做出的设计,我都对其了如指掌,能对每一个实现、每一处细节大谈特谈。
我不算是一个技术过硬的开发者,但连我都如此,更不必说那些支撑着世界运行的各个项目:linux kernel、gcc、git、sqlite……的开发者。虽然无可避免地存在着出于商业利益等私有利益而产生的投机行为,但古法时代的开源贡献至少更难被低成本地伪造。它并不完全纯粹,也不缺乏投机者,但贡献门槛本身就会过滤掉只求名誉而无实学的人。因为它们背后是极大的沉没成本:你想给linux kernel提PR,首先需要你接受过系统地计算机知识学习,需要有大量的开发和设计经验,需要熟悉linux的技术细节,你才能知道发生了什么,要怎么解决。
然而,现在是AI时代了。AI什么都懂,它消除了为了实现某些代码而需要的知识的沉没成本,放大了人们的投机心理,让某些人变得只关心最终展现出的结果,而不再去理解这个过程。在这个疯狂的浪潮中,首当其冲的就是开源社区。
最经典的例子莫过于用AI扫描linux kernel代码,让AI一遇到代码缺陷或漏洞就提PR。这些PR,linux维护者不去合并,自己也不亏;要是合并了,自己就摇身一变变成了为linux kernel做出过贡献的技术高手。AI是有幻觉的,AI的上下文是有局限的,AI提出的建议不一定对,这些人自己也不知道交的到底对不对、需不需要改,只管能捞到一个算一个!但这就苦了linux kernel的维护者,面对这海量机器人的呓语,全都不管?万一真有有价值的呢?一个一个看?你人查代码能有我AI胡编issue快?
再比如著名的JavaScript运行时bun,曾经是扎扎实实的zig代码,不一定是手写的,但都是经过了人类的思考,通过了人类的审查得到的扎实的代码。某一天,出于无中生有的目的,有人极端地用AI将整个项目用rust重写,一周时间一百万行代码,一个PR就把无数开发者的工作化作了笑话。虽说“It passes Bun’s pre-existing test suite on all platforms”,但是所有熟悉AI编程的人都知道,AI常常写出逻辑非常奇怪的代码,简单的“通过了测试”并不能说明代码质量的任何事情。另外,莫非项目以后不再需要有人维护?凭空加了一百万行没有任何人了解的代码,以后的维护怕是也只有AI能胜任了。
开源社区使用AI加速开发效率天经地义,但是不加限制的滥用,让大量未经人类构思设计的代码涌入开源社区,反而加剧了维护者们的工作量。有些项目已经放弃了对AI低质量代码的抵抗,没有能力亲自审查来自AI的海量代码,只能全面放权AI,让AI去审AI的代码,AI去讨论AI提的issue。一个项目,看似开发者繁多、交流热烈密切,实则全是AI的提线木偶,形成了一副实在诡异的图景。
我不反对大规模使用AI编程,不是指责开发者用AI是离经叛道。人类无法拥有AI那样的知识广度,人类无法一直保持逻辑缜密、考虑全面,所以人类写的代码会有bug,有时也会写出逻辑奇怪的代码。人类不可能了解所有技术,不可能熟悉编程语言的每个细节,所以大部分时候AI的代码质量并不会比手写代码差。此外,AI设计架构、编写代码的速度,是人类所不能及的。因此,AI确实是程序开发的强大的工具。将实现代码这种费事费力,对于熟练开发者而言大多时候只是在做体力活的工作交给AI,从而将更多精力花费在设计架构、探索技术等工作上,是提升工作效率、提升工作意义的绝佳办法。
另外,AI将计算机科学的大门向普通人敞开了。虽说计算机科学的近乎一切都是开源的,它的学习和研究几乎没有物质上的成本,是对所有人开放的。但是不是谁都对编程感兴趣,不是谁都有机会去系统学习这个领域的知识,计算机的种种实际上还是属于那些有条件、有能力学习计算机的人,这并不公平。让AI生成代码去满足普通人的需要,实际上是把计算机的大门向普通人敞开了,这应当算是开源精神的一个延续。
但是,在现实中,更多人是将工作全权交给AI,“反正AI啥都能干,我就不用费这个力气了”。如果一个项目的架构设计不是你完成的,程序实现不是你完成的,相关技术、框架的选择不是你完成的,那么这个项目与你有什么关系呢?
本次安卓作业有四万余行Kotlin,重要的架构设计、技术选择和算法由我亲自研究,但是代码都是AI实现的。如果没有AI,我不可能能在短时间内写出这样一个功能完备、界面美观的项目,还有时间恬不知耻地批判AI。但是,每当我在使用我的作业的时候,我都会很惶恐,并不知道这背后运行着的代码是怎样的,这是一种失去控制的感觉。AI半小时就能写出一千多行代码,完全超出我亲自审查的能力范围,我对项目的掌握也是这样慢慢滑坡的。
商业公司出于利益,为了提升效率让AI接管所有工作无可厚非,毕竟这种业务代码也不讲求什么质量。但是对于计算机科学领域的学生,如果没有大量手写代码的经验,就不能获得属于计算机科学的思维,就无法培养出领域特定的分析问题、解决问题的能力,就没有能力支撑他们去研究这门科学更深层,更复杂的知识。那么他们对计算机科学的理解会变成怎样呢?不会有实现功能的喜悦,不会有与其他开发者的共鸣。而是放弃探索,将代码和知识仅仅当作毕业所需的任务。
计算机科学领域学生技能的缺失,并不是AI造成的,AI以前的计算机教育也不是什么尽善尽美的东西。AI只是放大了人类懒惰的一面,使更多人选择浮躁、选择投机。我们缺失的是正确的引导,是何时应用AI,如何使用AI的指导。如果一个人在学习时没有形成计算机的学科思维,就难以在现实实践中理解计算机科学的种种,就无法为计算机科学创造出真正的新的东西。如果潜心研究者在一代人上缺失,那么计算机科学的发展将在一代人上停滞。
AI没有能力创造新的事物,它只是人类已有知识的总结机器。对于那些需要创新,需要创造新技术的项目,AI反而成了禁锢思维的绊脚石。无论科技怎样发展,人类的发展终究要靠人类实现。过度依赖AI以至于本末倒置失去了自主能力,长此以往,表面的繁荣掩盖不住真实能力的缺失,人们终究要为自己的懒惰付出代价。
当然,开源社区不可能,也不应该去禁止AI。需要禁止的,是放任膨胀的未经审查、不负责任的AI输出,是投机者对无数开发者劳动成果的践踏。对于学生而言,问题也不是能不能使用AI,而是能否在使用AI的同时保留实践和判断的能力。AI是放大能力的工具,而非逃避思考的借口。
linux
存放linux相关知识、工具等
tools
linux常用软件和指令
kvm
for virt-manager:
high performance configuration
CPUs
Do not use all available cores. Windows guest works better under multiple cores but not sockets.
So if you have 22 logical host CPUs, you can allocate about 8 vCPUs, by set Sockets as 1, Cores as 8, Threads as 1. The total vCPUs will be .
Disk
Use VirtIO to get best performance, don’t use the default SATA.
If you choose VirtIO as disk type, Windows guest will not able to detect the disk during installation, due to lack of virtio’s driver. The solution is simply download the driver from here, choose latest version and download the virtio-win.iso. Then mount this image file as CD to the guest(by Add Hardware -> Storage, choose device type as CDROM device).
After mounting, in the disk selection interface, click load driver -> browse, then choose the mounted CD, select viostor/win11/amd64 to load the driver for virtio. Then you’ll able to see the disk in disk selection interface.
Shared folder
If you want a shared folder, you need to toggle Enable shared memory on in Memory. Then click Add Hardware -> Filesystem, keep Driver as default virtiofs, Source path as the path for the shard directory in the host machine, Target path as name of the shared folder you want to show in guest, like Shared. The shared folder will be acted as a mounted partition in the guest, so make this name simple.
Others
Keep other items as default. Determine the memory by guest’s system.