我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

编程题练习卷怎么设计?从核心题型拆解到高效复盘指南

编程题练习卷怎么设计?从核心题型拆解到高效复盘指南 写编程题这件事很多人都走偏了。要么一头扎进题海把同样的题型刷了几十遍出了新题照样懵要么对着所谓的高阶框架猛啃结果连基本的数据结构都写不利索。我做了这么多年开发和面试官越来越确信一件事真正能拉开差距的不是刷了多少题而是你有没有一套成体系的练习卷把知识点、常见坑、思维方法串成一张网。这篇博文没有太多花哨的东西就讲清楚我平时整理编程题练习卷的思路、选题逻辑、核心题型拆解以及怎么把手上的题目真正吃透。不管你是自学入门、准备面试还是想带新人这套方法通用。1. 编程题练习卷到底在练什么1.1 核心目标不是“刷题量”而是建立解决问题的能力刚开始学编程的人最容易陷入的一个误区是把练习卷当成“题库”做完一套对完答案就完事。但一套设计合理的编程题练习卷目标从来不是让你记住某道题的答案而是帮你建立一种可迁移的解题能力。我自己的经验是编程能力的成长可以拆成三层第一层是基础语法和API的熟练度比如你会不会用切片、懂不懂回调、能不能写明白一个递归第二层是常用数据结构和算法的敏感度也就是拿到一个问题能不能判断出它适合用哈希表、堆还是并查集第三层是工程化思维比如边界条件处理、复杂度估算、异常情况兜底、代码可读性。三层缺一不可。练习卷的题目编排也应该按这三层去铺。另外一个容易被忽略的点是练习卷不仅要练“写代码”还要练“读代码”和“改代码”。实际开发里你面对的大部分场景是去理解别人写的烂代码然后把它改对、改好。所以在练习卷里适当加入“给一段有bug的代码找出问题并修复”这类题目反而比单纯地做算法题更贴近真实工作。1.2 适合谁来用这套方法因为这篇内容里既讲了练习卷怎么设计也拆了不少具体的题目方向所以适用的读者范围很广。如果你是刚学编程的初学者可以直接按第2章的设计原则去组自己的练习卷从基础语法题开始一步步加难度。如果你正在准备面试重点看第3章里关于数据结构、异步、网络编程这些经典考点的拆解注意我标注的易错点。如果你是需要带新人的技术组长或老师可以把这套选题思路当作出题的底层模板快速拼出一套针对性的考核题目。说实话我自己带人时最头疼的不是对方不会做难题而是基础概念一团浆糊。一套经过设计的练习卷能在很短时间内把一个人的真实水平暴露得明明白白。所以它不仅是训练工具也是一面很好的“镜子”。2. 一套好练习卷的设计原则与选题思路2.1 知识点覆盖从“点状”变“网状”设计练习卷的第一步是明确要覆盖哪些知识点。很多人出题是想到什么出什么结果要么集中在一两个熟悉的方向要么把难度拉得忽高忽低。我更推荐用网状结构去规划。拿一份面向全栈或后端方向的练习卷举例我一般会圈出这么几块编程语言基础变量、流程控制、函数、类、常用数据结构数组、链表、栈、队列、哈希表、树、图、算法思维枚举、递归、分治、贪心、动态规划、回溯、操作系统与并发进程线程、锁、异步、网络编程TCP/IP、HTTP、Socket、数据库SQL语法、索引、事务以及少量的工程实践代码规范、测试用例、调试技巧。定好范围之后再给每个模块分配题目数量。这里有一个实操技巧基础模块别超过总题量的40%算法模块控制在30%左右剩下30%给并发、网络、工程实践等。原因很简单——基础题太多会让学生产生“我已经很厉害了”的错觉但一到写并发或网络就露馅基础题太少又会让初学者直接劝退找不到成就感。只有这个配比既能照顾不同水平的人又能把真正的薄弱点暴露出来。2.2 难度梯度走楼梯不要跳悬崖题目难度编排是练习卷设计里最有技术含量的一环。我见过最糟糕的出题方式是这样的前三道题还是“输出Hello World”第四道突然甩出一道动态规划第五道又变成手写个线程池。这种悬崖式的跳跃除了让人心态崩溃没有任何训练价值。正确的做法是走楼梯式爬坡。每一块知识点内部按“记忆→理解→应用→分析→创造”的层次出题。比如关于链表这个知识点我会依次出三道题第一题要求实现链表的插入和删除这是记忆和理解层第二题给一个链表判断是否有环这需要应用快慢指针第三题要求对链表进行归并排序复杂度控制在O(n log n)这就到分析和创造了。还有一个细节完整练习卷的总难度应该保证大约六成题目是“多数人跳一跳能做出”的两成是“一眼就会”的送分题剩下两成是“只有少数人能做对”的压轴题。这样的设置能最大化训练效果不会让人太挫败也不会让人觉得毫无挑战。2.3 题型配比代码题、概念题、改错题一个都不能少很多人的练习卷清一色全是代码实现题这其实是另一个极端。实际工作根本不需要你从零开始写一棵平衡二叉树更多时候是在既有代码里修一个并发bug或者看懂一段没人维护的祖传代码。所以合适的题型配比大概是这样核心代码实现题占50%概念简答题占20%代码改错/调试题占20%设计思考题例如“如果让你设计一个短链接服务你会怎么做”占10%。概念简答题绝对不能省。比如“解释一下进程和线程的区别”“什么是死锁怎么避免”这类看似简单的问题能非常有效地检验一个人是真正理解原理还是只会调用API。我面试时经常遇到候选人能把线程池的参数背得滚瓜烂熟但一问到“如果你的任务里有阻塞操作线程池会怎样”立刻就答不上来。这就是概念理解不到位练习卷里就应该有大量这种打破砂锅问到底的题目。3. 核心题型拆解与实操要点3.1 基础语法题看似简单坑最多基础语法题是最容易被轻视的但恰恰是这里最能看出一个人的代码素养。我出基础题时特别喜欢在“边界条件”和“语言特性”上做文章。举一个很经典的例子用Python写一个函数求一个整数列表里所有数字的和。很多人三秒钟就写完了def sum_list(nums): return sum(nums)看起来没问题对吧但你想想如果列表里有字符串类型的数字呢如果列表超大呢如果传进来的是None呢真正的工程环境里这些情况全都有可能发生。所以我在练习卷里会把题目改成“实现一个函数safe_sum它可以处理包含整数、浮点数、纯数字字符串的嵌套列表并忽略其他类型如果遇到无法处理的输入返回一个自定义异常。”这样一来题目就从“考察sum函数”变成了“考察类型判断、递归、异常处理、防御性编程”综合度完全不一样。这种题做多了写出来的代码才像工程代码而不像作业代码。再比如C方向我特别爱出关于“引用和指针区别”“const放在不同位置的语义”的题。这些属于看着简单、一动真格就出错的地方。有一次我带的新人写了一个函数返回局部变量的引用编译期没报错运行起来就出现莫名其妙的内存乱码。他在那排查了两个小时最后发现是悬垂引用。这种坑不该靠加班去踩而应该在练习卷里就埋好让人提前养成警惕。3.2 数据结构与算法题核心中的核心数据结构与算法是面试和工程能力的分水岭这部分题目设计得好不好直接决定练习卷的质量上限。我通常会把题目分成两个维度经典套路题和综合应用题。经典套路题指的是那些有固定解法的题目。比如用双指针判断链表是否有环用栈实现队列、用队列实现栈青蛙跳台阶斐波那契变体的动态规划手写快速排序并分析最坏情况求数组中第K大的元素快速选择或堆这些题的价值在于训练“模式识别”。当你见过足够多的套路遇到新题时就能快速匹配“这题的核心是维护一个滑动窗口”“这题可以用前缀和优化”……我认为刷题的核心价值也正在于此。综合应用题则以场景为外壳考验你拆解问题、建模能力。比如经典的“员工薪资表按部门找出薪资前三的员工”——它考的是分组排序SQL里可以用窗口函数编程里可以用哈希表堆。再比如“设计一个支持在平均O(1)时间复杂度下执行插入、删除和随机获取元素的数据结构”——考的是哈希表和数组的结合应用。多说一句算法题最忌讳的就是死记硬背代码。我练习卷的答案部分从来不会只给一段参考代码而是会附上“思路推导过程”和“复杂度分析”。因为这个推导过程才是训练的核心代码只是结果。读者做练习的时候也建议这样要求自己先用自己的话把思路写清楚再动手coding。3.3 异步与并发题现代后端绕不过去的坎现在稍微上点规模的应用都绕不开异步和并发。所以编程题练习卷里如果没有异步相关的题目那么这个练习卷就是不完整的。这种题也是区分“只会调框架”和“真懂原理”的最佳标尺。以Java方向为例我会出这样一组递进题目第一层概念题“CompletableFuture和Future有什么区别为什么CompletableFuture能更好地支持异步回调” 这个问题会逼着你思考 Future 阻塞 get() 的缺点以及 CompletableFuture 如何通过回调、组合、异常处理来弥补。第二层代码题给定一个任务需要同时调用两个远程接口合并结果后再调用第三个接口全程耗时尽量短而且要做异常兜底。有人会写嵌套回调有人会写thenCombine还有人会用allOf。这题的考察点不在语法而在你是否理解任务依赖关系。第三层异常处理题“CompletableFuture中的异常在什么情况下会被吞掉怎么处理才不会让异常无声无息地消失” 这一层我做面试官时必问。很多候选人能写exceptionally和handle但问“如果你在回调链中间发生了异常链路后面的回调还会不会执行”就答不上来了。后者才真正考验理解深度。Python方向的读者也别觉得与自己无关。Python的asyncio同样充满陷阱比如“协程里不要放阻塞调用”“不要在asyncio里使用传统的threading.Lock应该用asyncio.Lock”“task被垃圾回收的坑”。这些点我全都出过题每道都能精准踩中一批人。说白了异步这种题考的不是记住几个API而是你对“回调地狱怎么拆”“并发依赖怎么做”“异常链路怎么兜底”这些通用问题有没有系统性的理解。3.4 Socket与网络编程题把看不见的协议变得可见网络编程题看起来“冷门”但它是很多后端系统的基石。你写的每一行HTTP调用底层都是Socket在跑。练习卷里加一两道Socket编程题能有效检验对网络原理的理解。我常用的一个题目设计是这样的要求用Python或Java实现一个最简单的TCP回声服务器支持多个客户端同时连接。评分标准不是“能跑就行”而是考察几个关键点是否正确处理了粘包和半包问题是否为每个连接创建了独立的线程/协程断开连接时能否正确清理资源压力测试时连接数上来之后有没有异常。这已经是一个非常轻量的并发服务器原型题了做一遍能学到的东西比背十章书都多。进阶版本可以加上“如何设计一个应用层协议”比如定义一个简单的长度头JSON body的格式。做这题的意义在于能换位理解HTTP/2、gRPC这些成熟协议的设计逻辑同时也能在实际工作中如果你要对接私有协议不至于完全抓瞎。我自己的经验是Socket题做完之后一定要配合抓包工具再看一遍过程。打开Wireshark观察三次握手、四次挥手的数据包看到那个SYN、ACK真实出现在屏幕上的时候很多抽象的概念突然就通了。练习卷如果只有代码没有验证环节总觉得少了最后一环。3.5 综合应用与设计题从“写代码”到“做系统”练习卷的最后我一般会放一两道综合题。这类题没有标准答案考察的是思想的完整性。比如“设计一个简单的短链接服务”看起来是个典型的八股项目但实际推演过程非常有价值。你需要考虑生成的短码怎么设计才能保证短且不重复或用一些概率方法要不要提前做过期淘汰用数据库存映射关系时如何应对读多写少的场景高并发下需不需要缓存如果缓存挂了怎么办跳转用301还是302这对统计有什么影响一整套问题下来基础是否扎实、工程视野是否宽阔全都看得清清楚楚。综合题对练习者来说最大的价值不是让你背答案而是培养你“分而治之”的思维习惯。我们在做一个复杂系统时最怕的就是一上来就闷头写。正确做法是先画模块、定边界、选存储、估链路然后再进入细节。练习卷里的综合题就是训练这种全局思维的最小沙盘。4. 从做题到复盘练习卷的正确打开方式4.1 做题节奏与时间控制很多人拿到练习卷就开始闷头做中间卡住也不停一道题想两个小时——这其实是很低效的。做编程题跟考试一样需要严格的节奏感。我建议把一套练习卷按3:1的时间比来分配做题时间和复盘时间。比如一套卷子建议总时长4小时那么做题控制在3小时剩下1小时必须留出来复盘。做题时严格给每道题设定时间上限简单题15分钟中等题30分钟困难题45分钟。如果超时还毫无思路就先放弃最后再回头看。这不是妥协而是在模拟真实工作或面试场景下的决策能力——什么时候该投入、什么时候该止损本身就是一种需要训练的能力。还有一个容易被忽视的点环境要仿真。练习卷不是给你在IDE里自由调试用的玩具它的价值在于模拟“限定条件下的任务交付”。所以建议状态好的时候做关掉消息通知打开免打扰模式尽量一次做完一个完整模块。我见过太多人做题五分钟刷手机半小时最后那道题耗时三小时还没做完。这已经不是能力问题是习惯问题。4.2 复盘方法论不看答案先走查代码写完了对完“标准答案”就结束那是把练习卷当成了填空题。真正有价值的环节是复盘。复盘第一步是逼着自己不看答案先把代码从头到尾走查一遍。假装自己是台下另一个程序员逐行检查变量命名、边界条件、异常分支、资源释放。这一步能帮你发现自己写代码时的思维盲区比如忘记判空了、循环条件写成了还是、缓存要不要考虑并发安全。第二步对照参考答案不只看代码要看思路。我的对照方式是把参考答案的解题思路写成一个“解题小卡片”包括它用什么数据结构、为什么能优化时间复杂度、代码里哪几行是全题精髓。然后问自己我为什么会没想到这一步是知识点缺失还是确实没往这个方向思考这两个原因对应的补强策略完全不同。第三步隔一周再做一遍。把答案遮掉重新实现同一道题看看第一遍犯的错误有没有重现。如果重现了说明这个知识点你还没真正内化需要针对性加强。这个“间隔重复”的方法比连续刷十道同类型的题更能巩固记忆。4.3 错题本与“一题多解”的放大效应错题本不是学生的专利程序员同样需要。但我不建议原样抄题、抄代码那种错题本做完就积灰了。我的习惯是每道错题记录四样东西——错误原因语法错误/思路偏差/边界遗漏/概念混淆、正确思路的一句话概括、关键代码片段最多十行、以及我自己的解法与标准答案的差异点。做完错题记录还差一步才算完整那就是找到这道题的其他解法。同一个问题用暴力法、优化法和最优解各做一遍收获远大于做三道不同的题。比如“求最长不重复子串”可以先用滑动窗口做再想一下用哈希表加start指针甚至考虑一下如果字符集有限又有什么不同的优化路径。每一种解法都是一次思维体操。5. 常见问题与避坑清单5.1 刷题过程中的典型问题速查我把这些年看别人刷题、自己也踩过的坑整理成了一张速查表方便大家对照问题表现本质原因解决思路能看懂答案但自己写不出来被动学习太多缺少主动编码输出高强度输出式练习先盖住答案自己尝试实在不行再偷看关键一行一写就容易漏边界条件缺乏系统性的边界思考习惯列出输入的极端情况空、单个元素、超大值、负数、重复元素会写单线程一上并发就崩对并发原理理解停留在概念层从共享状态与线程安全入手边写代码边用日志或调试器观察竞态知道很多语法糖但代码可读性差追求炫技而忽略工程规范每道题写完做一轮“重命名和重构”变量命名是否清晰、能否拆函数算法题能过面试项目题不会只刷题没做系统设计积累多做综合设计题学着从场景倒推技术选型做题太慢没有时间观念练习时不设时限习惯性拖延给每道题设置严格倒计时模拟deadline压力这里想特别强调一下第一类问题。我见过很多学习者花了大量时间“看”题解看完觉得自己都会了一到手写就卡壳。这种“眼高手低”的本质是大脑误把“识别”当成了“掌握”。要破这个局没有巧办法就是逼自己先动手哪怕每行代码都是错的写到哪儿卡在哪儿再回头查。实际上手写错误本身也会加深记忆比单纯看答案有用得多。5.2 设计练习卷时的三个原则如果你是自己出题比如给团队新人出考核题我还有三个经验想分享。第一个原则是“宁可题目少一点也不能不梯度化”。一份只有10道题但有明确坡度的练习卷好过一份30道题但难度随机分布的练习卷。因为梯度化能让做题人持续获得反馈和成就感也能让你更精准地定位他卡在哪一层。第二个原则是“每道题都要有明确的考察点”。这是很多出题人最容易犯的错。随手出一道题自己也不知道想考什么最后只能看个“做对/做错”毫无诊断价值。我出题的习惯是题目的后面先在草稿上写一行“本题主要考察xxx”等组卷时再把这行字删掉。别小看这个细节它能逼着你审查题型是否重复难点是否聚焦。第三个原则是“答案必须可验证”。一道编程题如果没有设计合理的测试用例或者没有明确输入的边界范围做了等于白做。题目做完后至少给三组测试用例正常输入、边界输入、非法输入。每次出卷我都会亲自跑一遍所有答案代码确认参考解法真的能过测试再发出去。这不是麻烦这是对做题人基本的尊重。5.3 从“做完”到“能用”把练习卷转化为工程能力做题千万别带着“完成任务交差”的心态做完就翻篇。我反复跟身边的年轻人强调一个观点练习卷只是最小模型它存在的意义是帮你打磨出可以迁移到真实项目中的能力。怎么迁移可以试着给练习卷里的每道题加一个“工程化改造”的想法。比如那个计算列表之和的题做完后想想能不能把它封装成一个带日志、限流、超时控制的服务比如那个TCP回声服务器做完能不能加上断线重连、消息确认、吞吐压制这样每做完一道题其实就相当于完成了一个小项目的局部原型。我自己整理了十几套练习卷之后发现一个挺有意思的现象当我刷的题目里有很多跟实际项目相关的变体时真正做项目时写代码的自信程度完全不一样。不是为了做题而做题而是通过做题建立一种“这类问题我见过、我能拆、我能落地”的底气。这种底气说实话就是靠一张一张练习卷练出来的。6. 实操示例一份入门级练习卷的完整拆解6.1 文档结构和考试范围说明理论讲再多不如直接看一套具体示例。下面这份是我以前给刚入门后端方向的新人准备的基础练习卷框架原卷是内部用的我做了脱敏和简写大家可以把它当模板按自己的方向替换知识点。考试范围Python基础、常用数据结构、面向对象、基础Shell操作、简单并发考试时间120分钟题量10道题每题10分满分100分附加题1道设计题不计入总分作为加分项环境要求本地Python 3.8不允许使用外网搜索这个篇头的意义在于让做题人一开始就知道边界和考核方向避免盲目发挥。我在实际用的时候发现明确的时间限制和“不允许搜索”这个约束本身就是高压训练的一部分能模拟真实环境中的排错能力和算法储备。《附加题的设计也是有意为之。它给学有余力的人提供了一条深度挑战通道同时也让我能一眼看出哪些新人对系统设计的综合能力明显强于同龄人。因为只要计算总分我会额外关注附加题的完成情况尤其是思路清晰度而不是只盯着总分。6.2 题目清单与考察点对照下面是这套练习卷的题目清单每题我都标注了考察点和易错点题号题目摘要主要考察点常见易错点1用代码实现safe_div能处理除零和类型非法异常处理、类型判断忘记考虑负数或浮点数除零的场景2反转一个字符串但不能用内置切片循环遍历、内存操作原地反转时索引越界3判断一个字符串是否为回文串忽略大小写和非字母数字字符双指针、字符处理isalnum误判下划线4统计一篇英文文本里每个单词出现的次数字典操作、字符串切分没有统一大小写标点未清洗5实现一个简单的栈支持push、pop、top、get_min要求get_min是O(1)数据结构设计、辅助栈只用一个栈时无法保持最小值同步6给定两个有序列表合并成一个有序列表归并思想、数组操作比较操作多写了一个等号导致死循环7用Python写一个装饰器打印函数的执行耗时装饰器、函数对象、time模块忘了装饰器需要返回同名函数8TCP套接字实现一个简单Echo客户端Socket通信、基础网络关闭连接后仍然调用recv导致异常9用类实现一个银行账户支持存钱和取钱余额不能为负类设计、状态封装直接在类外部修改私有属性的值10使用asyncio运行两个协程一个打印1-5一个打印6-10要求交替输出协程、事件循环、sleep在协程里错误地使用time.sleep阻塞事件循环题号1到3属于基础语法与边界处理题号4到7是数据结构与语言特性题号8到10开始引入工程和并发要素。这个顺序本身就是一个爬坡的过程每道题的难度都没有突然拔高但整体是一条持续上扬的曲线。做题人做完之后能明显感觉到“前面简单、后面开始烧脑”的线性成长这比难度波澜起伏的卷子更能积累信心。6.3 重点题目的实现要点和思路分析第一题考察的是异常处理。参考实现大致思路是先做类型校验把能转成float的转成float不能转的捕获ValueError并返回一个自定义的InvalidOperandError。难点不在语法而在“你是否有防御性编程的习惯”。很多人在自己电脑上跑没问题一上线就各种数据结构传错导致崩溃根源就在这里。第五题get_min是O(1) 的栈经典解法是使用两个栈主栈存数据辅助栈存“当前前缀的最小值”。每次push时比较新元素和辅助栈栈顶取较小值再压入辅助栈pop时两栈同时pop。这一题的隐藏考点是“栈状态同步”如果忘了同步pop很小的测试用例就能让get_min出错。第十题协程题是我比较喜欢的一道。初学者很容易写出的“错误答案”是这样的import time import asyncio async def print_1_to_5(): for i in range(1, 6): print(i) time.sleep(0.5) async def print_6_to_10(): for i in range(6, 11): print(i) time.sleep(0.5) asyncio.run(print_1_to_5()) asyncio.run(print_6_to_10())这段代码的输出顺序其实是1到5全部打印完再打印6到10完全不是交替的而且time.sleep会阻塞事件循环。正确的做法是在函数内部使用await asyncio.sleep(0.5)并且把两个协程用asyncio.gather包装起来跑。这题目表面在考协程写法实际考的是“你是否真的理解事件循环的协作调度”。经验不足的人写错的概率相当高而一旦理解了这个点以后写异步爬虫、异步IO服务很多奇怪的时序问题就都能自己解释了。7. 如何自己动手从零组建一套编程题练习卷7.1 确定练习方向与目标做任何练习卷之前第一步永远是问自己一个扎心的问题我这套练习卷到底是为了什么目标服务的目标是“秋招字节客户端测开学习路线”那侧重点就要放在算法、网路、操作系统和Java基础。目标是“半年转行后端开发”那就要把Java/Python基础、Spring框架、MySQL、并发编程、项目经验铺得更全。目标是“学校期末考的模拟卷”那就要对标课堂讲义的知识点覆盖率不能随心所欲地扩展偏题怪题。目标定了之后再把大目标拆成可测量的小项。比如“能顺利答出常见并发编程面试题”里可以拆成“能说出进程线程区别”“能写出一个线程安全的计数器”“能用CompletableFuture编排异步任务”“能解释死锁的四个必要条件”等子项。这些子项就是你练习卷里每个题目的考察锚点。如果题出完发现某个锚点没覆盖说明题目结构还有缺口需要调整。7.2 题目素材收集与改编方法知道了要覆盖什么接下来就是素材来源的问题。直接背LeetCode题号搬运是不可取的因为题目版权和考察角度未必完全适合你的场景。我平时收集素材有四个渠道生产环境踩过的坑把它们伪装成题目、面试中被问倒的问题把问题转化成练习卷题目、同行交流群里的典型争论、经典书籍的课后习题改编。素材的改编方法是关键。改动可以从三个方向入手改数据规模比如把数据量从1000改成1亿考察点就从普通算法变成了大规模处理、改业务背景把“数组求和”改成“统计用户每天访问次数Top10”以及改限制条件加一个“只能用O(1)额外空间”的条件题目的难度立刻上一个台阶。这些改编技巧能让你从有限的素材里衍生出无限的题目形态。7.3 测试与迭代这是我见过大多数人省略的一步。自认为出完一套卷子就算完事自己都不做一遍。其实出卷者和做题人的视角完全不一样你不亲自完整做一遍根本不知道题目描述是否有歧义、时间控制是否合理、辅助函数是否友好。我的习惯是练习卷初稿完成之后先用冷眼读一遍题干圈出所有可能引起歧义的词。然后亲手把每道题做一遍记录耗时。如果我自己做一道20分的算法题超过了40分钟那就要考虑是题目描述不清还是预期难度过高。最后如果条件允许找一个小白同事试做一遍观察他在哪道题上卡住卡住的原因是什么。小白试做是最有价值的一步因为出题人最容易出现的“知识诅咒”只有让一个经验更浅的人来才能打破。一套练习卷很少能一次成型它的质量是靠一次次小迭代堆出来的。每次用完之后我都会记一道“出卷后记”哪道题区分度很好、哪道题大家都能做对导致没有筛选价值、哪道题描述害得大家理解偏差。这样到了下次复用的时候这套卷子会越用越顺考察效率越来越高。我身边很多愿意花时间做这件事的人最终手里都攒下了几张“好用得可怕”的卷子这比到处转发别人的题目要靠谱得多。8. 最后分享一点做编程练习卷的私人经验我个人是强烈建议把“编程题练习卷”当成一个持续迭代的资产来对待的而不是某段学习阶段的临时用品。我自己的习惯是用本地目录保存每个阶段做的练习卷和错题记录每过半年回头翻一次。翻看的时候不仅能感受到自己的进步也会惊讶地发现有些当时的“难题”如今看起来已经非常自然。这种肉眼可见的成长是坚持练习最直观的正反馈。还有一个好用的小技巧每次练习卷做完之后给自己留一句“今天的我卡在哪里”。一句话就够了不用长篇大论。这样过段时间再翻那些反复卡住的地方往往就是你真正应该深度补课的地方。我自己就是靠这个方法发现当年最怕的是动态规划相关的题目于是连续一个月专门练DP的各种题型等到下一个项目需要做路径规划时发现自己已经能轻松应对了。这种“把卷子变成答案点”的体验真的值得每个人试一试。
返回列表