
记得那是2017年秋天的事校园招聘季刚拉开帷幕我揣着简历奔走在各个宣讲会之间。广联达那场笔试说实话当时并没有抱太大期望毕竟这家公司在建筑信息化领域深耕多年笔试题目向来以基础扎实、覆盖面广著称。但正是这场笔试让我后来对校招技术考核的套路有了完全不同的认识。现在回头看广联达2018校招开发工程师笔试的题目设计其实代表了当时建筑行业软件公司对技术人才的核心诉求计算机基础要硬编程能力要实同时对业务场景要有基本的敏感度。这篇文章我想把当年那场笔试的完整复盘写下来包括题型结构、考点分布、典型题目解析以及我从中总结出的备考思路。无论你是正在准备广联达校招还是打算投递其他建筑软件公司这份笔记应该都能帮你少走不少弯路。1. 广联达2018校招笔试的全貌题型、时长与考察逻辑先说整体情况。广联达那年的校招笔试采用的是线上笔试系统我记得当时用的是某第三方在线评测平台全程摄像头监控时限比较严格。整张试卷包含三个部分计算机基础知识选择题、算法与数据结构编程题、以及一小部分与公司业务相关的综合题。总时长大概是120分钟题量不小时间相当紧凑。1.1 试卷结构和分值分布题型题量分值占比考察方向单项选择20题40%计算机网络、操作系统、数据库、C/Java基础多项选择5题15%容易失分的知识点辨析如TCP拥塞控制、进程调度算法编程题3题30%链表操作、字符串处理、经典算法变种综合题2题15%面向对象设计、业务场景分析这个分值分布本身就透露了很多信息。选择题占了半壁江山说明广联达非常看重候选人的计算机基础是否扎实。编程题占比虽然没有想象中高但三道题的分值梯度很明显基本是用来拉开差距的。综合题则是广联达的一大特色会结合建筑软件的业务场景来出题这一点在后面单独展开。1.2 难度阶梯与考察意图从整体难度来看这套试卷的难度属于中等偏上但梯度设计得很合理。前10道选择题基本是送分题只要认真准备过计算机网络和操作系统常考知识点拿满分问题不大。但从第11题开始题目会故意设置一些容易混淆的选项比如TCP的TIME_WAIT状态持续时间、虚拟内存的页面置换算法在不同情况下的表现差异这些光靠死记硬背是不够的需要真正理解机制背后的原理。编程题的三道题难度是递进的。第一题属于leetcode easy级别第二题是medium偏下第三题则带有一定的思维难度需要在基础算法上进行变通。我印象很深的是第三题题干描述的是一个实际业务场景——工程算量中的数据去重与合并要求在时间复杂度上有明确约束。这种把业务逻辑抽象成算法模型的能力恰恰是广联达这类To B软件公司最看重的。2. 选择题考点深度剖析这些知识点为什么反复出现选择题部分虽然考的是基础但选得很有讲究。我把当年考到的知识点按科目梳理了一下结合我后来的工作经验说说为什么广联达会重点考察这些内容。2.1 计算机网络不仅是握手更是并发场景下的协议行为计算机网络大概占了选择题的6-7题比例相当高。考察的重点集中在TCP三次握手和四次挥手、TCP与UDP的区别、HTTP状态码语义、DNS解析流程这几个方向。我记得有一道题问的是TCP四次挥手中主动关闭方进入TIME_WAIT状态需要等待多长时间答案是2MSL最大报文段生存时间。这道题本身不难但有些同学只记住了答案却说不清原因。我当时在备考笔记里专门写过一段为什么要等待2MSL因为要确保被动关闭方能够收到最后的ACK确认报文如果ACK丢失对方会重传FIN报文主动关闭方需要能够响应这次重传同时还要让本连接产生的所有报文在网络中自然消失避免影响后续使用相同端口的新连接。广联达作为建筑软件公司其产品在项目现场往往需要支撑大量的并发数据上传和同步操作网络连接的稳定性和协议层面的正确理解直接关系到产品在弱网环境下的表现。所以这类考点不是随便选的。2.2 操作系统进程调度与内存管理是重头戏操作系统大概有5-6题覆盖了进程状态转换、调度算法、死锁产生的四个必要条件、虚拟内存和页面置换。其中考了一道关于银行家算法的安全序列判断题这类题目在笔试中很常见关键在于熟练掌握安全性检查的流程。页面置换算法那块考了LRU和FIFO在缺页次数上的对比。这里有一个容易踩坑的点在给定额外的物理块数时FIFO可能出现Belady异常分配的物理块增多但缺页次数反而增加而LRU不会。考题就是让你判断某个具体序列下哪种算法表现更好。这种题没有捷径只能多练把Optimal、FIFO、LRU的缺页过程用手算推一遍熟了就好了。2.3 数据库事务特性和索引原理数据库考了3-4题集中在事务的ACID特性、隔离级别和InnoDB索引结构。有一道选择题问的是在RR可重复读隔离级别下如何避免幻读答案是使用间隙锁Gap Lock这是InnoDB在RR级别下的默认手段。这道题有一定区分度很多人知道RR的默认实现但说不清具体是通过什么机制实现的。还有一个考点是联合索引的最左前缀原则。题目给了一个(a, b, c)的联合索引问哪些查询条件可以命中索引。这类题不仅是笔试常客在实际开发中更是天天遇到。广联达的产品涉及大量工程数据查询多条件组合筛选是家常便饭索引设计直接关系到查询性能笔试考这些算是非常务实了。2.4 编程语言基础C与Java的机制对比广联达的研发栈以C和Java为主笔试选择了让候选人根据自己的主语言作答我记得当时的系统里是可以选择的。C方向考了虚函数表、智能指针的引用计数机制、const关键字在不同位置的语义Java方向则考了JVM内存区域划分、垃圾回收算法中的可达性分析、HashMap在JDK 7和JDK 8中的实现差异。这里有一个很典型的题目在C中为什么析构函数通常应该声明为虚函数答案很简单——通过基类指针删除派生类对象时如果析构函数不是虚函数就不会触发动态绑定派生类的析构逻辑不会被调用造成资源泄漏。这个考点不仅考语法规则更是在考察候选人有没有真正理解多态的底层机制。3. 编程题逐题还原从链表到业务建模每一道都藏着筛选逻辑编程题是整场笔试中区分度最高的部分也是我今天想重点复盘的内容。三道题从易到难每一道都没白给分。3.1 第一题链表反转考的是边界条件题目描述是这样的输入一个单链表的头节点反转该链表并输出反转后链表的头节点。这道题本身非常基础LeetCode上的原题但笔试环境有一个特殊要求不允许使用额外的存储空间必须原地反转。这个限制条件很关键。很多人能写出递归版本但递归在链表较长时会有栈溢出的风险而迭代法用三个指针prev、cur、next轮流翻转就是标准答案了。代码大致是这样的struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(nullptr) {} }; ListNode* reverseList(ListNode* head) { ListNode* prev nullptr; ListNode* cur head; while (cur ! nullptr) { ListNode* next cur-next; cur-next prev; prev cur; cur next; } return prev; }这道题真正的区分点在于边界条件空链表怎么处理只有一个节点怎么处理反转之后原来的头节点的next是否正确置空这些问题我在考场上都仔细检查了一遍因为链表反转的代码不超过十行一旦存在边界漏洞很可能整道题得零分。3.2 第二题字符串中最长无重复字符子串考的是算法优化意识第二题是给定一个字符串找出其中不含有重复字符的最长子串的长度。这道题常见解法是滑动窗口核心是维护一个窗口和一个字符到索引的映射当遇到重复字符时直接将窗口左边界移动到上次出现位置的下一个位置。这题很多人第一反应是暴力枚举所有子串时间复杂度O(n^3)或者O(n^2)笔试虽然能过样例但性能上是不合格的。广联达的评测系统对时间有明确限制我记得是要求1秒以内。n如果到10^5级别暴力解就直接超时了。最优解是滑动窗口时间复杂度O(n)空间复杂度O(min(m, n))其中m是字符集大小。代码如下public int lengthOfLongestSubstring(String s) { MapCharacter, Integer map new HashMap(); int left 0, max 0; for (int right 0; right s.length(); right) { char c s.charAt(right); if (map.containsKey(c)) { left Math.max(left, map.get(c) 1); } map.put(c, right); max Math.max(max, right - left 1); } return max; }这里有一个小细节为什么在更新left的时候要取max而不是直接赋值因为left只能往右移动不能回退。如果直接赋值map.get(c)1有可能会把left拉回到一个已经被处理过的位置导致窗口中出现重复字符。这个细节在面试中经常被追问笔试的时候如果没注意到可能会导致后面的计算结果出错。3.3 第三题工程数据合并从业务场景中抽象算法模型第三题我记得很清楚因为它和广联达的业务场景结合得非常紧密。题目大意是这样的有一组工程算量数据每条数据包含了项目编号、构件类型、工程量数值现在需要将这些数据合并规则是相同项目编号和构件类型的数据合并为一条工程量数值相加不同项目编号或不同构件类型的数据不能合并合并后需要按照项目编号升序、构件类型字典序降序排列输出。这道题本质上是一个分组归并问题字典序降序的排序要求很巧妙因为通常大家习惯升序。更深的考点在于如果没有使用合适的数据结构排序和分组可能会产生不必要的开销。最优解是先用哈希表做分组聚合再对结果进行排序。代码用C写大概是这样的struct DataItem { string projectId; string componentType; double quantity; }; vectorDataItem mergeAndSort(vectorDataItem items) { mappairstring, string, double merged; for (auto item : items) { merged[{item.projectId, item.componentType}] item.quantity; } vectorDataItem result; for (auto entry : merged) { result.push_back({entry.first.first, entry.first.second, entry.second}); } sort(result.begin(), result.end(), [](const DataItem a, const DataItem b) { if (a.projectId ! b.projectId) return a.projectId b.projectId; return a.componentType b.componentType; }); return result; }之所以用map而不是unordered_map是因为map自带按键排序的功能可以减少一次排序操作虽然时间复杂度相同但常数更小。这道题表面上是工程数据合并实际考察的是候选人能否将模糊的业务需求转化为清晰的数据结构和算法逻辑这正是开发工程师在日常工作中最核心的能力。4. 广联达笔试背后的行业逻辑建筑IT企业需要什么样的工程师笔试做完了很多人只关注题目本身但我想多花点篇幅聊聊这张试卷背后透露出的公司选拔逻辑。这层逻辑想明白了备考方向自然就清晰了。4.1 建筑信息化的技术栈特点不是互联网但比互联网更看重严谨性广联达的核心产品是工程造价软件、BIM相关工具和项目管理平台这些产品的用户是设计师、造价工程师、施工管理人员。这类软件的显著特点是数据准确性不容妥协。工程量计算如果差了哪怕一个小数点实际施工时可能就导致大量材料浪费。这种业务特点对工程师提出了三个要求。第一编码必须严谨。内存管理、边界条件、数据一致性这些在互联网产品中可以容忍的小bug在建筑软件中可能酿成事故。笔试中链表反转的边界问题、事务隔离级别的选择题本质上都是在筛选具备严谨思维习惯的候选人。第二算法能力要能落地。建筑软件涉及大量的几何计算、图形渲染、数据聚合分析这些都需要扎实的数据结构和算法功底。笔试第三题把业务场景抽象成算法问题的思路正是日常工作的一种预演。第三需要理解业务语言。同样是开发工程师在互联网公司做推荐系统和在建筑软件公司做算量引擎面对的问题域完全不同。广联达的综合题直接考察了面向对象建模能力给一个业务描述让你设计类结构这其实是在看候选人是否具备理解业务并转化为技术方案的能力。4.2 综合题与主观题设计一个类解决一个场景综合题我记得有两道一道是设计题一道是简答题。设计题大概是给了一个场景一个工程项目中有多个角色项目经理、造价员、施工员、监理不同角色对同一个工程数据的访问权限不同要求设计类图并描述核心逻辑。这种题没有标准答案但有几个要点必须踩到要有用户抽象基类或接口、要有权限管理模块不能把权限判断散落在各个业务方法里、要用到多态不同角色对同一方法的不同实现。我当时的答案是用一个基类User派生出四个子类每个子类重写一个hasPermission方法再由一个PermissionManager统一管理权限判断逻辑。另一道简答题问的是当软件在客户现场出现崩溃时你会如何排查和定位问题这个问题考察的是候选人的问题排查思路没有固定答案。我的思路是先复现现场收集崩溃日志和dump文件然后结合日志定位崩溃模块再通过代码审查和二分法定位具体代码行修复后补充对应的回归测试用例。现在做了这么多年开发回头看这个答案基本覆盖了完整的排查链路但在实际工作中如何快速获取客户现场的日志和数据往往比技术定位本身更棘手。4.3 为什么基础题占比这么高校招的本质是考察可塑性可能有人会问广联达也不是纯互联网公司为什么笔试里全是计算机基础的内容而不多考一些行业相关的知识这里有一个认知需要纠正校招不是招一个能直接上手干活的人除非是实习转正而是招一个具备扎实基础、有潜力通过培养成长为合格工程师的人。行业相关的知识比如BIM标准、工程算量规则这些入职后通过几个月的积累完全可以学会但计算机基础、算法能力、编程思维这些硬功夫短期内很难突击出来。所以如果你正在准备类似公司的校招我的建议很明确把重心放在计算机基础知识的系统性梳理上不要被那些看似高大上的行业术语带偏。计算机网络、操作系统、数据库、数据结构与算法、编程语言把这五块吃透你已经超过大多数候选人了。5. 复盘与备考策略从2018年到现在的经验沉淀最后这一部分我想结合那场笔试以及之后几年参加校招技术面试的经验聊聊实际的备考方法。这些方法不仅适用于广联达对大部分建筑IT企业、传统软件公司同样有效。5.1 选择题备考用思维导图建立知识网络很多人准备计算机基础选择题的时候喜欢抱着教材一章一章读。说实话效率很低而且容易漏掉考点。我的建议是先用思维导图把知识框架搭起来然后针对每个叶子节点去回忆具体知识点凡是回忆不准确的重点标记再专项复习。拿计算机网络举例导图的顶层可以分为应用层、传输层、网络层、链路层其中传输层又可以拆出TCP和UDPTCP继续拆出连接管理、可靠传输、流量控制、拥塞控制。这样一层层往下拆复习的时候就能快速定位自己的薄弱环节。为什么2018年考了TCP的TIME_WAIT今年考的还是TCP的可靠性机制因为底层原理是稳定的知识点就是那些关键在于建立体系化的记忆。选择题还有一个技巧多选题宁可少选不要多选。广联达的多选题是漏选得一半分、错选不得分。有些选项明显是干扰项描述里故意加了一定必须任何这种绝对化词汇看到这些要格外警惕。5.2 编程题备考不要只看题解要手写并跑通编程题备考最容易犯的错误就是只看题解以为看懂了等于会做了。实际上笔试环境下的代码和IDE里写代码是完全不同的体验没有自动补全、没有编译提示、不能反复调试。我在当年备考的时候做了这样一个练习每天挑三道题直接在记事本里手写代码写完后才复制到IDE里跑测试用例。这个习惯帮我养成了对代码细节的高度敏感。比如链表题里p指针有没有判空、循环里有没有更新迭代变量、字符串题里索引的取值范围有没有越界这些问题在手写过程中会暴露得特别彻底。笔试现场还有一个很难受的场景在线评测系统的输入输出模板需要自己写。很多人平时刷题用的都是核心代码模式只需要补全一个函数结果到了笔试现场发现要自己处理输入输出就慌了。这里建议备考时直接用牛客网的笔试模拟系统练习熟悉那套输入输出解析方式。5.3 针对广联达这类公司的额外准备如果你确定目标公司就是广联达或者类似广联达的To B软件公司有几个额外的准备方向可以参考一是要了解产品线。广联达的产品线覆盖了从工程造价、施工管理到BIM设计的全链条笔试题目里的业务场景一定来自这些产品。提前了解这些产品的核心业务逻辑综合题和业务场景题回答起来会从容很多。二是要关注该公司技术博客或开源项目。很多To B软件公司在招人季会发布技术文章或者公开一些面试经验这些信息可以帮助你更精准地把握考点方向。当年我在笔试前看到广联达一篇关于海量工程数据处理的技术分享里面提到了线程池的使用和数据分片策略结果笔试的选择题里真的考了一道线程池参数设置的题。这种信息差有时候就是几分之差。三是准备好问面试官的几个问题。笔试通过后会安排面试面试结束前通常会有反向提问的环节问什么是很有讲究的。技术发展路径、团队当前的核心技术挑战、新员工的培养机制这三个方向是比较安全的。千万别问薪资范围和加班强度留给HR谈就好。5.4 时间分配策略120分钟怎么用最后说说笔试现场的时间分配。我当时是这样安排的前30分钟做选择题遇到拿不准的题目做好标记直接选一个最可能的答案不恋战接下来的70分钟做编程题从第一题开始按顺序做因为难度递增前面的题先拿稳最后20分钟做综合题同时回头检查选择题中标过的题目这套时间分配有一个核心原则先把确定性高的分数拿到手再把剩余时间花在区分度高的题目上。编程题如果卡在第三题超过20分钟果断先写一个暴力解的版本保证有基础分然后如果还有时间再优化。这个策略我后来在多次面试中都用上了效果相当稳定。最后再分享一个个人经验笔试前一天不要刷难题了把基础概念快速过一遍尤其是TCP挥手过程、进程和线程的区别、HashMap的底层结构这些高频考点然后早睡。考试的状态管理也是竞争力的一部分。希望这份复盘对你有用祝笔试顺利。