RStudio远程招聘Golang软件工程师(加拿大地区)

RStudio远程招聘Golang软件工程师(加拿大地区) RStudio 正在为 RStudio 包管理器 团队招聘一名软件工程师。RStudio 包管理器是一款用于组织和集中管理 R 和 Python 包的软件,它允许我们的客户共享本地包,并与其他公共包仓库协同工作。它具有导航快照、限制使用中的包以及离线工作等独特功能。我们致力于满足数据科学家的需求,同时让 IT 管理员的工作更轻松。该团队还负责管理 RStudio 公共包管理器服务以及 R 包的系统要求。

我们正在招聘一名软件工程师,主要负责后端代码开发,但也需要具备偶尔进行前端修改的能力。我们目前使用 Go、Vue、JavaScript、R 和 Amazon Web Services,但我们不要求您第一天就掌握所有这些技术。您将与另外四名软件工程师组成的团队一起工作,并得到一名质量保证工程师和设计师的支持。

对于这个职位,我们正在寻找具备以下条件的人:

  • 拥有 2 年以上在生产环境中构建、交付和维护软件的经验。我们也欢迎经验更丰富的候选人。
  • 拥有使用 Vue、React、Angular 或类似现代框架构建 Web 应用程序的经验。
  • 拥有编写自动化测试和可测试代码的经验。

关于您

您认同我们构建优秀软件的承诺,并且欣赏简洁的设计、清晰的代码和令人愉悦的用户体验。您热爱学习并乐于帮助他人成功。您谦逊、务实、审慎,并对您的客户和同事抱有强烈的同理心。您还具备:

  • 在专业环境中使用高级面向对象语言(Go、Python、Node.js、Java、C# 或类似语言)进行编程的经验。
  • 渴望理解可扩展的系统架构。
  • 对用户界面的可用性和设计感兴趣。
  • 热爱编写精良的文档。
  • 热衷于让事物变得比您发现时更好。

关于我们

  • RStudio 是一家公益公司 (PBC) 和认证的 B 型企业®,这意味着我们的开源使命已写入公司章程,并且我们的公司决策会平衡社区、客户、员工和股东的利益。
  • 我们欢迎所有有才华的同事,并致力于营造一个代表各种形式多样性的文化。
  • 我们优先安排“专注时间”来完成深度工作。我们尽量减少会议,并尝试以异步方式运作。
  • 我们是一个学习型组织,非常重视指导和职业发展。我们希望向您学习,同时也期待您通过在 RStudio 工作来深化您的技能、影响力和领导力。
  • 我们采用独特且可持续的商业模式运营:我们超过 50% 的工程师致力于创建免费和开源软件。我们是盈利的,并且计划在未来几十年内持续发展。

值得注意的方面

  • 100% 分布式团队(或可前往我们在西雅图或波士顿的办公室),出差极少。
  • 具有竞争力的薪酬和丰厚的福利,包括:
    • 医疗/牙科/视力保险(100% 保费覆盖)
    • 401k 匹配
    • 家庭办公室津贴或联合办公空间报销
    • 利润分享制度
  • 灵活的环境和慷慨的休假政策

RStudio 致力于成为一个多元化和包容的工作场所。我们鼓励不同背景、文化、性别、经验、能力和观点的申请者申请。所有合格的申请者都将获得就业考虑,不受种族、肤色、国籍、宗教、性取向、性别、性别认同、年龄、身体残疾或失业时间长短的影响。

请在 https://www.rstudio.com/about/job-posting/?gh_jid=4373214003 提交您的申请。


更多关于RStudio远程招聘Golang软件工程师(加拿大地区)的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

你好, 我很乐意为你提供帮助。 已通过私信发送了更多详细信息。 谢谢! Trish

更多关于RStudio远程招聘Golang软件工程师(加拿大地区)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


您好 @Brian_Deitte

我很乐意为您提供帮助。

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

期待您的回复。

谢谢

Garry

RStudio包管理器团队招聘Go工程师是一个很好的机会。这个职位主要专注于后端Go开发,同时需要具备全栈能力。以下是针对该职位要求的技术分析和示例:

Go后端开发示例:

package main

import (
    "encoding/json"
    "net/http"
    "github.com/gorilla/mux"
)

// 包管理器的API端点示例
type Package struct {
    Name    string `json:"name"`
    Version string `json:"version"`
    Source  string `json:"source"`
}

func getPackages(w http.ResponseWriter, r *http.Request) {
    packages := []Package{
        {"tidyverse", "1.3.1", "CRAN"},
        {"pandas", "1.4.2", "PyPI"},
    }
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(packages)
}

func createSnapshot(w http.ResponseWriter, r *http.Request) {
    var snapshot struct {
        Name      string   `json:"name"`
        Packages  []string `json:"packages"`
        Timestamp string   `json:"timestamp"`
    }
    
    if err := json.NewDecoder(r.Body).Decode(&snapshot); err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
    
    // 快照创建逻辑
    w.WriteHeader(http.StatusCreated)
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/api/packages", getPackages).Methods("GET")
    r.HandleFunc("/api/snapshots", createSnapshot).Methods("POST")
    http.ListenAndServe(":8080", r)
}

Vue前端集成示例:

// Vue组件调用Go后端API
<template>
  <div>
    <h2>包管理器快照</h2>
    <button @click="createSnapshot">创建新快照</button>
    <ul>
      <li v-for="pkg in packages" :key="pkg.name">
        {{ pkg.name }} - {{ pkg.version }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      packages: []
    }
  },
  mounted() {
    this.fetchPackages()
  },
  methods: {
    async fetchPackages() {
      const response = await fetch('/api/packages')
      this.packages = await response.json()
    },
    async createSnapshot() {
      const snapshot = {
        name: 'production-snapshot',
        packages: this.packages.map(p => p.name),
        timestamp: new Date().toISOString()
      }
      
      await fetch('/api/snapshots', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(snapshot)
      })
    }
  }
}
</script>

自动化测试示例:

package main

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

func TestGetPackages(t *testing.T) {
    req := httptest.NewRequest("GET", "/api/packages", nil)
    w := httptest.NewRecorder()
    
    getPackages(w, req)
    
    assert.Equal(t, http.StatusOK, w.Code)
    assert.Contains(t, w.Body.String(), "tidyverse")
    assert.Contains(t, w.Body.String(), "pandas")
}

func TestCreateSnapshot(t *testing.T) {
    jsonBody := `{"name":"test-snapshot","packages":["tidyverse"],"timestamp":"2023-01-01T00:00:00Z"}`
    req := httptest.NewRequest("POST", "/api/snapshots", strings.NewReader(jsonBody))
    req.Header.Set("Content-Type", "application/json")
    
    w := httptest.NewRecorder()
    createSnapshot(w, req)
    
    assert.Equal(t, http.StatusCreated, w.Code)
}

AWS集成示例:

package main

import (
    "context"
    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/service/s3"
)

type PackageStorage struct {
    s3Client *s3.Client
    bucket   string
}

func (ps *PackageStorage) UploadPackage(ctx context.Context, pkgName string, data []byte) error {
    _, err := ps.s3Client.PutObject(ctx, &s3.PutObjectInput{
        Bucket: aws.String(ps.bucket),
        Key:    aws.String(pkgName),
        Body:   bytes.NewReader(data),
    })
    return err
}

func (ps *PackageStorage) GeneratePresignedURL(ctx context.Context, pkgName string) (string, error) {
    presignClient := s3.NewPresignClient(ps.s3Client)
    req, err := presignClient.PresignGetObject(ctx, &s3.GetObjectInput{
        Bucket: aws.String(ps.bucket),
        Key:    aws.String(pkgName),
    })
    if err != nil {
        return "", err
    }
    return req.URL, nil
}

这个职位需要Go工程师具备构建可扩展包管理系统的能力,同时理解R和Python的包生态系统。代码示例展示了典型的REST API设计、Vue前端集成、测试驱动开发和AWS云服务集成,这些都是该职位实际工作中会遇到的技术栈。

回到顶部