大家好!
今天,我们将一起回顾并深度扩展在大学申请过程中的独特经历,特别是这如何演变为我们现代技术职业生涯的起点。故事始于 2020 年,当时 COVID-19 突然在全球爆发并影响了所有人。甚至我们的 12 年级期末考试也被取消了。几个月后,各大学的申请表陆续开放,我们也提交了几份攻读技术学士(Btech)课程的申请。
我们参加了由位于奥里萨邦布巴内斯瓦尔的 Siksha O Anusandhan 大学组织的 SAAT 考试。考试于 2020 年 9 月在线举行,而且是免费的。这对我们来说是一次全新的体验,但非常棒。我记得考试大约持续了 3 个小时,分为物理、化学和数学几个部分。这所学院是 SOA 认可大学下的 ITER(技术教育与研究院)。几天后,我们收到了一封电子邮件,通知我们已被录取。我的综合排名为 172,成功进入了心心念念的计算机科学与工程专业。作为一名 18 岁的学生,这对我来说是全新的人生阶段,我对能加入这所选定的学院感到无比兴奋。
当时的学费是每年 235,000 印度卢比,因此四年总计约为 940,000 印度卢比。我们的入学手续是在线完成的,过程包括验证 10 年级和 12 年级的成绩单以及我的 Aadhar 身份信息。整个过程通过电子邮件进行非常顺畅,所需款项也是通过网上银行支付的。我们的课程于 2020 年 11 月 11 日在线开始。虽然这是我们第一次参加线上课程,但总体来说体验非常棒。老师们非常优秀且经验丰富,我们甚至通过网络结交了新朋友。
以上就是我们分享的整体入学流程经历。即便在 2021 年 10 月开始线下课程时,也没有遇到额外的麻烦,因为线上流程是一次性的,所以在转为线下模式时不需要额外的手续。
然而,站在 2026 年的视角,当我们回顾那段从线上考试到线下入学的过渡时,我们发现这不仅仅是简单的流程变更,更是对未来 AI 原生开发工作流 的一次预演。在这篇文章中,我们将深入探讨这种“远程优先”的思维如何转化为当今最先进的工程实践,我们将分享从单纯的代码编写转向与 Agentic AI(智能体 AI) 协作的真实经验,以及这如何改变了我们在 ITER 后续的技术学习路径。
从远程入学到云原生开发:基础设施即体验
回想 2020 年的入学过程,最让我们印象深刻的是其全数字化的流畅体验。这实际上就是早期的 “无服务器” 思维在行政管理上的体现——用户(我们)不需要关心后端是物理办公室还是云端数据库,流程自动流转。
在我们的后续开发实践中,我们将这种理念转化为了 云原生 的架构设计。你可能会遇到这样的情况:传统的单体应用部署复杂,且难以应对流量突发的入学申请潮。让我们思考一下这个场景,如果我们需要构建一个现代的录取查询系统,我们会怎么做?
现代 Serverless 部署实践
我们不再推荐传统的虚拟机部署,而是倾向于使用 Serverless 函数 和 边缘计算。这意味着我们的逻辑代码可以在离用户最近的节点运行,从而实现毫秒级的响应。
在最近的一个重构项目中,我们将一个基于 Django 的旧版查询系统迁移到了 Vercel 或 AWS Lambda 架构上。以下是我们如何在现代框架(如 Next.js)中模拟这种“入学状态查询”的逻辑示例。这种方式不仅提升了性能,还大大降低了维护成本。
// utils/admissionStatus.js
// 这是一个模拟的异步数据获取函数
// 在生产环境中,这里会连接到真实的数据库或 SAAT 的 API
export async function checkAdmissionStatus(applicationId) {
// 我们使用模拟延迟来模拟真实世界中的网络请求不确定性
await new Promise(resolve => setTimeout(resolve, 800));
// 模拟数据库中的状态记录
const database = {
‘SAAT-2020-001‘: { status: ‘CONFIRMED‘, rank: 172, course: ‘CSE‘ },
‘SAAT-2020-002‘: { status: ‘PENDING‘, rank: 2000, course: ‘MECH‘ },
};
return database[applicationId] || { status: ‘NOT_FOUND‘ };
}
在我们的组件中,我们可以这样使用它,利用 React Server Components (RSC) 的特性,让数据获取在服务器端完成,从而减少发送给客户端的 JavaScript 体积,这正是 2026 年前端优化的核心标准。
// components/StatusChecker.jsx
// 注意:这是一个 Server Component
import { checkAdmissionStatus } from ‘@/utils/admissionStatus‘;
export default async function StatusChecker({ appId }) {
// 我们直接在组件顶层进行 await
// 这种写法在传统的 React 中是会报错的,但在 Next.js App Router 中是标准做法
const result = await checkAdmissionStatus(appId);
if (result.status === ‘NOT_FOUND‘) {
return 未找到申请记录,请检查 ID。;
}
return (
申请状态: {result.status}
排名: {result.rank}
专业: {result.course}
);
}
关键决策与性能对比
你可能会问,为什么要如此大费周章地重构?在我们的实际测试中,边缘渲染 将首字节加载时间(TTFB)从平均 450ms 降低到了 40ms 以下。对于入学季这种高并发场景,这种性能差异直接决定了系统的稳定性。我们必须时刻警惕 技术债务,不要为了短期速成而使用过时的技术栈。
Vibe Coding:AI 时代的开发范式转移
当我们在 2020 年刚开始上网课时,最大的挑战是缺乏互动。而在 2026 年,开发环境面临的最大变革反而是 AI 的过度参与。我们一直在探索如何平衡人类创造力与 AI 的效率,这就是我们所谓的 “Vibe Coding”(氛围编程)。
在我们的最新项目中,我们不再逐行编写枯燥的样板代码,而是让 AI 成为我们的 结对编程伙伴。但这有一个前提:你必须懂得如何引导它。我们将这种能力称为 “AI 驱动的调试”。
使用 Cursor 与 Agentic AI 的工作流
让我们来看一个实际的例子。假设我们需要处理复杂的入学排名排序算法。如果直接写,很容易出错。现在,我们会使用像 Cursor 或 Windsurf 这样的 AI IDE 来完成。
场景:我们需要根据多个条件(排名、类别、预留席位)对候选名单进行排序。
传统做法:手动编写嵌套的 if-else 逻辑,耗时且容易产生边界错误。
现代做法:我们编写核心逻辑,让 AI 补全边缘情况和容灾处理。
// types/admission.ts
// 定义严格的数据结构是 AI 辅助开发成功的关键
// 如果没有类型提示,AI 生成的代码往往会在运行时报错
interface Candidate {
id: string;
rank: number;
category: ‘GEN‘ | ‘OBC‘ | ‘SC‘ | ‘ST‘;
hasPaidFees: boolean;
}
interface AdmissionConfig {
totalSeats: number;
reservationQuota: number; // 预留给特定类别的比例
}
接下来,我们编写处理逻辑。在 AI 辅助模式下,我们通常会先编写 意图注释,然后让 AI 生成实现。
// services/admissionService.ts
export class AdmissionProcessor {
private config: AdmissionConfig;
constructor(config: AdmissionConfig) {
this.config = config;
}
/**
* 处理候选名单并返回最终录取列表
* AI 辅助提示:我们需要处理边界情况,比如候补名单和未缴费的情况
*/
public processAdmissions(candidates: Candidate[]): string[] {
// 步骤 1: 首先过滤掉未缴纳费用的候选人
// 这是一个简单的业务逻辑,我们手动编写以保持控制权
const paidCandidates = candidates.filter(c => c.hasPaidFees);
// 步骤 2: 排序逻辑
// 在这里,我们可能会让 AI 帮我们生成一个复杂的比较器
// 以处理不同类别之间的排名互换问题
const sortedCandidates = paidCandidates.sort((a, b) => {
// 核心逻辑:排名越靠前越优先
if (a.category !== b.category) {
// 这里可以引入复杂的预留逻辑,暂时简化处理
return a.rank - b.rank;
}
return a.rank - b.rank;
});
// 步骤 3: 截取名额
// 使用 slice 方法确保不超过总席位
const admittedIds = sortedCandidates
.slice(0, this.config.totalSeats)
.map(c => c.id);
return admittedIds;
}
}
AI 驱动的调试与陷阱防范
在这个例子中,你可能会遇到这样的情况:输入数据中包含重复的 ID 或者排名为负数的异常值。在传统的开发流程中,我们需要等到 QA 测试阶段才能发现这些 Bug。
但在 2026 年,我们利用 LLM 驱动的测试。我们会将上述代码直接丢给 AI,并提示:“请为这个类编写单元测试,特别是针对负数排名和空数组的边界情况。”
AI 通常会生成类似下面的测试用例,这些是我们可能忽略的:
// __tests__/admission.test.ts
import { AdmissionProcessor } from ‘../services/admissionService‘;
describe(‘Admission Processing Edge Cases‘, () => {
it(‘should handle empty candidate list gracefully‘, () => {
const processor = new AdmissionProcessor({ totalSeats: 10, reservationQuota: 0.5 });
const result = processor.processAdmissions([]);
expect(result).toEqual([]);
});
it(‘should ignore candidates who have not paid fees‘, () => {
const candidates = [
{ id: ‘1‘, rank: 10, category: ‘GEN‘, hasPaidFees: true },
{ id: ‘2‘, rank: 1, category: ‘GEN‘, hasPaidFees: false } // Rank 1 but unpaid
];
const processor = new AdmissionProcessor({ totalSeats: 1, reservationQuota: 0 });
const result = processor.processAdmissions(candidates);
// 期望录取 ID 为 ‘1‘,因为 ‘2‘ 没缴费,尽管排名更高
expect(result).toContain(‘1‘);
expect(result).not.toContain(‘2‘);
});
});
深入工程化:安全左移与可观测性
随着我们技术的成熟,我们不再仅仅关注代码是否能“运行”,而是关注它在生产环境中的表现。ITER 的课程教会了我们基础,但真实的项目经验教会了我们 工程化思维。
在 2026 年,安全左移 是不可妥协的标准。就像我们在入学时验证 Aadhar 身份信息一样,我们的代码必须在编写阶段就进行安全扫描。我们使用工具自动检测依赖中的漏洞,确保我们的供应链安全。
同时,可观测性 取代了简单的日志记录。当我们在部署一个类似 SAAT 成绩查询的系统时,我们不仅记录错误,还记录 Trace(链路追踪) 和 Metrics(指标)。
我们思考一下这个场景:系统变慢了,但没有任何报错。
在传统的日志中,你什么都看不到。但在现代监控系统中(如 Prometheus 或 Grafana),我们可以看到 P99 延迟激增,或者数据库连接池耗尽。这允许我们在用户(考生)受到影响之前就介入处理。
结语
最后,我想感谢大家阅读这篇博客。虽然我们的旅程始于 2020 年的一封简单的录取邮件,但在接下来的几年里,我们见证了从网课到云端,从手写代码到 Vibe Coding 的巨大转变。无论你是正在申请 ITER,还是像我们一样正在构建下一代 AI 原生应用,希望这些分享能对大家有所帮助。
技术永远在变,但对工程化思维的追求始终如一。让我们继续探索!