Golang后端软件工程师职位(巴黎)

Golang后端软件工程师职位(巴黎) 如果您不完全确信自己符合我们的确切标准,也请尽管联系我们。谦逊是一种美好的品质——我们对您品格的关注至少与对您才华的关注一样多。

sennder,我们专注于实现所有公路物流的自动化和数字化。如今,我们是欧洲领先的货运代理公司,为托运人提供我们数千辆卡车的车队。技术是我们公司的支柱,我们正在快速发展,我们正在寻找有才华的工程师,他们希望参与为未来的物流运作方式铺平道路。

sennder 是一家快速成长的国际初创公司,在 6 个不同的国家设有办事处,团队由来自 50 多个国家的人员组成。

作为一名后端工程师,您将在巴黎柏林的某个自治团队中工作。我们重视强大的工程技能、对业务的深刻理解、完全的所有权、高速度、人员发展、协作和主动性。

您将负责的工作

  • 我们正在扩大我们的工程组织,我们有很多想法,我们正在寻找能够发展我们的后端、DevOps 和工程实践以支持增长并在许多自治团队中工作的人才。我们欢迎新的想法!
  • 您将设计、原型设计和构建新功能,更新现有功能并修复问题。
  • 我们需要您参与构建稳固的微服务架构,我们正在引入服务网格、稳定的接口以及 API、指标等的契约。
  • 我们将尽最大努力帮助您专业成长,为您提供指导和反馈。

我们希望您具备

  • 您在后端开发方面拥有良好的实践经验(3 年以上),特别是熟悉 Golang 生态系统。
  • 您能够与 PostgreSQLSQL 数据库进行交互。
  • 您了解如何构建现代的 API。例如,您使用过 REST (json:api)、gRPC 并使用 OpenAPI (Swagger) 记录它们。
  • 您不断增长对不同架构、模式和编程范式的了解。
  • 具备 Docker、Kubernetes 和现代 CI/CD 的实践技能。

我们提供

  • 作为一家初创公司,我们具有灵活性,没有官僚作风,您可以产生巨大影响并为我们的技术平台奠定基础。
  • 作为一家拥有成熟商业模式的公司,我们很稳定,拥有真实的用户,并提供不同的专业和职业发展选择。
  • 我们平等对待每个人,无论其背景、性取向、肤色和食物口味如何。
  • 灵活的工作时间和家庭办公室。

emoji 渴望了解更多?请发送电子邮件至 gabriela.dominguez@sennder.com


更多关于Golang后端软件工程师职位(巴黎)的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

你好, 我很乐意为你提供帮助。 已向你发送包含更多详细信息的电子邮件。 谢谢!

更多关于Golang后端软件工程师职位(巴黎)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


嗨 Gary,

目前我们暂不考虑自由职业者或B2B合同。感谢您对sennder的关注!

祝好, Gabriela

你好特丽莎,

感谢你的关注。

我尚未收到你的邮件,请检查我的邮箱用户。希望能尽快收到你的来信。

祝好, 加布里埃拉

您好, 我可以协助您满足您的需求。

电子邮件:garry@cisinlabs.com

Skype:cis.garry

此致, Garry

这是一个非常吸引人的职位描述,体现了sennder对技术和工程师文化的重视。对于符合要求的Golang工程师来说,这是一个绝佳的机会。以下从技术角度分析该职位的要求,并提供一些相关的Go代码示例,以展示候选人可能具备的技能。

技术栈契合度分析

职位描述中明确的技术栈与Go生态系统的现代实践高度一致:

  1. Golang 后端开发:要求3年以上经验,这是构建高性能、并发微服务的核心。
  2. PostgreSQL:Go通过database/sql包和驱动(如pgxlib/pq)与SQL数据库交互非常成熟。
  3. 现代API构建:包括REST(如JSON:API规范)和gRPC。Go在gRPC生态中是一等公民。
  4. 微服务与基础设施:Docker、Kubernetes和CI/CD是Go编写的云原生工具链的标准配置。

示例代码展示相关技能

以下是一些Go代码片段,展示了职位要求中提到的部分技术能力:

1. 使用标准库和pgx与PostgreSQL交互

package main

import (
    "context"
    "fmt"
    "github.com/jackc/pgx/v5"
)

type Shipment struct {
    ID     int
    Origin string
    Destination string
    Status string
}

func queryActiveShipments(ctx context.Context, conn *pgx.Conn) ([]Shipment, error) {
    const sql = `SELECT id, origin, destination, status FROM shipments WHERE status = $1`
    rows, err := conn.Query(ctx, sql, "in_transit")
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    var shipments []Shipment
    for rows.Next() {
        var s Shipment
        if err := rows.Scan(&s.ID, &s.Origin, &s.Destination, &s.Status); err != nil {
            return nil, err
        }
        shipments = append(shipments, s)
    }
    return shipments, rows.Err()
}

2. 实现一个符合JSON:API规范的RESTful端点(使用Gin框架示例)

package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

type APIResponse struct {
    Data interface{} `json:"data"`
}

type ShipmentResource struct {
    ID            string `json:"id"`
    Type          string `json:"type"`
    Attributes    struct {
        Origin      string `json:"origin"`
        Destination string `json:"destination"`
    } `json:"attributes"`
}

func getShipmentHandler(c *gin.Context) {
    shipmentID := c.Param("id")
    // 业务逻辑:从数据库或服务获取数据...
    resource := ShipmentResource{
        ID:   shipmentID,
        Type: "shipments",
        Attributes: struct {
            Origin      string `json:"origin"`
            Destination string `json:"destination"`
        }{
            Origin:      "Paris",
            Destination: "Berlin",
        },
    }
    c.JSON(http.StatusOK, APIResponse{Data: resource})
}

func main() {
    r := gin.Default()
    r.GET("/shipments/:id", getShipmentHandler)
    r.Run(":8080")
}

3. 定义gRPC服务原型(shipment.proto

syntax = "proto3";

package logistics.v1;

option go_package = "sennder/logistics/v1;logisticsv1";

service ShipmentService {
  rpc GetShipment(GetShipmentRequest) returns (Shipment);
  rpc StreamShipmentUpdates(StreamShipmentUpdatesRequest) returns (stream ShipmentUpdate);
}

message GetShipmentRequest {
  string shipment_id = 1;
}

message Shipment {
  string id = 1;
  string origin = 2;
  string destination = 3;
  string status = 4;
}

message StreamShipmentUpdatesRequest {
  string shipment_id = 1;
}

message ShipmentUpdate {
  string shipment_id = 1;
  string new_status = 2;
  int64 timestamp = 3;
}

使用protoc编译器生成Go代码后,可以轻松实现该服务端。

4. 使用context进行超时控制和指标收集(示例片段)

func processShipment(ctx context.Context, shipmentID string) error {
    // 设置带超时的上下文,防止请求堆积
    ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
    defer cancel()

    // 模拟一个数据库查询
    resultCh := make(chan *Shipment, 1)
    go func() {
        shipment, _ := fetchShipmentFromDB(ctx, shipmentID) // 假设的DB查询函数
        resultCh <- shipment
    }()

    select {
    case <-ctx.Done():
        // 记录超时指标
        metrics.Increment("shipment_query_timeout")
        return ctx.Err()
    case s := <-resultCh:
        if s != nil {
            // 记录成功指标
            metrics.Increment("shipment_processed")
        }
        return nil
    }
}

对“微服务架构”和“服务网格”的思考

sennder提到正在引入服务网格和稳定的接口。在Go中,这通常意味着:

  • 使用gRPC作为服务间通信的首选协议,利用其强类型接口和高效二进制编码。
  • 可能集成IstioLinkerd等服务网格,通过sidecar代理(如Envoy)处理服务发现、负载均衡和可观测性,而业务代码保持简洁。
  • 使用OpenAPI/Swagger严格定义对外的REST API契约,并使用工具(如oapi-codegen)生成类型安全的服务器和客户端代码。

总结

这个职位非常适合那些不仅精通Go语言,而且对构建可扩展、可维护的分布式系统有深刻理解的工程师。技术栈的选择(Go、PostgreSQL、gRPC、Kubernetes)是构建现代物流平台的一个强大组合。候选人应准备好展示他们在这些领域的实践经验,以及他们在自治团队中推动工程实践发展的能力。

回到顶部