朋友来网易面试,挂了~

5/3/2021

最近推荐一个朋友来网易面试,这哥们在小厂工作6年,研发经验非常丰富,但他却挂在了技术终面。

事后和他约了个饭,深聊了一次发现他的技术成长路径还是有点问题。

软件开发行业需要经验,需要时间来沉淀,但从我个人发展情况以及带过的下属来看,这种成长绝非线性成长,而是突变式成长。

所谓突变式成长就好比豹变和顿悟,仿佛一下子打开了任督二脉成为高手。而硬币的另一面是:不少工作10年的人,从经验和能力上考量和他刚毕业1、2年差距不大。

“我们以为我们是工作了10年,其实却只有一年的经验,只不过又重复用了九年”。

不少朋友虽然工作了很多年,但他们很少学习计算机体系基础知识、很少在debug能力上突飞猛进、很少去研究计算机底层知识和原理。除了最初几年能成长,之后一直停滞不前,而且他们不明白为什么。

这样的朋友在工作3、5年后,想进大厂很难,即便是在中小厂也很难成为架构师或者高级工程师。

而有些同学,才工作1,2年就能在工作中展现出优秀的能力、承担重要模块的研发和攻坚,甚至能独立做一个大的产品。

今天结合和这个读者朋友的深聊以及过去12年带团队的经验,讲讲作为程序员我们需要避开的4种表现:

1.不重视底层技术

应用层的技术,程序员们为了完成工作一定会大量学习,但其实底层技术同样重要,甚至更重要。

那么哪些是底层技术呢?拿windows C++技术栈举例:

  • C++语言高级特性:运算符重载(一元运算符、二元运算符、运算符重载难点、项目开发中的运算符重载)、多继承及其二义性、虚继承、多态、函数模板、类模板,模板的继承、程序编译链接机制、内存布局(memory layout)、对象模型、各种容器的实现(vector、map、hashmap)等等;
  • 算法和数据结构:尤其是和C++结合的算法能力及数据结构的应用能力,hash map、B+/B-树、算法在C++容器中的效率应用、DP(动态规划)等;
  • 网络底层:HTTP、HTTPS、DNS、ARP、TCP、IP、ICMP、UDP、FTP、SMTP、的实现底层;
  • 多进程/多线程编程:进程通信的方式(共享内存、pipe、Socket编程等)、同步、死锁及解决方案、线程池的实现、进程/线程的操作系统实现原理、进程的状态及切换和调度等;
  • UI库的实现机制:WTL的实现机制、QT的实现机制、Windows C++底层绘制原理(这块简直博大精深)、窗口消息机制、DUI的实现机制等;

很多程序员朋友,完成业务开发没什么问题,但一遇到系统性疑难杂症,立马就失去了方向。原因很多,但最重要的无疑是缺乏底层技术。

再举个应用场景的例子:一提到分布式锁问题,大多数同学想到的方案是基于Redis的Master-Slave模式来实现。这个实现方案行不行?分布式锁本质是一个CP需求,基于Redis的实现是一个AP需求,乍一看基于Redis的实现是无法满足的。

脱离业务场景来谈架构都是耍流氓。从技术战略的需求层面来看,如果分布式锁在极端情况下获取锁的不一致,社交业务场景能够接受,那么基于Redis的实现是完全可行的。

如果业务是交易场景,分布式锁在极端情况下获取锁的不一致性无法接受,那么基于Redis的实现方案是不可行的。在锁强一致性的场景下,需要采取基于CP模型的etcd等方案来实现。

做出以上判断,需要深度理解底层系统原理。缺乏了这种理解,无法做出正确的架构抉择,也自然会对工作造成不利影响。

夯实的底层技术还会让你具备一通百通的能力,旧文说过:我们要进入高手模式,能举一反三。对于程序员来说,不清楚底层技术基本与高手无缘。

底层技术具备可迁移性,更上层的应用技术却被特化。

拿我自己举例,早期积累了深厚的C++底层技术基础,2011年在cocs2d还没成熟之际,自己用C++写了一个小的游戏引擎,这套代码应用了大量windows C++的思想,这就是底层技术的可迁移性。

另外,大厂的面试官酷爱考察底层能力水平,诸如上来就让你手写算法、通过你的工作经历层层深入问下去,尤其是如何调优之类。

2.不能在错误中汲取教训

对于软件开发人员来说,在工作中获得反馈,并通过反馈矫正行为和方向非常重要。

这其中的重点是:在错误中得到反馈,并汲取教训,获得成长。

交付产品的BUG、一次code review的结论、领导对你提的建议等等,这些你是否记录了、沉淀了,并力争在下次得到进步和改进?

来自业务、产品和其他人的反馈,会让我们明白自己的短板在哪,应该如何针对性的学习和成长。

很遗憾的是,不少同学不仅不会在错误中成长,反而试图掩盖和消弭自己的错误。

应该怎么做:

  • 对每个反馈保持积极的态度。你可以选择接受或者拒绝,但都应该保持平和和学习的心态。
  • 从错误中学习。没有人能永远正确,终身学习才能让自己持续强大。

3.习惯写烂代码

大部分优秀程序员或多或少都有代码洁癖,这是因为他们把代码和交付物当作艺术品而不仅仅是完成一项工作。

关于这点,我们看看曾经是程序员大神的雷军是怎么说的:

“编程的工作和石匠的工作相差不多,是技术活同时也是体力活,而编写优秀的软件,是一件困难的事情。编程不仅仅是技术,更是艺术,也只有具备对艺术的追求,才能催生出更多优秀的产品。”

缺乏经验的程序员很难写出优美代码,在看他们的代码总有一种感觉:一不小心就陷入了迷宫,找不到方向和出口。

应该怎么做:

  • 在动手写代码之前,设计出代码框架并用StarUML等软件绘制出代码时序图和类结构图;
  • 重视命名规范和注释,命名最好能起到部分注释作用;
  • 定期重构代码,无论是函数和类的抽离、还是架构的优化,在不影响业务开发节奏的基础上,需要经常做。

追求代码的优美还有一个很明显的好处:会帮助你快速获得结构化能力和思维。

别怀疑,有经验的技术面试官可以很轻松的考察出你的思维是否是结构化的。

4. 盲目追逐新技术

很多开发人员总是在谈论技术潮流,当有了新的技术之际,他们总是异常兴奋,快速投入这项技术的怀抱。

过了一段时间,更新的技术出现了,他们又抛弃了刚学会的前一项技术。

这就跟狗熊掰玉米一样,他们总是在学习教程,并且总是虚幻的感觉自己都掌握了,但其实真正要掌握一项技术需要长时间的实战应用并需要在反馈中前行。

限于公司业务的稳定性,他们学习的新技术大部分不会应用于线上产品,自然很难得到实践和反馈。

应该怎么做:

  • 从工作中需要的技术学起,再应用到工作中,同时从线上得到反馈并改进。
  • 即便学习和工作无关的新技术,也要做一些实际的应用或者小玩意出来。

2008年我刚加入腾讯,发现我们的QQ游戏大厅调用游戏程序存在1%左右的失败率,这之后我深入学习了管道通信和共享内存通信,并做了一个调用失败立即切换的SDK,替换了原有的多进程通信的方式。上线后失败率下降到1/1000,这个过程让我真正掌握了新技术。

以上四点真正在工作中做到,相信大家的进步速度会明显加快。另外程序员常见的一些问题也需要规避下,比如养成工作摸鱼的习惯、傲慢自大(新手在学到一些知识之后,很容易站在愚昧之巅)等。

程序员朋友在职场的前5、6年,一定要想办法进大厂,虽然大厂不一定是职场终点,但大厂有这些优势:海量用户量、健全的福利、完整的培训体系、完善的晋升制度,它们会助力大家的发展。

今天就说这么多了,51大家都出去玩了吧,祝大家玩的开心呀~

洋哥这几天会持续输出干货,大家可以留言讲讲你希望洋哥写的方向呀。