编程对许多开发者来说充满乐趣,作为一名程序员,您永远不会感到无聊:每年都会涌现出许多新的语言、技术、框架和库。
程序员是任何项目的核心部分;他们的贡献至关重要,拥有优秀的程序员会大大提高项目成功的几率。
但什么样的人才能算优秀的程序员?是在短时间内写大量代码的人吗?
任何开发者都知道,代码越多,就意味着:
- Bug 越多。
- 代码异味越多。
- 支持工作越多。
- 文档越多。
每一行代码都可能给代码库引入问题,增加其技术债务。为了减少 Bug 数量,通常来说代码越少越好。
以冒泡排序算法为例:有些开发者可能需要 50 行代码,因为他们从零开始实现;而另一些开发者可能只需要两行代码,因为他们使用了一个知名的库来完成这项工作。
从零开始编码和使用一个知名、成熟的库,有什么重大区别?
成熟的库具有以下优势:
- 被成千上万的开发者使用。
- 经过了非常充分的测试。
- 持续演进,并支持对许多操作系统的兼容。
- 经过良好的优化。
- 文档完善。
- 有人维护。
优秀的程序员应该擅长搜索现有的解决方案。在实现复杂功能之前,先检查是否已有知名库能完成这项工作。在 C++ 中,和其他语言一样,有许多优秀的库,如 STL、Boost、POCO……
根据我作为开发者的经验,优秀的程序员是那些写更少代码、高效工作的人。他们不一定是技艺超凡的技术大牛,而是懂得如何为任务搜索和选择合适库的人。有时技术大牛倾向于从零开始造轮子,这可能损害代码库的质量。
但是,如何选择合适的库呢?
选择软件库并不总是一件容易的事,尤其是当某个特定需求存在许多相互竞争的库时。许多因素会影响开发团队对库的选择;以下是其中一些:
1. 许可证
库的许可证是首先要检查的东西。在进一步探索其功能之前,务必确认许可证与您在项目中使用该库的方式兼容,这一点非常重要。
http://en.wikipedia.org/wiki/Comparison_of_free_and_open-source_software_licenses
2. 库能满足您的需求吗?
这似乎显而易见,但有多少开发者会运行一个小型概念验证来检查库是否满足他们的所有需求呢?有时我们会很早就发现库不合适,原因各种各样。
3. 社区活跃
使用库时可能会遇到许多问题;如果它的社区很活跃,就能很容易地快速找到解决方案。
4. 库的采用趋势如何?
了解库的受欢迎程度是在上升还是下降,是很有意思的。为此,您可以使用 Google Trends,了解该库多年来的演变情况。
例如,下面是 d3.js API 的趋势:

5. 该库过去是否有过破坏性变更?
在采用某个库之前,花几分钟在网上搜索"库名 breaking changes",检查特定版本是否引入过破坏性变更。
这对您有以下帮助:
- 避免使用该库旧版本的示例。
- 重大的破坏性变更可能是一个警示信号。它可能表明与现有用户的兼容性不是优先考虑的事项,类似的变更可能会在未来版本中再次发生。
6. 库的约束和限制
有时一个库对特定需求来说非常出色,但却有一个关键限制让您无法使用它。
以 Google Chart API 为例:它是一个非常实用的图表库。然而,它有一个恼人的限制——用户必须连接互联网。
在选择库之前,请确保它的任何限制都不会影响您的用例。简单地在网络上搜索"库名 limitations"就能有所帮助。
7. 文档
文档完善的库会在您使用它时带来极大的帮助,尤其是当它包含许多使用示例时。
8. 使用该库时您关心性能吗?
如果您打算在性能非常重要的场景中使用某个库,不要仅仅依赖网上找到的基准测试。最好结合您的具体约束构建一个概念验证,以更清楚地了解该库在您的场景中的表现。
9. 您的应用程序是跨平台的吗?
如果您的应用程序必须在多个平台上运行,不要主要在一个平台上测试,然后等到开发完成后才测试其他平台。
从一开始就始终在所有目标平台上进行测试;有些库在一个操作系统上实现得非常好,而在其他操作系统上却实现得很糟糕。
10. 所选库是否有其他同样优秀的替代方案,而您难以取舍?
在某些情况下,您可能会发现两个同样出色的库都能满足相同的需求,难以在它们之间做出选择。在这种情况下,永远不要让您的代码与库高度耦合。优先使用封装(wrapper)和外观(facade)模式来隔离对库的使用。
当然,还有许多其他因素会影响您的选择。为了把采用日后可能需要替换的库的风险降到最低,一种良好做法是使用封装和外观模式,把对库的使用隔离在代码中的少数几个位置。
试着评估您的应用程序与所有使用的库之间的耦合程度,找出与您的代码高度耦合的库,并尽可能地逐步将它们解耦。
有许多工具可以轻松检测外部库的耦合。我们可以列举JDepend和JArchitect用于 Java,CppDepend用于 C/C++,以及NDepend用于 .NET。
