Golang高级后端工程师招聘(EST和CST时区)

Golang高级后端工程师招聘(EST和CST时区) 申请方式https://www.linkedin.com/jobs/view/2364197275

我们的客户是一家Y-Combinator校友初创公司,他们构建了一个平台和工具,旨在自动化与客户的远程沟通……同时又不失人情味!

他们的核心后端使用Go语言构建,并使用Python进行端到端测试。他们一直在积极探索最适合其客户和工程师需求的新技术。他们坚信应该为工作选择最佳的工具,并且更看重工程专业知识而非语言熟练度。

他们重视:文档、测试覆盖率、文档、代码审查、文档、CI/CD以及文档。

如果您符合以下情况,应该申请:

  • 您热衷于构建精心设计的软件,并创造出色的开发者体验。
  • 您希望构建一个自己也会使用的产品,并以工程师的身份,将您独特的见解和视角带到产品整体规划的讨论中。
  • 您喜欢解决重大问题。他们最大的挑战就在眼前,需要经验丰富、聪明、勤奋且富有创造力的头脑来解决基础架构挑战,以进一步确立其SaaS平台作为领先的B2C消息平台的地位。
  • 您重视协作、自主权、快速行动并完成大量工作。我们没有时间也不喜欢官僚主义和微观管理——我们正在快速前进,您需要负责端到端的产品交付。
  • 您希望产生巨大影响,并分享您帮助建立的公司的成功。

如果您符合以下情况,可能适合这个职位:

  • 拥有强大的技术背景,包括7年以上构建有影响力的产品或系统的经验
  • 拥有2年以上的Go语言经验
  • 具备出色的沟通技巧,并且合作愉快
  • 乐于采取一切必要措施解决问题,并确保项目顺利完成
  • 为设计、构建和维护大规模API、服务和系统而感到自豪
  • 认为改进工程标准、工具和流程是有益的
  • 坚持工程、安全和设计方面的最佳实践
  • 在生产环境中工作时,对自己和他人保持高度的责任感
  • 能够有效地调试整个技术栈中的复杂问题
  • 乐于采取一切必要措施解决问题并取悦用户
  • 拥有AWS经验
  • 拥有实时网络技术经验 - WebSockets / WebRTC
  • 拥有CI/CD经验

您将要做的事情:

  • 在协作环境中茁壮成长,制定并执行短期和长期路线图,在考虑业务优先级的同时做出有效的权衡,但始终将用户体验放在心上
  • 在一个不断增长、快节奏的初创环境中,编写高质量、高性能的代码,这些代码将获得大量曝光和用户反馈
  • 指导和培养初级工程师,使他们成为下一代顶级工程师
  • 结合软件最佳实践、系统设计和产品路线图来为关键决策提供信息
  • 清晰审视并论证我们在构建平台或产品/服务时所做的技术和架构选择
  • 通过开发、分享和设定工程质量的标杆,成为软件设计和可扩展系统架构的榜样

更多关于Golang高级后端工程师招聘(EST和CST时区)的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

你好 @IncendiaRecruiters

很乐意为你提供帮助! 请查看私信 祝你度过愉快的一天

谢谢 Austin Skype: austin_3383

更多关于Golang高级后端工程师招聘(EST和CST时区)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好! 希望你一切顺利。

我可以帮助你满足你的需求。

请通过邮件 luis@cisinlabs.com 或 Skype live: luis_18439 与我联系。

期待尽快收到你的回复。

祝你度过愉快的一天。

此致, Luis

根据这个招聘要求,这是一个对Go语言高级工程师要求非常全面的职位。以下是我对这个职位技术要求的专业分析:

核心技术栈分析

Go语言要求

这个职位需要2年以上的Go语言经验,结合7年整体经验,说明他们需要的是有深厚工程背景的Go开发者。从描述看,他们的后端系统应该是:

// 典型的Go后端服务结构示例
package main

import (
    "context"
    "net/http"
    "time"
    
    "github.com/gorilla/websocket"
    "github.com/gin-gonic/gin"
)

// WebSocket处理示例
type WebSocketHandler struct {
    upgrader websocket.Upgrader
    clients  map[*websocket.Conn]bool
}

func (h *WebSocketHandler) HandleConnection(c *gin.Context) {
    conn, err := h.upgrader.Upgrader(c.Writer, c.Request, nil)
    if err != nil {
        return
    }
    defer conn.Close()
    
    h.clients[conn] = true
    defer delete(h.clients, conn)
    
    for {
        messageType, message, err := conn.ReadMessage()
        if err != nil {
            break
        }
        // 处理实时消息
        h.broadcastMessage(messageType, message)
    }
}

// REST API示例
func setupAPIServer() *gin.Engine {
    r := gin.Default()
    
    // 健康检查
    r.GET("/health", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{"status": "healthy"})
    })
    
    // API版本控制
    v1 := r.Group("/api/v1")
    {
        v1.POST("/messages", handleCreateMessage)
        v1.GET("/messages/:id", handleGetMessage)
        v1.GET("/messages", handleListMessages)
    }
    
    return r
}

实时通信技术要求

职位明确提到WebSockets/WebRTC经验,这表明系统需要处理实时双向通信:

// WebRTC信令服务器示例
package signaling

import (
    "encoding/json"
    "log"
    "sync"
    
    "github.com/gorilla/websocket"
)

type SignalMessage struct {
    Type    string          `json:"type"`
    From    string          `json:"from"`
    To      string          `json:"to"`
    Payload json.RawMessage `json:"payload"`
}

type SignalingServer struct {
    mu      sync.RWMutex
    clients map[string]*websocket.Conn
}

func (s *SignalingServer) HandleSignaling(conn *websocket.Conn, clientID string) {
    s.mu.Lock()
    s.clients[clientID] = conn
    s.mu.Unlock()
    
    defer func() {
        s.mu.Lock()
        delete(s.clients, clientID)
        s.mu.Unlock()
        conn.Close()
    }()
    
    for {
        var msg SignalMessage
        err := conn.ReadJSON(&msg)
        if err != nil {
            log.Printf("Read error: %v", err)
            break
        }
        
        // 转发信令消息
        s.routeSignal(msg)
    }
}

AWS云架构

考虑到SaaS平台和B2C消息平台的特点,典型的AWS架构可能包括:

// AWS服务集成示例
package aws

import (
    "context"
    
    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/service/dynamodb"
    "github.com/aws/aws-sdk-go-v2/service/s3"
    "github.com/aws/aws-sdk-go-v2/service/sqs"
)

type AWSServices struct {
    DynamoDB *dynamodb.Client
    S3       *s3.Client
    SQS      *sqs.Client
}

func NewAWSServices(cfg aws.Config) *AWSServices {
    return &AWSServices{
        DynamoDB: dynamodb.NewFromConfig(cfg),
        S3:       s3.NewFromConfig(cfg),
        SQS:      sqs.NewFromConfig(cfg),
    }
}

// 消息队列处理示例
func (s *AWSServices) ProcessMessages(ctx context.Context, queueURL string) error {
    for {
        output, err := s.SQS.ReceiveMessage(ctx, &sqs.ReceiveMessageInput{
            QueueUrl:            &queueURL,
            MaxNumberOfMessages: 10,
            WaitTimeSeconds:     20,
        })
        if err != nil {
            return err
        }
        
        for _, msg := range output.Messages {
            // 处理消息
            if err := s.processMessage(ctx, *msg.Body); err == nil {
                // 处理成功后删除消息
                s.SQS.DeleteMessage(ctx, &sqs.DeleteMessageInput{
                    QueueUrl:      &queueURL,
                    ReceiptHandle: msg.ReceiptHandle,
                })
            }
        }
    }
}

CI/CD和测试要求

测试覆盖率示例

// 高测试覆盖率的Go代码示例
package messaging

import (
    "testing"
    "time"
    
    "github.com/stretchr/testify/assert"
    "github.com/stretchr/testify/require"
)

func TestMessageService_SendMessage(t *testing.T) {
    t.Run("successful message send", func(t *testing.T) {
        service := NewMessageService()
        msg := &Message{
            ID:        "test-123",
            Content:   "Hello World",
            Timestamp: time.Now(),
        }
        
        err := service.Send(msg)
        require.NoError(t, err)
        assert.Equal(t, MessageStatusSent, msg.Status)
    })
    
    t.Run("message validation failure", func(t *testing.T) {
        service := NewMessageService()
        msg := &Message{
            ID:      "test-456",
            Content: "", // 空内容应该失败
        }
        
        err := service.Send(msg)
        require.Error(t, err)
        assert.Contains(t, err.Error(), "content cannot be empty")
    })
}

// 集成测试示例
func TestWebSocketIntegration(t *testing.T) {
    server := httptest.NewServer(http.HandlerFunc(handleWebSocket))
    defer server.Close()
    
    u := "ws" + strings.TrimPrefix(server.URL, "http") + "/ws"
    conn, _, err := websocket.DefaultDialer.Dial(u, nil)
    require.NoError(t, err)
    defer conn.Close()
    
    // 测试消息发送和接收
    testMsg := `{"type": "ping"}`
    err = conn.WriteMessage(websocket.TextMessage, []byte(testMsg))
    require.NoError(t, err)
    
    _, response, err := conn.ReadMessage()
    require.NoError(t, err)
    assert.JSONEq(t, `{"type": "pong"}`, string(response))
}

CI/CD Pipeline关键点

# .github/workflows/ci.yml 示例
name: Go CI/CD Pipeline

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    
    - name: Set up Go
      uses: actions/setup-go@v2
      with:
        go-version: '1.21'
    
    - name: Run tests with coverage
      run: |
        go test ./... -v -coverprofile=coverage.out
        go tool cover -func=coverage.out
    
    - name: Upload coverage to Codecov
      uses: codecov/codecov-action@v2
      
  build:
    needs: test
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    
    - name: Build Docker image
      run: |
        docker build -t app:latest .
        
    - name: Scan for vulnerabilities
      uses: aquasecurity/trivy-action@master
      with:
        image-ref: 'app:latest'
        
  deploy:
    needs: build
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
    - name: Deploy to AWS ECS
      run: |
        aws ecs update-service \
          --cluster production \
          --service api-service \
          --force-new-deployment

系统设计考量

可扩展架构模式

// 微服务通信示例
package service

import (
    "context"
    "encoding/json"
    
    "go.uber.org/zap"
    "google.golang.org/grpc"
)

type ServiceRegistry struct {
    services map[string]string
    logger   *zap.Logger
}

func (r *ServiceRegistry) CallService(ctx context.Context, serviceName string, method string, request interface{}) (interface{}, error) {
    endpoint, ok := r.services[serviceName]
    if !ok {
        return nil, ErrServiceNotFound
    }
    
    conn, err := grpc.DialContext(ctx, endpoint, grpc.WithInsecure())
    if err != nil {
        r.logger.Error("Failed to connect to service",
            zap.String("service", serviceName),
            zap.Error(err))
        return nil, err
    }
    defer conn.Close()
    
    // 根据服务名和方法进行RPC调用
    return r.invokeGRPC(ctx, conn, method, request)
}

// 限流和熔断示例
package middleware

import (
    "net/http"
    "time"
    
    "golang.org/x/time/rate"
)

func RateLimitMiddleware(next http.Handler, rps int) http.Handler {
    limiter := rate.NewLimiter(rate.Limit(rps), rps)
    
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if !limiter.Allow() {
            http.Error(w, "Too many requests", http.StatusTooManyRequests)
            return
        }
        next.ServeHTTP(w, r)
    })
}

这个职位对Go开发者的要求非常全面,从基础的API开发到复杂的实时通信系统,再到云原生架构和完整的CI/CD流程都有明确要求。应聘者需要展示在分布式系统、实时通信和云基础设施方面的实际经验。

回到顶部