SDE / DGX Cloud · Technical Phone Screen Coding

Nvidia DGX VM Manager:CRUD、重复 ID 与状态封装

Nvidia DGX 组面经要求实现 list/add/modify/delete VM,处理重复与不存在的 ID;本文给出明确训练接口、状态不变量和可运行实现。

题目重点:Nvidia DGX 组面经要求实现 list/add/modify/delete VM,处理重复与不存在的 ID;本文给出明确训练接口、状态不变量和可运行实现。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版以可排序的 vm_id 唯一标识 VM,属性是字符串键到简单值的映射;题目没有规定 ID 类型、属性 schema 或 list 顺序。
  • add 重复 ID 抛 ValueError;get、modify、delete 不存在 ID 抛 KeyError。modify 为局部属性更新,不改变未提供的字段。
  • 此代码是单进程内存 manager;真实 DGX 管理服务还需调度器、状态持久化、权限和异步 VM 生命周期。

解题路线

  1. 用 vm_id→属性映射维护唯一索引。先写 add/get/list 并保持不变量:字典中每个 ID 只有一个 VM。
  2. modify 先检查是否存在,再只覆盖给出的属性;delete 先检查再删除。将不存在 ID 和重复 ID 的错误在操作入口统一处理。
  3. 输入属性在 add 时复制,所有返回属性也复制,防止外部调用者持有引用后绕过 manager 悄悄修改内部状态。
  4. 手写状态转移测试:创建→修改→列出→删除;同时测重复创建、删除两次和返回值别名。

手动走一遍

add(vm-1,{cpu:4,region:west}) 成功;modify(vm-1,{cpu:8}) 后 region 保留为 west。再次 add(vm-1,...) 抛重复 ID 错;delete(vm-1) 返回最后状态,再次 delete 或 modify 同 ID 抛不存在错误。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

class VMManager:
    """In-memory training API; callers cannot mutate internal attribute maps."""

    def __init__(self):
        self._vms = {}

    def add(self, vm_id, attributes):
        if vm_id in self._vms:
            raise ValueError("duplicate VM ID")
        self._vms[vm_id] = dict(attributes)

    def get(self, vm_id):
        if vm_id not in self._vms:
            raise KeyError(vm_id)
        return self._vms[vm_id].copy()

    def modify(self, vm_id, updates):
        if vm_id not in self._vms:
            raise KeyError(vm_id)
        self._vms[vm_id].update(updates)
        return self._vms[vm_id].copy()

    def delete(self, vm_id):
        if vm_id not in self._vms:
            raise KeyError(vm_id)
        return self._vms.pop(vm_id).copy()

    def list_vms(self):
        return [(vm_id, self._vms[vm_id].copy()) for vm_id in sorted(self._vms)]

复杂度

哈希索引下 add/get/modify/delete 期望 O(1),但复制或更新属性还需 O(A),A 是属性数。list_vms 按 ID 排序并复制属性,时间 O(V log V + 属性总量)、输出空间 O(属性总量)。

易错点与追问

容易失分的边界

  • add 直接覆盖同 ID,会把重复请求误当作更新并丢失已有 VM。
  • modify 不检查存在,可能凭空创建一台 VM;delete 不检查存在,错误行为含糊。
  • 直接返回内部属性字典,调用者修改返回对象后 manager 状态随之变化,绕过验证。
  • 将内存对象的 add 成功等同于真实 VM 已经启动;生产系统需要区分 desired state 与 observed state。

继续深挖

  • 如果创建 VM 是异步操作,定义 requested/provisioning/running/failed 状态机、幂等 request_id 和补偿流程。
  • 并发 modify 与 delete 需要版本号或条件更新,避免旧读覆盖新状态。
  • 若属性有 CPU、内存、镜像等 schema,验证必填项、资源上限和修改时是否需要重启。
✓已复制微信号!