十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

大数据开发笔试题复盘:从网易云音乐真题看SQL与分布式考点

大数据开发笔试题复盘:从网易云音乐真题看SQL与分布式考点 我到现在还记得自己拿到这套题时的表情。2018年我正打算投大数据开发方向的实习网易云音乐又是我每天睡觉前必开的App看到“网易2018实习生招聘笔试题-大数据开发实习生-云音乐”这个标题时第一反应是终于来了个有业务场景的考题应该比那些泛泛而谈的八股题有意思。结果真把题目铺开一看才发现“熟悉业务”只是入场券真正拉开差距的是你能不能把一个听歌产品里发生的每一件小事翻译成数据管道、统计口径和分布式计算问题。这套题虽然挂在“2018实习生招聘”名下但它的知识点体系和考察思路放到今天依然很能打几乎覆盖了大厂数据岗笔试的经典框架基础编程功底、主流大数据组件原理、SQL统计能力以及基于真实业务场景的建模设计。不管你现在是准备校招、想转行做数据开发还是单纯想看看云音乐这类产品背后到底要处理哪些数据问题这篇文章都值得你花十分钟读完。我会按当年的考察逻辑、核心知识点、实战解法、常见翻车点四个维度拆开讲最后再给你一套可以直接照搬的备战路径。1. 这套笔试题到底在考什么先说个结论网易的笔试题从来不追求“偏难怪”它追求的是“让你在一个具体的业务土壤里把基本功亮出来”。云音乐这个场景选得很有讲究它不是虚构的电商订单表而是一个你在日常生活中高频使用的产品。听歌、收藏、评论、搜索、歌单、会员付费、客户端异常每一条都是数据问题。出题人默认你用过这个App然后看你能不能把“用户行为”变成“可计算的数据资产”。1.1 为什么把考点绑在“云音乐”这个业务上我后来和一位参与过校招命题的朋友聊过他说大厂出笔试题最忌讳“万能场景”。用通用电商题大家都刷过区分度低用内部某个复杂业务候选人又没法共情。云音乐属于“大家都会用但很少有人认真想过它背后的数据链路”的场景。比如你切歌时点了“下一首”这个动作背后要记录用户ID、歌曲ID、播放来源、网络状态、播放时长、是否完整播放这些字段最终会流向实时推荐、榜单统计、版权结算、异常告警等多个下游系统。这个场景还天然自带“热点效应”。你去看云音乐相关的技术讨论常年围绕几种声音格式转换、音频提取、接口参数、客户端异常、Cookie会话。这些词看起来更像“用户吐槽”但站在数据开发的角度每一个都能拆出一类实际问题客户端窗口异常对应的是事件埋点、日志采集和异常监控音频格式转换和处理对应的是非结构化文件的管道处理和元数据管理接口加密和Cookie会话对应的是数据上报的可信链路和用户行为识别。所以这套题表面考的是“你会不会写SQL、会不会用Hadoop”实际上考的是“你有没有能力从一个活生生的产品里抽象出数据开发需求”。这是我后来做笔试复盘时最大的体会也是我想先讲清楚的核心逻辑。1.2 出题人想筛选的三种能力我根据当年能搜集到的口述和面经把这类岗位的考察点归纳成三个层次。第一层是编程与计算机基础。数据结构、Java基础、网络协议、操作系统这些是硬门槛。笔试选择题里大概率会出现HashMap扩容、线程池参数、TCP三次握手、Linux常用命令这类题目看着普通但答错一半基本就没戏了。大厂数据岗不是只要会调工具的人底层基础决定了你能不能处理复杂问题。第二层是分布式计算与大数据组件原理。Hadoop生态里的HDFS、MapReduce、YARN实时计算里的Spark Streaming、Flink消息队列Kafka数据仓库工具Hive这些都是重点。题目不会直接问“Kafka是什么”而会问“分区数怎么定”“消费组怎么管理”“Shuffle过程发生了什么”或者是“一个十亿行的日志文件你怎么在集群上统计UV”。这些题目考察的是你对框架原理的理解程度而不是你背了多少API。第三层是业务场景建模能力。这是云音乐这套题里最亮眼的部分。给一个“用户在一周内播放歌曲的流水表”让你算热歌榜给一个“搜索日志表”让你统计热门搜索词给一个“评论区互动表”让你分析用户活跃度。看起来是SQL题实际是看你能不能把业务指标翻译成明确的统计口径再落地成可执行的查询逻辑。1.3 当年的题型结构与做题节奏根据我复盘的版本试卷大概是这样的分布半小时到四十分钟的选择题覆盖Java、数据结构、网络、大数据基础然后是一两道SQL编程题通常在编辑器里手写再加一道数据管道或算法设计题最后可能有一个开放式的场景设计比如“如果让你设计云音乐的数据仓库分层你会怎么做”。选择题的坑在于时间不够。它会把一些很容易混淆的选项放一起比如Java里ArrayList和LinkedList的插入删除复杂度、HashMap在JDK7和JDK8里的区别、HDFS读写流程中数据副本的放置策略。如果你对底层源码和框架机制没有形成肌肉记忆很容易在两道题之间反复犹豫白白消耗时间。SQL题则是“一看就会一写就错”。难点不在语法而在你对业务统计口径的理解。比如“连续播放7天的用户”很多人的第一版SQL都是错的因为没处理好去重和连续性判断又比如“按歌手统计播放量Top N”如果没想清楚并列情况就会漏数据。设计题最考验临场思路。它不会要求你写出完整代码而是让你画出架构、说明组件选择、讲清楚容错和数据一致性方案。这一类题我在后面会展开讲。2. 核心知识点拆解SQL、数据结构与分布式算法既然要准备这类笔试你绕不开几个核心知识点。我不打算把这些知识全部铺开那样能写成一本书我只挑当年最常考、也是踩坑最多的几个模块给你梳理一套看得见、用得上的理解框架。2.1 SQL窗口函数榜单题的“标准答案”云音乐的业务天然和“排行榜”绑定。热歌榜、新歌榜、歌手榜、飙升榜每一个都是典型的Top N问题。解法上有两条路GROUP BY加ORDER BY LIMIT或者用窗口函数。我建议你现在就开始习惯窗口函数尤其是ROW_NUMBER()、RANK()、DENSE_RANK()三兄弟的区别。很多人在这里翻车就是因为不知道并列情况怎么处理。简单说ROW_NUMBER()不管有没有并列都按1、2、3、4连续编号RANK()有并列时跳过编号比如1、1、3DENSE_RANK()有并列时不跳号比如1、1、2。如果你要的榜单是“前三名且允许并列”用DENSE_RANK()如果你要的是“取前100首且每首都有唯一序号”用ROW_NUMBER()。出题人经常在这里埋坑故意不给明确并列规则问你“最多取3首”你就要意识到得加DENSE_RANK()而不是无脑LIMIT 3。还有个高频考点是“分组Top N”按歌手分组取每个歌手播放量最高的三首歌。这种题必须用窗口函数分组排序SELECT singer_name, song_name, play_cnt, rk FROM ( SELECT s.singer_name, s.song_name, COUNT(l.song_id) AS play_cnt, ROW_NUMBER() OVER(PARTITION BY s.singer_id ORDER BY COUNT(l.song_id) DESC) AS rk FROM play_log l JOIN song_info s ON l.song_id s.song_id WHERE l.dt 2024-01-01 GROUP BY s.singer_id, s.singer_name, s.song_name ) t WHERE rk 3;这道SQL基本是云音乐类业务题的“母题”你把它吃透了很多变形都能应付。2.2 海量数据Top K从堆到MapReduce的思想升级笔试编程题里有一类必考的经典算法海量数据中找Top K。这里有两个层次。第一个层次是单机内存版本。给一个长度为N的数组找最大的K个数。最经典的解法是维护一个大小为K的小顶堆堆顶是最小值遍历数据时比堆顶大就替换并调整堆。时间复杂度是O(N log K)。如果K远小于N这个方案比全局排序高效得多。面试官有时会追问“为什么不直接排序”你要能说出“排序需要O(N log N)而且海量数据根本放不进内存”。第二个层次是分布式版本。如果数据量大到单机扛不住思路就变成“分而治之”把数据按照某种规则分片到多台机器每台机器输出局部的Top K最后归并所有局部结果得到全局Top K。对应到MapReduce就是Map阶段每个分片用堆维护Top KReduce阶段再对K乘分片数条记录排序。这个思路在Spark里也很好实现用rdd.mapPartitions配合局部Top K再collect到Driver端归并。这个考点之所以常出现是因为它考察的是“内存意识”和“分布式思维”。很多科班出身的人写算法题还行一到海量场景就忘了内存上限这恰恰是数据开发岗位最不能犯的错误。2.3 LRU缓存与音乐“最近播放”场景还有一种笔试爱考的数据结构题就是LRU缓存淘汰算法。在云音乐场景里它特别自然用户最近播放、最近搜索的记录就是一组有容量上限、按时间淘汰的数据。面试官可能会让你“手写一个LRU Cache”然后问“为什么用HashMap加双向链表”。标准答案就是HashMap负责O(1)查找双向链表负责O(1)的节点移动和删除。你要能把这两个结构“拼”在一起写出来。用Java的话最稳的做法是直接继承LinkedHashMap并重写removeEldestEntry方法但面试官通常更希望你能手写一个能讲清楚原理的实现。这里我建议你至少能手写一版因为它的变体很多比如“LRU加过期时间”“LFU淘汰策略”都是在考你对数据结构组合的理解。2.4 为什这些基础知识成了大数据岗的“筛子”我知道有人会觉得“我是做数据的为什么要考Java集合、考JVM”。这里说点掏心窝的话大数据开发本质上还是开发只是把开发目标放在分布式环境里。你写Spark作业时mapPartitions要不要复用连接池本质是JVM内存调优你处理千万级用户标签时用HashSet还是BloomFilter本质是数据结构选型你调优Hive SQL时MapJoin和小表大表的关系本质是哈希表的应用。所以准备这套笔试不要把它当成“背八股”而是当成一次“用算法和数据结构解决海量业务问题”的思维训练。你真正具备了这个思维选择题自然会做设计题自然有话讲。3. 藏在业务热词背后的“隐蔽考点”这部分聊聊我复盘时觉得最有意思的地方。表面上看这套笔试不会考“云音乐PC端窗口重叠点不了”这种用户问题也不会直接问“音频怎么转MP3”但如果你把这些业务词当成一道数据题就会发现每一个都藏着出题人会问的知识点。3.1 从“客户端窗口重叠点不了”看事件埋点与异常日志治理这是一个非常典型的客户端体验问题。用户点不了按钮第一反应是产品有Bug但对数据开发来说这个问题的完整闭环需要一套数据链路来支撑客户端埋点、日志上报、服务端清洗、指标聚合、告警通知。笔试里不会让你修这个Bug但会换一种方式考你给你一张客户端日志表字段包括用户ID、错误码、错误信息、发生时间、客户端版本、网络类型让你统计“最近一小时Top 10错误码、按版本维度的错误率”。这就是经典的异常监控报表题。正确做法是先把错误日志按错误码和版本分组用COUNT和DISTINCT user_id算错误率和影响用户数再按严重程度排序。这道题背后还牵扯到一个容易被忽略的点埋点数据的时间字段到底是客户端时间还是服务端接收时间。客户端上报可能因为网络延迟导致时间漂移服务端时间又不一定能反映用户真实操作时刻。我在实际生产中遇到最典型的问题就是“按错误发生时间统计”和“按上报时间统计”结果对不上。所以遇到这种统计题你要主动问或主动声明时间口径这是面试官很看重的数据敏感性。3.2 从“格式转换mp3”“提取音频”看非结构化数据管道云音乐的歌库里有大量音频文件日常会涉及转码、封面图处理、歌词解析、音频指纹提取等任务。这一类需求落到大数据开发头上就是非结构化数据的批处理和元数据管理。笔试可能会给一个场景每天有几百万新增音频文件存放在HDFS上需要逐个提取时长、码率、采样率等元数据然后写入Hive表供业务查询。你会怎么设计这个流程答案一定是分布式任务调度配合MapReduce或Spark。你可以把音频元数据提取写成一个MapReduce作业Map阶段读取文件路径列表每个Mapper进程内调用解析工具处理一个文件输出文件路径元数据JSONReduce阶段汇总写入结果表。这里有一个重要的工程细节提取时长、码率这种IO密集任务瓶颈往往在单机并发数所以你要控制Mapper的数量和每个Mapper处理文件的个数而不是简单堆并行度。如果每首音频几MB到几十MB直接在Mapper里读取FileSplit再解析是不划算的更稳妥的方式是先用一个MR或Spark Job扫出所有待处理文件清单再按行分发到Mapper。这类经验笔试未必直接考但设计题里提一句“文件量级、单文件大小、CPU密集还是IO密集”会明显让答案更有层次。3.3 从“接口加密”“Cookie”看数据上报的可信链路用户端上报行为日志通常会用加密签名或会话凭证来保证数据可信。这也常成为笔试设计题的一部分只是出题角度不是“让你破解”而是“让你确保统计结果可信”。这类题我遇到过这样的变体伪造用户ID、恶意刷播放量的情况下你怎么统计出相对真实的播放数据。考察点包括如何通过会话标识识别同一个用户、如何识别同一首歌在短时间内被同一用户反复点击、如何用去重规则过滤异常流量。正常的答题思路是设计一套“播放行为可信度判定”流程先按会话维度聚合再对同用户同歌曲的极端播放次数设置阈值最后在统计层去除异常值。这背后涉及到了数据清洗、反作弊规则和大规模去重你可以提BloomFilter或HyperLogLog做基数估算也能提Flink实时规则引擎都是加分项。Cookie这个话题在数据开发里更多对应的是“用户标识体系”而不是“怎么去偷别人的登录态”。客户端日志中的会话标识在服务端落库后可能会被清洗成统一的user_id再关联到设备号、手机号、会员等级等维度。这道题考的就是你理不理解用户画像数据是从哪些原始字段一步步加工出来的。3.4 为什么业务理解反而成了大厂笔试的隐藏分我见过不少候选人写SQL很熟练讲组件原理也头头是道但遇到“云音乐场景设计题”就一下懵了因为他不清楚这个产品里到底有哪些数据流。出题人恰恰想用这一点筛人。云音乐的数据链路其实不复杂但很典型用户触发行为播放、搜索、评论、收藏→ 客户端埋点 → 接入层 → 消息队列 → 实时/离线计算 → 结果表 → 推荐、榜单、报表等应用。笔试里让你设计的就是这条链路的某一段。你如果能随手画出这条链路并且能说出每个环节的组件选型和容错方案这道题的分数基本就稳了。所以准备阶段别只刷题多花点时间想清楚一个你常用的App它的数据从哪来、到哪去、中间要经历什么这个习惯比多背十个API值钱得多。4. 实战复盘一套可复现的笔试作答思路前面讲的是“考什么”这一节我直接还原几类典型题目给你一套“遇到题怎么想”的实操模板。我不会搬运原卷但会按当年的考察方向给你等价练习题和完整解答思路。4.1 SQL榜单题从建表到答案一次讲透练习题给定一张用户听歌流水表play_log字段有user_id、song_id、play_time时间戳、dt分区字段格式yyyy-MM-dd一张歌曲维表song_info字段有song_id、song_name、singer_name。要求统计最近7天内播放次数Top 10的歌曲输出歌名、歌手名、播放次数。解题第一步是明确统计口径。“最近7天”指的是从今天往前推7天包含今天所以先用DATE_SUB(CURRENT_DATE, 7)拿到起点然后在WHERE条件里过滤dt 起始日期。注意有些题会要求“最近7个自然日”有些会要求“最近7天整”这会影响是否包含当天笔试时如果给了明确日期就按日期算没给就按业务常识默认。第二步是“先聚合再关联最后排序”。最容易出错的是先JOIN再GROUP BY这样虽然也能算但会把关联后的记录数撑大对大数据量来说性能很差。正确的习惯是先按song_id做聚合缩小数据量再JOIN维表补上歌名和歌手名。我写的完整版SELECT b.song_name, b.singer_name, a.play_cnt FROM ( SELECT song_id, COUNT(1) AS play_cnt FROM play_log WHERE dt DATE_SUB(2024-01-19, 7) AND dt 2024-01-19 GROUP BY song_id ) a LEFT JOIN song_info b ON a.song_id b.song_id ORDER BY a.play_cnt DESC LIMIT 10;这里有两个细节。一是COUNT(1)和COUNT(user_id)的区别如果一行代表一次点击或一次播放业务上所有行都应该计入播放量用COUNT(1)即可如果一行代表“用户点击详情页但不一定播完”那统计播放量就应该对play_time字段做非空判断。二是LIMIT 10和并列关系这就是前面说过的窗口函数时机。如果题目明确“最多10首允许并列”你需要把外层改成DENSE_RANK()排序后取rk 10。写SQL时还有一个很加分的习惯先说明你的统计口径再用代码实现。因为阅卷人不仅看答案对不对还看你能不能把业务理解表达清楚。哪怕代码有小瑕疵口径清晰也能挽回不少分。4.2 数据管道设计题从设备到报表的完整链路另一类常考题型是“画链路”。题目风格通常是云音乐每天产生数十亿条用户行为日志需要实时统计热门歌曲、离线生成用户画像请你设计一套数据管道。遇到这种题我建议你按“采集—传输—存储—计算—应用”五段式来答这样不容易漏环节。采集层客户端通过埋点SDK上报JSON格式日志经过负载均衡打到日志接入服务。这里要说明日志格式的统一比如字段名规范、时间戳规范、版本号因为后面所有计算都依赖这些元数据质量。传输层最主流的方案是Kafka。选择Kafka的原因包括高吞吐、可持久化、多消费者订阅适合同时供实时和离线两条链路消费。你可以提一下分区策略如果按song_id做key同一首歌的事件会进同一分区方便局部统计但如果热点歌曲集中在一个分区又会造成分区倾斜所以更常见的做法是按user_id或随机分区统计时再全局聚合。存储层实时场景用Redis或Druid这类OLAP引擎离线场景落HDFS外表映射成Hive表。分层上建议按标准数仓分ODS层存原始日志DWD层做清洗和维表关联DWS层做业务主题汇总ADS层面向报表和推荐。计算层实时计算用Flink或Spark Streaming做窗口聚合比如“每5分钟更新一次热歌榜”离线计算用Hive或Spark批量跑T1指标。两套链路要说明延迟差异和结果一致性我通常会补充一句话“实时链路负责看到当下趋势离线链路负责精准结算和回溯两者互补而不是替代。”这个答案模板可以覆盖九成“设计数据管道”的开放题。你不需要写出非常炫酷的架构只需要让阅卷人觉得你脑子里有一张完整的图知道每个环节放在哪里、为什么放那里。4.3 算法设计题海量日志中统计每首歌的独立用户数算法题里我印象最深的一道等价题目是给定海量播放日志格式是user_id、song_id统计每首歌的独立用户数UV要求内存可控、可分布式执行。这题有三种层次我分别说一下最直白的方案是用分布式计算框架直接做from pyspark.sql import SparkSession spark SparkSession.builder.master(yarn).appName(song_uv).getOrCreate() df spark.read.parquet(hdfs:///data/play_log) uv_df df.groupBy(song_id).agg(countDistinct(user_id).alias(uv)) uv_df.write.mode(overwrite).saveAsTable(dws.song_uv)这种写法正确但在海量数据下性能一般因为countDistinct在Spark底层需要全量去重可能产生严重的Shuffle。面试官听到这里会追问“如果某个歌曲的播放量特别大导致一个Task处理不过来怎么办”。第二种思路是分阶段优化先按song_id和user_id做一次精确去重再按song_id统计数量。这个方案比直接countDistinct好因为第一层去重已经压缩了数据量。实现上可以用uv_df df.select(song_id, user_id).distinct().groupBy(song_id).count()第三种思路是引入近似算法比如HyperLogLog。对UV这种指标业务上允许误差在1%以内用HLL做基数估算能大幅降低内存和计算成本。你可以解释把user_id哈希后写入一个寄存器数组多个分区的HLL结果可以合并最终估算出UV。这个方案在生产中非常实用尤其在实时大屏场景绝大多数报表不需要精确到个位数。答题时我会先讲第一种作为保底方案再主动抛出第二种和第三种优化思路表示“我知道精确和性能的取舍”。这正是阅卷人想看到的层次感。4.4 笔试现场的三条保命技巧第一拿到题先花两三分钟想清楚输入输出不要急着写代码。尤其SQL题先确定统计口径、分组维度、时间条件再落笔。我见过不少人在“最近7天”这个条件上栽跟头写成了“最近7行”。第二代码写完后一定要自测边界。SQL看一下分区条件、JOIN类型、NULL情况编程题看一下空数组、单元素数组、超大K这几类用例。笔试不像面试没人追问你你要自己扮演那个挑刺的人。第三如果遇到完全没见过的大数据组件名别慌。大多数笔试考的还是思维和基础你可以先跳过回头再看。大题宁可写出思路伪代码也不要留白。阅卷人看到你有清晰的思路哪怕实现有小问题分数也不会低。5. 备战避坑指南把我踩过的坑一次说清楚这部分我整理成速查表加心得你可以直接用来自查。这些都是我在准备类似岗位笔试和面试时真实踩过的、或帮别人复盘时反复见到的坑。5.1 高频翻车点速查表问题类型常见错误正确做法SQL时间范围用BETWEEN包含边界导致多算一天明确“最近7天”的起止口径用和SQL窗口函数并列场景直接LIMIT丢了并列数据并列场景用RANK()或DENSE_RANK()MapReduce/Kafka只背API说不清Shuffle和分区策略能画出数据流向图说明每个环节的瓶颈点Java集合认为HashMap插入和查询一定是O(1)需知道哈希冲突、扩容、红黑树退化条件LRU Cache只写LinkedHashMap不会讲原理能手写双向链表HashMap版本数据倾斜从不考虑热点Key所有Key一视同仁能说出加盐、两阶段聚合、广播等思路开放设计题答得太散没有主线按“采集—存储—计算—应用”框架组织这张表覆盖了我在很多份复盘里反复看到的共性问题。你对照自查一下如果有两三条正中眉心那这篇内容就没白看。5.2 备战知识地图三个月够不够如果从现在开始准备假设你每天有2到3小时我建议按下面的顺序推进第一个月主攻基础。Java集合源码、并发工具、JVM内存模型、常见网络问题配上LeetCode或牛客网的简单到中等题目。SQL每天写两道窗口函数、行转列、分组Top N是重点。第二个月进入大数据生态。HDFS读写机制、MapReduce流程、YARN调度、Spark RDD与DataFrame的区别、Kafka分区与消费组、Hive与数仓分层。重点是能把每个组件“为什么要出现、解决什么问题、有什么局限”讲清楚。第三个月做综合题和模拟。经典笔试套题、自己设计一个业务场景比如一个音乐产品的实时榜单、一个视频App的用户留存分析按第4节里那种结构写成文字答案练输出能力。模拟答题时给自己限时手写SQL时不查资料因为真实笔试也是这个状态。这个路线不一定适合所有人但方向是准的先代码能力再组件原理最后业务综合。很多人上来就啃Flink源码结果选择题基础部分翻车这是最不划算的。5.3 面经之外的提醒实习笔试与正式批的区别最后说一个容易被忽略的信息差。我在准备阶段一直以为实习生招聘的笔试会比正式批简单后来对比发现并不是这样。实习生的考察范围有时更广因为应届实习生没有项目经验可问笔试必须多承担一些筛选功能。反而正式批的笔试会更聚焦在岗位必须的能力上有些岗位甚至没有笔试直接简历筛选后进入面试。所以如果你也在准备暑期实习一定要把笔试当“稍难的日常作业”来认真对待它的残酷程度可能超出预期。但好消息是实习笔试不要求你“全会”它更像一个门槛你只要把基础和大数据组件原理抓牢就已经赢过相当一部分临时抱佛脚的人了。我见过有人选择题错一半但SQL和大题答得很好照样拿到了面试机会说明命题人的权重分配倾向于“能干活的能力”而不是“完美的分数”。我个人在实际操作中还有个习惯无论笔试结果如何我都会把每道错题记下来标注“考的是哪个知识模块、我错在哪个环节、正确思路是什么”形成一份自己的错题本。数据开发的笔试范围其实很固定你刷过两三套真的下功夫的题目之后就会摸到规律。云音乐这套题的价值就在于它能让你集中看到大数据岗位在真实业务场景里的样子而不是孤零零地考“什么是HDFS”。最后再分享一个我后来一直用的备战小技巧不要只盯着“找实习”这件事试着把一个你常用的App当成一个数据产品来拆解今天想它的数据怎么采集明天想它的榜单怎么计算后天想它的推荐位怎么生成。这个习惯一旦养成你再看笔试题里的场景设计会觉得它们不是考题而是你每天都在思考的问题。这种心态上的转变比多刷两套题更能帮你在真正的笔试里稳住。
返回列表