diff --git a/chapters/16-find-in-github.md b/chapters/16-find-in-github.md new file mode 100644 index 0000000..bf512b6 --- /dev/null +++ b/chapters/16-find-in-github.md @@ -0,0 +1,82 @@ +# GitHub 寻宝指南 + +作为一个资深的咨询师、程序员,GitHub 是我用过的最好工具,因为 Google 并非总是那么用。GitHub 是一个宝藏库,可没有藏宝图,GitHub 一1亿的仓库也和你没有关系。这么一些年下来,也算是掌握了一定的技巧,写篇文章记录一下,也就顺其自然了。 + +总结一句话便是:GitHub 来搜索 Google 搜索不到的。它们可以 work 的原因,都是因为**我们想做的事情,已经有人已经走过**。如果你走的是一条新的路,那么这篇文章对你来说,意义可能没有那么大。 + +## 寻找 Demo 节省时间 + +在工作上使用新的技术,和自己平时的练习,终究差得有些远。工作的时候,我们偏向于目标编程,对于速度和时间的要求,要比自己业余时间要高得多。一旦有了这种压力,便会在 GitHub 上寻找相应的 Demo,了解原理、稍微尝试,再引入到项目中。 + +这时,便会按**技术栈的关键字搜索,并按更新时间进行排序**,以查找是否有合适的 Demo。 + +生命有限 ,如若是每次我们尝试一个新的技术,总得自己编写一个个 Demo。编写多个 Demo,都得花去个半天八小时的时间。如此一算,能花费在其它事情上的时间便更少了。若只是试用官方的 Demo,往往是比较容易的。可我们编写应用的时候,总得结合到当前的场合来。这时整合并不是一个轻松的工作,依赖冲突、引入第三方依赖等。 + +**温馨提醒**:**对于简单的项目来说,自己直接写 Demo 会更加方便。**尝试项目需要成本,若是需要尝试使用多个项目,那么有可能就浪费时间。 + +## 寻找脚手架:加快前期开发 + +无论是后端的微服务架构,还是前端应用,应用的架构正在变得复杂。后端微服务,需要结合一个个的框架,哪怕是 ``Spring Initializr`` 这样的工具,也只能帮助我们搭建项目。我们还需要配合其它工具,一起搭建出一个基本的系统。对于前端应用也是类似的,若是 Angular 这样大而全的框架,时间花费倒也是不多。如 React 这种需要组合的、小而美的框架,使用官方的 ``create-react-app`` 也很难做出我们想要的东西,寻找一个合适的脚手架是一个更好的选择。 + +这时,我们大抵可以,直接使用技术栈 + ``boilerplate`` 又或者是 ``starter`` 等关键词进行搜索,如 ``react boilerplate``。如果其中找到的组合技术栈,不符合自己的要求,那么再加上相应技术栈的关键字,如 ``react redux boilerplate`` 即可。有意思的是,在这时使用 Google 会比 GitHub 方便一些。 + +**温馨提醒**:我们需要衡量:**修改脚手架的成本,是否比自己重头写快**。 + +## 寻找 awesome-xxx:探索可能性 + +练习新的框架,我总习惯于,**编写一系列相关的 DEMO 项目,然后使用 awesome-xxx 探索可能性。** + +Awesome-xxx 系列,是 GitHub 上最容易赚 star 的类型。但凡是有一定知识度的领域、语言、框架等,都有自己的 awesome-xxx 系列的项目,如 awesome-python, awesome-iot, awesome-react 等等。在这样的项目里,都以一定的知识体系整理出来的,从索引和查阅上相应的方便。如果你想进入一个新的领域,会尝试新的东西就搜索 ``awesome xxx`` 吧。 + +**温馨提醒**:awesome-xxx 只意味着它们包含尽可能多的资料,并不代表它们拥有所有相关的库。 + +## **模仿轮子**的轮子 + +大学时,我在练习写嵌入式操作系统,uC/OS-II 对于初学者的我来说,太复杂了——有太多无关的代码。便在网上找寻相关的实现,也便是找到了一些,在那的基础上一点点完善操作系统。 + +学习一个成熟的框架,直接阅读现有源码的成本太高,毕竟也不经济。最好的方式,就是去造轮子。从模仿轮子之上,再去造轮子,是最省力气的方式。再配合 《[造轮子与从Github生成轮子](https://www.phodal.com/blog/create-framework-from-github/)》 一文,怕是能写一系列的框架。而造一个相似轮子的想法,往往很多人都有。尤其是一个成熟的框架,往往有很多仿制品。 + +于是,当你想了解一个框架,造个轮子,不妨试试搜索 ``xxx-like`` 或者 ``xxx-like framework``,中文便是 ``仿 react 框架`` 或者 ``类 react``。如我们在 Google 上搜索 ``react-like`` 就会搜索到 ``inferno``。不过,按 GitHub 的尿性,要搜索到这样的框架,并不是一件容易的事。这时 Google 往往比 GitHub 搜索好用。 + +所以建议:**平时上班休息时,搜索相关的轮子,回家就可以造轮子了。** + +## 学习资源 + +GitHub 上拥有大量的学习资源,从各类的文章到笔记,还有各式各样的电子书。如: + + 1. 只需要搜索:``类型 + 笔记``,如 ``操作系统 笔记`` 就能找到一些操作系统相关的笔记。 + 2. 只需要搜索:``书名`` 就能找到一些和这本书相关的资源,如 ``重构 改善既有代码的设计``。 + +与此同时,GitHub 上还会搜索到各种 **未经授权**英文书籍的翻译,又或者是各种电子书的 PDF 版。作为多本书的作译者,当然不鼓励 GitHub 上找到一些盗版书。 + +而在 GitHub 上又有一些库,可以提供相应的学习资源,如 [free-programming-books-zh_CN](https://github.com/justjavac/free-programming-books-zh_CN),即免费的编程中文书籍索引。 + +建议:**请尊重版权**,哈哈哈。 + +## 密钥/密码 + +GitHub 上有太多这样的东西,尽管我没有能赶上个好时候,找到一个合适的密钥。有相关多的资料泄漏和数据库被扒,和 GitHub 上存在的密钥和密码有关。 + +不过,好在 GitHub 已经在着手解决这个问题:自动删除相关的提交、代码警告等等。 + +## 私有、商用的 SDK 或代码 + +总有人,会将一些商用的代码,或者公司内部的代码,提交到 GitHub 上。如果你偶尔看到这样的代码,除了每一时间告诉作者,还可以偷偷 Clone 一下代码——虽然这样做不对,但是我还是想看。 + +如在 ThoughtWorks 的面试流程里,有一个步骤是代码编程的作业,个人的实现是不能公开出来的。接到一份作业的时候,总会去 GitHub 搜索相应的代码是否被提交了。提交了,倒是也得提醒一下相应的候选人。 + +过去,我在使用 Phaser 编写应用的时候,对应的粒子系统是收费的。由于我只是尝试这个粒子系统,便没有购买的想法。我一想 GitHub 上可能有,于是搜索了对应的 ``particle-storm.js``,然后就中奖了。就便愉愉快快地去写我的 Hello, World,最后发现它太耗费资源了,便放弃了。 + +建议:**一旦你在 GitHub 上拿到别人的商用代码,请仅用于学习,并时刻保持低调**。稍有不慎,有牢狱之灾。 + +## 数据及数据制作工具 + +当我们需要数据的时候,就会考虑写爬虫。于是 GitHub 上充满了各各样的式爬虫,除此还有得同学把爬虫数据都放在上面了。某次,当我在玩 ElasticSearch 搜索引擎的时候,突然需要一些真实的数据用来测试。便得找爬虫,就在 GitHub 上,找到了大众点评的一些爬虫。 + +这个关键词,就是:``scrapy dianping.com``,得来不费功夫。 + +除此,在 AI 相当流行的今天也是如此,也可以搜索到其它同学训练好的模型。 + +## 结论 + +试试你的 GitHub 搜索功能吧。 diff --git a/chapters/16-faq.md b/chapters/17-faq.md similarity index 100% rename from chapters/16-faq.md rename to chapters/17-faq.md diff --git a/github-roam.md b/github-roam.md index 5057504..e55b544 100644 --- a/github-roam.md +++ b/github-roam.md @@ -3559,6 +3559,89 @@ GitHub 里程碑 [https://phodal.github.io/20k/](https://phodal.github.io/20k/) +# GitHub 寻宝指南 + +作为一个资深的咨询师、程序员,GitHub 是我用过的最好工具,因为 Google 并非总是那么用。GitHub 是一个宝藏库,可没有藏宝图,GitHub 一1亿的仓库也和你没有关系。这么一些年下来,也算是掌握了一定的技巧,写篇文章记录一下,也就顺其自然了。 + +总结一句话便是:GitHub 来搜索 Google 搜索不到的。它们可以 work 的原因,都是因为**我们想做的事情,已经有人已经走过**。如果你走的是一条新的路,那么这篇文章对你来说,意义可能没有那么大。 + +## 寻找 Demo 节省时间 + +在工作上使用新的技术,和自己平时的练习,终究差得有些远。工作的时候,我们偏向于目标编程,对于速度和时间的要求,要比自己业余时间要高得多。一旦有了这种压力,便会在 GitHub 上寻找相应的 Demo,了解原理、稍微尝试,再引入到项目中。 + +这时,便会按**技术栈的关键字搜索,并按更新时间进行排序**,以查找是否有合适的 Demo。 + +生命有限 ,如若是每次我们尝试一个新的技术,总得自己编写一个个 Demo。编写多个 Demo,都得花去个半天八小时的时间。如此一算,能花费在其它事情上的时间便更少了。若只是试用官方的 Demo,往往是比较容易的。可我们编写应用的时候,总得结合到当前的场合来。这时整合并不是一个轻松的工作,依赖冲突、引入第三方依赖等。 + +**温馨提醒**:**对于简单的项目来说,自己直接写 Demo 会更加方便。**尝试项目需要成本,若是需要尝试使用多个项目,那么有可能就浪费时间。 + +## 寻找脚手架:加快前期开发 + +无论是后端的微服务架构,还是前端应用,应用的架构正在变得复杂。后端微服务,需要结合一个个的框架,哪怕是 ``Spring Initializr`` 这样的工具,也只能帮助我们搭建项目。我们还需要配合其它工具,一起搭建出一个基本的系统。对于前端应用也是类似的,若是 Angular 这样大而全的框架,时间花费倒也是不多。如 React 这种需要组合的、小而美的框架,使用官方的 ``create-react-app`` 也很难做出我们想要的东西,寻找一个合适的脚手架是一个更好的选择。 + +这时,我们大抵可以,直接使用技术栈 + ``boilerplate`` 又或者是 ``starter`` 等关键词进行搜索,如 ``react boilerplate``。如果其中找到的组合技术栈,不符合自己的要求,那么再加上相应技术栈的关键字,如 ``react redux boilerplate`` 即可。有意思的是,在这时使用 Google 会比 GitHub 方便一些。 + +**温馨提醒**:我们需要衡量:**修改脚手架的成本,是否比自己重头写快**。 + +## 寻找 awesome-xxx:探索可能性 + +练习新的框架,我总习惯于,**编写一系列相关的 DEMO 项目,然后使用 awesome-xxx 探索可能性。** + +Awesome-xxx 系列,是 GitHub 上最容易赚 star 的类型。但凡是有一定知识度的领域、语言、框架等,都有自己的 awesome-xxx 系列的项目,如 awesome-python, awesome-iot, awesome-react 等等。在这样的项目里,都以一定的知识体系整理出来的,从索引和查阅上相应的方便。如果你想进入一个新的领域,会尝试新的东西就搜索 ``awesome xxx`` 吧。 + +**温馨提醒**:awesome-xxx 只意味着它们包含尽可能多的资料,并不代表它们拥有所有相关的库。 + +## **模仿轮子**的轮子 + +大学时,我在练习写嵌入式操作系统,uC/OS-II 对于初学者的我来说,太复杂了——有太多无关的代码。便在网上找寻相关的实现,也便是找到了一些,在那的基础上一点点完善操作系统。 + +学习一个成熟的框架,直接阅读现有源码的成本太高,毕竟也不经济。最好的方式,就是去造轮子。从模仿轮子之上,再去造轮子,是最省力气的方式。再配合 《[造轮子与从Github生成轮子](https://www.phodal.com/blog/create-framework-from-github/)》 一文,怕是能写一系列的框架。而造一个相似轮子的想法,往往很多人都有。尤其是一个成熟的框架,往往有很多仿制品。 + +于是,当你想了解一个框架,造个轮子,不妨试试搜索 ``xxx-like`` 或者 ``xxx-like framework``,中文便是 ``仿 react 框架`` 或者 ``类 react``。如我们在 Google 上搜索 ``react-like`` 就会搜索到 ``inferno``。不过,按 GitHub 的尿性,要搜索到这样的框架,并不是一件容易的事。这时 Google 往往比 GitHub 搜索好用。 + +所以建议:**平时上班休息时,搜索相关的轮子,回家就可以造轮子了。** + +## 学习资源 + +GitHub 上拥有大量的学习资源,从各类的文章到笔记,还有各式各样的电子书。如: + + 1. 只需要搜索:``类型 + 笔记``,如 ``操作系统 笔记`` 就能找到一些操作系统相关的笔记。 + 2. 只需要搜索:``书名`` 就能找到一些和这本书相关的资源,如 ``重构 改善既有代码的设计``。 + +与此同时,GitHub 上还会搜索到各种 **未经授权**英文书籍的翻译,又或者是各种电子书的 PDF 版。作为多本书的作译者,当然不鼓励 GitHub 上找到一些盗版书。 + +而在 GitHub 上又有一些库,可以提供相应的学习资源,如 [free-programming-books-zh_CN](https://github.com/justjavac/free-programming-books-zh_CN),即免费的编程中文书籍索引。 + +建议:**请尊重版权**,哈哈哈。 + +## 密钥/密码 + +GitHub 上有太多这样的东西,尽管我没有能赶上个好时候,找到一个合适的密钥。有相关多的资料泄漏和数据库被扒,和 GitHub 上存在的密钥和密码有关。 + +不过,好在 GitHub 已经在着手解决这个问题:自动删除相关的提交、代码警告等等。 + +## 私有、商用的 SDK 或代码 + +总有人,会将一些商用的代码,或者公司内部的代码,提交到 GitHub 上。如果你偶尔看到这样的代码,除了每一时间告诉作者,还可以偷偷 Clone 一下代码——虽然这样做不对,但是我还是想看。 + +如在 ThoughtWorks 的面试流程里,有一个步骤是代码编程的作业,个人的实现是不能公开出来的。接到一份作业的时候,总会去 GitHub 搜索相应的代码是否被提交了。提交了,倒是也得提醒一下相应的候选人。 + +过去,我在使用 Phaser 编写应用的时候,对应的粒子系统是收费的。由于我只是尝试这个粒子系统,便没有购买的想法。我一想 GitHub 上可能有,于是搜索了对应的 ``particle-storm.js``,然后就中奖了。就便愉愉快快地去写我的 Hello, World,最后发现它太耗费资源了,便放弃了。 + +建议:**一旦你在 GitHub 上拿到别人的商用代码,请仅用于学习,并时刻保持低调**。稍有不慎,有牢狱之灾。 + +## 数据及数据制作工具 + +当我们需要数据的时候,就会考虑写爬虫。于是 GitHub 上充满了各各样的式爬虫,除此还有得同学把爬虫数据都放在上面了。某次,当我在玩 ElasticSearch 搜索引擎的时候,突然需要一些真实的数据用来测试。便得找爬虫,就在 GitHub 上,找到了大众点评的一些爬虫。 + +这个关键词,就是:``scrapy dianping.com``,得来不费功夫。 + +除此,在 AI 相当流行的今天也是如此,也可以搜索到其它同学训练好的模型。 + +## 结论 + +试试你的 GitHub 搜索功能吧。 + FAQ === diff --git a/index.html b/index.html index 2fc2fe2..f6b180f 100644 --- a/index.html +++ b/index.html @@ -29,7 +29,7 @@ a.sourceLine { text-indent: -1em; padding-left: 1em; } pre.numberSource a.sourceLine { position: relative; left: -4em; } pre.numberSource a.sourceLine::before - { content: attr(data-line-number); + { content: attr(title); position: relative; left: -1em; text-align: right; vertical-align: baseline; border: none; pointer-events: all; display: inline-block; -webkit-touch-callout: none; -webkit-user-select: none; @@ -303,6 +303,17 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
  • 下一个开源项目
  • +
  • GitHub 寻宝指南
  • FAQ
  • @@ -314,13 +325,13 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni

    作为一个开源软件作者,著有 Growth、Stepping、Lan、Echoesworks 等软件。其中开源学习应用 Growth,广受读者和用户好评,可在 APP Store 及各大 Android 应用商店下载。

    作为一个技术作者,著有《自己动手设计物联网》(电子工业出版社)、《全栈应用开发:精益实践》(电子工业出版社,正在出版)。并在 GitHub 上开源有《Growth: 全栈增长工程师指南》、《GitHub 漫游指南》等七本电子书。

    作为技术专家,他为英国 Packt 出版社审阅有物联网书籍《Learning IoT》、《Smart IoT》,前端书籍《Angular 2 Serices》、《Getting started with Angular》等技术书籍。

    -

    他热爱编程、写作、设计、旅行、hacking,你可以从他的个人网站:https://www.phodal.com/ 了解到更多的内容。

    +

    他热爱编程、写作、设计、旅行、hacking,你可以从他的个人网站:https://www.phodal.com/ 了解到更多的内容。

    其它相关信息:

    当前为预览版,在使用的过程中遇到任何问题请及时与我联系。阅读过程中的问题,不妨在GitHub上提出来: Issues

    阅读过程中遇到语法错误、拼写错误、技术错误等等,不妨来个Pull Request,这样可以帮助到其他阅读这本电子书的童鞋。

    @@ -582,35 +593,35 @@ git push -u origin master Bootstrap CSS 78490 -https://github.com/twbs/bootstrap +https://github.com/twbs/bootstrap vhf free-programming books - 37240 -https://github.com/vhf/free-programming-books +https://github.com/vhf/free-programming-books angular angular.js JavaScript 36,061 -https://github.com/angular/angular.js +https://github.com/angular/angular.js mbostock d3 JavaScript 35,257 -https://github.com/mbostock/d3 +https://github.com/mbostock/d3 joyent node JavaScript 35,077 -https://github.com/joyent/node +https://github.com/joyent/node @@ -720,24 +731,24 @@ git push -u origin master

    当只有一个人的时候,你只需要明确知道自己想要什么就够了。我们还需要的是CI、测试,以来提升代码的质量。

    测试

    通常我们都会找Document,如果没有的话,你会找什么?看源代码,还是看测试?

    -
    it("specifying response when you need it", function (done) {
    -    var doneFn = jasmine.createSpy("success");
    -
    -    lettuce.get('/some/cool/url', function (result) {
    -        expect(result).toEqual("awesome response");
    -        done();
    -    });
    -
    -    expect(jasmine.Ajax.requests.mostRecent().url).toBe('/some/cool/url');
    -    expect(doneFn).not.toHaveBeenCalled();
    -
    -    jasmine.Ajax.requests.mostRecent().respondWith({
    -        "status": 200,
    -        "contentType": 'text/plain',
    -        "responseText": 'awesome response'
    -    });
    -});
    -

    代码来源: https://github.com/phodal/lettuce

    +
    it("specifying response when you need it", function (done) {
    +    var doneFn = jasmine.createSpy("success");
    +
    +    lettuce.get('/some/cool/url', function (result) {
    +        expect(result).toEqual("awesome response");
    +        done();
    +    });
    +
    +    expect(jasmine.Ajax.requests.mostRecent().url).toBe('/some/cool/url');
    +    expect(doneFn).not.toHaveBeenCalled();
    +
    +    jasmine.Ajax.requests.mostRecent().respondWith({
    +        "status": 200,
    +        "contentType": 'text/plain',
    +        "responseText": 'awesome response'
    +    });
    +});
    +

    代码来源: https://github.com/phodal/lettuce

    上面的测试用例,清清楚楚地写明了用法,虽然写得有点扯。

    等等,测试是用来干什么的。那么,先说说我为什么会想去写测试吧: