AI写不出“干净架构”:从代码生成到软件匠艺的进阶之路

33次阅读
没有评论

AI写不出“干净架构”:从代码生成到软件匠艺的进阶之路

大家好,我是老金。

AI代码工具的普及,带来了一个灵魂拷问:当机器能写出“能跑”的代码时,我们人类程序员,特别是架构师的价值究竟还剩多少?

有人焦虑,有人迷茫。而我的答案是:我们的价值,正从“代码的生产者”,升级为“软件匠艺的守护者”。

在这一讲,我将通过一个真实的代码重构案例和一份可落地的审查清单,为你揭示AI无法触及的领域——构建一个真正“干净”且“可维护”的系统。这,才是我们在新时代真正的护城河。


一、超越“能跑就行”:为什么我们需要“软件匠艺”?

AI代码工具的出现,极大地降低了“让代码跑起来”的门槛。一个初级工程师,借助Copilot或文心一言,可能半天就能写出一个过去需要一周才能完成的复杂模块。但这带来了一个新的问题:我们正在以前所未有的速度,生产出功能正确,但结构混乱、难以维护的“技术债代码”。

软件匠艺,就是对抗这种混乱的终极武器。它不仅仅是写出没有Bug的代码,更是一种追求代码清晰、结构优雅、易于演进的专业精神。它关心的是:

  • 可读性: 你的代码,半年后你自己还能看懂吗?新人能快速上手吗?
  • 可维护性: 当需求变更时,你是只需要修改一处,还是需要改动十个文件?
  • 可扩展性: 当系统需要增加新功能时,是能轻松“插入”,还是需要“伤筋动骨”?

这,是目前的AI无法系统性思考和解决的问题,也正是我们的价值所在。


二、代码对比:从“AI的直觉”到“架构师的匠心”

AI写不出“干净架构”:从代码生成到软件匠艺的进阶之路

让我们来看一个真实的例子。产品需求很简单:“根据用户ID和订单金额,处理一个订单。如果是VIP用户,则给予10%的折扣。”

版本A:AI的直觉实现

我们把这个需求直接丢给AI,它很可能会给你类似下面这样的代码(以Java为例):

// AI-Generated Code
public class OrderService {
    public void processOrder(long userId, double amount) {
        // 1. 从数据库获取用户信息
        User user = new UserDao().getUserById(userId);

        double finalAmount = amount;
        // 2. 判断用户类型并计算折扣
        if (user.isVip()) {
            finalAmount = amount * 0.9;
        }

        // 3. 创建订单并保存
        Order order = new Order();
        order.setUserId(userId);
        order.setAmount(finalAmount);
        new OrderDao().save(order);

        // 4. 如果是VIP,发送邮件通知
        if (user.isVip()) {
            new EmailService().sendEmail(user.getEmail(), "VIP 订单通知", "您的VIP订单已创建");
        }
    }
}

老金点评: 这段代码能跑吗?完全能。功能正确吗?也正确。但它是一个“坏”设计的典型,因为它违反了几乎所有的“软件匠艺”原则:

  1. 违反单一职责原则processOrder 方法干了太多事:查用户、算价格、存订单、发邮件。
  2. 紧密耦合OrderService 直接依赖了 UserDaoOrderDaoEmailService 的具体实现。如果明天发邮件的方式要改成发短信,你就必须修改 OrderService 的代码。
  3. 难以测试: 你无法单独测试折扣逻辑,必须启动数据库和邮件服务才能完成测试。

这样的代码,在项目初期可能问题不大。但一年后,当业务逻辑变得复杂时,它就会成为一个谁都不敢碰的“屎山”。

版本B:架构师的匠心重构

现在,我们用“软件匠艺”的原则来重构它:

// Human-Refactored Code
public class OrderService {
    private final UserRepository userRepository;
    private final OrderRepository orderRepository;
    private final NotificationService notificationService;
    private final PricingStrategyFactory strategyFactory;

    // 使用依赖注入(DI)解耦
    public OrderService(UserRepository userRepo, OrderRepository orderRepo, NotificationService notificationSvc, PricingStrategyFactory factory) {
        this.userRepository = userRepo;
        this.orderRepository = orderRepo;
        this.notificationService = notificationSvc;
        this.strategyFactory = factory;
    }

    public void processOrder(long userId, double amount) {
        User user = userRepository.findById(userId);
        
        // 1. 将定价策略分离出去
        PricingStrategy strategy = strategyFactory.getStrategy(user.getType());
        double finalAmount = strategy.calculatePrice(amount);

        // 2. 订单创建和保存
        Order order = new Order(userId, finalAmount);
        orderRepository.save(order);

        // 3. 将通知逻辑分离出去
        notificationService.sendNotification(user, order);
    }
}

老金点评: 看,这才是“干净”的代码!

  1. 职责清晰OrderService 只负责协调,定价、存储、通知等职责被完美地分离到了各自的类或接口中。
  2. 依赖倒置OrderService 不再依赖具体实现,而是依赖抽象(接口)。我们可以轻松地替换掉任何一个部分的实现,而无需改动核心流程。
  3. 易于测试和扩展: 我们可以单独测试定价策略,也可以轻松地增加一种新的用户类型(比如“企业用户”)和对应的定价策略,而无需修改 OrderService

AI能写出版本A,但只有具备“软件匠艺”的你,才能设计出版本B。 这就是我们与机器的本质区别。


三、可落地的“代码匠艺”审查清单

为了帮助你将“匠艺”精神落地,我为你准备了这份Code Review清单。下次审查代码时,除了看功能,更要看这些:

审查维度 核心问题 检查要点
1. 命名与可读性 代码是否像一篇“好文章”? – 变量、函数、类的命名是否清晰、无歧义?
– 是否存在过长(超过20行)的函数?它是否只做了一件事?
– 是否有恰到好处的注释来解释“为什么”这么做,而不是“做了什么”?
2. 耦合度 修改它,会引发“雪崩”吗? – 是否直接 new 了一个具体的服务类,而不是通过依赖注入?
– 是否有过多的 if-else 分支?能否用策略模式或工厂模式优化?
– 模块之间是否存在循环依赖?
3. 内聚度 相关的东西,是否放在了一起? – 一个类里的方法,是否都在操作相似的数据?
– 核心业务逻辑,是否与框架代码(如HTTP请求处理)混杂在一起?
4. 可测试性 我能不启动整个应用,就测试这段逻辑吗? – 是否存在大量的静态方法调用?
– 函数是否有明确的输入和输出,还是依赖了全局状态?
– 是否可以轻松地为这个类编写单元测试?
5. 简洁性 (YAGNI) 我们真的需要这个功能/这段代码吗? – 是否存在被注释掉的大段代码?
– 是否为了“未来可能的需求”而设计了过于复杂的抽象?(You Ain’t Gonna Need It)

【老金总结】

AI时代,我们架构师的价值,正在从“代码的生产者”,转变为“高质量代码的定义者、守护者和设计师”。

我们不再需要逐行编写所有的代码,但我们必须具备定义“好代码”与“坏代码”的能力,并为团队建立起一套能持续产出“好代码”的流程与规范。

这,就是软件匠艺。这,就是我们不可替代的价值。

正文完
 0
技术老金
版权声明:本站原创文章,由 技术老金 于2025-08-05发表,共计3275字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)