不要重复造轮子



“不要重复造轮子 Stop Trying to Reinvent the Wheel”, 可能是每个程序员入行被告知的第一条准则。我自己也会对新人反复灌输这个概念,写程序其实是一个最能“偷懒”的工作:你现在费力实现的每一个功能,可能早已经有极好的解决方法贡献在开源社区,如果可以直接用现成的,那节省下来的时间是不是可以用来偷懒呢?极端的说法,哪怕是那位把所有开发外包给沈阳一家公司的哥们,如果撇开道德以及商业安全,只要能贡献优质的代码和健壮的功能,对于一个项目来说,这样做其实没任何问题。

 

找轮子存在的问题

虽然不要重复造轮子的准则被反复提到,但是以我个人的经验,这个准则实践起来其实很有难度,因为:

1.“不要重复造轮子”意味着首先需要找到一个可以用的轮子,而且我们一般希望是能最好的轮子才可以一劳永逸。这就对个人的信息检索能力有非常高的要求。

2.找到了一个轮子,但这个轮子好不好用,需要时间来论证。能一眼判断一个项目的质量以及易用性,这其实需要大量项目经验的积累。

3.好轮子不是你想用,想用就能用的。要想将一个开源项目整合到自己的项目中,需要对这个项目有比较深的了解。开源项目的文档质量参差不齐,当使用轮子时,只看文档往往是不够的,还需要阅读源代码甚至深度修改定制。更不要说大部分开源项目根本没有中文文档。

 

所以现实情况往往是:新人不懂得检索方法,找不到轮子;好不容易找到一个轮子,学了半天不会用;好不容易能运行,很多地方与需求不一致,但是又不会改;一来二去,最后还是变成自己写轮子,同时还得出一个结论:别人的轮子都不好用,还是要坚持自己造轮子。

 

这种情况的最佳体现,就是曾经有一段时间遍地开花的PHP框架。每一个写框架的人都认为自己写的框架才是最好的轮子,甚至是很多PHP新人,对几个成熟框架浅尝辄止后,也纷纷投身写框架的行列。成品大部分看过去却是大同小异,只是语法层面更符合作者本人的习惯,而缺乏大量的测试以及文档社区,最终的结果就是一个半成品然后无疾而终。

 

这个例子可能有马后炮之嫌,毕竟PHP的造框架运动是由当时的背景和多方面的因素造成的,目前因为有了PHP-FIG制订的规范,PHP的框架的资源已经慢慢集中在Zend FrameworkSymfonyCakePHPYiiCodeIgniter这样少数几个成熟框架之下了。更多的符合PSR规范的模块类库在取代新框架不断涌现,这对整个PHP社区都是好事情。

 

话题稍微扯的有点远,不过核心的意思还是为了说明,找轮子本身其实是一件不容易的事情。而我对上面问题的解决方法是:找轮子的任务不要交给新人,而是要由经验丰富,信息检索能力强的编程人员负责,最好是项目的构架人员。团队成员找到的轮子最好也由构架人员拍板,用还是不用。对于团队新人,最重要的任务还是编程基本功、文档阅读能力以及如何用好已经拍板的轮子。

 

怎样才算是好轮子?

个人认为好轮子应该具备以下的特征:

1.开源,并且License宽松。

2.有文档,代码规范,接口友好,最好有实际用例。

3.社区相对活跃。

4.松耦合,定制容易。

至于同时找到好几个轮子需要选择的情况,可能要根据项目的实际情况进行取舍:有些轮子侧重于大而全,希望解决大部分问题,但是细节上处理不够细致;有些轮子小而精,专注解决一个问题,但是不具备好的通用性。但只要合适好用,都是一个好轮子。

 

如何找到好轮子

如何找到好轮子其实在上面问题中已经很清楚了,你应当具备:

1.信息检索能力

2.外文资料阅读能力

3.代码阅读能力以及平时的积累

 

对于第一条,个人的信息检索能力是无法一蹴而就的,不过如果是还在等待我对此再说出一二三而不是去自己检索寻找方法的朋友,基本上已经没救了。

 

这里唯一需要说的是,如果想用百度那货去找技术资料的还是省省吧。

 

外文资料阅读能力也非一日之功,不过个人倒是有个小窍门,如果想要获得一些项目的HelloWorld入门教程或者服务器的配置,可以将检索语言限定为日语,因为日文用户的教程往往秉承了日本细致入微的精神,包括项目背景、需要的环境安装等等一些对初学者才有用的知识,在日文的技术资料中往往也会写的很清楚。

 

至于平时的积累,可能程序员都知道GithubSourceForgeGoogle Code这些优秀的项目托管网站。但是积累的意思并不是说有时间上去看两眼或者随便收藏一下这么简单。

 

比如我自己侧重PHP方面的项目,我的一个做法是找到Github下所有Follower大于300的PHP项目(其实一共不到200个其中很多还是php框架),然后一个一个像扫货一样,对其进行了解以及记录。

 

我的另一个做法是查看知名PHP框架,看看他们用了哪些轮子,比如在Symfony Reference你就能淘到Asseticmonolog 这样的好货。

 

最后一个办法是在Github上Follow一些活跃的作者,比如我的Following中就会显示我的Stars和Forks,里面自然也是我认为值得收藏关注的项目。

<think>好的,用户之前问过如何在Java8中实现布隆过滤器,我给出了一个自己编写的示例代码。现在用户的新问题是要求使用开源工具实现,不要重复轮子。需要先理解用户的真实需求。 用户可能在实际项目中遇到了需要布隆过滤器的场景,比如缓存穿透防护或者去重。他们之前可能尝试自己实现,但意识到维护和优化成本较高,所以现在想用现有的开源库,这样更可靠,功能也更完善。 需要确认用户是否了解常见的Java开源库,比如Google Guava或者Apache Commons。用户可能希望得到具体的库推荐,以及快速上手的示例代码,以便直接应用到项目中。 另外,用户提到“不要重复轮子”,说明他们希望节省开发时间,避免潜在的bug,确保稳定性和性能。因此,我需要重点介绍成熟的开源工具,强调它们的优点和使用方法,可能还要比较不同库的优缺点,帮助用户选择最适合的。 需要检查之前的回答中是否已经提到过Guava,因为在之前的回答里确实有提到过,所以这次可能需要更详细地展开,包括Maven依赖、代码示例,以及使用时的注意事项,比如配置参数、序列化支持等。 同时,用户可能对性能、线程安全、扩展功能(如计数布隆过滤器)有需求,需要在这些方面给出建议。比如Guava的布隆过滤器是否线程安全,如何处理并发情况,或者是否有其他库支持更高级的功能。 还需要考虑用户可能对其他语言或工具的实现感兴趣,但根据问题描述,用户明确询问的是Java8中的实现,所以应专注于Java相关的库。不过,如果有一些多语言支持的库,比如Redis的布隆过滤器,可能也是用户需要的,尤其是在分布式系统中,所以可以补充说明。 最后,确保回答结构清晰,分点说明每个库的使用方法、优缺点,以及适用场景,方便用户快速理解和应用。</think>在 Java 中直接使用成熟的**开源布隆过滤器工具**可以避免重复轮子,且能保证性能和可靠性。以下是主流开源库的实现方案: --- ### **1. Google Guava 的 BloomFilter** **Guava** 是 Google 提供的 Java 工具库,其 `BloomFilter` 实现高效且线程安全。 #### **步骤** 1. **添加依赖**(Maven): ```xml <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>32.1.3-jre</version> <!-- 使用最新版本 --> </dependency> ``` 2. **核心代码示例**: ```java import com.google.common.hash.BloomFilter; import com.google.common.hash.Funnels; public class GuavaBloomFilterDemo { public static void main(String[] args) { // 创建布隆过滤器:预期插入量 1000,误判率 1% BloomFilter<String> bloomFilter = BloomFilter.create( Funnels.stringFunnel(Charset.defaultCharset()), 1000, 0.01 ); // 添加元素 bloomFilter.put("example_data"); // 判断是否存在(可能误判) boolean exists = bloomFilter.mightContain("example_data"); System.out.println(exists); // true } } ``` #### **特点** - **自动优化参数**:根据 `expectedInsertions` 和 `falsePositiveRate` 自动计算位数组大小和哈希函数数量。 - **线程安全**:支持多线程并发写入和查询。 - **序列化支持**:可通过 `writeTo()` 和 `readFrom()` 方法持久化过滤器。 --- ### **2. Apache Commons 的 BloomFilter** Apache Commons 从 **4.5 版本**开始提供 `BloomFilter` 实现(需注意版本兼容性)。 #### **步骤** 1. **添加依赖**(Maven): ```xml <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> <!-- 4.5+ 支持 BloomFilter --> </dependency> ``` 2. **代码示例**: ```java import org.apache.commons.collections4.bloomfilter.BloomFilter; import org.apache.commons.collections4.bloomfilter.SimpleBloomFilter; public class CommonsBloomFilterDemo { public static void main(String[] args) { // 创建布隆过滤器:预期元素数量 1000,误判率 1% BloomFilter<String> bloomFilter = new SimpleBloomFilter<>(1000, 0.01); // 添加元素 bloomFilter.add("example_data"); // 判断是否存在 boolean exists = bloomFilter.contains("example_data"); System.out.println(exists); // true } } ``` #### **特点** - **灵活配置**:支持自定义哈希函数和位数组实现。 - **扩展功能**:提供计数布隆过滤器(`CountingBloomFilter`),支持删除操作。 -- ### **3. Redis 的布隆过滤器(分布式场景)** 如果需要在分布式系统中使用布隆过滤器,可以直接利用 **Redis 模块**(需 Redis 4.0+)。 #### **步骤** 1. **启用 Redis Bloom 模块**: ```bash # 启动 Redis 时加载 Bloom Filter 模块 docker run -p 6379:6379 --name redis-redisbloom redislabs/rebloom:latest ``` 2. **Java 客户端操作**(使用 Jedis 或 Lettuce): ```java import redis.clients.jedis.Jedis; import redis.clients.jedis.util.Hashing; public class RedisBloomFilterDemo { public static void main(String[] args) { Jedis jedis = new Jedis("localhost", 6379); // 创建布隆过滤器(误判率 1%,初始容量 1000) jedis.bfReserve("my_filter", 0.01, 1000L); // 添加元素 jedis.bfAdd("my_filter", "example_data"); // 判断是否存在 boolean exists = jedis.bfExists("my_filter", "example_data"); System.out.println(exists); // true } } ``` #### **特点** - **分布式支持**:多个服务节点共享同一个布隆过滤器。 - **持久化**:数据存储在 Redis 中,重启后不丢失。 --- ### **4. 其他开源工具** #### **a. Breeze (轻量级库)** - **GitHub**: [Breeze](https://github.com/geekyouth/breeze) - **特点**:适用于小型项目,代码简洁,依赖少。 #### **b. Cassandra 内置布隆过滤器** - **适用场景**:如果已使用 Cassandra 数据库,可直接利用其内置的布隆过滤器优化查询。 --- ### **选择建议** | 场景 | 推荐工具 | 优势 | |--|-----------------------------------| | 单机 Java 应用 | Google Guava | 简单、高性能、自动参数优化 | | 需要删除操作 | Apache Commons | 支持计数布隆过滤器 | | 分布式系统 | Redis Bloom Filter | 跨服务共享、持久化 | | 大数据存储(如 Cassandra)| 数据库内置布隆过滤器 | 深度集成、无需额外开发 | --- ### **注意事项** 1. **误判率测试**:实际使用前需用真实数据验证误判率是否达标。 2. **容量规划**:如果实际插入数量超过预期,误判率会显著上升。 3. **性能监控**:分布式场景下需关注 Redis 或 Cassandra 的内存和延迟。 --- 通过以上开源工具,可以直接集成布隆过滤器功能,无需重复实现,且能利用社区维护的优势保证稳定性和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值