一次查找分子级Bug的经历,过程太酸爽了

dN/dS分析全攻略:从分子进化原理到PAML实战与陷阱规避 分子进化研究中,自然选择如何塑造基因序列是核心问题。同义替换与非同义替换的比率(dN/dS)作为量化选择压力的关键指标,能揭示基因在演化中受纯化选择、中性漂变还是正选择影响。理解其统计学原理与密码子比对细节,是正确解读结果的前提。基于codeml等工具的位点模型、分支模型及分支-位点模型,可系统检测正选择位点与谱系特异适应。在实际应用中,序列准备、比对修剪、模型选择及多重检验校正决定分析可靠性。从比较基因组学到病原体适应性进化,dN/dS分析已成为筛选候选基因和功能位点的常用手段。掌握这套方法论,能帮助研究 阅读详情

“Debugging is like trying to find a needle in a haystack, except the needle is also made of hay.” Debug调试就像是在大片的干草堆中找针一样,只不过针也是由干草制成的。

在软件开发的世界里,偶尔会出现一些非常隐蔽的 Bug,这时候工程师们像探险家一样,需要深入代码的丛林,寻找隐藏在其中的“幽灵宝藏”。前段时间,我和我的团队也踏上了这样一段刺激、有趣的探险之旅。

最近繁忙的工作告一段落,我总算轻松下来了,想趁这个机会,跟大家分享我们的这次“旅途”。

01 引子

我是 ShowMeBug 的 CEO 李亚飞,是一个古老的 Ruby 工程师。由于2019年招聘工程师的噩梦经历,我立志打造一个真实模拟工作场景的 IDE,用来终结八股文、算法横行的技术招聘时代。

这个云上的 IDE 引擎,我称之为轻协同 IDE 引擎——因为它不是为了繁杂重度的工作场景准备的,而是适应于大部分人的习惯、能快速上手熟悉、加载速度快、能协同(面试用)、低延迟感,让用户感受非常友好。

在这里插入图片描述
多环境启动与切换

为了达成秒级启动环境的性能要求,我们设计了一套精巧的分布式文件系统架构,其核心是一个可以瞬间复制大量小文件的写时复制(COW)技术。IO吞吐能达到几万人同时在线,性能绝对是它的一大优势。

我们对此信心满满,然而没想到,很快就翻车了。

02 探险启程

2023年1月,北方已经白雪皑皑,而深圳却仍难以感受到冬天的寒意。

我和我的团队在几次打开文件树的某个文件时,会显得有点慢——当时没有人在意,按照常规思路,“网速”背了这个锅。事后我们复盘才发现,这个看似微不足道的小问题,其实正是我们开始这次探险之旅的起点。

1月底,南方的寒意缓缓侵入。这时候我们的轻协同 IDE 引擎已经开始陆续支持了 Vue2、Vue3、React、Django、Rails 等框架环境,一开始表现都很棒,加载和启动速度都很快。但是,跑了一段时间,我们开始察觉,线上环境就出现个别环境( Rails 环境)启动要 20-30s 才能完成。

虽然其他环境仍然保持了极快的加载和启动速度,但敏锐的第六感告诉我,不行,这一定有什么猫腻,如果不立即行动,势必会对用户体验带来很不好的影响。于是,我开始安排团队排查眼前这个不起眼的问题,我们的探险之旅正式开始。

03 初露希望

湿冷的冬季,夜已深,我和我们的团队依旧坐在电脑前苦苦探索,瑟瑟发抖。

探险之旅的第一站,就是老大难的问题:定位Bug。目前只有某一个环境启动很慢,其他的环境都表现不错。大家想了很多办法都没有想明白为什么,甚至怀疑这个环境的模板是不是有问题——但把代码放在本地启动,最多就2秒。

哎,太诡异了。我们在这里卡了至少一周时间,不断追踪代码,分析日志文件,尝试各种方案,都没有弄清楚一个正常的程序启动为什么会慢。我们一度陷入了疲惫和焦虑的情绪中。

“Debug 是种信仰,只有坚信自己能找到 Bug,才有可能找到 Bug。”

软件开发界一直有一个低级Bug定律:所有诡异的问题都来自一个低级原因。在这“山重水复疑无路”之际,我们决定重新审视我们的探险路径:为什么只有 Rails 更慢,其他并不慢?会不会只是一个非常微小的原因而导致?

这时候,恰好有一个架构师朋友来访,向我们建议,可以用 perf 火焰图分析看看Rails的启动过程。

在这里插入图片描述
perf火焰图实例

当我们用 perf来分析时,惊讶地发现:原来 Rails 的启动要加载更多的文件!紧接着,我们又重新用了一个文件读写监控的工具:fatrace,通过它,我们看到 Rails 每次启动需要读写至少 5000 个文件,但其他框架并不需要。

这才让我们突然意识到,会不会是文件系统读写速度不及预期,导致了启动变慢。

04 Bug现身

为了搞清楚是不是文件系统读写速度的问题,我们急需一个测试IO抖动的脚本。团队初步估算一下,写好这个脚本需要一些时间。

这时候,夜已深了,研发同学已经陆续下班了。我猛然想到,不是还有ChatGPT吗?让它帮忙写一个试试。

在这里插入图片描述

测试 IO 抖动的脚本

Cool,几乎不需要改动就能用,把代码扔在服务器开跑,一测,果然发现问题:每一次文件读写都需要 10-20 ms 才能完成。实际上,一个优秀的磁盘IO读写时延应该在亚毫级,但这里至少慢了50倍。

Bingo,如同“幽灵宝藏”一般的分子级Bug逐渐显现,问题的根因已经确认:过慢的磁盘IO读写引发了一系列操作变慢,进而导致启动时间变得非常慢。

更庆幸的是,它还让我们发现了偶尔打开文件树变慢的根本原因,这也是整个系统并发能力下降的罪魁祸首。

05 迷雾追因

看到这里,大家可能会问,这套分布式文件系统莫非一直这么慢,你们为什么在之前没有发现?

非也,早在项目开始的时候,这里的时延是比较良好的,大家没有特别注意这个 IOPS 性能指标,直到我们后面才留意到,系统运行超过一个月时,IO 读写时延很容易就进入到卡顿的状态,表现就是文件系统所在主机 CPU 忽高忽低,重启就会临时恢复。

此时,探险之旅还没结束。毕竟,这个“幽灵宝藏”周围依旧笼罩着一层迷雾。

我们继续用 fatrace(监控谁在读写哪个IO) 监控线上各个候选人答题目录的 IO 读写情况,好家伙,我们发现了一个意外的情况:几乎每一秒都有一次全量的文件 stats 操作(这是一个检测文件是否有属性变化的 IO 操作)!

也就是说,比如有 1000 个候选人正在各自的 IDE 中编码,每个候选人平均有 300 个文件,就会出现每秒 30 万的 IO 操作数!

我们赶紧去查资料,根据研究数据显示,一个普通的 SSD 盘的 IOPS 最高也就到 2-3 万 。于是,我们重新测试了自己分布式文件系统的 IOPS 能力,结果发现也是 2-3 万 。

那这肯定远远达不到我们理想中的能力级别。

这时,问题更加明确:某种未知的原因导致了大量的 IOPS 的需求,引发了 IO 读写时延变长,慢了大约几十倍。

06 接近尾声

我和我的团队继续深究下去,问题已经变得非常明确了:

原来,早在去年 12月,我们上线一个监听文件增删的变化来通知各端刷新的功能。

最开始我们采用事件监听(fswatch event),因为跨了主机,所以存在1-2s的延迟。研发同学将其改为轮询实现的方案,进而引发了每秒扫描目录的 stats 行为。

当在百人以下访问时,IOPS 没有破万,还足够应对。但一旦访问量上千,便会引发 IO 变慢,进而导致系统出现各种异常:间歇导致某些关键接口 QPS 变低,进而引发系统抖动。

随着“幽灵宝藏”显露真身,这次分子级Bug的探险之旅也已经接近尾声。团队大呼:这过程实在太酸爽了!

07 技术无止境

每一个程序员在成长路上,都需要与Bug作充足的对抗,要么你勇于探索,深入代码的丛林,快速定位,挖到越来越丰富的“宝藏”,然后尽情汲取到顶级的知识,最终成为高手;或者被它打趴下, 花费大量时间都找不到问题的根源,成为芸芸众生中的一人。

当然,程序员的世界中,不单单是Debug。

当我毕业5年之后,开始意识到技术的真正价值是解决真正的社会问题。前文中我提到:我发现技术招聘真是一个极其痛苦的事:特别花面试官的时间,却又无法有效分析出候选人的技术能力,所以我创立了ShowMeBug ,用模拟实战的编程环境,解决科学评估人才的难题。

这个轻协同 IDE 技术从零开发,支持协同文件树、完全自定义的文件编辑器、协同的控制台(Console)与终端(Shell),甚至直接支持 Ctrl+P 的文件树搜索,不仅易于使用,又强大有力。

但是这还不够。要知道,追求技术精进是我们技术人的毕生追求。技术越厉害,意味着我们的参数性能越好。对于这个轻协同IDE,我们追求三个零:零配置、零启动、零延迟。其中,零启动就是本文所追求的极限:以最快的速度启动环境和切换环境。

因此,探险之旅结束后,我们进一步改进了此文件系统,设定 raid 的多磁盘冗余,采用高性能SSD,同时重新制定了新磁盘架构参数,优化相关代码,最终大幅提升了分布式文件系统的稳定性与并发能力。

截止本文结尾,ShowMeBug启动环境的平均速度为 1.3 秒,切换环境速度进入到亚秒级,仅需要 780ms。目前在全球范围的技术能力评估赛道(TSA)中,具备1-2年的领先性。

08 后记

正当我打算结束本文时,我们内部的产品吐槽群信息闪烁,点开一看:嚯,我们又发现了新Bug。

立夏已至,我们的探险之旅又即将开始。

作者:李亚飞

找寻难以捉摸的程序错误:一段令人兴奋的编程学习之旅 通过仔细回顾代码、添加调试输出语句和使用调试器,我们可以逐步缩小问题的范围,并最终找到并修复难以捉摸的Bug。在这个过程中,我学到了许多关于调试和排查Bug的技巧,这些技巧对于我的编程学习之旅非常有价值。通过经历这样的挑战,我们可以更好地理解程序的工作原理,并学会在遇到困难时保持冷静和专注。所以,不要害怕面对Bug,相反,拥抱它们,并将它们视为成长的机会。在编程的世界里,调试是一项既关键又耗时的任务。在这篇文章中,我将分享一次我经历过的寻找分子级Bug的过程,这是一段令人兴奋且具有挑战性的编程学习之旅。 阅读详情

相关推荐

ScreenInk 0.0.1.exe

ScreenInk 0.0.1.exe

从求职惨败到阿里35w+offer,这位双非硕的经历太励志!

23年双非硕毕业,面试经历50+,毕业半年被裁后,一个月斩获大厂offer,年薪35w+,薪资涨幅1/3。

周哥的offer秘籍 1532

Android14 有线网络静态IP配置:从固件烧录到系统默认设置

本文详细解析了在Android14系统中,如何通过修改系统框架层和设置应用,为设备预设有线网络静态IP地址,实现固件烧录后即具备指定网络配置的功能。文章深入探讨了从扩展SettingsProvider数据库字段、配置默认值,到在设置应用中读取和应用配置的完整流程,旨在解决工业平板、智能终端等设备在无DHCP网络环境中批量部署的痛点,提升开箱即用体验。

lake5的博客 918

这些神奇 Bug,碰到真是让人目瞪狗呆!

每天早上七点三十,准时推送干货Hello,大家好,今天是五一小长假最后一天,明天就要上班了,回来的小伙伴记得注意安全。不知道这个小长假各位小伙伴玩的是否的开心?最近阿粉的好朋友**@沉默...

Java极客技术 920

《Cesium 基础知识点》- 申请 Cesium Ion 密钥

一、访问 https://cesium.com/ion/signin/tokens 二、登录/注册 三、申请 四、使用 // 密钥 let defaultAccessToken = 'your token string'; // 设置 Cesium.Ion.defaultAccessToken = defaultAccessToken; // 初始化 let viewer = new Cesium.Viewer('cesiumContainer', {}); ...

前端技术 2570

命令行驱动视频剪辑:cutcli与AI自动化工作流实战

在视频内容创作领域,自动化与批量化处理是提升生产效率的关键。传统图形界面工具在应对重复性任务时往往效率低下,而通过命令行接口(CLI)驱动视频生成,则能实现流程的程序化控制。其技术原理在于将视频结构抽象为可编程的指令序列,通过解析命令生成标准化的工程文件。这种模式的核心价值在于将视频制作从手动操作转变为代码驱动,特别适合与AI编程助手集成,实现自然语言到视频草稿的自动转换。应用场景广泛覆盖社交媒体内容批量生产、教育视频自动化生成、数据可视化视频组装等领域。本文以cutcli工具为例,深入解析如何通过命令行与

weixin_42520239的博客 569

hyperframes:让分子模拟轨迹变成高效数组,直通深度学习

分子动力学模拟产生的轨迹文件格式繁杂,如.xtc、.dcd、.nc,而传统处理工具在频繁切片和与深度学习框架对接时显得笨重。本质上,轨迹数据可以抽象为(n_frames, n_atoms, 3)的三维数组,坐标是主体,拓扑信息是元数据,帧级物理量是标签。hyperframes库正是基于这一思想,重新组织数据内存布局,提供统一的数组切片接口,并支持NumPy、PyTorch等数组后台,让数据无需反复拷贝即可直接送入神经网络。无论是计算化学研究中的轨迹分析、数据集构建,还是机器学习分子性质预测,hyperfra

weixin_31458015的博客 259

一文搞懂雷达脉冲压缩和匹配滤波器

为了解决传统单频脉冲雷达面临的作用距离和空间分辨力之间的矛盾,脉冲压缩理论被提出。在接收端设计一个和发射信号能够“共轭匹配”的网络来实现脉冲压缩。接收到的回波信号通过匹配滤波器时,滤波器的增益在信号越强的频率点越大;在信号越弱的频率点,增益越小,通过这样的方式使信号在时域更加集中。脉冲压缩技术大致可分为线性调频(LFM)和相位编码。其中LFM信号易于通过硬件或各种技术产生,但是进行匹配滤波后主旁瓣比高达13.2dB,在检测多个目标时,强目标的回波旁瓣可能会把弱小信号覆盖,导致弱小信号的检测受到影响。

FPGA入门到跑路 9933

别再被PyTorch/TensorFlow的梯度搞晕了!5分钟搞懂矩阵求导的‘分子布局’与‘分母布局’

本文深入解析了PyTorch和TensorFlow中矩阵求导的‘分子布局’与‘分母布局’差异,帮助开发者解决梯度形状不匹配的常见问题。通过实战案例和框架对比,详细介绍了布局混淆的根源、调试方法及优化技巧,提升深度学习模型开发效率。

weixin_30897079的博客 454

Workbench-nCode下发动机引擎应力疲劳分析

在工程数据库中定义材料模型参数,结构场分析基本参数:密度7850Kg/m3、弹性模量210E9Pa、泊松比0.3,疲劳分析参数:应力-疲劳曲线表(S-N Curve),应力-疲劳曲线如下图2所示,如果没有合适的数据可使用结构钢材料进行分析。网格为四面体高阶单元,各零件的单元尺寸如下表1所示,单元质量分布如下图3所示。在workbench平台下搭建分析流程如下图6所示,前述设定完成后,提交求解后即可得到相应的应力、应变结果,更新结果后目录树中会有相应的nCode DesignLife插件,如下图7所示。

ansysxuexizhe的博客 1547

【部署优化篇三】《DeepSeek边缘计算实战:把目标检测模型塞进树莓派,让AI在巴掌大的设备上“开天眼“》

谁说只有超级计算机才能跑AI?今天咱们就要在树莓派上玩转DeepSeek目标检测,让这个巴掌大的小盒子变成会‘看’世界的智能终端!本文手把手教你从零开始,把最潮的目标检测模型塞进树莓派。全程高能预警,建议准备好你的树莓派4B/5和散热风扇,咱们这就开启边缘计算的魔法之旅!

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1305

PHP网络API的弊端:我的个人经历

随着项目的不断发展,API的功能也在不断增加。我曾经遇到过这样的情况:为了修复一个bug,我需要深入到代码的底层去查找问题所在,而这个过程耗费了我大量的时间和精力。因此,在使用PHP开发API时,我们必须认真考虑这些问题,并采取相应的措施来降低它们的影响。刚开始,一切都还算顺畅,但随着用户量的增加和请求量的上升,API的性能问题逐渐凸显出来。这让我深刻感受到,虽然PHP简单易用,但在处理高并发场景时,它的性能表现确实有待提高。在我的编程生涯中,PHP一直是我信赖的伙伴,它陪我走过了许多个日日夜夜。

2401_86114092的博客 367

Python爬虫实战:如何抓取旅游论坛上的帖子、旅行攻略和评论内容

无论是知名的旅游网站,还是地方性的旅游讨论区,用户发布的旅行贴文、攻略和评论往往包含着大量的宝贵信息。本文将详细介绍如何使用Python编写一个爬虫,抓取旅游论坛上的帖子、旅行攻略和评论内容,涵盖从获取页面内容、解析数据到处理动态加载等各个方面的技术。从基本的请求和网页解析,到动态加载页面的处理,再到数据存储和反爬虫技巧,我们详细讲解了抓取旅游论坛数据的全过程。通过本文的介绍,你可以将所学的爬虫技术应用到其他类似的网站抓取任务中,为后续的数据分析、机器学习等任务提供丰富的数据源。在这种情况下,传统的。

2201_76125261的博客 1557

决战成都之颠--我昨天(2004-12-26)应聘IBM的经历

  不好意思,题目夸张了一点,其实我做人还是比较低调的,我只是想说说我去IBM面试的经历而已。  在12月的某一天,一个妹妹(姐姐)加我QQ,自称是上海一家猎头公司滴。她说看过我的个人资料,问我是否愿意去深圳IBM工作,我说我忙,她就给我发了一份她们公司推荐给我的position。我看了看,有点恐怖:Responsibility:   a.. To report to the Ap

Sometimes Java 4004

MATLAB之把多个小cell拼成一个数组

问题描述 现有一个cell向量 L (90000,1),每个元素都是由一个(100X9)的double数组组成的.如图. 其中, 每个cell元素都是一个单独的数据, 我们要把它转换成(90000, 19, 100)的三维数组. cell2mat, 但是所有的数据会堆叠起来 L2=cell2mat(L); % (90000, 19) reshape, 变成三维数组 reshape的原理是从上到下, 从左往右拆开重组. 目前只有19这一维数据与要求一致, 那就以这个为突破口. L2=L2'; %

落日之城 9248

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

1034. 有理数四则运算(20)||1088. Rational Arithmetic (20)

一开始写了400多行代码 提交 提示代码长度超限···无限蛋疼···重新构思逻辑 又一处bug 最后一测试点未过···对照网上的代码··检查后得知 分子分母相等时的情况未处理··· #include #include #include #include using namespace std; typedef long long Type; Type GCD(Type a,Type b) {

That's all 1442

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SnapGene软件:分子克隆设计利器与合法使用指南

分子克隆是分子生物学研究的核心技术,涉及DNA序列的切割、连接与重组。其核心原理在于利用限制性内切酶和DNA连接酶等工具,对基因片段进行精准操作。这项技术的价值在于能够构建重组DNA分子,用于基因功能研究、蛋白质表达和基因治疗等领域。在实际应用中,科研人员常借助专业软件进行可视化设计和模拟,以提升实验设计的准确性和效率。其中,SnapGene作为一款集成化的分子克隆设计工具,通过图形化界面实现了从序列分析、酶切克隆到流程管理的全流程覆盖。面对软件授权问题,用户应优先考虑官方试用、教育折扣等合法途径,避免使用

cuiji1279的博客 448

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

hadoop 离线api文档_闲鱼上199买来的Hadoop权威指南,感觉我还是太年轻了

迄今为止,Hadoop 的发展已经经历了两代,分别为Hadoop 1.0 和Hadoop 2.0。与《Hadoop 权威指南(第3版)》相比,第4版在重点介绍Hadoop 2.0的基础上,新增了对当前热门的Hadoop 技术(如YARN、Parquet、Flume、Crunch和Spark)的专门讲解,有助于Hadoop开发者更好地理解相关技术的背景、原理及使用。此外,第4版还引入了Ha...

weixin_39636987的博客 97

Tableau bug合集2:计算平均值容易犯的错

本文讲解了Tableau统计平均值的两个式子:avg(分子/分母)和sum(分子)/sum(分母)的区别。如果在计算平均值的时候进行至少两次的聚合,就要注意统计方式是否会出现这两者的统计差异了。总之,计算平均值的时候,尽量使用sum(分子)/sum(分母)。具体看文章……

明而决之 2031

一个杀不死的小强,kill进程无效的原因 记录故障排查过程中kill进程无效的分析过程...

今天在处理一个机器异常负载(1000+)的问题,碰到了一个从未碰到过的情况,遇到了一个异常顽固的分子。我使用了所能想到的所有杀进程的方法,却始终无法干掉这个顽固分子,最后终于在谷歌大神的指引下,干掉了这个令我郁闷至极的顽固分子。1.问题描述:系统:内核 2.6.32.43机器:web A web+NFS B机器负载超高,但是却可以正常登录,响应也很快分析过程:1.通过top查看,发现CPU和内存都...

weixin_34315485的博客 616

晶圆级AI处理器:突破GPU互连瓶颈的物理级算力重构

晶圆级集成(Wafer-Scale Integration)是一种将传统多芯片系统压缩至单片硅基底的先进计算架构,其核心原理在于消除芯片间通信延迟与功耗开销,通过片上网络(NoC)、近存计算和可编程路由等技术实现数据流的物理路径重构。相比GPU集群依赖PCIe/NVLink等外部互连,晶圆级方案在延迟、能效和热-电协同方面具备本质优势,尤其适用于实时推理、边缘智能与高可靠性AI落地场景。当前主流实现如WaferLLM已验证在医疗影像、电网调度和工业预测性维护等任务中达成百倍级延迟下降与80%以上功耗削减,标

weixin_30376509的博客 335

零基础,从制造业转互联网,薪资涨幅12k,真的有哪么难吗

零基础,从制造业转互联网,薪资涨幅12k,真的有哪么难吗

bdfcfff77fa的博客 293

一个杀不死的小强,kill进程无效的原因

原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。否则将追究法律责任。http://liuqunying.blog.51cto.com/3984207/1716678一个杀不死的小强,kill进程无效的原因记录故障排查过程中kill进程无效的分析过程今天在处理一个机器异常负载(1000+)的问题,碰到了一个从未碰到过的情况,遇到了一个异常顽固...

weixin_33862188的博客 120

国内的软件测试这么不受待见吗?

逛知乎时看到某知友吐槽自己的面试经历,大致如下:

. 412

一个生信人的自白:从生物转生信,我的学习与工作经历

人生就像一盒巧克力,你永远不知道下一块会是什么。 ——电影《阿甘正传》 生物信息到底是什么?在学生物的人看来,就是敲代码的,甚至要负责修电脑,而在计算机专业人士看来,还是搞生物的。 关于如何成为一个优秀的人,吴军老师说过,你要跨专业,一个专业做到前50%,另一个专业也做到前50%,那么你就进前25%了。而生信,恰好就是生物学和计算机的交叉学科,假如班上100个学生,你生物进前50名,那么在这50个人中,如果你计算机也能排前50%,那么你就进入前四分之一了。因此,跨界,是在职场上取得优势的捷径。 搞生信..

公众号/简说基因,知乎/简宝玉 1678

<Ph.D. Grind> 读后感- by Liangjun

  这种书若是平时,我大概看不下去的,既然作为了作业,就只能硬着头皮看下去了,其实书名叫grind,我觉得我看书也是个grind的过程。作者由于表明了自己最初的目的就是记述他这六年间的故事,所以内容趋向于繁杂的事情,在看书的开始,就可以大概猜到了他会做什么,结果如何,但是也许和我看的并不够快,并且周围同学剧透了很多内容有关,任何一个新鲜的故事都可以作为一本小说来读,但是这本小说还是趋于平淡了些。 ...

weixin_30655569的博客 103
上一篇: 技术招聘演化论:怎样从纸上答题升级到实战编程?
下一篇: 编程测试被候选人吐槽了?原因可能是这些
ShowMeBug
博客等级 码龄7年 80粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShowMeBug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值