陆游有诗云:书到用时方恨少,事非经过不知难。我们常常在需要用到某些知识的时候,才发现自己没有储备,只好来一句“我读书少,您不要骗我”。做事也一样,虽然我们可以预估它的难度,但这种预估往往会偏离实际,甚至没有经历过的人,本来挺难的事情也会认为很简单,口头禅是“这事情也就毛毛雨啦”,可谓无知者无畏。
这两句诗反映的现象,在每个人的生活中都应该是一种常态,不得不佩服陆诗人善于观察善于提炼的能力。佩服完了,我们还是希望这种现象更少一些,简单来说,就是要多进行知识储备,多做事情来历练。
闲扯完毕,进入正题:作为一个技术领导者,如何做好你的知识储备呢?虽然我早前在拙作《 漫谈中小企业研发技术栈 》中有类似内容,但没过瘾,在这里还想再谈一谈。
在我看来,作为一个技术领导者,应该是个多面手,而且最好还要在某一方面相对精深。在自己不精深的领域,了解整个概貌也许就可以了,但在需要的时候,具有随时深入领域细节的能力。而这种随时深入细节的能力,是你之前就已经在某个领域精深过,通过举一反三,可以知道如何深入到另外的领域知识里面。从这个角度来看,要融会贯通,首先需要渊博,要可以随时深入某个陌生领域的细节,首先要具有曾经深入过其它一些领域细节的经历。
技术领导者因为精力分配的原因,往往不再是某方面的技术专家,但已有的经验可能让他具有更好的嗅觉,知道应该往哪个方向走,哪个方向坑少一些。这样的话,就需要他了解各个前进方向上,沿途大概都是怎样的风景。也就是说,他需要对各种技术方案带来怎样的效应有一定的洞见能力,这种洞见能力离不开他对技术本身的理解,离不开他已有的踩坑经验。
以我自己的经历来说,我的技术栈相对比较丰富,但也有点杂而不精的意思,很多技术都是用了段时间就换别的了,因此也难以继续深入。我在Windows上开发程序有五年的时间,从应用层到驱动层,之后转到云计算方向后,基本在用Linux系统,也花了不少时间学习Linux内核知识,阅读并调试相关内核代码。之后,又转到应用层开发,直到现在。编程语言用过C++/C#,Python, Java,PHP,JavaScript等,早些年比较深入学习编程语言,后面基本就只当作工具来看待,只学到能用来实现功能,并懂得遵守最佳实践避免一些陷阱的程度。这些东西现在都成为了我的储备知识,招聘时候,各种技术岗位都可以随便问相应的问题,而不需要再提前做功课。
即便已经在不断地学习新知识,扩宽知识面,我还是觉得自己的知识储备远不够。比如人工智能时代的到来,机器学习变得火热起来,当然这种火热应该结合具体的业务场景,否则我们也没有必要追随新技术。我之前只是了解了解过机器学习领域的相关概念和基本算法,但目前来看,我认为自己还需要稍微再深入一些。首先我会找到机器学习方向比好的资料,然后看这里面需要哪些前提知识,再去学习或者复习这些知识,比如大学里上过的线性代数课程。已经有人把机器学习方向所需要的线性代数内容做了整理,对于我这样没有那么多时间从头去学习线性代数的人来说,选择机器学习方向常用到的线性代数内容来复习就够了。对概念和算法基本了解之后,我还会去了解使用各种编程语言进行这方面开发大概是怎样的。比如Python人工智能方向编程,有一个库叫scikit-learn,那么我要去了解这个库是怎样被使用的,提供了哪些接口,需要怎样的知识储备才能使用这些接口来完成常见的一些任务。了解这些库一般是抽象、封装到什么程度,一般来说,封装得越多,使用者使用起来更容易,需要学习的底层知识就越少。这样之后,我就可以对这方面开发的工作量以及工作难度有一个更靠谱的评估,同时作为招聘方的话,也更懂得如何去衡量一个面试者这方面的技术水平,以免被忽悠。
对于小公司来说,技术领导者往往也扮演架构师的角色,先不管他实际上是否达到架构师的水准,反正硬上就是了。这时候技术领导者应该是个系统架构师,而不是业界常说的Java架构师、C++架构师。我认为不同语言不同开发生态选择使用的组件有不同,设计模式也会有些不同,但架构思维是相通的,一个在Java方面能够做好架构,在公司选择使用别的编程语言时无法进行架构设计的人,严格意义上不能算一个真正的架构师,只是一个Java方向的熟练工罢了。作为系统架构师的技术领导者,也就需要具备各方面的知识,比如开发、测试、运维和软件工程相关知识。
总之,技术领导者应该经常拓宽并更新自己的知识储备,以致于在这个技术更新换代异常频繁的时代里,不会稍不留神就落伍了。你看看我,一个工作了十年以上的老鸟,现在又学起线性代数来了,压力固然有,但我只想跟这不争气的发际线说一句:您能别老往后移了吗?
微信扫码,进入【技术人成长】社群逛逛。