写在前面

  • 很多已经在 #186 中记录了而距离这篇又两年半过去了,经历了不少成长与感动,在这里记录一下。

一些感动

  • 我的第一个项目是命令行听机核最开始写完顺便写了一篇文章发在了机核上,那时候我还不太明白怎么弄 PR, 怎么在开源世界里合作,项目的第一个贡献者后来我们在推特互相发现(他给 gaycore 添加了快进功能),有种世界真小的感觉(发现时候我还没几个 fo)。后来他去了美国,我们偶尔还在 tg 聊聊各自的生活,感觉像认识了好多年的朋友。
  • 之后 kindle 离开中国,我恰好有一些 kindle 方面的接口调研经验,写了个帮助大家下载自己书的小项目,被一个网站转载,但读文章之后发现他把所有我项目的链接都换成了自己的,想着有些别扭但还能接受的时候,看到评论区 Ray 和 siwei 在下面的留言,心里暖暖的。 image
  • 熟悉我项目的朋友大概都知道,我所有项目的最后一句话都是谢谢就够了,后来在 issue 里在邮件中真的收到了好多感谢,有的还特意发邮件谢谢我,说我帮到了他好多。下面截图是我在 running_page issue 中收到的感谢 image
  • 因为后面给很多跑步的项目提了一些 issue 和代码,其中最感动的就是我给 strava-datasource 提的一个 issue 并附上了解决方案,那个我特别敬佩的作者直接回复,Hi! Could you open a PR with these changes? 让我直接有机会给了 grafana 相关的项目提代码。我也把这个传承了下去,在自己项目中,issue 并附上相关解决方案的同学,我都会问一下是否愿意提个 PR.
  • 收到了图灵编辑的邮件,感谢我做的翻译项目,还要送我一些书。
  • 妈妈和老婆跟我说过,虽然看不懂我做的东西,但是感觉我非常厉害,能帮到其它人就更厉害了。老婆也支持我在业余时间写代码。
  • 面试官(后来成了我的领导),在面试前认真看了我所有的项目
  • 和很多人因为开源成了现实中的朋友

一点成长

  • 掌控感,这个月第一次经历了两个同时增长的项目,几乎所有业余时间都在这上,在这个阶段懂了,如何在自己能力范围内更新项目,判断需求,处理 issue 和如何决定是否合 PR, 当然在累的什么都不想干的时候,忽然想明白了休息才是最重要的
  • Make it work then make it better. 在最开始的时候我总是想把项目尽可能做的好,加足够多帮到大家的功能再发布,后来明白了,这个是开源项目,我需要做的是,尽可能的让项目 work 起来,pull the trigger, 如果这个项目 work 的足够好,会吸引更多厉害的人来一起 make it better
  • 别炫技,如果这个不是需要炫技的项目,那么,尽可能用最简单的实现,项目就会帮到更多的人,让更多的人参与进来。
  • 记录,比如现在我正在做的

一些遗憾

  • 有些 PR 处理的不好,让一个非常热心的台湾朋友有些累,关掉了 PR. 我自责了好一段时间。他代码写的很漂亮,我应该在那时候尽快处理,而不是想着先添加功能
  • running_page 因为有地图展示,有一个让我非常难受的 PR.
  • 因为 running_page 的置顶 issue 我想纪念那些逝去的跑步的朋友,被人说滥用 GitHub.

一点分享

  • Always be nice
  • 别轻易直接关掉 Issue, 有的时候很伤人
  • 如果项目有我之外的贡献者,即使贡献者是修个 typo, 在 issue 回复里尽量用“我们”, 因为已经不是我一个人的项目了
  • 除非没办法,别停止更新每一个项目 let it work, 因为开源,不一定在什么时候帮到别人

一些数据

下面是我在这 4 年里写的开源项目的数据(截止 2023.3.21)而这个表格是用我的一个项目 -> github-readme-stats 自动生成的。这 4 年从第一个项目 gaycore 开始,我一共用 5 种语言写了 35 个开源项目得到了 14000 多个 stars. 还挺值得自豪一下的。最值得自豪的是,它们大部分还在更新。我还给一共 55 个项目提了 160 个 PR.

The repos I created

IDREPOSTARTUPDATELAUGUAGESTARS
1bilingual_book_maker2023-03-022023-03-20Python4413
2running_page2020-09-172023-03-20Python2336
3xiaogpt2023-02-162023-03-20Python1943
4Kindle_download_helper2022-06-062023-03-20Python1498
5GitHubPoster2021-04-212023-03-20Python1364
6gitblog2019-07-182023-03-20Python878
720222022-01-012023-03-11Python274
820212020-12-212023-03-05Python273
9blue2022-10-202023-03-20Python260
10iBeats2021-06-112023-03-19Python200
11iWhat2023-03-082023-03-19Python172
1220202020-01-102023-03-05C139
13vscode-gcores2020-01-042023-03-06TypeScript110
14github-readme-stats2020-12-242023-03-19Go101
15gaycore2019-02-182023-03-06Python99
16dalian-IT2021-04-072023-03-19md99
1720232023-01-012023-03-19Python51
18duolingo_remember2021-01-182023-01-30Python50
19shanbay_remember2020-12-022023-03-13JavaScript47
20nbnhhsh-cli2021-07-092022-07-16Python32
21gcores_calendar2020-08-242023-03-04JavaScript27
22pengdu_helper2021-09-092023-01-27Go27
23yihong06182020-07-162023-03-15md26
24my_kindle_stats2021-11-182023-03-17Python25
25running_skyline2021-03-022022-05-10Python20
26kai_xin_ci_chang2022-06-152023-03-11Python17
27blog2020-06-222023-01-28JavaScript14
28Runtastic2020-07-242023-02-03Python14
29github-readme-stats-server2021-12-082023-01-19HTML9
30Python3652019-09-052022-10-30Python7
31run2021-08-162023-03-17Python7
32github_upstream_script2021-05-082022-03-08Python2
33edocteel0012019-11-122022-06-24JavaScript1
34gaycore-server2019-02-182020-11-02Go0
35test_svg2021-03-182022-06-16md0
sum14535
IDREPOFIRSTDATELASTEDATELANGUAGEPRCOUNT
1GreenplumPython2022-03-302023-02-21Python23
2plcontainer2022-03-242023-02-17C19
3GpxTrackPoster2019-08-062021-03-20Python12
4leetcode-cli2019-11-292020-08-21JavaScript9
5gpdb2021-12-132023-02-28C8
6autocut2022-11-172022-11-21Python7
7vscode-leetcode2019-12-032020-07-22TypeScript6
8taichi2021-09-232021-10-23C++5
9nrc-exporter2020-07-052020-10-07Python5
10kb2020-09-212020-09-23Python3
11awesome-cn-cafe2020-08-042020-08-10JavaScript3
12ecapture2022-03-292022-05-02C3
13stravalib2021-08-182022-11-24Python3
14pg-lock-tracer2023-01-282023-01-28Python2
15activities2020-07-092020-07-14JavaScript2
16databend2021-12-292021-12-30Rust2
17incubator-opendal2023-01-122023-02-03Rust2
18python-garminconnect2021-02-262021-05-25Python2
19hub-mirror-action2021-04-092021-04-19Python2
20py-staticmaps2020-09-202021-03-24Python2
21strava-datasource2021-04-132021-05-13TypeScript2
22nebula-python2021-05-192021-05-20Python2
23iredis2019-12-302020-09-16Python2
24Tweet2Telegram2021-05-212021-05-21JavaScript2
25helang2022-08-192022-08-19Python2
26DingdangD1-PoC2022-08-172022-08-17Python1
27book-searcher2022-11-302022-11-30TypeScript1
28Striker2019-06-202019-06-20Python1
29GadioVideo2019-09-252019-09-25Python1
30MangaLineExtraction_PyTorch2021-09-222021-09-22Python1
31LearnJapan2020-03-312020-03-31TypeScript1
32MiService2022-11-042022-11-04Python1
33pdbattach2022-03-072022-03-07Python1
34notion-avatar2021-09-282021-09-28TypeScript1
35highlight2020-09-082020-09-08JavaScript1
36tzfpy2023-01-252023-01-25Python1
37TopList2019-08-192019-08-19Go1
38tokei-pie2021-11-192021-11-19Python1
39nebula2021-05-172021-05-17C++1
40pgtracer2022-11-012022-11-01Python1
41juicesync2021-12-292021-12-29Go1
42diskquota2022-03-182022-03-18C1
43tzf-rs2023-01-252023-01-25Rust1
44olo2021-04-122021-04-12Python1
45UsePythonProcessDataFaster2021-09-012021-09-01md1
46pyWhat2021-06-182021-06-18Python1
47help-to-be-helped2020-02-042020-02-04md1
48xrkffgg2021-03-182021-03-18JavaScript1
49github-repos-stats2022-04-062022-04-06Go1
50incubator-devlake2021-11-232021-11-23Go1
51derive2019-09-282019-09-28JavaScript1
52gitlab-skyline2021-03-022021-03-02Python1
53awesome-cn-cafe-web2020-08-182020-08-18TypeScript1
54awesome-database-learning2021-05-112021-05-11md1
55build-your-own-vue2020-01-162020-01-16JavaScript1
sum160