本周推进
本周主要围绕 Qt/C++ 基础知识复习、通用上位机开发、C++ 后端项目架构思考以及技术面试 四个方面展开。
重新梳理了之前负责的工业上位机项目,尝试在原有架构的基础上开发一套可复用的通用上位机框架。同时复习了 C++、Qt 的基础知识以及实际项目中的业务流程。
此外,重新审视了之前编写的 C++ 后端项目,思考是否能够在现有代码基础上逐步改造成通用工业物联网平台。
本周也参加了一次 Qt/C++ 开发岗位的技术面试,对之前的项目经验进行了回顾,发现自己在部分架构设计和异常场景处理方面仍然存在需要加强的地方。
一、Qt 和 C++ 知识复习
1. C++ 基础知识
重点回顾了以下内容:
- C++ 对象生命周期以及内存管理。
- 智能指针与 RAII 资源管理机制。
- 多线程编程、互斥锁与线程安全。
- 回调函数、异步执行与事件驱动机制。
- STL 常用容器及其适用场景。
相比单纯记忆概念,这次复习更注重结合项目中的实际代码,理解各种机制为什么被使用,以及使用不当可能带来的问题。
2. Qt 框架与多线程
重新梳理了 Qt 中的信号与槽机制、QObject 线程归属、QThread 的使用方法,以及工作线程与 UI 线程之间的数据交互。
重点关注:
moveToThread()的使用方式。- DirectConnection、QueuedConnection 和 AutoConnection 的区别。
- 为什么耗时操作放在 UI 线程中会导致界面卡顿。
- 如何通过信号与槽完成跨线程的数据传递。
- 多个设备同时连接时,如何合理管理线程资源。
其中,线程数量不应该简单地与设备数量一一对应。对于大量以网络 I/O 为主的设备通信任务,可以优先考虑 Qt 事件循环、异步 I/O 和适当的线程划分,避免线程数量随着设备数量无限增加。
二、通用 Qt 上位机开发
本周尝试基于之前工业上位机的实际开发经验,重新设计一套通用上位机框架。
之前的项目主要围绕特定设备展开,通信地址、业务逻辑和界面展示之间存在一定程度的耦合。因此,这次希望在保留原有成熟设计思路的基础上,提高代码的模块化程度和可复用性。
重点重新梳理了以下模块:
- 通信层:负责 Modbus TCP 通信、设备连接与数据收发。
- 设备管理层:统一管理设备连接状态、通信任务和异常信息。
- 数据处理层:负责寄存器数据解析、数据转换以及业务数据更新。
- 业务逻辑层:负责运行状态、报警事件和设备控制逻辑。
- 界面展示层:通过 Qt 信号与槽更新界面,避免通信与业务操作阻塞 UI。
在通信部分,重点复习了 QModbusClient、QModbusReply 等相关类的使用方式,以及异步请求的执行过程。
例如,发送 Modbus 请求后,通过 QModbusReply::finished 信号通知请求完成,再读取响应结果并进行后续处理。
同时重新思考了请求队列的意义:当同一设备存在多个读写任务时,需要合理安排请求顺序、超时处理和异常恢复,避免通信过程混乱。
当前仍然处于框架整理与持续实现阶段,后续需要结合模拟设备或真实设备进一步测试。
三、C++ 后端项目与工业物联网平台构思
重新回顾了之前的 C++ 后端项目,思考能否基于已有的网络通信、数据库和服务端开发经验,逐步扩展为通用的工业物联网平台。
初步考虑的平台能力包括:
- 设备接入与连接管理。
- 多种工业通信协议适配。
- 设备数据采集、解析和统一管理。
- 历史数据存储与查询。
- HTTP/REST API 服务。
- 设备告警、状态管理和监控。
- 面向不同设备的数据模型与配置管理。
考虑到之前已经有一定的 C++ 网络开发、数据库和工业通信经验,技术上存在较好的衔接基础。
但目前最大的挑战并不是某个功能的实现,而是如何建立合理的抽象边界,让不同通信协议和不同设备类型能够复用同一套上层业务逻辑。
因此,暂时不准备一次性实现完整平台,而是考虑从单设备接入、数据采集、持久化和 API 查询构成的最小闭环开始,逐步扩展。
四、技术面试复盘
本周参加了一次 Qt/C++ 开发相关的技术面试。
面试过程中,面试官更多地围绕之前的实际项目展开提问,而不只是考察基础知识。
其中几类问题给我留下了比较深的印象:
1. 如果后续接入的 PLC 数量增加,线程应该如何分配?
需要考虑设备数量、通信频率、连接类型以及线程资源开销,不能直接采用一个设备对应一个线程的简单方案。
2. 如果设备突然断开连接,下发中的指令如何处理?
最初考虑通过后台心跳和重连机制恢复通信,并缓存尚未完成的指令。
进一步思考后发现,实际项目中还需要区分指令是否已经被设备执行,避免重连后的重复下发。
对于控制类指令,还需要考虑幂等性、有效期以及重新执行的安全性。
3. 设备断电后,如何恢复之前的数据?
这一问题涉及数据持久化、状态恢复以及异常断电场景下的数据一致性。
需要区分历史采集数据、设备运行状态以及尚未完成的控制任务,不能简单地把所有状态重新加载。
4. 为什么已经创建工作线程,Qt 界面仍然会卡顿?
即使项目使用了多线程,只要耗时任务仍然在 UI 线程中执行,就可能阻塞事件循环。
关键不在于项目是否创建了 QThread,而在于耗时操作实际上运行在哪个线程中。
通过这次面试发现,自己对具体业务功能的实现相对熟悉,但对于系统扩展性、异常恢复和架构设计等问题,还需要更深入地思考。
问题与解法
一、AI 生成的上位机架构与原项目存在差异
本周借助 AI 辅助开发通用上位机时,发现生成的代码虽然能够满足部分功能需求,但整体架构与之前实际项目的设计存在差异。
主要问题包括:
- 模块职责划分与原项目不完全一致。
- 线程使用方式和通信请求调度思路有所不同。
- 部分实现仅考虑正常通信流程,没有充分覆盖异常场景。
- 不同轮次生成的代码在接口命名和设计方式上缺乏一致性。
解决思路:
重新整理之前上位机项目中的关键代码和架构设计,将已经验证过的实现方式提炼为开发规范,并尝试创建专门的 AI Skills。
希望通过 Skills 约束代码结构、命名规则、线程模型和通信流程,使后续 AI 生成的代码更加符合既有项目的技术要求。
这也让我意识到:AI 更适合作为代码实现和重构的辅助工具,而不是完全替代开发者进行架构决策。
只有自己真正理解原有架构,才能判断 AI 生成的实现是否合理。
二、旧 C++ 后端项目的复现问题
虽然之前保留了项目开发过程中的部分记录,但在尝试重新理解和复现时,仍然遇到不少问题。
一方面,当前开发环境与之前存在差异,包括编译工具、依赖库、数据库配置和运行环境。
另一方面,原项目依赖的实际设备和测试条件已经发生变化,导致部分原有流程无法直接验证。
解决思路:
- 重新梳理项目依赖与编译配置,尽量减少对特定开发环境的依赖。
- 使用模拟数据或 Mock 设备替代暂时无法连接的实际硬件。
- 将网络通信、数据处理和数据库操作拆分,便于独立测试。
- 逐步补充项目文档,记录构建过程、模块职责和关键接口。
- 优先恢复最小可运行版本,再逐步开展重构。
这一过程也暴露了以前开发习惯中的不足:比较重视功能完成,但对环境复现、项目文档和自动化测试关注不够。
三、技术知识存在理解与实际应用脱节的问题
在平时开发中,很多技术只需要知道如何使用,就能够完成当前任务。
但是面试时,需要进一步解释设计原因、适用场景以及其他实现方式的优缺点。
例如多线程设计、断线重连、数据恢复等问题,都不能仅仅停留在某个 API 的使用层面。
后续需要在复习时建立从基础原理 → 代码实现 → 实际场景 → 异常处理的完整知识链条。
输入与收获
本周最大的收获,是重新建立了对之前项目架构的整体认识。
1. 从功能实现转向架构理解
过去更关注某个模块能否完成需求,现在开始进一步思考模块之间为什么这样划分,以及这种设计在设备数量增加、通信异常等情况下是否仍然适用。
2. 对 AI 辅助编程有了新的认识
AI 能够提高代码编写效率,但如果缺少明确的架构约束,很容易生成风格不一致、难以长期维护的代码。
因此,后续希望将 Skills、项目规范和代码审查结合起来,形成更加稳定的 AI 辅助开发流程。
3. 重新认识了项目文档的重要性
一个项目能运行,并不代表以后能够轻松复现。
完整的依赖说明、构建步骤、配置示例和测试方法,同样属于项目工程质量的重要组成部分。
4. 通过面试发现了自己的技术薄弱环节
对于实际开发中经常使用的 Qt、Modbus 和 C++,已经积累了一定经验,但在系统设计、异常恢复和技术方案选择方面,仍然需要继续提升。
相比重复记忆面试题,结合真实项目重新推导这些问题,可能更有利于形成长期的技术积累。
下周计划
下周主要根据本周技术面试的结果,调整学习与项目开发的优先级。
一、如果顺利录用
如果能够进入新的 Qt/C++ 开发岗位,将重点重新熟悉 Qt 开发体系,同时结合岗位涉及的影像设备方向,系统复习本科期间学习过的 OpenCV 知识。
重点包括:
- OpenCV 基础数据结构及
cv::Mat的使用。 - 图像读取、显示、存储与格式转换。
- 图像滤波、二值化、边缘检测和形态学操作。
- 图像几何变换、轮廓提取及基础图像分析。
- Qt 与 OpenCV 的数据转换和集成方式。
- C++ 项目中图像处理任务的多线程设计与性能优化。
希望通过实际的小型图像处理程序恢复相关知识,而不只是停留在 API 记忆上。
二、如果暂时没有录用
继续按照 Qt/C++ 工业软件开发方向准备后续面试。
- 重点巩固 C++ 基础、多线程和 Qt 核心机制。
- 继续完善通用 Qt 上位机框架。
- 针对本次面试中暴露的问题进行专项复习。
- 继续整理 C++ 后端项目,逐步恢复基本功能。
- 适当学习工业互联网平台的设备接入和数据管理设计。
三、持续推进的个人项目
无论最终面试结果如何,都希望保持一定的项目开发节奏。
优先完成通用上位机的基础通信与设备管理模块,逐步补充异常处理和测试能力。
对于 C++ 后端项目,先以能够独立构建、运行和测试为目标,不急于开展大规模重构。
本周总结
这一周更像是一次技术能力的回顾与整理。
从之前的 Qt 工业上位机,到后来的嵌入式通信,再到 C++ 后端服务,虽然不同岗位涉及的业务场景有所区别,但底层仍然存在不少共通的技术知识。
网络通信、多线程、数据处理、异常恢复以及模块化设计,始终是值得持续深入学习的内容。
现阶段最重要的不是一味增加新技术栈,而是把已经做过的项目真正理解透彻,并逐步形成能够复用和迁移的技术能力。
希望下周能够收到一个不错的面试结果,也希望无论结果如何,都能继续把手头的项目和技术积累做好。