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、卡丁车、保龄球和喜剧之夜等活动) 麦克风

请点击此链接申请:https://cuvva.pinpointhq.com/en/jobs/6081


更多关于Golang后端工程师招聘 - Cuvva(伦敦)🚀的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于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实现关键的业务需求,特别是在分布式事务、并发控制和合规审计方面。

回到顶部