Golang后端资深软件工程师招聘 - 远程岗位

Golang后端资深软件工程师招聘 - 远程岗位 如有兴趣,请联系:mindy.cruz@tendermint.com点击此处申请

关于我们

Tendermint 成立于 2014 年,是 Cosmos 生态系统的创造者,这是一个由可互操作的区块链组成的生态系统。我们是一家专注于 Cosmos SDK 和 Starport 的软件工程公司,这些是用于区块链开发的最先进框架。使用 Cosmos SDK 构建的 200 多个区块链,保障了价值超过 1000 亿美元的数字资产。

我们是充满激情、自我驱动的行业领导者,我们的愿景是通过开放、分布式和可互操作的网络,赋能人们创建一个更加透明和负责任的世界。我们相信,我们正在构建的技术将对人类在全球范围内的连接和协调方式产生重大的积极影响。加入我们不断壮大的国际团队,帮助我们构建世界上最受欢迎的多区块链生态系统。

我们的工作方式

我们的团队成员遍布全球,从北美、欧洲到中东和亚洲。我们利用敏捷方法来快速行动并保持专注。沟通对我们至关重要,我们严重依赖 Slack、Google Workspace、Asana、Notion 和 GitHub 来帮助我们保持同步。我们构建的所有技术都是免费和开源的。

此职位是一个全职远程职位,您可以在任何地方自由工作。请注意,大多数团队会议在太平洋时间上午 8 点至中午 12 点(UTC-8/-7)之间进行。如果您申请的地点这些时间超出您的常规工作时间,我们希望您能适应我们的会议时间。

您将负责的工作:

  • 领导跨链钱包应用后端服务的设计、开发和维护,包括从各种全节点进行数据摄取和索引,以及管理敏感链相关数据的 API 和自定义组件。
  • 帮助构建一个去中心化、可扩展的数据索引服务,该服务兼容各种异构区块链,旨在为跨链钱包提供数据服务。
  • 在跨职能环境中与产品负责人和技术团队合作,实施满足业务目标的高质量产品。
  • 通过定义高层架构、原则和标准,帮助塑造系统架构的方向。
  • 通过代码审查、验收测试、错误修复和一般支持来协助工程师。
  • 在考虑用户体验和实现细节的前提下,集思广益并开发新功能。

我们正在寻找具备以下条件的人:

  • 计算机科学或经济学学士学位(或同等工作经验)。
  • 7 年以上软件开发经验,并具备区块链技术的相关经验。
  • 在企业技术应用程序架构、设计、开发和支持方面拥有丰富的实践经验。
  • 在分布式数据处理后端技术(如 Hadoop 分布式文件系统、Apache Kudu 和 Presto)方面拥有丰富经验。
  • 在 Golang 中设计和编写高质量代码的第一手经验。
  • 能够编写生产级质量的代码。
  • 拥有按时、按预算交付应用程序的良好记录。
  • 在敏捷环境中与分布式团队合作的经验。
  • 具备 GraphQL 经验者优先。
  • 能够成为服务型领导者,鼓励同事分享他们的想法,无论其资历或公司职位如何。

加分项:

  • 具有 Tendermint 和 Cosmos-SDK 经验。
  • 了解 PBFT 或 Raft 等容错共识协议。

我们提供的福利:

  • 参与构建未来互联网的机会
  • 灵活的工作时间安排
  • 优厚的福利,如教育预算、健身和健康支出
  • 灵活的带薪休假
  • 为美国员工提供 100% 覆盖的医疗、牙科和视力保险
  • 美国员工享受 401K 匹配计划
  • 具有竞争力的薪酬,包括股权

更多关于Golang后端资深软件工程师招聘 - 远程岗位的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

您好,

我对这个职位很感兴趣。 我已从 maria@cisinlabs.com 向您发送了一封电子邮件。 如果我们可以安排一次 Skype 通话或 Zoom 会议进行详细讨论,那就太好了。 Skype ID:live:.cid.e0656fece75456e6

此致 Maria

更多关于Golang后端资深软件工程师招聘 - 远程岗位的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


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

请通过Skype联系我,账号是cis.garry,或者给我发邮件至 garry.c@talentsfrominida.com,以便进一步详细讨论。

此致, Garry

从技术角度看,这个职位对Golang后端工程师的要求相当专业,特别是涉及区块链和分布式数据处理领域。以下是针对技术要求的具体分析和示例:

1. 分布式数据处理后端技术 职位要求具备Hadoop、Apache Kudu和Presto等技术的实践经验。在Golang中集成这些系统时,通常需要使用相应的SDK或REST API。例如,与Presto交互可以通过其HTTP接口:

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "net/http"
)

type PrestoQuery struct {
    Query string `json:"query"`
}

func executePrestoQuery(query string) (map[string]interface{}, error) {
    url := "http://presto-server:8080/v1/statement"
    payload := PrestoQuery{Query: query}
    jsonData, _ := json.Marshal(payload)
    
    resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
    
    var result map[string]interface{}
    json.NewDecoder(resp.Body).Decode(&result)
    return result, nil
}

2. 区块链数据索引服务 构建跨链数据索引服务需要处理异构区块链的数据结构。以下是一个简化的多链数据处理器示例:

type BlockData struct {
    ChainID string
    Height  int64
    Txs     []Transaction
}

type Indexer interface {
    ParseBlock(rawData []byte) (BlockData, error)
    GetChainType() string
}

func ProcessBlockchainData(indexer Indexer, rawData []byte) error {
    blockData, err := indexer.ParseBlock(rawData)
    if err != nil {
        return err
    }
    
    // 存储到分布式文件系统
    if err := StoreToHDFS(blockData); err != nil {
        return err
    }
    
    // 更新索引
    UpdatePrestoIndex(blockData)
    return nil
}

3. 生产级Golang代码质量 职位强调生产级代码质量,这包括完善的错误处理、监控和测试:

type APIService struct {
    dataIndexer Indexer
    logger      *zap.Logger
    metrics     *prometheus.Registry
}

func (s *APIService) HandleBlockRequest(w http.ResponseWriter, r *http.Request) {
    startTime := time.Now()
    
    rawData, err := ioutil.ReadAll(r.Body)
    if err != nil {
        s.logger.Error("failed to read request", zap.Error(err))
        s.metrics.Counter("request_errors").Inc()
        http.Error(w, "bad request", http.StatusBadRequest)
        return
    }
    
    if err := s.dataIndexer.Process(rawData); err != nil {
        s.logger.Error("processing failed", zap.Error(err))
        s.metrics.Counter("processing_errors").Inc()
        http.Error(w, "processing error", http.StatusInternalServerError)
        return
    }
    
    s.metrics.Histogram("request_duration").Observe(time.Since(startTime).Seconds())
    w.WriteHeader(http.StatusOK)
}

4. Cosmos SDK集成 对于有Cosmos SDK经验的候选人,以下示例展示如何与Tendermint核心交互:

import (
    "github.com/cosmos/cosmos-sdk/client"
    "github.com/tendermint/tendermint/rpc/client/http"
)

func QueryCosmosBlock(height int64) (*ctypes.ResultBlock, error) {
    // 创建Tendermint HTTP客户端
    tmClient, err := http.New("http://localhost:26657", "/websocket")
    if err != nil {
        return nil, err
    }
    
    // 查询指定高度的区块
    result, err := tmClient.Block(&height)
    if err != nil {
        return nil, err
    }
    
    return result, nil
}

5. GraphQL API实现 职位提到GraphQL经验优先,以下是Golang中GraphQL服务器的基本实现:

import (
    "github.com/graphql-go/graphql"
    "github.com/graphql-go/handler"
)

var blockType = graphql.NewObject(graphql.ObjectConfig{
    Name: "Block",
    Fields: graphql.Fields{
        "height": &graphql.Field{Type: graphql.Int},
        "chain_id": &graphql.Field{Type: graphql.String},
    },
})

func SetupGraphQL() http.Handler {
    schema, _ := graphql.NewSchema(graphql.SchemaConfig{
        Query: graphql.NewObject(graphql.ObjectConfig{
            Name: "Query",
            Fields: graphql.Fields{
                "block": &graphql.Field{
                    Type: blockType,
                    Args: graphql.FieldConfigArgument{
                        "height": &graphql.ArgumentConfig{Type: graphql.Int},
                    },
                    Resolve: func(p graphql.ResolveParams) (interface{}, error) {
                        return FetchBlockData(p.Args["height"].(int64))
                    },
                },
            },
        }),
    })
    
    return handler.New(&handler.Config{
        Schema: &schema,
        Pretty: true,
    })
}

这个职位需要工程师具备将分布式系统、区块链技术和生产级Golang开发相结合的能力。代码示例展示了在实际工作中可能遇到的技术场景实现方式。

回到顶部