我们先说职场上所谓技术问题是哪些原因造成的。
年代久远,菜鸟的产品
巨头也是从初创公司起步的,在起步之初,可能技术实力也不是很好,而且我们知道信息技术成长性很快,现在我们司空见惯的一些东西在十年前还属于无人知晓的黑科技,在这种情况下,一个持续运营的公司,多少会有一些历史上很粗糙和菜鸟的代码,并且可能部分仍在运营,这是正常的。
那么为什么会仍在运营呢?说明这个东西虽然不够好,不够正确,但是一直没有出大的问题,没有给系统添太多麻烦。所以,虽然这个东西不好,但是基于以业务为核心的诉求,企业技术部门并不是特别有解决的意愿和动力。
需求迭代的产物
和教科书不同,职场上的需求是瞬息万变的,一些初入职场的人会觉得公司需求经常改,要求经常变,无法接受,觉得是不规范、不健康的表现。15年前,乃至20年前,我们说印度软件业最为发达,其开发流程最为规范,当时很多中国企业去学印度,学开发规范,觉得印度在IT方面远远领先中国。但是发展到今天,在互联网大潮中,请问哪个互联网公司还会去印度取经学习开发流程和规范?请问谁还会说印度比中国在互联网研发领域领先?问题在哪里呢,中国互联网产业之所以发展快就在于没有包袱,敢想敢干,随需应变。传统软件工程领域里,印度可以作为定制开发的楷模,强调需求确认,强调定稿,但是这种模式在互联网时代是自寻死路,你必须能随时跟着需求走,跟着时代的潮流前进。如果按照所谓的瀑布流去做项目,你做互联网,必然没有机会。我刚毕业的时候,也遇到过这个问题,领导说,好好学软件工程,今天我可以明确地告诉大家,在互联网时代,软件工程里的所有开发思想,除了敏捷开发值得学习外,其他的都可以不用再考虑!如果你还认为你的开发需要明确的边界条件,明确的需求确认,明确的发展路线,请离开这个行业。
所以,问题就出来了,一个产品,最初设计的目标是A,但是开发过程中突然发现B才是真正的目标,而好不容易把开发一半的目标A的系统转为目标B,上线之后又发现需要兼容C和D的目标,所以,新人不了解这个背景,这个迭代的历史,就会觉得,这系统谁设计的,逻辑怎么都是拧着的?没办法,不断试错,不断调整,就是这样过来的。
所谓的正确的架构,存在着你所不知道的坑
就好比前面说的第三范式,新人一看,数据结构各种冗余,你怎么不会第三范式啊,大学课程啊,因为他不知道涉及分布、涉及负载均衡的时候,这个第三范式无法满足快速扩展的需求。所以很多时候,教科书上的一些范例、方法,并不适应新的业务需求和应用场景,而此时,就会被只读过教科书的孩子们认为是,代码太烂,技术太逊。
技术演进中的印迹
一个多年运营的系统,在演进的过程中,会存在大量不同的参与者,每个参与者都会有自己的逻辑、想法,以及处理的方式。那么在代码迭代中,技术的迭代往往是优先考虑最紧迫的任务,优化最耗费资源的模块,在不断迭代中,代码的一致性和结构的一致性可能就无法维持,导致一些本来架构优美的结构可能只剩下两三个模块,新的迭代代码替换了其他模块,但是新人就觉得,这模块做得好复杂,好啰唆,很多没意义的东西塞在里面。请相信我,再优美的技术结构,经过几茬这样的迭代,都会变得面目全非,杂乱无章。然后等待下一个神来做整体的重构。
侧重点不同的考量问题
比如说,新人发现一个报表系统效率很低,耗时很长,于是嘲笑,连索引都不会吗,这么烂的结构怎么设计的?但是他不知道的是,这个数据结构首先要满足一个非常巨量的每日数据新增,而后才要满足每周一次的报表生成。那么,如果按照他认为生成报表的优美结构来设计,所增加的索引和数据字段的设计,就会在日常带来大量的i/o开销,数据新增的逻辑就会导致额外几倍十几倍的开销,也就是说需要很多台额外的服务器来支撑,而收效却是,可以每周生成报表的时候从几十分钟缩短到几秒钟,那么如果你是老板,你会同意这样的方案吗?
资源紧缺的作品
大公司也会资源紧缺吗?至少人力资源一直是紧缺的,比如有个紧急的活动,有个紧急的任务,时间特别紧,程序员只好急急忙忙从第三方开源软件抓了一段代码,改改塞进去了,反正业务满足了,至于不好那也实在没时间了,结果这个临时活动效果不错,于是慢慢成为常态活动,而这个工程师又去干别的去了,这个代码反正也没出错,那就一直跑着。新人来一看,这啥玩意啊,代码东一榔头西一棒槌,这程序员不会设计系统吗?
那么,下面要说,新人就不能提出现有系统的问题吗?就不能提出改进的方案和建议吗?当然可以。你进入一个企业就是干这个的,公司花钱养你就是让你来改进系统提升业务支撑能力的。但是,这需要有一个正确的认识和思路在前面。
第一,尽可能更完整地了解系统,查看一套代码的时候,了解所谓的不好的起因是什么,历史演进的过程是什么,了解其在业务系统中的地位和价值是什么,有了一些认识和理解后,再来思考所谓好和不好的问题。
第二,从一个最有把握,结构最简单的地方入手,用你认为正确的方式修改一个最小的结构,先通过测试、发布的流程,然后再通过运维和其他主管人员获得反馈,了解改进是否具备对旧版本的比较优势,以及比较优势究竟有多大,多重要。不重要没关系,但是你要了解是否这个改进是正确的;完成第一个后,努力去完成第二个,当你能够顺利发布完成十个或更多的这样的改进和优化,并确认你的代码比较优势确实明显的时候,再来谈别人的代码的问题,如果你这些都做到了,不需要你来谈,你的主管会看得到的。
第三,轻易不要谈重构。
我讲过一个架构悖论,为了满足所谓高扩展性的原因,开发人员做了一个特别复杂的逻辑关系特别庞杂的系统,他们说这个系统多花点时间是值得的,因为以后你有新的需求可以灵活扩展了!于是产品人员和运营耐心等待。
新系统上线后,市场发生了一些变化,新的热点出现。运营人员说,我们能不能增加一些功能。技术人员说,对不起,这个需求在我们设计的初期完全没有考虑到,因为现在架构太复杂了,所以这个版本肯定不能支持,你放心,下次重构的时候我们会考虑的。
我对架构的原则是,适度灵活,简单至上。你会发现,越是简单的架构,遇到新的业务需求,改动和升级越容易,很简单的一个道理,新的工程师进来看代码理解逻辑的成本低。所谓照顾更多的需求可能性,这么说吧,人家设计了开发语言,就是照顾更多需求的可能性,你难道也要设计一款开发语言?
如果你发现一个巨头依然存在很多技术上连你都觉得不对的问题,你应该高兴才对,这不是你的机会吗?但是你要明白,哪些是真的问题,哪些是你涉世不深的误会,你一步步解决这些问题,在解决过程中一步步理解系统,到一定程度,你会明白更多,理解更深。只是站出来喊,这些垃圾那些垃圾,只能暴露你的浅薄和无知。
走出心理舒适区
我们经常会看到一些新闻,一些学霸在职场出现困境,陷入绝望;身边也经常遇到这样的例子,不少学霸对自己职场状况不满意,会说,我其实很努力,很勤奋,为什么不如当年的学渣同学发展得好。其实很大一个原因就是他们的勤奋,往往是用某种领域的勤奋,去掩盖他们在另一方面的懒惰和怯懦。我用一个词描述——心理舒适区,他们看上去很辛苦,很努力,其实是躲在自己的心理舒适区里。上自习,上课,刷题,刷学分,累但是很满足,这是他们觉得自己最适应最自我满足的一种状态,而沉醉在其中,可一旦外部环境发生了改变,他们所擅长的学习和生活方式发生了根本的变化,他们就会陷入无所适从,不知所措的境地。
当然,实话实说,随着职场的锤炼,99%的这种症状会自愈,但这个过程还是很伤人的,比如怀疑自己,失去信心,以及心态变得消极。心理舒适区往往来自于一种习惯,来自于你所熟悉的场景。很多打工的人觉得自己很辛苦,很努力,但是其实很多时候他们的辛苦和努力也是在掩盖他们拒绝改变的一种怯懦。辛辛苦苦很早起来去上班,很晚回家,辛辛苦苦做很多事情,但是拒绝去学一种新技能,拒绝去尝试一种新的领域和机会,这都是躲在心理舒适区的表现。
每个人都会有自己的心理舒适区,都会有自己习惯的生活方式,沟通交流方式,以及有自己拒绝和不愿意面对的领域,这也不奇怪。从校园到职场,其实可以说是从一个心理舒适区走向另一个心理舒适区的过程,职场真的很压抑很难受很痛苦吗?如果你这样觉得那说明你的工作错了,职场其实一样可以是很累很辛苦但是很开心的,只要你找到了新的心理舒适区。
那么,回到最初的话题,为什么说学霸们的心理舒适区有问题呢?因为他们习惯的场景太窄了,把自己未来的路设计得太窄了。有些学霸积极考研,与其说是对学习有特别的爱好,不如说是面对职场的怯懦和拒绝,他们以为靠研究生的学历和成绩单就可以更胜一筹,殊不知用同样的时间和精力付出可以选择无数让用人单位眼前一亮的事情来做,在现有教育体系下,读研绝不是提升自己职场能力的最优选择,但他们甚至拒绝做这样的思考和判断,这就是躲在心理舒适区的一种典型症状。因为只有这个选择他们最熟悉,最擅长。
并不是说你一定要怎么别扭怎么来,而是要想办法拓展和扩大自己的心理舒适区,好好读书没有错,如果非要读研也不能说是错,但是不要让自己总是躲在一个很小的舒适区里出不来,要敢做一些改变的尝试,挑战一下自己之前胆怯的领域,这样对职场,对工作才能更好地适应。
分享几点关于如何扩大心理舒适区的建议。
1.多参与分享,多上台演讲,能够克服演讲恐惧,对未来的工作和个人发展绝对大有帮助。
2.在保证安全的前提下,多接触不同的人群,多了解不同领域的信息,尝试和各种人沟通。试图理解更多以前无法理解的东西。
3.在合法的前提下,力所能及地尝试去做一些不同的事情,并尽量做好。
比如,组织一个主题社团,组织一些主题活动,如义卖、慈善募捐等,做一些校园的小生意,接一些兼职的有挑战性的工作。这些事情不一定为了赚钱,同样是为了锻炼自己去适应社会、理解社会,以及锻炼沟通和面对问题的能力。
4.适当学一点无聊没意义的东西,比如弹琴,下棋,绘画,等等。
扩大接触面和知识面,不要把所有的学习功利化。很多看上去没用的东西,很可能潜移默化地帮到你。
5.进入和浏览一些不同类型的社区,观察和参与一些职场人士的讨论,不要盲目用想象来猜测职场。
在职场,我们也是要不断摸索,寻找新的心理舒适区,心理舒适区不代表你不累,不辛苦,但是如果你没有觉得工作很有趣很开心,说明你还没有找到。这个过程需要你正确地认识自己,有可能需要很多时间。
不要轻易给自己定性
很多人觉得,我大学学了这个专业,我读了这么多年书,如果做别的行业,是不是就浪费了?是的,的确是浪费了,但是请相信我,就算你读得再好,其实到社会上,专业技能基本上还是白纸,有些基本功当然很重要,但其实跨行业也能用上,其他的那些,也真没那么浪费。此外,你要知道一点,大学教育一直落后于时代的发展,特别是现在这个年代,新东西出来得太快,你要是等大学开课了再去搞,哪还有你的饭吃?
所有开辟性的新行业都面临一个问题,你根本没有对口的应届生可用,而恰恰这是新人最佳的时机。有一个算一个你们去看,那些茫然无知冲入新行业的年轻人,他们的平均回报率远远超过那些在自己擅长领域因循守旧的家伙。回到十几年前,那些糊里糊涂去了百度,腾讯、阿里的,和按照自己职业规划去了知名外企的,谁的回报高?由于新领域人才紧缺,当时这些青涩的巨头的入门门槛比那些知名外企,不知道低了多少。那么很多人会认为这只是某个时段的特例,我个人认为,今天依然存在这样的窗口。
从二十年前市场对程序员的迫切需求,到十年前对产品人才的迫切需求,三五年前对移动开发技术的迫切需求,都体现这样一个规律。新兴领域激增的需求,没有传统的专业对口来满足,其人才的成长速度,薪酬的提升速度,都是惊人的。可能这话说出来很多人都不信,二十年前程序员有多吃香,能独立完成项目的收入水平绝对是金领一族。第一批投入新兴领域的,其回报速度是惊人的,因循守旧就会错失机会。