从码农到工匠:优秀程序员的共同特质和素养

未经审视的人生不值得过。

 

——苏格拉底

 

在我的工作经历中,会发现有一些技术人员成长很快,能够迅速成为团队的骨干,也有一些技术人员总是在原地踏步,工作十年和工作一年的区别并不大。渐渐地,我发现这些优秀的技术人员都有一些共同的特质和素养,从而帮助他们不断进步,脱颖而出。

 

1.不教条

在软件的世界里没有“银弹”,在技术人的众多素养中,“不教条”占有重要的地位。我作过程中看到过太多教条主义的错误,例如,我曾见过一个团队为了做微服务,将本来的一个不大的应用拆分成了几十个应用服务。

教条的主要原因是我们还停留在有样学样的阶段,导致我们忘记了软件的第一性原理是“控制软件复杂度”。但凡能提高代码可读性、可扩展性和可维护性的方法,都是值得考虑的,并不一定要拘泥于某种特定的开发过程或者编程范式。

就像Effective Java一书的作者Joshua Bloch说的,“同大多数学科一样,学习编程艺术首先要学会基本的规则,然后才能知道什么时候去打破规则”。

2.瀑布还是敏捷

选择软件开发过程绝不是要么瀑布(Waterfall),要么敏捷(Agile)这么简单。实际上,软件开发的生命周期风格类似一个连续光谱——有从瀑布式到敏捷,以及它们之间的多种可能性。

以我的工作经验来看,软件开发过程并不是软件工程中最大的障碍,不是你花了大量时间在需求分析和设计上,项目就一定会失败;也不是你每天早上花5分钟讨论“昨天做了什么,遇到什么问题,今天做什么”,项目就一定能成功。

敏捷开发是基于迭代模型发展起来的一套软件开发指导原则。我们在实际操作中应重视指导原则,弱化方法论。

就像Scrum的创始人Jeff Sutherland在其敏捷宣言中说的,“我建立Scrum模型就是为了把敏捷的价值观揉进一套工具集以便于更好地实践,敏捷模型没有方法论。”

敏捷还有一个误区,就是弱化设计。其实我对此事的认知也是有一个过程的,我是敏捷的极力拥护者,非常感激敏捷让我们摆脱了软件能力成熟度集成模型(Capability Maturity Model Integratio,CMMI)的沉重枷锁。凡事过犹不及,实施敏捷就可以“无设计”吗?可以让设计在敏捷中自然涌现吗?实践告诉我们,似乎不能。就像盖房子,在盖之前要打牢地基,如果地基还没完工就匆忙建造房子,那么就很难摆脱糟糕的地基了。类似的系统架构中的基础改动起来会变得困难,从而不得不做出各种妥协和临时方案。

因此,我们需要在大设计和无设计之间找到一种平衡。一个软件从无到有,不管你是瀑布、迭代,还是敏捷,一般都会经历下面的过程。

1)需求:对于系统该做什么,建立并保持与客户和其他涉众的一致意见,定义系统的边界。

2)分析与设计:将需求转化为系统设计,设计将作为在特定实现环境中的规格说明,包括逐渐形成一个健壮的系统架构,建立起系统不同元素必须用到的共同机制。

3)实现:编码、单元测试以及对设计进行集成,得到一个可执行的系统。

4)测试:对实现进行测试,确保它实现了需求,通过具体的展示来验证软件产品是否像预期的那样工作。

5)部署:确保软件产品能被它的最终用户使用。

基于此,我推荐一种综合了瀑布模式、迭代模式和敏捷思想的软件开发过程。在此提倡根据迭代所处阶段的不同,在不同科目上花不同的时间。

3.贫血还是充血

一提到事务脚本(Transaction Script)和DDD,人们就习惯性地给它们扣上贫血[1]和充血的帽子。简单来说,贫血模式提倡模型对象只包含数据,并提供简单的Getter和Setter;而充血模式提倡数据和行为放在一起,是一种更加面向对象的做法。两种模式都有都有自己的道理,也都有人支持。

在我看来,这种争执是没有必要的,因为没有抓住问题的本质。问题的核心不在于行为和数据是否在一起,而在于你能否有效地控制复杂度。如果你有很好的面向对象思维,使用贫血也可以写出好的代码,没有面向对象思维,即使采用DDD,也会陷入复杂性的泥潭。

纠结于贫血还是充血,一方面是因为没有抓住问题的本质,另一方面也源于一种非黑即白的教条思维。就像4.2节中的Rectangle案例所展示的,行为和数据是否放在一起,只是表现形式的差别,并不是用来区分面向对象和面向过程的关键区别。

4.单体还是分布式

在业务发展早期,因为用户少、流量少,功能相对简单。然而,随着业务的发展和用户的增加,单体应用的局限性开始显现。具有水平扩展性(scale out)的分布式系统架构几乎已经变成互联网公司的标配。

虽然面向服务的架构(Service Oriented Architecture,SOA)和微服务有一统天下之势,但是并不代表单体架构就会退出历史舞台,特别是在中台概念提出来以后。中台要求通过集中式的中台管控来提升软件系统的复用,避免趋同的业务重复造轮子的现象。中台的目的就是要通过中台能力来赋能前线业务,提升对前线业务的支撑效率。

5.批判性思维

批判性思维(Critical Thinking)是一种谨慎运用推理去断定一个断言是否为真的能力。它要求我们保持思考的自主性和逻辑的严密性,不被动地全盘接受,也不刻意地带着偏见去驳斥一个观点。批判性思维也是一项能够被习得,并且通过训练和运用来提高的能力。

技术人员虽然有很强的逻辑推理能力,但不见得都有很强的逻辑思维,我也是如此。在知晓批判性思维之前,我曾吃过很多亏,明知道对方在强词夺理,可就是找不到很好的反驳理由。无论是在公司和同事争辩,还是在家里和老婆斗嘴,几乎没有赢过。后来我学习了一些批判性思维的知识,情况才有所改观,可以抓住对方的一些逻辑漏洞和推理谬误进行反驳,这使得我在职场上拿回了不少话语主动权。不过在家里,我依然是输多赢少,后来我才发现,原来家不是一个讲逻辑的地方。

关于训练批判性思维的书有很多,我重点推荐两本,一本是尼尔•布朗写的被誉为批判性思维领域经典读物的《学会提问》,另一本是樊登读书会推荐的《思辨与立场:生活中无处不在的批判性思维工具》。我在读这两本书的时候,经常会有aha moment(顿悟时刻),真的很有收获。

在《学会提问》一书中,有这样一个案例。

小张:“小王真不是个男人,酒吧里那个醉汉威胁说要揍他一顿,他吓得屁滚尿流。”

小李:“他要不是男人,你怎么解释他身上那些鼓鼓的二头肌呢?”

你觉得小李的话有道理吗?如果你觉得有点道理,但又觉得有点不对劲,那么就应该去好好读读这本书。这里小李犯了一个典型的推理谬误——偷换概念谬误(Equivocation Fallacy),小张说的“男人”是指“男子气概”,而小李说的“男人”是指“男人生理”,这两个概念是不一样的,这就是问题所在。

6.成长型思维

成长的过程中不可能是一帆风顺的,肯定会有痛、有阻力、有挫折。面对逆境,我们应该怎么做?有些人也许不堪重负,就此沉沦了,而有些人可以越挫越勇,把每一次失败都当成学习的机会。研究发现,成长型思维(Growth Mindset)和固定型思维(Fixed Mindset)会极大地影响我们面对逆境的处理方式。我在最低迷的时候,正是成长型思维帮我渡过了难关。

斯坦福大学心理学教授卡罗尔•德韦克在经过数十年的研究后,发现了思维模式的力量。她在《终身成长》中提醒我们:我们获得的成功并不是能力和天赋决定的,更多受到我们在追求目标的过程中展现的思维模式的影响。

固定型思维和成长型思维体现了应对成功与失败、成绩与挑战时的两种基本心态。你认为才智和努力哪个更重要、能力能否通过努力改变,决定了你是会满足于既有成果,还是会积极探索新知。通过了解自己的思维模式并做出改变,人们能以最简单的方式培养对学习的热情,以及在任何领域内取得成功都需要的抗压力。

具有成长型思维的人相信自己可以通过学习来提升自我,相信学习和成长的力量,相信努力可以改变智力和能力。

我曾经就是一个典型的固定型思维的人,在遇到困难和挫折时很容易引发自我怀疑和自我否定。在了解了成长型思维之后,我开始逐渐转变思维模式,会用更加理性的态度看待一时的成败得失,内心坚定地相信成长和学习的力量。从某种意义上来说,你正在读的这本书也是我在习得了成长型思维之后,才得以写出来的。

技术人员的工作面临着很大的挑战,我们需要具备成长型思维才能应对工作和生活中的压力,这样在遇到问题时,我们才不会轻言放弃,而是会积极主动地去学习,去寻找解决方案。即使最终还是失败了,我们也不会一蹶不振,而是把失败当作学习的机会。

7.结构化思维
在日常工作中,我们时常会碰到有的人讲一件事情的逻辑非常混乱,前后没有逻辑性关联,甚至无法把一件事情说清楚。思维混乱是缺少结构化思维的典型表现。实际上,我们不仅在表达上要结构化,在分析问题时更要有结构化思维,这样才能分析得更全面、深刻。

什么是结构化思维呢?我给结构化思维的定义就是“逻辑+套路”。

所谓逻辑,是指结构之间必须是有逻辑关系的。例如,你说话时用“第一、第二、第三”这个逻辑顺序是合理的,而如果用“第一、第二、第四”就会显得很奇怪。实际上,组织思想的逻辑只有4种.

1)演绎顺序:比如“大前提、小前提、结论”的演绎推理方式就是演绎顺序的。

2)时间(步骤)顺序:比如“第一、第二、第三”和“首先、再者、然后”等,大多数的时间顺序同时也是因果顺序。

3)空间(结构)顺序:比如“前端、后端、数据”和“波士顿、纽约、华盛顿”等,化整为零(将整体分解为部分)等都是空间顺序。在做空间分解时,要注意满足“相互独立,完全穷尽”(Mutually Exclusive Collectively Exhaustive,MECE)原则。

4)程度(重要性)顺序:比如“最重要、次重要、不重要”等。

只要我们的思想和表达在这4种逻辑顺序之内,就是有逻辑的,否则就是没有逻辑的。

套路是指我们解决问题的方法论、路径和经验。比如,5W2H分析法就是非常好的,是可以帮助我们分析问题的一个“套路”。试想一下,面对任何一个问题,你如果都能从“Why、Who、When、Where、What、How和How much”

逻辑是一种能力,而套路是方法论、经验;逻辑属于道,而方法论属于术。二者都很重要,只有熟练地掌握二者,我们才能有更好的结构化思维。接下来,通过两个案例来介绍结构化思维在实际工作场景中的应用。

8.如何落地新团队

想象这样一个场景,你刚刚入职一家新公司或者转岗到一个新团队,作为一个技术人,你将如何落地开展工作呢?

这里就能用上结构化思维来帮助我们理清思路,从而有条不紊地开展工作。要知道对一个企业来说,核心要素无外乎就是业务、技术和人。我们所要做的就是如何去熟悉业务、熟悉技术、熟悉人,然而每一部分又可以进行进一步的结构化拆解。

熟悉业务

1)了解产品:任何一个团队都有自己要负责的产品,申请一个测试账号去用一下产品,是熟悉产品比较好的方式。

2)了解流程:任何业务都有自己的业务流程,而业务流程中的核心是信息流。我们可以通过人员采访了解关键节点的信息输入和信息输出;通过画一些泳道活动图来理清楚系统的主要角色,以及它们之间的交互关系。

3)客户走访:通过走访客户,我们可以获得业务的第一手资料,更加贴近业务和客户诉求。

熟悉技术

1)了解系统架构:可以让团队的技术人员介绍他们当初做系统设计和架构时的思路。

2)了解领域模型:查看关键的核心表结构和系统API,快速了解系统的领域模型。

3)了解代码结构:下载系统工程,熟悉整个工程结构和模块职责;以一个最重要的流程为入手点,阅读代码,看清楚核心的执行逻辑;做一个小需求,掌握相关的流程和权限。

熟悉人1)了解组织结构:查看公司的组织树,知道公司大概是如何运作的,以及哪些是关键人(Key Person,KP)。比如,一个典型的电商公司会包括产品部、运营部、销售部、技术部、人力资源部、财务部和法务部等。

2)了解人员角色:了解公司都有哪些岗位,以及各岗位的职责范围。

3)勤沟通:找出和自己工作息息相关的岗位,比如产品和运营,积极和这些同事沟通,向他们请教业务问题,多多交流。这样既可以建立良好的人际关系,也可以更快地熟悉业务。

9.如何做晋升述职

我在阿里巴巴已经做了多年的晋升评委,发现很多人都缺乏结构化思维,讲着冗长的PPT,却不能很好地把一件事情说清楚。实际上,做工作汇报或者述职是很容易结构化的。

最清晰和实用的结构化表达是“提出问题,定义问题,分析问题,解决问题,最后展望未来”。如果按照这个逻辑顺序去阐述一件事情,会比不知道这个“套路”的效果好得多。这也是麦肯锡常用的解决问题的框架。

另一个有用的思维框架是“zoom in/zoom out”。我们说事情时,应该像电影镜头一样,先从远拉近,再由近拉远。“zoom in”是先从宏观背景开始,首先让大家知道你的事情发生的背景,为什么这件事情很重要?然后讲到具体细节,怎么做成的?解决了什么问题?后端思考是什么?最后“zoom out”,从细节调回到整体,结果是什么?带来的客户价值是什么?你对未来的思考是什么?

可以看到,这些结构化的方法论可以帮助我们做到事半功倍,经常锻炼结构化思维可以极大地提升我们的职场竞争力。

10.工具化思维

提到懒惰,很多人都会投去鄙视的眼光。殊不知,适当的懒比低效的勤奋更具智慧,是更难得的美德。

其实偷懒也有高低之分,可以分为3个境界。

1)最差的境界是“实在懒”,拖延不喜欢的任务。

2)其次是“开明懒”,迅速做完不喜欢的任务,以摆脱之。

3)最高的境界是“智慧懒”,编写某个工具来完成不喜欢的任务,以便再也不用做这样的事情了,从而一劳永逸。

懒惰的对立面除了勤奋,也可能是“硬干”或者“苦干”。“硬干”或者“苦干”并没有带着光环,而是一种徒劳、低效、大可不必的努力,只会说明你做事情很急切,但并不是在完成工作。人们容易混淆行动与进展、混淆忙碌与多产的概念。

在有效的工作中,最重要的是思考,而人在思考时通常看上去不会很忙。如果和我共事的程序员总是忙个不停,我会认为他并非优秀的程序员,因为他没用最有价值的工具——自己的大脑。

我们提倡的“智慧懒”实际上是一种工具化思维,是“磨刀不误砍柴工”的智慧。有人说程序员和其他行业的最大区别是不仅使用工具,还能创造工具。可不是吗?理发师虽然会理发,但是不会制造剪刀。软件工程师却可以自己创造工具,用来提效,帮助自己更好、更快地完成工作。

我经常在团队中说,每当你重复同样的工作三次以上,就应该停下来问问自己:我是不是可以通过自动化脚本、配置化,或者小工具来帮助自己提效?

例如,我在eBay工作时,公司的应用依赖比较多,加上开发机器性能的限制,在本地启动服务通常都需要3分钟以上。一次3分钟不多,但是如果需要在本地频繁启动做测试,就会浪费很多时间。为此,我写了一个TestContainer的小工具,再配合IDE的热部署功能,在大部分情况下都不用重启服务,这个小小的创新为我带来了极大的便利。

所以,对于那些整天非常忙,忙到没有时间思考的读者,我真心建议你停下来,思考一下:我的方法有没有问题?是不是有更“偷懒”的方式可以帮助我提升效率?

11.好奇心

学习的动力不应该来自于外界的强力,而应该来自于内在,来自于我们内心对知识的渴望、对世界的好奇心。要想了解好奇心的重要性,可以去看看《列奥纳多•达•芬奇传》,看看这个500多年前被称为永恒史诗的“最好奇的人”,是如何在好奇心的驱使下在绘画、解剖学、地质学、机械设计、光学、植物学等多个领域都做出杰出贡献的。

好奇心是创新的驱动力。首先,它使我们灵活思考,打破现有的思维局限,从而不断地突破自己,完善自己的工作方式。其次,机会总是留给有准备的人,好奇心会促使我们张开翅膀在未知的领域里飞翔,给自己和公司带来新的机会。再次,拥有好奇心的人常常是快乐的,因为一切事物都是那么新奇,你会因为工作中的一点小突破而感到快乐,你会因为同事或者领导的一句肯定而快乐,你更会因为在工作中获取新知识、新技能、创造价值而快乐。最后,好奇心能使我们在工作中不断学习、积累经验,从而提高工作效率。

好奇心是学习的起点。我自己也是个“好奇宝宝”,我曾写过一篇文章,是关于阿里巴巴所有缩写的英文全称和中文解释的,上面还配了一段文字:“亲,我懂你,不了解缩写背后的全称,你晚上睡不着。”我本来是自己整理备用,但是没想到这篇文章到目前为止总共获得了超过35万的浏览量和1600个赞。我当初怎么也没有想到,一个出于好奇的总结,能帮助这么多人。

做技术这一行,应该没有比持续学习更重要的了。因为有太多新的东西需要我们学习和了解,很多人工作了很多年,知道的东西还很少,对很多东西的理解不透彻,就是因为缺少一点好奇心,没有深入钻研。

好奇心是学习的起点,是创新的原动力。我们每个人都应该像小孩子一样保持对知识的渴望,对世界的惊奇。

12.记笔记

好的学习方法也很重要。我记得几年前在阿里巴巴的一次内部会议上,主持人问一个副总裁:“你成功的秘籍是什么?”这个副总裁只说了一点:“好记性不如烂笔头。”这个会议的内容我已经完全不记得了,但是这句话我一直记到现在,因为它对我的触动很大。

后来在工作中,我每每遇到比较欣赏的人,都能发现他们有一个共同的习惯——勤做笔记。这不是一个偶然现象,里面有其必然的因素。首先,做笔记的人基本都是持续学习的人;其次,记录本身也有很多好处。

1)知识内化:记笔记的过程是一个归纳整理、再理解、再吸收的过程,可以加深我们对知识的理解。

2)形成知识体系:零散的知识很容易被遗忘,而形成知识体系之后,知识之间就能有更强的连接。

3)方便回顾:笔记就像我们的硬盘,当缓存失效后,我们依然可以通过硬盘调回,保证知识不丢失。

我真正养成记笔记的习惯是在两年之前,在前言中,我写了“如果能更早地了解这些知识、掌握这些方法该有多好”,记笔记就是其中一项。不过还好,有觉悟也不算太晚,在这短短两年中,我记了上千篇笔记——从哲学、工作到银行卡密码,可以说我现在的工作和生活已经完全不能脱离笔记了。好处是,我很明显地感受到自己归纳总结的能力和文笔都比以前好了很多。

那么如何记笔记呢?是的,如何记好笔记也是有方法的。在此,我将自己有限的记笔记经验分享出来,希望这些细节能帮助你提高笔记质量。

1)使用云笔记:云笔记要能在多端使用,要有目录的层次结构、标签和搜索功能。如果有些场合只能用笔做记录,也没关系,回来之后再整理到云笔记上。

2)归类分组:要定期回顾笔记内容,尽量按照合理的方式对笔记进行重组,形成一个有逻辑关系的树形结构。这样既方便记忆检索,也可以逐渐形成自己的知识体系。对于归于A组或B组都没错的笔记,可以使用标签来辅助分类。

3)不要复制粘贴:好的笔记最好是自己消化后的总结,而不是简单的照抄。如果有引用和参考,建议把链接也放在笔记下面,方便溯源。

4)结构化表达:对于简短的内容要重点突出,粗体显示重点部分;对于篇幅较长的内容,最好有目录,这样可以更加结构化地呈现笔记内容。

13.有目标

目标的重要性,以前是被我低估的。实际上,我之前的很多焦虑和迷茫都是目标不清晰导致的。例如,在我进入技术管理岗位之后,不知道后面的方向是什么,是继续在技术上专研呢?还是要研究管理之术呢?直到我再次翻开史蒂芬•柯维的《高效能人士的七个习惯》一书,仔细阅读才发现,“你要做一个什么样的人”并不是一个可有可无的次要问题,而是首先要回答的头等大问题,这时我才意识到目标的重要性。

在《高效能人士的七个习惯》中,柯维博士提到,“所有事物都要经过两次创造的原则,第一次为心智上的创造,第二次为实际的创造”。直观的表达就是:先想清楚目标,然后努力实现。不管是人生大问题,还是阶段性要完成的事情,都需要目标清晰、有的放矢。

例如,你需要提高自己的思辨和逻辑能力,那么就应该制定一个学习计划,多去看一些批判思维、逻辑学和哲学的书。

又如,很多人表示看过很多技术文章,但是总感觉自己依然一无所知。一个很重要的原因就是,没有带着目标去学习。在这个信息爆炸的时代,如果只是碎片化地接收各个公众号推送的文章,学习效果几乎可以忽略不计。在学习之前,我们一定要问自己,这次学习的目标是什么?是想把Redis的持久化原理搞清楚?还是把Redis的主从同步机制弄明白?抑或是想学习整个Redis Cluster的架构体系?如果我们能够带着问题与目标去搜集相关的资料并学习,就会事半功倍。这种学习模式的效果会比碎片化阅读好得多。

14.选择的自由

自由并不是想做什么,就做什么。自由是一种价值观,是一种为自己过去、现在及未来的行为负责的价值观。自由是一种责任,是一种敢于做出选择,并愿意为自己的选择承担后果的责任。

责任感(Responsible),从构词法来说是“能够回应(Response—able)”的意思,即选择回应的能力。所有积极主动的人都深谙其道,因此不会把自己的行为归咎于环境、外界条件或他人的影响。他们根据价值观有意识地选择待人接物的方式,不会因为外界因素或一时情绪而冲动行事。

消极被动的人会受到“社会天气”的影响。别人以礼相待,他们就笑脸相迎,反之,则摆出一副自我守护的姿态。心情好坏全都取决于他人的言行,任由别人的弱点控制自己。但这并不意味着积极主动的人对外界刺激毫无感应,只不过他们会有意无意地根据自己的价值观来选择对外界物质、心理与社会刺激的回应方式。

积极主动的人有选择的自由,而消极被动的人往往是被动地接受影响,忘记了自己的主观能动性,忘记了在刺激和回应之间还有选择的自由(There is always a space between stimulus and response)。

但凡成大事者,都能够“处乱世而不惊,临虚空而不惧,喜迎阴晴圆缺,笑傲雨雪风霜”。正因为他们是自己思维的主人,而不是被思维所控制,他们知道不管身处什么样的境地,都有“选择的自由”。

15.平和的心态

我的座右铭是“动机至善,了无私心;用无为的心,做有为的事”。首先,我们做事情的出发点必须是善的。其次,“有为的事”是指要认真做事,认真生活;“无为的心”代表一种平和的心态,一种活在当下的智慧。也就是做事要积极,但是心态要放平。

关于心态的重要性,我有过一段难忘的经历。曾经有一段时期,我非常焦躁,整夜睡不着觉,情绪低落,工作做不好,书也看不进去……这种状态反过来让焦虑变得更加严重,恶性循环。最主要的原因是“心”出了问题,是我太在乎他人的眼光,太在乎面子,太在乎外界的宠辱得失,导致心态失衡。当我放下得失心,让自己平静下来,整个人仿佛获得了重生,我第一次真正感受到什么叫自由,什么叫作生活的主人。

真正平和的人了解自己所有的主观感受都只是一瞬间的波动。虽然疼痛,但不再感到悲惨;虽然愉悦,但不再干扰心灵的平静。于是,心灵变得一片澄明、自在。心灵平静的力量十分强大,那些穷极一生疯狂追求愉悦心情的人完全难以想象。

就像有人已经在海滩上站了数十年,总是想抓住“好的海浪”,让这些海浪永远留下来,同时又想躲开某些“坏的海浪”,希望这些海浪永远别靠近。就这样一天又一天,这个人站在海滩上徒劳无功,被自己累得几近发疯。最后终于气力用尽,瘫坐在海滩上,让海浪就这样自由来去。忽然发现,这样多么平静美好啊!

16.精进

精进就是你每天必须进步一点点!记住,慢就是快。

巴菲特说:“人生就像滚雪球,关键是要找到足够湿的雪,和足够长的坡。”我觉得在技术领域,“雪”是足够多的,“坡”也足够长,关键是我们能不能坚持下去。但凡能持续学习和精进的人,其结果都不会差。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

素养和地方

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

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

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

打赏作者

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

抵扣说明:

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

余额充值