Golang后端软件工程师职位(巴黎)
Golang后端软件工程师职位(巴黎) 如果您不完全确信自己符合我们的确切标准,也请尽管联系我们。谦逊是一种美好的品质——我们对您品格的关注至少与对您才华的关注一样多。
在sennder,我们专注于实现所有公路物流的自动化和数字化。如今,我们是欧洲领先的货运代理公司,为托运人提供我们数千辆卡车的车队。技术是我们公司的支柱,我们正在快速发展,我们正在寻找有才华的工程师,他们希望参与为未来的物流运作方式铺平道路。
sennder 是一家快速成长的国际初创公司,在 6 个不同的国家设有办事处,团队由来自 50 多个国家的人员组成。
作为一名后端工程师,您将在巴黎或柏林的某个自治团队中工作。我们重视强大的工程技能、对业务的深刻理解、完全的所有权、高速度、人员发展、协作和主动性。
您将负责的工作
- 我们正在扩大我们的工程组织,我们有很多想法,我们正在寻找能够发展我们的后端、DevOps 和工程实践以支持增长并在许多自治团队中工作的人才。我们欢迎新的想法!
- 您将设计、原型设计和构建新功能,更新现有功能并修复问题。
- 我们需要您参与构建稳固的微服务架构,我们正在引入服务网格、稳定的接口以及 API、指标等的契约。
- 我们将尽最大努力帮助您专业成长,为您提供指导和反馈。
我们希望您具备
- 您在后端开发方面拥有良好的实践经验(3 年以上),特别是熟悉 Golang 生态系统。
- 您能够与 PostgreSQL 等 SQL 数据库进行交互。
- 您了解如何构建现代的 API。例如,您使用过 REST (json:api)、gRPC 并使用 OpenAPI (Swagger) 记录它们。
- 您不断增长对不同架构、模式和编程范式的了解。
- 具备 Docker、Kubernetes 和现代 CI/CD 的实践技能。
我们提供
- 作为一家初创公司,我们具有灵活性,没有官僚作风,您可以产生巨大影响并为我们的技术平台奠定基础。
- 作为一家拥有成熟商业模式的公司,我们很稳定,拥有真实的用户,并提供不同的专业和职业发展选择。
- 我们平等对待每个人,无论其背景、性取向、肤色和食物口味如何。
- 灵活的工作时间和家庭办公室。
渴望了解更多?请发送电子邮件至 gabriela.dominguez@sennder.com
更多关于Golang后端软件工程师职位(巴黎)的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你好, 我很乐意为你提供帮助。 已向你发送包含更多详细信息的电子邮件。 谢谢!
更多关于Golang后端软件工程师职位(巴黎)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
嗨 Gary,
目前我们暂不考虑自由职业者或B2B合同。感谢您对sennder的关注!
祝好, Gabriela
你好特丽莎,
感谢你的关注。
我尚未收到你的邮件,请检查我的邮箱用户。希望能尽快收到你的来信。
祝好, 加布里埃拉
这是一个非常吸引人的职位描述,体现了sennder对技术和工程师文化的重视。对于符合要求的Golang工程师来说,这是一个绝佳的机会。以下从技术角度分析该职位的要求,并提供一些相关的Go代码示例,以展示候选人可能具备的技能。
技术栈契合度分析
职位描述中明确的技术栈与Go生态系统的现代实践高度一致:
- Golang 后端开发:要求3年以上经验,这是构建高性能、并发微服务的核心。
- PostgreSQL:Go通过
database/sql包和驱动(如pgx或lib/pq)与SQL数据库交互非常成熟。 - 现代API构建:包括REST(如JSON:API规范)和gRPC。Go在gRPC生态中是一等公民。
- 微服务与基础设施: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作为服务间通信的首选协议,利用其强类型接口和高效二进制编码。
- 可能集成Istio或Linkerd等服务网格,通过sidecar代理(如Envoy)处理服务发现、负载均衡和可观测性,而业务代码保持简洁。
- 使用OpenAPI/Swagger严格定义对外的REST API契约,并使用工具(如
oapi-codegen)生成类型安全的服务器和客户端代码。
总结
这个职位非常适合那些不仅精通Go语言,而且对构建可扩展、可维护的分布式系统有深刻理解的工程师。技术栈的选择(Go、PostgreSQL、gRPC、Kubernetes)是构建现代物流平台的一个强大组合。候选人应准备好展示他们在这些领域的实践经验,以及他们在自治团队中推动工程实践发展的能力。

