Golang软件工程师(全栈/远程)职位招聘 @ United Internet

Golang软件工程师(全栈/远程)职位招聘 @ United Internet IONOS凭借其商业应用,是欧洲领先的主机和云应用提供商之一。我们凭借先进的技术,每天赢得来自许多不同国家的超过800万客户的信赖。

您的职责

1&1、IONOS、WEB.DE、GMX和MAIL.COM等品牌依赖于电子支付的可靠处理以及与相关后端系统的顺畅交互。

作为我们敏捷团队中的一名软件开发人员,您将开发并运营符合高安全标准的创新型支付和欺诈预防应用程序。作为一位称职的联络人,您将在项目流程中发挥积极作用,该流程紧跟当前技术趋势,跳出固有思维模式,并得益于日常的学习意愿。您将发挥您的创造力,同时不忽视客户的视角。我们正在为我们的专业团队寻找即时增援。您的职责包括:

  • 使用REST API(Go 1.17+、Gin Gonic 1.8+、PHP 7/8)实现并进一步发展我们的应用验证和支付系统。
  • 连接来自例如IONOS、United Internet、1&1和Web.de/GMX的业务系统。
  • 为构建一个安全且高可用的系统做出贡献。您将与其他DevOps团队和外部服务提供商紧密合作。
  • 通过自动化测试(单元测试和测试驱动开发)以及持续集成的整合,持续确保高质量标准。
  • 根据跨职能团队中的项目情况,通过跨项目协作承担接口功能。

我们看重

您成功的基础是计算机科学大学学位或同等资质。您拥有扎实的面向对象软件开发经验,最好是在分布式Linux系统方面。您绝对需要具备的是对编程的热情。如果您符合以下条件,您将拥有最佳的先决条件:

  • 您对Go和/或PHP以及面向服务的架构有良好的了解。
  • 软件安全以及持续的责任感对您而言至关重要。
  • 在支付环境/电子商务方面的经验以及对互联网技术的高度兴趣是一个优势(但非强制要求)。
  • 了解关系型数据库(例如PostgreSQL)。
  • 乐趣、高度的积极性和创造力将使您的个人资料更加完整。

在此申请


更多关于Golang软件工程师(全栈/远程)职位招聘 @ United Internet的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

您好 Vanessa 和 Garry,

如果您对这份工作感兴趣,请通过申请链接提交申请。这是一份全职工作,要求在德国拥有永久居留权,任何申请者都应准备好搬迁。

此致, Pawel

更多关于Golang软件工程师(全栈/远程)职位招聘 @ United Internet的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好 @pkuzak

我很乐意帮助你。

如需进一步详细讨论,请通过邮件 garry@cisinlabs.com 或 Skype: cis.garry 联系我。

期待你的回复。

谢谢

Garry

你好 @pkuzak

希望你一切顺利。

我很乐意承接你的需求。

请将你的需求详情通过我的邮箱发送给我:Vanessa.ci@talentsfromindia.com,以便我们进行讨论。

期待你的回复。

此致, Vanessa J Skype : Vanessa_12766

你好,

IONOS 的软件开发职位提供了一个令人兴奋的机会,可以参与使用 Go 和 PHP 开发创新的支付和欺诈预防应用程序。如果你对安全系统充满热情,并喜欢充满活力、协作的环境,那么这个职位可能非常适合你。

祝所有申请者好运!

这是一个非常典型的Go语言全栈开发职位,对技术栈的描述相当清晰。从职责和要求来看,团队主要使用Go 1.17+和Gin框架构建REST API,同时涉及PHP和分布式系统。

以下是基于职位描述中Go技术栈的具体示例:

1. Gin框架REST API实现示例:

package main

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

type PaymentRequest struct {
    Amount   float64 `json:"amount" binding:"required"`
    Currency string  `json:"currency" binding:"required"`
    UserID   string  `json:"user_id" binding:"required"`
}

func main() {
    r := gin.Default()
    
    // 支付验证端点
    r.POST("/api/v1/payment/verify", func(c *gin.Context) {
        var req PaymentRequest
        if err := c.ShouldBindJSON(&req); err != nil {
            c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
            return
        }
        
        // 业务逻辑:欺诈检测和验证
        if isValid := validatePayment(req); !isValid {
            c.JSON(http.StatusBadRequest, gin.H{"error": "Payment validation failed"})
            return
        }
        
        c.JSON(http.StatusOK, gin.H{"status": "verified", "transaction_id": generateID()})
    })
    
    // 健康检查端点(高可用性要求)
    r.GET("/health", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{"status": "healthy", "service": "payment-api"})
    })
    
    r.Run(":8080")
}

func validatePayment(req PaymentRequest) bool {
    // 实现实际的支付验证和欺诈检测逻辑
    return req.Amount > 0 && req.Currency != ""
}

2. 自动化测试示例(单元测试):

package payment

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

func TestPaymentValidation(t *testing.T) {
    tests := []struct {
        name    string
        amount  float64
        currency string
        expected bool
    }{
        {"Valid payment", 100.0, "EUR", true},
        {"Zero amount", 0.0, "USD", false},
        {"Negative amount", -50.0, "GBP", false},
        {"Empty currency", 100.0, "", false},
    }
    
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            req := PaymentRequest{
                Amount:   tt.amount,
                Currency: tt.currency,
                UserID:   "test-user",
            }
            
            result := validatePayment(req)
            assert.Equal(t, tt.expected, result, "Validation failed for test case: %s", tt.name)
        })
    }
}

3. PostgreSQL集成示例:

package repository

import (
    "context"
    "database/sql"
    _ "github.com/lib/pq"
)

type PaymentRepository struct {
    db *sql.DB
}

func NewPaymentRepository(connStr string) (*PaymentRepository, error) {
    db, err := sql.Open("postgres", connStr)
    if err != nil {
        return nil, err
    }
    
    return &PaymentRepository{db: db}, nil
}

func (r *PaymentRepository) SaveTransaction(ctx context.Context, tx *PaymentTransaction) error {
    query := `
        INSERT INTO transactions 
        (id, user_id, amount, currency, status, created_at) 
        VALUES ($1, $2, $3, $4, $5, NOW())
    `
    
    _, err := r.db.ExecContext(ctx, query,
        tx.ID,
        tx.UserID,
        tx.Amount,
        tx.Currency,
        tx.Status,
    )
    
    return err
}

func (r *PaymentRepository) FindFraudulentPatterns(ctx context.Context, userID string) ([]FraudPattern, error) {
    query := `
        SELECT pattern_type, severity, detected_at 
        FROM fraud_patterns 
        WHERE user_id = $1 AND detected_at > NOW() - INTERVAL '24 hours'
    `
    
    rows, err := r.db.QueryContext(ctx, query, userID)
    if err != nil {
        return nil, err
    }
    defer rows.Close()
    
    var patterns []FraudPattern
    for rows.Next() {
        var p FraudPattern
        if err := rows.Scan(&p.PatternType, &p.Severity, &p.DetectedAt); err != nil {
            return nil, err
        }
        patterns = append(patterns, p)
    }
    
    return patterns, nil
}

4. 安全中间件示例:

package middleware

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

func SecurityHeaders() gin.HandlerFunc {
    return func(c *gin.Context) {
        c.Header("X-Content-Type-Options", "nosniff")
        c.Header("X-Frame-Options", "DENY")
        c.Header("X-XSS-Protection", "1; mode=block")
        c.Header("Strict-Transport-Security", "max-age=31536000; includeSubDomains")
        c.Next()
    }
}

func APIAuthentication(apiKeys map[string]string) gin.HandlerFunc {
    return func(c *gin.Context) {
        authHeader := c.GetHeader("Authorization")
        if authHeader == "" {
            c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header required"})
            c.Abort()
            return
        }
        
        parts := strings.Split(authHeader, "Bearer ")
        if len(parts) != 2 {
            c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid authorization format"})
            c.Abort()
            return
        }
        
        apiKey := parts[1]
        if _, valid := apiKeys[apiKey]; !valid {
            c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid API key"})
            c.Abort()
            return
        }
        
        c.Next()
    }
}

这个职位要求的技术栈组合很实用:Go用于高性能API、PHP用于遗留系统集成、PostgreSQL用于数据持久化、Gin用于Web框架。支付和欺诈预防领域对代码质量和安全性有很高要求,这也是为什么职位描述中特别强调自动化测试和软件安全。

回到顶部