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
更多关于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流程都有明确要求。应聘者需要展示在分布式系统、实时通信和云基础设施方面的实际经验。

