全栈应用开发:精益实践(txt+pdf+epub+mobi电子书下载)

作者:黄峰达

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

全栈应用开发:精益实践

全栈应用开发:精益实践试读:

前言

学习Web开发最难的不是学习相关技术,而是需要了解整个Web开发的知识体系。多数时候并不是因为我们不学习,而是因为我们不知道学习什么。完整的知识体系不仅仅包括前端、后台开发,还应该包括持续集成、自动化部署等内容。这些往往需要几本不同的书才能学习到,另外,它们也难以保证知识体系的完整性。我们在学习的时候,也往往并没有注意到它们之间的联系。

本书可以为读者构建出清晰、完整的Web开发体系,包括:前端、后台的技术选型,搭建构建系统,如何上线部署,并进行数据分析,以及如何在其中结合最好的工程实践等。

希望作为读者的你,可以将本书当作一本索引书籍,以此来开启你的Web开发新世界;你可以按书中的实践来进行Web编程,并结合理论来实践。为什么写这本书

本书是我在实习的时候特别想写的一些内容——关于如何系统地学习Web开发,只是我一直缺少一条主线来将这些内容一一串起来。

2016年年初,我在GitHub上开源了一个名为Growth的应用(读者可以在App Store和各大应用商店下载该软件)。在该应用中便包含了本书的主要思想:Web应用的生命周期

。在不断迭代的过程中,该应用越来越受开发者喜爱,至今已经有超过10000名用户用过这个应用。随后,笔者在GitHub上推出了开源电子书《Growth:全栈增长工程师指南》,已经有超过4500个Star。由于电子书本身只是一个指南,越来越多的读者还希望有一本实战。也因此诞生了《Growth:全栈增长工程师实战》,其在GitHub上也有超过1000个Star。

后来,我才下决心去出版这样一本书。写一本书不是一件容易的事,相比较而言,读一本书则要简单许多。前者要花费一个人几个月的时间来完成,而后者只需要几星期、几天,或者是几小时的事。花几分钟将书的目录过一遍,随后只看几页想看的内容,余下的内容则可以在以后闲暇的日子里探索。

本书是我在编程生涯初期的一些体会,它更像是一本关于Web开发的索引书籍,但其实这些索引正是我读了大量书籍后,自己对精髓之处进行的理解加工。在这本书里,你会看到我对很多知识点进行了概括,并以实践的方式将一个个知识点连接到一起。

在最开始的时候,我曾经想将书名命名为“实习记”。后来又觉得虽然这是在我实习期间学到的知识,但其实很多内容在其他公司是学不到的。因此,在电子书里将其命名为Growth,它不仅可以使读者增长知识,也在让我自己成长。本书目标

本书的目标是帮助读者构建Web应用的全栈开发所需要的完整知识体系,并以精益创业的思想来一步步开发Web应用。● 从创建一个UI原型到编写出静态的前端页面。● 从静态的前端页面到后台的应用,并部署应用。● 从Web后台开发API到开发移动Web应用。

在这个过程中,我们还将介绍一些相辅相成的步骤:● 使用构建系统来加速Web应用的开发。● 为应用数据分析工具改进产品。● 使用分析工具改善应用的性能。● 通过自动化部署加快上线流程。

从而帮助读者开发出一个真正可用的全栈Web应用。同时,我们也希望能帮助读者将这些步骤应用到现有的系统上,改进现有系统的开发流程。本书结构

本书从结构上分成了3部分,每部分都会有不同的侧重点。

第1部分:准备阶段

在这一部分里,我们将主要集中于编码前的一系列开发准备工作,从选择一个合适的IDE到创建一个Web应用的构建流。

第1章 基础知识

 介绍了搭建开发所需要的基本环境,以及IDE、操作系统、版本管理工具等日常工具的选择与使用;还介绍了如何对一个目标进行切分,以便我们在实现的时候可以一步步往下实践。

第2章 最小可行化应用

 介绍了如何使用UI工具来创建原型,并根据这个原型创建出一个最简单的Web应用;接着介绍了在Web应用开发的过程中,如何使用精益的思想来开发出用户喜爱的产品。

第3章 技术选型与业务

 对后台开发所需要的技术进行简单概览,并介绍了不同后台组件的框架,以及如何从这些框架中选择出合适的框架。同时还介绍了Python下的Web开发框架Django,以及如何用这个框架创建一个“hello,world!”程序。

第4章 构建系统及其工作流

 介绍Web应用中常见的构建流程及组件,以及如何结合Fabric打造后台的构建系统。

第2部分:编码到上线

在这一部分里,我们主要讲述大部分Web应用的开发过程,并介绍在开发过程中一些好的实践。

第5章 编码

 介绍了如何使用Django创建一个简单的博客应用,以及如何使用单元测试、UI测试来测试代码的功能。

第6章 上线

 介绍了如何手动部署开发的Web应用到产品环境,以及如何使用自动部署工具来完成自动化部署。

第7章 数据分析和体验优化

 介绍了如何使用网页监测工具来分析网页的流量来源、用户行为等,并结合一些前端、后台的优化工具对应用进行优化。

第8章 持续集成与持续交付

 介绍了如何使用持续集成工具,以及如何使用持续集成工具来改进开发流程,并实现自动化的部署。

第9章 移动Web与混合应用

 介绍如何结写后台API来创建移动应用,以及如何为单页面应用提供SEO支持。

第3部分:增量性优化

第10章 遗留代码与重构

 介绍什么是遗留系统,以及如何基于第2部分中的经验来改进遗留系统。

第11章 增长与新架构

 介绍如何使用回顾与反馈来使程序员成长,以及如何依据需要设计出新的架构。技术栈概述

本书所介绍的工具主要集中于前端、后台、构建工具和前端UI框架四部分,分别如下。● Django是Python语言的一个MVC架构Web开发框架。本书使用这

个框架来介绍如何编写单元测试、功能测试,并演示如何使用它

进行持续集成和持续部署。● Bootstrap是一个在前端领域相当流行的响应式Web UI开发框

架,本书出于开发便捷的缘故使用这个框架。● Fabric是一个命令行的自动化部署工具,本书使用这个框架来展

示如何搭建构建系统,并使用它来进行自动化部署。● Angular 2是一个可以用于构建移动应用和桌面Web应用的开发平

台,我们在书里用它来展示如何开发前后端分离的Web应用程

序。

上面的几个框架可以构成跨手机、桌面的一个Web应用,以及如何对其进行自动化部署。另外,还将介绍一些工具和框架来帮助我们开发:● Ionic 2是一个跨平台(Android、iOS、Windows Phone)的混合

应用开发框架,基于Angular 2框架,并搭建有大量的UI组件,以

及原生组件,我们在书里说明如何通过它与Angular 2共用代码

来开发手机端应用。● Jenkins是一个持续集成工具,它提供了持续集成与持续部署工

具链中所需要的大部分工具。我们将用它来展示如何进行持续集

成,并结合Fabric来实现自动化部署。

本书将展示如何结合这些工具来做一些最佳实践,读者不必担心它会影响你的阅读,并且这些工具的替代品也很容易找到。代码

本书相关的代码都可以从GitHub上下载到:https://github.com/phodal/growth-code。

混合应用部分的代码可以从https://github.com/phodal/growth-paper-hybrid处下载。

这些代码遵循MIT协议开源,读者可以将这些代码用于学习、商业等用途的项目中,不需要笔者授权。同时,笔者也不对这些代码的衍生代码负责。遇到问题

在遇到问题时,欢迎及时与笔者联系。遇到代码问题时,建议直接在GitHub上创建一个相关Issue,以便我们帮助其他读者解决同样的问题。

遇到内容不清楚等问题时,可以通过下面的方式联系笔者:

1.通过GitHub上的Growth项目参与讨论:https://github.com/phodal/growth-code

2.在Growth论坛上讨论:https://forum.growth.ren/

3.在微博上与我联系:@phodal

4.通过邮件:h@phodal.com

5.加入QQ群讨论:529600394

你也可以在知乎、SegmentFault

网站上进行提问,并@phodal来帮助你解决这个问题。致谢

我要把这本书献给花仲马,没有她,就没有这本书。感谢她在这本书的写作过程中一直陪伴着我,并为这本书进行了中文校对来保证语句的通顺。

同时,我想特别感谢Thought

Works的同事薛倩、阿里巴巴的孙辉在本书创作过程中提供了详细的反馈,正是他们的帮助让本书更加准确、容易阅读。我还想特别感谢在ThoughtWorks学习时的同事,为我提供悉心指导与帮助。特别感谢王超、陈卿、王妮、曹隆凯、张静强、刘杰、王磊,在和他们进行结对编程时,我学习到了敏捷软件开发、Tasking等编程之外的技能,感谢他们帮我走了这么远。

此外,还有那些在GitHub上为我提供反馈的用户,正是他们的反馈促使这本书更加完整。由于人数众多,这里仅列出这些用户的ID:

感谢ethan-funny、izhangzhihao、kaiguo、gymgle、aidewoode、wenzhixin、sasuke6、wangyufeng0615、walterlv、lolosssss、NehzUx、mikulely、yulongjun、PhilipTang、ReadmeCritic、ReadmeCritic、wangcongyi、loveisbug等用户为《Growth:全栈增长工程师指南》提供反馈与修改。

感谢Pandoraemon、wo0d、ReadmeCritic、zhangmx、felixglow等用户为《Growth:全栈增长工程师实战》提供了反馈与修改。

轻松注册成为博文视点社区用户(www.broadview.com.cn),扫码直达本书页面。● 提交勘误:您对书中内容的修改意见可在提交勘误处提交,若被

采纳,将获赠博文视点社区积分(在您购买电子书时,积分可用

来抵扣相应金额)。● 交流互动:在页面下方读者评论处留下您的疑问或观点,与我们

和其他读者一同学习交流。

页面入口:http://www.broadview.com.cn/31369第0章绪论:Web应用开发周期

这部分内容最早出自笔者写的文章《RePractise:Web开发的七天里》,原文简单描述了Web应用的生命周期。后来发现,这条路几乎是所有Web应用的必经之路。一个Web应用在其生命周期里,都要经历搭建开发环境、创建构建系统、编写代码、进行数据分析等,直至最后使用新的系统来替换这个遗留系统。

作为本书的开头,笔者难免想说些废话,初学者可以跳过这一部分。等到阅读完本书再看看这部分内容,或者等完全经历了一个项目的开发过程,再回过头来看这部分的内容就会有所体会。如果你是一个有经验的开发者,相信你对这个生命周期一定也深有体会。0.1 Web应用的生命周期

在我所经历的项目以及我所看到的Web应用里,它们都有相同的很有意思的生命周期。我们经常在网上看到某个知名的网站使用某个新的技术、语言来替换旧的系统,某个App使用新的框架来替换现有的App。我们所看到的都只是这些公司正在重构现有的系统,这实际上是一个周期的结束,以及一个新周期开始。其过程如图0-1所示。图0-1 Web应用的生命周期

仔细一想就会发现:我们所经历的项目都在以不同的时间长度经历相同的生命周期。0.2 遗留系统与新架构

在我开始工作的时候,接触的第一个项目就是一个遗留系统。在一次休息时,我们在比赛找最古老的源码文件,最后找到了10年前写下的一个文件。尽管在我们的代码里有单元测试、针对具体业务功能的测试,项目的代码已经超过20万行,项目中仍然有相当多的代码超出了我们所理解的业务范围。毕竟在这些年头里,有相当多的功能已经不存在了。后来,我们选用微服务重构了这个系统。对于中型的遗留系统来说,这算是一剂良药。

让我们先从某某网站使用新架构重新设计说起。当我们决定使用新架构重新设计系统时,原因可能是多种多样的,如果我们排除一些无法抗拒的因素(如政治),那么剩下的原因可能就只有两个。● 系统已经变得难以维护。这里的原因仍然有很多:大量的代码已

经没有人知道其业务逻辑,变得难以修改;代码间耦合度过高,

重构系统的难度过于复杂;项目所使用的技术栈已经过时,已经

被市场所淘汰;团队的技术栈在成员变动的过程中,团队中大部

分成员的技术栈已经和当前的项目不匹配了。● 系统的技术栈已经难以符合业务的需求。绝大多数情况下,我们

在最初开始创建项目的时候,所选择的技术栈都是符合当时业务

需求的技术栈、可以快速验证其业务价值的技术栈。而随着业务

的扩张,现有的技术栈很快将难以满足当前业务的需求,或出现

性能优化上的限制。

在多数情况下,我们都会将这种系统称为遗留系统。在这时团队里的气氛便是“能不动这些代码就尽量不去动它”。我们已经很难将项目的问题归为人的因素,多数时候都是受业务扩张的影响。作为一个专业的程序员,我们的本能就是将程序写好,而我们往往没有这样的机会。

业务人员对项目经理说:“我们的竞争对手已经在本周上线了这个功能。”

项目经理对开发人员说:“这个功能下星期就要上线!”

是的,我们的功能不得不马上上线。这时候,我们往往要在代码质量和交付速度上做出一些妥协。妥协多了,系统也就变烂了。

开发人员说:“这个代码我不太敢修改,要是出了什么大Bug怎么办?”慢慢地人们就开始讨论起重构系统的事宜,并开始着手设计新的架构——使之可以满足当前的业务需求、可预测时间内的业务与技术需求。0.3 技术选型与验证

在讨论新架构的过程中,不同的人可能会有不同的技术偏好,也会因存在一些政治因素导致不同技术方案的产生。如团队中的一些人可能出于稳定缘故而选择Java,一些人可能出于对新技术的需求选择Scala,而另外一些人可能考虑到团队中大部分人可能因为都会使用JavaScript而选择使用JavaScript。如图0-2所示,我们的考虑应该不仅仅取决于这一系列的技术因素。图0-2 技术选型考虑因素

需要注意的是:在做技术选型的时候,要尽最大可能以团队为核心。在做决定之前,我们要提出不同语言、框架下的技术模型,并且进行验证。随后就需要快速搭建出一个原型,并针对这个原型进行假想式开发,然后验证原型本身是经得起考验的。

在这一阶段,我通常喜欢在GitHub上搜索一些名字中带有boilerplate的项目,即模块文件。而当一个框架很流行的时候,我就会去相应的awesome-xx寻找,如awesome-react就可以寻找到react相关的项目集。然后,克隆这样一个项目,开始依照现有的系统创建简单的Demo。随后,就可以依据我们的业务试着在这上面进行扩展。最后,再决定是否使用这门技术和这个框架。

通常来说,在选择一门新技术设计系统时,需要承担的风险相当大,而如果能成功,那么它可能会带来巨大的收益。从这点看,使用最新的技术与赌博无异。在一些成熟的公司里,会有专门的技术委员会负责对新技术进行审核,来决定是否可以在某个项目里使用新技术。除了考虑其为开发带来的便利性,他们更多地还会考虑其成熟度、安全和技术风险等。0.4 搭建构建系统

决定好架构并选择完技术栈后,我们就开始着手创建项目的构建系统,设计项目的部署流程。构建系统不仅包含项目相关的构建流程,还从某种意义上反映了这个项目的工作流程。

创建完“hello,world”程序后,我们要着手做的事情就是创建一个持续集成环境。这样的环境包含一系列的工具、步骤及实践,从工具上说,我们需要选择版本管理工具、代码托管环境、持续集成工具、打包工具、自动部署脚本等一系列流程,这些流程将会在第4章详细讨论。

图0-3便是笔者之前经历过的一个项目的构建流程。图0-3 构建过程

这是一个后台语言用Java、前台语言用JavaScript的项目的构建流程。0.5 迭代

在互联网行业里,能越快速地对市场需求做出反应,就越能有更好的发展。只要你细心观察就可以发现,大部分互联网公司都在以一定的规律更新产品,或者一周,或者两周,又或者一个月等,这种不断根据反馈来改进产品的过程称为迭代

。如图0-4所示是一个简化的迭代模型。图0-4 简化的迭代模型

当一个迭代开始时,我们需要收集上一个迭代的反馈或者新的需求,然后开始开发代码,最后再发布产品。开发的产品在这个过程中不断地增强功能。为此,还需要选择一个好的迭代周期。一个好的迭代周期既应该有充足的时间修复上一个迭代的Bug,又能在下一个迭代开始之前交付重要的功能。当然,如果交付的软件包里出现了重要的Bug,那么我们也能在第一时间使用旧版本的包,并在下一个迭代交付。在这样的开发节奏里,一周显得太短,一个月又显得太长,两周会是一个很不错的时间。

当一个团队在这方面做得不好时,那么他们可能在一次上线后,发现重要的Bug,不得不在当晚或者第二天更新他们的产品。即使是有经验的团队,在开发初期也会经常遇到这些问题,而这些问题可以依赖于在迭代中改进。好的迭代实践都是依据团队自身的需求而发展的,这意味着有时候适合团队A的实践并不一定适合团队B。

随后,我们会在这个“hello,world”的基础上不断添加各种功能。0.6 Web应用开发步骤

令人难以置信的是,我们做了这么多事情以后还没有开始写代码。事实上,在这一步里,我们已经搭建好了一个最小可运行的Web应用。在这之后,我们所要做的事情就是提交代码即可。将代码从本地提交到服务器后,持续集成服务器将帮我们运行测试,在测试通过后,打包、发布现有的代码,最后部署到测试环境里。(1)编码

如果不考虑技术难度的因素,写代码看上去就是一件很简单的事。我们只需要按照需求,将功能一点点往上叠加即可。如果不考虑这个过程中添加的代码质量,将会得到一个难以维护的系统,并且在拿到需求后的第一反应也并非直接开始实现功能,而是首先应该考虑可以将这个需求拆分为几步,我们将这个过程称为Tasking。

假如,我们正在实现某个详情页的显示功能,它依赖于前端和后台。那么可以直接先做后台API,再实现前台API,最后依据需要微微调整API。我们也可以先用Mock的数据实现前端页面,再依据定义出来的数据格式实现后台API。在这两种不同的实现中,我们都有一个明确的先后步骤。同样,对于一个更加复杂的功能来说,需要切分得更加仔细,每一次只挑选其中一个任务,实现后,再一步步往下执行,最后实现这个功能。

有意思的是,当我们已经决定切分为多步来实现功能的时候,就可以在每一步里进行几次不同的代码提交,以便以后知道每一步中做了什么内容。如果只是在最后一步直接提交代码,那么在未来修改代码时,便难以理清当时的思路。

一个合理的编码过程不仅包括功能的实现,还应该有测试。尽管出于项目进度的原因,多数项目都不存在测试,而正是因为没有测试,使得整个项目更加混乱。新的功能容易影响旧有的代码,除非有足够多的测试人员,否则我们无法保证所有的功能都是正常的。在有限的条件下,我们应该编写重要的测试,以保证核心功能不被破坏。在条件允许的情况下,我们应该尽可能地保证测试对重要功能的覆盖。由于代码库不只有一个人在提交,如果在某次提交中测试被破坏了,就可以知道谁破坏了测试,他/她应该有责任来修复这个测试。

在完成功能后,我们还可以对代码进行重构,以此来保证代码的质量。此外,在日常工作中,我们会用Code Diff(代码检视)来帮助大家提高代码质量。因此,并不是实现了功能就完事了,我们应该尽量保证代码的质量。(2)上线和数据分析

好了,现在是时候上线了。在以前,上线就是登录到服务器做数据备份。随后,在本地构建、上传软件包,安装软件的依赖。最后,重启服务器、Done。

在今天看来,这是一件相当费力的事,我们可以使用自动部署工具来加快这个流程,甚至当我们有足够的测试覆盖率时,可以直接将测试通过的代码直接部署到产品环境。不过,要这样做应有相当的技术能力,并且要保证我们可以协调好开发人员、运维人员等。从技术上说,这可能是一件容易的事,但是从组织结构上说,这并不是一件轻松的事。

而故事并没有因此而止步于上线,在产品上线时,我们可以通过数据分析工具来监测用户的行为、网站的访问量等信息。

对开发人员来说,这样的分析平台可以帮助我们解决用户在使用过程中遇到的Bug——他在哪一步出的问题?他在出问题前做了什么操作?

对业务人员来说,他们可以借此来分析产品受欢迎的程度、用户及流量来源、转化率等信息,并依此来对着陆页、转化率等进行优化。几种常见的流量来源包括搜索引擎、外部链接、付费搜索等,这些都可以依此来做出一些调整。从技术角度说,我们可以提高网站的SEO(搜索引擎优化)水平来添加流量,这将在第7章中进行讨论。0.7 小结

本章我们对本书的内容进行了一个简单概述,并完整地介绍了它们之间的联系。同时还介绍了在阅读过程中,我们将学习到的内容,以及将遇到的一些挑战。第1部分准备阶段

在这一部分里,我们将主要精力集中于“项目开始前”的一些准备工作,如搭建基础的构建系统、从业务角度对技术进行选型等。同时,我们还将关注一些特别有意思的东西,如Web应用的生命周期、对不同业务的技术栈考虑等。/第1章/基础知识

在本章中,我们将带领读者搭建好基本的开发环境——在不同的操作系统中,如Windows、Mac OS、Linux,以及如何选择IDE和Editor的一些偏好及设置,并引入版本管理系统及Git等基础软件工程的知识。

xxx:Hi Phodal,欢迎加入Growth Studio项目组。我是xxx,今天由我来带你进入第一篇。我们在进入一个项目之后,需要做什么?

Phodal:先运行代码。

xxx:你再想想,在我们运行某个语言的代码之前需要什么?

Phodal:安装语言环境,还是安装IDE?

xxx:等等,让我们先按顺序来,为了克隆代码,需要使用版本管理工具;为了修改代码,需要一个编辑器;为了运行代码,需要安装语言本身的环境。那么,你觉得我们先从哪一步开始呢?

Phodal:都可以。

现在,让我们先了解并搭建开发环境吧。1.1 搭建开发环境

搭建好顺手的开发环境并不是立马就能做到的事,不同的开发者有不同的偏好、技术信仰等。这些因素会导致每个人构建完的开发环境有所差距。尽管如此,总的来说,这些工具都会有一些相似的特征。同时,它们还需要有一些基本要素。1.1.1 基本要素

一般来说,在一个新的计算机上搭建开发环境时,总会先安装好下面几个工具。● 包管理工具。包管理工具允许用户用命令行或者UI界面的方式直

接安装软件。例如,当我们想在Ubuntu上安装Vim编辑器时,可

以直接在命令行输入如sudo apt install vim,即可以安装Vim编辑

器,并且这样的工具存在于不同的操作系统(Windows、MacOS、

类UNIX系统)上。对MacOS和Windows来说需要独立安装额外

的软件。● 命令行环境。如果你已经使用了命令行来代替日常的操作,则可

能还需要一个好的命令行运行工具。如果你使用的是Windows,

则需要有其他的命令行辅助工具来加速你的开发。● 编辑语言环境。多数情况下,我们的日用操作系统上都没有相应

的语言运行环境,需要安装对应语言的安装包,及其对应的包管

理环境等。● IDE或者编辑器。在编写代码时,需要一个IDE或者编辑器来编

辑代码。● 一个或多个现代的浏览器。在开发前端用户界面时,只会用某个

特定的浏览器来开发,这时容易因为我们使用了一些特定内核(如Webkit)的浏览器,而导致界面在其他浏览器运行时出现布

局问题。因此,至少需要一个额外的浏览器来保证运行效果,

Google Chrome和Firefox在这方面都是一个不错的选择,它们有

相当丰富的扩展插件可以使用。建议读者不要使用IE 10以下的

浏览器来充当开发用的浏览器——除非需要兼容IE 10以下的浏

览器。● 数据库软件。同样,为了使用数据库,需要使用数据库软件。在

开发时,SQLite和MySQL都是不错的选择。

在这些工具中,有很多是可以直接通过包管理工具来安装的。因此,先让我们了解一下包管理的概念及其作用。1.1.2 常用效率工具及其在不同操作系统下的安装

在日常使用计算机时,可以安装下面的工具来提高效率。● 包管理工具。● 命令行环境。● 快速启动工具。

下面让我们来逐一了解一下这些工具。1.包管理工具

包管理不仅存在于操作系统中,还存在于不同语言的环境里。如前面所说在操作系统中安装软件,最方便的东西莫过于包管理了。引自OpenSUSE官网的说明图如图1-1所示。图1-1 包管理

在图1-1中包含几个基本的元素。● 软件包(Packages):软件包不止是一个文件,内含构成软件的

所有文件,包括程序本身、共享库、开发包以及使用说明等。● 元数据(Metadata):包含于软件包中,包含软件正常运行所需

要的一些信息。软件包安装之后,其元数据就存储于本地的软件

包数据库中,以用于软件包检索。● 软件包依赖关系(Packages dependencies):它是软件包管理的

一个重要方面。实际上,每个软件包都会涉及其他的软件包,软

件包里程序的运行需要有一个可执行的环境(要求有其他的程

序、库等),软件包依赖关系正是用来描述这种关系的。

当我们使用某个命令去安装软件时,将会运行一系列的操作才能完成安装。以在Ubuntu上安装VIM为例: phodal@ubuntu:~$ sudo apt install vim 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 将会同时安装下列软件: vim-runtime 建议安装: ctags vim-doc vim-scripts vim-gnome-py2 | vim-gtk-py2 | vim-gtk3-py2 | vim-athena-py2 | vim-nox-py2 下列【新】软件包将被安装: vim vim-runtime 升级了 0 个软件包,新安装了 2 个软件包,要卸载 0 个软件包,有 0 个软件包未被升级。 需要下载 6,247 kB 的归档。 解压缩后会消耗 30.2 MB 的额外空间。

一般来说,在初始化包管理系统后,我们在本地缓存有一份包管理服务器的软件包列表。每次安装某个软件时,将会读取这个软件包清单,查找其中是否包含这个软件包。随后,开发构建、查找出这个软件所依赖的软件包,并保证这些包是可用的。最后再安装软件包的依赖及该软件包。

同样,对语言的包管理工具来说也是如此。以Node.js为例,我们需要检查服务器上是否有对应的软件包,下载它的package.json文件后,再安装其package.json依赖的软件包,安装依赖后,再安装这个依赖包。

作为一个专业的程序员,我们经常会使用各式各样的包管理工具来加速日常使用。而不只是简单地通过Google搜索某个软件,然后下载并安装。2.命令行环境

我们已经在上面对包管理工具进行了简单介绍,与包管理工具不一样的是,命令行环境存在于不同的系统中。只是并不是所有的操作系统的命令行工具都会让你觉得顺手。多数时候,我们使用额外的工(1)具来使系统更加方便使用。如在类UNIX系统里,我们使用Zsh来替换默认的Bash作为终端软件。Zsh在兼容Bash的同时还提供了更好的自动补全、更好的文件名展开等改进。配置上Oh My Zsh,就可以做出一个兼具实用与美观的终端,如图1-2所示。图1-2 Zsh示例

在图1-2上半部分,终端使用了不同的颜色和状态来表示不同类型的文件,“growth-paper”部分用于显示文件夹,白色字体用于显示普通的文件。在图1-2下半部分中,可以看到下面的部分里显示Git的状态,即当前有修改,如图1-3所示。图1-3 Git状态

当我们执行git status时,它用黄色标识出对这些文件进行的修改。另外,它还能用不同的颜色标识出不同文件的状态。顺便提一句:对Git来说,使用如SourceTree之类的图形界面也是一个不错的选择。3.快速启动工具

除了上面的两个工具,我们还应该有一个快速启动工具。直接使用快捷键来打开这个工具,输入想要打开的程序的名字,再按下回车键,应该可以直接运行这个程序,或者打开某个文件。如图1-4所示的是笔者日常使用的快速启动工具Alfred。图1-4 Alfred截图

输入py时,它会寻找系统中对应的程序,我们只需要按下回车键即可。

现在,我们来看看在不同的操作系统上如何安装这些工具。4.在Windows上安装(1)包管理工具:Chocolatey

在Windows操作系统中,我们可以使用Chocolatey(网官地址:https://chocolatey.org/)作为包管理工具。它的安装过程也相当简单,只需要用管理员权限运行命令提示符

,并粘贴下面的代码即可: @powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install. ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

当然也可以直接运行PowerShell,然后输入: iex ((New-Object System.Net.WebClient).DownloadString ('https://chocolatey.org/install.ps1'))

建议读者访问https://chocolatey.org/install获取安装脚本来安装。

注意:你需要Windows 7以上的操作系统,或者Windows Server 2003以上的系统,并且需要有.NET Framework 4以上,以及PowerShell v2以上。

安装完成后,就可以直接运行choco install+软件名称来安装对应的软件,例如,将在下面介绍的Wox(见图1-5)。图1-5 Choco安装Wox

在这个过程中,choco将从服务器获取对应软件包的下载地址,并下载对应的软件包,执行相应的安装脚本来安装软件。

注意:因为choco是直接从相应软件指向的服务器上下载软件的,所以在一些网站上(如GitHub)下载时,可能因为网络问题而无法访问或者下载中断。(2)快速启动工具:Wox

Wox就是在前面提到的快速启动工具,除了上面提到的功能,它还可以打开百度、Google进行搜索,甚至通过一些插件的功能实现单词翻译、关闭屏幕等更多的功能。另外,它还能支持中文拼音的模糊匹配。

你可以直接从官网获取该软件,官网地址为:http://www.getwox.com/,并在安装完Python语言环境后,即可使用Wox来快速启动工具。(3)命令行工具:cmder

Windows自带的CMD缺乏一系列的功能,难以完成日常的开发工作。当我们习惯使用类UNIX上的命令行工具,或者准备往类UNIX操作操作系统上迁移时,可以考虑使用Cygwin,它可以提供一个在Windows平台上运行的类UNIX模拟环境。

如果只是为了日常使用,推荐使用Cmder来作为命令行工具。它把ConEmu(提供了一个全功能的Windows控制台模拟器)、MSysGit[专门为Windows开发的Git工具(Git For Windows),它集成了所需要的运行环境和组件,直接安装即可使用]和Clink(提供了强大的命令行工具)打包在一起,它附带了漂亮的monokai配色主题。

你可以访问Cmder的官网(http://cmder.net/)自行下载该软件。如果你的电脑上没有安装Git环境,应该下载全功能(Full)版本,而不是Mini版。5.在GNU/Linux上安装

对于GNU/Linux系统,如Ubuntu、CentOS、OpenSuSE等来说,它们都自带了包管理工具。对不同的系统来说,有不同的安装命令,如Ubuntu的apt(在低版本的Ubuntu系统中使用apt-get)、CentOS的yum,以及OpenSuSE的yast等。因此,建议读者参照自己所用的操作系统来使用。(1)命令行工具:Zsh

同样,对类UNIX用户来说,建议读者使用Zsh,并且可以搭建Oh My Zsh使用。Zsh可以直接使用包管理工具来安装。

Oh My Zsh是一个开源的、社区驱动的zsh配置管理框架。它托管在GitHub上,有超过1000个开发者为这个项目做出贡献,并且它有200多个插件,以及多达140个主题。安装方法相当简单。

我们可以通过curl命令来安装: sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

或者用wget命令安装: sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"

注意:在很多操作系统上,curl和wget都需要单独安装。(2)快速启动工具:Launchy

同样,我们也需要在GNU/Linux操作系统上安装一个快速启动工具,Launchy就是一个不错的选择。它是一个跨平台的快速启动工具,只需要按下Alt+空格键就可以打开它的主界面,然后就可以和Alfred一样输入名字调出应用程序。6.在Mac OS上安装(1)包管理工具:Homebrew

与Windows操作系统相似的是,Mac OS上也没有自带的包管理工具,因此,需要通过第三方软件来实现包管理功能。在Mac OS下有两个不错的包管理工具,一个是MacPorts,另一个是Homebrew,前者因为权限和依赖问题而饱受诟病。其安装方法也相当简单,只需要执行下面的命令(也可以直接访问http://brew.sh/来获取)即可: /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrew依赖于Xcode Command Line Tools来编译和下载软件。因此,如果没有安装该软件,在安装过程中会提示安装该软件。如果使用该工具来安装wget,其命令如下: brew install wget

Homebrew Cask是Homebrew的扩展,它可以基于Homebrew来安装带有图形界面的应用,而不是通过拖拉来安装程序。例如,无法通过Homebrew来安装Google Chrome浏览器,但可以通过Homebrew Cask来安装它。其安装方式如下: brew tap caskroom/cask

随后,可以通过下面的命令来安装Google Chrome浏览器: brew cask install google-chrome(2)命令行工具:iTerm 2

Mac OS自带的终端仅仅提供了一些基本的终端功能,而iTerm 2在这上面提供了更多的功能,如切割窗格、热键切换窗口、搜索、自动完成等功能,并且只需要配合好上面的Zsh和Oh My Zsh就可以制作出一个漂亮的控制台。1.1.3 搭建开发环境

除了上面提到的这些工具,还需要安装Python语言的运行环境,由于我们将在书中使用Django作为Web开发框架,其官方文档中不同的Django版本对Python有不同的版本要求,见表1-1所示。表1-1Django版本Python版本1.82.7、3.2(至2016年年底)、3.3、3.4、3.51.9、1.102.7、3.4、3.51.112.7、3.4、3.5、3.62.03.5+

考虑到Django 2.0后的版本只支持使用Python 3.5及以上版本,这里将使用Python 3.5来开发Web应用。

对Windows用户来说,我们需要从https://www.python.org/处下载Python 3.5,或者直接使用choco来安装。在Ubuntu 16.10版本的系统上,它自带了最新版本的Python。在Mac OS系统上,可以通过上面介绍的brew来安装。

另外,你还需要在计算机上安装一个Chrome浏览器,并安装一个Git客户端来进行版本管理。

如果不习惯使用命令行进行版本管理,可以考虑试试SoureTree。它是一个免费的Git客户端,并且提供一个扁平化的可视界面,如图1-6所示。图1-6 SourceTree截图

我们可以直观地查看分支情况、提交信息、修改内容,并且可以进行拉取、提交代码等操作。1.1.4 开发工具

如果你是一名编程新手,建议你使用IDE。随后,可以考虑自定义自己的编辑器。

在编辑器里无论是Vim还是Emacs,或者是流行的Visual Code或者Atom,都需要花费时间去配置,以使编辑器可以像IDE一样强大。但是怎样才算和IDE一样强大呢?你需要有下面的一些东西。● 语法高亮。这是最基础的功能(如果你正在使用的编辑器,如记

事本,不支持该功能,请不要再用这样的工具。),它能依据语

言中的关键词使用不同的颜色和字体区分代码。它可以增强人对

编辑器中内容的可读性,来降低误读和误写的概率。● 插件功能。选择手机操作系统与选择计算机操作系统一样,我们

会选择具有丰富软件的系统。同样,如果开发工具也有丰富的插

件,那么它们将大大提高开发效率,诸如Emmet可以使用简洁的

语法加快编码HTML和CSS。● 代码跳转。在阅读代码的时候,它可以帮助我们直接跳转到函数

声明的地方,又或者可以帮助找到引用的地方。特别是当我们修

改函数参数时,这个功能显得尤为强大。● 自动完成。当我们声明了一个名为“check_update”的文件时,

在下次输入“check_”时,编辑器或IDE就会提示“check_update”,并且在一些IDE里,当我们选中时,它将会自

动创建变量等。● 错误检查。它可以在编写代码时提示上一步中哪些内容是错误的,

如少了一个“;”号,又或者是输入的参数是有误的。● 版本控制集成。使用版本控制软件是编程人员的基本技能,好的

编辑器会集成这样的功能,我们可以直接在编辑器里比较代码的

修改,查看上次的修改时间等,又或者直接提交代码。● 依赖管理。当我们自己去写import xx语句来引用某个库的时候,

还需要花费时间去找到对应的类。当开发工具上有这样的功能时,

只需要先编写代码,再调用快捷键导入依赖即可。● 调试。对前端开发人员来说,浏览器就是最好的调试工具。对后

台人员来说,只有“print”是不够的,还需要深入每一步函数调

用,才会发现问题出在哪里。● 高级功能。如重构等。笔者一直很喜欢Jetbrains系列的IDE,是

因为它对重构有很好的支持。

无论是Emacs和Vim这样的编辑器,还是WebStorm这样的IDE,我们都需要花时间去掌握它们的快捷键。

提示:当我们需要某个语言、框架的常用功能、函数等,又或者是编辑器的快捷键时,可以直接搜索其对应的cheatsheet(即小抄),通常会在一页PDF或者图片里显示其全部功能。如我们可以搜索“vim cheatsheet”,并将其打印出来,或者可以直接购买相应的cheatsheet水杯。

下面看看网上常用的一些IDE或者编辑器。1.开发工具推荐

在工作中,笔者习惯使用IDE。在项目工作中,我需要在不同的语言间切换,而JetBrains的那些IDE可以提供一个一致的开发环境,并且公司会为这些效率工具买单。当我们在不同的语言间切换的时候,IDE显得特别有战斗力,我们不需要花费大量的时间去搭建自己的开发环境,这些工具都可以开启即用。而选择编辑器则需要花费大量的时间去选择合适的插件,当有多种语言时,这种成本开始变得不可接受。

在本书中,我们将使用PyCharm社区版作为开发工具,它是免费版本的。如果你寻求更强大的功能,则可以考虑使用专业版。

除了PyCharm,我们也有一些不错的编辑器可以使用。● Sublime Text:是一款相当流行的收费图形编辑器。由于其本身

使用了Python语言作为开发语言,其对Python语言的支持相当好。

它带有代码缩略图、完整的Python API、Goto功能等。它还带有

一个非常丰富的插件系统,前提是要手动安装社区驱动的包管理

器:Package Control。它可以同时支持Windows、Linux、Mac

OS X等操作系统。● Atom和Visual Code:两者都是开源且免费的编辑器,都有相当

丰富的插件。如果你的电脑配置不错,可以考虑使用Atom或者

Visual Code作为编辑器,由于其基于Electron(基于Chromium浏

览器),因此,需要消耗更多的内存。值得一提的是,Atom提供

了更丰富的插件系统,而Visual Code可以提供更流畅的体验。● Vim:其和Emacs是在Linux和UNIX系统中最常用的两种文本编

辑器。它是从vi发展出来的一个文本编辑器,它遵循“简单工具,

多样组合”的理念,并且相当小巧。同时,VI作为单一UNIX规

范(Single UNIX Specification)的一部分,使得它存在于各种

UNIX系统中。与上面的图形编辑器相比,使用Vim意味着需要多

用键盘,少用鼠标。● Emacs:提供了更强大的扩展功能,它可以称为集成开发环境。

与Vim相当,Emacs需要更多的练习才能上手。

注意:如果你是编程新手,不建议使用Vim和Emacs作为编辑器,因为需要花费大量的时间学习使用编辑器。2.IDE和编辑器

在诸如嵌入式这样特定的领域里,由于芯片、开发板等局限,我们只能使用特定的编辑器,或者开发工具。而在Web开发领域,可以选择的范围太广了,正是因为有太多的工具可以选择,很容易让我们花费大量的时间在切换工具上。因此,在尝试完编辑器之后,就需要好好练习选定的编辑器。毕竟:“好的装备确实能带来一些帮助,但事实是,你的演奏水平是由你自己的手指决定的。”——REWORK(1)工具是为了效率

寻找工具的目的和寻找捷径是一样的,我们需要更快更有效地完成工作。换句话说,我们可以节省更多的时间去做更多的事情,而这个工具的用途要看具体的事务,如果我们去写一部小说、博客的时候,Word或者Web Editor会比Tex Studio来得快。用TEX来排版代码、公式会比用Word排版的时候来得更快,所以这个工具的好坏是相对的。有时候用一个顺手的工具会好很多,但是不一定会是事半功倍的。我们在使用自带的图形工具就可以完成裁剪、旋转时,就没必要运行GIMP或者Photoshop完成这个简单的任务。

我们应该专注于内容,在合适的时候使用合适的工具。尽管我更喜欢用Emacs作为控制编辑器,但是在服务器上修改某些配置时,我会使用Vim来修改内容。而如果是在日常使用过程中,作为日常的暂存区,即暂时放置数据,或者格式化JSON文件等适合GUI操作时,我会使用Sublime作为工具。(2)了解、熟悉你的工具

Windows、Word等软件的功能很强大,只是大部分人只用了其中很少一部分功能。那么,如果我们只用Word来写写东西,是不可以使用更简单的、开源的Abiword来替换它。明显不太可能,因为强大的工具对我们来说有更大的吸引力。

如果你有能力购买你手上的工具,那么就尽可能去了解它能干什么。即使它是一些无关仅要的功能,比如Emacs的煮咖啡。如Linux下面的命令有一大堆,只是我们常用的只有一小部分——20%的命令能够完成80%的工作。如同CISC和RISC一样,常用的指令会让我们忘记那些不常用的指令。而那些是最实用的,如同日常工作中使用的Linux一样,记忆过多的不实用的东西,不如把它们记在笔记本上实在。

我们只需要了解有哪些功能,如何去使用它,并练习和牢记那些实用的功能。

如我在写本书时,主要是用Markdown编辑器在编写内容,最后排版时使用Word。尽管我持有一个PhotoShop的License,但本书中的许多插图都是由Word中的SmartArt做出来的,它在创作很多图形时非常便捷,并且容易使用。

经验分享:当我第一次看到有人非常熟练地使用Intellij IDEA快捷键时,我却花了相当长的时间在练习使用快捷键,如切换、重构等。同样,对于诸如Vim和Emacs这一类超受欢迎的编辑器来说,我们也需要大量的练习,并且最好有一本相应的书,如在我的书架上有《Vim实用技巧》和《学习GNU Emacs》。我也花费了大量的时间在选择编辑器上,选择适合的工具总是有益的。

这里假设读者已经选定了一个开发工具(遗憾的是,这并不是一件容易的事)。现在,我们要着手于提高我们的演奏水平了。1.2 版本控制

版本控制是记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的一种系统。通常使用版本控制系统来管理代码文件,但实际上,我们会发现除了代码,诸如文档、服务器配置等也应该进入版本控制系统的管理范围。通过版本控制系统,我们可以做以下事情。● 将某个文件回溯到之前的状态。● 将项目回退到过去某个时间点。● 在修改Bug时,可以查看修改历史,查出修改原因。● 只要版本控制系统还在,就可以任意修改项目中的文件,并且轻

松恢复。

常用的版本控制系统有Git、SVN,但是从近年来看Git更受市场欢迎。Git可以支持分布式、离线使用、本地分支,以及诸如智能的合并能力等特性。

因此,下面以Git为例对版本管理系统进行介绍。1.2.1  Git初入

如果是第一次使用Git,则需要设置用户名和邮箱: $ git config --global user.name "用户名" $ git config --global user.email "电子邮箱"

你可以在GitHub上新建免费的公开仓库,并按照GitHub的文档配置SSH Key,然后将代码仓库克隆到本地,其实就是将代码复制到你的机器里,并交由Git来管理: $ git clone git@github.com:username/repository.git

或使用HTTPS地址进行克隆: $ git clone https://username:password@github.com/username/repository.git

你可以修改复制到本地的代码了(symfony-docs-chs项目里都是rst格式的文档)。当你觉得完成了一定的工作量,想做一个阶段性的提交,并向这个本地的代码仓库添加当前目录的所有改动: $ git add .

或者只是按需要来添加修改的内容: $ git add -p

可以输入: $ git status

来看现在的状态,图1-7是添加之前的,图1-8是添加之后的情况。图1-7 添加前图1-8 添加后

可以看到状态的变化是从黄色到绿色,即从unstage到add。在完成添加之后,我们就可以写入相应的提交信息,如这次修改添加了什么内容、这次修改修复了什么问题等。在我们的工作流程里,使用Jira这样的工具来管理项目时,也会在Commit Message里写上作者的名字,如下: $ git commit -m "[GROWTH-001] Phodal: add first commit & example"

这里的GROWTH-001就相当于任务号,Phodal则对应于用户名,后面的提交信息也会写明这个任务的作用。

由于有测试存在,在完成提交之后,就需要运行相应的测试来保证没有破坏原来的功能。因此,可以PUSH代码到服务器端: $ git push

这样其他人就可以看到我们修改的代码。1.2.2  Git工作流

虽然基于Git的工作流可能并不是一个非常好的实践,但是这里以这个工作流为参考来进行我们的项目。图1-9是由Vincent Driessen定义的一个分支策略。图1-9 Git分支策略

对使用Git的新手来说,Git flow工作流可能有些复杂。下面简单介绍一下。● 我们平常会工作在开发(即图1-9中的“develop”)分支上(通

常会直接工作在master上,从使用上并没有多大的不同),不同

的开发人员可以直接向这个分支提交代码。又或者是当我们在做

一些重要的功能时,可能就会从分支上拉出一个新的feature

branchs(即,功能分支),等完成后再合并到开发分支上。● 每个迭代会发布一个新的版本,即使用release branchs来创建新

的标签,这个新的版本将会直接上线到产品环境。那么上线到产

品环境的这个版本就需要打一个版本号——这样不仅方便跟踪

我们的系统,而且当出错的时候也可以直接回滚到上一个版本。● 如果在上线的时候有些Bug不得不修复,并且由于上线的新功能

很重要,就需要一些Hotfix。

从整个过程来看,版本控制起了一个非常大的作用。在开源社区GitHub上使用Git时,人们会采用Pull Request来向一些开源软件提交代码。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书

若在网站上没有找合适的书籍,可联系网站客服获取,各类电子版图书资料皆有。

客服微信:xzh432

登入/注册
卧槽~你还有脸回来
没有账号? 忘记密码?