我既然写下本文,就应对读者赤诚相见。我真的不是优秀的数据工程师,也不是优秀的软件开发人员。尽管如此,但技术能力我可能还是有的,而且也有干劲。虽然技术上不是最优秀的,但我比较善于与人打交道。你可能会问:“那我为什么还要读这篇文章呢?” 答案很简单:因为失败乃成功之母。至于我这篇文章的观点,嬉笑怒骂皆由你。
我将我的经历写下来,就是希望能够抚慰一下那些面临求职面试或做副业项目时感到受挫的人们。
我在一家公司工作有一年半的时间了,做了很多数据萃取和构建报告的项目。我觉得这些工作很简单,我很肯定这些工作我都能够胜任。然而,我依然想要尝试一些新事物,于是有位朋友给了我一个机会,让我以数据工程师的身份去他的初创公司参加面试。几天后,我和这家公司的人力资源部负责人、技术负责人进行了第一次面试,一切都很顺利,我们约好了去他们总部进行下一轮面试。虽然我现在的工作并没有这个新职位所需的技能,但面试官并不在意这一点,他就是想看看面对新的挑战,我会有怎样的表现。
在真正的面试之前,他给了我14天的时间让我学习Apache Spark 和 Apache Airflow,而这 14 天恰恰就是问题所在。
Apache Airflow 是一个工作流管理平台。它用于定义 DAG(Directed acyclic graph,有向无环图)并对其进行调度。DAG 是 Airflow 表达操作和命令的方式,你可以通过下图来了解它的要点。
版权所有:Apache Airflow软件基金会
Airflow 最广泛的用例是构建 ETL(extract, transform and load,萃取、转置、加载)管道并对其进行监控。
Apache Spark 是一个分布式计算框架。简单地说:只需告诉 Spark 你需要做什么,它就会用 MapReduce 范式将工作分配到计算机集群上。听起来很有趣是吧?那就去看看它们的官方文档吧:Airflow 和 Spark。
Airflow 链接:https://airflow.apache.org/docs/stable/ Spark 链接:https://spark.apache.org/docs/latest/
接到任务的当天,我一下班就开始阅读这些文档和教程。我花了两三个晚上看看那些到底是什么,然后决定实操。我只是简单地开始编写代码,虽然中间出现了一点小曲折,但我也没有太在意。
如我上文所言,开始动手做并不难,但这次我发现我错了。我下载了一些 Docker 镜像来模拟 Apache Spark 集群,并通过 pip 安装了 Airflow 软件包。但我却无法让它工作。不管我怎么折腾,就是没搞定。就这样,四天过去了,面试准备时间只剩十天了。我能做什么呢?是时候召唤 Google 大神了:我以 “Apache Spark Cloud” 为关键词进行了搜索,其中一个结果是 Google Dataproc。
如今,Google 是推动云解决方案的三大公司之一,但在我看来最重要的是,Google 提供了免费的套餐,可以免费使用他们的平台,听起来不错。启动 Apache Spark 集群很容易,只需在 Dataproc 上选择一些选项,然后等上五到十分钟,所有的基础设施就都设置好了。
Cloud Composer 是 Google 提供的另一项服务,它设置了运行 Airflow 的 Web 服务器,这样你就可以在几分钟内设计出 DAG。
当我开始尝试用 Google 的教程来熟悉环境时,我有了一个想法:我可以构建一个小项目,一个概念验证,然后在面试的时候将其展示出来。以我的经验,我认为这个做法应该会给面试官留下好印象。
我想创建一个管道,将一些数据加载到 BigQuery(Google 的数据存储工具之一)。我之所以选择 Reddit 作为我的来源,是因为我已经知道 Reddit 的 API 怎么用。我想到的工作流非常简单,步骤如下:
每个项目都要有一个明确的目标,这点我做到了。尽管不是最初设定的目标,但我的目标一直很明确。
长话短说,我搞砸了。
前两个步骤是最简单的:每隔十分钟,我在 Google Cloud Storage 上的目录就会有一个新的 JSON 文件。
当我终于完成第三个步骤时,我的兴奋溢于言表,于是,我跳过了第四个步骤。
但是,第五个步骤比我想象得还要难,这时,离面试时间只剩下三天。我和十天前的情况一样,再次不知所措。
在剩下的日子里,我试着进行一些修补把事情搞好,最后一天,不知怎么着,我把 Dataproc 部分的管道给弄坏了。我知道你们很多人都会这么说:“为什么不用 Git 或者做备份之类的呢?” 我完全同意你们的这一说法。我删除了 Google Cloud 项目中的所有内容,除了前面两个步骤以外,因为只有这两个步骤我还有点信心。
到了面试的那一天,我来到了公司总部。因为我已经参加过一些面试,我可以自信地说,我一直都很擅长面试。我以一个思维敏捷、机智和勇敢的形象出现在了面试官的面前。我对这个职位抱有很大的希望,尽管面试官对我很友好,但我还是感到很紧张。
面试官提的问题都挺标准的,无非就是一些 Python 和 SQL 的原理,以及他们要求我学习的技术。我不记得所有的问题了,但有一个问题让我记忆犹新。“Yield 在 Python 中是什么意思,在哪里使用?” 当时我就傻眼了,内心暗自痛骂自己。我在 Apache Spark 和 Apache Airflow 上浪费了太多的时间,思考我那个刚刚搞砸的小项目,但我还没有修改我的主要技能,以至于我在前一年就已经荒废了。我没有项目来保护我或掩饰我对 Airflow 或 Spark 的知识匮乏,所以,很多问题我都回答错了。
过了些日子,我收到了面试官的一封邮件,措辞非常亲切,他们告诉我,我太过缺乏经验,不适合这份工作。他们还说这是一个艰难的决定,因为他们很喜欢我这个人。
我真的很恨自己,不是因为失去了这个机会,而是因为被自己想达到的目标蒙蔽了双眼。虽然我花了这么多时间来学习这些基础知识,但内心深处有一种声音在催促着我,希望能快点把事情做完。多年来我所建立起来的那种不受挑战的自负精神,也随之瓦解了。现实狠狠地打了我的脸,我意识到我有多少事情都给忘记了。
我没有计划,只有一套我称之为计划的任务,而我没有设定完成每项任务的时间表,也没有 B 计划。我本可以制定一个计划的,但我当时觉得没有必要这样做。
我花了几天的时间来反思我的错误,于是便有了本文。
你可以认为我技术太烂。但是,我确实认同这句话:失败乃成功之母。
经历了面试这些事后,我又去 Python 官网看了很多年前就读过的 Python 入门,开始学习一些 Coursera 的网课。现在,我正有条不紊地去学习这些课程。
我一直对自己说,就算我不是一个优秀的程序员,也没有什么力量能够阻止我努力成为一名优秀程序员的决心。
具有讽刺意味的是,就在几周前,我还向邀请我应聘这份工作的朋友展示了我的小项目还剩下些什么。他说:“你应该给他们看看这个,他们肯定会选你的!” 我只不过在这些文件上做了一些更新,用 Google 自然语言 API 对所有文本进行分类,并在 Google Data Studio 上做了一个简单的图,他就欣喜若狂。
最后,我要给求职者一句忠告,不要对自己太过苛刻,最糟糕的评判者就是自己。试着把注意力放在真正重要的事情上。不要太过担心,错误无论如何都会发生的。
本文最初发表在 Medium 博客,经原作者 Emanuele Maruzzi 授权,InfoQ 中文站翻译并分享。
领取专属 10元无门槛券
私享最新 技术干货