一 程序员的困惑
第一个跟我说这个的是小丁丁。
小丁丁在论坛时代的修真院,就已经是比较出名的了,他的学号是016。
在线上自学的时候会用Flex布局,还会做Gif动画。
当他说要来线下学习的时候,算是我第一个比较期待的人。
是的,那个时候我每天都会看他们的日报。
后来小丁丁成了修真院的睡袋师兄,几乎所有的线下师弟,在修真院打地铺的时候,都会找小丁丁买睡袋。
他也确实成长的很快,很快就可以独立完成一个项目了。
这很不容易,特别是在修真院的教学体系还不完善的时候。然后我把呆萌奎和小丁丁都留了下来,他们算是公司的第一批从学员转过来的正式员工。
可是没多久,小丁丁跟我讲,他想离职。
我说过,如果在工作中遇到任何问题,都可以跟我谈,可是如果你一旦说出来离职这两个字,就绝对不会开口挽留。
可还是简单问了问。小丁丁说,他已经有两个多月没觉得自己有进步了。
总是在做重复的东西,除了自己的代码更熟练之外。
而且,修真院一直都很苦,几乎是没日没夜,熬几个通宵的事很正常。
而我的脾气也不好,经常把他们骂的狗血喷头。
当然薪水也不高,任何一个人从修真院出去,薪水翻倍还算是比较正常的。
小丁丁那个时候,算是刚入行4个月,还是6个月,我不记得了。
那个时候我其实是还是比较BS说做项目代码没进步的。
我自己写了很多很多代码,最喜欢的其实往往就是不断的重构代码,不断的提升自己的效率。
如果我觉得我在反复的做一件事,那么我就会想办法让这件事变的高效一些,所以这几年写了很多代码生成的东西,尽可能的让自己的时间和精力用在架构设计,重构和测试上。
我觉得小丁丁根本没理解什么叫代码。
可是小丁丁自己很纠结,他本打算是一直跟着我的。
是的,我其实也打算是带着小丁丁一起飞的。可是我不喜欢纠结的人,所以我说。没事儿,我帮你推荐工作。
于是帮他介绍到了一个朋友的公司,那边面试完之后,给出的薪水是12K。
对的,修真院就是这么一种尴尬的境界。当时宸宝的薪水才3K,可是他带出来的学员,3个月出门,就可以拿到8-12K了。
小丁丁也不开心,对他来讲,也是一样的。
一边是工作压力大,一边是薪水拿的低,一边是明显不如自己的人,可以拿到更好的薪水,而自己又没有了进步。
所以小丁丁很困惑。
他收到offer之后,说要请我吃饺子。
于是半夜12点多,公司楼下,我们在十字路口的大街上路边小摊要了两份饺子。
小丁丁第一句话就是:老大,他们给我Offer了。
第二句话就是:可是我舍不得你。
然后就是哭。
我笑。说:哭毛线啊?找到份12K的薪水不挺好么。
第三句话,他说:老大,我不走了。你让我再留下来吧。
我说:好。可是我得跟我的朋友解释清楚,不然以后我没法做人了。还有。没有第二次了。
小丁丁说好。
于是我又给朋友打电话,果然,被朋友骂的狗血喷头。
可是没过两个月,小丁丁还是决定走。
于是我又给他推荐了另一家朋友的公司,那边也比较喜欢小丁丁,还是愿意给他12K。
小丁丁又拒绝了。
直到第三次,我实在忍不了,跟小丁丁说:赶紧滚。
这次没给他推荐工作,他自己找到了一家公司。薪水是10K还是12K,我不记得了。
但是总算是平定下来了。
可是我记得很清楚,这是第一次有人跟我说,觉得自己没进步,遇到了瓶颈。
大概之前也有过,可是那基本上都是工作三到五年的,想要我指点一下接下来怎么走。
我还从没遇到刚刚工作4个多月和小半年就觉得有瓶颈的。
后来,呆萌奎也这么跟我说。
跟着是古尘,刚刚又是宸宝。
我想了很久,觉得还是有必要再理一理思路,试着去总结一下,一个程序员,什么时候会遇到瓶颈期,又该怎么去渡过。
特别是在做项目代码的时候,会不会觉得自己没有收获。
毕竟,我是见过有些人,不喜欢做项目,做事总是能推就推,就喜欢看书看源码提升自己的技术实力的。
二 程序员的分级
之前讲过程序员的分级。分成了自己独立完成项目,这个叫初级程序员。
能带Team完成项目,并且能够了解项目框架中的源码,思想,能够做一些改进,这个叫做中级程序员。
能独立写框架,写算法,这个叫做高级程序员。
我觉得这三种就够了。高级程序员全世界也就那么几个,初级程序员也好衡量,不是高级也不是初级的,就是中级。
没必要再分。
这种分法第一次出现在知乎的时候,就被一些人嘲讽,这也是符合知乎价值观的事儿。
先不谈这个话题,只说小丁丁,宸宝,古尘,呆萌奎,这几个工作不到一年的小菜鸡的瓶颈从哪来。
在他们刚入行的时候,确实进步很快,因为每天都在学新的东西。
我看到之前有人在我的贴子里反复的跟我说:老大求更新。
我都默默的说一句,更新个毛线呢,早就写到修真院的官网上去了。
所以实际上,以WEB工程师为例,他们大概会花3~5周的时候去学习CSS,包括自适应,响应式,Bootstrap和Less,以及Html5和CSS3的一些东西。
这里的学,并不仅仅是学,而是指他们真的可以写出来代码。
所以在这段时间里,每天都会感觉到进步,因为每天都会学习到新的技能点。
这些技能点也是整理在修真院的技能树中。
跟着会花6~8周,或者是更长的时候去学习JS。
这包括原生JS,JQuery,AngularJS。我没再要求他们学RequireJS和GruntJS。
或者是其他的React。会AngularJS就够了,其他的必须要在他们工作中去使用了。
所以在这段时间里,他们也是在每天都学会新的东西,而且总会有新鲜感。
前3个月或者是4个月,基本上都是这样。
这个时候,也会有人遇到困难,但是大多数都是没长进,而不是没什么东西可以学。
显然 ,小丁丁他们不是这样的,他们是没有东西可以学了,不知道自己要学什么,总觉得自己只是熟练度上升,而不是深度有所增加。
所以可以简单的理解为,对WEB工程师来说,前3~4个月,都属于新手技能学习阶段。
那么接下来呢?
首先,并不是没有东西可以学了。WEB永远不缺新鲜的框架,也不缺少对于框架底层的理解,而是到了一个必须把自己学会的东西沉淀和积累的过程。
你到了一个学有所成,必须要动手反复做项目的时候了。
这个时候的重点是什么?
是业务知识的积累,编码规范的积累,最佳实践的积累,开发流程的积累。
而这些,有谁一开始就意识到,对于一个出色的工程师来讲,以上四个方面都是非常非常重要的技能点呢?
比如说,业务知识,现在的趋势是越来越偏于行业的融合。有几个有明显行业特征的,像金融,医疗,汽车,财务,电信。这些没有业务知识是很难写代码的,写出来的也只是一堆又一堆无意义的垃圾。
再比如说,支付,IM,地图,第三方登录分享,微信公众号,微信小程序。这些同样是没有太多技术含量,但是你必须要去理解的。
除些之外还有更多通用的设计,表单验证,图形验证码,文件上传,语音播放等等等等。而这些很难会给人一种深度的体会,更多的时候像是堆积在一块儿。
困惑也会来自于此。做一个项目,少于也要2周,大点的,可能要2个月,做3~4个项目下来,一年就已经过去了。
算起来,是不是自己除了业务知识熟悉了点,开源框架多用了点,其实没有什么长进的?
可是你们不知道,业务知识和业务逻辑,也是程序员的重要技能之一。同样的没有速成,只有入了一个行业,才会真正的感受一个行业。
再说第二个,编码规范。晓进已经工作2年多了,之前跟她说的很多东西,她到现在才慢慢的理解,比如说,数字要换成常量。很多时候当我们说起来的时候,大家都懂,可是自己写的时候,还是会忘。
这个不是真懂,这是看起来懂了。什么时候才会懂?真正吃过亏的时候。晓进最近在接手一丁写的代码,要么就是培宇写的,反正当看到>=1这种代码的时候,真的是一脸蒙逼,对,不要想着有太多注释,连常量都懒得替换的人,怎么可能会有注释。
而且 注释 又怎么样?代码更新了,注释 没更新的时候多了去了。反而是增加了更多的文档不一致而已。
然后晓进才真正懂的用常量来代替数字的含义。
这些道理前人总结过了很多次,可是有些坑你不去踩,是真的不会理解的。
特别是对后端而言的日志规范。
这些没有大量的项目做支持,你是不会感同身受。而有时候,写代码,就在于这种小的细节。
第三个是最佳实践。
说起最佳实践,这些东西没有半年到一年的时间是没办法理会的。
怎么说,没有持续的维护一个项目,很难理解自己的代码倒底是怎么样的。
没有需求变更,没有代码交接,根本不会知道什么是正确的代码。
实现一个功能有很多种方式,很多人仅仅会聚焦在源码,框架,算法,语法上,可是更多的时候你都是在写一个可持续维护的系统 。
我现在跟他们说,怎么样才是一个好系统 ?并不是仅仅是说,我给你一个需求,你花了半个小时做完才是好系统,而是要看需求变动后,要花多少时间才能完成。
如果你能又快又好的完成一个系统,又可以在需求变动后很快的完成,这是一个设计良好的体系,而且非常注重和业务的结合,在系统设计的时候必须合理的去预测哪些需求是有可能变化的。
永远不要相信产品经理那张嘴。所谓的最付款实践就是这样,当你遇到问题的时候,当你遇到需求变更的时候,你的代码才会是真正的展现出来价值。
程序员工作的环境永远是在线上,很多人都有习惯,说我代码写好了,我提交到SVN上了。这算个毛线。
跟没做是一样的。
所以说,最佳实践也是需要大量的项目积累,特别是需要有一个长期的维护,没有一个持久的项目,很难理解什么才是最佳的实践。
我们每次CodeReview都在尽力将最佳实践整理出来。这个时间,我觉得至少也是需要半年到一年的巩固时间。
第四个是开发流程的积累。
开发流程其实是比工程师的能力更重要的事情,或者说,他是将一种松散的行为规范化的情况。
合理的开发流程都并非是人为设定,而是遇到了各种实际的问题,从解决问题的角度出发而给出的方案,并且是不断的修订中完善的。
我写代码这么多年,感受最深的其实就是开发流程。修真院这家公司,在前一年半,我都没敢提流程这件事,因为大家都太菜了,菜到根本就没办法按流程去走的地步。整整一年半的时候我都是用放养的方式去做,所以流程最核心的概念是为了提高效率,避免问题。而不是人为的束缚,很多工程师其实是不太理解这个的,也比较难看到价值。
最近差不多半年多,都在教他们怎么遵守流程,怎么去解决开发流程中遇到的问题。
太多坑不踩是不知道的了。
以上这四点,都是在初学者,从0基础到2年之内最容易遇到的问题。在这个时间阶段,你可有会觉得自己并没有学会什么新技术,只是在做重复的劳动,甚至会有一些疲惫。也会想要去认真把一门技术学深,却总觉得没有时间。
这也是我在最近一段时间里经常会听他们讲到的。
我和他们不同的就是,我从来不认为这是一个没有任何长进的过程,如上所述,我觉得这是在业务知识,编码规范,最佳实践,开发流程的积累。
如果你自己发现以上这四点也没有任何的进步,那才可能是真正的出了问题。
很多时候,你学习一门知识可能只需要几个小时,把它用好却可能需要10年。
与此同时,还包括解决问题的能力,学习新技术的能力,都是在潜移默化的改变成。1万小时定律我没太具体了解是什么,也没仔细去推敲,但是大概的意思我猜测就是一个多练习的过程。
所以我自己其实是有点反感知乎上各种动不动就叫人看源码,谈算法的2B们,也懒得争执。
特别是这个问题下,又出来几个人蹦哒着说点老一套。
说起来没睡太好,写的有点乱,但是第二部分的重点就是在于提醒,觉得自己遇到瓶颈,没有长进的小伙伴,仔细分别一下自己倒底是属于哪种情况。我能百分百的确定说,如果你在业务知识,编码规范,最佳实践和开发流程上有进展,那么你并不是没有进步,而是你没有意识到他的价值。
所以什么时候才到了应该去看源码,去看更底层更核心的阶段呢?
解决问题。
但你遇到了一个问题,想想别人是怎么解决的。
先去自己猜想问题解决的思路是什么,然后再去看他源码实现。
所有的流行的开源框架都是为解决问题而生。
自己瞎折腾解决不了实际问题的框架也根本不会流行。
比如说Bootstrap是为什么存在?
Https是为了什么出现?
WEBSocket又是怎么回事儿。
TCP的三次握手为什么要这么设定。
如果你在写代码的过程中,首先是看自己遇到的问题是什么。
大到设计模式,小到底层协议,先确定这是不是你会经常遇到的问题。
暂时抛开不是你当前最着急需要解决的问题,着重点放在最容易出现的问题上。
先去找解决方案,看看大家都是怎么解决的,有没有通用的解决问题的方案。
再看看这些通用的解决的问题的方案,是否适应你的情况。
如果不是,应该怎么优化,怎么改进。
这才是顺理成章的去读源码的步骤。
那些什么问题都没遇到,就动不动去谈看了多少源码,看了多少书的,倒底是为了学知识还是为了装逼还是为了给自己加谈资?
我也很不喜欢面试官在面试的时候装逼的。以前经常有人问看过JDK的源码没,看过Spring的源码没,我就经常在心里骂傻逼。如果你问我说,JDK的GC算法都有几种,适合什么场景,有没有可以再优化的空间,我会觉得很喜欢。
所有的技术都源自于解决实际的问题,甚至包括在实验室里写学术论文也一样。总是先去优化和改进一个具体的点,这样才有实际的意义。
所以当你真的是对技术感兴趣,是一个Geek,那么更应该去从解决实际的问题出发,想办法提升自己的效率和解决实际的问题。
当然,公司的环境和氛围会给你很大的帮助。但是所有的学习最是要从内心发起的吧?
最后整理一下,我给出来建议:
1:0~6个月 学习技能和术语和思维方式的阶段
2 :3~24个月 学习业务知识,编码规范,最佳实践,开发流程的阶段
3 :6~120个月 抽象梳理问题,寻找解决方案,参加其他人解决问题的思路,给出自己解决方式的阶段。
所以亲们,如果觉得自己没有像初学的时候进步那么快了,不要慌,你可能是在用一种方式前进。
当然更多的人,可能一开始就学了假语言,上了假知乎,自以为是一个真程序员。
这个回答依然是很主观,不负责。看到评论里有说为毛我正经回答的答案也靠后的,显然是被踩的多了啊。
但是没关系,早说过我没能力把所有的人都教会,我只愿意去教愿意听我话的人~
其实感觉还有很多东西没梳理出来,也是自己平常总结的太少。先这么着吧~~
有兴趣的话可以进群讨论
6群 200人 254078081(招募中)
转自知乎暗灭
本文转自it修真院自问自答第十五篇