木杉,开源者,deno开发者,本科生。
你觉得,开源对你影响大吗?
开源对我影响挺大的, 做deno那段时间收获很多很多
主要收获在哪?
可能要比之前两年加起来学到的还要多,可以说把以前学到的东西实践了,首先是git的使用, 这之前我只会git commit push。还有是读代码的能力。
我刚开始接错deno的的时候, 它什么都没有, 我是在deno/std开始开发的时候加入的,我做了deno_path, 其实就是把node path抄了过来。因为node path是有一部分内部依赖的, 所以我需要把这些去掉, 换成deno的写法,所以我肯定需要先把代码读懂。
这是我参与开源社区真正意义上的第一个pr——我发现了node path的一个bug。
写完path, 我开始真正参与deno std开发, 我选择的切入点是server。但是刚开始的时候, 它的server启起来后, 别说浏览器上看了, 就真的只能curl。我只能想办法解决这个问题,把server相关的代码读完, 不知道它在干嘛, 虽然只有几百行。把依赖读完, 还是不知道在干嘛,我尝试改改, 并没卵用...
后来大概花了一礼拜时间学这个,查了很多资料问了很多人,然后ksm给改好了。我看了他的pr,因为之前这些代码看得很熟了, 就恍然大悟原来要这么改,这个时候server已经能在浏览器上看了。
因为一年前我尝试写node web框架, 我想着干脆把那个项目拿过来, 用deno跑。
这个时候我开始想一个问题, 我为什么要写这个框架, 它对我有什么用, 相比较其他成熟的轮子, 做这个有没有必要,从这个时候, 我确定了自己开源的目的: 最重要的一点是简单, 然后才是性能,所以我把它叫做abc, 也是有简单的意思。
但因为是我第一次做框架, 现在想想还是有很多缺陷的, 很多地方为了性能, 违背了简单这一点。
确定这两个目标后, 就是设计框架的api,什么样的api简单, 学习成本低。我看了无数的框架实现, 不仅仅是js的还有golang, rust, java等等。这段时间很久,有种"书读百遍其意自现"的感觉。突然发现自己随便什么语言拿过来都看得懂了。(参与开源能读懂别人的代码真的非常重要,要读懂了才能开始写。)
为了简单, 所以我不可能做类似koa, express。他们只有一个核心, 其他全靠插件完成,我最讨厌这样了, 初学者找插件找半天。我肯定要做一个整体,那么最重要的就是要整合router,现在所有的node框架的路由, 都是基于正则的。于是我做了基于前缀树的,这样在复杂路由的情况下能大幅度提升性能然后我发现, 虽然我能写前缀树的题目, 但真的拿来写一个项目好像真写不出来。就开始找别人的实现, js的找不到找c的, c找不到找go的,又看了很多代码, 才好不容易把这个路由写完。
这段时间, 我提升的都是读代码的能力, 然后abc的基础写好了, 发布之后就开始帮忙写deno了,读代码的能力真的很重要, 我很明显的发现, 改deno bug的速度明显提升了,以前遇到一个问题总是要找别人帮忙,现在不用了,甚至可以在gitter, issue里面帮助别人。
发现问题 -> 解决问题。这是参与开源的基础, 不断做这个, 就能变熟练工,然后是提feature。
我第一个尝试是给abc增加了一个装饰器,我记得以前写项目的时候, 每次要写dto, 很烦啊, 特别是koa的项目, dto特别不好写,我想要利用ts能声明类型的特性, 让写dto的时候不那么痛苦, 甚至在很多情况下不写dto。
然后我做了这么一个api,第一次在脱离代码参考的情况下写大的feat,其实不是很满意,api设计可能增加了很大的学习成本, 可能除了我之外很少人会觉得好用。
不过这之后, 我开始做deno的feat,我觉得file_server的默认模板太辣眼, 我觉得应该提供一个api, 让用户能使用自定义的模板。但是被拒绝了...ry说我们暂时不考虑这个, 先美化默认模板,我跟他据理力争,最终美化了现在的模板...(现在想想被拒绝很正常, 当时我设计的api真的蠢到爆了)
我应该借鉴其他项目的, 其实我们遇到的几乎所有问题, 都能找到类似的案例, 这么一看, 其实做feat也不难。但一直做别人做过的事, 一直抄真的很没劲啊。就像我一开始做的abc的数据绑定, 起码我没找到类似的实现, 虽然做的可能不那么好, 但挺有挑战性的
然后我就想做前端框架, 或者说一年前就想做, 当时有很多想法, 但没能力实现。这次一定要记住自己的目标了, 就是没有学习成本, api也是自己一年前设计的, 就是0 api。很有挑战很有搞头,也很容易碰壁。先写完想法, 比如做完之后, 自己希望这个框架是怎么用的, 然后朝着这个目标去前进。
因为写这个框架的时候, 我几乎没有前端基础, 我只是单纯的觉得前端入门太难,很快的, 马上碰壁了, 关于template和jsx的选择,两个我都尝试了, 首先排除template。因为我没有能力去维护一个解析器。然后我用了jsx, 走上和react硬干的路。
遇到一个难点, 解决还是妥协最好是全部解决, 但很难做到的, 比如最开始, 我觉得自己不可能去写一个解析器,这个过程中我不断看r/a/v三家的解决方案。以前在网上说什么这框架不好那框架不行, 在自己开始做之后才发现, 他们那些不好的, 有瑕疵的实现是有道理的,我始终做不到一开始设想的那样子, 不管怎么做, 要么越写越像angular, 要么react,他们妥协的地方我发现我也不得不妥协,这段时间真的很绝望, 很无力。
这个时候明白"纸上得来终觉浅", 自己做了才能知道网上喷的那些不好的地方, 不是随随便便什么人都能解决的。比如大家都说用goto不好, 但我还是想用用看, 总不能一无是处吧
这个前端框架到现在还在搁置中, 上学期找了一学期突破点, 还是无能为力。我打算放放, 做点自己开心的事情。比如随便逛逛github。
我觉得是别被自己项目拖累。我想着就放松一段时间, 起码考完研, 然后学一段时间数学, 然后再看看开源社区(前一年真的太累了)
如果你目前的水平是100,接触开源之前水平大概多少?
在参与deno之前, 我只能写业务代码,就是crud。如果评分只能是60分。
如果不接触开源,你估计现在水平是多少?
但如果不接触开源, 我估计现在仍在60-70分徘徊, 仍在闭门造车, 有想法但实现不出来, 然后放弃的阶段。
接触开源社区, 是眼界的提升, 能大大提高上限, 但如果没有积累, 还是没办法进步。
你是什么契机接触到开源的?
这多亏了typescript, 我在无意中发现了ts, 开始对前端感兴趣, 然后了解到了angular, 开始了一段时间痛苦的学习 (大一下学期末, 也就是几年前的今天)。那个时候我只会用spring做简单的论坛。
刚开始学习angular的时候异常痛苦。完全没有中文资料, 完全没有中文社区, 而且还在b测, bug奇多。而我那时很菜, 甚至有的时候不知道这是bug, 以为是自己写错了,再加上我高中全班倒数第一的英语水平。而且angular各种设计模式(我什么都不知道,那真是我有史以来最痛苦的半年,我入门入了半年。
我坐地铁都拿手机刷angular的文档,当时真的把他的英文文档背下来了。同学问我问题, 我直接说你去看文档哪一部分,然后就造成了我现在能不用翻译看英文文档却没过四级?
这个时候我不知道angular的设计是好的, 但我觉得它一定很nb,于是我就在知乎上当ng吹,没事研究研究他的源码。
然后我收到了第一节ngchina的邀请。我跟主办方商量, 我有很多同学也想参加, 但是付不起门票, 然后促成了学生票, 看到了很多nb的人。
当时在知乎上评论了一句就在我学校旁边欸, 然后收到了社区的邀请。莫名荣幸。这个时候意识到自己真不能闭门造车。
刚好我遇到一个需求, 具体是啥我忘了, 估计是花式编译ts,我怎么都找不到解决方案, 又排斥webpack。问了一个学长, 他推荐我试试grunt,我刚好要试的时候, 他跟我说, 最近出了一个东西, 叫deno。
好巧, ry刚建仓库第一天,只能tmd跑个readfile。不过deno的目标看上去很美好, 成为ts runtime(虽然并没有)。
接触开源挺巧合的, 恰好我通过angular对ts很熟悉, 恰好我遇到了一个需要deno的契机, 恰好deno发布第一天。
你觉得大学生有必要接触开源吗?
我觉得是非常有必要的, 但感觉很难, 没有接触开源的人往往很难意识到自己要加入他们
曾经我尝到开源的甜头后, 也在社团内强推开源, 学长们也十分赞同, 但结果并不好,大多数人只是注册了一个账号, 或是把github当作网盘来用。并没有意识到合作才是开源。
他们还会觉得, 我放百度云上, 跟我搭档分享, 这不是跟github一样了么,git命令对新手也不友好, 很容易仓库就炸了。当时在我专科学校那个社团, 真正把git用起来的在校生就我一个人,大多数人都是毕业工作后才看到git的好处。
然后给学弟学妹推, 但大家最终也只是建一个账号。
在学校里最多接触到两三个人就能完成的项目。比如这个, 以前在专科的时候跟同学一起做的, 我写的后端, 另外两个同学写前端react。最多的合作也只是这种分工明确的, 你push你的, 我push我的,说白了也是当网盘用。
我觉得业务代码可能并不适合用来作为接触开源社区的入口(这东西最终还是你干你的我干我的, 因为大家都看不懂对方在干嘛)。需要一种, 我觉得这个项目对我有用, 但一用, 发现有缺陷, 然后我改改, 还很好改这种项目作为接触开源的入门
我第一次pr就是改了typeorm里的一个错别字, 然后头像作为contributor加到首页了, 这样就很有成就感。还能在同学面前炫耀: 你用的这个库我是contributor欸, 不会赶紧来问我,反正大家都不懂其实我只是改了一个错别字。