“残酷”的事实

下面这些文字来自我在知乎的回答:“在真实工作中的编程是怎么样的,与学校里有什么不同?”

入行愉快。

首先,一言以蔽之,用两个字来概括,就是“残酷”,但是,好在是加引号的。有的不但残酷,还很无奈;有的则是在残酷的同时,还很有趣。搞工程和学校 里的象牙塔大不相同,这也许老早就知道,但是绝对不是七八年前我想象的模样。你可以把它当成我没睡醒的呓语,也可以当成我喝多的胡话,或者是心情太差的时 候写的吐槽檄文。反正,它们就在那里,事实就在那里。

总的来说,学校里面编程,或者在工作之余编程,是很有趣的,没有manager给你各种压力,也没有各种大神(比如TMP、PM、SE等等我都搞不清楚干嘛的职位)给你指点江山,你可以自己爱咋弄咋弄。当然,没有了这些“残酷”的痛苦,你没法进化,没法超脱,没法升华。

就从一毕业开始的荒唐的面试说起吧。国内的公司问的更杂一些,知识性的问题也问,有时我反而觉得更务实。而外企则很喜欢考察“能力”,我加引号是因 为他们觉得他们在考察能力,实际却不见得。因为他们只是在考察80%的算法+数据结构,以及一点点系统设计,一点点扯淡能力,再顺道看看颜值如何啊,八字 合不合啊,星座属相啥的而已。因此,这其中前80%东西都是可以准备的。而应试,恰恰是中国人最擅长的东西。我记得有朋友在我的blog里面回复道,特别 鄙视刷算法题和面算法题这样的做法。我想,我可以和你“同鄙视”的,但可惜我没有那么崇高,而且他应该是没有很多去大的外企公司面试的经历,否则,应该去 一边骂这个该死的面试方式,一边自己偷偷刷题去了。还有人说,FLAG又如何,某ACM拿奖的,某算法特别好的,某题刷特多的,但是工作却不出活儿啊。 嘿,这样的人,我还真见过,也听人说过,但问题是,人家,钱,拿,得,多,啊?人家不爽了就可以跳槽啊?人家一跳就是不错的薪水啊?

既然聊到算法,那就继续下去。好吧,残酷的事实是,绝大多数软件工程师的日常工作,和算法的关系其实并不大。当然,和data analyst这样的职位比我们还是好很多,那个职位简直就是仅次于产品工程师的 神级角色了,学经济学宇宙学物理学化工的,只要数学属性可以,只要会讲故事,就可以扯到伟大的数据分析上面,就可以表示“本人具备成为优质数据分析师的潜 质”(好像也没有什么不对嘛,analyst们请不要打我)。好吧,话题再扯回来,面试考察的正是平时工作用不着的东西,换言之,原则是“什么用不着就考 什么”,首当其冲的就是算法,而真正用得着的呢,以一句“Googlej得到的别考”搪塞过去了,于是这些自我感觉良好的公司中,工程师日常工作就是在和 Google+StackOverflow战斗中度过的。尤其是MS,这家自我号称地球上最没有taste的公司,面试简直是为ACMer准备的,有的组 简直是“来了就做题,做完就闪人”。Google问的算法题还算有新意的话,是那Facebook是对普通算法题要求bug free就让人和不解,bug free能说明什么问题,说明熟练,说明题目做得多,还是想说明一个人脑子这个hash table里面存放的题量大?

工作有多有趣?这是个好问题。其实,每当我们从一家公司跳到另一家公司的时候,也总会有这样那样的幻想,会对下一个让自己发挥的“舞台”有所憧憬。 但是很多时候,我们面对的问题,都是“知识谜题”。说白了,就是那些“不知道的打死也不知道,知道的困难解决毫无难度”的问题。来来来,这样归纳一下,假 设一个工程师每天的工作时间是100%的话,20%可能要吃饭喝水打望上厕所刷推刷微博吹牛逼闲聊,30%的时间要开各种傻里吧唧的会(这个估计够保守了 吧),剩下50%的时间想干正事儿了,发现大部分都在干各种operation的工作,说白的就是编译构建部署安装搭环境改配置打补丁,余下总数的10% 才是真正研究问题写代码的时间,发现各种乱七八糟奇形怪状的问题,各种在学习新技术的时候,看着那些玩具代码和hello world的时候,根本不可能想到的狗血问题全部冒出来了。就改了一行代码,居然这东西就不work了?就加了一个小小的feature,整个系统居然就 挂掉了?于是,从外往里连蒙带猜,连分析带搜索,连Google带StackOverflow地试错,重要在某个人生中重要的时间点发现,又是一个知识谜 题,又犯了一个二了吧唧的错。搞完这些东西,终于把自己写的那一点点小代码,像橡皮膏一样贴到项目组负责的这个庞然大物上了,嗯,it’s working it’s perfect。

别急,哪那么容易让你到达成功的彼岸?代码修改了要反复测试啊,测试的时候要考虑各种情形,调用一个API的时候说要接收一只老鼠作为参数,必须要 考虑如果对方传过来一头大象怎么办。搞完这些东西,才可以去尝试code review这个苦难重重的关卡。发出去以后,等啊等,等啊等,居然没人review啊,那好吧我去催,挨个催。结果,幸福来得太突然,十行代码,二十条 review comments,一度让自己对自己的人生观和价值观产生了怀疑。但是,仔细看了之后,发现其中19条是关于各种缩进符号命名大小写注释空格的,只有1条 是具有实际的建设性意见的,终于松了口气,又是一轮改+催的流程……

更可恶的是,当你折腾完这些乱七八糟的东西以后,心里居然没有啥成就感,就那么点破事儿,居然整那么半天?于是你在第二天的sync up meeting上说,俺昨天做了xxx,yyy,发了个code review,里面代码修改其实只有10行。这就是一天又苦逼又繁忙的工作产出啊。更更可恶的是,有牛逼哄哄的同事A跳出来说,你这么搞是大错特错的,理 由1理由2理由3,还有最核心的理由4,退一步说还有理由5,就在你心里想我擦妈蛋你这个马后炮为啥不早说的时候,又有一位牛逼哄哄的同事B跳出来说,如 果用开源的/公司内部的/免费的/别的组做的/我曾经参与开发的,框架abc/库def/组件ghi/工具xyz,问题可以瞬间解决,言下之意,就是你眼 瞎了,脑残了,活白干了,当初应该屁颠屁颠地跟在他后面求指导就好啦。

别高兴得太早,到了线上,还会有更多历练人生的有趣事情等着你。比如项目发布,比如on call(改线上问题)。有的问题紧急啊,就意味着你要拿着一个传呼机一样落伍的几千年前才用的东西睡觉。它也许早上响,也许晚上响,也许深夜你做美梦的 时候响。总之,当它响了,你就得爬起来立即处理,看看是不是service又挂了?是不是你天天整的那个破玩意儿又不能访问了?还是哪个用户欠抽搞了个 false alarm?说不定这个问题还真是由你提交的代码引发的呢,那就是bonus啦。所以不用怀念学校里那些美好的熬夜打游戏的美好时光,你会迎来新一轮的熬 夜改问题的美好时光。

来回折腾若干次以后,环境终于搞定了,code review终于审过了,代码终于push了,集成测试终于跑过了,部署到线上终于没问题了……但是,淋漓畅快的成就感呢?在崇高和伟大之间对神一样的设计反复的斟酌呢?对代码像艺术品一样的华丽丽的无止境的追求呢?

本文文字及图片出自 www.raychase.net

余下全文(1/3)
分享这篇文章:

请关注我们:

共有 2 条讨论

  1. 那些认为算法和自己无关的程序员一定不是合格的。好多人该用Map的时候不用,非要自己写一堆代码,就是那些认为算法和自己无关的程序猿干的。

    1. Map和算法无关吧……作为一个基础工具,只要不是玩纯C语言的,都要学会用这个东西……
      算法很重要,它是内功,决定了你能走多远。
      但是在实际工作中,只有内功是混不下去的,外功比内功见效快,也更适合。
      所以,你认为绝大多数的程序员真的有必要学算法么?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注