放弃精耕细作式的编程吧

放弃精耕细作式的编程吧

是时候放弃那种精耕细作式的写代码方式了。

我们更应该站在宏观的、高阶的、更广阔的视角来审视整个项目:最根本的目标是什么?为了达成目标,我们真正需要什么?而不是纠结于某一处技术细节该如何实现——这类问题,已经可以交给 AI 来协助解决。

若仍执着于事无巨细地掌控每一行代码,即使用上 AI,能带来的提升也相当有限。无非是从挥锄头换成了开拖拉机,效率或许能提升五倍、十倍,但本质上我们依然在「耕地」,而不是「想清楚要种什么、怎么收成」。我们只是换了一件更趁手的工具,却没有换一种角色:从执行者,变成能看见更大图景、设定更高目标的人。

接触 Vibe Coding 的过程

2022 年下半年,我在 GitHub 上了解到 Copilot。在 VS Code 里启用之后,光是「光标后自动补全代码」这一项能力,在当时就让我很受震撼。

在此之前,一旦遇到不熟悉的内容或需要查资料,就不得不把注意力从编辑器切到浏览器,整个写代码的过程不断在「打断 → 恢复 → 再打断 → 再恢复」里循环,非常消耗精力。这种模式贯穿了我 2022 年之前几乎所有的编程时光。但 Copilot 能做的有限:它只能在光标之后做顺序补全,无法在任意位置跳转补全,实际带来的效率提升并不算大。

阅读更多
回旋镖之重回北京

回旋镖之重回北京

2023 年毕业后我来到了杭州,开始了我的第一份工作。相比北京而言,杭州这个南方城市对我来说熟悉又新鲜。熟悉的是我作为南方人对这里的气候和风土人情有所了解,新鲜的是这里的山水江湖和人文历史让我感到耳目一新。初到的一年时间里,我常常在业余时间独自在城市里探索,在西湖、植物园、雷峰塔、灵隐寺、龙井村、西溪湿地等等地方都留下过足迹,我也用相机记录下了这些令人欣喜的时光。

在 2022 年找工作时经历过的难以抉择的时光如今依然历历在目。2020 年疫情开始我的学生生活就发生了翻天覆地的变化,不能自由地进出校门、进出北京让我在研究生阶段的探索计划通通落空,取而代之的是食堂的透明隔板、进出校的艰难报备以及隐隐约约的焦虑不安。三年的限制让我对北京没有过多的留恋,我甚至是抱着埋怨的心态选择了杭州的工作岗位,并且在毕业后如愿地、如释重负地来到了杭州。杭州的山水人文环境也确实疗愈了我,让我能够在今时今日决定回到北京。

阅读更多
再次认识 React

再次认识 React

毕业之后很久没写前端代码了,但最近因为工作需要又开始接触前端项目。例如在 ob-operator 项目中我负责评审两位前端同学过去一年所有的 PR、在用 Cursor 快速搭建软件原型提到的项目中也是用 Cursor 快速实现了一个以 TypeScript + Next.js + Shadcn UI 作为技术栈的 RAG 系统管理后台 Web 应用。

过去自己认为十分枯燥乏味的前端项目开发,在分别许久后似乎又迸发了出新的吸引力。当然如果要回溯让我产生这样变化的原因,我会归因于通过新的路径重新认识 React 吧。这条新路径的载体是 Next.js 这个极度流行的框架。

阅读更多
2024 年终总结

2024 年终总结

2024 年过得很快,时间就像倾盆大雨时的雨滴,挡不住地从空中落在地上,然后消失在草地或者泥土里。这一年我经历了很多事情,也学到了很多事情,希望可以用这篇博客来总结和梳理一下自己的想法。主要还是围绕着与自己工作和兴趣相关的云原生、RAG 和 AI 三个方面展开。

阅读更多
像使用 Windows 一样使用 MacOS

像使用 Windows 一样使用 MacOS

我在学校时实验室配备的办公台式机是 Windows 系统,而我自己的笔记本电脑是 macOS 系统。在使用两个操作系统的过程中,我发现有一些 Windows 系统的使用方式比较高效,而且在 macOS 上也可以实现,这样既能让我在两个系统之间的切换变得流畅,也可以提高我在 macOS 上的工作效率。以下是我在 MacOS 上实现 Windows 系统使用方式的一些方法。

主要分为鼠标使用、窗口管理、软件切换、云盘存储和跨平台软件使用几个方面。

阅读更多
用 Cursor 快速搭建软件原型

用 Cursor 快速搭建软件原型

Cursor 是一款使用 AI 能力加持的代码编辑器,或者说得更大一点,文本编辑器。正如它在官网所说的那样 Built to make you extraordinarily productive, Cursor is the best way to code with AI. 使用它能够让在编程时更加高效,几倍地提升编码效率,将工程师从平常繁琐、简单、机械、重复的代码编写工作中解放出来,更加专注于分析、建模和解决关键的问题。

但需要说在开头的是,Cursor 无法让零基础的用户变成专精的软件工程师,以能够解决所编写代码中发生的各种疑难杂症,但能让他们轻松搭建出一些有意思的应用,例如简单的网页,便捷的脚本等,真正遇到问题需要定位和调试的时候,往往是需要人类提供指导方案的。Cursor 能够做的是让有一定编程基础的用户更加高效地编写代码,让专业的软件工程师更加专注于解决问题本身。简而言之,让零基础的人玩得起来,让有基础的人更加高效。

本文介绍了我如何使用 Cursor 在业余时间独立完成了一个软件系统的原型搭建、后续演化以及最终部署上线的。

阅读更多
再见北京 👋

再见北京 👋

因公司在北京举办的活动需要人员到现场支持,我提前了一个周末来到北京。刚到那天的温度就给了我一个下马威:寒潮过境,最低温度来到了 0 度,而我刚从气温接近 30 度的杭州过来,一时间难以适应。

上午 10 点到达预定的酒店被告知没有空余房间,这也合乎情理,金秋时节的北京是热门的出游目的地,游客众多,用房需求也相应的高。和朋友相约到二里沟地铁站旁边的新疆大厦吃了顿自助,羊肉串、羊腰大快朵颐,酸奶、格瓦斯畅快下肚,好不痛快,就是最后肠胃承受了消化的重负,撑了一下午。

阅读更多
记黑神话悟空云通关☁️

记黑神话悟空云通关☁️

第一印象

游戏科学在 2020 年 8 月放出黑神话悟空第一个实机演示视频以吸引游戏人才,“被迫”开始了对外宣传,到今年 2024 年 8 月 20 日正式发售,经历了四年的时间。这四年里,每年的 8 月 20 日都会释放出新的实机演示视频,赚足了单机游戏玩家的期待,其中自然也包括了我。

我在小学时期玩过很多游戏,各种各样的游戏都爱玩,仙剑奇侠传、波斯王子、英雄无敌、魔兽争霸、鬼泣等,对单机游戏是有足够好感的。中学之后娱乐时间变少后玩游戏的时间就趋近于零了,这个习惯一直延续到了大学毕业。在研究生阶段中期,多多少少受到些黑神话悟空的影响,我又开始断断续续接触了几款动作 RPG 游戏,例如古剑奇谭三、塞尔达传说、只狼、黑魂三、刺客信条·奥德赛等。

从释出的实机演示视频来看,黑悟空与近期接触过的只狼比较相似,战斗系统、画面风格、故事背景(都具有东方特色)等,而只狼是我玩过类似游戏里最喜欢的。黑悟空刺激的战斗系统搭配上西游记的故事背景,进一步拔高了我对黑悟空的期待。

八十一难之第零难:启动游戏

我手头的设备是 MacBook Pro 和 Switch,并且 Switch 长时间吃灰,彻底沦为了有氧拳击启动器。同时因为没有业余时间打游戏的习惯,没有再增配主机,近期只对黑悟空这一款游戏感兴趣,不打算单单为了它添置设备,所以我开始摸索如何在 Mac 上运行黑悟空。

阅读更多
一起来做类型体操吧!😊

一起来做类型体操吧!😊

类型重要吗?

长话短说,类型很重要。

类型的重要性

静态检查

在编程中,类型往往是我们的第一道防线,它可以帮助我们在编译阶段就发现一些潜在的问题,避免一些不必要的错误。在过去,由于 JavaScript 是弱类型、解释型语言,所以在编译阶段无法发现一些类型相关的问题,这就需要我们在运行时进行一些类型检查,这样就会增加一些不必要的开销。而 TypeScript 则是由微软推出的、基于 JavaScript 的强类型语言,它可以在编译阶段就发现一些类型相关的问题,这样就可以避免一些不必要的错误。

当然也不是说用 JavaScript 就一定会出问题,但这要求编程者有更高的责任心和编程能力,能够在编码阶段就提前规避问题,但对于大型项目来说,这是不现实的。不要完全相信任何人的代码,即使是自己的代码。因为人是会犯错的,需要加以约束。在 Web 应用开发过程中,JavaScript 代码如果访问了一个空对象的字段则会导致异常,如果程序有限定错误边界,那么这个错误可能会被忽略,但是如果没有限定错误边界,那么这个错误可能会导致程序崩溃,也就是页面白屏。而使用 TypeScript 配合 IDE 的类型检查、其他静态检查工具,可以在编码、编译和代码合并时就发现并修复这些问题。

类型即文档

另外,用弱类型语言编写的项目一旦涉及到多人协作(甚至是对于现在的自己和过去的自己来说也是如此),就会变得难以维护和协作,因为弱类型语言无法提供足够的信息,所以在多人协作时,很容易出现一些问题。而强类型语言则可以提供足够的信息,帮助我们更好地理解代码,提高代码的可维护性。所以我也认为“类型即文档”。

现在很多语言都有相关工具可以通过类型信息来生成文档,例如 openapi-generator、TypeDoc、JSDoc 等等,通过代码自动生成文档可以帮助开发者省去很多写文档的时间,同时也可以极大程度地提高交流效率。

阅读更多
rFTP - 用 Rust 实现简单的 FTP Server (2)

rFTP - 用 Rust 实现简单的 FTP Server (2)

前情提要

上一篇文章中,我讲述了我为什么选择 Rust 作为学习计算机底层知识的工具,一些 Rust 的基础知识和我当时所遇到的困难。在这篇又是属于目标回收的文章中,我将介绍最近的进展、Rust 开发的体验和下一步的计划。总的来说,用 Rust 写项目体验尚可,通过与编译器博弈而最终通过“考试”后,自己对 Rust 的理解也有了些许提升。

异步编程

在 Rust 中,异步编程是通过 Future 特征和 async/await 语法糖来实现的。Future 是 Rust 中的异步编程的基础,它代表了一个异步计算的结果或者异步任务的“承诺”,可以通过 poll 方法来获取计算的结果。async/await 语法糖则是为了让异步编程更加友好,通过 async 关键字来定义异步函数,通过 await 关键字来等待异步计算的结果。

越来越多的语言采纳异步编程机制,比如 Python 的 asyncio、JavaScript 的 Promise(或者是同样的 async/await)、Golang 的 goroutine 等等。异步编程的优势在于可以提高程序的并发性能,因为异步编程可以让程序在等待 I/O 操作的时候不阻塞,可以继续执行其他任务。Rust 的 Tokio 是一个基于 Future 的异步编程框架,它提供了很多异步编程的工具,比如 tokio::spawntokio::net::TcpStream 等等。

阅读更多