Clojure

Ona

2017年4月13日

今天我们与 Peter Lubell-Doughtie 谈论 Ona

Ona

你使用 Clojure 和 ClojureScript 多久了?

Ona 使用 Clojure 和 ClojureScript 三年了。我们在构建数据收集和管理平台的前端更新版本时开始使用它。大约五年前,我通过 Cascalog 接触到了 Clojure。自从在大学期间学习并将其用于一个生成 s 表达式以进化代理通信语言的遗传编程研究项目以来,我一直对 Lisp 有一种亲切感。

使用 Clojure 或 ClojureScript 的团队规模有多大?

在任何时候,我们都有大约 4-6 名团队成员全职从事 Clojure 和 ClojureScript 项目;这相当于我们工程团队的三分之一。我们使用许多不同的编辑器,包括 Meow,这是我们的一位工程师创建的 emacs 配置。

你正在使用 Clojure 或 ClojureScript 构建什么产品或服务?

我们正在构建一个面向人道主义和国际发展组织的数据收集、管理和可视化平台。这些组织,例如世界粮食计划署和联合国儿童基金会,使用我们的平台在实地进行持续的调查。现场数据与历史数据实时合并,以构建他们投资或正在运行的项目的全面视图。这使组织能够在问题发生时看到问题并做出调整,例如将卫生工作者引导至人手不足的诊所或将检查员引导至受损更严重的建筑物。Clojure 和 ClojureScript 组件是一个无状态层,所有数据持久性和检索都通过我们的 API 客户端 Milia 进行中介,并在我们的 ClojureScript 数据查看器 HattiVega-viewer 中进行可视化。

你最喜欢使用哪个 Clojure 或 ClojureScript 库?

在 Clojure 方面,我们从 Ring 中间件 Optimus 中受益匪浅,它捆绑并优化了我们所有的资源。

在 ClojureScript 方面,我们是 Om 的早期采用者,并广泛使用它来渲染反应式视图。我们将其与基于 Hiccup 的标记一起使用,其中一些与 Clojure 共享(我们希望共享更多)。

对于我们在 Clojure 和 ClojureScript 中使用的库,我们大量使用 i18n 库 Tempura 结合 自定义助手 从翻译文件中加载所有文本。我们还在构建步骤中运行许多静态分析器,包括 KibitBikeshed,以捕获重复并强制执行统一的代码风格。

使用 Clojure 或 ClojureScript 对你来说最有价值的是什么?

一致性和近似的纯度为我们提供了最大的价值。当使用 Clojure 和 ClojureScript 时,我们可以查看前端或后端——实际上是代码库中的任何位置——并知道它遵循相同的一组简单规则。我们可以跟踪数据流并明确地看到转换是如何发生的。

这些功能在与经验不足的工程师或没有函数式编程背景的工程师合作时也能帮助我们。在 Clojure 中使用严格的静态分析器,可以显著限制解决问题的可能方法,并排除许多反模式。

你的技术栈是什么?

我们使用 NGINX 作为反向代理将请求传递给我们的应用程序服务器,该服务器运行基于 Ring 的 Jetty 服务器,并使用 Compojure 将请求路由到一组视图。我们使用 Enlive 和偶尔的 Hiccup 在服务器端呈现视图。所有样式都使用 SCSS 编写。客户端使用 Om 使用 Secretary 进行路由和 Sablono 进行标记来渲染 React 视图。我们使用基于 core.async 的 API 客户端 Milia 与客户端的 API 数据进行交互。

对于测试,我们自托管 Drone 来运行持续集成构建。代码必须通过 Sass-lintBikeshedcljfmtEastwoodKibit 和生产 ClojureScript 构建(这将提醒我们高级编译中出现的任何问题),然后我们才能运行测试套件。我们使用 Midje 在 Clojure 中编写测试,使用 cljs.test 在 ClojureScript 中编写测试。

使用 Clojure 或 ClojureScript 对你的业务有何价值?

因为我们的平台在全球范围内用于改善儿童和孕产妇健康、治理、农业、基础设施获取和政府问责制,所以我们平台中的错误会产生严重后果。例如,接种疫苗的人数减少,分发的基本资源减少(例如水和毯子)。从字面上讲,我们的错误意味着挽救的生命更少。使用 Clojure 和 ClojureScript 简化了我们处理来自世界各地的实时数据流的方式,并帮助我们最大限度地减少错误。如果您有兴趣与我们合作,请 联系我们

如果您想分享您的 Clojure 故事,请 填写此表单