Golang后端工程师招聘 - Cuvva(伦敦)🚀
Golang后端工程师招聘 - Cuvva(伦敦)🚀 关于 Cuvva
我们正在彻底改进保险。如何做到?通过构建公平且灵活的保险产品。
保险行业已经完全过时。它陈旧、复杂、僵化——我们明白,保险(正如你所知)听起来并不令人兴奋。但我们正在以不同的方式做事。利用相当酷的技术,我们正在使保险更适应 21 世纪,构建真正解决问题的产品。
我们是英国第一家通过应用程序销售按小时计费汽车保险的公司。我们也是唯一一家在应用程序内提供客户支持、平均响应时间为一分钟的保险提供商。我们已经售出超过 200 万份保单,并为超过 30 万客户提供了支持。我们是一个由 100 多名成员组成、不断壮大的强大、才华横溢的团队。
为什么为 Cuvva 工作?
我们不走捷径。我们努力做正确的事,即使这会让我们的生活更加困难。
我们培育了很棒的团队文化。当我们有想法时,我们总是会说出来——但也知道何时放手并支持其他事情。
我们乐于给予和接受诚实的反馈,并尝试新的做事方式。
我们正在建立一个来自不同背景、观点和经验的多元化团队。每个人都有公平的机会在 Cuvva 获得职位。即使你内心并不热爱保险,请相信我们,你会爱上我们正在构建的东西。
关于职位
我们正在寻找一位软件工程师,他曾在高增长、高规模的初创公司的工程团队中担任高级职位,能够高度自主地工作,确保无可挑剔的可靠性和可用性。你深切关注为长期发展构建坚如磐石的基础设施,并有为团队和产品提供支持解决方案的良好记录。
你将开发 Cuvva 的核心平台,抽象出销售保险所需的关键流程,提供解决方案,使团队能够开发强大稳定的产品,而无需花费时间确保基础工作正确无误。
除了开发核心平台服务外,我们预计你还将深度参与运维和安全活动,为维护我们的服务器、AWS 账户等做出贡献。
"核心平台"
当我们提到"核心平台"时,我们指的是支撑我们系统上所有保险活动流程的服务。
例如,我们预计其中之一是"保单服务",它可能负责确保合规签发保单、协调中期调整、防止保单重叠(重复保险)等。
其他服务可能包括用户身份验证、风险与定价计算、处理根据任何中期调整要求修改用户数据的流程。
我们认为属于核心平台的所有服务都有关于稳定性、数据完整性和事务安全性的严格要求。所有功能都必须安全且明确地失败,例如使用两阶段提交过程或其他类似技术。这也需要合理水平的测试来验证这种安全性。
我们团队的完美补充将具备:
- 极度独立和自我驱动的工作方式
- 在高规模初创公司从事后端系统工作的 5 年以上商业经验
- 至少一年的 Go 语言商业工作经验
- 扎实的安全实践知识,最好有一些"灰帽"背景
- 对整个 Web 技术栈有实际了解——从 DNS 查询如何传输,到浏览器如何优先处理 CSS 规则
- 对合规性和金融监管的认识。我们是一个小团队,因此成功的候选人不仅技术能力要非常强,而且文化契合度也要高!
薪酬福利
- 除了有竞争力的薪水(75-90k 英镑,取决于经验)和基于股权的报酬外,在 Cuvva 工作的福利还包括:
- 全新的 MacBook

- 33 天假期(含公共假期🌞)
- 灵活的工作方式
- 健康、个人发展和居家办公预算
♂ - 预算和假期津贴逐年增加
- 慷慨的育儿假政策
- 与我们的 Sanctus 心理健康教练进行一对一咨询,为你提供一个安全的倾诉空间

- 使用 Lifeworks——我们的心理健康工具和员工援助计划
- 汽车保险的友情折扣价
- 电动自行车租赁和电动汽车租赁的薪资牺牲计划
- 自行车通勤计划

- 通勤季票贷款
- 一个志愿者日
- 办公室里有很棒的咖啡机

- 储备充足的啤酒和软饮料冰箱(我们每周四都有团队饮品活动)
- 每月团队外出活动或远程活动(到目前为止,我们做过卡拉 OK、卡丁车、保龄球和喜剧之夜等活动)

更多关于Golang后端工程师招聘 - Cuvva(伦敦)🚀的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang后端工程师招聘 - Cuvva(伦敦)🚀的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这是一个非常吸引人的Go后端工程师职位。从技术角度看,Cuvva对核心平台的要求体现了金融科技领域对高可靠性系统的典型需求。以下是针对职位要求中几个关键技术点的Go实现示例:
1. 事务安全性与两阶段提交模式
// 使用context和事务处理保单签发
func IssuePolicy(ctx context.Context, policyReq PolicyRequest) error {
tx, err := db.BeginTx(ctx, nil)
if err != nil {
return fmt.Errorf("failed to begin transaction: %w", err)
}
defer tx.Rollback()
// 第一阶段:验证和预留资源
if err := validatePolicyRequirements(ctx, tx, policyReq); err != nil {
return fmt.Errorf("validation failed: %w", err)
}
// 第二阶段:提交所有变更
if err := tx.Commit(); err != nil {
return fmt.Errorf("commit failed: %w", err)
}
return nil
}
// 使用saga模式处理分布式事务
type PolicySaga struct {
steps []SagaStep
}
func (s *PolicySaga) Execute(ctx context.Context) error {
var completedSteps []SagaStep
for _, step := range s.steps {
if err := step.Execute(ctx); err != nil {
// 补偿已完成的步骤
for i := len(completedSteps)-1; i >= 0; i-- {
completedSteps[i].Compensate(ctx)
}
return err
}
completedSteps = append(completedSteps, step)
}
return nil
}
2. 防止保单重叠的并发控制
// 使用分布式锁防止重复保险
type PolicyService struct {
rdb *redis.Client
}
func (ps *PolicyService) CreatePolicy(userID string, vehicleID string) error {
lockKey := fmt.Sprintf("policy_lock:%s:%s", userID, vehicleID)
// 获取分布式锁
locked, err := ps.rdb.SetNX(ctx, lockKey, "1", 30*time.Second).Result()
if err != nil {
return fmt.Errorf("failed to acquire lock: %w", err)
}
if !locked {
return ErrConcurrentPolicyCreation
}
defer ps.rdb.Del(ctx, lockKey)
// 检查现有保单
existing, err := ps.checkExistingPolicies(userID, vehicleID)
if err != nil {
return err
}
if existing {
return ErrPolicyOverlap
}
return ps.createNewPolicy(userID, vehicleID)
}
3. 高可用服务架构
// 使用健康检查和断路器模式
type PolicyServer struct {
healthCheck *HealthChecker
circuit *gobreaker.CircuitBreaker
}
func (ps *PolicyServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// 健康检查端点
if r.URL.Path == "/health" {
if err := ps.healthCheck.Check(); err != nil {
w.WriteHeader(http.StatusServiceUnavailable)
return
}
w.WriteHeader(http.StatusOK)
return
}
// 使用断路器保护核心业务逻辑
_, err := ps.circuit.Execute(func() (interface{}, error) {
return ps.handlePolicyRequest(r)
})
if err != nil {
handleServiceError(w, err)
return
}
w.WriteHeader(http.StatusOK)
}
4. 合规性数据审计
// 金融监管要求的审计日志
type AuditLogger struct {
logger *zap.Logger
}
func (al *AuditLogger) LogPolicyChange(ctx context.Context, change PolicyChange) {
al.logger.Info("policy_change",
zap.String("user_id", change.UserID),
zap.String("action", change.Action),
zap.Time("timestamp", change.Timestamp),
zap.String("ip_address", extractIP(ctx)),
zap.String("user_agent", extractUserAgent(ctx)),
zap.Any("before_state", change.BeforeState),
zap.Any("after_state", change.AfterState),
)
// 确保日志持久化
if err := al.flushToSecureStorage(); err != nil {
metrics.AuditLogFailure.Inc()
}
}
这个职位对Go开发者的要求非常典型地反映了金融科技行业对系统可靠性、数据一致性和安全性的高标准。示例代码展示了如何用Go实现关键的业务需求,特别是在分布式事务、并发控制和合规审计方面。

