阅读更多

1顶
0踩

非技术

引用
Apple 核心系统高级工程师 Asta 谢(谢孟军)就《开源如何影响程序员》这一主题,结合自身经历、从开源中得到的自我提升,详细阐述了自己对开源的理解,如何在国内做开源,并成为 GitHub 上 Go 语言领域中国排名第一,以及如何同国内外开源者一起参与开源的过程。

什么是开源?
我们都喜欢开源,在国内一提到开源也都认为是好事情。但到底什么是开源,也许大部分人对开源理念都不够清晰。

国内多数软件公司或开发者对于开源的热情,仅仅局限以下两方面:免费的代码;深入参与的开源活动。对开源,我们用的多,贡献少。国内发起的有一定影响力的开源项目,也是凤毛麟角。好的现象是貌似 Apache 基金会上,逐渐能见到很多国内公司贡献的代码,成为顶级项目。

我曾听过自由软件精神领袖理查德 · 马修 · 斯托曼(Richard Matthew Stallman)的演讲,演讲中他特别强调 “Free is not free”,对这句话我的个人解释是 “自由,而不是免费”。free 开源是自由,但不等于免费。开源是一种商业行为。试想一下,我们平日用谷歌百度做搜索,表面是免费,背后隐藏的是商业广告给他们带来的巨大利润。我们在尽情享用那些开源的免费大餐时,已然完全忘记开源的真正力量——开源是自由的,但不是免费的。

除此之外,对开源定义的理解,也可以借用先鲁迅先生所说的 “拿来主义”。把资本主义的资源拿来,给我们社会主义用。而拿来主义并非是不好的,原因是只有当你去用了这个产品,你才能去了解开源,了解他开源的产品到底是什么样的。live 开始前,一个同学问我怎样参与到一个开源项目之中。我的回答是,先拿来主义,把一个开源项目拿过来,自己先用起来。事实上这个观点可能和多数人不同。多数人的感觉是开源就需要贡献进去,需要付出。直白地说,拿来主义是第一步。不使用又如何参与?

但拿来主义并非一概而论。 只做个 “hello word”,写一个 demo,就半途而废说这个东西不过如此,这样的态度是无法真正参与进去。真正贡献一个开源产品,需要做到以下几点:
  • 理解一个开源产品的应用场景是什么;
  • 想明白当初这个作者为什么会设计它,设计这个产品当初是为了解决哪一些问题;
  • 原作者解决的这些场景问题,是否符合我的场景问题?
  • 基于 [3] 的判断,如果你们处在同样的场景同样的问题。才可以使用“拿来主义”。应用也不是浅尝辄止,要进行深入研究。至少做到把他们的文档读一遍。
  • 使用之后发现一些功能不能满足自己的需求,此时你可以说,这个开源有缺失,再贡献进去自己的代码。把这个功能完善。
以上是我认为的开源的使用方式和路径,很多开源项目也都是这样发展起来的。

我认为的理想开源,及国内现状
首先,开放的源代码。很多国内开源项目,也仅实现了这第一步。比如,公司开源某项目的源代码,直接扔到 github 上,即认为自己开源了。真正的开源,开源源代码,是最小的一步。

其次,有详细的文档。任何一个好的开源项目,都该有一个新手入门、详细的文档类东西。国内多数开发者,在这部分同样做得相对较差。

再次,是一个活跃的社区。国内开发者社区,比如我在国内做 beego 时,使用较多的是 qq 群、微信群。国外使用较多的是 Google Groups , iris , slack。slack 目前也已经建立,Google Groups 回复时间相对较少,通过 github 交流相对较多。在 github 上进行一些开源问题的交流相对较好。

最后,是持续改进。吐槽一个阿里的例子。阿里已经开源了很多项目。但其实一开源后你会感觉,完全是为了一个 KPI。在阿里,想要从 P7 升 P8,P8 升 P9,是需要开源的。开源后才有资格申请等级晋升。如此开源,后续的改进力度上,难免有一定程度的缺失。

综上,我对开源的理解可能首先是一个社区。如自由软件精神领袖创始人所说 “free is not free”,影响开源最重要的因素是以怎样的精神心态去开源。所谓自由,是开发者、测试者、贡献者、用户,可以自由使用、自由交流,以及自由离开。这样的状态使得所有人都感觉舒适自由,在此程度上舒服地做事,进而有一个好的 idea 去改进。

目前国内开源存在不好的状态是,一言不合就动口,看到不爽就开骂,开发者做开源,需要用户的一些吐槽。更好的交流方式是,吐槽诸如某功能如何,哪里做的不好,又如何去改进。而不是去埋怨吐槽这个代码有多烂。从大学开始做开源直到现在,我碰过各种各样的人。当然久而久之心态会变得非常好,读者的负面评论并不会伤及到我的内心。

其次,开源也是一种商业模式。好的现象是现在也有很多成功的开源公司,他们把开源的商业模式做的非常非常成熟。例如 redhat 是开源的操作系统,也要用到商业的支持。MySQL 被 ORacle 收购以后也是这样。以上两个例子应该是在商界模式上做开源做的非常好的公司。

云计算领域,做的比较好的如 openstack、docker、kubernetes,开源项目非常成熟,背后的商业模式也已经逐步做起来。尤其 openstack 在私有云领域,已然做的非常完善。前天(1 月 10 日晚),OpenStack 开源云计算企业 EasyStack 宣布完成 5000 万美元 C 轮融资,这也说明了开源并不表示免费。我们可以去提供很好的商业支持和商业模式去发家致富。OpenResty 和 BigBang 是开源项目。没有商业运作。

一个好的开源项目,如果要做的更加成功,背后需要有一个更好的商业模式去支持他。因为开源并不等于免费。这是从商业模式角度。思考,开源是一种营销模式,它使得以往封闭的需要很长周期技术验证的项目,以开源的方式可以很快进行验证。

如何做开源?
首先,要有一个能解决问题的 idea。无论是工作,做产品,根本上是怎样解决别人的某一个痛点。不管这个痛点多大多小。创业也是为了解决某一批的一个痛点。有了能解决问题痛点的东西,才能拿出来说,自己要去创业了,要写项目了。因而开源的前提,是解决某些人一个痛点的东西。

其次,善用身边的小工具。很多时候我们身边的一些小工具,是可以锻炼出来,做一些开源的东西。例如,我在我开源的一个东西 bat (github.com/astaxie/bat) 下,忘记原来是 java 还是 python 写的了,有一个叫 httpIE 的命令行工具,开源测试 lastfor 的 api 的。

于是 go 语言,自己重新写一个。这个就是结合我自己的 beego, 因为里面有很多 api,然后用 bat 测这些 api。后面,我又考虑,用 bat 是不是可以写一个 desl 的语言。就是我要测的。写一个 json,然后 request 应该怎么样。response 应该怎么样。也就说类似黑盒测试一样的东西。你只要写那个我的请求是什么,返回是什么。你用 bat 运行下。是不是就可以测试结果出来了。

这是比较容易入手的。因为你能解决你自己的那些问题,同时大家可能同事之间也好,圈子里面也好。大家平常的时候是怎么去处理这些问题的。然后这个问题,我怎么样把它做的更好。很多时候,我们都是说,更好。那怎么样才能更好呢?我们用某一个东西的时候,感觉它不是很好或者不是我想要的东西。我怎么样让它变得更好?当你有一个想法的时候,其实,你已经有一个 idea 了。有了一个 idea 时候,怎么样变得更好。变得更好的过程,其实是已经产生了一个开源项目了。

再次是完善的文档。开源项目做好之后,你的文档要跟上。因为只有有了完善的文档,才能把各方面的人才给聚起来。我现在记得非常清楚的一句话,大学时候,教我电路原理的一个老师,他说过的一句话 “你要记住你做的任何东西,你的用户都是小白。只有把你的用户当做小白, 你的文档才能写的非常好,每一步才会清晰易懂。每一步处理下来是不是可以行得通?你只有这样直白的文档,才能让最没有编程技术的人也能看得懂。

这样的文档才是好文档。这样的话,人家才能看了你的文档,感觉你这个人好有水平。同时,在写文档的时候,也能提升你的技术。如果感觉步骤非常多,就可以思考如何进行简化?这同时也是一种提升。我们应该思考,我们怎么与社区中的其他人进行很好的交流。后面,我会讲到,如果,你做开源做多了,这个能力就自然地上升了。

再然后,就是开始把你的东西推广到全球,能够链接全世界的开发者交流这个东西。那怎么做到这一步呢?对我们程序员来说,现在是最好的年代。因为我们有了 github,github 是给我们程序员一个交流平台。因为,很多人说,“Talk is cheap, show me the code.” 把代码放在那里,文档也有了。这个时候,github 的星星也就一颗两颗,没人来理睬。

这个时候,你需要去一定的圈子里面,做一定的宣传。现在确实是一个信息爆炸的时代。再好的酒也怕巷子深了。所以,你要去社区里面进行宣传。比如说 go 语言的开源项目,去 Google 的 Groups 里面去宣传。或者莱推特瑞或者 prezi 或者 facebook 的群组去宣传。当大家看到这个东西,是我们想要的,那么一切自然行云流水了。

最后,就是我们要去找到目标人群。时间长了,还是会积累起来一部分用户。这一部分用户就是我们所说的目标用户。看看这批用户,他们的分级。有开发者,有 CTO, 有架构师。他们都是为了什么,用你的这个东西的。每个人的目的是什么?一整个的过程,又可以促使你项目急速发展。相当于社区反馈的过程。同时,在这整个过程中,我们就可以了解,我们的开源项目是为了解决哪些人的哪些问题。一旦你这个开源项目做成功了,类似 Apache 麒麟、TiDB 这样。那你就具备了可以创业的资本了。

为什么?因为我们已经找到目标人物了。这些目标人物需要我的支持和我的产品。进一步,他们需要我的产品,也需要商业支持。一开始,会可能项目的维护升级跟不上,可有了商业支持就会不一样的。付钱了,才会享受更好的服务,才会有一整套的商业模式。对于你的将来来说,你的创业目标也就找到了。

总结 tips:首先我们要找到一个痛点。从小开始做起。如果痛点能够解决一个问题,那么就把这个问题给解决好。你熟悉哪个语言,你就用这个语言把这个东西给弄出来。弄出来之后,首先自己满意吧。然后,弄一定的文档,做一定的宣传,看大家的反馈,依照反馈持续改进。

如果,有了一定的规模了,是不是可以改进?然后,看可不可以拿出去创业用。实际上,就相当于是建立了一整个社区。你不仅仅是一个开放源代码的过程。开源实际上是开放源代码,文档,贡献者使用者的交互,然后交流,持续改进。这个才是开源所表达的含义。

我的开源成长之路
我在 Github 上做的一些事
做开源做了好多年。目前的状况是:在 github 所有的 user 里面,全球排名 16。go 语言领域里面,中国排名第一。世界排名第六,前五位排名均为组织。在 Github(github.com/astaxie)上,我分享了一本书, 一个 beego,一些工具。希望写一本书。目前在准备一个秘密项目,之后会开源出来。同时也参与了一些其他的开源组织。刚刚说的 TiDB 的开源,也会去改一下代码,贡献一下么。贡献是一个享受的过程。

始于大二的开源生涯
最早做开源,是从大二接触世界上最好的语言 PHP 着手的。那时候接触了 PHP3、fleaphp。一直在研究这些东西。机缘巧合的情况下,认识的库比较多一些,库积累的多了,就开始用一些框架。那时候,国内有一个框架,叫 fleaphp。与此同时,我参与到了 fleaphp 框架组里面。

同样用之前提到的方式,如果你要参与一个项目,首先,你就要去用它。大学给别人做兼职做好多个网站。基本都是用 fleaphp 做的。所以对 fleaphp 几个源码级别的东西,已经掌握的非常熟练了,也知道哪一些方面可以改进,哪一方面做的不是很好。参与开源先使用,拼命的用它,到崩溃为止。只有把它用到崩溃为止,你才能找到他痛点在哪里。

我做开源 fleaphp 框架时,好像没有 github,基本上我们就是通过一些 qq 群直接交流。哪一块代码不对,要修改一下,然后直接修改了。那时代码还是托管在 Google 的 code 上,协作也通过它。之后基于此做了很多视频教程,写了很多热门教程。fleaphp 应该怎么去用?现在用的比较多的是 thinkphp。其实 thinkphp 刚开始的时候,抄袭了我们很多的理念。然后,当年 fleaphp,我们没有继续做下去,也是因为我们几个创始人开源方向不一样,我去了 go 领域,离开 php 界。

这里想分享大家的是,开源是谁主导并不重要,重要的是,你要怎么参与进去。就参与的过程,我给作者提供了一个 PR。然后那个作者把 PR 给 Merge 进去了,然后成了 Contributor,已经贡献进去了。我觉得我的思路和作者的思路,其实是一样的,都是在思考修改一个问题,都是为了改进一个东西。

当然,好的作者的话。比如说,你提供一个 PR, 过去有时候,人家会拒绝你。在整个交流过程中,其实,也是可以学到很多东西的。有时候,他为什么会拒绝这个东西?Code Review 的时候,为什么会是这个样子?我觉得,这才是开源社区的一个氛围。只有参与进去了,你才能学到更多的东西。

再之后,做过一些边边角角的东西,比如写教程、做视频教程。再后来,才去思考做一些工具类,怎么样用一个脚本语言快速去生成一个我要的东西(基于 fleaphp 的),例如自动化生成结构。这些思想会影响我自己做 beego,很多的东西其实都是自动化。怎么样自动化也是有历史渊源的。我以前做过这个东西,我知道这个的好处,可以生成我想要的东西。自动化都是为了节省我们的时间嘛。

为了让代码自动化,做工具类的尝试
代码自动化可以让我们有更多的时间做更多的事情。这个思想,促进了我做 beego。文档和工具都是写 beego 的时候,脑子里立马生成的东西。如果我没有参与到 fleaphp 这整个开源过程的话,我不可能说,在做 beego 的时候,是一步而就的。所以说,所有的经历,就像乔布斯在斯坦福做毕业典礼的时候说的,人生是有各个点串起来的。你之前做某件事的时候,是不经意做的,但是你后面做另一件事的时候,其实你前面已经做了很多的铺垫。也就说人生的经验累积到一定的步骤,你就会爆发。所以这也就是一个由量变到质变的过程。

那这之后呢,我就去了盛大云,做 CDN 的开发。那个时候,也只是做一些管理系统(用 PHP 的)。那个时候,认识了老徐,开始接触一些 go 语言的东西。那个时候,go 语言是 R60 版本,还没有正式的 release 版本之前。就开始尝试写一些 go 语言的东西。为了尝试用 go 语言去写呢,因为 php 确实折磨了我好长一段时间。

特别是我加入盛大珈学院之前,我在百事通也是用 php 做我们自己的 TBIB 系统,遇到很多的性能问题。我记得有次熬通宵熬了两个通宵。为了把那个并发从 300 提高到 400,整个熬了两个通宵。但是大家想,从 300 到 400,性能呢没有提升多少,但是你就花了好长时间做这个。每一个小细节都需要花心思去优化。

后来,接触了 go 语言之后,就感觉,随便一写都是 php 的好几倍。当然,现在 php7 出来之后,也是性能提升了好多。那是你相比于 go 语言,go 语言毕竟是静态语言,性能还是天生的比较好。就开始接触了 go 语言,就开始写我们自己的应用大文件分发系统、调度系统,然后短域名啊,就发现 go 语言写起来就有一个非常好的好处:就是我只要编译过后(前提逻辑通畅),跑到线上,性能非常好。

所以那个时候就开始深入的学习 go 语言起来。那个时候,我们组里还有一个小伙子李辉,他是做 C++ 的么,会了解到很多底层的东西。所以很多底层的东西,我会和他交流,在交流当中就开始不断的学习。也是那个时候,自己每天回家就利用业余的时间,不断地把我自己学习 go 语言的整个过程来全部写下来。然后,才有了这个《goWeb 编程》这本书。其实,写了很长时间的。我估计,那个时候,是第一本有关于 go 语言的第一本书。应该肯定是。

被编辑一句话打动,写了一本书
这本开源之后呢,大家反馈比较好。然后,出版社就开始联系我,问我要不要出版?我的理念是,开源嘛,知识是要共享的,是要帮助到其他人的。因为,我刚刚和大家说过,我在做 fleaphp 的时候,做过以及写过很多的教程,教大家怎么去学习。在写这个《goWeb 编程》的时候,也是怀着一份让大家怎么样更好学习 go 语言的心事编写的。

当出版社来找我的时候,我就感觉,我又不赚钱,我为什么要出版。然后,我被一句话打动了。他说,其实有些人是热爱看书的,看书也是知识传播的一种渠道。我想了想,也对。确实有些人是这样的。上厕所的时候,可能就是喜欢看书。在不同的场景下,有需求在么,多一个渠道,何乐而不为呢?然后就答应了他们,但是说实在的,出版很复杂。要审稿,审计。要各种英文字正规范。就不符合我这闲惯了的心。

在写这本的时候,也是在盛大做了好几个下午。把那些基础的组件抽取出来之后,在写书的过程中,在最后两章,我就思考着,给大家介绍下,怎么教大家写出一个框架来。所以,才有了 beego 框架的原型。在写 beego 之前,我用的是 python 的 Tornado。所以 beego 的最初版本就是 Tornado 的 go 实现。大家现在还可以看到保留了那个风格。

我觉得 control 里面对应的就是(莱斯特 for)的 post,get 方法。那后面的就是逐步地增加才有了现在的很多的模块。当然了,今天我也是打算做 beego 的 2.0 版本。也是经过这么多年,也是积累了一些很多用户的需求吧。也是打算直接来一个 2.0 版本吧。

开源对技术人的影响
影响一:眼界
我们自己在写这个东西的时候,就是为了给自己解决事情的。当你把他开源出去,你的眼界就会开拓很多。你想我的用户群里面,其实他们有各种的需求。这各种各样的需求哪里来呢?很多情况下,我自己都没有想到,他们还没有这么用。然后,我们机会可以一起来改进它。这就是开源社区。他们能够让我看得到,我在工作当中遇不到的问题。让我的眼界放的更阔。设计的时候,项目就可以更 flexible。特别是,像我以前写的时候,就会犹豫导出还是不导出,都无所谓么。

但是,现在很多时候,我都不大敢导出,因为导出的时候,用户用了,就会很麻烦。现在就实现最小化导出。思考思考再思考。一旦要导出,就会思考 2 遍,到底需不需要导出,因为后面再撤掉,影响就会比较大。

第二个眼界,就是你把这个项目,放到 github 上面。那 github 上,有全世界各个地方的人。你会接触到各种各样的人,90% 的人都是很 nice 的人。他们也很愿意和你交流,愿意得到我们的帮助。或者说,他们的需求是什么样子的。我觉得他们各种各样的信息,对我来说都是一个输入吧。这里面各种各样的信息,对我也是一个很好地学习方式。

影响二:心态
做开源的时候,刚开始就是从一个年轻小伙子,年轻气盛。和别人对喷,到后来无所谓。其实,是越来越享受这个开源的过程了。而不是愿意花时间和别人对喷。人家去骂你的时候,你可以欣然接受。ok。也无所谓。你觉得心情不好就骂几句。实际上,你就讲道理的和别人讲。如果说那个人是在没办法讲道理讲得通。ok. 那我们就没必要理睬这样的人就好了。这个也不是你的用户群,对吧。你也不应该把你的时间浪费在这些人身上,应该把你的时间花在喜欢你的人以及你的开源项目的人身上。服务好他们,这才是我们应该真正做的事。

影响三:个人提升
这是最多的方面。例如,我写出来的代码是不是很好,高质量的代码。当然是尽量好一点。没有说,我一写出来的,就是非常完美的。很多时候,你就回看发现,半年前的代码,怎么会这么烂呢。因为你个人是在不断提升,很多时候,他开源代码都是会选择做出接近完美的代码,才会公开。这个也是个人的平衡,就是说做完美了才公布呢,还是小步快跑呢?我个人喜欢小步快跑,赶快实现原型。然后持续的去改进他。因为我想知道,当用户用了之后,这个东西是不是他们想用的东西。

影响四:沟通能力
你需要去写文档们需要去 github 回复,需要去 qq 群、微信群里去沟通交流。那怎么样,很好的去和用户沟通交流,把你自己的信息直接通过最短的时间传递你最明确的意思。其实这是非常锻炼人的。到底,怎么样一个好信息?怎么样一个直接传达的方式,这是非常锻炼一个人沟通能力的。

影响五:team work 团队精神
你单兵作战,是可以做一个好项目。但是你持续要有一个团队是很有必要的。像 beego,有很多人可以维护的,像小黑同学,余双棋同学,有一个貌似意大利的很牛的。只有你很积极地参与进来,我才会认可你,才会把你纳为 contributor,才会是团队的人。那团队的人要怎么样一起工作,怎么样相互的 review,怎么样把代码做好,怎么样去完善它,协调好各方面。

作者介绍
谢孟军,Go技术专家,目前就职于Apple,Gopher China 创始人,著名开源框架 beego 开发者,畅销书《Go Web编程》作者,国内Go发展的主要推动者之一。
  • 大小: 207.2 KB
来自: InfoQ
1
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 匹配空格的正则表达式

    匹配空格的正则表达式

  • 正则表达式匹配多个空格_「正则表达式」 匹配多个字符

    1. 匹配多个字符代码功能*匹配前一个字符出现0次或者无限次,即可有可无+匹配前一个字符出现1次或者无限次,即至少有1次?匹配前一个字符出现1次或者0次,即要么有1次,要么没有{m}匹配前一个字符出现m次{m,n}匹配前一个字符出现从m到n次示例1:*需求:匹配出一个字符串第一个字母为大小字符,后面都是小写字母并且这些小写字母可 有可无import reret = re.match("[A-Z][...

  • 把一个或多个空格替换成一个空格的正则表达式

      String line = "sss \t ddd aa \t ee"; String ln = line.replace("\t"," "); ln = ln.replaceAll("\\s+"," "); //把一个或多个空格替换成一个空格 String[] lns = ln.split(" ");  

  • php 正则一个或多个空格,正则_不能以空格开头或结尾,中间可以0或者多个空格...

    /*** jspp@qq.com* 2019/7/12* 11:33*/public class TestReg {/*** 1、1--30位* 2、两边不能有空格* 3、中间可以0或者多个空格* 4、字母+数字+点+下划线** "3 22" true* "3 2A2" true* "3" true* "3 " false*" _" false* "123_.678901234567...

  • 正则表达式将字符串中的所有连续空格替换成一个空格

    Replace two or more spaces with a single space. JAVA : String oldStr = "AAA   BBB"; String newStr = oldStr.replaceAll(" {2,}", " "); JS : var oldStr = "AAA   BBB"; var newStr = oldStr.replac

  • 有一比较的正规表达式 eq egt elt 之类的

    $c = preg_match('/^(gt{1}|lt{1}|egt{1}|elt{1})\,{1}\d+(\,{1}(gt{1}|lt{1}|egt{1}|elt{1})\,{1}\d+)?$/','elt,148,egt,40'); /^  开始 (gt{1}|lt{1}|egt{1}|elt{1}) 其中的一个 \,{1} 一个 , \d+ 这个是一个或是多个数字 (

  • java 正则 多个空格,Java Regex:如何匹配一个或多个空格字符

    How do you match more than one space character in Java regex?I have a regex I am trying to match. The regex fails when I have two or more space characters.public static void main(String[] args) {Strin...

  • php 笔记。忘记叫什么表达式了

    eq相等 ne、neq不相等, gt大于, lt小于 gt大于, lt小于 gte、ge大于等于   lte、le 小于等于   not非   mod求模   is [not] div by是否能被某数整除   is [not] even是否为偶数   is [not] even by $b即($a / $b) % 2 == 0   is [not] odd是否为奇

  • 用了这么久的equals,你知道还要遵守约定么

    颓废青年,快出来挨打!点击上方“Java极客技术”,选择“设为星标”后台回复“java”,获取Java知识体系/面试必看资料资料会持续更新,已更新第四次!文章精品专栏记一...

  • posix和perl标准的正则表达式区别

    本文介绍PHP语言中posix和perl标准的正则表达式区别

  • perl正则表达式[转]

    一、简介二、匹配操作符三、模式中的特殊字符1、字符2、字符 []和[^]3、字符 +,*和?4、转义字符5、匹配任意字母或数字6、锚模式7、模式中的变量替换8、字符范围转义前缀9、匹配任意字符10、匹配指定数目的字符11、指定选项12、模式的部分重用13、转义和特定字符的执行次序14、指定模式定界符15、模式次序变量四、模式匹配选项1、匹配所有可能的模式(g选项)2、忽略大小写(i选项)例3、将字...

  • 牛刀小试 - 趣谈Java中的异常处理

    概述 顾名思义,通俗来讲异常就是指,那些发生在我们原本考虑和设定的计划之外的意外情况。 生活中总是会存在各种突发情况,如果没有做好准备,就让人措手不及。 你和朋友约好了明天一起去登山,半道上忽然乌云蔽日,下起了磅礴大雨。这就是所谓的异常情况。 你一下子傻眼了,然后看见朋友淡定的从背包里掏出一件雨衣穿上,淫笑着看着你。这就是对异常的处理。 对于一个OO程序猿来讲,所做的工作就是:将

  • 从源码一次彻底理解Android的消息机制

    情景重现 button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { Thread.sleep(5 * 1000);

  • 华为面试题:匹配“英文字母文件名:一个或者多个空格 行号“的正则表达式为:

    刷题的时候,顺便自己整理了一波。

  • 正则表达式匹配连续多个空格或tab空格

    Pattern p = Pattern.compile("\\s{2,}|\t"); Matcher m = p.matcher(str); String strNoBlank = m.replaceAll(" "); System.out.println(strNoBlank);

  • 正则表达式匹配多个空格

    preg_match_all('/(.*?)[\s]*/ise',$body,$body_mat); 用[\s]*可匹配多个空格如

  • 一看就会的正则表达式

    概念正则表达式(Regular Expression)是用于描述一组字符串特征的模式,用来匹配特定的字符串。通过特殊字符+普通字符来进行模式描述,从而达到文本匹配目的工具。正则表达式基本要素1.字符类2.数量限定符3.位置限定符4.特殊符号字符类数量限定符位置限定符详细举例:(1)^和$匹配字符串“world aworld worlda aworldb world”中^world,匹配到了行首位置...

Global site tag (gtag.js) - Google Analytics