技术提升的一个方法

最近看到知乎上的专栏https://zhuanlan.zhihu.com/c_183152541,感触颇多。

要突破自己首先的热爱编程,敬畏程序。毕竟有道无术,术尚可求,有术无道,止于术也。

你发现你的开发过程中总是需要重复复制-稍微改吧改吧-粘贴这个过程,你有没有去尝试阅读并实践《重构》?

你有没有尝试去自己发布一个公用的库?JCenter/Maven Central都是免费的。

你发现你每次修改完代码要抄起Postman点来点去

你有没有尝试去编写一个集成测试,代替手工的劳动?

你发现你碰到了很多奇奇怪怪你搞不明白的问题,只能一次次地尝试每个搜索结果中提到的解决方案,期望其中的某一个好使。
你有没有尝试过去阅读相关的书籍,查阅相关文档?

如何突破自己
如何成为顶级程序员
跳出弱鸡循环1
跳出弱鸡循环2

总结下来提升手段:
1.实践自动化测试

当你觉得技术上遇到瓶颈的时候,可以通过学习和实践自动化测试,来补全自己在相关工程领域的技术短板,提升自己的技术能力
从测试中学到的不仅是写测试用例的能力,而是一整套的工程化、自动化的能力。

实践流程
第一步,去看一下《Maven实战》,了解一下Maven的测试是怎么工作的。之所以让你去研究Maven,是因为你们这种系统,99%不会采用Gradle这种新技术的。
第二步,写第一个测试,代码如下:

public class MyTest {
    @Test
    public void 跳出弱鸡循环() {
    }
}

第三步,去搞一份你们线上数据库的表结构。各种数据库都有相应的命令dump表结构。有困难的的话,手写建表语句。
第四步,本地用Docker启动一个临时的数据库。
第五步,去研究一下flyway,用自动化方式把表结构灌到这个临时数据库里。
第六步,去了解一下你们的应用是怎么部署的,你们上线的应用不可能是通过在IDE里面点绿色三角来部署的。把部署的命令行要过来。
第七步,研究一下这个命令行,尝试在本地启动起来。碰到数据库没起来的问题,就把连接串改成刚刚那个Docker的临时数据库。
第八步,你平时怎么在网页上点点点测试的,把它翻译成Java。比如你平时会手工测试登录接口,那就用HttpClient写一段代码,模拟登录。
第九步,把上面这些整合起来:

public class MyTest {
    @Test
    public void 跳出弱鸡循环() {
        启动测试数据库();
        把表结构灌进去();
        本地启动应用();
        自动化方式测试接口();
    }
}

2.给开源项目修BUG
我个人建议多找一下nodejs的项目去修bug,js是一门多范式语言,能够更好的理解编程。

你也可以访问 https://github.com/pulls 查看所有你提交过的PR。

这就是我要说的捷径。无论你是人是妖还是人妖,无论你经验多寡,无论你现在在做什么,这条捷径总适合你:通过向开源项目提交PR,提高自己,寻找跳出弱鸡循环的机遇。

当我说出这条捷径的时候,几乎所有的听众的第一反应都是:太难了,我的水平达不到。

我一般会反问,你试过么?你试过挨个翻阅感兴趣的项目的issue tracker么?你试过挨个阅读其中的issue和讨论么?你试过把issue中给出的可以重现bug的例子复制到本地尝试运行和重现么?

迄今为止,没有一个我怼过的人回答试过。一个都没有。你试都没试过,你怎么知道难?你怎么知道你的水平达不到?这只需要一根网线一把键盘,不需要投资不需要卖笑,连科学上网都不需要。

下面我就详细说说这条捷径怎么走。

第一步,挑一个你喜欢的开源项目。不怕用力过猛的话这里有一个GitHub星星排行榜,尽管大胆正面刚。如果胆子比较小,就挑几百几千颗星的项目。挑的时候注意一些原则:

一定要活跃!可以查看其他PR被合并的情况,提交历史等。提个PR三百年没人回会严重打击你的积极性。
最好不是明星项目,最怕好bug一露头你还没反应过来就被别人修掉了。
业界知名最佳,不知名也无妨,可以拿来练手。但是一定要有价值,别去给阿波罗11号登月导航系统修bug。
如果你是写Java的,其实Groovy是个不错的打怪刷经验的地方。它的好处在于:

纯Java实现,可以通过GitHub协作。(我给OpenJDK修过bug,首先得会C/Make,其次得会用Mercurial,最后还要通过邮件组寄送patch,烦都烦死你。)

足够有名,bug足够多,高中低档bug都有,不愁找不到bug玩。

社区虽然不十分活跃,但是有几位大牛鼎力支撑,不用担心没人理。(Paul King几乎以一己之力支撑起了整个Groovy项目,国内也有一位活跃的committer孙岚,知乎)

第二步,挨个翻他们的issue tracker,找软柿子bug。什么是软柿子bug呢?就是那种能稳定重现(有可以重现的代码样例),并且“看上去比较重要”的bug。这种bug不一定好找,但是也不难找。实在找不到你可以埋伏几个月,每天翻一翻,总能捡到漏的。(你可以订阅GitHub仓库的通知,有任何风吹草动你都能收到邮件,后果是……一天几千封。)

能稳定重现的bug都是好bug,不能稳定重现的bug别说你,我看着都发怵。

“看上去比较重要“的意思是说,你修掉之后不会引起太多的讨论——你要是给对方提交个feature PR对方可能会拒绝,但是修bug,尤其是明显的bug的PR几乎是百分百能通过的,减少了很多撕逼的麻烦事。

第三步,花时间修掉它,提PR。说的轻巧,实际上你可能会遇到很多困难。

首先,你可能对GitHub不熟悉,不知道怎么fork,也不知道怎么提PR。这里有一些视频可以帮助你,手把手一步步教你如何从零开始(那种连GitHub账号都没有的零开始)做这一切:

其次,你可能经验太浅,压根不知道/跑不起来项目的代码,根本没法在本地重现bug。怎么办?

没办法,只能一步步硬啃这个骨头,各个项目之间差别极大,所以我没法给出一个万能的建议。虽然只能硬啃,但是你可以求助场外观众。具体方法就是碰瓷式请教:clone下来项目之后,翻项目的git历史,找到提交者的邮箱,然后把你碰到的问题总结一下,写邮件给他(们)。一个人不理你就发一万个,总有好心人愿意帮助你这只菜鸡。

记得要用英文写。(之所以强调这一点是因为真的看到有人在Gradle里面发中文issue……Gradle只有我一个人能看懂中文啊……)

最后就是最大的问题了,bug不会修。这个……其实跟你日常修的bug没有本质上的区别,无非就是项目复杂一点,调用栈深一点而已。调试器+打log大法总能搞定的。我最爱修的bug就是那种“上个版本没有,这个版本突然出现的bug”,只要开两个窗口同时debug对比两个版本的差异即可轻松找到问题。重要的是耐下性子,别心慌,反正没人催你。还是有问题的话,周末来看我直播演示修bug,广告在本文最后。

在这个过程中,你不可避免地会暴露出自己菜鸡的一面。比如说我当时给Groovy修bug的时候,对方让我squash一下commits,我回答……不会。当然大佬才懒得跟你们这些菜鸡计较,他们顺手就帮你解决了。别害怕,别灰心,谁也不是一生下来就是大神的。

修掉bug之后记得补几个测试。别把不测试的习惯从公司带过来,修bug不加测试百分百不会被接受的。如果你对这个过程发怵,害怕搞错了被人耻笑,你可以拿我们的练习题练练手,我们有个机器人自动帮你通过并merge:
fix-add-function
如果英文有问题可以使用国内的码云 找一个点赞人数多的项目开始打怪升级。

说了这么多,你可能不由地要问,“我也没看出来捷径在哪里啊?”

捷径在于,只要你能静下心来专攻一个领域,你会非常快的看到收获:

你会发现从“啥也不懂”到“能给他们提交PR“的过程中,个人能力得到了极大的提高。你从实战中锻炼出了git的各种骚操作能力、修bug的能力、写测试的能力等等。你被迫去学习各类知识以达到“能解决这个bug“的能力。我自己就是一个受益者,我从给开源项目提交PR的过程中受益匪浅,学到了非常非常多CRUD小王子学不到的东西。
如果你能给著名项目修一两个bug,足以让你的简历脱颖而出。必须指出,这其实不难,很多著名开源项目里也有非常低级的bug,只需要你付出稍微多一点的耐心和努力。举个栗子,这个是我还没加入Gradle时给Gradle修的一个软柿子bug,它完美的符合我们挑软柿子bug的要求:能稳定重现,并且是一个毫无争议的bug(空指针异常)。连上调试器调试最多几个小时就能找到问题所在,一点也不难。

如果你能长期(几个月时间)攻下来十个八个的bug,你会发现很多机遇。比如,猎头会勾搭你(我就被勾搭过),你可以可以主动勾搭仓库的协作者求内推。这都是混脸熟的功效。假如你能给antd修几个bug,你猜你能不能找他们求蚂蚁金服的内推?假如你能给typescript修几个bug,你猜你能不能找微软的人求内推?在2017年的春天,我给Gradle修了大概四五个bug,后来Gradle接纳我的邮件中是这么说的:

We deeply appreciate your passion for Gradle and determination to work with us.

这就是捷径所在。你只需要付出几个月的时间,就可以获得意想不到的收获。这一切跟年龄、学历、经历完全无关,你通过给开源项目修bug的过程,锻炼了自己的能力,也让其他人看到了你的能力——你不需要再和其他人一起挤海投简历的独木桥——你完全可以找混脸熟后的小伙伴走后门(内推),也能避免HR对你学历的鄙视(技术总监指名要的人,轮得到你来指手画脚?)。

B站修BUG视频