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
你好, 我很乐意为你提供帮助。 已通过私信发送了更多详细信息。 谢谢! 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云服务集成,这些都是该职位实际工作中会遇到的技术栈。

