From 8284cb1662eabe48f191e08b05eef13d890c2aa3 Mon Sep 17 00:00:00 2001 From: liuyunbin Date: Sun, 6 Oct 2019 18:56:54 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=A4=9A=E4=BD=99=E7=9A=84?= =?UTF-8?q?=E7=A9=BA=E6=A0=BC=EF=BC=8C=E4=BF=AE=E5=A4=8D=E6=9C=AC=E8=AF=A5?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E4=B8=AD=E6=96=87=E5=86=92=E5=8F=B7=E5=8D=B4?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E8=8B=B1=E6=96=87=E5=86=92=E5=8F=B7=E7=9A=84?= =?UTF-8?q?=E5=9C=B0=E6=96=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- chapters/00-prelude.md | 34 +++++------ chapters/02-github-fundamentals.md | 30 +++++----- chapters/03-build-github-project.md | 44 +++++++------- chapters/04-commit-message.md | 18 +++--- chapters/05-create-project-documents.md | 2 +- chapters/06-refactor-project.md | 40 ++++++------- chapters/07-tdd-with-autotest.md | 8 +-- chapters/11-analytics.md | 4 +- chapters/12-find-github-project.md | 16 ++--- chapters/13-read-code.md | 2 +- chapters/14-streak-your-github.md | 80 ++++++++++++------------- chapters/18-get-star.md | 2 +- 13 files changed, 141 insertions(+), 141 deletions(-) diff --git a/README.md b/README.md index 224a416..940a6fd 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ > 漫游,即随意游玩~。 -在线阅读: [GitHub 漫游指南](http://github.phodal.com/), 下载: [pdf](https://github.com/phodal/github-roam/raw/gh-pages/github-roam.pdf)、[mobi](https://github.com/phodal/github-roam/raw/gh-pages/github-roam.mobi)、[epub](https://github.com/phodal/github-roam/raw/gh-pages/github-roam.epub) +在线阅读:[GitHub 漫游指南](http://github.phodal.com/),下载:[pdf](https://github.com/phodal/github-roam/raw/gh-pages/github-roam.pdf)、[mobi](https://github.com/phodal/github-roam/raw/gh-pages/github-roam.mobi)、[epub](https://github.com/phodal/github-roam/raw/gh-pages/github-roam.epub) 2014年,写了《[一步步搭建物联网系统](https://github.com/phodal/designiot)》(电子书)。 diff --git a/chapters/00-prelude.md b/chapters/00-prelude.md index 1a39c23..280ab00 100644 --- a/chapters/00-prelude.md +++ b/chapters/00-prelude.md @@ -8,7 +8,7 @@ 作为一个开源软件作者,著有 Growth、Stepping、Lan、Echoesworks 等软件。其中开源学习应用 Growth,广受读者和用户好评,可在 APP Store 及各大 Android 应用商店下载。 -作为一个技术作者,著有《自己动手设计物联网》(电子工业出版社)、《全栈应用开发:精益实践》(电子工业出版社,正在出版)。并在 GitHub 上开源有《Growth: 全栈增长工程师指南》、《GitHub 漫游指南》等七本电子书。 +作为一个技术作者,著有《自己动手设计物联网》(电子工业出版社)、《全栈应用开发:精益实践》(电子工业出版社,正在出版)。并在 GitHub 上开源有《Growth:全栈增长工程师指南》、《GitHub 漫游指南》等七本电子书。 作为技术专家,他为英国 Packt 出版社审阅有物联网书籍《Learning IoT》、《Smart IoT》,前端书籍《Angular 2 Serices》、《Getting started with Angular》等技术书籍。 @@ -17,11 +17,11 @@ 其它相关信息: - 微博:[http://weibo.com/phodal](http://weibo.com/phodal) - - GitHub: [https://github.com/phodal](https://github.com/phodal) + - GitHub:[https://github.com/phodal](https://github.com/phodal) - 知乎:[https://www.zhihu.com/people/phodal](https://www.zhihu.com/people/phodal) - SegmentFault:[https://segmentfault.com/u/phodal](https://segmentfault.com/u/phodal) -当前为预览版,在使用的过程中遇到任何问题请及时与我联系。阅读过程中的问题,不妨在GitHub上提出来: [Issues](https://github.com/phodal/github/issues) +当前为预览版,在使用的过程中遇到任何问题请及时与我联系。阅读过程中的问题,不妨在GitHub上提出来:[Issues](https://github.com/phodal/github/issues) 阅读过程中遇到语法错误、拼写错误、技术错误等等,不妨来个Pull Request,这样可以帮助到其他阅读这本电子书的童鞋。 @@ -30,17 +30,17 @@ * 《[GitHub 漫游指南](https://github.com/phodal/github-roam)》 * 《[我的职业是前端工程师](https://github.com/phodal/fe)》 * 《[Serverless 架构应用开发指南](https://github.com/phodal/serverless)》 - * 《[Growth: 全栈增长工程师指南](https://github.com/phodal/growth-ebook)》 + * 《[Growth:全栈增长工程师指南](https://github.com/phodal/growth-ebook)》 * 《[Phodal's Idea实战指南](https://github.com/phodal/ideabook)》 * 《[一步步搭建物联网系统](https://github.com/phodal/designiot)》 * 《[RePractise](https://github.com/phodal/repractise)》 - * 《[Growth: 全栈增长工程师实战](https://github.com/phodal/growth-in-action)》 + * 《[Growth:全栈增长工程师实战](https://github.com/phodal/growth-in-action)》 -我的微信公众号: +我的微信公众号: ![作者微信公众号:phodal-weixin](./img/wechat.jpg) -支持作者,可以加入作者的小密圈: +支持作者,可以加入作者的小密圈: ![小密圈](./img/xiaomiquan.jpg) @@ -56,11 +56,11 @@ ## 我与GitHub的故事 -在我大四找工作的时候,试图去寻找一份硬件、物联网相关的工作(ps: 专业是电子信息工程)。尽管简历上写得满满的各种经历、经验,然而并没有卵用。跑了几场校园招聘会后,十份简历(ps: 事先已经有心里准备)一个也没有投出去——因为学校直接被拒。我对霸面什么的一点兴趣都没有,千里马需要伯乐。后来,我加入了[Martin Flower](https://martinfowler.com/)所在的公司,当然这是后话了。 +在我大四找工作的时候,试图去寻找一份硬件、物联网相关的工作(ps:专业是电子信息工程)。尽管简历上写得满满的各种经历、经验,然而并没有卵用。跑了几场校园招聘会后,十份简历(ps:事先已经有心里准备)一个也没有投出去——因为学校直接被拒。我对霸面什么的一点兴趣都没有,千里马需要伯乐。后来,我加入了[Martin Flower](https://martinfowler.com/)所在的公司,当然这是后话了。 -这是一个残酷的世界,在学生时代,如果你长得不帅不高的话,那么多数的附加技能都是白搭(ps: 通常富的是看不到这篇文章的)。在工作时期,如果你上家没有名气,那么将会影响你下一份工作的待遇。而,很多东西却可以改变这些,GitHub就是其中一个。 +这是一个残酷的世界,在学生时代,如果你长得不帅不高的话,那么多数的附加技能都是白搭(ps:通常富的是看不到这篇文章的)。在工作时期,如果你上家没有名气,那么将会影响你下一份工作的待遇。而,很多东西却可以改变这些,GitHub就是其中一个。 -注册GitHub的时候大概是大一的时候,我熟悉的时候已经是大四了,现在已经毕业一年了。在过去的近两年里,我试着以几个维度在GitHub上创建项目: +注册GitHub的时候大概是大一的时候,我熟悉的时候已经是大四了,现在已经毕业一年了。在过去的近两年里,我试着以几个维度在GitHub上创建项目: 1. 快速上手框架来实战,即demo 2. 重构别人的代码 @@ -70,15 +70,15 @@ ### GitHub与收获 -先说说**与技能无关的收获**吧,毕业设计做的是一个《[最小物联网系统](https://github.com/phodal/iot)》,考虑到我们专业老师没有这方面知识,答辩时会带来问题,尽量往这方面靠拢。当我毕业后,这个项目已经有过百个star了,这样易上手的东西还是比较受欢迎的(ps: 不过这种硬件相关的项目通常受限于GitHub上硬件开发工程师比较少的困扰)。 +先说说**与技能无关的收获**吧,毕业设计做的是一个《[最小物联网系统](https://github.com/phodal/iot)》,考虑到我们专业老师没有这方面知识,答辩时会带来问题,尽量往这方面靠拢。当我毕业后,这个项目已经有过百个star了,这样易上手的东西还是比较受欢迎的(ps:不过这种硬件相关的项目通常受限于GitHub上硬件开发工程师比较少的困扰)。 -毕业后一个月收到PACKT出版社的邮件(ps: 他们是在github上找到我的),内容是关于Review一本[物联网](iot)书籍,即在《[从Review到翻译IT书籍](http://www.phodal.com/blog/review-it-books-with-translate-book/)》中提到的《Learning Internet of Things》。作为一个四级没过的"物联网专家",去审阅一本英文的物联网书籍。。。 +毕业后一个月收到PACKT出版社的邮件(ps:他们是在github上找到我的),内容是关于Review一本[物联网](iot)书籍,即在《[从Review到翻译IT书籍](http://www.phodal.com/blog/review-it-books-with-translate-book/)》中提到的《Learning Internet of Things》。作为一个四级没过的"物联网专家",去审阅一本英文的物联网书籍。。。 当然,后来是审阅完了,书上有我的英文简介。 ![Phodal Huang Introduction](./img/phodal-intro.jpg) -一个月前,收到MANNING出版社的邮件(ps: 也是在github上),关于Review一本[物联网](iot)书籍的目录,并提出建议。 +一个月前,收到MANNING出版社的邮件(ps:也是在github上),关于Review一本[物联网](iot)书籍的目录,并提出建议。 也因此带来了其他更多的东西,当然不是这里的主题。在这里,我们就不讨论各种骚扰邮件,或者中文合作。从没有想象过,我也可以在英语世界有一片小天地。 @@ -86,7 +86,7 @@ ### GitHub与成长 -过去写过一篇《[如何通过github提升自己](http://www.phodal.com/blog/use-github-grow-self/)》的文章,现在只想说三点: +过去写过一篇《[如何通过github提升自己](http://www.phodal.com/blog/use-github-grow-self/)》的文章,现在只想说三点: 1. 测试 2. 更多的测试 @@ -100,7 +100,7 @@ 有一天,你会发现你离不开测试。 -然后就会相信: **那些没有写测试的项目都是在耍流氓** +然后就会相信:**那些没有写测试的项目都是在耍流氓** ## 为什么你应该深入GitHub @@ -108,10 +108,10 @@ ### 方便工作 -我们可以从中获取到不同的知识、内容、信息。每个人都可以从别人的代码中学习,当我们需要构建一个库的时候,我们可以在上面寻找不同的库和代码来实现我们的功能。如当我在实现一个库的时候,我会在GitHub上找到相应的组件: +我们可以从中获取到不同的知识、内容、信息。每个人都可以从别人的代码中学习,当我们需要构建一个库的时候,我们可以在上面寻找不同的库和代码来实现我们的功能。如当我在实现一个库的时候,我会在GitHub上找到相应的组件: - Promise 支持 -- Class类(ps:没有一个好的类使用的方式) +- Class类(ps:没有一个好的类使用的方式) - Template 一个简单的模板引擎 - Router 用来控制页面的路由 - Ajax 基本的Ajax Get/Post请求 diff --git a/chapters/02-github-fundamentals.md b/chapters/02-github-fundamentals.md index 31a2e01..4c38f9d 100644 --- a/chapters/02-github-fundamentals.md +++ b/chapters/02-github-fundamentals.md @@ -72,7 +72,7 @@ Wiki百科上是这么说的 > GitHub 是一个共享虚拟主机服务,用于存放使用Git版本控制的软件代码和内容项目。它由GitHub公司(曾称Logical Awesome)的开发者Chris Wanstrath、PJ Hyett和Tom Preston-Werner 使用Ruby on Rails编写而成。 -当然让我们看看官方的介绍: +当然让我们看看官方的介绍: > GitHub is the best place to share code with friends, co-workers, classmates, and complete strangers. Over eight million people use GitHub to build amazing things together. @@ -92,7 +92,7 @@ Wiki百科上是这么说的 ### 版本管理与软件部署 -jQuery[^jQuery]在发布版本``2.1.3``,一共有152个commit。我们可以看到如下的提交信息: +jQuery[^jQuery]在发布版本``2.1.3``,一共有152个commit。我们可以看到如下的提交信息: - Ajax: Always use script injection in globalEval … bbdfbb4 - Effects: Reintroduce use of requestAnimationFrame … 72119e0 @@ -109,15 +109,15 @@ jQuery[^jQuery]在发布版本``2.1.3``,一共有152个commit。我们可以 ### 在 GitHub 创建项目 -接着,我们试试在上面创建一个项目: +接着,我们试试在上面创建一个项目: ![GitHub Roam](./img/github-roam-create.jpg) -就会有下面的提醒: +就会有下面的提醒: ![GitHub Roam](./img/project-init.jpg) -它提供多种方式的创建方法: +它提供多种方式的创建方法: > …or create a new repository on the command line @@ -141,7 +141,7 @@ git push -u origin master ## GitHub 流行项目分析 -之前曾经分析过一些GitHub的用户行为,现在我们先来说说GitHub上的Star吧。(截止: 2015年3月9日23时。) +之前曾经分析过一些GitHub的用户行为,现在我们先来说说GitHub上的Star吧。(截止:2015年3月9日23时。) 用户 | 项目名 | Language | Star | Url -----|---------- |----------|------|---- @@ -151,7 +151,7 @@ angular | angular.js | JavaScript | 36,061 | [https://github.com/angular/angular 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) -上面列出来的是前5的,看看大于1万个stars的项目的分布,一共有82个: +上面列出来的是前5的,看看大于1万个stars的项目的分布,一共有82个: 语言 | 项目数 -----|----- @@ -166,16 +166,16 @@ Shell | 2 Go | 2 C | 2 -类型分布: +类型分布: - - 库和框架: 如``jQuery`` - - 系统: 如``Linux``、``hhvm``、``docker`` - - 配置集: 如``dotfiles`` - - 辅助工具: 如``oh-my-zsh`` - - 工具: 如``Homewbrew``和``Bower`` - - 资料收集: 如``free programming books``,``You-Dont-Know-JS``,``Font-Awesome`` - - 其他:简历如``Resume`` + - 库和框架:如``jQuery`` + - 系统:如``Linux``、``hhvm``、``docker`` + - 配置集:如``dotfiles`` + - 辅助工具:如``oh-my-zsh`` + - 工具:如``Homewbrew``和``Bower`` + - 资料收集:如``free programming books``,``You-Dont-Know-JS``,``Font-Awesome`` + - 其他:简历如``Resume`` ## Pull Request diff --git a/chapters/03-build-github-project.md b/chapters/03-build-github-project.md index 062baaa..e370cc4 100644 --- a/chapters/03-build-github-project.md +++ b/chapters/03-build-github-project.md @@ -6,14 +6,14 @@ ### 敏捷软件开发 -显然我是在扯淡,这和敏捷软件开发没有什么关系。不过我也不知道瀑布流是怎样的。说说我所知道的一个项目的组成吧: +显然我是在扯淡,这和敏捷软件开发没有什么关系。不过我也不知道瀑布流是怎样的。说说我所知道的一个项目的组成吧: - 看板式管理应用程序(如trello,简单地说就是管理软件功能) - CI(持续集成) - 测试覆盖率 - 代码质量(code smell) -对于一个不是远程的团队(如只有一个人的项目) 来说,Trello、Jenkin、Jira不是必需的: +对于一个不是远程的团队(如只有一个人的项目) 来说,Trello、Jenkin、Jira不是必需的: > 你存在,我深深的脑海里 @@ -43,11 +43,11 @@ it("specifying response when you need it", function (done) { }); ``` -代码来源: [https://github.com/phodal/lettuce](https://github.com/phodal/lettuce) +代码来源:[https://github.com/phodal/lettuce](https://github.com/phodal/lettuce) 上面的测试用例,清清楚楚地写明了用法,虽然写得有点扯。 -等等,测试是用来干什么的。那么,先说说我为什么会想去写测试吧: +等等,测试是用来干什么的。那么,先说说我为什么会想去写测试吧: - 我不希望每次做完一个个新功能的时候,再手动地去测试一个个功能。(自动化测试) - 我不希望在重构的时候发现破坏了原来的功能,而我还一无所知。 @@ -71,7 +71,7 @@ it("specifying response when you need it", function (done) { ✓ should be able fadeout elements ``` -代码来源: [https://github.com/phodal/lettuce](https://github.com/phodal/lettuce) +代码来源:[https://github.com/phodal/lettuce](https://github.com/phodal/lettuce) 看上去似乎每个测试都很小,不过补完每一个测试之后我们就得到了测试覆盖率 @@ -83,7 +83,7 @@ lettuce.js | 98.58% (209 / 212)| 82.98%(78 / 94) | 100.00% (54 / 54) | 98.58% (2 ### CI -虽然node.js不算是一门语言,但是因为我们用的node,下面的是一个简单的``.travis.yml``示例: +虽然node.js不算是一门语言,但是因为我们用的node,下面的是一个简单的``.travis.yml``示例: ```yml language: node_js @@ -98,7 +98,7 @@ install: npm install after_success: CODECLIMATE_REPO_TOKEN=321480822fc37deb0de70a11931b4cb6a2a3cc411680e8f4569936ac8ffbb0ab codeclimate < coverage/lcov.info ``` -代码来源: [https://github.com/phodal/lettuce](https://github.com/phodal/lettuce) +代码来源:[https://github.com/phodal/lettuce](https://github.com/phodal/lettuce) 我们把这些集成到``README.md``之后,就有了之前那张图。 @@ -114,7 +114,7 @@ CI对于一个开发者在不同城市开发同一项目上来说是很重要的 ``Code Climate``是一个与github集成的工具,我们不仅仅可以看到测试覆盖率,还有代码质量。 -先看看上面的ajax类: +先看看上面的ajax类: ```javascript Lettuce.get = function (url, callback) { @@ -141,7 +141,7 @@ Lettuce.send = function (url, method, callback, data) { }; ``` -代码来源: [https://github.com/phodal/lettuce](https://github.com/phodal/lettuce) +代码来源:[https://github.com/phodal/lettuce](https://github.com/phodal/lettuce) 在[Code Climate](https://codeclimate.com/github/phodal/lettuce/src/ajax.js)在出现了一堆问题 @@ -163,7 +163,7 @@ Lettuce.send = function (url, method, callback, data) { 今天就来说说是怎样做的。 -以之前造的[Lettuce](https://github.com/phodal/lettuce)为例,里面有: +以之前造的[Lettuce](https://github.com/phodal/lettuce)为例,里面有: - 代码质量(Code Climate) - CI状态(Travis CI) @@ -171,7 +171,7 @@ Lettuce.send = function (url, method, callback, data) { - 自动化测试(npm test) - 文档 -按照[Web Developer路线图](https://github.com/phodal/awesome-developer)来说,我们还需要有: +按照[Web Developer路线图](https://github.com/phodal/awesome-developer)来说,我们还需要有: - 版本管理 - 自动部署 @@ -180,9 +180,9 @@ Lettuce.send = function (url, method, callback, data) { ### 代码模块化 -在SkillTree的源码里,大致分为三部分: +在SkillTree的源码里,大致分为三部分: - - namespace函数: 顾名思义 + - namespace函数:顾名思义 - Calculator也就是TalentTree,主要负责解析、生成url,头像,依赖等等 - Skill 主要是tips部分。 @@ -193,13 +193,13 @@ Lettuce.send = function (url, method, callback, data) { - jQuery - Knockout -好在Knockout可以用Require.js进行管理,于是,使用了``Require.js``进行管理: +好在Knockout可以用Require.js进行管理,于是,使用了``Require.js``进行管理: ```html ``` -``main.js``配置如下: +``main.js``配置如下: ```javascript require.config({ @@ -263,7 +263,7 @@ define([], function() { }); ``` -或者说这是一个AMD的Class应该有的样子。考虑到this的隐性绑定,作者用了self=this来避免这个问题。最后Return了这个对象,我们在调用的就需要new一个。大部分在代码中返回的都是对象,除了在Utils类里面返回的是函数: +或者说这是一个AMD的Class应该有的样子。考虑到this的隐性绑定,作者用了self=this来避免这个问题。最后Return了这个对象,我们在调用的就需要new一个。大部分在代码中返回的都是对象,除了在Utils类里面返回的是函数: ```javascript return { @@ -277,7 +277,7 @@ return { ### 自动化测试 -一直习惯用Travis CI,于是也继续用Travis Ci,``.travis.yml``配置如下所示: +一直习惯用Travis CI,于是也继续用Travis Ci,``.travis.yml``配置如下所示: ```yml language: node_js @@ -316,7 +316,7 @@ branches: > JSLint定义了一组编码约定,这比ECMA定义的语言更为严格。这些编码约定汲取了多年来的丰富编码经验,并以一条年代久远的编程原则 作为宗旨:能做并不意味着应该做。JSLint会对它认为有的编码实践加标志,另外还会指出哪些是明显的错误,从而促使你养成好的 JavaScript编码习惯。 -当我们的js写得不合理的时候,这时测试就无法通过: +当我们的js写得不合理的时候,这时测试就无法通过: line 5 col 25 A constructor name should start with an uppercase letter. line 21 col 62 Strings must use singlequote. @@ -328,7 +328,7 @@ branches: > Mocha 是一个优秀的JS测试框架,支持TDD/BDD,结合 should.js/expect/chai/better-assert,能轻松构建各种风格的测试用例。 -最后的效果如下所示: +最后的效果如下所示: Book,Link Book Test @@ -338,7 +338,7 @@ branches: ### 测试示例 -简单地看一下Book的测试: +简单地看一下Book的测试: ```javascript /* global describe, it */ @@ -411,7 +411,7 @@ it('should return book label & url', function () { Code Climate整合一组静态分析工具的结果到一个单一的,实时的报告,让您的团队需要识别热点,探讨新的方法,提高代码质量的信息。 -简单地来说: +简单地来说: - 对我们的代码评分 - 找出代码中的坏味道 @@ -431,7 +431,7 @@ B | lib/rest/rest_helper.js | 19 | 62 | 3 | 4.7 | 37.5% | 2 A | lib/rest/rest_server.js | 17 | 0 | 2 | 8.6 | 88.9% | 0 A | lib/url_handler.js | 9 | 0 | 5 | 2.2 | 94.1% | 0 -分享得到的最后的结果是: +分享得到的最后的结果是: ![Coverage][1] diff --git a/chapters/04-commit-message.md b/chapters/04-commit-message.md index a94b6bc..ffeea38 100644 --- a/chapters/04-commit-message.md +++ b/chapters/04-commit-message.md @@ -76,15 +76,15 @@ Git 提交信息及几种不同的规范 对应的类型有: - - build: 影响构建系统或外部依赖关系的更改(示例范围:gulp,broccoli,npm) - - ci: 更改我们的持续集成文件和脚本(示例范围:Travis,Circle,BrowserStack,SauceLabs) - - docs: 仅文档更改 - - feat: 一个新功能 - - fix: 修复错误 - - perf: 改进性能的代码更改 - - refactor: 代码更改,既不修复错误也不添加功能 - - style: 不影响代码含义的变化(空白,格式化,缺少分号等) - - test: 添加缺失测试或更正现有测试 + - build:影响构建系统或外部依赖关系的更改(示例范围:gulp,broccoli,npm) + - ci:更改我们的持续集成文件和脚本(示例范围:Travis,Circle,BrowserStack,SauceLabs) + - docs:仅文档更改 + - feat:一个新功能 + - fix:修复错误 + - perf:改进性能的代码更改 + - refactor:代码更改,既不修复错误也不添加功能 + - style:不影响代码含义的变化(空白,格式化,缺少分号等) + - test:添加缺失测试或更正现有测试 同时还对应了 20+ 的 Scope,可以说这种提交比上面的提交更有挑战。 diff --git a/chapters/05-create-project-documents.md b/chapters/05-create-project-documents.md index ba1978a..d67bd8d 100644 --- a/chapters/05-create-project-documents.md +++ b/chapters/05-create-project-documents.md @@ -52,7 +52,7 @@ README通常会显示在GitHub项目的下面,如下图所示: 一个简单上手的示例非常重要,特别是通常我们是在为着某个目的而去使用一个开源项目的是时候,我们希望能马上使用到我们的项目中。 -你希望看到的是,你打开浏览器,输入下面的代码,然后**It Works**: +你希望看到的是,你打开浏览器,输入下面的代码,然后**It Works**: ``` var HelloMessage = React.createClass({ diff --git a/chapters/06-refactor-project.md b/chapters/06-refactor-project.md index 6c6da3b..6991df2 100644 --- a/chapters/06-refactor-project.md +++ b/chapters/06-refactor-project.md @@ -10,7 +10,7 @@ > 为了更好的代码。 -在经历了一年多的工作之后,我平时的主要工作就是修Bug。刚开始的时候觉得无聊,后来才发现修Bug需要更好的技术。有时候你可能要面对着一坨一坨的代码,有时候你可能要花几天的时间去阅读代码。而你重写那几十行代码可能只会花上你不到一天的时间。但是如果你没办法理解当时为什么这么做,你的修改只会带来更多的Bug。修Bug,更多的是维护代码。还是前人总结的那句话对: +在经历了一年多的工作之后,我平时的主要工作就是修Bug。刚开始的时候觉得无聊,后来才发现修Bug需要更好的技术。有时候你可能要面对着一坨一坨的代码,有时候你可能要花几天的时间去阅读代码。而你重写那几十行代码可能只会花上你不到一天的时间。但是如果你没办法理解当时为什么这么做,你的修改只会带来更多的Bug。修Bug,更多的是维护代码。还是前人总结的那句话对: > 写代码容易,读代码难。 @@ -24,11 +24,11 @@ ## 重构uMarkdown -代码及setup请见github: [js-refactor](https://github.com/artisanstack/js-refactor) +代码及setup请见github:[js-refactor](https://github.com/artisanstack/js-refactor) ### 代码说明 -``uMarkdown``是一个用于将Markdown转化为HTML的库。代码看上去就像一个很典型的过程代码: +``uMarkdown``是一个用于将Markdown转化为HTML的库。代码看上去就像一个很典型的过程代码: ```javascript /* code */ @@ -52,7 +52,7 @@ while ((stra = micromarkdown.regexobject.mail.exec(str)) !== null) { Markdown的解析过程,有点类似于``Pipe and Filters``模式(架构模式)。 -Filter即我们在代码中看到的正规表达式集: +Filter即我们在代码中看到的正规表达式集: ```javascript regexobject: { @@ -64,7 +64,7 @@ regexobject: { 接着,我们就可以对其进行简单的重构。 -(ps: 推荐用WebStrom来做重构,自带重构功能) +(ps:推荐用WebStrom来做重构,自带重构功能) 作为一个示例,我们先提出codeHandler方法,即将上面的 @@ -145,7 +145,7 @@ str = tableHandler(str, execStr, strict); ✓ should return correctly class name ``` -快来试试吧, [https://github.com/artisanstack/js-refactor](https://github.com/artisanstack/js-refactor) +快来试试吧,[https://github.com/artisanstack/js-refactor](https://github.com/artisanstack/js-refactor) 是时候讨论这个Refactor利器了,最初看到这个重构的过程是从ThoughtWorks郑大晔校开始的,只是之前对于Java的另外一个编辑器Eclipse的坏感。。这些在目前已经不是很重要了,试试这个公司里面应用广泛的编辑器。 @@ -179,9 +179,9 @@ public class Main { ### Rename -**快捷键:Shift+F6** +**快捷键:Shift+F6** -**作用:重命名** +**作用:重命名** - 把光标丢到int c中的c,按下shift+f6,输入result_add - 把光标移到int d中的d,按下shift+f6,输入result_sub @@ -205,9 +205,9 @@ public class Main { ### Extract Method -**快捷键:alt+command+m** +**快捷键:alt+command+m** -**作用:扩展方法** +**作用:扩展方法** - 选中System.out.println(result_add); - 按下alt+command+m @@ -233,15 +233,15 @@ private static void mprint(int result_sub) { ### Inline Method -**快捷键:alt+command+n** +**快捷键:alt+command+n** -**作用:内联方法** +**作用:内联方法** - 选中main中的mprint - alt+command+n - 选中Inline all invocations and remove the method(2 occurrences) 点确定 -然后我们等于什么也没有做了~~: +然后我们等于什么也没有做了~~: ```java public static void main(String[] args) { @@ -257,7 +257,7 @@ public static void main(String[] args) { ### Pull Members Up -开始之前让我们先看看Cal2类: +开始之前让我们先看看Cal2类: ```java public class Cal2 extends Cal { @@ -280,7 +280,7 @@ public class Cal { } ``` -最后的结果,就是将Cal2类中的sub方法,提到父类: +最后的结果,就是将Cal2类中的sub方法,提到父类: ```java public class Cal { @@ -301,13 +301,13 @@ public class Cal { 快捷键 -Mac: 木有 +Mac:木有 -Windows/Linux: 木有 +Windows/Linux:木有 -或者: ``Shift``+``alt``+``command``+``T`` 再选择 ``Replace Temp with Query`` +或者:``Shift``+``alt``+``command``+``T`` 再选择 ``Replace Temp with Query`` -鼠标: **Refactor** | ``Replace Temp with Query`` +鼠标:**Refactor** | ``Replace Temp with Query`` #### 重构之前 @@ -386,7 +386,7 @@ public class replaceTemp { ``Command``+``Alt``+``Shift``+``T`` 再选中Replace Temp with Query -便会有下面的结果: +便会有下面的结果: ```javas diff --git a/chapters/07-tdd-with-autotest.md b/chapters/07-tdd-with-autotest.md index d581f7a..1abd17a 100644 --- a/chapters/07-tdd-with-autotest.md +++ b/chapters/07-tdd-with-autotest.md @@ -22,7 +22,7 @@ if (!req.headers.authorization) { } ``` -可是除了HTTP协议,还有MQTT和CoAP。对于MQTT协议来说,那还算好,毕竟自带授权,如: +可是除了HTTP协议,还有MQTT和CoAP。对于MQTT协议来说,那还算好,毕竟自带授权,如: ```bash mosquitto_pub -u root -P root -h localhost -d -t lettuce -m "Hello, MQTT. This is my first message." @@ -57,14 +57,14 @@ req.end(); 测试驱动开发是一个很"古老"的程序开发方法,然而由于国内的开发流程的问题——即开发人员负责功能的测试,导致这么好的一项技术没有在国内推广。 -测试驱动开发的主要过程是: +测试驱动开发的主要过程是: 1. 先写功能的测试 2. 实现功能代码 3. 提交代码(commit -> 保证功能正常) 4. 重构功能代码 -而对于这样的一个物联网项目来说,我已经有了几个有利的前提: +而对于这样的一个物联网项目来说,我已经有了几个有利的前提: 1. 已经有了原型 2. 框架设计 @@ -145,7 +145,7 @@ req.end(); ### Twill 测试脚本 -当然我们也可以用脚本直接来测试``login.twill``: +当然我们也可以用脚本直接来测试``login.twill``: go http://127.0.0.1:5000/login diff --git a/chapters/11-analytics.md b/chapters/11-analytics.md index be19208..3412966 100644 --- a/chapters/11-analytics.md +++ b/chapters/11-analytics.md @@ -444,7 +444,7 @@ pipe.execute() [{'1': '51', '0': '41', '3': '17', '2': '34', '5': '28', '4': '22', '6': '34'}] ``` -结果大致如下图所示: +结果大致如下图所示: ![SMTWTFS](./img/smtwtfs.png) @@ -532,7 +532,7 @@ osrc最有意思的一部分莫过于flann,当然说的也是系统后台的 0. 0. 0. 0. 0.00881057] ``` -这里分析到用户的大部分行为,再找到与其行为相近的用户,主要的行为有下面这些: +这里分析到用户的大部分行为,再找到与其行为相近的用户,主要的行为有下面这些: - 每星期的情况 - 事件的类型 diff --git a/chapters/12-find-github-project.md b/chapters/12-find-github-project.md index c02fb09..a89b0ea 100644 --- a/chapters/12-find-github-project.md +++ b/chapters/12-find-github-project.md @@ -9,7 +9,7 @@ > Lettuce是一个简约的移动开发框架。 -故事的出发点是这样的:``写了很多代码,用的都是框架,最后不知道收获什么了``?事实也是如此,当自己做了一些项目之后,发现最后什么也没有收获到。于是,就想着做一个框架。 +故事的出发点是这样的:``写了很多代码,用的都是框架,最后不知道收获什么了``?事实也是如此,当自己做了一些项目之后,发现最后什么也没有收获到。于是,就想着做一个框架。 ### 需求 @@ -22,21 +22,21 @@ 我想要的只是一个简单的功能,而我不想引入一个庞大的库。换句话说,我只需要不同库里面的一小部分功能,而不是一个库。 -实际上想要的是: +实际上想要的是: > 构建一个库,里面从不同的库里面抽取出不同的函数。 ### 计划 -这时候我参考了一本电子书《Build JavaScript FrameWork》,加上一些平时的需求,于是很快的就知道自己需要什么样的功能: +这时候我参考了一本电子书《Build JavaScript FrameWork》,加上一些平时的需求,于是很快的就知道自己需要什么样的功能: - Promise 支持 - - Class类(ps:没有一个好的类使用的方式) + - Class类(ps:没有一个好的类使用的方式) - Template 一个简单的模板引擎 - Router 用来控制页面的路由 - Ajax 基本的Ajax Get/Post请求 -在做一些实际的项目中,还遇到了这样的一些功能支持: +在做一些实际的项目中,还遇到了这样的一些功能支持: - Effect 简单的一些页面效果 - AMD支持 @@ -56,7 +56,7 @@ #### 寻找 -在GitHub上搜索了一个看到了下面的几个结果: +在GitHub上搜索了一个看到了下面的几个结果: - [https://github.com/then/promise](https://github.com/then/promise) - [https://github.com/reactphp/promise](https://github.com/reactphp/promise) @@ -64,7 +64,7 @@ - [https://github.com/petkaantonov/bluebird](https://github.com/petkaantonov/bluebird) - [https://github.com/cujojs/when](https://github.com/cujojs/when) -但是显然,他们都太重了。事实上,对于一个库来说,80%的人只需要其中20%的代码。于是,找到了[https://github.com/stackp/promisejs](https://github.com/stackp/promisejs),看了看用法,这就是我们需要的功能: +但是显然,他们都太重了。事实上,对于一个库来说,80%的人只需要其中20%的代码。于是,找到了[https://github.com/stackp/promisejs](https://github.com/stackp/promisejs),看了看用法,这就是我们需要的功能: ```javascript function late(n) { @@ -131,7 +131,7 @@ var promise = { }; ``` -需要注意的是: ``License``,不同的软件有不同的License,如MIT、GPL等等。最好能在遵循协议的情况下,使用别人的代码。 +需要注意的是:``License``,不同的软件有不同的License,如MIT、GPL等等。最好能在遵循协议的情况下,使用别人的代码。 ### 实现第二个需求 diff --git a/chapters/13-read-code.md b/chapters/13-read-code.md index e7b6bc8..8b3e917 100644 --- a/chapters/13-read-code.md +++ b/chapters/13-read-code.md @@ -73,7 +73,7 @@ 还是有点长 -四、我们可以找到它的最早版本: +四、我们可以找到它的最早版本: ![flask-init.png](./img/flask-init.png) diff --git a/chapters/14-streak-your-github.md b/chapters/14-streak-your-github.md index 8e5a803..8aac275 100644 --- a/chapters/14-streak-your-github.md +++ b/chapters/14-streak-your-github.md @@ -21,7 +21,7 @@ GitHub连击 同时这似乎也意味着,我每天的commit数与之相比多了很多。 -在连击20的时候,有这样的问题: *为了commit而commit代码*,最后就放弃了。 +在连击20的时候,有这样的问题:*为了commit而commit代码*,最后就放弃了。 而现在是``为了填坑而commit``,为自己挖了太多的想法。 @@ -29,23 +29,23 @@ GitHub连击 当时我需要去印度接受毕业生培训,大概有5周左右,想着总不能空手而归。于是在国庆结束后有了第一次commit,当时旅游归来,想着自己在不同的地方有不同的照片,于是这个repo的名字是 [onmap](https://github.com/phodal/onmap)——将自己的照片显示在地图上的拍摄地点(手机是Lumia 920)。然而,中间因为修改账号的原因,丢失了commit。 -再从印度说起,当时主要维护三个repo: +再从印度说起,当时主要维护三个repo: - 物联网的CoAP协议 - [一步步设计物联网系统](https://github.com/phodal/designiot)的电子书 - 一个Node.js + JS的网站 -说说最后一个,最后一个是练习的项目。因为当时培训比较无聊,业余时间比较多,英语不好,加上听不懂印度人的话。晚上基本上是在住的地方默默地写代码,所以当时的目标有这么几个: +说说最后一个,最后一个是练习的项目。因为当时培训比较无聊,业余时间比较多,英语不好,加上听不懂印度人的话。晚上基本上是在住的地方默默地写代码,所以当时的目标有这么几个: - TDD - 测试覆盖率 - 代码整洁 -这也就是为什么那个repo有这样的一行: +这也就是为什么那个repo有这样的一行: ![Repo Status](./img/repo-status.png) -做到98%的覆盖率也算蛮拼的,当然还有Code Climate也达到了4.0,也有了112个commits。因此也带来了一些提高: +做到98%的覆盖率也算蛮拼的,当然还有Code Climate也达到了4.0,也有了112个commits。因此也带来了一些提高: - 提高了代码的质量(code climate比jslint更注重重复代码等等一些bad smell)。 - 对于Mock、Stub、FakesServer等用法有更好的掌握 @@ -53,13 +53,13 @@ GitHub连击 ### 100天的挑战 -(ps:从印度回来之后,由于女朋友在泰国实习,有了更多的时间可以看书、写代码) +(ps:从印度回来之后,由于女朋友在泰国实习,有了更多的时间可以看书、写代码) 有意思的是越到中间的一些时间,commits的次数上去了,除了一些简单的pull request,还有一些新的轮子出现了。 ![Problem](./img/problem.jpg) -这是上一星期的commits,这也就意味着,在一星期里面,我需要在8个repo里切换。而现在我又有了一个新的idea,这时就发现了一堆的问题: +这是上一星期的commits,这也就意味着,在一星期里面,我需要在8个repo里切换。而现在我又有了一个新的idea,这时就发现了一堆的问题: - 今天工作在这个repo上,突然发现那个repo上有issue,需要去修复,于是就放下了当前的代码。 - 在不同的repo间切换容易分散精力 @@ -71,22 +71,22 @@ GitHub连击 在经历了100天之后,似乎整个人都轻松了,毕竟目标是100~200天。似乎到现在,也不会有什么特殊的情怀,除了一些希冀。 -当然,对于一个开源项目的作者来说,最好有下面的情况: +当然,对于一个开源项目的作者来说,最好有下面的情况: - 很多人知道了这个项目 - 很多人用它的项目。 - 在某些可以用这个项目快速解决问题的地方提到了这个项目 - 提了bug、issue、问题。 -- 提了bug,并解决了。(ps:这是最理想的情况) +- 提了bug,并解决了。(ps:这是最理想的情况) ## 200天的Showcase -今天是我连续泡在GitHub上的第200天,也是蛮高兴的,终于到达了: +今天是我连续泡在GitHub上的第200天,也是蛮高兴的,终于到达了: ![GitHub 200 days](./img/github-200-days.png) -故事的背影是: 去年国庆完后要去印度接受毕业生培训——就是那个神奇的国度。但是在去之前已经在项目待了九个多月,项目上的挑战越来越少,在印度的时间又算是比较多。便给自己设定了一个长期的goal,即100~200天的longest streak。 +故事的背影是:去年国庆完后要去印度接受毕业生培训——就是那个神奇的国度。但是在去之前已经在项目待了九个多月,项目上的挑战越来越少,在印度的时间又算是比较多。便给自己设定了一个长期的goal,即100~200天的longest streak。 或许之前你看到过一篇文章[让我们连击](https://github.com/phodal/github-roam/blob/master/chapters/12-streak-your-github.md),那时已然140天,只是还是浑浑噩噩。到了今天,渐渐有了一个更清晰地思路。 @@ -96,11 +96,11 @@ GitHub连击 上面说到的培训一开始是用Java写的一个网站,有自动测试、CI、CD等等。由于是内部组队培训,代码不能公开等等因素,加之做得无聊。顺手,拿Node.js +RESTify 做了Server,Backbone + RequireJS + jQuery 做了前台的逻辑。于是在那个日子里,也在维护一些旧的repo,如[iot-coap](https://github.com/phodal/iot-coap)、[iot](https://github.com/phodal/iot),前者是我拿到WebStorm开源License的Repo,后者则是毕业设计。 -对于这样一个项目也需要有测试、自动化测试、CI等等。CI用的是Travics-CI。总体的技术构架如下: +对于这样一个项目也需要有测试、自动化测试、CI等等。CI用的是Travics-CI。总体的技术构架如下: #### 技术栈 -前台: +前台: - Backbone - RequireJS @@ -108,11 +108,11 @@ GitHub连击 - Mustache - Pure CSS -后台: +后台: - RESTify -测试: +测试: - Jasmine - Chai @@ -122,7 +122,7 @@ GitHub连击 一直写到五星期的培训结束, 只是没有自动部署。想想就觉得可以用github-page的项目多好~~。 -过程中还有一些有意思的小项目,如: +过程中还有一些有意思的小项目,如: ### google map solr polygon 搜索 @@ -130,11 +130,11 @@ GitHub连击 ![google map solr](./img/solr.png) -代码: [https://github.com/phodal/gmap-solr](https://github.com/phodal/gmap-solr) +代码:[https://github.com/phodal/gmap-solr](https://github.com/phodal/gmap-solr) ### 技能树 -这个可以从两部分说起: +这个可以从两部分说起: #### 重构 Skill Tree @@ -147,7 +147,7 @@ GitHub连击 ![Skill Tree](./img/skilltree.jpg) -代码: [https://github.com/phodal/skillock](https://github.com/phodal/skillock) +代码:[https://github.com/phodal/skillock](https://github.com/phodal/skillock) #### 技能树Sherlock @@ -161,7 +161,7 @@ GitHub连击 ![Sherlock skill tree](./img/sherlock.png) -代码: [https://github.com/phodal/sherlock](https://github.com/phodal/sherlock) +代码:[https://github.com/phodal/sherlock](https://github.com/phodal/sherlock) #### Django Ionic ElasticSearch 地图搜索 @@ -172,7 +172,7 @@ GitHub连击 - Ionic - OpenLayers 3 -代码: [https://github.com/phodal/django-elasticsearch](https://github.com/phodal/django-elasticsearch) +代码:[https://github.com/phodal/django-elasticsearch](https://github.com/phodal/django-elasticsearch) #### 简历生成器 @@ -184,7 +184,7 @@ GitHub连击 - RequireJS - Showdown -代码: [https://github.com/phodal/resume](https://github.com/phodal/resume) +代码:[https://github.com/phodal/resume](https://github.com/phodal/resume) #### Nginx 大数据学习 @@ -195,23 +195,23 @@ GitHub连击 - Hadoop - Pig -代码: [https://github.com/phodal/learning-data/tree/master/nginx](https://github.com/phodal/learning-data/tree/master/nginx) +代码:[https://github.com/phodal/learning-data/tree/master/nginx](https://github.com/phodal/learning-data/tree/master/nginx) #### 其他 -虽然技术栈上主要集中在Python、JavaScript,当然还有一些Ruby、Pig、Shell、Java的代码,只是我还是习惯用Python和JavaScript。一些用到觉得不错的框架: +虽然技术栈上主要集中在Python、JavaScript,当然还有一些Ruby、Pig、Shell、Java的代码,只是我还是习惯用Python和JavaScript。一些用到觉得不错的框架: -- Ionic: 开始Hybird移动应用。 -- Django: Python Web开发利器。 -- Flask: Python Web开发小刀。 -- RequireJS: 管理js依赖。 -- Backbone: Model + View + Router。 -- Angluar: ...。 -- Knockout: MVV*。 -- React: 据说会火。 -- Cordova: Hybird应用基础。 +- Ionic:开始Hybird移动应用。 +- Django:Python Web开发利器。 +- Flask:Python Web开发小刀。 +- RequireJS:管理js依赖。 +- Backbone:Model + View + Router。 +- Angluar:...。 +- Knockout:MVV*。 +- React:据说会火。 +- Cordova:Hybird应用基础。 -还应该有: +还应该有 - ElasticSearch - Solr @@ -234,7 +234,7 @@ GitHub连击 练习不到位便意味着,即使你练习的时候是一万小时的两倍,那也是无济于事的。如果你学得比别人晚,在**很长的一段时间里**(可能直到进棺材)输给别人是必然的——落后就要挨打。就好像我等毕业于一所二本垫底的学校里,如果在过去我一直保持着和别人(各种重点)一样的学习速度,那么我只能一直是Loser。 -需要注意的是,对你来说考上二本很难,并不是因为你比别人笨。教育资源分配不均的问题,在某种程度上导致了新的阶级制度的出现。如[我的首页](https://www.phodal.com/)说的那样: **THE ONLY FAIR IS NOT FAIR**——唯一公平的是它是不公平的。我们可以做的还有很多——**CREATE & SHARE**。真正的不幸是,因为营养不良导致的教育问题。 +需要注意的是,对你来说考上二本很难,并不是因为你比别人笨。教育资源分配不均的问题,在某种程度上导致了新的阶级制度的出现。如[我的首页](https://www.phodal.com/)说的那样:**THE ONLY FAIR IS NOT FAIR**——唯一公平的是它是不公平的。我们可以做的还有很多——**CREATE & SHARE**。真正的不幸是,因为营养不良导致的教育问题。 于是在想明白了很多事的时候起,便有了Re-Practise这样的计划,而365天只是中间的一个产物。 @@ -283,9 +283,9 @@ GitHub连击 ### 技术与框架设计 -在上上一篇博客中《[After 500: 写了第500篇博客,然后呢?](https://www.phodal.com/blog/after-500-blogposts-analytics-after-tech/)》也深刻地讨论了下这个问题,技术向来都是后发者优势。对于技术人员来说,也是如此,后发者占据很大的优势。 +在上上一篇博客中《[After 500:写了第500篇博客,然后呢?](https://www.phodal.com/blog/after-500-blogposts-analytics-after-tech/)》也深刻地讨论了下这个问题,技术向来都是后发者优势。对于技术人员来说,也是如此,后发者占据很大的优势。 -如果我们只是单纯地把我们的关注点仅仅放置于技术上,那么我们就不具有任何的优势。而依赖于我们的编程经验,我们可以在特定的时候创造一些框架。而架构的设计本身就是一件有意思的事,大抵是因为程序员都喜欢创造。(ps:之前曾经写过这样一篇文章,《[对不起,我并不热爱编程,我只喜欢创造](https://www.phodal.com/blog/sorry-i-don't-like-programming/)》) +如果我们只是单纯地把我们的关注点仅仅放置于技术上,那么我们就不具有任何的优势。而依赖于我们的编程经验,我们可以在特定的时候创造一些框架。而架构的设计本身就是一件有意思的事,大抵是因为程序员都喜欢创造。(ps:之前曾经写过这样一篇文章,《[对不起,我并不热爱编程,我只喜欢创造](https://www.phodal.com/blog/sorry-i-don't-like-programming/)》) **创造是一种知识的再掌握过程。** @@ -404,7 +404,7 @@ THE ONLY FAIR IS NOT FAIR . ENJOY CREATE & SHARE. 编码是一件值得练习的事,你从书中、互联网上看到的那一个个的编程大牛无一不是从一点点的小技能积累起来的。从小接触可以让你有一个好的开始,一段好好的练习也会帮助你更好的前进。 -记得我在最开始练习的时候,我分几个不同的阶段去练习: +记得我在最开始练习的时候,我分几个不同的阶段去练习: - 按照《重构:改善即有代码的设计》一书边寻找一些 bad smell 的代码,一边想方设法去让代码变得优雅。 - 按照《设计模式》以及《重构与模式》来将代码重构成某种设计模式。 @@ -483,8 +483,8 @@ OnMap项目是为了让我用Nokia Lumia 920拍照的照片,可以在地图上 我们有了Growth系列的电子书、APP,还有Mole,几个极具代表性的项目就够了。 - [Growth](https://github.com/phodal/growth),一款专注于Web开发者成长的应用,涵盖Web开发的流程及技术栈,Web开发的学习路线、成长衡量等各方面。 - - [Growth: 全栈增长工程师指南](https://github.com/phodal/growth-ebook),一本关于如何成为全栈增长工程师的指南 - - [Growth: 全栈增长工程师实战](https://github.com/phodal/growth-in-action),在Growth中我们介绍的只是一系列的实践,而Growth实战则会带领读者去履行这些实践 + - [Growth:全栈增长工程师指南](https://github.com/phodal/growth-ebook),一本关于如何成为全栈增长工程师的指南 + - [Growth:全栈增长工程师实战](https://github.com/phodal/growth-in-action),在Growth中我们介绍的只是一系列的实践,而Growth实战则会带领读者去履行这些实践 ### See you Again diff --git a/chapters/18-get-star.md b/chapters/18-get-star.md index e00d352..d86de82 100644 --- a/chapters/18-get-star.md +++ b/chapters/18-get-star.md @@ -53,7 +53,7 @@ GitHub 是一个非常有意思的地方,也常常变得非常有争议。有 1. 用户看的都是 GitHub Pages 上的内容 2. 从数量上来看,受众并不多 -而我最近在玩的 New Project Checklist ([https://github.com/phodal/new-project-checklist](https://github.com/phodal/new-project-checklist) 的转化率看上去,还算可以: +而我最近在玩的 New Project Checklist([https://github.com/phodal/new-project-checklist](https://github.com/phodal/new-project-checklist) 的转化率看上去,还算可以: ![GitHub New Project Checklist](./img/github-new-project-checklist.png)