徐鹏——代码改变世界
这个ppt是我昨天晚上两点多写的,大家可见RD的生活是什么样的。我想说的是,程序员是最讲究优雅的,可能他穿一个拖鞋,但可能他写的代码非常的优雅;你会发现他的博客上会非常的精美,所以我觉得优雅不优雅不一定在于一个人的外表,而在于看他做的事。
我叫徐鹏,我是今日头条的工程师。如果在大学的时候有人告诉我有人要回北邮给大家讲怎么做技术,我觉得那完全是扯淡的。我告诉大家肯定不可能,因为我在大学的时候觉得我不会去做技术,因为我觉得自己可能不太合适做技术。到研究生之后,我慢慢的也因为一些不知名的原因坚持做了技术,然后我发现技术是有它的魅力在里面的。
就是大家在做一个事情的时候,在你没有做好的时候,有可能会去怀疑自己是不是适合做这个事情,比如说很多人在刚开始编程的时候认为之前没有接触过,他在做的时候会说觉得自己不适合编程。其实有可能你做了产品经理之后也觉得自己不适合做产品经理。其实这不是一个借口,如果你没有发现自己适合做什么,你就应该去尝试做一个东西。你觉得自己不适合编程,那你有用心编过程吗?你有用心的做过这个事情吗?你没有用心的做过,你怎么知道自己做不好呢?
第一 我要讲的是“知道or不知道” 有四种情况:你知道你知道;你不知道你知道;你知道你不知道;你不知道你不知道。知道知道很好讲,不知道知道也很容易讲;知道不知道,比如说我知道C++,但是我不会,这叫知道不知道;不知道不知道就是你不知道自己不知道。但是不知道不知道是会影响你的轨迹的,比如你不知道你自己是一个天才,但是如果有人告诉你,这个事情该怎么去做,那么你就能把它做好。所以影响大家check的就是你不知道你不知道。所以今天就重点给大家讲讲你不知道你不知道的东西。
1、软实力——上手能力很重要 其实我今天不太想给大家讲找工作的东西,找工作的东西大家都比较清楚,其实更想讲的是让大家在大学里时间很充裕的时候成为一个真正的工程师,全名叫软件工程师。成为一个工程师需要什么东西?一个叫软实力,一个叫硬实力。什么叫软实力,我进了头条之后会面很多BAT的工程师,但是有很多他简历上非常优秀的东西在我们这边都是没有用的,是他的硬实力不好吗?C++、HTML5都不明白吗?JAVA虚拟机搞不清楚吗?不是的,是第一个软实力不行。一个工程师最重要的是什么?我告诉大家,叫上手能力。
什么叫做上手能力?我现在举一个例子,就是我布置给大家一个作业,要大家用JAVA去编一个很简单的东西,就写一个hello,world!有的同学可能会在别人dota一把的时间他就把这个搞定了,有些人可能搞了一个星期、一个月都没把它搞定,这就叫上手能力。这个东西怎么练,有些人说自己搞JAVA,“哇塞,我JDK装了好久,都要崩溃了,我装了一个星期,把所有的坑都踩了一遍。”然后呢,最后没装好,就告诉自己:“我不适合做编程。”这就是错误的,其实没有人生下来上手能力就是好的,所有人所经历的东西都是这样的,就是一个人从不会写代码到他写代码写的非常好,这个过程一定是很痛苦的。但是每个人对于痛苦的耐受力是不一样的。就跟有些人他长跑很厉害,能跑二十公里、四十公里甚至能跑马拉松,而有些人像我一样,只能跑三圈,就是我们对于跑步的耐受力不行。这就是软实力。就是你对一个工程,对一个技术,你对它的容忍,你在遇到坑的时候解决问题的能力,这个叫软实力。
知道软实力之后怎么去锻炼呢? just do it! Just do IT! 就是要去做,一定要去动手,一定要有那种钻研的精神把它搞出来。如果你做JAVA,你会发现,你第一次run的时候会有一点问题,第二次run的时候会有一点问题,但是慢慢的到后来这个问题一定会收敛的,收敛到你可控的范围内,到那个时候你就告诉自己,JAVA方面的东西我可以handle了。当你在玩python你发现python也就那么回事儿,东西都是相通的。所以这个东西叫软实力,很重要。
2、内功和外功 我一直觉得程序员像行走于江湖的剑客,每个人都有自己的一门独门绝技,或者有些人你会发现他内力极其深厚,让他去掌握一门武功的时候,他能在很短的时间内就把它掌握,而且玩得非常好,可能比一个专家玩的都好。什么叫内功呢?对于程序员来说有些东西是无法在短期内突击的,比如说一些工具Linux,没有人说我Linux玩了一段时间、用了三个月之后我成为了专家了,这不可能。
就是说像Linux这样的工具类的东西是有一个很陡的曲线在那儿,这个东西往往需要你真正的去使用它很长时间你才能把它搞好。但是如果你不去用它,你永远学不会。所以说解决内力的东西,凡是优雅的东西,都会比较难用。这个东西怎么去解决?就是去用它。去放下心来去来练你的内力。当你发现你的内力层很好的时候,你会发现自己做的很多框架类的东西其实都是相通的,你会发现很多模式都是有迹可寻的,到这个时候你的上手能力就会非常快。
Ok,当你把这两件事做好之后呢,你会发现有些人会成为好的工程师,有些人会成为一般的工程师,有些人可能慢慢地会掉队,成为不知道什么样的工程师。什么叫好的工程师?我觉得在座的各位都能够成为一个非常好的工程师,我给大家简单讲一下我的经历,其实我在老师这边真正深入的东西也不多,但是我发现有一个非常好的东西叫open source,也就叫开源。
第二 要真正自己去做一些东西 所以在做好前两件事情之后一个非常好的捷径就是我希望大家能够真正自己去做一些东西,很多人写简历的时候,会觉得自己简历上没有好的项目,是因为实验室导师做的东西我不感兴趣,或者说他做的东西没意思,这个东西不是一个借口。对于北邮人来说,我们其实能轻松地在网上搜到非常好的开源项目。比如说老师让你写仿真,但是你喜欢做网站,那么现在网站用什么东西呢?有人告诉你,用spring、struts但是你去搜索发现国外的人已经不用这些东西了,国外已经开始用NodeJS,那么你是不是可以去做更喜爱的方面的东西呢?所以这些东西就是你自己去探索,其实很多东西机会是我们自己去发现的。
不知道大家知不知道阿里在招聘的时候,有一个叫阿里星计划,应该是给一个应届生百万年薪,上一届的阿里星计划是给一个清华大学的本科生,拿到了阿里星的offer,但是最后他没去,他去了facebook。那么我们看一下这个人的简历上面有些什么呢?首先他建立的最上面就是他的github,我看到大部分人都是茫然的表情,可能不知道github,可能知道但是没有注册。
我现在告诉大家,你们今天回去第一件事情,不是拖鞋,就是先把github搞定,因为github是你和所有优秀的人沟通的一个桥梁,你们在github上看到国外最优秀的人写的代码。你有可能就不需要我在这讲了,你能看到这些人写的代码,你为什么还不能进步呢?他有非常好的架构模式,当你看了足够多这样优秀的代码,你去面试的时候,别人让你在web写段代码的时候,你洋洋洒洒写出了Justin写过的一段代码。面试官可能看了大半天,还不好意思问这是什么意思但是又觉得你写的是对的的时候,你距离你的offer就非常近了。
所以说现在,把github用起来。好,再继续刚才那个星计划的人,他自己就在github开展了很多个项目。当然大家可能会疑惑他这么牛逼的人会在开源上做什么项目呢?其实就是一些非常简单的项目,可能就是非常喜欢一个模式,做了一个模式的外挂,也有可能是你自己做了一个cs的例图,这些都可以放上去。
是要开始用心的经营自己,要把自己技术的这一块经营起来,这是第一点。第二点就是他在大学的时候就写过一本基础的书籍,国内第一NodeJS书是本科生写出来的,当然他是清华大学的本科生,怎么一个清华的本科生就能教这么多互联网公司、这么牛逼的工程师写NodeJS呢?因为那些人他们还不知道这个东西,而他已经学了很久,早就用起来了。所以他拿到了阿里星。
第三 当你真正想做技术的时候,应该怎么做 总结一下,当你真的觉得自己想要尝试去做一做技术的时候,其实这个check还是很简单的。
1、练好内功和外功 内功包括什么,就是你要去用一些令你恐惧的东西,不论是男孩子、女孩子还好,可能觉得我编程的时候觉得很恐惧,每次刷题,每次提交超市的时候会很恐惧,要战胜那种恐惧,现在就开始做起来,这一点特别重要。这里面就包括,掌握一门编程的语言。
2、做一个简单的项目 这个项目可以是什么呢?有可能是导师安排你的一些任务,也有就是你在github发现的非常简单写的非常优雅的项目拿回来自己读,当你读过一个或两个项目会发现这些东西之间有很多相通之处。你会慢慢找到里面的关联的点,那个时候就是你精进的时候。再到之后你有可能会有自己的一些想法,想去做一些东西,这个时候不要犹豫,只要是动手去做,把这个东西做出来,就有成功的基础了。
第四 一些踩到的坑 还有就是踩到的一些坑,我不知道大家刚开始编代码的时候是什么样的,其实我在本科的时候也没怎么好好写过代码,我是到研一的时候才开始写代码的,开始写的JAVA,然后我毕业四年,我居然出了一本技术的书,而且是一个极其复杂的框架的书,这是为什么呢,这其中其实也踩到了很多的坑。
我认为当你觉得自己不想做技术、不想去尝试的时候,或者说有一些犹豫的时候,可以想想,徐鹏他都搞技术了,我也可以搞一搞。一些踩到的坑技术层面的东西我不会讲太多,难点其实并不在那个地方,其实更多的是在于我们的一些想法,就是当你遇到一个问题,当你遇到一个你觉得自己无法解决的问题的时候,你是放弃还是继续,这个就影响了很多人。可能你到了一个临界点,下一条编译你就成功了,但你在这条命令上放弃了,那么你永远get不到这个点,这是第一。
第二我们不能惧怕问题,因为你是一个工程师,你要带着解决问题的态度把这个问题解决了,一定要抱着这种态度,而不是说遇到这个问题之后说我靠我怎么这么倒霉啊,他们拿过去一装就好了,我拿过来装就好多问题,如果这么想,那就完蛋了。第三,现在在座的工程师要有一点open的态度,open就是要跟别人多去交流,这个交流不止于你和你的同学之间的交流、跟你的舍友之间的交流,这个交流包括和国外的很多工程师的一些交流。怎么去交流?现在都有网站,你用过的一些小的东西你可以到开源社区里做一些反馈,你可以提一些自己的想法,我相信大家的英文简单的交流都是没有问题的,你可用简单的对话谈谈你自己的想法。Open的态度是非常重要的。
第五 从现在开始改变 Ok,前面我不会跟大家讲太多找工作方面的事情,我希望总结几点,希望大家从这个教室走出去回去以后,你能有所改变。第一,优秀的工程师的成长尽管有天赋的因素,但大部分人都是很普通的,优秀的人与普通人相比在于他的上限会高,但是下限是我们每个人都能不断提高的,不断的提高自己的下限,知道自己能做什么。
第二,那怎么样去提高它,就是做你害怕的事情,做你在技术上面你觉得害怕的事,不要觉得麻烦,去把它做好,去一点一点踩该踩的坑,把遇到的问题一个一个解决。当你坚持了三个月甚至是半年你就会发现,编程好像没那么难。
第三点呢,多去交流,今天晚上回去就可以注册github的账户,在那个上面找到非常多优秀的项目,优秀的想法。第四个,我建议大家开一个个人的技术博客,研究生的时候我发现很多工程师都来自于中科院,讲真我觉得北邮的学生编的比他们快也比他们好,我就和实验室的两个来自中科院的师兄去请教,我才发现他们每个人都有个人的技术博客,从博客的内容真的能感受到一种对技术的钻研和热爱。所以你现在也可以开始培养这样的习惯。
希望大家不要觉得编程有多难,为什么我选择编程,因为我觉得它简单纯净,就是靠技术说话,所以我的leader比我年龄小,但是我服,因为他的技术够牛逼。
谢谢大家。