
2023年秋招机器人赛道的热度明显比前几年高。大家投简历时盯得最多的就是优必选这类整机公司毕竟“人形机器人第一股”的招牌摆在那。等真正收到优必选软件开发岗的笔试通知才发现一个尴尬的问题网上能找到的面经非常少不像互联网大厂那样题库满天飞。这篇文章就是想把优必选软件开发岗秋招笔试的考察逻辑、题型分布、答题策略完整复盘一遍给后面要投这家公司或者想投同类机器人公司的同学一个相对清晰的坐标。1. 笔试未动岗位已知先搞懂机器人公司的软件开发岗到底要什么1.1 同一张试卷背后其实藏着三四个岗位方向优必选招聘时会把“软件开发岗”放在一个大的类目下但实际笔试时你会隐约感觉到题目有点“混搭”。这是因为软件开发岗在机器人公司里至少要拆成三四个方向第一类是上层应用开发主要写 Android/iOS 客户端、PC 上位机、Web 后台负责机器人跟人交互的界面和业务逻辑第二类是中间件与系统集成例如基于 ROS 做节点开发、语音/视觉 SDK 接入、通信模块封装第三类是嵌入式软件跑在 MCU 或者 Linux 板卡上写驱动、写运动控制、写传感器数据采集第四类是偏算法工程化的岗位名义上叫软件开发实际要把训练好的模型搬上板端做推理优化和部署。这些方向在同一个笔试入口下自然会尽量避免出特别偏某个平台的技术题而是把公共基础题比重加大。理解这一点很重要因为它直接回答了“为什么我要复习那么多东西”的问题——你不是在准备一场精确打击而是在准备一场覆盖面评估。笔试的核心目的是筛掉基础不扎实的人而不是选出某个方向的王者。1.2 从公司产品线反推技术栈权重优必选的产品线非常清晰人形机器人 Walker 系列、教育机器人悟空、Jimu 系列、商用服务机器人导览机器人、消毒机器人以及智慧物流相关解决方案。这些产品有个共性都是“硬件 软件 AI”的整机产物。软件开发工程师无论落在哪一层都逃不开几样东西——C/C因为机器人端的实时控制和底层驱动基本都是 C/C 的天下Linux绝大多数计算模块跑在 Linux 上多线程编程传感器、运动控制、AI 推理天然并发通信协议模块之间要通过 TCP/UDP、串口、CAN、ROS Topic 来传递消息。我把这些技术栈列出来不是要你临时抱佛脚去学而是想让你在拿到笔试通知之前就给它们排个优先级。如果投递前几天才开始准备那么 C 语法和数据结构是绝对的第一优先级因为笔试编程题几乎默认用 C/C 作答。即使你 Java 写得非常熟练很多机器人公司也宁可你用 C 完成一道中等难度的题也不愿意看到一份 Java 实现但运行耗时偏长的解法。1.3 笔试到底筛的是“会做题”还是“会干活”我见过不少同学把秋招笔试当 LeetCode 周赛打刷到 Medium 起步、Hard 不慌结果栽在这类笔试的“仿真模拟题”上。比如一道描述机器人走到某个格子、拿取物品、改变朝向的模拟题本质上是一道状态机模拟题难度很低。但很多人一上来就想着用最短路、用 A*把简单问题复杂化最后不仅没写完代码里还全是 Bug。优必选这类整机公司的笔试更看重“你会不会把现实问题建模成代码”而不是“你会不会巧解某道算法题”。所以笔试里经常出现场景化题目一个任务队列怎么调度、多传感器数据怎么合并、某个业务流程怎么用有限状态机实现。这类题没有高深算法却非常考验工程抽象能力。如果你平时只刷题、不写业务代码遇到这种题会特别吃亏。2. 题型分布与考察点没有考纲就用公开面经和岗位 JD 反推2.1 公共基础选择题数据结构、操作系统、网络三座大山结合公开面经和岗位 JD我可以说选择题部分基本固定在这三块但机器人公司的侧重点会跟互联网大厂略有差异。数据结构主要考树和图的操作、哈希冲突、排序算法的稳定性与复杂度操作系统重点考进程与线程的区别、死锁产生的四个必要条件、虚拟内存和页面置换计算机网络集中在 TCP 三次握手四次挥手、TCP 与 UDP 区别、HTTP 状态码。看着都很常规但优必选会在这些常规题里嵌入一个“机器人味”的壳。比如问“机器人的导航模块需要频繁接收传感器数据应采用哪种进程间通信方式”表面是操作系统 IPC实际是要求理解管道、消息队列、共享内存的特点并且知道实时性要求高的场景该选哪个。再比如“电机控制指令需要低延迟到达执行器使用 UDP 还是 TCP”这既考网络协议也考“丢包重传的代价”这种工程判断。2.2 语言基础题C 指针、内存、STL 是重灾区软件开发的笔试语言基础题占比不低而且 C 几乎是默认语言。选择题里会出现 const 和 constexpr 的区别、智能指针的底层计数逻辑、vector 扩容机制、map 和 unordered_map 的底层实现差异、左值右值与移动语义、虚函数表的具体工作方式。这些东西在互联网大厂笔试里也考但在机器人公司笔试里考得更细因为机器人软件对性能敏感C 写得好不好直接决定一个模块能否跑在实时要求下。我的建议是复习时别只背结论要能画出底层结构。比如 vector 为什么在尾部插入是均摊 O(1)因为容量不够时它会以约 1.5 或 2 倍扩容然后把旧元素搬过去。笔试里考的是“哪一层开销最大”如果只记结论、不懂机制题一变就蒙。2.3 编程题的三类常见形态编程题大概会分三类。第一类是经典算法题比如链表反转、最长无重复子串、最小栈难度大多在 LeetCode 易到中之间第二类是大模拟题例如按规则解析指令、模拟机器人在网格上的移动路径不考算法巧思考代码组织能力和边界处理第三类是思维设计题比如“有 100 个机器人在同一区域活动如何避免碰撞”“如何设计一个线程安全的任务队列”往往要求写伪代码或描述设计思路。我观察到一种现象很多同学能轻松搞定第一类却在第二类上翻车原因主要是平时写代码依赖 IDE 提示一旦笔试平台没有自动补全就开始数组越界、忘记处理空输入。三类题型的准备侧重点可以参考下面这张表。题型常见难度核心考察点准备建议经典算法题简单到中等数据结构熟练度、算法敏感度按 tag 刷题重点练链表、字符串、二叉树大模拟题简单但费时状态建模、代码组织、边界处理多做“按规则解析”类题目强制无补全环境写思维设计题中等偏上系统设计意识、并发与架构基本功准备线程池、任务队列、生产者消费者模型3. 机器人公司独有的考察点状态机、多线程、通信协议是重点3.1 状态机几乎所有业务模型都离不开如果你认真复盘过优必选这类机器人公司的笔试会发现“状态机”是隐藏最高频的词。原因是机器人的每一个行为都天然是一个状态机开机自检、空闲、避障、抓取、回充……每个状态都有进入条件、停留条件、退出条件状态之间还有迁移关系。笔试不会直接考“请写出状态机定义”而是把状态机藏在题目里比如“请设计一个任务调度系统机器人有几种模式模式之间如何切换”。这种题最坑的地方在于如果心里没有状态机模型很容易写出一堆 if-else 嵌套逻辑乱成一团。正确做法是定义一个枚举类表示状态把状态迁移条件和动作行为对应好最好再画一张状态表。笔试时间有限可以不画图但代码结构必须体现“状态驱动”的建模意识。平时项目里如果写过自动售卖机、电梯调度、Wi-Fi 连接流程之类的东西对这道题就是降维打击。3.2 多线程与并发笔试必考也是最容易暴露问题的地方机器人软件天生并发传感器采集线程、算法计算线程、决策线程、执行器控制线程同时跑还要共享内存、传递消息。多线程几乎是必考项。笔试里最常见的三种题型一是基础概念题问进程与线程的区别问死锁如何避免二是代码题要求实现一个生产者消费者队列或者写一个带超时的线程池三是排错题给一段有数据竞争或死锁风险的代码让找出问题。经验是很多人选择题能答对、概念能背熟但一写代码就露馅。生产者消费者模型看着简单真正手写时会遇到很多细节队列满了怎么阻塞、怎么通知、怎么在析构时安全退出、用什么锁、锁的范围多大。书本上都有但不动手写一遍根本记不住。备战秋招时建议至少手写三遍自己实现的线程安全队列每次都要做到无编译错误。3.3 通信协议从 TCP 到 ROS Topic 的理解机器人不是单体程序而是多个进程、多台板卡甚至多台设备协作的系统。笔试里通信协议的考察通常不会让默写报文格式而是考选择与简答。比如“机器人的导航节点和底盘控制节点之间传递速度指令用 ROS Topic 还是 ROS Service为什么”考的是对 Topic 的发布订阅异步模型和 Service 请求响应同步模型的本质理解。更传统的考察方式也有比如“TCP 粘包问题怎么处理”“串口通信的波特率由什么决定”“CAN 总线和 RS485 在机器人场景中的应用差异”。这类题看起来跟软件开发不搭但实际就是嵌入式方向和中间件方向每天要面对的问题。准备时至少要建立一张协议图谱不同协议用在什么层级、面向什么场景、优缺点是什么。不要求背出每个字段但要能说清取舍理由。3.4 Linux 基础命令行、进程与脚本能力优必选的软件开发岗笔试不一定有独立的 Linux 模块但会混在选择题和编程题里。常见考法有查看进程 CPU 占用用什么命令、如何查找日志里的某个关键字、如何修改文件权限简单脚本题比如写 Shell 脚本统计日志文件行数或提取 IP 地址。有些平台还会出现 Makefile 或 CMakeLists.txt 相关的问题考你是不是真的在 Linux 项目里干过活。这里给个忠告如果你只会 Windows 环境考前一定要把 Linux 基础命令过一遍并且真的动手操作一下。grep、awk、sed、ps、top、chmod、find 的常见用法至少要熟练因为这些题没有太多智力含量纯粹是拿分题丢了太可惜。4. 现场答题策略代码题怎么拿满步骤分4.1 先搭框架再写细节笔试现场最怕的是拿到编程题后立刻开始敲代码边敲边想结果写到一半发现设计错了只能全部删掉重来。更怕的是有些笔试平台会限制切题次数进入下一题就回不来前一道没写完就彻底丢分。我的习惯是拿到题目后先花两分钟在草稿纸上把思路写下来用什么数据结构、分几个函数、主流程是什么顺序。然后再动手敲。这里要注意“先搭框架”不是让你写伪代码而是定义好函数签名和核心数据结构。比如大模拟题先把状态枚举、坐标结构体、移动映射定义好主循环逻辑自然就顺了。这样即使最后没写完主体逻辑代码可读性和局部完成度也会比一堆散乱的代码好很多。4.2 时间分配选择题限时编程题留足根据我自己和身边同学的经验优必选这类笔试选择加编程题的总时长一般是一到两个小时。一个比较稳的时间分配是选择题控制在总时长的四分之一到三分之一编程题至少留下一半时间。具体一点如果总时长 120 分钟选择题和基础题尽量在 50 分钟内完成编程题留足 70 分钟。为什么要把编程题时间留这么足因为编程题不仅要求代码正确还要求你在浏览器里调试、构造测试用例、排查边界条件。很多人做选择题时很顺检查一遍还不停改动结果挤占了编程题时间。一道编程题往往能顶好几道选择题的分值把所有时间押在选择题上完全得不偿失。4.3 测试用例意识自己写边界条件笔试平台的判题规则通常是跑隐藏测试用例所以编程题不只要写功能还要主动构造边界情况来验证。比如题目是“反转字符串中的单词”至少要想一下空字符串、全空格、单词之间有多个空格、末尾有空格这些情况。自己先想好比最后被隐藏用例卡住强一万倍。很多同学在本地编译器上测试不够只跑题目给的样例就提交这是很大隐患。笔试平台通常没有调试器也没有人帮忙指出边界问题唯一的防线就是自己设计用例。我的建议是编码完成后再花两分钟逐一过边界输入为空怎么办、长度为一怎么办、最大值最小值怎么办、重复元素怎么办。4.4 笔试平台和工具提前熟悉比临时抱佛脚重要不同公司用的笔试平台不一样牛客网、赛码网、ExamCoder、ShowMeBug、CodeSignal 等都有可能。优必选这类公司一般会提前发邮件通知笔试链接收到通知后第一时间先进去测一下环境确认摄像头、麦克风、屏幕共享是否正常再把熟悉的编程语言环境配好。别等到开考后才发现编译器版本不对或者代码编辑器自动补全太弱心态直接就崩了。还有一个实操经验笔试开始前准备一个本地的离线代码验证环境。如果平台支持就用自己的 IDE 写好代码再粘进去如果不支持也要在本地编译器里先编译一遍避免低级语法错误。做选择题时遇到不确定的题如果平台上允许用本机编译器验证可以快速写个 demo 验证但要注意时间成本。5. 考后复盘与面试衔接笔试不只是一场考核更是一份面试提纲5.1 复盘错题反推知识盲区笔试结束并不意味着这件事就过去了。我强烈建议笔试当天晚上趁记忆还热着把每道题的关键点记录下来自己有没有做出来、卡在哪一步、是概念不熟还是代码能力不足。尤其是编程题最好重新把代码写一遍提交到自己的仓库里。这不仅是为了查漏补缺更是因为笔试中的高频考点很可能在未来其他公司的笔试里原样复活。复盘时一定要分层第一层是“这个知识点我压根不知道”第二层是“我大概知道但没记住细节”第三层是“我知道但现场没写出来”。三种情况对应的补救策略完全不同。不知道的知识点要补课含糊的知识点要背细节写不出来的要练手速和代码组织。很多人复盘时只是在心里感叹“又要多刷题”这样下次还是会掉进同一个坑。5.2 笔试考了什么面试大概率追问什么这是我最想强调的一点对于机器人公司笔试和面试之间的相关性往往高于互联网大厂。笔试里考了多线程面试官就极大概率会追问线程池参数、锁的实现、并发场景设计笔试里考了 TCP 粘包面试官就可能直接把“粘包问题怎么解决”抛给你。因此笔试复盘直接决定了你能不能接住面试的第一波追问。举个具体例子。如果笔试里有一道模拟机器人避障的题没有写完那么面试前就要补齐这个知识点机器人如何感知障碍物、如何规划局部路径、如何切换行进模式。面试官不会因为一道题就否定你但如果你笔试错了、面试还答不出那就真的没有机会了。反过来笔试答得一般但面试能在相关追问里表现出清晰的思考过程加分效果反而明显。5.3 给下一届秋招同学的三条准备建议写到这里我想给准备下一个秋招周期的同学三条最实在的建议。第一把 C 基础砸实。不管刷 LeetCode 还是做项目都尽量用 C并且要能手写智能指针、vector 扩容模型、虚函数表工作原理这些笔试高频题。第二多接触 Linux 和命令行。别等笔试考到才临时去查日常开发和跑项目时就把 Linux 当主力环境既积累实战经验也能顺手解决笔试里的命令题。第三提前了解机器人系统的分层架构。不需要做过真机项目但要能说清上位机、下位机、传感器、执行器之间的关系知道 ROS 大概是干什么的知道一台机器人从感知到决策到控制的基本链路。这种系统观很难短期突击却恰好是优必选这类整机公司笔试题最想测的东西。最后再分享一个我个人的小习惯。笔试复盘时把错题按“概念题 / 代码题 / 场景设计题”分类整理成表格后面每次参加新公司笔试前快速翻一遍。准备优必选这场笔试时这个表格帮我节省了大量重复复习时间。希望这份复盘也能帮你把准备秋招的时间花在刀刃上。