拓冰建站拓冰建站
首页 / 资讯中心 / 正文

东土科技秋招笔试复盘:嵌入式软件开发岗考点与避坑指南

东土科技2023年秋招软件开发岗笔试我踩过的坑和复盘又到了秋招季如果你正在准备嵌入式或工业通信方向的软件开发岗位东土科技的笔试应该值得你花点时间研究一下。这家公司做工业以太网交换机起家后来在自主可控的实时操作系统、工业通信芯片上布局很深所以它家的笔试题和互联网大厂完全是两个路子——不卷算法竞赛题但非常吃基本功和对底层原理的理解。我参加了2023年那场秋招笔试说实话当时做完的感觉是“题量不大但每一道都在试探你的知识边界”。有些题目看似基础实际上背后藏着很多可以深挖的东西。这篇复盘我尽量还原当时的题目类型和考点结合我自己的答题情况和后续反思给准备投递的同学一个参考。1. 笔试整体情况与考察方向拆解1.1 考试形式与时间安排东土科技2023年秋招的软件开发岗笔试我记得是线上进行的用的是常见的在线测评平台全程开摄像头监控。题型包括单选题、多选题、判断题、两道编程题外加一道综合设计题。时间是90分钟题量不算大但如果对知识点不熟时间依然会比较紧张。从岗位方向来看东土的软件开发岗其实分了几个方向比如嵌入式软件开发、应用软件开发、测试开发等。我当时投递的是嵌入式软件开发方向所以笔试内容会更偏向C/C底子、操作系统、计算机网络这些。如果你投的是应用软件开发可能会多考察Java或数据库相关内容但这个我没有直接经历就不乱说了。1.2 核心考察维度结合我自己的体验和同批次同学的反馈东土的笔试主要考察四个维度一是C语言和C的底层功底。指针、内存管理、结构体对齐、宏定义、编译链接这些几乎必考而且考得很细。二是操作系统和Linux基础。进程线程区别、同步互斥机制、内存布局、Linux常用命令和文件系统这些都是嵌入式软件开发的“地基”。三是计算机网络。工业通信是东土的核心业务TCP/IP协议栈自然跑不掉。尤其是TCP的三次握手四次挥手、拥塞控制以及工业以太网里常提到的实时性概念都有可能涉及。四是逻辑和代码落地能力。两道编程题属于“不难想但写起来容易翻车”的类型考察的不是算法竞赛思维而是用代码解决实际问题的基本功。注意这只是我2023年那次笔试的个人体验。每家公司的笔试题每年都会调整甚至同一年不同批次的题也可能不同所以参考价值在于知识点的覆盖面而不是赌题。2. 专业基础知识考点回顾2.1 C/C语言与内存管理细节C语言部分是我印象最深的因为考得真的细。有一道题是给了一段结构体定义让计算sizeof的返回值。表面上这是结构体对齐问题实际还考察了指定对齐方式的情况。当时题目里用了#pragma pack(push, 1)这样的预处理指令我记得很清楚因为如果不熟悉pack的语义很容易踩坑。我后来实际验证过这样一个例子#pragma pack(push, 1) typedef struct { char a; int b; short c; } TestStruct; #pragma pack(pop)默认情况下这个结构体在32位系统上应该是12字节char补3个字节int占4short补2但加上pack(1)之后会变成7字节。笔试里考的正是这种反直觉的点。这类题目没有技巧只能靠平时写代码时真的关注过内存布局才能答对。还有一道题考的是指针数组和数组指针的区别并要求写出下面代码的输出int arr[5] {1, 2, 3, 4, 5}; int *ptr (int *)(arr 1); printf(%d, %d, *(arr 1), *(ptr - 1));这里arr是整个数组的地址arr 1会跳过整个数组而不是一个元素所以ptr实际上指向数组末尾之后的位置。*(ptr - 1)取到的就是arr[4]也就是5。这类题在嵌入式笔试里几乎每年都有本质上考的还是“数组名在表达式中的退化规则”和“指针运算的单位”。2.2 操作系统与Linux基础操作系统的题量占比不低。有一道题是问进程和线程的区别选项里混了几个“线程拥有独立地址空间”这类错误描述考的是对这些概念的精确认知。我后来在复盘时把这些基础概念做了个对比方便自己记忆项目进程线程地址空间独立地址空间共享进程地址空间系统资源独立拥有资源共享所属进程的资源调度开销较大较小通信方式需要IPC机制可直接通过共享内存通信崩溃影响进程间隔离一个线程崩溃可能拖垮整个进程另一道题考察的是Linux中进程间通信的方式问哪些属于典型的IPC机制。这个题本身不难管道、消息队列、共享内存、信号量、Socket都是但我当时看选项时差点漏掉Socket。因为在传统思维里Socket更多关联到网络编程但它确实也是一种IPC方式特别是在本机UDS通信的场景下很常用。所以提醒准备笔试的同学基础知识要学得宽一点不要自己给自己设限。2.3 计算机网络与工业通信基础东土的笔试在通信相关的题目上会明显比互联网公司更“硬核”。比如有一道题考TCP的三次握手客户端发送SYN包后进入什么状态服务端收到SYN后返回什么包这些是经典八股了答案分别是SYN_SENT和SYNACK。但让我印象更深的是一道关于TCP拥塞控制的题问“慢启动阶段拥塞窗口的增长方式”选项里有一个“线性增长”的干扰项。慢启动实际上是指数增长线性增长发生在拥塞避免阶段。如果对TCP拥塞控制流程不够清楚很容易被这个选项迷惑。此外还有一道关于HTTP状态码的题问“404 Not Found”属于哪一类响应。这题本身简单属于客户端错误4xx但结合东土做工业通信的背景我当时猜测他们更关心的是对网络协议栈的完整理解而不仅仅是应用层的HTTP所以网络部分还是值得花时间系统过一遍的。2.4 软件开发流程与规范笔试里有一道多选题问的是“软件开发生命周期中常见的模型有哪些”选项包括瀑布模型、V模型、迭代模型、敏捷开发等。这道题不难但它背后折射出一个信号东土作为面向工业领域的公司比较看重开发流程的规范性。这一点和热词里提到的ASPICE软件开发流程是吻合的。ASPICE是汽车行业软件过程改进与能力评定的标准在工业通信和嵌入式领域也越来越受重视。如果你准备面试东土建议了解一下V模型和ASPICE的基本概念至少要知道它们强调的是什么——需求可追溯、过程可验证、结果可检查。3. 编程题与综合设计题复盘3.1 编程题一环形缓冲区越界问题第一道编程题是一个字符串压缩的题目要求在原地压缩连续重复字符比如把aaabbcccc转换成a3b2c4。这道题思路不复杂双指针就能解决但我在写的时候卡在了一个细节上当连续字符的数量超过9时怎么办题目没有明确说明但压缩后的格式也要保持字符串的形式如果原字符串是aaaaaaaaaa10个a压缩成a10反而比原串多一位。我当时权衡了一下选择了当压缩后长度不小于原始长度时保留原始字符串的处理方式。这种决策其实没有标准答案但会考察你面对模糊需求时的分析能力建议在答题区明确写出自己的假设。def compress(s: str) - str: if not s: return result [] i 0 n len(s) while i n: j i while j n and s[j] s[i]: j 1 count j - i if count 1: result.append(s[i]) result.append(str(count)) else: result.append(s[i]) i j compressed .join(result) return compressed if len(compressed) len(s) else s这道题我当时用Python写的也可以用C。需要注意的边界条件包括空字符串、无连续重复字符的字符串、全部字符相同的情况。代码本身不是难点难的是把边界情况考虑全。3.2 编程题二链表与状态转换的组合问题第二道编程题是一道链表题但和常见的链表反转、合并不太一样它给的是一个“链表中相邻相同元素合并为一个节点且值相加”的问题。比如 1 - 2 - 2 - 3 合并后变成 1 - 4 - 3。核心是遍历时保存前一个节点如果发现当前节点和前一个节点值相同就合并然后继续向后检查直到遇到不相同的节点为止。这道题考察的是链表操作的细节指针回收、边界检查、防止空指针解引用。在C/C里还要注意释放被合并节点的内存避免内存泄漏。这种题在LeetCode上其实有类似原型但东土把它放在了嵌入式方向笔试里说明他们不搞偏难怪题考察的就是日常开发中真的用得上的链表操作能力。3.3 综合设计题无锁队列的实现思路综合设计题是整场笔试中最有意思的部分。题目大意是在资源受限的嵌入式环境中设计一个多线程环境下的无锁队列要求尽量减少锁竞争说明数据结构设计思路和可能存在的问题。这道题没有标准答案更像是在考察你的知识边界和工程经验。我当时的思路是这样的首先无锁队列的经典实现是使用环形缓冲区配合原子变量维护读写索引。实现上有几种常见方案一是单生产者单消费者场景下只需将读写指针声明为原子变量因为各自只操作自己的指针二是多生产者单消费者场景下生产者之间需要用CAS比较并交换来竞争写入位置三是多生产者多消费者情况复杂度会明显上升通常需要辅助数组或更复杂的内存管理策略。环形缓冲区的数据结构可以这样设计typedef struct { void *buffer; int capacity; volatile int head; volatile int tail; } LockFreeQueue;单生产者单消费者场景下head只被消费者读、生产者写tail只被生产者读、消费者写各自维护自己的索引配合内存屏障就能保证正确性。这个问题我当时没有完全答完只把整体思路和数据结构的骨架写清楚了但面试官后来追问的时候我意识到有一个关键点我最初没有考虑到ABA问题。CAS操作在并发环境下可能遇到ABA问题——一个值从A变成B再变回A但CAS会认为它没有变化过。在无锁队列中如果复用节点内存容易出现ABA问题需要借助标记位或版本号来解决。关于无锁编程我自己的经验是能加锁就不要轻易无锁。无锁在实时性要求极高的场景下确实有优势但正确性验证难度极大而且在不同CPU架构上的内存模型差异也很大。笔试的时候能写出环形缓冲原子变量CAS这套思路已经算是中上水平千万别在笔试里硬设计一个特别复杂的无锁容器。4. 嵌入式方向加码知识点4.1 交叉编译与Linux环境下的开发习惯虽然是笔试但东土的题里也出现了一些与工具有关的题。比如有一道题是问交叉编译工具链的作用选项包括“在宿主机上编译目标机上运行的代码”“提高编译速度”“替代编译器”等。这题其实很简单但如果你没有真正做过嵌入式开发可能会纠结。交叉编译的本质是在一种架构的机器上编译出另一种架构上可执行的程序。比如在x86电脑上编译ARM平台的可执行文件用的就是交叉编译工具链。还有一道题问的是Linux下查看系统资源常用的命令。选项包括top、free、df、ps等我见过有些同学会把df磁盘使用情况和du目录大小弄混。另一个细节是free -m显示的是以MB为单位的内存信息而不是字节。这些都属于工作中高频使用的小知识虽然简单但真的很常考。4.2 网络编程与Socket通信题目网络编程是嵌入式软件开发躲不开的部分。笔试题里有一道socket编程的判断TCP服务端程序中accept函数的返回值是什么这个返回值是一个新的socket文件描述符用于与客户端通信而监听socket本身继续等待新连接。这个点如果没做过服务端编程比较容易混淆。我当时在实际项目里写过一个简单的TCP服务端所以这道题没什么问题。但因为东土做的是工业以太网交换机我在笔试前专门去了解了一下工业以太网和普通以太网的区别包括实时性要求、确定性转发等概念。果不其然虽然笔试没有直接考这些但后面的面试环节真的有聊到。所以建议准备东土的同学不要只看通用知识对TSN时间敏感网络、工业以太网协议这些概念要有基本认知。4.3 数据库与软件工程基础知识对于应用软件开发岗的同学数据库可能占更大的比重。东土笔试题库中有一部分通用题主要是软件工程和简单的数据库知识。比如我印象里有一道是问“事务的ACID特性分别是什么”这个属于数据库中最基础的概念但不少非科班同学在这里面会翻车。我的建议是除了背下ACID之外最好能结合场景理解它们为什么重要。比如“原子性”可以理解为转账操作中扣款和入账必须同时成功或同时失败“隔离性”解决的是多个事务并发执行时的数据一致性问题。这样面试官追问时你也不至于哑口无言。5. 笔试题示例与实用复盘方法5.1 几道我在备考中反复练习的经典题笔试结束后我花了一段时间专门复盘嵌入式软件开发的笔试常见题型。有一些题可以说是“万金油”东土考了其他公司大概率也会考第一道经典的内存对齐题。结构体中有char、int、short成员时不同排列顺序会导致不同大小比如char、int、short是12字节而int、char、short则是8字节。这道题考察的是对齐规则的理解而不只是记忆。第二道stm32或嵌入式环境下volatile关键字的作用和应用场景。标准答案一般会说“防止编译器优化每次从内存读取变量”。更关键的是要知道它用在哪些场景硬件寄存器映射、中断服务程序修改的全局变量、多线程共享变量。单纯背答案是没用的必须理解为什么需要“每次都从内存读”。第三道C中static关键字在不同位置的语义。局部静态变量、全局静态变量、静态成员变量、静态成员函数各自的行为都不同。这道题考察的是对作用域、生命周期、存储位置的理解而不只是会说一个静态。第四道TCP握手断开的状态转换题。这属于网络编程最核心的内容不仅笔试常考面试更常考。三次握手状态CLOSED、LISTEN、SYN_SENT、SYN_RCVD、ESTABLISHED四次挥手涉及的FIN_WAIT_1、FIN_WAIT_2、TIME_WAIT、CLOSE_WAIT、LAST_ACK建议能默画状态图。5.2 笔试后的复盘建立自己的错题知识树笔试结束之后我花了一整个周末做复盘。我没有停留在“对答案”的程度而是把所有错题和拿不准的题都整理成了一个知识树知识树根节点C/C基础 ├── 指针与数组 │ ├── 指针运算单位 │ ├── 数组名退化 │ └── 多级指针 ├── 内存管理 │ ├── malloc/free与new/delete │ ├── 内存泄漏场景 │ └── 内存对齐 ├── 编译与链接 │ ├── 编译阶段 │ ├── 静态库与动态库 │ └── 预处理指令 知识树根节点操作系统 ├── 进程与线程 │ ├── 区别与联系 │ ├── 调度算法 │ └── 同步互斥 ├── 内存管理 │ ├── 虚拟内存 │ ├── 页表 │ └── 堆和栈 └── Linux命令 ├── 文件操作 ├── 进程管理 └── 网络工具 知识树根节点计算机网络 ├── TCP/UDP ├── TCP状态转换 ├── 拥塞控制 └── HTTP/HTTPS这个方法帮我后来在多家公司的笔试中拿到了面试机会。因为笔试的考察点其实是相对集中的建立自己的知识树然后针对薄弱项查漏补缺比刷题海效率高得多。5.3 工具链准备与编程语言选择建议笔试时编程语言的选择也很重要。东土的笔试平台支持多种语言包括C、C、Java、Python等。我的建议是如果投的是嵌入式方向优先用C或C作答。原因很简单嵌入式软件开发的日常就是C/C笔试题也常常是链表、内存管理这类用C/C更能体现功底的内容。如果题目本身对开发效率要求高比如字符串处理类Python可能会更快但在提交之前要想清楚有些面试官会关注你的语言选择是否和岗位方向匹配。笔试平台上提前确认编译环境版本。C的标准版本C11还是C17、是否支持某些特性这些细节如果考前不确认写代码时临时发现不支持就很被动了。我自己的策略是字符串处理类题目用Python其他题目用C。这样兼顾效率与展示方向匹配度。但这只是个人习惯主要还是看你自己更擅长什么。6. 常见问题与实战避坑记录6.1 笔试中容易踩的坑先说我真实踩过的第一个坑没有提前熟悉在线笔试平台的操作方式。当时用的是牛客网风格的编程环境但我平时习惯了本地IDE的自动补全和报错提示从输入输出到代码提交都需要手写导致第一道编程题浪费了十分钟在调试输入输出格式上。这个坑真的非常常见。第二个坑是答题顺序安排不合理。我先把时间花在了前面知识题上碰到两道不确定的题反复纠结导致留给编程题的时间偏紧。后来我调整了策略先快速浏览所有题目优先做编程题再回来做知识题。知识题往往一眼扫过去就知道会不会不会的题不要死磕凭第一印象选一个标记好回头有时间再想。第三个是读题不仔细。综合设计题里的“资源受限”四个字其实暗示了不能用链表加锁这种简单的方案但我第一次看题时没有重视这个限定条件导致最初的设计思路完全偏了。对这种描述性的题目一定要把条件逐一拆出来对应到相应的技术选型上否则方案设计和题设不匹配丢分很可惜。6.2 备考资料与学习路线建议如果你的目标就是东土或者其他工业通信、嵌入式方向的公司我个人的备考建议是“基础优先项目加分”。基础部分C语言和操作系统的权重最高。C语言推荐《C和指针》《深度探索C对象模型》操作系统可以看汤小丹的《计算机操作系统》或者直接看《深入理解计算机系统》里的虚拟内存和并发章节。计算机网络方面《TCP/IP详解》卷一太深笔试阶段不需要全部啃完重点看TCP状态转换和拥塞控制那一章就够。项目方面如果有条件尽量准备一两个和岗位方向相关的项目。比如做一个基于Linux的简单TCP服务器、基于STM32的传感器数据采集与上报系统或者分析一个开源嵌入式系统的小模块。这类项目不需要多宏大但一定能体现你对底层细节的理解。6.3 笔试之后面试环节的衔接准备东土的面试环节和笔试之间隔了大概一周。面试过程中我被问到的技术问题有不少正是笔试中涉及的知识点的深化。比如笔试里考了volatile关键字面试时面试官会追问“volatile能不能保证原子性”这显然是同一个知识点的延展。再比如笔试编程题用了双指针技巧面试时可能会问如何在不使用额外空间的情况下找到链表的中间节点依然是双指针思路。所以我的建议是笔试结束后立刻把每一道拿不准的题都弄懂最好把相关知识点扩展成一个小的专题因为面试官很可能顺着笔试中的某个点深挖下去。当时的教训是我在内存对齐方面只记住了结果没有深入理解对齐规则背后的C标准、ABI和CPU访存特性结果面试时被问到“为什么需要对齐”就有点卡壳。另外如果你有时间可以提前了解东土的产品线和核心技术方向。至少要知道他们做工业以太网交换机、工业操作系统、时间敏感网络这些知识在面试中非常有用因为面试官更容易和你聊到他熟悉的方向。如果你还能说出TSN在大规模工业控制里的应用场景印象分会高不少。我最后通过并拿到了offer但这段笔试经历给我最大的收获不是那个offer本身而是让我真正意识到“知识体系”比“刷题量”重要得多。准备笔试的过程就像在给自己做一次全身体检每道不懂的题都值得认真研究。希望你也能从这次笔试中拿到自己想要的offer。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门