当前位置: 首页 > news >正文

当 Tubi 遇到 Ruby

有人说 Tubi 作为 RubyConf China 金牌赞助商,明明用极具吸引力的 Elixir 后端工程师岗位和高品质的 Elixir Meetup,“拐走了”一批又一批 Rubyist 投身于 Elixir 开发中,却依然让人想在 Tubi 展台前多停留一会儿。

为什么工程师、校友甚至 Ruby 社区颇具影响力的人物都愿意来为 Tubi 站台?为什么选择小众技术语言 Elixir 构建后端服务,并长期支持 Elixir 中国社区的建设?这是一个什么样的职场环境,让 RubyConf 现场观众惊叹每年有两次 Outing,还有着“有灵魂”的工作文化?

本文将从两个方面与你分享,Tubi 与 Ruby 的故事:

  • Rubyist 眼中的 Tubi
  • 加入 Tubi 的 Rubyist 后来怎么样了
  • Tubi 与 Ruby 的故事。

Rubyist 眼中的 Tubi

初印象:是一个专业稳定的科技公司

“我是在 RubyConf 2023 第一次知道 Tubi 这家公司的,Tubi 给我的整体印象是一个专业稳定的科技公司。最让我印象深刻的是 Tubi 展台上的小电视,相比其他参展商更吸引眼球,也和流媒体公司的定位十分契合。Tubi 还介绍了 Elixir 在产品上的应用,细节处透露着技术范儿和开源精神。”

—— Rubyist 张一

技术选型很有魄力

“疫情期间,没有几家公司会为了员工健康而支持完全远程办公的,Tubi 这样做了,我也是那个时候知道 Tubi 的。

后来进一步了解到 Tubi 的技术栈基于 Elixir 和 Scala,在 Java、Python、Go 流行的大环境下选择这么小众甚至名字都没有听说过的语言是真的很有魄力,之后我也会经常在 Ruby、Elixir 技术活动上看到 Tubi 的身影,不遗余力地推广函数式编程语言。

这次在 RubyConf 上还收到了 Tubi 版红宝书 - Tubi 的技术博客合集,很技术范儿,这也真正体现了 Tubi 工程师团队‘对运用先进技术改变人们生活这一美好愿望充满无限激情’吧。希望 Tubi 赞助的 Elixir Meetup 以后能来上海,自己可以作为志愿者出一份力。”

—— Rubyist 小白

Tubi 让我看到了自由

“在与 Tubi 团队成员交流中,我深深感受到了 Tubi 独特的工程师文化,那就是自由!自由!还是自由!

‘自由’在 Tubi 不仅仅是一个词,更是一种工作的哲学。这里的工程师不会仅仅为了实现某个功能而妥协,他们对整个产品都负有责任。在 Tubi,开发者不仅是编写代码的人,他们也是产品的参与者和建议者,每个人都有权利为产品提出更好的建议。这真的让人太激动了。

读了 Tubi 在 RubyConf China 上分享的 Tubi 团队文化和技术博客,我还惊喜地发现:

第一,Tubi 特别强调一个核心价值观 —— 信任。在许多公司担心员工在家工作可能会‘偷懒’的时代下,Tubi 对其团队成员有着这样的信任,支持远程和在家工作,也相信他们会尽职尽责。这种‘信任’文化在当前竞争激烈、内卷严重的环境中显得尤为宝贵

第二,Tubi 不是通过倒排期或强制性的目标来推动团队,而是通过建立合理的工作流程,来确保产品的正常交付和优质的用户体验。这种工作方式背后的核心理念是一种契约精神,团队成员之间互相信任,共同为一个目标努力,这样不仅高效,还非常人性化。”

—— Rubyist 韩先生

加入 Tubi 的 Rubyist 后来怎么样了

据说,Tubi Elixir 工程师团队中有一半曾是 Rubyist,他们转变为 Elixir 炼金术士的过程是什么样的?在 Tubi 做 Elixir 工程师,是一种什么体验?一起听听他们的心声吧。

Rubyist 迁移到 Elixir 可能更有优势

“在最初接触 Elixir 时,我注意到 Elixir 有很多地方是受到了 Ruby 的启发,因为 Elixir 之父 José Valim 之前是 Ruby on Rails 的作者之一,这在一定程度上降低了我学习 Elixir 需要做的心理建设和学习成本。

Ruby 和 Rails 最让我欣赏的部分就是对开发者体验和开发效率的关注,而 Elixir 在这两个方面的表现也是相当出色的。Elixir 最让我欣喜的还是项目在实际应用中所表现出的卓越性能和稳定性。在我看来,这可能使最终让我的团队从 Ruby 切换至 Elixir 为主开发语言的最关键的因素。

Ruby on Rails 在‘用很少的代码实现很多的功能’这件事上树立了行业标杆,一直被业界认为是快速启动一个 Web 项目的最佳技术选择。Elixir 的 Phoenix 框架在很大程度上受到了 Rails 的启发,近几年也开拓了一些新的领域,例如一出现就广受关注的 Phoenix LiveView,以及随后出现的其它语言框架。相比 Rails,Phoenix 的确让人感到有一点上手难度,但在我看来,这一点难度的增加所带来的效率提升,绝对值得!

对于已经熟练 Ruby on Rails 的开发者来说,适应 Elixir 和 Phoenix 的过程是非常顺畅的,这比起从其他语言迁移到 Elixir 来说可能有更显著的优势。”

—— Tubi Elixir 高级工程师 Horvo

“刚开始使用 Elixir 时,我感觉两种技术语言的语法比较像,写起来都很舒服,只不过 Elixir 是函数式语言,刚开始写需要有一点风格的转换,但是不会有太大的不适应。当我逐步了解到 Elixir / Erlang 背后强大的 OTP 生态,不禁赞叹 Elixir 真的别有洞天啊!”

—— Tubi Elixir 工程师,Tristen

Elixir 和 Tubi 带给我属于工程师的双倍快乐

“我在读书期间,业余时间开始学习 Ruby 和 Elixir;毕业第一份工作就选择了 Tubi,也直接投身到了 Elixir 的开发上,这份确信至今未变。事实证明,很多之前没有接触过 Elixir 的同事们都能快速适应新的开发生态,而且在 Tubi 可以遇到一群和 Elixir 一样优雅的小伙伴啊。”

—— Tubi Elixir 工程师,Tristen

“在 Tubi 写任何语言都会是非常开心的,Elixir 本身又带给我很多属于工程师的快乐,这两者叠加在一起就是双倍的喜悦。对于喜欢一门语言的开发者来说,最幸运的就是刚好有一家很棒的公司正在用这门语言(并且你还有机会在那里工作)。我很庆幸能有在 Tubi 写 Elixir 的机会。

Tubi 有很多需要解决高并发、高复杂度的业务场景,这些比较有挑战性的项目让我在技术上收获了很多宝贵经验。另外,在应对这些复杂、高并发、实时性强的需求时,Elixir 总会给我更多的信心,我因此可以分出更多精力到架构设计和代码质量上。”

—— Tubi Elixir 高级工程师 Horvo

Tubi 与 Ruby 的故事

2019 年中旬,Tubi 正在紧锣密鼓地筹备第一场 Elixir Meetup,为了让更多中国开发者有机会了解 Elixir 这门小众但表现惊艳的技术语言,我们在 Tubi 工程师的帮助下,与 Ruby China 建立了联系。

当时负责 Tubi 中国团队招聘的 Doris 分享道:“Ruby 社群非常开放和包容。虽然我们招聘的是 Elixir 后端工程师,但我还是受邀加入了 Ruby China 的几个群组,有机会去介绍 Tubi 及工作机会,并分享与 Elixir Meetup 相关的活动信息。这次参加 RubyConf China,我见到了许多一直以来帮助 Tubi 的网友,激动万分。”

在本次 RubyConf China 中,Tubi 第一位 Ruby 开发者也亲临现场。虽然他已经离开 Tubi,但仍然全力以赴地为我们提供支持。

人们常说 Rubyist 是一群为爱发电的人,这一点不假。或许正因为 Tubi 同事们和 Rubyist 有着共同的技术热情,才让我们有幸相遇并携手共进。

关注 Tubi,创造更多可能性

Tubi 中国团队热招岗位持续更新中,欢迎点击查看。让我们在 Tubi,一起为了“让人人都能免费享受高品质的视频内容”而高效工作,也有品质的生活!

相关文章:

当 Tubi 遇到 Ruby

有人说 Tubi 作为 RubyConf China 金牌赞助商,明明用极具吸引力的 Elixir 后端工程师岗位和高品质的 Elixir Meetup,“拐走了”一批又一批 Rubyist 投身于 Elixir 开发中,却依然让人想在 Tubi 展台前多停留一会儿。 为什么工程师、校友甚至 …...

【C++从0到王者】第二十四站:多态的底层原理

文章目录 前言一、虚函数表二、一道经典的例题三、深度剖析多态的条件之一:为什么必须是父类的指针或引用四、深度剖析多态的条件之二:为什么是虚函数的重写/覆盖?五、虚函数表的一些总结六、关于Func3的验证七、动态绑定与静态绑定八、总结 …...

Java从入门到精通24==》数据库、SQL基本语句、DDL语句

Java从入门到精通24》数据库、SQL基本语句、DDL语句 2023.8.27 文章目录 <center>Java从入门到精通24》数据库、SQL基本语句、DDL语句一、什么是数据库二、数据库的优缺点1、使用数据库的优点&#xff1a;2、使用数据库的缺点&#xff1a; 三、MySQL基本语句四、DDL语句 …...

学习ts(十)装饰器

定义 装饰器是一种特殊类型的声明&#xff0c;它能够被附加到类声明&#xff0c;方法&#xff0c;访问符&#xff0c;属性或参数上&#xff0c;是一种在不改变原类和使用继承的情况下&#xff0c;动态的扩展对象功能。 装饰器使用expression形式&#xff0c;其中expression必须…...

如何在 Opera 中启用DNS over HTTPS

DNS over HTTPS&#xff08;基于HTTPS的DNS&#xff09;是一种更安全的浏览方式&#xff0c;但大多数 Web 浏览器默认情况下不启用它。了解如何在 Opera 浏览器中启用该功能。 您可能不知道这一点&#xff0c;但您的网络浏览器并不像您希望的那样私密或安全。您会看到&#xff…...

STM32 F103C8T6学习笔记13:IIC通信—AHT10温湿度传感器模块

今日学习一下这款AHT10 温湿度传感器模块&#xff0c;给我的OLED手环添加上测温湿度的功能。 文章提供源码、测试工程下载、测试效果图。 目录 AHT10温湿度传感器&#xff1a; 特性&#xff1a; 连接方式&#xff1a; 适用场所范围&#xff1a; 程序设计&#xff1a; 设…...

QT基础使用:组件和代码关联(信号和槽)

自动关联 ui文件在设计环境下&#xff0c;能看到的组件可以使用鼠标右键选择“转到槽”就是开始组件和动作关联。 在自动关联这个过程中软件自动动作的部分 需要对前面头文件进行保存&#xff0c;才能使得声明的函数能够使用。为了方便&#xff0c;自动关联时先对所有文件…...

TCP最大连接数问题总结

最大TCP连接数量限制有&#xff1a;可用端口号数量、文件描述符数量、线程、内存、CPU等。每个TCP连接都需要以下资源&#xff0c;如图所示&#xff1a; 1、可用端口号限制 Q&#xff1a;一台主机可以有多少端口号&#xff1f;端口号与TCP连接&#xff1f;是否能修改&#x…...

【Docker】云原生利用Docker确保环境安全、部署的安全性、安全问题的主要表现和新兴技术产生

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 云原生利用Docker确保环境安全、部署的…...

explain各个字段代表的意思

id&#xff1a;联表查询是每个表的读取顺序&#xff0c;数字越大越先被读取。相同就需要通过table字段判断select_type&#xff1a;查询类型或者是其他操作类型&#xff08;PRIMARY、UNION、UNION RESULT等&#xff09;table&#xff1a;正在访问哪个表partitions&#xff1a;匹…...

【已解决】Windows10 pip安装报错:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x98

环境&#xff1a;win10, Python3.9 在Pycharm安装YoloV5的依赖包时出现报错&#xff1a;UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x98 出现 ‘gbk’ codec can’t decode… 的报错一般是因为读取文件出现编码问题导致没法读取文件&#xff0c;因此可以在报错…...

goland 中的调试器 -- Evaluate

今天一个好朋友 找到我&#xff0c;问我关于goland中Evaluate 小计算器的使用方式&#xff0c;说实话&#xff0c;我在此之前也没用过这个东西&#xff0c;然后我就找一些相关文档&#xff0c;但是这类文档少的可怜&#xff0c;所以我就稍微研究一下&#xff0c;找找材料&#…...

你知道公司内部维基到底有哪些功能吗

维基指的是一种协作工作的平台&#xff0c;也就是开源的编辑系统。员工可以在企业维基里面进行存储、共享和协作之类的操作&#xff0c;将企业内部员工的知识共享聚集在一起。今天looklook将会详细讲讲公司内部维基具体到底有哪些功能&#xff0c;供大家参考。 公司内部维基的功…...

netdata监控服务器主机(包括Docker容器)

效果 Docker部署 创建挂载目录 mkdir -p /data/netdata/{netdatacache,netdatalib}docker运行 docker run -d --namenetdata \-p 19999:19999 \-v /data/netdata/netdatalib:/var/lib/netdata \-v /data/netdata/netdatacache:/var/cache/netdata \-v /etc/passwd:/host/etc…...

Mybatis学习|第一个Mybatis程序

1.创建一个数据库以及一个用户表&#xff0c;并插入三条数据用来测试 2.创建一个空的maven项目 在pom.xml中导入本次测试用到的三个依赖&#xff0c;mysql驱动、mybatis依赖、以及单元测试junit依赖 将这个 空的maven项目当成一个父项目&#xff0c;再创建一个空的maven子项目用…...

计算机网络MTU和MSS的区别

在计算机网络中&#xff0c;MTU代表最大传输单元&#xff08;Maximum Transmission Unit&#xff09;&#xff0c;而MSS代表最大分节大小&#xff08;Maximum Segment Size&#xff09;。 1.MTU&#xff08;最大传输单元&#xff09;&#xff1a; MTU是指在网络通信中&#x…...

redis学习笔记 - 进阶部分

文章目录 redis单线程如何处理并发的客户端&#xff0c;以及为何单线程快&#xff1f;redis的发展历程&#xff1a;redis单线程和多线程的体现&#xff1a;redis3.x单线程时代但性能很快的主要原因&#xff1a;redis4.x开始引入多线程&#xff1a;redis6/redis7引入多线程IO&am…...

SE5 - BM1684 人工智能边缘开发板入门指南 -- 模型转换、交叉编译、yolov5、目标追踪

介绍 我们属于SoC模式&#xff0c;即我们在x86主机上基于tpu-nntc和libsophon完成模型的编译量化与程序的交叉编译&#xff0c;部署时将编译好的程序拷贝至SoC平台&#xff08;1684开发板/SE微服务器/SM模组&#xff09;中执行。 注&#xff1a;以下都是在Ubuntu20.04系统上操…...

基于Java+SpringBoot+vue前后端分离英语知识应用网站设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…...

vue使用vue-router报错

报错1. app.js:172 Uncaught TypeError: vue_router__WEBPACK_IMPORTED_MODULE_0__.default is not a constructor at eval (index.js:4:1) at ./src/router/index.js (app.js:108:1) at webpack_require (app.js:169:33) at fn (app.js:442:21) at eval (main.js:7:71) at ./…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

深入浅出JavaScript中的ArrayBuffer:二进制数据的“瑞士军刀”

深入浅出JavaScript中的ArrayBuffer&#xff1a;二进制数据的“瑞士军刀” 在JavaScript中&#xff0c;我们经常需要处理文本、数组、对象等数据类型。但当我们需要处理文件上传、图像处理、网络通信等场景时&#xff0c;单纯依赖字符串或数组就显得力不从心了。这时&#xff…...

标注工具核心架构分析——主窗口的图像显示

&#x1f3d7;️ 标注工具核心架构分析 &#x1f4cb; 系统概述 主要有两个核心类&#xff0c;采用经典的 Scene-View 架构模式&#xff1a; &#x1f3af; 核心类结构 1. AnnotationScene (QGraphicsScene子类) 主要负责标注场景的管理和交互 &#x1f527; 关键函数&…...