KyrieChao

2026-10-23 简历作业过了

2026-10-23约 5 分钟

日常

简历作业

终于通过了!但是也不知道怎么过的、可能是写太多次不耐烦让过了、也有可能是勉强合格、也有可能写的不错 但是最后一种可能概率低。

简历过了

今晚也要写项目介绍、自我介绍等等

DeepSeek 生成的

第一部分:自我介绍(直接背,大约 1.5 分钟)

面试官您好,我叫朝格吐,来自内蒙古农业大学计算机科学与技术专业。我的求职意向是嵌入式软件工程师和 Linux 应用开发。

在校期间,我系统掌握了 C/C++ 开发、数据结构以及 Linux 操作系统底层原理。我的技术栈涵盖了Linux 应用开发、网络编程、内核驱动,以及 STM32 单片机与 FreeRTOS 系统。我具备从底层外设驱动编写、RTOS 任务调度,到上层 Linux 并发服务器开发,以及 Qt 上位机软件编写的全链路开发能力。

在项目方面,我曾在成都万创科技实习,参与了 G335 工业边缘计算网关的开发,负责南向协议采集和北向 MQTT 上云;在校期间,我独立完成了 ARM-Linux 平台的驱动封装,还参与过车载 CAN 总线终端以及多自由度稳控云台的项目。此外,我具备软硬协同的排障能力,能熟练使用示波器、逻辑分析仪和 Wireshark 抓包来定位问题。

我非常热爱底层开发,希望能在贵公司得到一个实习/工作的机会,谢谢!


第二部分:项目介绍(以 G335 为例,流畅口述版)

(老师说了,项目介绍不用一字不差背,要像讲故事一样讲出来)

我介绍的项目是万创的 G335 工业边缘计算网关。

【背景】:这个产品主要是用在工业现场的,因为现场有很多 PLC 和传感器,网络环境也比较复杂,所以需要一个网关把数据汇总,然后传到云平台上。

【职责与难点】:在这个项目中,我主要负责南向的数据采集和北向的 MQTT 上云。难点在于怎么保证在高频数据流下系统不卡顿,以及弱网断线后数据不丢失。

【行动】:我使用 Linux Socket 编写了 Modbus TCP 客户端去轮询 PLC,引入了 epoll 多路复用来管理多设备的并发连接;为了防止断网丢数据,我配合团队设计了 RingBuffer 环形缓冲区,等网络恢复后自动补发;数据上传前,我用 cJSON 进行了序列化封装。

【结果】:最后这个网关能稳定支持多路设备的并发接入,即使网络波动也能稳定重连。同时我也负责用 Wireshark 抓包和 GDB 调试,解决了多起报文粘包和丢包的问题。


第三部分:项目押题(核心!按 STAR 法则拆解)

老师让你按“背景、功能、架构、模块实现、业务流程、数据结构、遇到问题怎么调试”来拆。以下是 G335 的押题范例:

  • Q1:为什么用 epoll 而不用 select?
    • A(Action):G335 这种网关可能要同时连接几十上百个设备。select 每次调用都要把所有 fd 从用户态拷贝到内核态,而且返回后还要遍历所有 fd,效率很低。epoll 是基于事件驱动的,没有 fd 数量限制,而且不需要每次都拷贝,它在海量并发且只有少量活跃连接时,性能极高,所以更适合工业网关。
  • Q2:遇到网络波动导致数据丢失(或粘包),你是如何调试和解决的?
    • A(Action + Result):首先,我在设备端打日志,确认是物理网络断了还是应用层没发出去。然后,我用 Wireshark 抓包,发现是报文没有加包头和包尾,导致接收端无法判断数据边界(粘包)。最后,我在协议里增加了帧头帧尾和长度字段,并配合 RingBuffer 环形缓冲区,断网时先存本地,网络恢复后自动重发,解决了丢包问题。
  • Q3:设备假死怎么处理?
    • A:我在代码里加了心跳保活机制(Keep-Alive)和超时重试机制。如果发送报文后,规定时间(比如 3 秒)没收到回复,就自动重连,或者切换备用网络链路。

(你自己写其他项目时,也要准备好:CAN 总线遇到丢帧怎么查?云台 PID 振荡怎么调?)


第四部分:技术押题(简历写了啥,面试就问啥)

老师强调了,根据你简历里的技术栈,每项准备 1-3 个问题。给你列几个必考的核心题:

1. C/C++

  • 问:你了解智能指针吗?解决什么问题的?
  • 答:了解。unique_ptr 独占所有权,shared_ptr 是共享所有权(引用计数)。它们主要用来防止忘记 delete 导致的内存泄漏,利用了 RAII(资源获取即初始化)的机制,出了作用域自动释放。

2. Linux 应用与网络

  • 问:多线程怎么同步?死锁怎么产生的?
  • 答:用互斥锁、条件变量。死锁通常是因为两个线程互相持有对方需要的锁,并且不释放。解决方法是:按顺序加锁,或者使用 std::lock_guard 自动解锁。
  • 问:TCP 和 UDP 区别?
  • 答:TCP 面向连接、可靠、流式传输,适合文件传输和 Modbus;UDP 无连接、快、可能丢包,适合视频流或高频传感器数据。

3. STM32/RTOS/底层

  • 问:DMA 是什么?怎么用?
  • 答:DMA 是直接内存访问,不占用 CPU。我通常用它配合串口或 SPI 接收数据,比如 CAN 总线高频收发时,配置 DMA 接收,处理完一批再触发中断,大大减轻了 CPU 负担。
  • 问:FreeRTOS 任务调度原理?任务怎么通信的?
  • 答:基于优先级的抢占式调度,高优先级任务就绪立马打断低优先级。任务之间通常用消息队列、信号量、互斥锁来通信。

力扣

单词规律

给定一种规律 pattern 和一个字符串 s ,判断 s 是否遵循相同的规律。

这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。具体来说:

pattern 中的每个字母都 恰好 映射到 s 中的一个唯一单词。 s 中的每个唯一单词都 恰好 映射到 pattern 中的一个字母。 没有两个字母映射到同一个单词,也没有两个单词映射到同一个字母。

示例1: 输入: pattern = "abba", s = "dog cat cat dog" 输出: true

示例 2: 输入:pattern = "abba", s = "dog cat cat fish" 输出: false

示例 3: 输入: pattern = "aaaa", s = "dog cat cat dog" 输出: false

bool wordPattern(char* pattern, char* s) {
    int len = strlen(pattern);
    int p_code[300];
    int p_dict[26];
    for (int i = 0; i < 26; i++)
        p_dict[i] = -1;

    for (int i = 0; i < len; i++) {
        int idx = pattern[i] - 'a';
        if (p_dict[idx] == -1) {
            p_dict[idx] = i;
            p_code[i] = i;
        } else {
            p_code[i] = p_dict[idx];
        }
    }

    char* words[300];
    int w_cnt = 0;
    char* token = strtok(s, " ");
    while (token != NULL) {
        words[w_cnt++] = token;
        token = strtok(NULL, " ");
    }
    if (w_cnt != len)
        return false;
    for (int i = 0; i < w_cnt; i++) {
        int current_code = -1;
        for (int j = 0; j < i; j++) {
            if (strcmp(words[j], words[i]) == 0) {
                current_code = j;
                break;
            }
        }

        if (current_code == -1) {
            current_code = i;
        }
        if (current_code != p_code[i]) {
            return false;
        }
    }
    return true;
}