快手 客户端开发-C++ 二面

1、我看你学的是机械,为什么想着做客户端,没考虑嵌入式相关岗位吗

2、你理解的客户端开发,和服务端开发有什么本质区别

我理解客户端开发和服务端开发最大的区别,不是“一个写界面一个不写界面”,而是它们面对的问题重心不一样。

服务端更关注吞吐、并发、稳定性、资源利用率和整体系统容量。客户端更关注响应速度、交互体验、启动时延、卡顿、崩溃率、内存占用、电量消耗,以及复杂设备环境下的兼容性。

客户端还有一个很典型的特点,就是它经常运行在资源受限、环境不一致的设备上,而且问题现场不好还原。服务端崩了还能看日志、抓监控、进机器分析,客户端很多时候只能靠埋点、崩溃栈、版本信息和用户反馈去定位。所以客户端开发其实很看工程质量和细节控制能力。

3、客户端里主线程、工作线程、事件循环之间是什么关系

客户端主线程通常承担界面刷新、输入响应、消息分发这些职责。事件循环跑在主线程里,不断从消息队列中取事件,然后分发给对应对象处理。像点击事件、定时器事件、重绘请求、排队的信号槽调用,本质上很多都要经过这条链路。

工作线程主要负责耗时任务,比如数据处理、网络请求、文件读写、解码、计算等。它存在的目的不是“让程序更高级”,而是避免阻塞主线程。因为主线程一旦卡住,事件循环就转不动,界面就会卡顿甚至无响应。

所以客户端开发里一个很核心的原则就是:UI 更新尽量留在主线程,耗时逻辑尽量移到工作线程,但线程之间的协作要通过安全的消息或事件机制完成。

4、你怎么看待 AI

我觉得 AI 本质上是一个效率工具,但不是“替人思考”的工具。

它最有价值的地方,是能帮开发者缩短从问题到初版答案之间的路径。比如查概念、补样板代码、列边界条件、生成测试样例、快速尝试不同实现思路,这些场景里它确实很有效。

但它的问题也很明显。它给出的内容经常“像是对的”,可一旦放到真实工程上下文里,就可能出现接口不匹配、边界不完整、性能不合理、线程不安全这些问题。所以我更倾向把 AI 当成一个辅助工具,而不是把判断权交给它。最后代码能不能进项目,还是得靠自己验证。

5、你平时怎么用 AI,哪些场景你会用,哪些场景你不会直接信

答案:我平时用 AI 比较多的场景有几个。一个是查概念和做知识点对比,比如某两个机制的区别、某个 API 的常见坑;一个是生成样板代码,比如类定义、测试用例、脚本辅助;还有一个是做思路发散,比如我已经有方向了,但想看看还有没有更好的实现路径。

但如果是这些场景,我一般不会直接信:

  • 并发相关代码
  • 生命周期复杂的对象关系
  • 涉及性能瓶颈的实现
  • 跟项目真实接口强绑定的代码
  • 看起来很“完整”但我自己没法解释的答案

对我来说,AI 更像一个能加速起步的工具,但不能替代验证过程。

6、如果把“输入提示词,输出代码”抽象成一个函数,你会怎么描述这个过程

如果抽象成函数,我会把它理解成一个从“需求描述”映射到“候选代码结果”的过程。

输入不只是自然语言文本,本质上还应该包含上下文,比如目标语言、运行环境、已有接口、限制条件、风格要求、异常处理要求。输出也不该只是代码字符串,严格来说应该是一个“候选解”,里面隐含了模型对需求的理解、补全和猜测。

所以这个函数更像:

CodeResult GenerateCode(Prompt prompt, Context ctx, Constraint cons);

其中比较关键的是 ContextConstraint。如果没有上下文,AI 只能按通用模式去猜;如果没有约束,生成结果就很容易看起来能跑,但不适合真实工程。

代码:

#include <string>
using namespace std;

struct Prompt {
    string requirement;
};

struct Context {
    string language;
    string framework;
    string existingAPI;
};

struct Constraint {
    string performance;
    string style;
    string boundary;
};

struct CodeResult {
    string code;
    string explanation;
};

CodeResult GenerateCode(const Prompt& p, const Context& c, const Constraint& cons) {
    CodeResult res;
    res.code = "// generated code";
    res.explanation = "based on prompt + context + constraint";
    return res;
}

7、如果把 AI 生成代码这件事看成一个循环,它的循环条件是什么

如果抽象成循环,我觉得它不是“生成一次就结束”,而是一个不断逼近目标的过程。

循环体大概是这样:先描述需求,拿到结果,然后检查结果,再补充约束,再生成下一版。它有点像“提出假设—验证—修正”的迭代过程。

这个循环什么时候结束,我觉得一般取决于几个条件:

  • 代码能不能正确运行
  • 是否满足最初需求
  • 边界条件是否覆盖
  • 风格和结构是否符合预期
  • 我自己能不能解释它为什么这样写

也就是说,停止条件不是“AI 终于给出一段长代码了”,而是“结果已经足够可信且可落地”。

代码:

while (!isCorrect(code) || !isReadable(code) || !fitsProject(code)) {
    prompt = refinePrompt(prompt, feedback);
    code = regenerate(prompt);
}

8、怎么样做,会让 AI 给你生成的代码更精细

最直接的方法不是反复说“你再写好一点”,而是把约束给全。

比如只说“写个链表”,AI 很可能给你一个教科书版;但如果你补充“C++17、不要裸指针、要考虑异常安全、接口要和现有类兼容、给出时间复杂度、补边界测试”,它生成的内容通常会明显更靠谱。

我自己的经验是,想让 AI 输出更精细,至少要把这些信息说清楚:

  • 目标语言和版本
  • 运行环境
  • 输入输出格式
  • 需要兼容的接口
  • 风格偏好
  • 性能要求
  • 边界条件
  • 希望它解释到什么程度

本质上,AI 输出质

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论

相关推荐

03-08 17:29
运营
刷题快乐:不算吧,笔试后还要筛的 京东是海笔
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务