获赞过万:资深软件工程师醉酒后的肺腑之言
神译局是36氪旗下编译团队,关注科技、商业、职场、生活等领域,重点介绍国外的新技术、新观点、新风向。
编者按:计算机科学和软件开发几乎是现在最热门的专业和职业了。但做这一行究竟是什么感觉?有哪些经验教训?需要注意什么?这些知识你很难从书本学到。不过Reddit上面有个叫flipstables的用户在喝了酒之后开始边喝边吐槽,这位有10年从业经历的软件工程师的酒后真言最后收获了过万的点赞。我们节选部分编译出来,各位不妨看看,里面有些话也许对你很有帮助或让你感同身受。
我喝醉了,我可能会为酒后吐真言后悔。但是……醉都醉了,管他呢。
以下是我过去10年作为工程师所学到的东西。
职业生涯更上一层楼的最好办法是换公司。
技术栈其实并不重要,因为我所在的领域适用的软件工程基本模式大概就那么15种。我是做数据的,所以跟webdev或嵌入式也许不一样。但是所有领域大概都会有10到20个核心原则,技术栈只是想让那些事情变得更容易些,所以不要太过担心。
大家都推荐跳槽的话,肯定是有道理的。如果对工作有啥不满意,可能就是你换环境的时候了。
我在工作过的公司结交了一些好朋友。但是,我不需要把“能交到好朋友”当作对公司的要求。有些地方,我虽然没交到好朋友、但是却工作得非常开心;有些地方,我虽然交到了好朋友、但工作却不开心。
我学会一点,就是对领导要诚实。不要太坦诚,但在工作中可以展现自我的时候要足够诚实。事情能坏到哪里去呢?开除我? 2周之内我就能找到一份新工作。
凌晨2点被叫醒的情况,如果每季度超过一次的话,那肯定是出现了严重问题,要么我得修复好这个错误,要么就得跑路。
再来一杯
优秀的经理跟优秀的工程师,在品格上有很多是一样的。
刚开始那时候,我对技术、编程和计算机科学十分迷恋。但现在已经翻篇了。
越好的代码越容易理解。好代码是初级工程师就能理解的代码。伟大的代码是CS一年级新生就能理解的代码。最好的代码是根本不用写的代码。
作为一名工程师,最被低估的技能是“写文档”。有没有人可以教教我怎么写好文档?说真的,如果有好推荐的话,我愿意出钱上课(大概会出很多钱,如果能保证我能写出好文档的话,一门课1000 美元都行。)
这条跟上一条相关,“写出好的修改建议”是一项出色技能。
所有的“大战役”(vim vs emacs,mac vs linux,等等等等)几乎都无关紧要……除了一场。参见下面。
年纪越大我就越欣赏动态语言。妈的,我就这么说了。有谁赞成,有谁反对?
如果我自认为是办公室里最聪明的人的时候,那就该离开了。
我不知道为什么全栈web开发者的报酬会这么低。妈的,他们可得前后端都了解,还得知道不同的浏览器的工作机制,还得懂网络、数据库、缓存,网web跟移动之间的差异,噢天哪,公司还想使用别的框架?说真的,web开发者为什么只能拿那么点钱?
我们应该多招点实习生,实习生很棒。那些精力充沛的小家伙会用自己的想法乱搞。如果他们能质疑或批评什么东西的话,那就更好了。我喜欢实习生。
小酌
不要去见你的所谓“英雄”。我花了 5000 美元参加了我的一位英雄的课程。他才华横溢,但到最后我意识到他跟我们其他人一样都是随口瞎编。
技术栈很重要。好吧,是,我刚刚才说过技术栈无关紧要,但听我把话说完。如果你听到 Python开发 vs C++开发的话,你会想到非常不一样的东西,对吧?那是因为某些工具确实很擅长某些工作。如果你不确定自己想做什么,那就用Java。作为编程语言Java很糟糕,但几乎擅长一切。
有史以来最伟大的编程语言是 lisp。我应该学习 lisp。
对于初学者来说,最赚钱的编程语言是 SQL。所有其他语言见鬼去吧。如果你只懂SQL不懂任何其他的话,也可以挣大钱。你是薪资专家?也许能拿50k。你是懂SQL的薪资专家?90k。你是在大公司有组织能力的普通员工?40k。有组织技能又懂sql的普通员工?把你自己叫做项目经理,然后挣150k吧。
测试很重要,但 TDD(测试驱动开发)就是该死的“邪路”。
给美国政府干活,轻松又赚钱?没想象的那么好,至少对于处在职业生涯早期到中期的工程师来说是这样的。当然,12 万美元 + 补助 + 养老金听起来不错,但是你得出卖灵魂去研究秘传的专有技术。我非常尊重政府工作人员,但说真的,这些地方的工程师年龄中位数 50 岁以上是有原因的。此建议不适用政府承包商。
第三方招聘人员是吸血的蚂蟥。不过,如果你找到了个好的的话,要认真跟对方建立良好的关系。他们可以帮助你提升职业生涯。怎么才能知道遇到了好的?如果他们担任第三方招聘人员超过 3 年的话,可能就不太行。
期权要么毫无价值,要么可以让你成为百万富翁。除非公司的工程人员超过 100 人,否则期权可能一文不值。如果是前者,那么在这十年内,期权可能会物有所值。
在家上班不错。但没有白板很糟。
我从来都没有在FAANG(编者注:Facebook、亚马逊、苹果、奈飞、谷歌)工作过,所以我不知道自己错过了什么。但是我招过FAANG的工程师,他们也不知道自己在做什么。
我的自我价值不是我的薪酬总额的函数,跟那东西没什么关系。用资本主义来确定自我价值很糟糕。
经理的权力没你想象那么大。小多了。如果你想不通为什么 XYZ 经理不炒掉谁的话,那是因为他们不能。
头衔大多无关紧要。某某公司杰出员工首席工程师什么的。重要的是你做了什么,你实现了什么。那才是别人关心的。
说到头衔:在职业生涯的早期,头衔升级很好。初级到中级。中级到高级。高级到领导。在职业生涯后期,头衔降级很好。这样的话,你可以拿到一样的报酬,但升职的时候报酬会增加。换句话说,在职业生涯早期(<10 年),头衔升级是好的,因为这可以让你发展技能、提高责任。到后期,头衔降级很好,因为这可以让你增加薪水。
善待每一个人。不是因为这有助于你的事业(的确会),而是因为向善本身就会回报。
如果上个月我没有从初级工程师或实习生那里学到点什么的话,那就说明我没有上心。
啊,没酒了。
在课程、书籍和会议方面花点钱是值得的。我参加了一些会议、学了一些课程、买了很多书,订购了一个服务。这钱花得值。这样的话,我就可以更好地假装自己干的事情了。
手腕还有背部的问题可不是开玩笑的。现在就花一千刀,买点好的设备。
我效力过的最聪明的人是个数学博士。我从那个人身上学到了很多。我希望他干得不错。
你知道当软件工程师最好的地方是什么吗?可以结识志同道合者。未必要有相同的兴趣,如体育和电视节目什么的。但他们对问题的思考方式跟你一样。这一点很酷。
在我开始变得非常熟悉之前,我从来没有真正开始讨厌过一种语言或技术。另外,就算我讨厌某项技术,但如果我觉得它好的话,我还是会向客户推荐的。
话虽如此,git很糟糕,但我没得选只能用它。还有,git的GUI工具可以见鬼去了,给我命令行就行。要记住的大概就 7 个命令行,其他的都可以google。
由于我从事的是数据工作,所以我会提供一些数据相关的经验教训。Pandas滚蛋去吧。
我的工作要轻松点,因为我的团队里面有半技术的分析师。之所以说是半技术,是因为他们懂编程但不懂软件工程。这是福分,因为如果某个东西对他们来说没意义的话,意味着可能设计得很糟。我喜欢团队里面的分析师;他们对我成长的帮助比最杰出的工程师要大得多。
深色模式很好,直到你被迫用浅色模式。这就是我用浅色模式的原因。
我对安全有足够的了解,所以知道自己对安全一无所知。
糟糕,又没酒了。
成为好的工程师意味着你了解最佳实践。成为高级工程师意味着知道什么时候该打破最佳实践。
如果有人试图把责任归咎到错误或中断上,那是时候该离开了。
很多进步主义的公司,尤其是初创公司,都说要让你“活出真我”。呃,如果你的真我就是看黄片呢?是的,工作和个人生活适当分离是健康的。
好领导的最好证明是代人受过。你最好相信我会为这样的领导赴汤蹈火。
同样地,我有幸效力过的最好的领导,既会竭尽全力支持我的观点,也会向我解释跟我的观点有冲突的其他观点。我正在努力成为他们那样的人。
算法和数据结构是很重要,但要有个度。我没见过面试药剂师的时候会问对方有机化学那些鸡毛蒜皮。我们行业的面试流程是有问题的。
做我喜欢的事并不重要。更重要的是做我不讨厌的。
我离产品越近,离推动收入就越近,不管我的工作技术性如何,我都会感到越有价值。哪怕是在最先进的公司也是这样。
即使我都是用Windows 工作,Linux 也很重要。为什么?因为我最终都要在Linux下工作。我为忙着安装 Arch(Linux)的那些周围感到高兴。
我已经学会了对大数据等模棱两可的热词保持警惕。“大”数据是什么鬼?每隔10分钟我就得用Spark 和 Kafka处理 10k 的记录流,每隔1小时就得用 Python 和 MySQL 批处理 1B 行记录。那些标签可以去见鬼了。
不是所有的好工作都在硅谷。但那里有很多。
哦,该死,我又找到啤酒了。
继续。
关于编程语言:
我曾经讨厌过一种编程语言(C#),直到我真正用上它。但后来我又讨厌它了,虽然还是觉得它很有用。
我开始讨厌那门编程语言 (C#),于是离开了它。等我下次回来时,哇,那们编程语言真的改进了。
函数式语言最伟大之处在于:函数是一流的,所有其他程序员都知道这一点。
一门语言再怎么伟大或出色,只要大家不用,那它就没什么影响力。
学语言并不难。难的是学习它的生态体系。
关于同事
结对编程很棒,只是需要很多时间——而公司往往不想花那么多时间。
跟聪明的工程师一起工作让我成为更好的码农。跟聪明的非技术同事一起工作让我成为更好的工程师。
朝九晚五以外的时间就别花在工作上了。除非你想,因为那个项目很棒,你又处在最佳状态。
关于在家工作
如果公司是一半远程一半现场办公的话,那一定要确定:远程办公的人不会被当作“二等公民”。这就很重要。如果重大决定是在“茶水间”做出来的话,那最好试着尽量改变一下公司的文化,要么就换一家把远程员工也看作一等公民的公司。
在家上班第二糟糕的缺点是没有白板。(编者注:作者后来在评论中指出,这个白板不是物理意义上的白板,是指畅通的沟通交流机制)
在家工作最糟糕的缺点是很难向同事学习。除非我 (a) 有信心果断提出问题,并且 (b) 公司文化对远程员工与现场员工一视同仁,否则的话前 5 年最好是到公司上班。
关于技术
人人都知道技术会变。过去 10 年的技术格局已经发生了巨大变化。但其实基础性的东西变化不大,尤其是适用我所在领域的基本原理。
Hacker news和 r/programming的作用是帮助获取一般想法并了解最新动态。评论区几乎一文不值。
有很多业余爱好者对技术也会表达强烈看法。即便业余爱好者也会在“受人尊敬的”期刊和博客上发表东西。我跑去看是为了了解谣言的最新情况,但会有自己的判断。
我在一家前沿的初创公司工作,我们不用 ABC前沿技术公司提供的最新 XYZ 技术。事实证明,他们提供的往往只是自己手头东西的一小部分,而且他们当中大多数的人用的技术跟我们的都是一样的。
话虽如此,解读信号很重要。如果你想运用现代科技,但你公司所做的绝大部分工作都是用jQuery开发出来的话,也许你得重新评估一下了。
关于数据工程
我是数据工程师,所以干脆我就提供一些更具体、有针对性的建议/经验吧
SQL 为王。MySQL、Postgres 、Oracle、SQL Server、SQLite等数据库仍然至高无上。即便你用的是新技术,大部分还是会迁移的。
大多数公司都不做流处理。毕竟做起来又困难又复杂。如果你工作已经有10 年但还不知道怎么每秒钟处理10k 条记录的话,别担心,仍有工作机会等着你的。
机器学习项目极其容易失败。这种项目很复杂而且很难实施。不相信我?想想看,给机器学习模型写该死的单元测试有多容易吧?
我们这个领域是新的。没有数据工程方面的好书,你“做”就是了。没法靠训练营来学会这个。10 年后这种情况也许会改变,因为我们都会想办法弄清楚我们在做什么。
关于生活
人总有一死。你想让代码成为你的遗产吗?如果想的话,那就多花些时间在这上面,因为那可是你的遗产!但如果你跟我一样,享受身边有家人、朋友和生活当中的人,而不是你写的代码的话,那就不要太放在心上。
好人写的代码也有烂的。聪明人写的代码也是。好的程序员和工程师也会写出糟糕的代码。不要让代码质量成为你自我价值的因变量。
我进入技术这个行当写代码是因为我爱好技术。现在我的爱好跟工作一样,工作已经毁了我的爱好。所以现在如果我想享受技术的话,我需要放弃我的爱好。或者我需要确定技术不再是我的爱好,然后去找到新的爱好。
编程和计算机科学就像80 岁那么老了?可以跟任何其他工程学科比较一下。是的,我们全都不知道自己在干什么。
我挣的钱还不错。对此我得心存感激。还有,得省着用。
其他
这些年来,我开发了供多支团队和很多人使用的大型平台和库。不过,出于某种原因,我最自豪的还是写给自己用的小脚本。
我职业生涯中最自豪的成就,是帮助其他人更好地完成了自己的工作。那可能是因为我注定要成为管理者,所以这可能对其他人没有帮助。
上大学的时候,有一次里我发现有个女孩喜欢我。我不相信,因为我自尊心很差,但后来她约我出去。我告诉她,尽管她真的很酷,但我不感兴趣。那是我人生当中最自豪的时刻之一,因为当时尽管我才19 岁时但已经足够成熟,可以用成熟的方式说“不”。
我变成了自己一直讨厌的人:从事科技工作、但在现实生活中却回避科技的人。也许这会伴随我变老。
我醉了,所以请无视我说过的任何话。我也为刚刚的吐槽道歉。
译者:boxi。
本文来自翻译, 如若转载请注明出处。