大家好,我是鱼皮。因为种种原因,最近我接手了组内部分大数据开发工作,对我来说是一个几乎完全陌生的领域;大学虽然也自学过,但也都是浅尝辄止,面对企业项目还是有点虚的,所以最近抽了很多时间在自学大数据,很少写文章了。
现在算下来做大数据工作也一个多月了,今天给大家分享一下我从后台开发无缝转行到大数据的学习过程、工作心得、以及自己对后台和大数据这两个岗位的看法。
自学过程
其实工作中很难有机会利用上班时间去学习,感觉会有种摸鱼的负罪感。而且虽然说我接手了大数据的工作,但并不是说就不做后台开发,我还要接着维护之前负责的系统。所以基本只能下班后每天挤时间学一会儿,周末再多一点。
在工作中学习的心态和在学校那会儿还是很不一样的。在学校的时候时间多,一套教程能完整看完,看完后还能自己再做点儿东西;但在工作中学习有点赶鸭子上架,需求已经排给你了,不能拖延。
所以接手工作第一天就直接上手看代码,我就看别人怎么写,然后复制粘贴过来自己修改一下,能运行就问题不大。但是你不知道别人为什么要这么写,所以哪里看不懂呢我就去网上查、零零散散学一点,下班再看教程把这些知识串起来。
看教程的时候我也全程 1.5 倍速,忽略了像环境搭建、课后练习之类的章节(工作中环境别人都搭好了、做需求本身就是练习嘛)更多的是去了解框架的原理和开发经验,比如 Spark 的任务提交流程、Shuffle 过程、调优手段等等。因为自己记性比较差吧,所以也整理了下自学笔记。
星球资料库
我个人感觉如果已经有一定开发经验了,用这种带着目的去方式学习可能会更快一点。就比如你想做一个聊天软件,那你可以针对性地去学即时通讯相关的技术。工作之后,我学新技术时也会思考能否运用到自己的项目中。
工作心得
记得我在学校第一次学大数据的时候感觉这东西老牛逼了,但实际工作后发现,并没有我想的那么复杂和高深,只是换了一种搬砖的方式而已。。。因为现在拜这个 Spark SQL 之类的牛逼框架所赐,实际工作就是根据需求写 SQL 跑数据,说白了就是 SQL Boy。而且有一些优秀的产品懂 SQL,他直接在需求文档上就把你需要的 SQL 写好了,你甚至都不用思考逻辑,就复制粘贴 SQL 到代码里就行。
有同学会说大数据开发还要建设数仓、搞分层、搞资源的分配,但问题是等我接手开发的时候,前人都已经把这些建设好了呀。就跟造车一样,别人把车壳子都搭好了,我在车底拧螺丝不就行了么?
虽然听我描述挺简单,但自从做了大数据开发后,我下班时间会比平时更晚。不是因为开发很难,而是因为调试程序麻烦、很费时间。
因为啥呢?
首先要计算的数据量非常大,很多任务基本都是要 几千核 CPU、几个 T 的内存去计算几个小时才能完成;还有就是每个组的资源是有限的,就分给你那些 CPU 和内存,资源不够你自己想办法。
想起之前一些同学的吐槽:说什么 SQL 竟然能运行超过 1 分钟?对大数据离线计算来说,这真的是家常便饭了。
在这种情况下,先不说我们有足够的资源去测试啊,有的时候线上任务的资源都不够,Leader 还经常要去借资源。
所以我们每个大任务什么时候执行都得安排好,上午跑 A、下午跑 B。想要调试呢,就只能见缝插针,比如我中午吃饭前,看看现在资源利用率没那么满,我就赶紧跑个测试任务,观察一下;晚上睡觉前,看看这会儿其他同事没跑任务,那我赶紧测试,还得熬夜观察一下。大家谁要跑大任务的测试之前,最好在群里打个招呼:这个集群我占用了,大家先等会儿。
当然我们也一直在对任务进行优化,不断地缓解上面这些情况。不过目前感觉我还是经验不足,很多时候都是 Leader 找到了优化思路,然后我按他的思路去改代码。所以还是得持续学习吧。
下班晚还有一个原因就是跨语言开发的成本。我之前写 Java 比较多,现在开发大数据用 Scala 和 Python,我就对自己很不自信了。比如有一次看到同事之前在代码中写了个 if 1 == 1
,于是我复制粘贴的时候也把这个 1 == 1
一起站过来了,都不敢删掉,生怕出什么问题。后来问同事说可能是当时为了测试方便吧,把 1 改成 0 就可以忽略底下那部分代码,像这样:
if 1 == 0:
do_something()
这样就不用把代码注释掉了。
优雅,太优雅了!(用一个变量来判断感觉会更可读一些)
后台 VS 大数据
都说隔行如隔山,我却觉得后台和大数据开发有很多相似之处。比如:
- 都是写代码、都可以复制粘贴
- 都需要明确需求、都侧重于理解逻辑
- 开发流程基本一致,都要测试验证后再上线
- 都需要比较强的 SQL 能力
- 都注重时间、空间、稳定性的优化等等
也有很多同学问我啊,比较纠结大数据和后台开发选哪个,这两个工作体验下来,我还是更倾向于后台开发的,感觉个人发挥和思考的空间会多一些。
个人感觉大数据开发有一点点机械,从需求和实现上来看,基本都比较明确,产品要这些字段,你就给我写 SQL 输出这些字段,做完不会有太大的成就感;从技术上看,很多东西框架都帮你搞定了,调优方法也相对比较固定,要想自己大刀阔斧改造几乎是不可能的,除非你学的很深很深,导致大多数同学要么是 SQL Boy 要么是 SQL 之父(大牛)。
但后台开发的变数可能更多一些,你有机会去扩展需求、提出见解,也可以设计不同的方案去实现需求,和产品一起把系统做的更好,会有一种积累带来的成就感;从技术上来看,后端相关的技术多种多样,数据库、缓存、队列、网关等等,你有很多的学习空间,而且每学一个知识基本都是有机会运用的,可以逐步提升。
当然无论你选哪个工作,都要持续提升知识广度、思维深度、认知高度,多站在上层、宏观的角度去看待问题,而不要只满足于在车底拧螺丝吧。共勉!
当然了,以上只是我自己的感受啊,仅仅是记录一下,供大家参考,也许我的心态和看法会随着未来的工作而发生变化吧~