Golang在Cuvva公司担任iOS工程师的工作体验分享 🚀

Golang在Cuvva公司担任iOS工程师的工作体验分享 🚀 关于 Cuvva

Cuvva 正在彻底改善汽车保险。

我们正在创造真正灵活的产品,以满足人们的实际需求。利用闪电般快速的技术,为我们的客户解锁更好的体验和更公平的价格,Cuvva 每天都在构建保险的未来。

Cuvva 是英国第一家通过应用程序销售按小时计费保险的公司。自那时起,我们已经售出了超过 300 万份保单,并为超过 450,000 名客户提供了支持。我们是一支由 100 多人组成的世界级团队,热衷于解决客户的问题。加入我们吧。

为什么为 Cuvva 工作?

我们正在塑造保险的未来。所以我们不会偷工减料。我们努力做正确的事,即使这会让我们的生活更加困难。

我们以客户为中心,包括我们的首席执行官兼创始人 Freddy 在内的业务各个领域的每个人,每月都需要花几个小时处理客户支持。这样我们才能充分理解客户需求以及应用程序的工作原理!这是我们关于’Cops Club’的博客文章。

当我们有想法时,我们会说出来——但我们知道何时该放手并支持其他事情。

我们乐于给予和接受诚实的反馈,并尝试新的做事方式。这就是 Cuvva 的方式。

我们正在组建一个拥有不同背景、观点和经验的多元化团队。所以我们给每个人一个在 Cuvva 获得职位的公平机会。即使你内心并不热爱保险。(别担心——我们最初也不爱。)

如果你在申请 Cuvva 时需要任何调整或支持,请不用担心。只需告诉我们。

关于职位

我们正在寻找一位经验丰富的 iOS 开发人员,他将帮助我们构建 Cuvva 平台的用户界面部分。您将拥有以模块化方式优雅而简洁地构建复杂应用程序的经验。

您深切关心为长远发展构建坚如磐石的基础设施,并有交付支持您团队和产品的解决方案的良好记录:我们的客户所看到的 Cuvva 将由您创造。

您将负责:

  • 将我们的新设计概念变为现实(如果您想先睹为快,请告诉我们!)

  • 与我们的平台团队合作,制定 API 需求规范

  • 帮助客户并解决他们遇到的任何问题(Cuvva 的每个人都会协助支持工作)

  • 我们团队的理想人选将具备:

  • 强烈的独立性和自我驱动力

  • 5 年以上商业 iOS 开发团队经验

  • 理解并重视良好测试覆盖率的重要性

  • 对苹果生态系统提供的独特机会感到兴奋

  • 点子多得不知如何是好

  • 对科技初创公司以及在此环境中工作的意义有深刻理解

  • 我们不是一个庞大的团队,因此成功的候选人不仅需要技术能力出众,还需要能为团队文化带来积极贡献!

关于我们的代码库:

目前是 Swift 和 SwiftUI 的混合,并有一些遗留的 ObjectiveC 代码。所有新功能都使用 Swift/UI 创建。我们正在逐步替换 ObjectiveC 代码,作为持续改进的一部分。

首选架构是 MVVM-C,如果您以前没有使用过,不用担心,我们可以帮助您过渡(我们只是非常讨厌臃肿的视图控制器?)

模块化方法——将应用程序分解成小块,有助于我们在专注且快速推进的功能团队中工作。

设计、可访问性和理解我们的客户是我们愿景的核心部分。设计是我们所做一切工作的关键部分,因此我们大力投资于设计系统,以此作为开发新功能的方法。我们希望确保客户的体验尽可能最佳,因此分析和可访问性已集成到每个组件中。

我们相信测试是工作不可或缺的一部分,并力求新代码达到良好的覆盖率水平。

福利待遇

  • 除了具有竞争力的薪水(75-90k 英镑,取决于经验)和基于股权的薪酬外,在 Cuvva 工作的福利还包括:
  • 专业发展预算
  • 全新的 MacBook
  • 健康和福利预算
  • 增强的育儿假
  • 工作场所养老金计划
  • 每年 33 天假期(包括公共假期)
  • 员工优惠保险费率
  • 非常灵活的家庭办公或办公室工作安排
  • 推荐朋友加入 Cuvva 团队的推荐奖金
  • 一天的志愿者服务假
  • 与我们的 Sanctus 教练进行一对一交流,为您提供一个谈论心理健康的私密空间
  • 储备充足的啤酒和软饮料冰箱——我们每周四举行团队饮品活动
  • 定期的团队午餐
  • 每月团队外出活动(到目前为止,我们做过卡拉 OK、卡丁车、保龄球和喜剧之夜等活动)
  • 摆满好书的办公室图书馆
  • 每天提供新鲜水果和早餐俱乐部
  • 通勤季票贷款
  • 自行车上班计划

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


更多关于Golang在Cuvva公司担任iOS工程师的工作体验分享 🚀的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang在Cuvva公司担任iOS工程师的工作体验分享 🚀的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


作为Go语言开发者,看到Cuvva的iOS工程师职位描述,虽然主要技术栈是Swift/SwiftUI,但其中体现的工程理念与Go语言社区高度契合。以下是几个值得关注的跨语言工程实践:

模块化架构

Go语言的模块化设计思想与Cuvva的代码组织方式完全一致。以下是Go中类似的模块化示例:

// 类似MVVM-C的清洁架构实现
package insurance

// Domain层 - 业务核心
type Policy struct {
    ID        string
    UserID    string
    StartTime time.Time
    EndTime   time.Time
}

// Repository层 - 数据访问
type PolicyRepository interface {
    FindByID(ctx context.Context, id string) (*Policy, error)
    Save(ctx context.Context, policy *Policy) error
}

// Service层 - 业务逻辑
type PolicyService struct {
    repo PolicyRepository
    validator *Validator
}

func (s *PolicyService) CreatePolicy(ctx context.Context, req CreatePolicyRequest) (*Policy, error) {
    if err := s.validator.Validate(req); err != nil {
        return nil, err
    }
    
    policy := &Policy{
        ID:        generateID(),
        UserID:    req.UserID,
        StartTime: req.StartTime,
        EndTime:   req.EndTime,
    }
    
    return policy, s.repo.Save(ctx, policy)
}

测试文化

Go内置的测试框架与Cuvva强调的测试覆盖率理念完美匹配:

// 表驱动测试示例
func TestPolicyService_CreatePolicy(t *testing.T) {
    tests := []struct {
        name    string
        request CreatePolicyRequest
        wantErr bool
    }{
        {
            name: "valid request",
            request: CreatePolicyRequest{
                UserID:    "user123",
                StartTime: time.Now(),
                EndTime:   time.Now().Add(time.Hour),
            },
            wantErr: false,
        },
        {
            name: "invalid duration",
            request: CreatePolicyRequest{
                UserID:    "user123",
                StartTime: time.Now(),
                EndTime:   time.Now().Add(-time.Hour), // 结束时间早于开始时间
            },
            wantErr: true,
        },
    }
    
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            svc := NewPolicyService(mockRepo, NewValidator())
            _, err := svc.CreatePolicy(context.Background(), tt.request)
            
            if (err != nil) != tt.wantErr {
                t.Errorf("CreatePolicy() error = %v, wantErr %v", err, tt.wantErr)
            }
        })
    }
}

并发处理

Go的并发模型适合处理保险业务中的实时计算:

// 使用goroutine处理实时保费计算
func CalculatePremiumConcurrently(policies []Policy) map[string]float64 {
    results := make(map[string]float64)
    var mu sync.Mutex
    var wg sync.WaitGroup
    
    for _, policy := range policies {
        wg.Add(1)
        go func(p Policy) {
            defer wg.Done()
            
            // 并发计算每个保单的保费
            premium := calculatePremium(p)
            
            mu.Lock()
            results[p.ID] = premium
            mu.Unlock()
        }(policy)
    }
    
    wg.Wait()
    return results
}

API设计

与平台团队协作制定API规范的Go实现:

// RESTful API设计
package api

import (
    "encoding/json"
    "net/http"
)

type PolicyHandler struct {
    service insurance.PolicyService
}

func (h *PolicyHandler) CreatePolicy(w http.ResponseWriter, r *http.Request) {
    var req CreatePolicyRequest
    if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
    
    policy, err := h.service.CreatePolicy(r.Context(), req)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusCreated)
    json.NewEncoder(w).Encode(policy)
}

// OpenAPI/Swagger文档集成
//go:generate swagger generate spec -o ./swagger.json

监控和可观察性

集成分析和监控的Go实现:

package monitoring

import (
    "context"
    "time"
)

type InstrumentedPolicyService struct {
    baseService insurance.PolicyService
    metrics     MetricsCollector
}

func (s *InstrumentedPolicyService) CreatePolicy(ctx context.Context, req insurance.CreatePolicyRequest) (*insurance.Policy, error) {
    start := time.Now()
    
    // 记录业务指标
    s.metrics.Increment("policy.creation.attempt")
    
    policy, err := s.baseService.CreatePolicy(ctx, req)
    
    // 记录执行时间和结果
    duration := time.Since(start)
    s.metrics.Histogram("policy.creation.duration", duration.Seconds())
    
    if err != nil {
        s.metrics.Increment("policy.creation.error")
    } else {
        s.metrics.Increment("policy.creation.success")
    }
    
    return policy, err
}

虽然技术栈不同,但Cuvva的工程实践——模块化、测试驱动、清洁架构——与Go语言的最佳实践高度一致。这种跨语言的工程理念迁移,正是现代云原生开发的核心竞争力。

回到顶部