这次不谈技术,谈谈工作。

按月底离职来算,我在华为外包干了有22个月。结合近期找工作的情况,我对这段工作经历有了一些想法。

感谢

首先得感谢中软国际给了我这份工作。

想当时,一个从八竿子打不着的工程行业转行而来、零工作经验还拒绝培训的大龄男青年,仅仅凭借一年的自学就想入这一行,难度可想而知。海投的简历都是海拒。同样是外包公司,易思博就没得面试机会,中软HR就愿意反复提供机会。同样的,进入工作岗位以后,中软PM同意我用上班时间看书学Java(一开始自学Python),也是对我的信任。

很感谢。

论如何做好一颗螺丝钉

在华为外包岗位上,一个最大的感受就是:岗位上接触到的技术面很窄。真正技术上用到的内容很少,占用时间的是大量的业务逻辑。

华为是一家大型公司,员工素质良莠不齐,张嘴就爆粗口的这种人品问题略去不表,有些人创建的数据表甚至连第一范式都不符合。我所在的项目虽然用git管理代码,但是连git-flow工作流都执行不起来。如果是一般的开发团队,都能理解。关键是,我所在的团队负责华为手机安卓版本的运维开发一部份工作,主体业务就是配置管理和持续集成。git用成这样,真的很叫人心痛。我一开始以为华为员工素质高,就算现在不会,将来也应该会。最后发现想多了。

回到前面,每一个岗位都是庞大流水线的一个点,因此技术提升从广度上不要抱太大希望了。而外包的业务肯定不是华为的核心业务。外包岗位的要求很低,只要能干活就行了。因此技术要往深度发展,也不会有人给你工作时间去提升。要想提升自己,必须在工作之外。

矛盾的是,外包岗位最容易发生的事情,就是接到超量的工作量。因为外包公司的利润来源就是这个。超额工作会直接导致加班,进而挤占自我提升的时间。去年有过三个月的996,这让我有很深刻的感受:每天时间都用在业务逻辑上,技术水平完全没办法提升。

办公场地上外网只能浏览CSDN、博客园之类的,都是别人嚼过的。想要看文档很难,Spring官网是没办法直接登入的,但是具体到文档的URL又可以进入。Apache的官网没有问题。还有IBM的DevelopmentWorks,里面的博客质量很高,感谢一下IBM。至于其他的网站就很难了。很多文档都是用邮件发送在家保存好的html或者pdf。

当我认识到靠工作提升很难之后,便开始思考如何自学。

学会说不

首先是时间问题。

我的项目客户方有一个特点,喜欢临时增加工作量。但是,前期谈好的需求又必须保证按点完成。这个很让人头疼。去年的996完全就是这么搞出来的。有人觉得我好说话,甚至试探要不要来一次997。我去~~

打这之后,对于临时需求,我都会告诉他们:前期没有安排这个需求,新增需求请安排时间;如果紧急,就将前期谈妥的需求推后。这本来是一个合理的要求,但是在外包反而好像大逆不道的样子。

增加学习时间

除了增加下班后时间之外,由于我住处离公司较远,开车50分钟。为了利用好这段通勤时间,我选择乘坐地铁上下班。这样我在地铁上有一个小时的时间,解放双手。高峰期在地铁上看书是不现实的,我决定充分利用手机看看电子书。

实际上,去年冬天,私家车限号的时候,我就在地铁上看完了kotlin的语法,看了一部分golang的语法。我觉得这个学习办法还蛮不错的。

今年以来,完全放弃开车上下班,在地铁上看过了Effective Java、CouchDB的官方文档、Nginx一篇关于微服务的电子书、DDD quickly、RxJava和Vert.x的文档、PostgreSQL的一部分中文文档,还有一些HTTP/2的材料。

选择合适的学习方向

学完了以后,发现学习的范围不能太远。比如说,看完了RxJava和Vert.x还是没有使用的机会,只能算是个了解。

最好是紧挨着项目技术栈,然后向外扩展。比如,看的那一本领域驱动开发的电子入门书,就很受用。以前对项目的类的管理很乱,各种util工具类和service实现类都是随心所欲的生成。了解过DDD,就有了一些值对象或者方法对象的概念,知道怎么样组织出一个更有OO思想的充血对象。配合那本Head First设计模式,今年以来对写出更OO的代码很有感觉。

最近面试的感触更深。没有项目经历的技术栈禁不起问。比如有一家公司问我MySQL离千万级的大表有百万行数据怎么删。实际工作中,我能够接触到的数据表很小。这种问题完全不知道问点在哪里。所以说,看书知道了聚簇索引又有什么用,到了面试官哪里,还是张不开嘴。

看书是比较耗时间的学习方式,看源码就轻松多了。

比如,集合类的源码,一个类就1千行出头,找个一两个小时,就能看完。集合类收获最大的要算用对象的Hash值按掩码求交,快速获取hash桶的索引。ConcurrentHashMap从JDK7的锁分离升级到JDK8的CAS替换,将并发量提高了一大截,也是佩服。测试数据可以看Caffine缓存项目的github里的wiki - benchmark页。

大一点的项目,我就看了Tomcat的NIO。这个当初是因为,看一本Tomcat的书里NIO这块只给出了NIO的demo展示,完全没有讲Tomcat的实现,只好自己打断点琢磨。最后收获还不小:

  1. 对象池里的开销大的对象如何归还;
  2. 关联对象的耦合关系的处理;
  3. 在类静态成员使用ThreadLocal实现线程级别的全局变量;
  4. 使用信号量实现读写互斥。

革命远未成功

一般来讲,员工要在一家公司长期留下来是不容易的。因为两者的发展未必匹配,如果公司发展的太快,员工会被淘汰;如果员工发展的太快,很快就会遇到职业天花板,分道扬镳几乎必然。

在外包公司,离职更是家常便饭。

拖延离职

这是我看到的外包公司一大槽点。

明明离职提出了很久了,工作也交接完毕了,但是员工就是不能走。这一块倒是很符合劳动法的一个月时间标准。

而很多用人公司,却是很缺人的,如果到岗时间需要一个月,很可能就不会发offer。我就有这么一份offer丢掉了。

最终,狠下决心,先提离职,再找工作。

尽管要离职了,但是新的岗位还没有定下来。我也还是有一些些个忐忑,但对未来充满了信心。

最后

就酱^.^