以下内容节选自《码农翻身》,我对这些内容深有感触,因此整理出来推荐给年轻的程序员们看看,希望激发大家去看看原书的兴趣,从而在IT技术道路上精进。
顺便说一下:此书80%的内容,还是在讲IT技术的(用讲故事的形式、浅显易懂),适合架构师以下级别。
凡事必先骑上虎背
有人问我,说他所在的是一家中小型公司,开发团队有十来个人、七八条枪,做行业软件,现在公司没有技术经理,只有一个懂业务的总监来管理所有开发人员,而且开发人员都是初级水平,大部分只有一两年经验,相比而言,他还算老人。总监认可他的技术,似乎有意让他做技术经理,最近公司招人也让他去面试。
但是他不太自信,觉得表达能力不行,有些技术还比较薄弱,领导布置的功能可以做出来,但是说原理就有可能卡売。我告诉他,这正好是一次机会,是最好的学习时机,有了问题的引导,你会疯狂地学习,迅速地提升自己。
我想起了2009年看过的一本书《陈寅恪与傅斯年》,里面形容傅斯年的性格是“凡事必先骑上虎背”,这句话我一直印象深刻。
对于我这样一个性格内向的程序员来说,我在遇到机会,犹豫不决、缩手的时候总会想起这句话,然后鼓起勇气先骑上虎背,让自己下不来台再说,但是真的尽自己最大力以后就会发现,事情没那么难,最后还都把事情完成了。
作为一个擅长和机器打交道的群体,大部分程序员的性格都比较内向、沉默。别看在网上、在O群里谈突风生、幽默有趣,斗斗得不亦乐乎,但是回现实中,面对一群“真人”的时候,连准确地表达自己的观点可能都做不到,更不用说去柔中带刚、唇枪舌剑地去争抢某个东西了。
程序员大多实诚、谨小慎微,很多事情不敢也不会去努力争取,完全靠自己的能力吃饭。这样很吃亏,因为你的能力无法完全体现,在工作中只能表现出一部分,比如10分的能力只能显露出7分,剩下的3分可能就被埋没了。
对于ー个内向的人来说,害怕失败,害伯被别人说自己不够格,所以总想把自己修炼得尽善尽美,在达到基至远远超过那个职位的要求以后心里オ会踏实,才会想着领导会看到,让自己去负责那项工作。可是反过来讲,世上哪儿有等你完全准备好以后才开始做的事情?你觉得完全准备好以后,黄花菜都凉了。
IBM每年害期都有一项叫作“蓝色之路”的实习生计划,招聘学生到公司实习,在这项计划中有四五个被称为 Extreme Blue(青出于蓝)的项目,面向的是优秀的大学实习生。这个 Extreme Blue项目是由IBM的员工提出有创新的、有商业价值的想法,由这些优秀的学生去实现。
作者在2008年提出了一个想法:在一个3D虚拟世界中构建一个支持数捷软件开发的环境,有幸被选中作为 Extreme Blue项目之ー。当时我对散捷软件开发还算了解,但是对于在3D虚拟世界中建模、编程一无所知。可是已然骑上虎背,下不来了,接下来马上要带着实习生来实现,怎么办?只剩华山一条路,明知山有虎,偏向虎山行。那就是逼着自己赶紧进入未知领域,拼命地去学,像海绵一样吸收各种知识。几个月以后,我们确实把这个项目做出来了。
举这个例子就是想说:对于性格内向的程序员,很多时候你认为基本准备好了其实就够了,凡事必先骑上虎,勇敢地迈出去,努力地争取一下,你就会发现自己登上了更高层的台阶。
一名架构师的总结
我和很多人交流过一个有趣的现象:那就是从刚毕业到30岁这段时间,会觉得时间过得很慢,总觉得自己还很年轻;但是一旦过了30岁,时间就如白驹过,一年又一年飞逝而过。我自己也是,眼看着毕业快15年了,15年间从一个刚毕业的菜鸟成长为技术骨干,做到架构师的职位,回头看看,编程虽然枯燥辛苦,但是如果真的感兴趣,就能体会到其中的乐趣。
好奇心
刘慈欣在《朝闻道》中描绘过这样一个情节:在古老的非洲大陆上,有一个原始人无意间抬头仰望星空,凝视的时间稍微长了一些,超过了外星人设置的國值,立刻拉响了人类即将产生文明的警报。因为外星人认为,人类已经产生了对宇宙的好奇心。有了好奇心,文明的产生、科技的发展不过是一瞬间的事情。
确实是这样的,好奇心驱动人类不断向前,在短短的几千年(相对于长达几十万年的原始时代)里就登上了月球,并且努力向其他行星拓展。
对于程序员来说也是如此,如果你看到新技术、新产品没有像小孩看到新玩具那样两眼放光,没有立刻在自己的电脑上试试的冲动,你就需要仔细考虑一下是否真的对软件开发有兴。如果根本没兴趣,那不要浪费时间,还是趁早转行,有更多话合你的职业在等着你。
没有好奇心,就不愿意追本溯源,追求技术的本质。
没有好奇心,就难以静下心来,耐得住寂寞,远离浮躁,更难以跨过这个行业所带来的种种挑战。
没有好奇心,就不愿意学习新技术。一名架构师,如果没有对技术的敏感度和前性,直抱着一套技术架构不变,估计很快就会被海汰。
当然,自制力强大的人除外。但话说回来,靠着自制力让自己做自己不喜欢的事情不非常痛苦?
在一堂关于领导力的培训课上,老师一直在说 Passion(激情)、Passion、 Passion。但我直觉得,没有好奇心,没有兴趙,怎么会产生 Passion呢?所以,对技术的好奇心、兴趣是一切的基础。
抽象的能力
抽象思考的能力怎么强调都不为过。
现实的需求纷繁复杂,如果架构师不能把这些乱无头绪的需求抽象成一些“概念”,在概念的层次进行思考,那么系统根本就无法设计。
我认为,把纷杂的事物抽象到数学层面是最高的抽象。也许有人会说哲学层面才是,但到数学层面已经非常难了。
我在之前的公司有率遇到一次,把针对税务领域的 Credit, Debit s等概念抽象为在一个二维坐标下点的运动,问题一下子简化了很多,实现简单,并且非常安全可靠。
但是抽象成数学模型和算法通常是可遇而不可求的,在这种情况下,我们需要退而求其次,试图抽象成若干个正交的概念,以此来降低复杂度。
“正交”在数学上指的是线性无关,最常见的例子就是坐标系下的x轴和y轴。对于一个点来讲,它的x值的变化不会影响到y,y值的变化不会影响到x,即x和y是正交的。
正交的威力在于互不影响、扩展方便。单用一个x轴可以表示一条直线上的所有点;再加一个y轴就能表示平面上的所有点;再加一个z轴,三维空间中的所有点都能表示出来。
人类的大脑在思考问题的时候是有容量限制的,难以同时驾驭太多复杂的概念。如果我们的软件系统也能做成x、y、z坐标这样,就带来了无与伦比的好处。你在处理与x轴相关的事情时,不用考虑与y轴和z轴相关的事情,因为你知道它们不会受到影响。这样问题的复杂度就从三维一下子下降到一维,更容易把握了。
抽象能力的训练没有捷径,就是经验的积累,勤于思考和学习。例如学习 Java Web:开发的可以思考一下为什么 Spring有 Controller、ViewResolver这样的概念?学习 Android的可以思考一下 Android是怎么对未知的、纷紧复杂的应用程序进行抽象的?为什么会有Maven、Git、Nginx、Hadoop这些产品呢?
开始写作吧
我时常会有这样的感觉:自己心里党得对一个技术点已经掌握了,但是当我试图给别人讲述的时候,发现并不能轻松自如、深入浅出地讲出来。
这就说明了一个问题:自认为掌握了,其实并没有真正掌握,大脑只是对这个技术点建立了一个整体的概念,在一些细节处做了想当然的假设,等到你用语言再来表达的时候就会发现,原来这个假设井不完全成立,是有问题的。
估计大家都有这样的经验:如果你能把一门技术通俗易懂地给别人讲明白,那就说明你已经掌握了。这种“转教别人”( Teach others)的办法属于主动学习,效率是最高的。但是在工作和生活当中,你是很少有机会去给别人讲授的。
那怎么办?总不能拉着你正忙着的同事说:“哥们儿,来,我別学了 Java CAS,我给你讲讲吧。”也许你的同事很有礼貌,耐着性子听你地讲完了,然后不知所云。前几次还行、次数多了,就对你敬而远之了。既然没法给別人讲,那就退而求其次吧,把自己的理解写出来。
当然不是泛泛地记流水账,或者把几个孤立的点罗列在那里,而是要把思路厘清楚,尤其要写出为什么要有这门技术、这门技术解决了什么问题,然后才是这门技术是怎么使用的。
当你逼着自己去回答这些问题的时候,很快就会发现,自己的理解还不够,还需要查找更多的资料。在你从网上查找资料的时候,你会发现,网上的这些文章怎么这么差劲,重复的内容这么多,大部分都是复制、粘贴的,大部分都在讲述怎么使用,对于“为什么”从来都是只字不提,或者犹抱琵琶半遮面,羞羞答答地不说出来。
这个整理资料和思考的过程是很珍贵的,只有这样才能把信息变成你自身的知识。如果实在搞不定,就带着问题去论坛提问,去QQ群发言,找大牛请教,总是可以解决的。
有人可能要问了:我也可以按照这个思路去学习,为什么要写下来呢?原因很简单:不写出来,很容易放弃深度思考。
我们已经进入了一个碎片化的时代,我们的大脑已经养成了碎片化的习惯。写作会逼着你去深度思考,梳理知识体系。