← 返回博客列表
Amazon

Amazon 面試題:設計套件管理系統 (Package Management System)

2025-10-18

Amazon 的系統設計面試注重實際工程問題的解決能力。本文通過套件管理系統設計題,展示如何從需求分析到系統架構的完整思路,oavoservice 助你在面試中展現系統思維。

📋 題目描述

設計一個套件管理系統,類似於 npm、pip 或 apt。系統需要支援:

  1. 安裝套件 (install package)
  2. 解除安裝套件 (uninstall package)
  3. 處理套件依賴關係
  4. 檢測循環依賴
  5. 升級套件版本

🎯 核心考點

  1. 圖論應用 - 依賴關係建模
  2. 拓樸排序 - 確定安裝順序
  3. 循環檢測 - DFS 檢測環
  4. 版本管理 - 語義化版本控制

💡 系統設計(oavoservice 指導)

資料結構設計

class Package:
    def __init__(self, name, version):
        self.name = name
        self.version = version
        self.dependencies = []  # [(package_name, version_constraint)]

class PackageManager:
    def __init__(self):
        self.installed = {}  # {package_name: Package}
        self.dependency_graph = {}  # {package: [dependencies]}

核心功能實作

1. 安裝

def install(self, package_name, version):
    # 檢查是否已安裝
    if package_name in self.installed:
        print(f"{package_name} already installed")
        return
    
    # 獲取套件資訊
    package = self.fetch_package(package_name, version)
    
    # 檢查循環依賴
    if self.has_cycle(package):
        raise Exception("Circular dependency detected")
    
    # 拓樸排序確定安裝順序
    install_order = self.topological_sort(package)
    
    # 按順序安裝
    for pkg in install_order:
        self._install_single(pkg)

2. 檢測循環依賴

def has_cycle(self, package):
    visited = set()
    rec_stack = set()
    
    def dfs(pkg):
        visited.add(pkg.name)
        rec_stack.add(pkg.name)
        
        for dep_name, _ in pkg.dependencies:
            if dep_name not in visited:
                if dfs(self.fetch_package(dep_name)):
                    return True
            elif dep_name in rec_stack:
                return True
        
        rec_stack.remove(pkg.name)
        return False
    
    return dfs(package)

3. 拓樸排序

def topological_sort(self, package):
    result = []
    visited = set()
    
    def dfs(pkg):
        if pkg.name in visited:
            return
        visited.add(pkg.name)
        
        for dep_name, version in pkg.dependencies:
            dep_pkg = self.fetch_package(dep_name, version)
            dfs(dep_pkg)
        
        result.append(pkg)
    
    dfs(package)
    return result

🚀 深度追問

Q1: 如何處理版本衝突?

oavoservice 建議:

def resolve_version(self, package_name, constraints):
    available_versions = self.fetch_versions(package_name)
    
    for version in sorted(available_versions, reverse=True):
        if all(self.satisfies(version, c) for c in constraints):
            return version
    
    raise Exception(f"No compatible version found for {package_name}")

Q2: 如何優化大規模依賴的安裝速度?

oavoservice 建議:

Q3: 如何處理套件的解除安裝?

oavoservice 建議:

def uninstall(self, package_name, force=False):
    if package_name not in self.installed:
        return
    
    # 檢查依賴
    dependents = self.find_dependents(package_name)
    
    if dependents and not force:
        raise Exception(f"Cannot uninstall: {dependents} depend on it")
    
    del self.installed[package_name]

📊 系統架構

┌─────────────────┐
│  CLI/API        │
└────────┬────────┘
         │
┌────────▼────────┐
│ Package Manager │
├─────────────────┤
│ - Install       │
│ - Uninstall     │
│ - Update        │
└────────┬────────┘
         │
┌────────▼────────┐
│ Dependency      │
│ Resolver        │
└────────┬────────┘
         │
┌────────▼────────┐
│ Registry API    │
└─────────────────┘

💼 oavoservice 如何助力 Amazon 面試

在 Amazon 系統設計面試中,oavoservice 提供:

需求澄清 - 確保理解題目要求 架構設計 - 從高層到細節的完整設計 權衡討論 - 不同方案的優劣分析 擴展性考慮 - 如何應對大規模場景

想在 Amazon、Microsoft、Google 的系統設計面試中脫穎而出?

聯繫 oavoservice,我們提供專業的 VO 面試輔助服務。


標籤: #Amazon #系統設計 #套件管理 #拓樸排序 #圖論 #VO輔助 #面試輔助 #一畝三分地


需要面試真題? 立刻聯繫微信 Coding0201獲得真題