
异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
Flink项目是大数据计算领域冉冉升起的一颗新星。大数据计算引擎的发展经历了几个过程,从第1代的MapReduce,到第2代基于有向无环图的Tez,第3代基于内存计算的Spark,再到第4代的Flink。因为Flink可以基于Hadoop进行开发和使用,所以Flink并不会取代Hadoop,而是和Hadoop紧密结合。Flink主要包括DataStream API、DataSet API、Table API、SQL、Graph API和FlinkML等。现在Flink也有自己的生态圈,涉及离线数据处理、实时数据处理、SQL操作、图计算和机器学习库等。 Flink入门与实战 Flink入门与实战 很多人是在2015年才听到Flink这个词的,其实早在2008年,Flink的前身就已经是柏林理工大学的一个研究性项目,在2014年这个项目被Apache孵化器所接受后,Flink迅速成为ASF(Apache Software Foundation)的顶级项目之一。截至目前,Flink的版本经过了多次更新,本书基于1.6版本写作。 Flink是一个开源的流处理框架,它具有以下特点。 分布式:Flink程序可以运行在多台机器上。 高性能:处理性能比较高。 高可用:由于Flink程序本身是稳定的,因此它支持高可用性(High Availability,HA)。 准确:Flink可以保证数据处理的准确性。 Flink主要由Java代码实现,它同时支持实时流处理和批处理。对于Flink而言,作为一个流处理框架,批数据只是流数据的一个极限特例而已。此外,Flink还支持迭代计算、内存管理和程序优化,这是它的原生特性。 由图1.1可知,Flink的功能特性如下。 流式优先:Flink可以连续处理流式数据。 容错:Flink提供有状态的计算,可以记录数据的处理状态,当数据处理失败的时候,能够无缝地从失败中恢复,并保持Exactly-once。 可伸缩:Flink中的一个集群支持上千个节点。 性能:Flink支持高吞吐、低延迟。 图1.1 Flink的功能特性 在这里解释一下,高吞吐表示单位时间内可以处理的数据量很大,低延迟表示数据产生以后可以在很短的时间内对其进行处理,也就是Flink可以支持快速地处理海量数据。 “Flink架构分析” Flink架构可以分为4层,包括Deploy层、Core层、API层和Library层,如图1.2所示。 Deploy层:该层主要涉及Flink的部署模式,Flink支持多种部署模式——本地、集群(Standalone/YARN)和云服务器(GCE/EC2)。 Core层:该层提供了支持Flink计算的全部核心实现,为API层提供基础服务。 API层:该层主要实现了面向无界Stream的流处理和面向Batch的批处理API,其中流处理对应DataStream API,批处理对应DataSet API。 Library层:该层也被称为Flink应用框架层,根据API层的划分,在API层之上构建的满足特定应用的实现计算框架,也分别对应于面向流处理和面向批处理两类。面向流处理支持CEP(复杂事件处理)、基于SQL-like的操作(基于Table的关系操作);面向批处理支持FlinkML(机器学习库)、Gelly(图处理)、Table 操作。 从图1.2可知, Flink对底层的一些操作进行了封装,为用户提供了DataStream API和DataSet API。使用这些API可以很方便地完成一些流数据处理任务和批数据处理 任务。 图1.2 Flink架构 “Flink基本组件” 读者应该对Hadoop和Storm程序有所了解,在Hadoop中实现一个MapReduce需要两个阶段——Map和Reduce,而在Storm中实现一个Topology则需要Spout和Bolt组件。因此,如果我们想实现一个Flink任务的话,也需要有类似的逻辑。Flink中提供了3个组件,包括DataSource、Transformation和DataSink。 DataSource:表示数据源组件,主要用来接收数据,目前官网提供了readTextFile、socketTextStream、fromCollection以及一些第三方的Source。 Transformation:表示算子,主要用来对数据进行处理,比如Map、FlatMap、Filter、Reduce、Aggregation等。 DataSink:表示输出组件,主要用来把计算的结果输出到其他存储介质中,比如writeAsText以及Kafka、Redis、Elasticsearch等第三方Sink组件。 因此,想要组装一个Flink Job,至少需要这3个组件。Flink Job=DataSource+Transformation+DataSink “Flink流处理(Streaming)与批处理(Batch)” 在大数据处理领域,批处理与流处理一般被认为是两种截然不同的任务,一个大数据框架一般会被设计为只能处理其中一种任务。比如,Storm只支持流处理任务,而MapReduce、Spark只支持批处理任务。Spark Streaming是Apache Spark之上支持流处理任务的子系统,这看似是一个特例,其实不然——Spark Streaming采用了一种Micro-Batch架构,即把输入的数据流切分成细粒度的Batch,并为每一个Batch数据提交一个批处理的Spark任务,所以Spark Streaming本质上还是基于Spark批处理系统对流式数据进行处理,和Storm等完全流式的数据处理方式完全不同。通过灵活的执行引擎,Flink能够同时支持批处理任务与流处理任务。在执行引擎层级,流处理系统与批处理系统最大的不同在于节点间的数据传输方式。如图1.3所示,对于一个流处理系统,其节点间数据传输的标准模型是,在处理完成一条数据后,将其序列化到缓存中,并立刻通过网络传输到下一个节点,由下一个节点继续处理。而对于一个批处理系统,其节点间数据传输的标准模型是,在处理完成一条数据后,将其序列化到缓存中,当缓存写满时,就持久化到本地硬盘上;在所有数据都被处理完成后,才开始将其通过网络传输到下一个节点。 图1.3 Flink的3种数据传输模型 这两种数据传输模式是两个极端,对应的是流处理系统对低延迟和批处理系统对高吞吐的要求。Flink的执行引擎采用了一种十分灵活的方式,同时支持了这两种数据传输模型。Flink以固定的缓存块为单位进行网络数据传输,用户可以通过设置缓存块超时值指定缓存块的传输时机。如果缓存块的超时值为0,则Flink的数据传输方式类似于前面所提到的流处理系统的标准模型,此时系统可以获得最低的处理延迟;如果缓存块的超时值为无限大,则Flink的数据传输方式类似于前面所提到的批处理系统的标准模型,此时系统可以获得最高的吞吐量。缓存块的超时值也可以设置为0到无限大之间的任意值,缓存块的超时阈值越小,Flink流处理执行引擎的数据处理延迟就越低,但吞吐量也会降低,反之亦然。通过调整缓存块的超时阈值,用户可根据需求灵活地权衡系统延迟和吞吐量。 “Flink典型应用场景分析” Flink主要应用于流式数据分析场景,目前涉及如下领域。 实时ETL:集成流计算现有的诸多数据通道和SQL灵活的加工能力,对流式数据进行实时清洗、归并和结构化处理;同时,对离线数仓进行有效的补充和优化,并为数据实时传输提供可计算通道。 实时报表:实时化采集、加工流式数据存储;实时监控和展现业务、客户各类指标,让数据化运营实时化。 监控预警:对系统和用户行为进行实时检测和分析,以便及时发现危险行为。 在线系统:实时计算各类数据指标,并利用实时结果及时调整在线系统的相关策略,在各类内容投放、无线智能推送领域有大量的应用。 Flink在如下类型的公司中有具体的应用。 优化电商网站的实时搜索结果:阿里巴巴的基础设施团队使用Flink实时更新产品细节和库存信息(Blink)。 针对数据分析团队提供实时流处理服务:通过Flink数据分析平台提供实时数据分析服务,及时发现问题。 网络/传感器检测和错误检测:Bouygues电信公司是法国著名的电信供应商,使用Flink监控其有线和无线网络,实现快速故障响应。 商业智能分析ETL:Zalando使用Flink转换数据以便于将其加载到数据仓库,简化复杂的转换操作,并确保分析终端用户可以更快地访问数据(实时ETL)。 “流式计算框架对比” Storm是比较早的流式计算框架,后来又出现了Spark Streaming和Trident,现在又出现了Flink这种优秀的实时计算框架,那么这几种计算框架到底有什么区别呢?下面我们来详细分析一下,如表1.1所示。 表1 流式计算框架对比 在这里对这几种框架进行对比。 模型:Storm和Flink是真正的一条一条处理数据;而Trident(Storm的封装框架)和Spark Streaming其实都是小批处理,一次处理一批数据(小批量)。 API:Storm和Trident都使用基础API进行开发,比如实现一个简单的sum求和操作;而Spark Streaming和Flink中都提供封装后的高阶函数,可以直接拿来使用,这样就比较方便了。 保证次数:在数据处理方面,Storm可以实现至少处理一次,但不能保证仅处理一次,这样就会导致数据重复处理问题,所以针对计数类的需求,可能会产生一些误差;Trident通过事务可以保证对数据实现仅一次的处理,Spark Streaming和Flink也是如此。 容错机制:Storm和Trident可以通过ACK机制实现数据的容错机制,而Spark Streaming和Flink可以通过CheckPoint机制实现容错机制。 状态管理:Storm中没有实现状态管理,Spark Streaming实现了基于DStream的状态管理,而Trident和Flink实现了基于操作的状态管理。 延时:表示数据处理的延时情况,因此Storm和Flink接收到一条数据就处理一条数据,其数据处理的延时性是很低的;而Trident和Spark Streaming都是小型批处理,它们数据处理的延时性相对会偏高。 吞吐量:Storm的吞吐量其实也不低,只是相对于其他几个框架而言较低;Trident属于中等;而Spark Streaming和Flink的吞吐量是比较高的。 官网中Flink和Storm的吞吐量对比如图1.4所示。 图1.4 Flink和Storm的吞吐量对比 “工作中如何选择实时计算框架” 前面我们分析了3种实时计算框架,那么公司在实际操作时到底选择哪种技术框架呢?下面我们来分析一下。 需要关注流数据是否需要进行状态管理,如果是,那么只能在Trident、Spark Streaming和Flink中选择一个。 需要考虑项目对At-least-once(至少一次)或者Exactly-once(仅一次)消息投递模式是否有特殊要求,如果必须要保证仅一次,也不能选择Storm。 对于小型独立的项目,并且需要低延迟的场景,建议使用Storm,这样比较简单。 如果你的项目已经使用了Spark,并且秒级别的实时处理可以满足需求的话,建议使用Spark Streaming 要求消息投递语义为Exactly-once;数据量较大,要求高吞吐低延迟;需要进行状态管理或窗口统计,这时建议使用Flink。 Flink入门与实战 徐葳 这是一本Flink入门级图书,力求详细而完整地描述Flink基础理论与实际操作; 采用Flink 1.6版本写作,案例丰富实用,做到学以致用; 细节与案例兼顾,深入浅出展现Flink技术精髓。 本书旨在帮助读者从零开始快速掌握Flink的基本原理与核心功能。本书首先介绍了Flink的基本原理和安装部署,并对Flink中的一些核心API进行了详细分析。然后配套对应的案例分析,分别使用Java代码和Scala代码实现案例。最后通过两个项目演示了Flink在实际工作中的一些应用场景,帮助读者快速掌握Flink开发。
十一长假归来,小编带来10本Python新书,每一本都是干货满满不可错过,同时分享你的假期阅读心得,还有机会获取哦。 1 Python 快速入门(第3版) 书名:《Python 快速入门(第3版)》 作者: [美]娜奥米·塞德(Naomi Ceder) 译者:戴旭 编辑推荐: 明确涵盖Python 3,全面介绍核心库、包和工具; 配备精深的习题; 新增5章与数据科学相关的内容。 这是一本Python快速入门书,基于Python 3.6编写,分为4个部分,第一部分讲解Python的基础知识,对Python进行概要的介绍,第二部分介绍Python编程的重点,第三部分阐释Python的高级特性,第四部分关注数据处理,最后给出了相关案例。本书框架结构清晰,内容编排合理,讲解循序渐进,并结合大量示例和题目,既适合Python初学者学习,也适合作为专业程序员的Python参考书。 2 Python编程无师自通——专业程序员的养成 书名:《Python编程无师自通——专业程序员的养成》 作者: [美] 科里•奥尔索夫(Cory Althoff) 译者:宋秉金 编辑推荐: 畅销Python编程类入门书,美国亚马逊Kindle编程类排行榜榜一; 作者结合自身成功经验给出的答案; 本书每章采用“要点介绍+示例代码+术语总结+挑战练习”的模式,细化介绍编程入门所需的各个知识点。 从Python 3 中开始学习编程,并构建第一个程序;通过学习“面向对象的程序设计”并创建一个强大的Python程序来让读者掌握技能;学习使用Git、Bash、正则表达式和数据库等工具,然后使用学习的新编程技能来构建一个网络爬虫;学习计算机科学的基本原理,包括计算机架构、数据结构、算法和网络编程;学习为项目编程:涵盖了软件开发过程、测试和最佳编码实践;了解如何完成团队合作,并获得编程工作。 3 从零开始学Python(第2版) 书名:《从零开始学Python(第2版)》 作者: [美] 约翰·保罗·穆勒(John Paul Mueller) 译者:武传海 编辑推荐: “达人迷”是畅销美国近30年的经典图书品牌,经过亿万读者的检验; 面向零基础读者,巧用类比式描述,技术知识点轻松掌握; 书中还有一系列的Python周边小知识,教你更好地掌握Python,活学活用Python。 本书包含5个部分,共计20章内容,从Python入门知识开始讲解,涉及初级的编程知识、各种数据类型的使用、数据的存储和管理等内容,同时本书还包含对Python模块和库的介绍。通过阅读本书,读者可以全面了解与Python编程有关的各个细节,实现零基础学习Python编程。 4 Python算法详解 书名:《Python算法详解》 作者: 张玲玲 编辑推荐: 6年Python开发经验,计算机硕士,杰出程序员和算法专家; 195个实例,使读者有更多的实践演练机会; 涵盖数据结构,线性表、队列和栈,树,图,查找算法,内部排序算法,经典算法问题的解决,图像问题的解决等内容。 全书共13章,基于Python分别讲解了算法是程序的灵魂,数据结构,常用的算法思想,线性表、队列和栈,树,图,查找算法,内部排序算法,经典的数据结构问题,解决数学问题,经典算法问题,解决图像问题,游戏和算法等内容。全书内容以“技术解惑”贯穿全书,引领读者全面掌握算法的核心技术 5 编程的乐趣:用Python解算法谜题 书名:《编程的乐趣:用Python解算法谜题》 作者: [美] 斯里尼•德瓦达斯(Srini Devadas) 译者:戴旭 李亚舟 许亚运 编辑推荐: 谜题是来自真实世界的应用,饶有趣味、易于描述; 算法谜题的趣味性和计算机编程的实用性之间搭建了一座桥梁; 斯里尼·德瓦达斯(Srini Devadas) 麻省理工学院(MIT)计算机科学和人工智能实验室(CSAIL)电子工程和计算机科学教授。 这是一本介绍通过解决复杂算法谜题来学习编程的书,书中的代码用Python语言编写。本书将对代码功能的理解与编程语言语法和语义的理解分离开来,从解每个谜题开始,先给出解谜题的算法,随后用Python语法和语义实现对应的算法,并适当做出解释。本书包含了21个谜题,其中很多谜题都广为流传,如多皇后、汉诺塔、验证六度分隔猜想等,每个谜题后面都配有不同难度的编程习题,帮读者加深对相关算法的理解。 6 Python程序设计与科学计算 书名:《Python程序设计与科学计算》 作者: 尹永学 黄海涛 编辑推荐: 理论实践相结合:由具有多年教学和数学建模竞赛指导经验的高校教师与具有丰富实战经验的资深算法工程师合力写作而成; 轻松入门Python:从Python安装到基本语法、函数,精选有价值的Python内容进行介绍; 科学计算+数学建模:从科学计算实战到数学建模应用实例都有所介绍,带你开启数学建模的大门。 本书内容主要分为三部分:第一部分为基础部分,介绍Python语言的编程基础);第二部分为科学计算部分,对常用科学计算模块进行介绍,并包含实战;第三部分介绍科学计算中重要的应用数学建模。内容包含Python常用的数据科学模块,从编程入门开始,介绍Numpy、Scipy、Pandas常用的科学计算模块,简述matplotlib绘图模块,最后介绍了用于数学建模的模块Sklearn。 7 Python Qt GUI与数据可视化编程 书名:《Python Qt GUI与数据可视化编程》 作者: 王维波 栗宝鹃 张晓东 编辑推荐: 本书适合具有Python编程基础; 想通过Python设计GUI应用程序或在GUI应用程序中实现数据可视化的读者阅读和参考。 本书介绍在Python中使用PyQt5编写GUI应用程序的方法,以及使用不同工具在GUI程序中实现数据可视化的方法。本书分为三大部分,分别介绍了PyQt5 GUI应用程序的框架结构等基础核心内容、PyQt5 GUI应用程序设计中常用到的各种功能的编程方法,以及使用PyQtChart、matplotlib和PyQtDataVisualization进行二维和三维数据可视化的设计方法等。 8 Python 3破冰人工智能:从入门到实战 书名:《Python 3破冰人工智能:从入门到实战》 作者: 黄海涛 编辑推荐: 数学基础:从历年数学建模竞赛入手,解读人工智能中的数学方; 编程实践:100余个代码实例,全面讲解网络爬虫、数据存储与数据分析等内容; 算法应用:实战案例辅以丰富图解,详尽分析人工智能算法特性及其应用场景。 本书主要包含两部分,第一部分为基础部分(以数学建模历年赛题形式了解相关算法,同时将讲解相关AI模块下的Python常用包),第二部分为实战部分,对常用算法进行基本原理简介,并构建实战案例,同时包含自然语言处理的案例以及TensorFlow案例。 9 Python和NLTK自然语言处理 书名:《Python和NLTK自然语言处理》 作者: [印度] 尼天•哈登尼亚(Nitin Hardeniya)雅各布•帕金斯(Jacob Perkins) 迪蒂•乔普拉(Deepti Chopra) 尼什•斯乔希(Nisheeth Joshi) 伊提•摩突罗(Iti Mathur) 译者:林赐 编辑推荐: Nitin Hardeniya是一位资深的数据科学家,精通Python、NLTK、机器学习,与多家知名公司都有长期的合作; 本书适合快速学习NLTK的资深Python程序员以及机器学习领域的研究人员; 使用Python解决各种NLP任务的方式。 本书是一本运用NLTK和其他Python库构建专业NLP和机器学习项目的学习指南。本书共分为三部分。第一部分是NLTK基本模块,重点是如何创建文本分割器和解析器。第二部分介绍一些简单的文本处理方法和语言处理的基本技术。第三部分将会带领读者去实现自己的NLP项目。 10 Python机器学习 书名:《Python机器学习》 作者: [印]阿布舍克·维贾亚瓦吉亚(Abhishek Vijayvargia) 译者:宋格格 编辑推荐: 涵盖机器学习的所有主要领域; 每个概念的python代码示例; Jupyter Notebook脚本提供了用于测试和测试算法的数据集。 这本书通过数学解释和编程例子描述了机器学习的概念。每一章的内容都是从技术的基本原理和基于真实数据集工作实例开始的。在应用算法的指导下,每种技术都有各自的优点和缺点。本书提供了python中的代码示例。Python现在已经被全世界所接受。首先,它是免费、开源的。它包含了来自开放社区的非常好的支持。它包含大量的库,所以您不需要编写任何代码。此外,它可扩展为大量数据,适用于大数据技术。 - END -
小长假一转眼就过去了,是不是感觉很短暂,没关系,十一马上又要一喽!!!假期一波接一波,开不开心。长假归来,异步社区上架了8本新书,你有没有关注到,让小编一一道来! 1 深度学习案例精粹 书名:《深度学习案例精粹》 作者:[爱尔兰] 艾哈迈德·曼肖伊(Ahmed Menshawy) 译者:洪志伟,曹檑,廖钊坡 编辑推荐: 使用TensorFlow框架,轻松理解深度学习算法 包含大量案例,快速动手实现深度学习任务 可下载配套源码+彩图文件 本书主要讲述了深度学习中的重要概念和技术,并展示了如何使用TensorFlow实现高级机器学习算法和神经网络。本书首先介绍了数据科学和机器学习中的基本概念,然后讲述如何使用TensorFlow训练深度学习模型,以及如何通过训练深度前馈神经网络对数字进行分类,如何通过深度学习架构解决计算机视觉、语言处理、语义分析等方面的实际问题,最后讨论了高级的深度学习模型,如生成对抗网络及其应用。 2 Event-B建模 系统和软件工程 书名:《Event-B建模 系统和软件工程》 作者:[法] 简-埃蒙德·阿布瑞尔(Jean-Raymond Abrial) 译者:裘宗燕 编辑推荐: 国际著名计算机科学家简-埃蒙德·阿布瑞尔(Jean-Raymond Abrial)著 以Event-B方法开创者的角度阐释软件需求形式化建模技术 通过逐步精化来完成系统建模和设计 这本实用的教科书适用于形式化方法的入门课程或高级课程。本书以B形式化方法的一个扩展Event-B作为工具,展示了一种完成系统建模和设计的数学方法。简-埃蒙德•阿布瑞尔(Jean-Raymond Abrial)是国际著名计算机科学家,曾任苏黎世联邦理工学院客座教授,他基于精化的思想提出了一种系统化的方法,教读者如何逐步构造出所期望的模型,并通过严格的证明完成对所构造模型做系统化的推理。本书将介绍如何根据实际需要去构造各种程序,以及如何更为普遍地构造各种离散系统的模型。本书提供了大量的示例,这些示例源自计算机系统开发的各个领域,包括顺序程序、并发程序和电子线路等。本书还包含了大量具有不同难度的练习和开发项目。书中的每个例子都用Rodin平台工具集证明过。本书适合作为高等院校计算机、软件工程、网络工程、信息安全等专业高年级本科生、研究生的教材,也可供相关领域的研究人员和技术人员参考。 3 计算机视觉度量 从特征描述到深度学习 书名:《计算机视觉度量 从特征描述到深度学习》 作者:[美] 斯科特·克里格(Scott Krig) 译者:刘波 罗棻 编辑推荐: 计算机视觉、图像处理界先驱Scott Krig大作 计算机视觉领域经典理论和技术图书! 全面总结最新技术成果,透彻分析技术背后原理! 正像作者在前言中所说,虽然这本书不讲编程,但覆盖了90%计算机视觉领域的内容,是一本计算机视觉的“博物馆”,对从业者掌握算法的本质、提升应用能力很有帮助,对学生打下计算机视觉的坚实基础也很有效。本书的目的是概述特征描述子和特征学习方法,旨在从使用特征的角度来对计算机视觉方法进行总结、分类和分析。本书鼓励读者自己去思考每种方法是如何设计的,以及它们背后的工作原理是什么。本书还列出了近900篇参考文献,可满足不同层次的读者学习计算机视觉技术的需要。 4 深入浅出MySQL 数据库开发 优化与管理维护(第3版) 书名:《深入浅出MySQL 数据库开发 优化与管理维护 第3版》 作者:翟振兴 张恒岩 崔春华 黄荣 董骐铭 编辑推荐: 基于官方的MySQL 5.7版本进行全面修订,新增了大量8.0新特性。 新增数据库自动化运维章节,可帮助读者轻松搭建自己的RDS。 全面改写“架构篇”,复制/中间件/高可用更贴实战。 本书分为“基础篇”“开发篇”“优化篇”“管理维护篇”和“架构篇”,其内容源自网易公司多位资深数据库专家数年的经验总结和MySQL数据库的使用心得。本书以实用性和可操作性为主旨,章节安排合理有序,内容丰富全面,讲解由浅入深,还提供了大量的一线工作实例。无论是数据库初学人员,还是有一定经验的数据库管理/维护/开发人员,都可以在阅读本书的过程中或有匪浅。本书还适合作为数据库相关专业的参考用户,以及相关培训机柜的培训教材。 5 深入理解Spring Cloud与微服务构建(第2版) 书名:《深入理解Spring Cloud与微服务构建(第2版)》 作者:方志朋 编辑推荐: 基于Greenwich版本,全面讲解Spring Cloud原生组件。 深入原理,辅以图解,生动串联整个Spring Cloud生态。 总结提升,利用综合案例展现构建微服务系统的全过程。 附带全书源码供读者下载,方便学习和使用。 本书共分为18章,全面涵盖了通过Spring Cloud构建微服务的相关知识点。第1、2章详细介绍了微服务架构和Spring Cloud。第3、4章讲解了通过Spring Cloud构建微服务的准备工作。第5~14章以案例为切入点,讲解了通过Spring Cloud构建微服务的基础组件,包括Eureka、Ribbon、Feign、Hystrix、Zuul、Gateway、Consul、Config、Sleuth、Admint等组件。第15~17章讲述了使用Spring Cloud OAuth2来保护微服务系统的相关知识。第18章用一个综合案例全面讲解了如何使用Spring Cloud构建微服务,可用于实际开发中。 6 Istio实战指南 书名:《Istio实战指南》 作者:马若飞 编辑推荐: Service Mesher社区成员,作为Service Mesh的布道者,该社区成员对于Istio的了解和认知都具备一定的权威性。 基于最新的Istio 1.1版本写作。 本书配套代码可供读者下载。 《Istio实战指南》是Istio服务网格技术的入门图书。全书共分为9章,深入浅出地介绍了Istio的相关知识,结合大量的示例,清晰而详细地阐述了Istio的主要特性。《Istio实战指南》的第1章介绍了服务网格的起源和发展,第2~4章介绍了Istio的基本概念和安装。第5~8章,采用实例练习的方式详细地介绍了Istio的流量管理、策略和遥测的配置、可视化工具的集成以及安全相关的特性。这部分是《Istio实战指南》的重点,可以帮助读者学以致用,把Istio应用到真实的项目开发中。第9章是进阶内容,介绍了在云平台集成Istio的方式、高级流量控制以及调试和故障排除的内容。《Istio实战指南》的附录部分列举了安装选项、属性词汇表、表达式语言、适配器列表和istioctl命令,供读者查阅参考。《Istio实战指南》适合有一定Kubernetes基础,对服务网格和Istio技术感兴趣的开发人员和运维人员阅读。 7 Unreal Engine 4 游戏开发指南 书名:《Unreal Engine 4 游戏开发指南》 作者:[印度] 萨提斯·PV(Satheesh,PV,) 译者:王晓慧 编辑推荐: 如何通过Unreal Engine 4 的强大功能开发精彩绝伦的游戏。 通过Unreal Engine 4开发的游戏可以无缝地部署到iOS和Android设备上。 Unreal Engine论坛的主持人、重要成员和引擎贡献者。 Unreal Engine是目前世界上知名度高并且应用广泛的游戏引擎之一,全新版本的Unreal Engine 4提供了各种强大的功能和工具, 可用于开发简单的2D游戏,甚至实现高端的视觉效果。Unreal Engine 4具有高度的可移植性,通过Unreal Engine 4开发的游戏可以无缝地部署到iOS和Android设备上。本书旨在介绍如何通过Unreal Engine 4开发引人入胜的游戏。本书首先介绍Unreal Engine 4的用户界面、资源导入方法、材质编辑器、后期处理,然后讲述光照、蓝图、虚幻动态图形、级联粒子编辑器和Matinee,最后讲述如何打包和发布游戏。本书适合游戏开发人员、虚拟现实开发人员阅读,也可供3D环境设计等方面的专业人士参考。 8 精通Selenium WebDriver 3.0(第2版) 书名:《精通Selenium WebDriver 3.0 第2版》 作者:[印度] 马克·柯林(Mark Collin) 译者:赵卓 穆晓梅 编辑推荐: 利用高级用户交互API完成复杂操作的技巧。 机器学习和人工智能对于自动化测试的影响。 基于机器学习和Applitools的视觉测试实现方法 通过大量测试代码、界面截图和操作步骤,展示如何充分利用Selenium WebDriver 3.0实现自动化测试,搭建可靠的测试框架。Selenium WebDriver 3.0是一套功能强大的Web自动化测试工具。本书旨在展示如何利用Selenium WebDriver 3.0实现自动化测试。本书有助于测试人员快速掌握Selenium WebDriver 3.0的用法,提升自动化的效率,确保测试的稳定性和可靠性。本书介绍了如何搭建测试框架,如何处理失败的测试,如何根据异常判断测试出错的原因,如何巧妙地选择等待策略和超时机制,如何使用页面对象避免失效,如何使用高级用户交互API执行复杂的操作,如何使用JavaScript解决复杂的自动化问题。另外,本书还讨论Selenium WebDriver 3.0的缺点和在Docker中启动Selenium-Grid的方法等。 - END -
多年以来,当让程序员推选喜爱的计算机图书时,《编程珠玑》总是位于前列。正如自然界里珍珠出自细沙对牡蛎的磨砺,计算机科学大师乔恩·本特利以其独有的洞察力和创造力,从磨砺程序员的实际问题中凝结出一篇篇编程“珠玑”,成为世界计算机界名刊《ACM通讯》历史上最受欢迎的专栏,最终结集为两部计算机科学经典名著,影响和激励着一代又一代程序员和计算机科学工作者。本书为第一卷,主要讨论计算机科学中最本质的问题:如何正确选择和高效地实现算法。 在书中,作者选取许多具有典型意义的复杂编程和算法问题,生动描绘了历史上大师们在探索解决方案中发生的轶事、走过的弯路和不断精益求精的历程,引导读者像真正的程序员和软件工程师那样富于创新性地思考,并透彻阐述和总结了许多独特而精妙的设计原则、思考和解决问题的方法以及实用程序设计技巧。解决方案的代码均以C/C++语言编写,不仅有趣,而且有很大的实战示范意义。每章后所附习题极具挑战性和启发性,书末给出了简洁的解答。 01 计算机编程有很多方面。Fred Brooks在《人月神话》一书中为我们描绘了全景,他的文章强调了管理在大型软件项目中所起的关键作用。而Steve McConnell在《代码大全》一书中更具体地传授了良好的编程风格。这两本书所讨论的是好软件的关键因素和专业程序员应有的特征。遗憾的是,仅仅熟练地运用这些可靠的工程原理,不见得一定能够如期完成软件并顺利运行。 关于本书 本书描述了计算机编程更具魅力的一面:在可靠的工程之外,在洞察力和创造力范围内结晶而出的编程珠玑。正如自然界中的珍珠来自于磨砺牡蛎的细沙一样,这些编程珠玑来自于磨砺程序员的实际问题。书中的程序都很有趣,传授了重要的编程技巧和基本的设计原理。 本书大部分内容最初发表在《ACM通讯》中我主持的“编程珠玑”专栏。这些内容经过汇总和修订,在1986年结集出版,成为本书的第1版。第1版的13篇文章中,有12篇都在本版中做了大幅修订;此外,本版还补充了3篇新的内容。 阅读本书所需的唯一背景知识就是某种高级语言的编程经验。书中偶尔会出现一些高级技术(如C++中的模板等),对此不熟悉的读者可以跳过这些内容,基本上不影响阅读。 本书每一章都独立成篇,各章之间却又有着逻辑分组。第1章至第5章构成本书的第一部分,这部分回顾了编程的基本原理:问题定义、算法、数据结构以及程序验证和测试。第二部分围绕效率这个主题展开。效率问题有时本身很重要,又永远都是进入有趣编程问题的绝佳跳板。第三部分用这些技术来解决排序、搜索和字符串等重要问题。 阅读本书的一个提示:不要读得太快。要仔细阅读,一次读一章。要尝试解答书中提出的问题——有些问题需要集中精力思考一两小时才会变得容易。然后,要努力解答每章末尾的习题:当读者写下答案时,从本书学到的大部分知识就会跃然纸上。如有可能,要先与朋友和同事讨论一下自己的思路,再去查阅本书末尾的提示和答案。每章末尾的“深入阅读”并不算是学术意义上的参考文献表,而是我推荐的一些好书,这些书是我个人藏书的重要部分。 本书是为程序员而写的。我希望书中的习题、提示、答案和深入阅读对每个人都有用。本书已用作算法、程序验证和软件工程等课程的教材。附录A中的算法分类可供实际编程人员参考,该附录同时还说明了如何在算法和数据结构课程中使用本书。 02 一位程序员曾问我一个很简单的问题:“怎样给一个磁盘文件排序?”想当年我是一上来就犯了错误,现在,在讲这个故事之前,先给大家一个机会,看看能否比我当年做得更好。你会怎样回答上述问题呢? 1 一次友好的对话 我错就错在马上回答了这个问题。我告诉他一些有关如何在磁盘上实现归并排序的简要思路。我建议他深入研究算法教材,他似乎不太感冒。他更关心如何解决这个问题,而不是深入学习。于是我告诉他在一本流行的程序设计书里有磁盘排序的程序。那个程序有大约200行代码和十几个函数,我估计他最多需要一周时间来实现和测试该代码。 我以为已经解决了他的问题,但是他的踌躇使我返回到了正确的轨道上。其后就有了下面的对话,楷体部分是我的问题。 为什么非要自己编写排序程序呢?为什么不用系统提供的排序功能呢? 我需要在一个大系统中排序。由于不明的技术原因,我不能使用系统中的文件排序程序。 需要排序的内容是什么?文件中有多少条记录?每条记录的格式是什么? 文件最多包含1000万条记录,每条记录都是7位的整数。 等一下,既然文件这么小,何必非要在磁盘上进行排序呢?为什么不在内存里进行排序呢? 尽管机器有许多兆字节的内存,但排序功能只是大系统中的一部分,所以,估计到时只有1 MB的内存可用。 你还能告诉我其他一些与记录相关的信息吗? 每条记录都是7位的正整数,再无其他相关数据。每个整数最多只出现一次。 这番对话让问题更明确了。在美国,电话号码由3位“区号”后再跟7位数字组成。拨打含“免费”区号800(当时只有这一个号码)的电话是不收费的。实际的免费电话号码数据库包含大量的信息:免费电话号码、呼叫实际中转到的号码(有时是几个号码,这时需要一些规则来决定哪些呼叫在什么时间中转到哪里)、主叫用户的姓名和地址等。 这位程序员正在开发这类数据库的处理系统的一小部分,需要排序的整数就是免费电话号码。输入文件是电话号码的列表(已删除所有其他信息),号码重复出现算出错。期望的输出文件是以升序排列的电话号码列表。应用背景同时定义了相应的性能需求。当与系统的会话时间较长时,用户大约每小时请求一次有序文件,并且在排序未完成之前什么都干不了。因此,排序最多只允许执行几分钟,10秒钟是比较理想的运行时间。 2 准确的问题描述 对程序员来说,这些需求加起来就是:“如何给磁盘文件排序?”在试图解决这个问题之前,先将已知条件组织成一种更客观、更易用的形式。 输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=107。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该整数相关联。 输出:按升序排列的输入整数的列表。 约束:最多有(大约)1 MB的内存空间可用,有充足的磁盘存储空间可用。运行时间最多几分钟,运行时间为10秒就不需要进一步优化了。 请花上一分钟思考一下该问题的规范说明。现在你打算给程序员什么样的建议呢? 3 程序设计 显而易见的方法是以一般的基于磁盘的归并排序程序为起点,但是要对其进行调整,因为我们是对整数进行排序。这样就可以将原来的200行程序减少为几十行,同时也使得程序运行得更快,但是完成程序并使之运行可能仍然需要几天的时间。 另一种解决方案更多地利用了该排序问题的特殊性。如果每个号码都使用7字节来存储,那么在可用的1 MB存储空间里大约可以存143 000个号码。如果每个号码都使用32位整数来表示的话,在1 MB存储空间里就可以存储250 000个号码。因此,可以使用遍历输入文件40趟的程序来完成排序。在第一趟遍历中,将0至249 999之间的任何整数都读入内存,并对这(最多)250 000个整数进行排序,然后写到输出文件中。第二趟遍历排序250 000至499 999之间的整数,依此类推,到第40趟遍历的时候对9 750 000至9 999 999之间的整数进行排序。对内存中的排序来说,快速排序会相当高效,而且仅仅需要20行代码。于是,整个程序就可以通过一两页纸的代码实现。该程序拥有所期望的特性——不必考虑使用中间磁盘文件;但是,为此所付出的代价是要读取输入文件40次。 归并排序读入输入文件一次,然后在工作文件的帮助下完成排序并写入输出文件一次。工作文件需要多次读写。 40趟算法读入输入文件多次,写输出文件仅一次,不使用中间文件。 下图所示的方案更可取。我们结合上述两种方法的优点,读输入文件仅一次,且不使用中间文件。 只有在输入文件中的所有整数都可以在可用的1 MB内存中表示的时候才能够实现该方案。于是问题就归结为是否能够用大约800万个可用位来表示最多1 000万个互异的整数。考虑一种合适的表示方式。 4 实现概要 由是观之,应该用位图或位向量表示集合。可用一个20位长的字符串来表示一个所有元素都小于20的简单的非负整数集合。例如,可以用如下字符串来表示集合{1, 2, 3, 5, 8, 13}: 0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 代表集合中数值的位都置为1,其他所有的位都置为0。 在我们的实际问题中,每个7位十进制整数表示一个小于1 000万的整数。我们使用一个具有1 000万个位的字符串来表示这个文件,其中,当且仅当整数i在文件中存在时,第i位为1。(那个程序员后来找到了200万个稀疏位,习题5研究了最大存储空间严格限制为1 MB的情况。)这种表示利用了该问题的三个在排序问题中不常见的属性:输入数据限制在相对较小的范围内;数据没有重复;而且对于每条记录而言,除了单一整数外,没有任何其他关联数据。 若给定表示文件中整数集合的位图数据结构,则可以分三个自然阶段来编写程序。第一阶段将所有的位都置为0,从而将集合初始化为空。第二阶段通过读入文件中的每个整数来建立集合,将每个对应的位都置为1。第三阶段检验每一位,如果该位为1,就输出对应的整数,由此产生有序的输出文件。令n为位向量中的位数(在本例中为10 000 000),程序可以使用伪代码表示如下: 1/* phase 1: initialize set to empty */ 2 for i = [0, n) 3 bit[i] = 0/* phase 2: insert present elements into the set */ 4 for each i in the input file 5 bit[i] = 1/* phase 3: write sorted output */ 6 for i = [0, n) 7 if bit[i] == 1 8 write i on the output file (回想在前言中所提到的,for i=[0, n)表示在从0至n-1的范围内对i进行迭代。) 这个实现概要已经足以解决那个程序员的问题了。习题2、习题5和习题7描述了他会遇到的一些实现细节。 5 原理 那个程序员打电话把他的问题告诉我,然后我们花了大约一刻钟时间明确了问题所在,并找到了位图解决方案。他花了几小时来实现这个几十行代码的程序。该程序远远优于我们在电话刚开始时所担心的需要花费一周时间编写的几百行代码的那个程序。而且程序执行得很快:磁盘上的归并排序可能需要许多分钟的时间,该程序所需的时间只比读取输入和写入输出所需的时间多一点点——大约10秒钟。答案3包含了对完成该任务的几种不同程序的计时细节。 从这些事实中可以总结出该实例研究所得到的第一个结论:对小问题的仔细分析有时可以得到明显的实际益处。在该实例中,几分钟的仔细研究可以大幅削减代码的长度、程序员时间和程序运行时间。Chuck Yeager将军(第一个超音速飞行的人)赞扬一架飞机的机械系统时用的词是“结构简单、部件很少、易于维护、非常坚固”,该程序拥有同样的属性。然而,当规范说明的某些因素发生改变时,该程序的特殊结构将很难修改。除了需要精巧的编程以外,该实例阐明了如下一般原理。 正确的问题。明确问题,这场战役就成功了90%——我很庆幸程序员没有满足于我给出的第一个程序。一旦正确理解了问题,习题10、习题11和习题12的答案都会很优雅。在查看提示和答案以前,请努力思考这些问题。 位图数据结构。该数据结构描述了一个有限定义域内的稠密集合,其中的每一个元素最多出现一次并且没有其他任何数据与该元素相关联。即使这些条件没有完全满足(例如,存在重复元素或额外的数据),也可以用有限定义域内的键作为一个表项更复杂的表格的索引,见习题6和习题8。 多趟算法。这些算法多趟读入其输入数据,每次完成一步。在1.3节已经见到了一个40趟算法,习题5鼓励读者去完成一个两趟算法。 时间—空间折中与双赢。编程文献和理论中充斥着时间—空间的折中:通过使用更多的时间,可以减少程序所需的空间。例如,答案5中的两趟算法让程序运行时间加倍从而使空间减半。但我的经验常常是这样的:减少程序的空间需求也会减少其运行时间。①空间上高效的位图结构显著地减少了排序的运行时间。空间需求的减少之所以会导致运行时间的减少,有两个原因:需要处理的数据变少了,意味着处理这些数据所需的时间也变少了;同时将这些数据保存在内存中而不是磁盘上,进一步避免了磁盘访问的时间。当然了,只有在原始的设计远非最佳方案时,才有可能时空双赢。 简单的设计。Antoine de Saint-Exupéry是法国作家兼飞机设计师,他曾经说过:“设计者确定其设计已经达到了完美的标准不是不能再增加任何东西,而是不能再减少任何东西。”更多的程序员应该使用该标准来检验自己完成的程序。简单的程序通常比具有相同功能的复杂的程序更可靠、更安全、更健壮、更高效,而且易于实现和维护。 程序设计的阶段。 今日荐书 《编程珠玑 第2版》 计算机科学经典著作:编程珠玑 第2版修订版 +编程珠玑(续 修订版)(京东套装共2册) 作者:[美]乔恩·本特利(Jon Bentley) https://www.epubit.com/bookDetails?id=UB6c87641132d8a https://item.jd.com/12243652.html - END -
每个人在成长路上都有困惑的时候,通过读书丰富内心世界、增长本领和见识,进而走出迷茫的漩涡,是最好也最实用的方法。 9月上新图书,小编带来7本重磅新书,文末分享你对图书的看法或者你的读书经验,有惊喜礼哦~~ 9月新书 01 计算广告:互联网商业变现的市场与技术(第2版) 书名:《计算广告:互联网商业变现的市场与技术(第2版) 》 作者:刘鹏 王超 推荐理由: 全球第一本全面讲解计算广告与互联网变现秘密的专业图书升级版; @北冥乘海生 刘鹏老师力作; 众多互联网公司管理层与创业者联袂推荐的好书 本书第1版出版以后,获得的业界反响超乎了我们的想象。实际上,本书已经广泛被互联网公司采用,作为商业化相关部门的培训教程,甚至还成了某大公司商业化部门年会时的”阳光普照奖”奖品。 经过一段时间的补充与修订,我们向读者奉上这次的新版,希望本书能帮助读者深入了解互联网流量与数据变现,洞察互联网增长与财富的秘密,搭建商业化与获客的产品技术体系。 02 测试工程师全栈技术进阶与实践 书名:《测试工程师全栈技术进阶与实践 》 作者:茹炳晟 推荐理由: 朱少民、周震漪、周枫,以及百度、阿里、腾讯、字节跳动、eBay、网易、美团、ThoughtWorks、京东、谷歌、华为等公司测试专家推荐 。一本适合新时代的合格测试架构师和优秀测试工程师必读的全栈图书,全面讲解了软件测试人员必知必会的测试知识、技术和工具。 03 深入理解Spring Cloud与微服务构建(第2版) 书名:《深入理解Spring Cloud与微服务构建(第2版) 》 作者:方志朋 推荐理由: 作者方志朋是Spring Cloud中国社区联合发起人、CSDN博客专家,专注于分布式系统和中间件等领域的研究和开发,乐于分享,爱好开源,对技术有着强烈的追求,活跃于各大技术社区。本书全面涵盖了通过Spring Cloud构建微服务的相关知识点。 04 趣学数据结构 书名:《趣学数据结构 》 作者:陈小玉 推荐理由: 《趣学算法》作者又一力作,图解+原理+代码+实战,带你轻松学习数据结构与算法 完美图解+丰富实例,复杂问题简单化 为基本操作配以图解,用数据结构解决生活中的实际问题,学习过程更加轻松有趣。 原理分析+实战演练,真正地学以致用 通俗化讲解基础知识,在实战中体会数据结构的设计和操作,锻炼独立思考的能力。 配套代码+在线答疑,为学习保驾护航 提供书中的范例程序源代码、练习题以及答案解析,并在博客和QQ群中答疑解惑。 本书基于C++语言编写,从趣味故事引入算法复杂性计算及数据结构基础内容,涵盖线性结构、树形结构和图形结构,包括链表、栈和队列、树和图的应用等。本书内容还涉及数据结构的基本应用(包括各种查找、排序等)和高级应用(包括优先队列、并查集、B-树、B+树和红黑树等)。通过大量图解将抽象数据模型简单通俗化,语言表述浅显易懂,并结合有趣的实例帮助读者轻松掌握数据结构。 05 Python Qt GUI与数据可视化编程 书名:《Python Qt GUI与数据可视化编程》 作者:王维波 栗宝鹃 张晓东 推荐理由: 示例丰富的Python GUI编程和数据可视化编程的实用指南 PyQt5是Qt 5 C++类库的Python绑定,使用PyQt5可以在Python 中开发专业的GUI 应用程序。本书介绍PyQt5开发Python GUI应用程序的编程方法,还介绍在GUI 程序中嵌入二维和三维数据可视化功能的编程方法,特别是将Matplotlib 嵌入GUI 界面的面向对象编程方法。 本书包含大量完整示例程序,使学习过程具有可跟随性和可操作性,适合具有Python编程基础,需要使用Python设计GUI应用程序,或在GUI应用程序中嵌入数据可视化功能的读者。 06 软件项目估算 书名:《软件项目估算》 作者:[美] 阿兰·阿布兰(Alain Abran) 译者:徐丹霞 郭玲 任甲林 推荐理由: 本书中的概念用图表示,更为清晰明了。 本书的案例所用的数据都是真实企业的数据。 本书主要讲解如何构建估算模型和验证估算模型的质量。本书分为3个部分,共13章。第一部分(第1~3章)介绍估算过程的结构,估算中必须予以考虑的大量的经济学概念;第二部分(第4~7章),介绍有关估算结果质量的概念和技术,根据估算目的增加的调整因子的局限性;第三部分(第8~13章)介绍建立估算模型过程中的问题。 07 Istio实战指南 书名:《Istio实战指南》 作者:马若飞 推荐理由: Service Mesher社区成员,作为Service Mesh的布道者,该社区成员对于Istio的了解和认知都具备一定的权威性。 本书基于最新的Istio 1.1版本写作。 本书配套代码可供读者下载。 《Istio实战指南》是Istio服务网格技术的入门图书。全书共分为9章,深入浅出地介绍了Istio的相关知识,结合大量的示例,清晰而详细地阐述了Istio的主要特性。 - END -
零信任(或零信任网络、零信任模型等)这个概念最早是由John Kindervag于2010年提出的,他当时是Forrester的分析师。John Kindervag非常敏锐地发现传统的基于边界的网络安全架构存在缺陷,通常被认为“可信”的内部网络充满威胁,“信任”被过度滥用,并指出“信任是安全的致命弱点”。因此,他创造出了零信任(Zero Trust)这个概念。“从来不信任,始终在校验”(Never Trust,Always Verify)是零信任的核心思想。 传统的网络安全架构基于网络边界防护。企业构建网络安全体系时,首先把网络划分为外网、内网和DMZ区等不同的安全区域,然后在网络边界上通过部署防火墙、WAF和IPS等网络安全技术手段进行重重防护,构筑企业业务的数字护城河。这种网络安全架构假设或默认了内网比外网更安全,在某种程度上预设了对内网中的人、设备、系统和应用的信任,从而忽视内网安全措施的加强。 美国Verizon公司的《2017年数据泄露调查报告》指出,造成企业数据泄露的原因主要有两类:一是外部攻击,二是内部威胁。随着网络攻防技术的发展,新型的网络攻击手段层出不穷,攻击者面对层层设防的网络边界,往往会放弃代价高昂的强攻手段,转而针对企业内部网络中的计算机,采用钓鱼邮件、水坑攻击等方法渗透到企业网络内部,轻松绕过网络边界安全防护措施。由于人们往往认为内网是可信任的,因此攻击者一旦突破企业的网络安全边界进入内网,就会如入无人之境。此外,企业员工、外包人员等内部用户通常拥有特定业务和数据的合法访问权限,一旦出现凭证丢失、权限滥用或恶意非授权访问等问题,同样会导致企业的数据泄露。 基于这样的认知,零信任针对传统边界安全架构思想重新进行了评估和审视,并对安全架构思路给出了新的建议:默认情况下不应该信任网络内部和外部的任何人、设备、系统和应用,而是应该基于认证和授权重构访问控制的信任基础,并且这种授权和信任不是静态的,它需要基于对访问主体的风险度量进行动态调整。 客观地说,John Kindervag提出零信任架构的开始几年,这一理念并没有获得网络安全行业的普遍关注,只是在一些社区有着小范围的讨论和实践,《零信任网络 在不可信网络中构建安全系统》的作者Evan Gilman和Doug Barth就是早期实践者之一。然而,2015年前后,情况发生了明显的变化。层出不穷的高级威胁和内部风险,以及监管机构对企业网络安全的监督力度逐渐加强,使得零信任架构变革的外部驱动力越来越强。随着企业数字化转型的逐渐深入,以云计算、微服务、大数据、移动计算为代表的新一代信息化建设浪潮愈演愈烈,IT基础设施的技术架构发生了剧烈的变革,导致传统的内外网络边界变得模糊,很难找到物理上的网络安全边界,企业自然无法基于传统的边界安全架构理念构筑安全基础设施。安全架构如果不能随需应变,自然会成为木桶最短的那块木板,零信任架构变革的内生驱动力也在持续加强。 2017年,Google对外宣布其基于零信任架构实践的新一代企业网络安全架构——BeyondCorp项目成功完成,为零信任在大型、新型企业网络的实践提供了参考架构。这一最佳实践成为零信任理念的助推剂,各大安全厂商、分析机构和大型企业快速跟进,对零信任的推广和宣传也持续升温,在RSAC 2019展会上达到高潮,零信任俨然成为网络安全界的新宠。 当然,任何一种新生事物都难免受到人们的质疑,零信任架构也不例外。在过去一年多时间推广和实践零信任的过程中,我们遇到最多的质疑是,零信任听起来并没有什么新技术,是不是“新瓶装旧酒”?的确,零信任是一种全新的安全架构,但其核心组件基于身份与访问管理技术、终端设备环境风险评估技术、基于属性的访问控制模型、基于机器学习的身份分析技术等构建,听上去并没有太多激动人心的新技术。并且,零信任的最佳实践反倒是推荐使用现有的成熟技术,根据具体的应用场景,按照全新的逻辑进行组合,就能起到完全不同的安全效果。 我们认为零信任的创新和价值恰恰不在于具体的组件技术本身,而在于架构理念和安全逻辑层面。零信任架构与传统的边界安全架构、传统的安全防护理念最大的不同之处在于以下几点。第一,在网络安全边界瓦解、攻击面难以穷尽的情形下,与传统的安全理念不同,零信任架构引导人们更加关注“保护面”而不是“攻击面”。首先识别需要重点保护的资源对象,然后穷举分析该资源对象的访问路径,最后采用恰当的技术手段做好每条路径的访问控制措施。第二,零信任架构认为网络是不可信任的,因此不再寄希望于在传统的网络层面增强防护措施,而是把防护措施建立在应用层面,构建从访问主体到客体之间端到端的、最小授权的业务应用动态访问控制机制,极大地收缩了攻击面;采用智能身份分析技术,提升了内外部攻击和身份欺诈的发现和响应能力。第三,零信任架构在实践机制上拥抱灰度哲学,以安全与易用平衡的持续认证改进固化的一次性强认证,以基于风险和信任持续度量的动态授权替代简单的二值判定静态授权,以开放智能的身份治理优化封闭僵化的身份管理。因此,灰度哲学是零信任安全的内生逻辑,也是零信任安全实践的指导原则。 今天我们有幸邀请到了《零信任网络:在不可信网络中构建安全系统》译者奇安信身份安全实验室,来看看他们的所思所想: 异步社区:可以简单介绍一下咱们翻译团队吗?为什么想要翻译这本书? 奇安信身份安全实验室: 我们是奇安信身份安全实验室,是专注“零信任身份安全架构”研究的专业实验室。作为奇安信集团下属的创新业务实验室之一,实验室以“零信任安全,新身份边界”为技术思想,对零信任保持着持续关注,并积极地在国内进行零信任理念推广和落地实践,也推出了相关产品与解决方案。 但在此过程中,我们发现国内的安全界同仁对零信任的概念比较陌生,理解不够深入,为了加快国内对零信任这种先进的安全架构的采用,我们决定对《零信任网络:在不可信网络中构建安全系统》这本书进行翻译。 异步社区:最想将《零信任网络:在不可信网络中构建安全系统》这本书推荐给谁看? 奇安信身份安全实验室: 网络工程师、安全工程师、软件工程师、CTO、CISO等,每个人都可以从零信任模型的学习中受益。即便没有相关的专业背景知识,也可以很容易地理解本书描述的许多原则。 本书也能够帮助领导者理解零信任模型的基本概念,在零信任模型的实践中做出正确的决策,从而逐步改善组织的整体安全状况。 异步社区:零信任网络作为这两年安全领域的热门话题,可以简单介绍一下零信任的发展历史吗? 奇安信身份安全实验室: 零信任的早期雏形在2004年的耶利哥论坛就有所体现了,随后在2010年Forrester的分析师约翰·金德维格正式提出零信任的概念,金德维格先生基于对网络安全的深入洞察,提出默认不应该信任任何网络流量,而是需要基于强认证和细粒度授权来重建信任。 但在零信任概念推出的前几年,业界并未对其广泛关注,2017年是个分水岭,因为2017年,Google基于零信任的全新安全实践BeyondCorp项目取得成功,验证了零信任在大型网络场景下的可行性,业界受到Google BeyondCorp项目的鼓舞,开始大力跟进和开展零信任实践。 这两年,Forrester也对零信任的理念做了进一步的扩展,提出了零信任扩展ZTX的概念,将零信任从保护范围和安全能力两个维度进行了扩展。 异步社区:作为译者,请对《零信任网络:在不可信网络中构建安全系统》这本书的内容进行简单介绍。 奇安信身份安全实验室: 《零信任网络:在不可信网络中构建安全系统》是业界截至目前唯一的一本体系化讲解零信任的书籍。对零信任的背景、核心概念、关键技术要点都做了深入的讲解,特别是对零信任架构的两个核心术语网络代理和信任引擎做了大篇幅的介绍,全书还围绕用户、设备、应用、网络四个维度深入讲解了信任的建立方法。作者基于自己的零信任实践和对一些业界厂商的调研写作了此书,内容由浅入深,干货多多,我们在翻译此书的过程中,其实也是对零信任深入学习的过程,受益匪浅。 异步社区:根据你们的理解,零信任这种安全架构的核心能力应该包括哪些方面? 奇安信身份安全实验室: 结合业界的零信任模型和奇安信在国内大型部委、央企的零信任实践,我们认为零信任的核心能力包括以身份为基石、业务安全访问、持续信任评估和动态访问控制四个方面的核心能力。 以身份为基石:需要为网络中的人和设备赋予数字身份,将身份化的人和设备进行运行时组合构建访问主体,并为访问主体设定其所需的最小权限。 业务安全访问:零信任架构关注业务保护面的构建,要求所有业务默认隐藏,根据授权结果进行最小限度的开放,所有的业务访问请求都应该进行全流量加密和强制授权。 持续信任评估:通过信任评估引擎,实现基于身份的信任评估能力,同时需要对访问的上下文环境进行风险判定,对访问请求进行异常行为识别并对信任评估结果进行调整。 动态访问控制:动态访问控制是零信任架构的安全闭环能力的重要体现。设置灵活的访问控制基线,基于信任等级实现分级的业务访问,当访问上下文和环境存在风险时,需要对访问权限进行实时干预并评估是否对访问主体的信任进行降级。 异步社区:最近的北京网络安全大会的主题是“聚合应变,内生安全”,你们认为零信任安全是否是一种内生安全? 奇安信身份安全实验室: 零信任架构是安全思维和安全架构进化的必然,聚焦身份、业务、信任和动态访问控制等维度的安全能力,而这些能力和客户的业务密不可分,所以零信任天生就应该是一种内生安全。 基于业务场景的人、流程、访问、环境等多维的因素,对信任进行评估,并通过信任等级对权限进行动态调整,这是一种动态自适应的安全闭环体系。 零信任的落地需要结合现状和需求,将零信任的核心能力和组件内嵌入业务体系,构建自适应内生安全机制,建议在业务建设之初进行同步规划,进行安全和业务的深入聚合。 异步社区:授“计算机”以鱼不如授“计算机”以渔。你们如何看? 奇安信身份安全实验室: 这个问题很有意思,我们还是围绕零信任来回答吧。在安全这个语境下,如果说传统的安全思维或静态的、边界化的安全产品和方案是安全的“鱼”,那么零信任无疑是安全的“渔”。作为一种内生安全,零信任具备自适应的能力,和客户的业务场景结合,零信任能对访问者的信任程度进行动态度量并实时调整访问策略,对未知威胁的缓解具有很强的自适应性。 零信任提供的自适应的身份安全、业务安全、信任评估、动态访问控制等能力是开放的、平台化的,一个组织可以将业务逐步迁移到零信任,迁入的业务都将具备这种自适应的安全能力,这样零信任就变成了组织业务流程的内生能力,持续为组织的安全赋能。 异步社区:你们觉得零信任的创新和价值在于什么?创新更多是需要领域内的一定的学术或设计经验积累,还是更需要像阿基米德那样的“灵光闪现”?或者说,创新者大多来自于务实派,还是空想派? 奇安信身份安全实验室: 零信任的创新之处在于对安全范式的颠覆,驱动安全范式从以网络为基础转变到以身份为基础,实现以身份为基石的动态访问控制体系,其安全价值在于助力企业实现全面身份化、风险度量化、授权动态化、管理自动化的新一代网络安全架构,帮助企业更快速更安全的采用新型IT技术,支撑企业数字化转型。 “灵光闪现”是需要大量理论、实践经验来支撑的,如果没有深厚的物理学知识支撑,把阿基米德老先生丢进浴缸100次估计也悟不出浮力原理,创新需要通过脚踏实地的务实派来完成。零信任理念的出现同样不是空想出来时,而是基于对安全架构的深入理解和对安全发展趋势的深度洞察才发展出来的。同样,零信任的落地实践也不能想当然,纸上得来终觉浅,需要结合客户场景,结合安全现状推出适合国内实际情况的零信任产品和解决方案。 异步社区:如何平衡工作和翻译工作?有什么提高效率的方法或诀窍推荐吗? 奇安信身份安全实验室: 老实说,翻译所需的工作量和难度是超出预期的,翻译团队的伙伴们本着对零信任的高度热情,在工作之余投入了巨大的精力去进行翻译和校对,在翻译过程中,在搭高铁、坐飞机的碎片时间,都被充分利用起来了,聚沙成塔,最终顺利完成本书翻译。 为了确保翻译质量,对每一章节基本上都经历了逐段翻译、脱稿校对、逐字检查的过程,确保最终成书的信达雅,当然,毕竟经验有限,难免有疏漏之处,还请大家多包涵并给我们反馈。 异步社区:作为《零信任网络:在不可信网络中构建安全系统》一书的译者,你们对阅读本书的建议是什么? 奇安信身份安全实验室: 零信任毕竟是一个全新的安全理念,本身在持续的发展和完善中,因此,原作者对零信任的理解也难免有不全面的地方。 大家学习本书的过程中,建议结合其他零信任相关资料进行对比,比如,Google关于BeyondCorp项目一共发表了六篇论文,详细讲解了BeyondCorp项目的理念、架构和迁移方法等,可以作为《零信任网络:在不可信网络中构建安全系统》一书的配套资料一起学习。 这六篇论文,奇安信身份安全实验室也做了翻译,大家可以从网络上免费获取。 零信任网络:在不可信网络中构建安全系统 作者:【美】埃文·吉尔曼(Evan Gilman),道格·巴斯(Doug Barth) 译者:奇安信身份安全实验室 推荐理由: 理解零信任模型是如何把安全内嵌入掌握零信任网络中主要组件的基本概念,包括网络代理和信任引擎; 使用现有的技术在网络参与者之间建立信任; 理解零信任模型是如何把安全内嵌入系统的运营管理,而不是建立在系统之上; 学习如何把基于边界安全模型的网络迁移到零信任网络 。 保护网络的边界安全防御措施并不如人们想象中那么牢不可破。防火墙保护之下的网络主机自身的安全防护非常弱,一旦“可信”网络中的某个主机被攻陷,那么攻击者很快就能以此为跳板,侵入数据中心。为解决传统边界安全模型固有的缺陷,本书为读者介绍了零信任模型,该模型认为整个网络无论内外都是不安全的,“可信”内网中的主机面临着与互联网上的主机相同的安全威胁。 - END -
2017 年年初,我所在的公司开始对整个业务系统进行重构和微服务化,替换掉因业务发展而不堪重负的、运行了 10 年的庞大的单体应用。我有幸作为小组技术负责人,负责部分业务的微服务架构的设计和开发工作。 随着微服务迁移工作的深入,服务化过程中遇到的问题越来越多,痛点也越加明显。当我们的业务被拆分成若干个服务时,不可避免地要进行服务之间的交互,很多时候需要多个服务共同协作才能完成一个完整的业务流程。在这种情况下,服务间的通信问题也暴露得更加明显。我开始思考如何实现分布式系统的弹性设计,以及解决容错、监控等问题。 我偶然通过阅读“What's a service mesh? And why do I need one?”这篇文章接触到服务网格概念,并了解到它是解决微服务通信问题的好帮手。与此同时,Istio 也发布了 1.0 版本。在仔细了解了 Istio 的整体技术架构后,我深深地被这种优雅的设计所折服,各组件职责清晰、松散耦合,数据平面可替换,Mixer 的适配器模式又提供了强大的可扩展性。加之 Google、IBM 和 Lyft 的支持,我预感 Istio 会和 Kubernetes一样,成为又一个明星级的产品。 服务网格是一个新颖的概念,Istio 作为它的一个实现产品,诞生也不到两年的时间,网络上很难找到相关的学习资源,主要的学习资料就是 Istio 官方提供的文档。这份文档虽然十分详尽地介绍了 Istio 的方方面面,但语言较为晦涩,内容组织也不适合初学者。今天这本《Istio实战指南》恰好满足了初学者的需求。 Istio实战指南 01 什么是服务网格 什么是服务网格?简单来说,就是在微服务架构下管理服务间网络通信的基础设施。为了让大家更容易理解,我们用现实中的社交网络来进行类比。 把时间退回到现代科技出现之前。那时候人和人之间如果需要沟通和交流,可能就只能亲自登门拜访了,以面对面的方式建立联系。后来出现了书信,这是通讯的一大进步,至少为了说几句话,我不用亲自跑一趟了。但书信的时效性还是太低,于是就出现了电话。这下沟通的时效性问题也解决了,只要有电话网络覆盖的地方,随时都可以通过电话进行交流。但是电话仍然有局限性,就是它只能是点对点的沟通,如果我想和三五个好友一起聊天,就没法实现了。最终,社交网络的出现解决了这个问题。 无论是以前IM工具的群组功能,还是Facebook、人人网这样的SNS网站,再到现在的朋友圈,都可以认为是不同形态的社交网络。我们可以随时随地不受限制的和联系人进行一对一、多对多的沟通。那么社交网络和服务网格有哪些相似性呢? 首先,社交网络中出现的主体是联系人,这就好像服务网格中的主体是一个个的微服务。联系人之间是通过注册在社交网络的账号进行交互的,包括消息的发送和接收。这个账号的载体可以是电脑或者手机。这就好像网格里的Sidecar代理,服务间的通信都由它们完成。它们就像是微服务的账号和手机一样,负责与不同的联系人(微服务)进行沟通。 如果说服务网格是Sidecar代理组成的网络拓扑,那么人际关系就是社交网络的拓扑。最后,社交网络的最终效果是使得人与人之间无阻碍的沟通,使人和地域、时间解耦;类似的,服务网格最终的目的是使得微服务(即业务)和网络通信功能解耦。 相信现在你已经大致了解了服务网格的基本概念,本质上它将网络通信下沉到基础设施层,让微服务只需要关注业务本身;就好像社交网络将人际关系的网络拓扑抽取出来,你只需要关注沟通的内容本身,而不需要关心沟通的方式。 02 什么是Istio 作为服务网格的实现产品,Istio一经推出就备受瞩目,成为各大厂商和开发者争相追逐的“香馍馍”。我个人认为Istio会成为继Kubernetes之后的又一个明星级产品。Istio的官方网站这样定义自己。 它是一个完全开源的服务网格,以透明层的方式构建在现有分布式应用中。它也是一个提供了各种API的平台,可以与任何日志平台、监控系统或策略系统集成。Istio的多样化特性可以让你高效地运行分布式微服务架构,并提供一种统一的方式来保护、连接和监控微服务。 从上面的定义中可以了解到,Istio为微服务应用提供了一个完整的解决方案,可以以统一的方式去检测和管理微服务。同时,它还提供了管理流量、实施访问策略、收集数据等功能,而所有这些功能都对业务代码透明,即不需要修改业务代码就能实现。 有了Istio,就几乎可以不需要其他的微服务框架,也不需要自己去实现服务治理等功能,只要把网络层委托给Istio,它就能帮助完成这一系列的功能。简单来说,Istio就是一个提供了服务治理能力的服务网格。 03 Istio的架构 对服务网格来讲,业务代码无侵入和网络层的全权代理是其重要的优势。我们来了解一下Istio的架构,看一看它是如何做到这两点的,并了解架构中的各个组件是如何协同工作并完成网络层功能的。 Istio的架构从逻辑上分成数据平面(Data Plane)和控制平面(Control Plane)。是否觉得似曾相识?没错,Kubernetes的架构也具有相似的结构,分为控制节点和计算节点。毫无疑问,这样的设计可以很好地解耦各个功能组件。 数据平面:由一组和业务服务成对出现的Sidecar代理(Envoy)构成,它的主要功能是接管服务的进出流量,传递并控制服务和Mixer组件的所有网络通信(Mixer是一个策略和遥测数据的收集器,稍后会介绍)。 控制平面:主要包括了Pilot、Mixer、Citadel和Galley共4个组件,主要功能是通过配置和管理Sidecar代理来进行流量控制,并配置Mixer去执行策略和收集遥测数据(Telemetry)。 图1展示了由这些组件组成的Istio架构。 从Istio的架构中可以看出,Istio追求尽可能的透明,通过各种解耦设计让系统对内对外都没有依赖。同时,它还提供了高度的扩展性。Istio认为随着应用的增长和服务的增多,扩展策略系统是最主要的需求,因此它被设计为以增量的方式进行扩展。可移植也是Istio在设计中充分考虑的因素,它被设计为支持多种平台,以便服务可以被方便地迁移到不同的云环境中(在撰写本书的过程中,Istio仍然深度依赖于Kubernetes平台)。 通过数据平面和控制平面的分离,各个组件都成为插件,这种开放和包容的设计思路相当具有前瞻性,我想这也就是其他服务网格产品都放弃了和它竞争而选择合作的重要原因。 下面对架构中的各组件做进一步介绍。 图1 Istio架构 04 Istio的核心控件 4.1 Envoy 从架构图可以看出,Istio的数据平面就是指代理。Istio选择Envoy作为Sidecar代理,Envoy本质上是一个为面向服务的架构而设计的7层代理和通信总线。Envoy基于C++11开发而成,性能出色。除了具有强大的网络控制能力外,Envoy还可以将流量行为和数据提取出来发送给Mixer组件,用以进行监控。 Envoy在网络控制方面的主要功能如下。 HTTP 7层路由。 支持gRPC、HTTP/2。 服务发现和动态配置。 健康检查。 高级负载均衡。 我们知道,在Kubernetes环境中,同一个Pod内的不同容器间共享网络栈,这一特性使得Sidecar可以接管进出这些容器的网络流量,这就是Sidecar模式的实现基础。Envoy是目前Istio默认的数据平面,实际上因为Istio灵活的架构,完全可以选择其他兼容的产品作为Sidecar。目前很多服务网格产品都可以作为Istio的数据平面并提供集成。 4.2 Pilot Pilot 是Istio实现流量管理的核心组件,它主要的作用是配置和管理Envoy代理。比如可以为代理之间设置特定的流量规则,或者配置超时、重试、熔断这样的弹性能力。Pilot会将控制流量行为的路由规则转换为Envoy的配置,并在运行时将它们广播到Envoy。另外,Pilot还能够把服务发现机制抽象出来并转换成API分发给Envoy,使得后者具有服务发现的能力。 简单来说,Pilot的主要任务有两个。 从平台(如Kubernetes)获取服务信息,完成服务发现。 获取Istio的各项配置,转换成Envoy代理可读的格式并分发。 图2展示了Pilot架构。Pilot维护了一套独立于平台的服务规则,并提供了 图2 Pilot架构 一个平台适配器,以便接入各种不同的平台。Rules API对运维人员开放,使得他们可以设置想要的流量规则,Pilot会把这些配置好的规则通过Envoy API分发给Envoy代理,以使其执行指定的规则。 Pilot还公开了用于服务发现并且可以动态更新负载均衡和路由表的API。 4.3 Mixer Mixer的主要功能是提供策略控制,并从Envoy代理收集遥测数据。每次网络通信时Envoy代理都会向Mixer发出预检要求,用来检测调用者的合法性。调用之后Envoy代理会发送遥测数据供Mixer收集。一般情况下Sidecar代理可以缓存这些数据,不需要频繁地调用Mixer。 适配器是Mixer的重要组成部分,它本质上是一个插件模型,每个插件叫作适配器。这项特性使得Mixer可以接入几乎任意的(只要定义好接口)后端基础设施。比如可以选择接入不同的日志收集器、监控工具和授权工具等;可以在运行时切换不同的适配器或者是打开(关闭)它们;还可以自定义适配器以满足特定需求。适配器极大地提高了Mixer的扩展性,它让Istio的功能拥有了更多可能性。图3展示了Mixer的架构图并展示了它和Envoy的交互方式。 图3 Mixer架构 4.4 Citadel Citadel是与安全相关的组件,主要负责密钥和证书的管理。它可以提供服务间和终端用户的身份认证,还可以加密服务网格中的流量。在后面介绍安全主题的第8章中,我们会详细说明它是如何和其他组件协同工作的。 4.5 Galley 在2019年3月份发布的1.1版本中,Galley作为一个独立的组件被添加到了架构当中(在此之前的版本中Galley并未独立出现),它现在是Istio主要的配置管理组件,负责配置的获取、处理和分发。Galley使用了一种叫作MCP(Mesh Configuration Protocol,网格配置协议)的协议与其他组件进行通信。 05 Istio的主要功能 下面详细地介绍一下Istio的4个主要功能和实现原理。 5.1 流量管理 第1章介绍过,微服务应用最大的痛点就是处理服务间的通信,而这一问题的核心其实就是流量管理。首先来看一看传统的微服务应用在没有服务网格介入的情况下,如何完成诸如金丝雀发布这样的动态路由。假设不借助任何现成的第三方框架,一个简单的实现方法是,在服务间添加一个负载均衡(如Nginx)做代理,通过修改配置的权重来分配流量。这种方式将对流量的管理和基础设施(云服务器、虚拟机、实体机等)绑定在了一起,难以维护。 而使用Istio就可以轻松地实现各种维度的流量控制。图4展示了两种不同的金丝雀发布策略。第一种是根据权重把5%的流量路由给新版本;第二种是根据请求的头信息User-Agent把使用iPhone的用户流量路由到新版本。 图4 Istio的流量管理 Istio的流量管理是通过Pilot和Envoy这两个组件实现的,将流量和基础设施进行了解耦。Pilot负责配置规则,并把规则分发到Envoy代理去实施;而Envoy按照规则执行各种流量管理的功能,比如动态请求路由,超时、重试和熔断,还可以通过故障注入来测试服务之间的容错能力。下面对这些具体的功能进行逐一介绍。 1.请求路由 Istio为了控制服务请求,引入了服务版本(Version)的概念,可以通过版本这一标签将服务进行区分。版本的设置是非常灵活的,可以根据服务的迭代编号进行定义(如v1、v2版本);也可以根据部署环境进行定义(如Dev、Staging和Production);或者是自定义任何用于区分服务的标记。通过版本标签,Istio就可以定义灵活的路由规则以控制流量,上面提到的金丝雀发布这类应用场景就很容易实现了。 图5展示了使用服务版本实现路由分配的例子。服务版本定义了版本号(v1.5、v2.0-alpha)和环境(us-prod、us-staging)两种信息。服务B包含了4个Pod,其中3个是部署在生产环境的v1.5版本,而Pod4是部署在预生产环境的v2.0-alpha版本。运维人员根据服务版本指定路由规则,通过Pilot同步给Envoy代理,使得99%的流量流向v1.5版本的生产环境,而1%的流量进入v2.0-alpha版本的预生产环境。 图5 服务版本控制 2.入口网关(Ingress)和出口网关(Egress) 服务间通信是通过Envoy代理进行的。同样,我们也可以在整个系统的入口和出口处部署代理,使得所有流入和流出的流量都由代理进行转发,而这两个负责入口和出口的代理就叫作入口网关和出口网关。它们相当于整个微服务应用的边界代理,把守着进入和流出服务网格的流量。图6展示了Ingress和Egress在请求流中的位置,通过设置Envoy代理,出入服务网格的流量也得到了控制。 图6 请求流中的Ingress和Egress 3.服务发现和负载均衡 服务发现的前提条件是具有服务注册的能力。目前Kubernetes这类容器编排平台也提供了服务注册的能力。Istio基于平台实现服务发现和负载均衡时,需要通过Pilot和Envoy协作完成,如图7所示。Pilot组件会从平台获取服务的注册信息,并提供服务发现的接口,Envoy获得这些信息并更新到自己的负载均衡池。Envoy会定期地对池中的实例进行健康检查,剔除离线的实例,保证服务信息的实时性。 图7 服务发现和负载均衡 4.故障处理 Istio的故障处理都由Envoy代理完成。Envoy提供了一整套现成的故障处理机制,比如超时、重试、限流和熔断等。这些功能都能够以规则的形式进行动态配置,并且执行运行时修改。这使得服务具有更好的容错能力和弹性,并保证服务的稳定性。 5.故障注入 简单来说,故障注入就是在系统中人为地设置一些故障,来测试系统的稳定性和系统恢复的能力。比如为某服务设置一个延迟,使其长时间无响应,然后检测调用方是否能处理这种超时问题而自身不受影响(如及时终止对故障发生方的调用,避免自己受到影响且使故障扩展)。 Isito支持注入两种类型的故障:延迟和中断。延迟是模拟网络延迟或服务过载的情况;中断是模拟上游服务崩溃的情况,表现为HTTP的错误码和TCP连接失败。 5.2 策略和遥测 1.策略 在微服务应用中,除了流量管理以外,常常还需要进行一些额外的控制,比如限流(对调用频率、速率进行限制)、设置白名单和黑名单等。 Istio中的策略控制是依靠Mixer完成的。Envoy代理在每次网络请求时,都会调用Mixer进行预先检查,确定是否满足对应的策略。同时,Mixer又可以根据这些来自流量的数据,进行指标数据的采集和汇总,这就是遥测功能。 2.遥测(Telemetry) 遥测是工业上常用的一种技术,它是指从远程设备中收集数据,并传输到接收设备进行监测。在软件开发中,遥测的含义引申为对各种指标(metric)数据进行收集,并监控、分析这些指标,比如我们经常听到的BI数据分析。 Mixer的一大主要功能就是遥测。前面已经说过,Envoy代理会发送数据给Mixer,这就使得Mixer具有了数据收集的能力。在本章对Mixer的介绍中读者已经了解到Mixer的插件模型,也就是适配器。Mixer可以接入不同的后端设施作为适配器,来处理收集到的指标数据,比如日志分析系统、监控系统等。 5.3 可视化 在微服务应用越来越复杂的情况下,对整个系统的状态进行监控和追踪变得尤为重要。试想如果一个包含上百个服务的系统发生了故障却无法准确定位问题的根源,或者系统压力已经到了承受的临界值而运维人员却浑然不知,这是多么可怕的事情。没有完备的、可观察的监控系统就无法保障系统的稳定性。 Istio可以很方便地和各种监控、追踪工具集成,以便我们以可视化的方式(网页)直观地查看整个系统的运行状态。比如可以集成Prometheus来进行指标数据的收集,然后将收集的数据放在Grafana监控工具中展示;还可以集成Jaeger作为追踪系统,帮助我们对请求的调用链进行跟踪,在故障发生时分析出现问题的根源;或者将请求日志记录到Kibana系统,以图表的方式进行数据分析。 以上提到的这些可视化工具都会在第7章被集成到Istio,并得到详细的介绍。 5.4 安全 Istio 中的安全架构是由多个组件协同完成的。Citadel是负责安全的主要组件,用于密钥和证书的管理;Pilot会将授权策略等信息分发给Envoy代理;Envoy根据策略实现服务间的安全通信;Mixer负责管理授权等工作。图8展示了Istio的安全架构和运作流程。 图8 Istio安全架构 1.认证 Istio提供如下两种类型的身份认证。 传输认证:也叫作服务到服务认证。这种方式的认证是通过双向TLS(mTLS)来实现的,即客户端和服务端(或者是调用者和被调用者)都要验证彼此的合法性。 来源认证:也叫作最终用户认证,用于验证终端用户或设备。Istio使用目前业界流行的JWT(JSON Web Token)作为实现方案(在配置项上Istio提供了扩展性,但在撰写本书时仍然只支持JWT)。 这两种认证的工作原理类似,都是将来自平台的认证策略存储起来,然后通过Pilot分发给Envoy代理,如图9所示。 图9 认证架构 2.授权 Istio的授权功能沿用了Kubernetes中的授权方式:RBAC(Role-Based Access Control,基于角色的访问控制)。它可以为网格中的服务提供不同级别的访问控制。比如命名空间级别、服务级别和方法级别。 图10显示了授权的工作方式。运维人员编写授权策略的清单文件并将其部署到平台(Kubernetes)。Pilot组件会获取策略信息并将其保存到自己的配置存储中,同时监听授权策略的变更情况,以便及时更新。然后Pilot会把授权信息分发给Envoy代理。Envoy在请求到达的时候,评估当前的请求是否合法并作出相应的返回。 图10 授权架构 与安全相关的配置涉及很多细节,我们会在后面的练习章节有针对性地进行具体介绍,以便读者可以通过演练加深理解。 06 小 结 本章主要介绍了Istio的理论知识。Istio作为一个开源的服务网格产品,提供了统一的方式去管理流量、设置安全和监控等服务治理的能力。 Istio的架构分为数据平面和控制平面,这种优雅的设计使得各个组件充分解耦,各司其职,这就是很多人将它称为第二代服务网格产品的原因。数据平面即Envoy代理,负责流量的接管;控制平面包含了Pilot、Mixer、Citadel和Galley,它们分别负责流量控制、策略控制、安全加固和数据收集。通过这些组件的协同工作,Istio顺利地完成了流量管理、策略和遥测、可视化和安全这4大功能。 第3章将进入实践阶段,搭建Istio的开发环境并完成它的安装和部署。 Istio实战指南 作者:马若飞 推荐理由: Service Mesher社区成员,作为Service Mesh的布道者; 该社区成员对于Istio的了解和认知都具备一定的权威性。 。 本书是Istio服务网格技术的入门图书。全书共分为10章,深入浅出地介绍了Istio的相关知识,结合大量的示例,清晰而详细的阐述了Istio的4大特性:连接、策略、可视化和安全。本书的第1章介绍了服务网格的起源和发展,第2~4章介绍了Istio的基本概念和安装。从第5章起通过实例练习的方式介绍了Istio的流量管理等内容,并把Istio应用到真实的项目开发中,帮助读者进一步理解概念。 - END -
经过了整整三个月的努力,我终于将这本已在心中酝酿了很久的专栏写完了。这件事真是一种很奇特的经历,整个过程既让人觉得很纠结,很惶恐,也令人感到很兴奋,很快乐。我个人认为,在如今的互联网上,人们只要能善用搜索引擎,基本上就可以找到自己想要了解的任何信息了。因而在这个时代,写书的目的已不应该只是单纯地普及知识了,它应该更多地表现作者自己的一些观点和经验。因为只有这种个性化的东西才是任何人工智能的产物所无法替代的,这些东西当然未必正确,但它能刺激思考,引发讨论,使人沉淀,而这些恰恰是如今互联网上所缺少的。所以,我希望通过这个专栏来介绍一下个人对Markdown这种写作方式的看法和使用经验,以此来抛砖引玉,引起大家对Markdown更多的关注,进而将软件开源的精神推广至写作领域。毕竟,文字作品才是我们人类开发时间最长,数量最多的一种“软件”。 01 为什么要写该专栏? 写这专栏的最初念头源自于一次在Facebook上的抱怨。由于我自己是一个Markdown的重度使用者,在日常做笔记、写文章、翻译书籍时,经常需要搜寻各种使用Markdown写作的解决方案。而与此同时,市面上的各种博客、论坛、云端笔记服务也都纷纷加入了对Markdown的支持,这说明使用这门标志语言的用户并不在少数,但我却惊讶地发现自己市场上竟然找不到一本介绍Markdown的专著。于是就在Facebook上分享了下面这个想法: 我是觉得markdown写作可以延伸出很多东西啊,写论文涉及LaTeX、Mermaid等,制作电子书涉及gitbook ,建构博客涉及Hexo,居然没人写本书!可惜了…… 很自然地,这条想法分享的下面就有朋友留言建议我“不如你来写吧”。虽然当时我只是在表达自己需要这样一个专栏,最好请某位专业人士来写一本,但与朋友的讨论让我重新审视了自己所分享的这个想法。这个想法实际上说明了我为什么喜欢用Markdown来写作的原因: 第一,Markdown是开源软件,符合开放、自由、专注于任务,便于同行协作的工作哲学。 第二,Markdown符合“数据与呈现样式、用户界面分离”程序设计思维。 第三,Markdown的纯文本特性使我们可以想管理程序员源代码一样管理自己的文字作品。 总结一下,就是Markdown可以让人们“像写程序一样写作”,这让我意识到写这样一本专栏的意义已经不仅仅是介绍一门轻量级的标记语言,而是在推广一种强调自由、开放、合作的价值观和方法论了。而这种价值观和方法论原本就是我多年以来一直在坚持的,如今既然看到没有人写一本关于Markdown的专著,不如就自己来为它的推广做点事吧。 02 专栏内容介绍? 在这本专栏中,我以一篇本科毕业论文的写作过程为导引,介绍了Markdown在完成论文的规划、撰写、修改、发布这些不同任务阶段中的应用。全专栏被分成了六个章节和两个附录: 第1章 使用Markdown写作:在这一章中,我们介绍了Markdown是什么、它有什么优势和劣势以及它所倡导的写作理念。需要说明的是,这一章的内容是为对Markdown一无所知的朋友准备的。如果读者自认为已经对Markdown有所了解,或者不想纠缠于技术概念,想快点进入“如何使用Markdown”的议题,也可以选择跳过这一章。 第2章 写作的前期准备:在这一章中,我们首先介绍了几款值得一试的Markdown编辑器。然后,我们以论文的前期规划为导引,带大家学习了使用Markdown的标记来拟定论文大纲、表列论文的参考资料、并通过设定待办事项来安排写作的进度。 第3章 撰写一篇论文:在这一章中,我们继续以论文的正式写作过程为导引,逐步深入地介绍了其余主要的Markdown标记,以及它们的具体使用。这其中既会包含用来表示段落、强调、引用、代码这些基本元素的原生Markdown标记,也会涉及到与表格、图形相关的扩展标记,以及它们的基本用法。 第4章 谈谈数学问题:在这一章中,我们首先介绍了如何在Markdown文档中插入$\LaTeX$标记,以呈现数学公式。然后,我们会具体介绍如何用$\LaTeX$标记来描述基本四则运算、二项式方程、矩阵运算以及集合运算等数学问题。 第5章 作品的审阅与维护:在这一章中,我们围绕着如何”像维护程序项目一样维护Markdown项目“的议题展开了一系列的讨论。首先,我们介绍了一款可以让人们更专注于文字内容审阅和修改的Markdown编辑器。然后,考虑到Markdown的应用目前尚不够普及的现实问题,为了让更多的人参与作品的审阅,我们为大家介绍了一款专用于转换标记语言格式的工具。最后,为了从时间维度上对项目的修改进行管理,我们也对如何用git版本控制系统对Markdown项目进行管理和维护,做了一个基本介绍。 第6章 Markdown的其他应用:在这一章中,我们为大家介绍了如何用Markdown制作演示文稿、线上电子书以及撰写博客。集中展示了Markdown作为一种写作方式的广泛适用性。 附录A Makefile简易教程:在这篇附录中,我们为大家介绍了Makefile文件的基本写法,以便搭配第5章中介绍的格式转换工具批量地将Markdown文档转换成其他格式的文档。 附录B 了解一下Node.js:考虑到本专栏介绍的gitbook和Hexo都要基于Node.js运行环境来部署,而这个运行环境如今已经形成了如此庞大的软件生态系统,我认为有必要用一篇附录专门介绍一下Node.js以及它的安装和配置。 03 开源运动简介 在读者正式开始阅读本专栏之前,我还希望对开源运动做一个简单的介绍。从本质上来说,软件的开源事实上是针对软件工程问题提出的一个解决方案。而说起软件工程这档事,我相信计算机和软件工程专业的学生应该都不陌生,我们早年间都背下来过一些流水线式的项目开发流程。 首先是在项目定义阶段要做可行性分析、需求分析这些事,再来进入到开发阶段要做概要设计、详细设计、设计实现等步骤,最后是维护阶段的运行与维护。仿佛软件开发就像《摩登时代》里的工厂流水线,分工明确、井然有序。目的是让程序员成为流水线上的工人,使他们成为生产机器中的一个螺丝钉,无需创意、无需个性,只要够熟练就行。很多大型企业的开发项目也确实是按照这个路数走的,很多程序员被戏称“码农”也正是这个原因。 但是,等我工作了若干年之后再来看这套工程管理模型,感觉这基本上就是个“计划经济”。首先,绝大部分软件在开发初期根本不会有那么多人参与,通常是两三个人要做所有的事情。分那么多阶段,那么多工序是没有意义的。再来,就算是有了一定规模的公司,他们会让很多人参与一个项目,往往都是为了维护已有的软件,程序员的主要任务是维护该软件的版本,并在此基础上开发新的版本,在这种情况下,他们其实已经有了现成的开发框架,这些人只需要根据特定的需求将该框架填充成具体的专用软件即可。 对于原框架来说,这更像是增加了一个特性分支。例如说,JetBrain团队开发了一款名为IntelliJ IDEA的通用IDE,而Android Studio则又是专用于Android开发的IDE,它就是基于IntelliJ IDEA开发出来的。我们可以将它视为IntelliJ IDEA项目的一个分支。这更像是某种意义上的维护工作,它的可行性,需求是一目了然的,也不需要概要设计,只需要按照其原有的插件体系把功能实现即可。然后,bug修复才是这个项目的主要工作。所以,如何让那么多人一块有效地,有序地发现bug、报告bug、解决bug成为了主要问题。 上世纪的七十年代和八十年代爆发了两次所谓的软件危机[1],那时候的许多软件项目都出现了预算超支、发布时间严重拖延、质量管理缺失等问题。大量的项目因此而失败,问题很严重,以致于北约这样的组织都要专门开会来讨论这个问题。但这些高高在上的人物讨论出来的东西就是我们上面所说的软件工程理论。按照《人月神话》作者佛瑞德·布鲁克斯(Frederick P. Brooks)的说法,这需要大量的银弹、人员来支撑,只有大型企业,科研机构才能做到。当然对于这些机构来说,这套理论确实能解决一些问题。尤其在互联网时代来临之前,这似乎也是我们唯一的选择。 但大型机构都存在官僚主义的问题,组织繁杂、沟通成本高昂、开发效率低下,随着时间的推移它们往往都会离人们的实际需求越来越远,就像是那些中世纪大教堂,高高在上、脱离现实地定期发布信息,内容庞杂而滞后,对于其周边的、下游的开发者和中小软件开发是毫无帮助。于是Linux之父林纳斯·托瓦兹(Linus Torvalds)在独自开发Linux内核的过程中走出了一条新的道路:开放源码、社区协作。 简单来说,就是由软件项目的创始人开发出一个不成熟的初始版本,然后将其丢到一个开发者社区中,让其在开发者自发性的修改和分享中自然生长。最后,项目创始人会根据其生长情况将自己认可的部分纳入到项目的主分支中。这种乱中有序的组织形式让Linux项目获得了巨大的成功,给软件开发的工程管理提供了一种新的实践经验。 无独有偶,上世纪九十年代末期,网景公司[2]在与微软公司的浏览器大战中败下阵来,面临着公司的生存危机。他们决定试试开源的方式。埃里克·雷蒙(Eric Raymond)就是网景公司当时的策略顾问,他在帮助网景公司的过程中根据自己的新的写出了他那本闻名天下的代表作:《大教堂与集市》。这本专栏为开源运动奠定了理论基础,它系统阐述了互联网条件下的协作模式,同行审评的优势,回答了《人月神话》中提出的银弹问题,人员管理成本问题。如今,微软、苹果这些曾经的大教堂都纷纷加入了开源领域。开源作为软件工程的另一种组织形式已经毋庸置疑。 最后需要提醒的是,开源运动和理查德·斯托曼(Richard Stallman)领导的自由软件运动[3]不是一回事。开源运动更多的是一种软件工程的管理方式,虽然也强调开放源码、免费分享的自由精神,但并没有太强烈的道德要求。而自由软件运动则更像是一种宗教性的意识形态运动,他们对于“确保用户使用软件的自由”有着一种近乎苛刻的道德要求,譬如,他们会要求所有基于自由软件开发的产品都不仅要开放源码,还必须要允许用户修改该产品软件的源码,或变更其硬件的使用方式,让用户真正地享有“自由”,这难免让人觉得有一些乌托邦式的理想主义。而在我个人看来,如此激烈的主张在客观上反而会给源代码的分享带来了不少的阻力。 04 使用Markdown写作 本章提要 在这一章中,我们将会对Markdown做一个概念性的简单介绍。具体来说,我们会讨论Markdown是什么、它有什么优势和劣势以及它所倡导的写作理念。需要说明的是,本章是为对Markdown一无所知的朋友准备的。如果你自认为已经对Markdown有所了解,或者不想纠缠于技术概念,想快点进入“如何使用Markdown”的议题,也可以选择跳过本章内容,直接从下一章开始阅读。但是,如果你想更完整地了解我对这门技术的观点,还请你稍微花点耐心读一下这一章的内容,毕竟正如一千个人的心中有一千个哈莫雷特,对于同一门技术,每个人的理解也都略有不同。 05 Markdown是什么? Markdown是约翰·格鲁伯(John Gruber)1 与亚伦·斯沃茨(Aaron Swartz)2 于2004年共同开发的一门轻量级标记语言(Lightweight Markup Language,简称LML)。也就是说:首先,Markdown是一种标记语言,可以用任意的文本编辑器来进行输入和修改,并以纯文本的格式保存在计算机中。 其次,这是一种“轻量级”的语言,这意味着相对于RTF、HTML、TeX这些格式更丰富的标记语言来说,Markdown的格式更为简单易用,也更接近于自然语言。这让它更适合用来写作和分享。格鲁伯们开发这门语言的目的就是为了鼓励人们先使用一种易读易用的纯文本格式来编辑并存储文档,然后再根据实际需要将文档转换成(X)HTML、docx和PDF等格式。Markdown在设计上非常重视可读性。换句话说,Markdown的设计目标之一是要让人类能直接从字面上对其进行阅读,不需要太多精力学习一些格式化指令标记(譬如RTF与HTML)。 1 约翰·格鲁伯是一位来自美国宾夕凡尼亚州的作家、博客编者、用户界面设计师及Markdown发布格式的发明者。2 亚伦·希勒尔·斯沃茨是一位著名的美国计算机程序员、企业家、作家、政治活动者和互联网黑客主义者。他参与开发了RSS网上信息源发布格式、Markdown文本发布格式、知识共享组织、web.py网站开发框架,同时是社交媒体Reddit的联合创始人。 事实上,Markdown最初的实现只不过是格鲁伯参考现行电子邮件的标记格式和一些早期的标记语言(譬如Setext、Texile等),编写出的一个可将用Markdown语法编写的文档转换成有效的、结构良好的(X)HTML格式的Perl脚本程序:Markdown.pl。该脚本既可以单独使用,也可以被用作Blosxom这类博客系统的插件,或者BBEdit这类编辑器的文本过滤器。但随着时间的推移,Markdown已经被许多人用Perl或其他编程语言重新实现,市面上陆续出现了许多不同版本的Markdown实现。 同时,人们也在Markdown基本语法的基础上开发出了许多额外的功能,例如表格、脚注、列表以及代码块等。这其中有些功能已经偏离了这门语言最初的实现,带来了语法规范上的含糊不清,这些问题促使Markdown的标准化问题被提上了议程。当然,值得一提的是,作为Markdown的创立者,格鲁伯并不赞成完全标准化,他认为:“不同的网站(和人们)有不同的需求。没有一种语法可以让所有人满意。” 以我写这本专栏时3 所查到的资料,Markdown标准化的最新进展是,2016年3月发布的RFC 7763和RFC 7764这两份文件。其中,RFC 7763文件从原始变体引入了MIME类型text/markdown。而RFC 7764文件则讨论并注册了MultiMarkdown、GitHub Flavored Markdown(GFM)、Pandoc、CommonMark和Markdown等不同的实现版本。 3 即2019年03月。 06 Markdown的优势与劣势 如今,Markdown的使用者早已不只是写程序文档的程序员,它在国际上已经受到越来越多编辑和写作者的青睐。用Markdown来写作和编辑文章在网络时代有着超乎想象的优势。下面,我们就来具体讨论一下这些优势: 语法简单易读:由于Markdown的语法简洁明了,且在写过程中基本不需要键盘以外的其他设备操作,让人们可以更专注于写作本身,这将带来很大的效率提升。关于这一点,我稍后会在下一节介绍Markdown的基本写作理念时做更进一步的讨论。 文本格式存取:在我个人看来,能以纯文本格式来处理并存储文档是Markdown最大的优势。我们后续介绍的大部分优势都与这一特性有着或多或少的联系。简而言之,Markdown的纯文本特性给它带来了极强大的兼容性,我们可以用任何文本编辑器来处理Markdown文档,不用担心不同编辑软件之间的横向兼容问题(譬如微软的Word和苹果的Pages之间的兼容),以及这些软件自身升级所带来的纵向兼容问题(譬如旧版Word就打不开新版Word的默认格式docx)。另外,如果你使用的操作系统是Linux/Unix或MacOS的话,还有大量针对文本的系统工具可以用(譬如diff、sed等),这些工具都会给文档的存取、搜索与传输带来极大的方便。 便于格式转换:由于Markdown是以纯文本的形式存储在计算机中的,这也赋予了它很强的可编程性,人们可以轻松地为其编写各种格式转换工具。经过了许多人的共同努力,到目前为止,我们已经可以轻松地将其转换成(X)HTML、PDF、epub、mobi、docx等格式了。关于这方面的内容,我们将会在第四章中详细讨论。 利于网络协作:有过远程办公经验的人都知道,我们在网络协作过程中首先会遇到的通常是平台相关性问题,譬如你用的是Windows上的Word。我用的是MacOS上的Pages,他用的是Ubuntu Linux上的WPS,经常会彼此打不开对方的文件,或者打开了对方的文件,却由于各自操作系统上支持的中英文字体不同而导致排版惨不忍睹,甚至完全乱码。这一切都会由于上面提到的Markdown的纯文本特性而得到解决。再来就是网络协作中会遇到的另一个问题,那就是协作成员可能会同时对同一份文件做出不同的修改,这就需要用到版本控制。市面上似乎所有的版本控制系统,无论是CVS、SVN还是Git,优先支持的都是纯文本格式的文档,我们完全可以像管理程序项目一样对Markdown文档进行各种版本操作。关于这方面的内容,我们将会在第五章中进行更为详细的讨论。 除此之外,由于Markdown本身就是个开源项目,任何人都可以对其实现进行修改、重构和扩展,所以有人用它写程序项目的文档,有人用它构建博客平台(譬如Hexo等),有人用它制作电子书(譬如gitbook等)。总而言之,在使用了Markdown之后,我们可以将程序设计领域中的开源思想完全应用于写作领域,实现在互联网范围内的同行审阅、分享与讨论,以改善作品质量、促进整体进步。 当然,任何人、事、物都会在展现其优势的同时呈现出一些劣势。而且优势和劣势通常都来自于同一个特性,是优势还是劣势完全看这个特性所发挥的面向。下面我们就来看看Markdown具有那些劣势,或者说它不适合被用来做哪些事: 国内使用尚不普及:虽然这些年Markdown在国内受到了越来越多的重视,但在一些关键领域,比如大部分出版社还是会要求你提供Word版本的稿件,哪怕是一些出版计算机书籍的出版社也是如此,这就说明这种写作方式的普及远未达到理想的程度。 不适合用来做排版:Markdown的语法设计是为了让人们专注于写作内容,所以并不适合用来做复杂的排版,比如各种印刷字体的设置、复杂的表格、图片的文字环绕等。这些需要我们去学习一些专用于排版的工具,譬如LaTeX,用它们搭配Markdown使用。 周边工具学习成本较高:Markdown的周边工具非常多,譬如用于格式转换的pandoc、用于排版设计的LaTeX、用于发布HTML格式电子书的gitbook、用于构建博客的框架Hexo等。每一项工具都可以被视为一门独立的技术,如果全都要掌握,面面俱到,那么学习成本将是非常高昂的。所以,我们要根据自己的需要有选择地进行学习。 所以说,所有的机制、框架和工具最终都要落实到具体的使用上,而“如何使用”基本上是使用者根据应用场景所做的判断。一件工具是发挥它的优势,还是呈现出它的劣势,就全凭使用者如何做出判断了。 07 基于Markdown的基本写作理念 在介绍完Markdown的优势和劣势之后,我们再来进一步讨论“为什么应选择使用Markdown来写作”这个问题。首先,我想请大家先一起来回顾一下:在使用纸和笔为主的时代,我们是怎么写作的。相信那个时代还并不遥远。大家应该都还记得我们的写作大致上是按照以下步骤来进行的: 在脑海中构思作品的整体方向和大致内容。 在一张纸上列出作品的大纲,以确定各章节的标题。 以大纲确定的各章节标题来编写作品内容,写出初稿。 然后将初稿的复印件送给相关人士审阅,收集反馈。 根据审阅者的反馈修改作品,写出最终稿。 将最终稿交给出版社进行排版设计,并出版作品。 在上述过程中,我们在每个步骤中都不需要去考虑其他步骤的事。譬如,在写大纲的时候,我们只需要是思考各章节的标题是什么?不需要考虑各章节的标题应该是什么字体、字号和颜色。在送给老师和编辑审阅的时候也不需要考虑他们用什么电脑,电脑里装了什么系统。排版编辑也不会在排版设计阶段抱怨我们那些既自以为是,又混乱不堪的排版增加了他太多额外的工作量。但这些问题在我们使用了Word或Pages这样的文字处理软件之后却都一一成了常见问题,这是为什么呢?原因就在于这些文字处理软件的功能太强大了。是的,软件功能太强大也会带来问题。因为这些软件功能会诱惑我们在写作的同时兼顾很多事,这些事会对写作的步骤形成干扰。譬如,这些功能会诱惑我们在编写章节标题的时候去考虑它们的字体、字号和颜色。在写各章节内容的时候就会去考虑段间距、行间距、文字对齐或表格样式等。但是,写作是一个需要保持思维连续专注的工作,如果你总是同时在思考好几件事,写作思维就会被打得支离破碎,这是非常影响写作质量的。当然,我们确实可以运用自控力让自己先专注于当前的写作步骤。但会让我们有意识地用到自控力这件事本身就证明了这些功能的干扰。毕竟我们在用笔和纸写作的时候,连想都不会去想到这些,除非你是在用一套水彩笔写作。Markdown的简单易用就是让写作回归于纸和笔的状态,尽量排除一切工具的干扰,让我们专注于写作本身。除了能让写作回归其本真,提高我们对写作的专注力之外,使用Markdown写作的另一个基本理念是:像写程序一样写作。Markdown的设计完全符合我们在编写程序时所要遵守的一些原则: 每次只做好一件事:如前所述,Markdown只专注于与写作相关的事情。 避免平台依赖,确保可移植性:Markdown以纯文本格式存储,不依赖于任何操作系统和编辑平台。 不重复发明轮子:使用Markdown编写的文本文件可以作为其他程序的输入数据,这确保了我们可以使用现有的工具对Markdown文件执行进一步的处理,譬如用LaTeX排版,用Hexo发布博客等。避免安装一些巨大而臃肿,却百分之八十功能永远都不会用到的昂贵软件。 基于这些原则,我们就可以将所有可用于程序开发的软件设计和工程经验运用到文字创作上,更好地发挥计算机赋予我们的优势,让我们的写作过程更为规范,更符合互联网时代的工作形态。 本文小结 在文中,我们首先介绍了Markdown的概念、设计理念和标准化的过程。然后,我们罗列了这门标记语言的优势和劣势。最后,我们基于这些优势和劣势阐述了基于Markdown的基本写作理念。 简而言之,Markdown是一门专为写作而设计的、自由开源的轻量级标记语言。它的语法简单明了,非常接近于人类的自然语言,有助于我们将注意力集中于写作本身。另外,由于它的纯文本特性,使它具备了非常好的开放性和可编程性,这让我们可以像使用编程语言一样用它来进行写作,即先写完内容,再用其他各种工具来对其进行处理。而且在整个写作过程中,我们都可以运用之前作用于程序开发的软件工程思想来管理写作进度,执行版本控制以及处理作品的发布问题。从下一章开始,我将会以一篇专业论文的产生过程为例来具体介绍Markdown的使用,看看像编程一样写作的过程究竟是怎样的一种体验。 先领券再购买 优惠多多哦 - END -
异 步 社 区 4.X 版 本 伴随着异步社区4.X版本升级,社区功能在内容型态和功能都做出了不小的改版和优化。如果你近期登录了异步社区,肯定发现了不小的更新,说不定已经体验了新功能。如果你还没有探索到新功能的精髓,就收下异步君这份总结吧。首先敲重点,这些你常用的功能点值得关注。 UI界面全面更新 新增富媒体电子书功能,电子书阅读界面全面优化 新增全文搜索功能,您可以搜电子书内关键词同步学习 新增专栏产品,可以边听音频边看图文学习 购买纸质书免费获得本书e读版电子书 积分可以直接抵扣现金直接付款了 UI界面全面更新 这次升级后,异步社区的界面全面优化,从首页、图书详情页、以及个人中心都全面调整。 1. 首页 左侧是产品导航,右侧为个人中心,分别是【搜索】、【书架】、【签到】、【消息】、【购物车】和个人中心。 2. 您的【图书详情页】全面更新 图书产品型态更加清晰,值得注意的是购买【纸书】和【纸书+e读版电子书】价格相同,相当于买纸书送e读版电子书(如果你是电子书控,只想买电子书,那么同样的,【下载版电子书】和【e读版电子书+下载版电子书】价格也是一样儿一样儿的!),省了一半价格的小技巧get到了吗? 图书的功能区更加简洁,统一放到了图书封面的下方。在第一屏可以展现更多内容,新增标签【详情】、【目录】、【配套资源】、【评论】、【电子书下载】、【勘误】【商品】。 3. 个人中心 将社区的产品型态归类和汇总,您领取的全部优惠券都在这里可以直接兑换。 功能升级 这次升级后的主要功能,让您在线阅读电子书和搜索变得更加便利,真的值得一起体验。 1. 您的电子书阅读界面全面升级 新增富媒体电子书,边看电子书可以同步观看配套视频。 【菜单栏】在统一在阅读器右侧, 新增【书签】、【字号】、【换肤】功能。 使用【书签】功能更加完善,后续还会增加记笔记和在线评论功能。 2. 新增“内容搜索”功能,支持全站全文内容搜索 点击图片 立即体验进入搜索框,选择【内容搜索】,您搜到的不仅仅是书名的部分,异步社区的所有电子书内容关键词,您都可以全部搜索到哦。 3. 新增专栏,您可以边听音频,边学习IT知识产品了 异步专栏是本次全新推出的在线阅读产品,聚集热点主题,内容每周更新。我们遴选IT知识领域公认的高人,打造出为期1-3个月持续更新的高品质内容,并以交付用户价值为终极目标,在专栏生产的每一个环节把控品质。同时一次支付费用,可以终身观看。专栏支持音频功能,您可以边听边学习。打开【功能区】-【目录】,带有音乐标识的目录页都配有音频哦。 异步专栏目前已有2门专栏课程上线,欢迎您来体验,如果您意向分享也可以联系我们投稿哦。 4. 积分可以直接抵扣现金了 每天签到以及在社区内阅读、购买下单、提交勘误,都可以获取一定的异步积分,当你下单时,可以全部转化为现金抵扣订单额。 鸣 谢 虽然我们的研发小伙伴们奋战了几个月上线这个版本,但由于是重新构架系统,难免存在一些小问题。欢迎您来报告bug!确认后我们会向您赠送积分或优惠券以表谢意。 - END -
2019 年微软 Build 开发者大会在雷德蒙德召开。继将 Bash shell、原生 OpenSSH、WSL 引入 Windows,以及在微软商店提供 Ubuntu、SUSE Linux 和 Fedora 等发行版,微软又宣布了一个重大的决定 —— 将完整的 Linux 内核引入 Windows 10。 按照微软的说法,到时 Windows 10 将包含内置的完整定制版 Linux 内核,为最新的 WSL 提供更好的支持。Linux 内核版本为 4.19,是一个长期稳定版。随着 WSL2 正式发布,WSL2 用的 Linux 内核也将完全开源。近些年,微软公司来雇佣了很多 Linux contributor,给微软带来了很多业界领先的 Linux 技术,所以才会有去年的 WSL,这样的举动也必将吸引更多的人才加入。 Linux内核是使用最广泛的开源内核,在服务器和智能手机领域处于统治地位,物联网、大数据、云计算和人工智能等热点技术也离不开Linux内核。对于商业公司而言,采用开源的Linux内核可以享受很多好处,比如节约成本,可以利用行业先进的技术,还可以根据自己的需求定制、修改内核。对于个人而言,从Linux内核中可以学习先进的设计方法和编程技术,为内核贡献代码可以证明自己的技术实力。 可是,当我们准备学习Linux内核时,会发现Linux内核的代码庞大而复杂,在没有专业书籍指导的情况下,读懂代码是一件非常困难的事情。如何学Linux内核?小编推荐这本《Linux内核深度解析》,书中剖析的代码基于Linux 4.12版本,同时,它基于ARM64硬件平台,将两者结合。 作为一个优秀的开源系统,Linux在业界有很广泛的应用。从1994年发布1.0正式版本开始,Linux内核一直在发展,代码越来越庞大,参伍以变,错综其数,要想深入掌握它,并不是一件轻松的事情。 本书作者余华兵从事Linux内核开发工作十余年,有着丰富的实践经验,使用过不同的版本和硬件平台,从2.x到4.x,从MIPS、x86到ARM。伴随着研发大楼的华灯,当年初出校门的学子,如今萧萧两鬓生华,成为一个在Linux领域有深厚积累的专家。相信这本书会让你收获满满。 对于从事应用程序开发的软件工程师,是否有必要学习内核呢? 应用程序通常使用封装好的库,看起来似乎和内核没有关系,但是库是在内核提供的系统调用的基础上做了一层封装。读者如果研究了库函数和内核配合实现库函数提供的功能,那么对软件运行过程的理解将会更深刻,个人的技术水平也将会提升到新的高度—能够设计开发出高质量的应用程序,在软件运行过程中出现问题时可以快速地分析定位。另外,内核代表了软件行业的最高编程技术,这些编程技术也适用于应用程序。是否有必要学习内核呢?答案是肯定的。 为什么要学Linux4.X? 早些年数通领域各厂商(包括思科和华为)的操作系统,都是基于传统的嵌入式操作系统(如典型的VxWorks操作系统)开发的。2010年以后,Linux内核在数通厂商中快速生长,迅速成为数通设备网络操作系统的内核。就像基于Linux内核的安卓系统已经成为智能手机领域的领头羊一样,在数通设备领域,Linux内核也大有一统江湖之势。 我们在基于Linux内核开发网络操作系统的过程中遇到的某些技术问题,在Linux内核的演进过程中已经提供了解决方案。Linux 3.11版本ARM架构支持巨型页机制,解决了ARM架构的进程访问大内存的性能问题。Linux 3.14版本引入ZRAM内存压缩技术,用于节省内存空间,这项技术适合在内存容量小的设备上使用。Linux 2.6.29版本引入的squash文件系统和Linux 3.18版本引入的overlay文件系统,在闪存容量小的设备上解决了存储空间不足的问题。squash文件系统可以压缩数据,但是它是一个只读的文件系统,而设备需要一个可写的文件系统,我们在Linux内核找到了解决方案—使用overlay文件系统在squash文件系统上面叠加一个可写的文件系统。这些拿来即用的Linux内核技术,在这本书中都有提及。 近年来Linux发展迅速,公司最早使用的Linux内核是2.6版本,从2011年发布3.0版本开始到2018年年底发布4.20版本,Linux一共发布了41个版本,技术发展日新月异。很多技术虽然有众多的工程师在使用和总结,但仍相对零散,基于Linux 4.x的图书更是少之又少。 本书特点是什么吗? 本书剖析的代码基于Linux 4.12版本,发布于2017年,是Linux内核史上变动较大的版本之一。基于这个版本进行内核代码解析并出版成书,是比较新颖的,既不失通用性,又兼顾4.x版本中引入的不少新技术点。同时,它基于ARM64硬件平台,将两者结合的书,目前还是比较少的。 另外,本书没有过多地介绍操作系统的基础原理,而更多地是以实际代码来解读在Linux内核中是如何实现操作系统的各个子系统的。对于熟悉操作系统基础的读者来说,可以快速地切入到具体代码的理解与实现中。从内核引导和初始化开始,到进程管理、内存管理、中断/异常/系统调用、内核互斥技术和文件系统,本书比较系统地对内核代码进行了深度解析。 Linux内核的知识点相当繁多,很难在一本书中面面俱到,也没有必要。所以,在这本书中,看似不经意间逐层展开的知识点,都是比较基础和常用的。作者以他的实践经历尽量通俗地进行解读,并抓住了其中的重点,可以让读者在实际的开发、调试和维护工作中学以致用。 “行是知之始,知是行之成”,学习Linux内核技术尤其如此。要真正消化理解Linux内核,离不开大量的工程实践。希望本书可以成为你前进路上的好帮手! 如何读这本书? 本书介绍4.12版本的Linux内核,建议你在阅读本书时到Linux内核的官方网站中下载一份代码,对照代码学习。推荐使用“Source Insight”软件阅读代码。 Linux内核支持多种处理器架构,处理器架构特定的代码放在“arch”目录下。ARM处理器在手机和平板电脑等移动设备上处于统治地位。ARM处理器从ARMv7演进到支持64位的ARMv8,ARM公司重新设计了处理器架构,ARMv8定义了AArch64和AArch32两种执行状态,AArch64是64位架构;AArch32是32位架构,兼容ARMv7。因为ARMv8和ARMv7的差别很大,所以Linux内核把ARMv8和ARMv7当作两种不同的处理器架构,ARMv7架构的代码放在“arch/arm”目录下,ARMv8架构的代码放在“arch/arm64”目录下。人们通常把ARMv8架构的AArch64执行状态称为ARM64架构。本书在介绍Linux内核时选择ARM64处理器架构。 学习本书,需要具备ARM64处理器的基础知识,推荐以下两篇文档,读者可以从ARM公司的网站下载。 (1)“ARM Cortex-A Series Programmer’s Guide for ARMv8-A”:这篇文档接近300页,适合入门学习。 (2)“ARM Architecture Reference Manual ARMv8, for ARMv8-A architecture profile”:这篇文档有6000多页,写得很详细,适合当作工具书来查询。 学习内核,关键是要理解数据结构之间的关系和函数调用关系。内核中数据结构之间的关系错综复杂,函数调用层次深,有些函数中的分支非常多,一个函数就可能涉及很多技术,这些都是初学者学习中的障碍。作者建议读者在学习时抓住主要线索,弄清楚执行流程,刚开始不要过多关注函数的细节。为了方便学习,作者绘制了很多图来描述数据结构之间的关系和函数的执行流程。另外,作者在介绍每种技术时会先介绍使用方法,从使用方法开始学习技术,相信会对读者理解技术有很大的帮助。 全书内容共分为6章。 第1章介绍内核的引导过程,本书选择常用的引导程序U-Boot,读者可以从德国DENX软件工程中心的网站下载U-Boot的代码,对照学习。 第2章介绍内核管理和调度进程的技术原理。 第3章介绍内核管理虚拟内存和物理内存的技术原理。 第4章介绍内核处理异常和中断的技术原理,以及系统调用的实现方式。 第5章介绍内核实现的各种保护临界区的互斥技术。 第6章介绍内核的虚拟文件系统,内核使用虚拟文件系统支持各种不同的文件系统。 书名:《Linux内核深度解析》 作者:余华兵 编辑推荐: 基于ARM64架构的Linux 4.x内核; 大量图例描述数据结构之间的关系和函数的执行流程; 结合代码分析,以通俗化语言全面剖析Linux内核。 本书基于4.x版本的Linux内核,介绍了Linux内核的若干关键子系统的技术原理。本书主要内容包括内核的引导过程、内核管理和调度进程的技术原理、内核管理虚拟内存和物理内存的技术原理、内核处理异常和中断的技术原理,以及系统调用的实现方式等。此外,本书还详细讲解了内核实现的各种保护临界区的互斥技术,以及内核的文件系统。本书内容丰富,深入浅出,通过大量的图例来描述数据结构之间的关系和函数的执行流程,并结合代码分析,引导读者阅读和理解内核源代码。 - END -
TIOBE公布了2019年5月编程语言排行榜,头部整体编程语言整体排名变化不大,前十名为Java、C、C++、Python、Visual Basic .NET、C#、JavaScript、SQL、PHP和汇编语言。 本月值得注意的是,R语言跌出前20名,这是R语言进入TOP20三年以来首次跌出前20,而Python继续缩小与C++的差距。 尽管Swift正快速增长,但是与Objective-C还是有不小的差距。另外,虽然PHP保住了自己第九名的位置,但是相比于 去年同期已经下降了2个位次。 Go与上个月相比下跌了一名,但整体变化比较稳定。 以下为前20名完整榜单 5月上市畅销新书 Linux内核深度解析 书名:《Linux内核深度解析》 作者:余华兵 编辑推荐: 基于ARM64架构的Linux 4.x内核; 大量图例描述数据结构之间的关系和函数的执行流程; 结合代码分析,以通俗化语言全面剖析Linux内核。 本书基于4.x版本的Linux内核,介绍了Linux内核的若干关键子系统的技术原理。本书主要内容包括内核的引导过程、内核管理和调度进程的技术原理、内核管理虚拟内存和物理内存的技术原理、内核处理异常和中断的技术原理,以及系统调用的实现方式等。此外,本书还详细讲解了内核实现的各种保护临界区的互斥技术,以及内核的文件系统。本书内容丰富,深入浅出,通过大量的图例来描述数据结构之间的关系和函数的执行流程,并结合代码分析,引导读者阅读和理解内核源代码。 操作系统导论 书名:《操作系统导论》 作者: [美] 雷姆兹·H.阿帕希杜塞尔( Remzi H. Arpaci-Dusseau), [美]安德莉亚·C.阿帕希杜塞尔(Andrea C. Arpaci-Dusseau) 译者:王海鹏 编辑推荐: 本书作者是美国威斯康星大学计算机系教授(夫妇),美国计算机OS教育领域的名宿,经常在美国各个大学应邀客座。 作者坚持开放教材的理念,英文原版在国外盛名日隆,不仅CS学生,湾区技术界的读者也很推崇这本书,评价为“最好的开放式操作系统教材”。 这是一本关于现代操作系统的书。主题分为三个主要的概念:虚拟化、并发性和持久性。全书介绍了所有现代系统的主要组件,包括调度、虚拟内存管理、磁盘和I/O子系统、文件系统,甚至一个简短的介绍分布式系统。本书内容全面,非常易于学习,很适合用于老师的教学和高校学生自学。 Kafka Streams实战 书名:《Kafka Streams实战》 作者:[美] 小威廉 · P. 贝杰克(William P. Bejeck Jr.) 译者:牟大恩 编辑推荐: Apache Kafka作者作序推荐作品; Kafka Streams技术的全面学习指南; 大数据流式处理从入门到实践 。 本书教读者在Kafka平台上实现流式处理。在这本易于理解的书中,读者将通过实际的例子来收集、转换和聚合数据,使用多个处理器,处理实时事件,甚至可以使用KSQL 深入研究流式SQL。本书最后还讲解了Kafka Streams应用程序的测试和运维方面的内容(如监控和调试)。 PyTorch深度学习 书名:《PyTorch深度学习》 作者:[印度]毗湿奴•布拉马尼亚(Vishnu Subramanian) 译者:王海玲 刘江峰 编辑推荐: PyTorch是Facebook于2017年初在机器学习和科学计算工具Torch的基础上,针对Python语言发布的一个全新的机器学习工具包,一经推出便受到了业界的广泛关注和讨论,目前已经成为机器学习从业人员首选的一款研发工具。 《PyTorch深度学习》是使用PyTorch构建神经网络模型的实用指南,包括PyTorch与深度学习的基础知识、神经网络的构成、神经网络的高级知识、机器学习基础知识、深度学习在计算机视觉中的应用、深度学习在序列数据和文本中的应用、生成网络、现代网络架构,以PyTorch与深度学习的未来走向。 Python 3破冰人工智能 从入门到实战 书名:《Python 3破冰人工智能:从入门到实战》 作者:黄海涛 编辑推荐: 基于Python 3.6构建了近140个代码案例,全面介绍Python在人工智能中的应用。 数学基础:从历年数学建模竞赛入手,解读人工智能中的数学方法。 编程实践:100余个代码实例,全面讲解网络爬虫、数据存储与数据分析等内容。 算法应用:实战案例辅以丰富图解,详尽分析人工智能算法特性及其应用场景。 本书创新性地从数学建模竞赛入手,深入浅出地讲解了人工智能领域的相关知识。本书内容基于Python 3.6,从人工智能领域的数学出发,到Python在人工智能场景下的关键模块;从网络爬虫到数据存储,再到数据分析;从机器学习到深度学习,涉及自然语言处理、机器学习、深度学习、推荐系统和知识图谱等。 此外,本书还提供了近140个代码案例和大量图表,全面系统地阐述了算法特性,个别案例算法来自于工作经验总结,力求帮助读者学以致用。 - END -
随着BAT、今日头条、京东、抖音等大型互联网公司对Go语言的大范围应用,带动更多互联网企业采取技术跟随战略,Go语言发展前景一片大好。5月20日工业和信息化部信息中心发布《2018中国区块链产业白皮书》,Go语言与区块链成为“数字中国”建设的重要支撑。2018年Go语言与区块链职位月薪11000元以上占整体的95.5%。Go程序员一度成为抢手人群,程序员修炼秘籍,小编带了了一份诚意书单。在书单开始之前,告诉大家一个好消息,有一本Go的新书即将送印,预计5月20日左右上架,希望这样书能被每一位Gopher看到,希望他们能从新的角度了解Go,认识Go,喜欢Go。,敬请期待! Go语言新书预告 书名:《Go语言高级编程》 作者:柴树杉 曹春晖 编辑推荐: 作者是国内第一批Go语言爱好者和Go语言代码的贡献者 提炼大型分布式系统开发的实战经验 聚焦CGO、汇编、Web框架等前沿主题,深入探究Go语法设计的底层实现原理 本书共6章,第1章简单回顾Go语言的发展历史,第2章和第3章系统介绍CGO编程和Go汇编语言的用法,第4章对RPC和Protobuf技术进行了深入介绍,并讲述如何打造一个自己的RPC系统,第5章介绍工业级环境的WEB系统的设计和相关技术,第6章介绍了Go语言在分布式领域的一些编程技术。 GopherChina大会推荐书单 Go语言实战 书名:《Go语言实战》 作者:【美】威廉•肯尼迪(William Kennedy), 布赖恩•克特森(Brian Ketelsen), 埃里克•圣马丁(Erik St. Martin) 译者:李兆海 编辑推荐: Go语言领域技术专家力作 关注语言的规范和实现 为读者提供一个专注 全面且符合语言习惯的视角 Go语言实战目标读者是已经有一定其他编程语言经验,想要开始学习Go 语言或者更深入了解Go 语言及其内部机制的中级开发者。本书会提供一个专注、全面且符合习惯的视角。本书关注Go 语言的规范和实现,涉及的内容包括语法、Go 的类型系统、并发、通道和测试等主题。 Go语言实战主要内容 Go语言的类型系统。 Go语言的数据结构的内部实现。 测试和基准测试。 Go Web编程 书名:《Go Web编程》 作者:【新加坡】郑兆雄(Sau Sheong Chang) 译者:黄健宏 编辑推荐: Go语言Web开发实战教程 囊括了关于Go 本书将教读者运用现代化设计理念构建Go Web应用的方法。阅读本书能让读者学会如何通过依赖注入设计模式来编写测试替身,如何在Web应用中使用并发特性,还有如何在Web服务中创建以及处理JSON数据和XML数据。除此之外,读者还将学会如何尽可能地减少应用对外部框架的依赖,并了解大量与应用测试以及应用部署有关的有价值的生产技术。 本书主要内容 基础知识。 功能测试和基准测试。 并发特性的使用方法。 将应用部署到独立服务器、PaaS云端以及 Docker 的方法。 大量提示、窍门以及技巧。 分布式对象存储——原理、架构及Go语言实现 书名:《分布式对象存储——原理、架构及Go语言实现》 作者:胡世杰 编辑推荐: 本书从云存储的需求出发讲述对象存储的原理,循序渐进地建立起一个分布式对象存储的架构,并且将软件实现出来。全书共8章,分别涉及对象存储简介、可扩展分布式系统、元数据服务、数据校验和去重、数据冗余处理、断点续传、数据压缩和数据维护等。本书选择用来实现分布式对象存储软件的编程语言是当前流行的Go语言。 深入浅出Docker 书名:《深入浅出Docker》 作者:【英】Nigel Poulton(奈吉尔 波尔顿) 译者:李瑞丰 刘康 编辑推荐: 这是一本关于Docker的图书。本书的宗旨是从零开始学习Docker,因此读者无须任何前置知识储备。本书非常适合对Docker感兴趣,希望了解Docker工作原理以及如何正确使用Docker的读者。如果只是学习Docker的使用方法,而不关心其内部实现机制,则本书并不适合。 第一本Docker书(修订版) 书名:《第一本Docker书(修订版)》 作者:【澳】James Turnbull(詹姆斯•特恩布尔) 译者:李兆海 刘斌 巨震 编辑推荐: 这是一本带领读者进入Docker世界的入门书。阅读本书除了能帮助读者理解Docker的基本原理,熟练掌握Docker的各种常见的基本操作之外,还能帮助读者了解Docker的实际应用场景以及如何利用Docker进行开发等话题,比如,如何使用Docker和Jenkins进行测试,如何对应用程序进行Docker化,以及如何构建由Node.js和Redis组成的多容器应用栈。当然,书中也不会忘了最近比较火的Fig——一个Docker编配工具,开发此工具的公司是位于英国伦敦的Orchard Laboratories,前段时间该公司刚刚被Docker收购,继续Fig的开发。 Docker实践 书名:《Docker实践》 作者:【美】伊恩 • 米尔(Ian Miell), 艾丹 • 霍布森 • 塞耶斯(Aidan Hobson Sayers) 译者:吴佳兴 梁晓勇 黄博文 杨锐 编辑推荐: 这本书将从第一部分介绍Docker的基础知识开始,而到了第二部分,我们将把重点放在介绍如何将Docker用到单台机器的开发环境。在第三部分里,我们将介绍Docker在DevOps流水线中的用法,介绍持续集成、持续交付和测试等内容。本书的最后一部分则覆盖了Docker生产实践的内容,重点关注与编排相关的一些备选方案。 软技能:代码之外的生存指南 书名:《软技能:代码之外的生存指南》 作者:【美】John Z. Sonmez(约翰 Z. 森梅兹) 译者:王小刚 编辑推荐: 软件行业泰斗级人物Martin和软件架构师Hanselman作序推荐 凸显技术中人的因素 讲解软件专业的所有软技能 John是软件开发人员的人生导师 这是一本真正从“人”(而非技术也非管理)的角度关注软件开发人员自身发展的书。书中论述的内容既涉及生活习惯,又包括思维方式,凸显技术中“人”的因素,全面讲解软件行业从业人员所需知道的所有“软技能”。 本书聚焦于软件开发人员生活的方方面面,从揭秘面试的流程到精耕细作出一份杀手级简历,从创建大受欢迎的博客到打造你,从提高自己工作效率到与如何与“拖延症”做斗争,甚至包括如何投资不动产,如何关注自己的健康。 本书共分为职业篇、自我营销篇、学习篇、生产力篇、理财篇、健身篇、精神篇等七篇,概括了软件行业从业人员所需的“软技能”。通过阅读本书,软件工程人员、编程人员和其他技术人员能够积极思考自己的职业生涯,丰富自己的生活,让自己更接近成功。 编程珠玑(第2版•修订版) 书名:《编程珠玑(第2版•修订版)》 作者:【美】Jon Bentley 译者:黄倩 钱丽艳 编辑推荐: 20余年畅销不衰计算机科学的不朽经典 伟大的计算机科学著作之一 程序员推选的心爱计算机图书 讲解如何正确选择和高效地实现算法 基于C和C++语言编写 《编程珠玑(第2版·修订版)》是计算机科学方面的经典名著。书的内容围绕程序设计人员面对的一系列实际问题展开。作者JonBentley以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员实际编程生涯中至关重要的。本书的特色是通过一些精心设计的有趣而又颇具指导意义的程序,对实用程序设计技巧及基本设计原则进行了透彻而睿智的描述,为复杂的编程问题提供了清晰而完备的解决思路。《编程珠玑(第2版·修订版)》对各个层次的程序员都具有很高的阅读价值。 最后预祝大会圆满成功。 END -
任何一个傻瓜都可以写出计算机可以理解的代码,唯有写出人类容易理解的代码,才是优秀的程序员。 ——Martin Fowler 《重构》 面对运行缓慢的老系统;前任程序员遗留下乱成一团的代码块;迷宫式的超级大函数……你能怎么办?无外乎两个选择:要么忍,要么重构。 但,重构,是多少人心中的痛! 高手重构代码,是这样的: 而你重构代码,却是这样的: 能力除外,人们抗拒重构的原因还有很多: 项目这么急,能上线就不错了,哪有时间重构?涉及到的模块太多太杂,重构,风险太大!重构代码吃力不讨好,还要被同事嫌弃。互联网行业人员流动这么快,下个月就离职了,重什么构?…… 理由千千万,究其根本,还是对自己的编程技艺的要求不够高。明明知道重构的重要性,却迫于外部环境或形势的压力缴械投降。但是,正如电影《无间道》所说:“出来混,迟早是要还的。”现在不精进自己,练就扎实的重构本领,未来,代码的坏味道定将施以报复。 关于重构,高手怎么看? 恰逢重构20年,软件开发界的不朽经典《重构:改善既有代码的设计》一书做了重磅升级。《重构》一书的作者马丁·福勒(Martin Fowler,世界软件开发大师,全球知名技术咨询公司ThoughtWorks首席科学家),在最近ThoughtWorks对他的访谈中,谈了他对重构的认识及与重构理念相关的种种问题。看看高手如何给你支招。 触发重构的原因有哪些? Martin:需要重构代码的原因当然多种多样。首先,当你无法理解代码时,一个明确的迹象是你花了很长时间想弄清楚一些代码的目的或功能。还有一种情况,借用我个人很喜欢的Ward Cunningham的说法:一旦你在脑海中对代码功能有了一定的概念,就要把它从大脑中“拿”出来并放回代码中,这样下次你或其他人再看到这些代码,他们就能真正读懂这些代码。触发重构的另一个因素是开发者想改进代码,但现有代码的架构令改进难度又很大,在这种情况下,重构提升了改进的速度、降低了难度,结构变简单后,改进也就水到渠成了。还是Kent Beck那句话说得好:首先让代码架构易于改变,然后再进行简单的改进。对我而言,下面这些都是触发重构的时机:当你发现代码不够清晰、难以理解时;当你对代码功能有了一些了解,想把这些嵌入代码中时。当你想要改进代码时,比较容易的做法是先进行重构,再添加新功能。 基本上人都有一种倾向:东西没坏就不修,更何况重构。对照“我们重构还不到位”的事实,你认为怎样做才能克服这个障碍? Martin:我得承认,我不是一个超有说服力的人。我不会努力说服大家改进,我只是尝试解释该如何做事,希望他们自己领悟并尝试最佳实践。谈到不修改代码时,肯定会涉及需要某种代码库来确保修改代码时可以轻松检测到问题,这就是我们非常重视进行严格测试的原因,因为测试是一种很好的监测机制。还有一些来自项目的技术管理者会向下属说明,改进代码没关系,但只能通过迭代和扩展来写出有效的代码。但是,有时开发者也会固步自封,我就遇到过有些团队的开发者说“哦,我们不该改变”,对上级主管也这样说,而主管会非常诧异,连声说“不对,我真的想重构”。像这种上下级理念完全相反的情况很常见。需要创造一种企业文化,允许大家说:“我们可以回到原点并改进代码。”在测试方面我们有必要的安全基础,这样开发者才能在错误出现时检测到错误。 在开发的过程中,一方面你需要为软件添加新功能,另一方面你也需要重构,以确保软件维持健康状态,否则就无法在软件里继续添加新功能。保持两者的平衡非常重要,这要求开发者有良好的判断力。像许多事情一样,良好的判断力确实是个关键元素,但遗憾的是,并没有什么捷径来传授判断力。 商界人士常常认为:如果程序没坏而且没有添加新功能,就不该浪费时间改进。你如何认识重构的意义? Martin:雇主花钱雇我们做好技术工作,而且这其中很大一部分就是使代码库保持健康状态,这样未来就能在代码库上持续添加新功能。如果不重构,严格来说我们就辜负了雇主的期望,因为不重构会导致功能开发速度变慢。从经济角度来看,我们有责任让代码库稳定处于健康状态,重构当然是一种使关键代码库保持健康状态的重要方法,如果不能令代码库保持在健康状态,就相当于我们从客户和上司那里“偷”钱。因此,从根本上说,我们有责任进行重构。 在我看来,你永远不该用诸如“这是我们的职业责任”“这是正确的事情”或 “出于道义理由”等话术,我知道很多人都喜欢用这套说法,而当你滥用术语时,你已经迷失了。重构的唯一原因是经济原因,重构的目的是更快地增加更多功能,以便更及时地响应各方需求的变化,而经济原因才是重构的底层原因。顺便说一句:这也是明智的专业态度才是正途的原因,因为老板花钱请开发人员用代码快速生成功能,我们也该站在这个立场上考虑重构问题。但严格来说,对管理者或企业而言,快速开发或新增功能,或者使代码库保持健康等因素并不重要。他们付钱给开发人员搞软件开发正是为了处理这些问题。 重构思维是否可以超越代码,应用到其他层面? Martin:绝对可以。重构的关键是理念:如何进行最细微的改变,而不是努力搞大的变化尝试,并弄清楚如何做到这一点。通过重构就会发生很多细小的变化,然后将这些变化串联起来,这就是重构思维适用于这种情况的核心。我们如何将一个大变化拆分为许多小变化,又在尽可能多进行细微变化的同时,不改变系统的整体表现,然后随时间推移,反复练习并思考如何进行拆分。我书中的内容就是我通过重构框架思考问题的体验,尝试各种重构手法并做出决定。书里有一整套机制让我能够高效地进行重构,但主要时通过实践进行重构。你尝试了不同的重构手法,然后找出哪个重构手法能生成理想序列,你尝试识别出这种重构手法,同样的逻辑也适用于更广泛的层面。 高手重“道”,Martin的分享更多是从认知上告诉你,软件大师或者一个高级开发人员是如何看待“重构”这件事的。那么,如何修炼自己重构的功力?这就不得不向大家推荐《重构(第2版)》这本不朽经典的升级秘笈! 备受关注的《重构(第2版)》在第1版的基础上做了全面修订,反映了编程领域业已发生的许多变化。第2版中介绍的重构列表更加内聚,并用JavaScript语言重写了代码范例。此外,第2版中还新增了与函数式编程相关的重构范例,旨在教会读者如何在没有类的环境下开展重构。新版沿袭了第1版的结构,依次解释什么是重构,为什么要重构,如何通过“坏味道”识别出需要重构的代码,以及如何在实践中用任何编程语言都可以成功实施重构。 很多人关注到新版中代码示例的使用从Java变成了JavaScript。Martin解释道:重构背后的理念和架构适用于任何编程语言。我选择JavaScript,只是因为我觉得它是一种应用广泛的语言。无论你使用哪种语言编程,基本机制都是完全相同的,语言与语言之间固然存在差异,但我认为语言之间的共通之处远比差异多。要知道,Java是一种非常严格的面向对象编程语言,第1版中所有的重构都是基于面向对象的。我想通过再版来说明你可以用任何(编程)语言、在任何环境中、遵循书中提到的范例进行重构,这是我计划再版这本书的另一个理由,也是我再版这本书的源动力。如果这次内容更新得非常到位,可以说再过20年我都不用再修订这本书了。 坏味道、测试先行、行为保持的变更动作,是重构的基本功。在《重构(第2版)》里,重构手法的细节被再度打磨,重构过程比之第1版愈发流畅。细细品味重构手法中的前后步骤,琢磨作者是如何做到行为保持,这是能启发读者举一反三的读书法。举保持对象完整重构手法为例,第1版中的做法是在原本函数上新添参数;而第2版的做法则是先新建一个空函数,在其中做完想要的调整之后,再整体替换原本函数。两相对比,无疑是新的做法更加可控、出错时测试失败的范围更小。 对比前后两版的重构列表,你会发现:第2版收录的重构手法在用途上更加内聚,在操作上更加连贯,更重视重构手法之间的组合运用。第1版中占了整章篇幅的“大型重构”,在第2版中全数删去。一些较为复杂的重构手法,例如复制“被监视数据”、塑造模板函数等,第2版也不再收录。而第2版中新增的重构手法,则多是提炼变量、移动语句、拆分循环、拆分变量这样更加细致而微的操作。这些新增的手法看似简单,但直指大规模遗留代码中最常见的重构难点,正好补上了第1版中阙漏的细节。这一变化,正反映出Martin Fowler对于重构一事一贯的态度:千里之行积于跬步,越是面对复杂多变的外部环境,越是要做好基本功、迈出扎实步。 修炼秘笈在此,最重要的还是上手实践。重构就像软件开发的大多数工作一样:除了动手做,别无他法。《重构》这本书肯定能帮助那些初次接触重构概念的人,但它也能帮助那些了解重构的人分享相关技能。Martin也提醒读者:请记住重构的要义就是小步骤改进,确保你频繁提交。如果出了什么问题,你只需回滚到先前的提交记录上,这就会降低重构的压力。重构肯定不会给你带来太坏的影响,因为大不了你就回滚呗,这就是版本控制系统的用途。所以,赶紧上手重构吧,操作才是关键。 书名:《重构:改善既有代码的设计(第2版)》 作者:[美]马丁·福勒(Martin Fowler) 译者:熊节 林从羽 编辑推荐: 世界软件开发大师MartinFowler的不朽经典 普通程序员进阶到编程高手的修炼秘笈 它在世界范围内畅销不衰,被翻译为中、德、日、俄等众多语言。 这本经典书20年后重磅升级,更新内容超30%,更新了众多项目案例。 本书是经典著作《重构》出版20年后的更新版。书中清晰揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以求改善。书中给出了60多个可行的重构,每个重构都介绍了种经过验证的代码变换手法的动机和技术。本书提出的重构准则将帮助开发人员小步地修改代码,从而减少了开发过程中的风险。 -END-
为什么要把数学建模与当今火热的人工智能放在一起? 首先,数学建模在字面上可以分解成数学+建模,即运用统计学、线性代数和积分学等数学知识,构建算法模型,通过模型来解决问题。数学建模往往是没有对与错,只有“更好”(better),就好像让你评价两个苹果哪个更好吃,只有好吃、不好吃或者更好吃,没有对与错。 人工智能(Artificial Intelligence, AI),你可以将其理解为是一种“黑科技”,人类通过它,让计算机能够“更好”地像人一样思考。可以说“算法模型”是人工智能的“灵魂”,没有算法模型,一切都是“水中月”“镜中花”! 因此,《Python 3破冰人工智能》将从数学建模入手,由浅入深地为读者揭开AI的神秘面纱。 数学建模 数学建模与人工智能 1.数学建模简介 数学建模是利用数学方法解决实际问题的一种实践。即通过抽象、简化、假设、引进变量等处理过程,将实际问题用数学方式表达,建立起数学模型,然后运用先进的数学方法及计算机技术进行求解。数学建模可以通俗地理解为数学+建模,即运用统计学、线性代数,积分学等数学知识,构建数学模型,通过模型解决问题。 按照传统定义,数学模型是对于一个现实对象,为了一个特定目的(实际问题),做出必要的简化假设(模型假设),根据对象的内在规律(业务逻辑、数据特征),运用适当的数学工具、计算机软件,得到的一个数学结构。 亚里士多德说,“智慧不仅仅存在于知识之中,而且还存在于应用知识的能力中”。数学建模就是对数学知识最好的应用,通过数学建模,你会发现,生活中很多有意思的事情都可以靠它来解决,其流程如图1-1所示。 ▲图1-1 数学建模流程 2.人工智能简介 对于普通大众来说,可能是近些年才对其有所了解,其实人工智能在几十年以前就被学者提出并得到一定程度的发展,伴随着大数据技术的迅猛发展而被引爆。 (1)人工智能的诞生 最初的人工智能其实是20世纪30至50年代初一系列科学研究进展交汇的产物。1943年,沃伦·麦卡洛克(Warren McCulloch)和瓦尔特·皮茨(Walter Pitts)首次提出“神经网络”概念。1950年,阿兰·图灵(Alan Turing)提出了著名的“图灵测试”,即如果一台机器能够与人类展开对话(通过电传设备)而不能被辨别出其机器身份,那么称这台机器则具有智能。直到如今,图灵测试仍然是人工智能的重要测试手段之一。1951年,马文·明斯基(Marvin Minsky)与他的同学一起建造了第一台神经网络机,并将其命名为 SNARC (Stochastic Neural Analog Reinforcement Calculator)。不过,这些都只是前奏,一直到1956年的达特茅斯会议,“Artificial Intelligence”(人工智能)这个词才被真正确定下来,并一直沿用至今,这也是目前AI诞生的一个标志性事件。 ▲图1-2 达特茅斯会议参会者50年后聚首照[1] [1] 达特茅斯会议参会者50年后再聚首,左起:Trenchard More、John McCarthy、Marvin Minsky、Oliver Selfridge和Ray Solomonoff(摄于2006年),图片版权归原作者所有。 在20世纪50年代,人工智能相关的许多实际应用一般是从机器的“逻辑推理能力”开始着手研究。然而对于人类来说,更高级的逻辑推理的基础是“学习能力”和“规划能力”,我们现在管它叫“强化学习”与“迁移学习”。可以想象,“逻辑推理能力”在一般人工智能系统中不能起到根本的、决定性的作用。当前,在数据、运算能力、算法模型、多元应用的共同驱动下,人工智能的定义正从用计算机模拟人类智能,演进到协助引导提升人类智能,如图1-3所示。 ▲图1-3 下一代人工智能(图片来源《新一代人工智能发展白皮书》) (2)人工智能的概念 人工智能(Artificial Intelligence),英文缩写为AI,它是研究开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。 人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”,也可能超过人的智能。 (3)人工智能、机器学习、深度学习 下面我们来介绍下主要与人工智能相关的几个概念,要搞清它们的关系,最直观的表述方式就是同心圆,如图1-4所示,最先出现的是理念,然后是机器学习,当机器学习繁荣之后就出现了深度学习,今天的人工智能大爆发是由深度学习驱动的。 ▲图1-4 AI、机器学习、深度学习的关系 人工智能(AI)、机器学习(ML)、深度学习(DL)的关系为DL⊆ML⊆AI。 人工智能,即AI是一个宽泛的概念,人工智能的目的就是让计算机能够像人一样思考。机器学习是人工智能的分支,它是人工智能的重要核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。深度学习是机器学习研究中的一个新领域,推动了机器学习的发展,并拓展了人工智能的领域范围。甚至有观点认为,深度学习可能就是实现未来强AI的突破口。 可以把人工智能比喻成孩子大脑,机器学习是让孩子去掌握认知能力的过程,而深度学习是这个过程中很有效率的一种教学体系。 因此可以这样概括:人工智能是目的、结果;深度学习、机器学习是方法、工具。 本书讲解了人工智能、机器学习、深度学习的相关应用,它们之间的关系,常见的机器学习算法等知识,希望你通过对本书的学习,深刻理解这些概念,并可以轻而易举地给别人讲解。 3.数学建模与人工智能关系 无论是数学建模还是人工智能,其核心都是算法,最终的目的都是通过某种形式来更好地为人类服务,解决实际问题。在研究人工智能过程中需要数学建模思维,所以数学建模对于人工智能非常关键。 下面通过模拟一个场景来了解人工智能与数学建模之间的关系。 ▲图1-5 AI 机器人 某患者到医院就诊,在现实生活中,医生根据病人的一系列体征与症状,判断病人患了什么病。医生会亲切地询问患者的症状,通过各种专项检查,最后进行确诊。在人工智能下,则考虑通过相应算法来实现上述过程,如德国的辅助诊断产品Ada学习了大量病例来辅助提升医生诊病的准确率。 情景①:如果用数学建模方法解决,那么就通过算法构建一个恰当的模型,也就是通过图1-1所示的数学建模流程来解决问题。 情景②:如果用人工智能方法解决,那么就要制造一个会诊断疾病的机器人。机器人如何才能精准诊断呢?这就需要利用人工智能技术手段,比如采用一个“人工智能”算法模型,可能既用了机器学习算法,也用了深度学习算法,不管怎样,最终得到的是一个可以落地的疾病预测人工智能解决方案。让其具有思考、听懂、看懂、逻辑推理与运动控制能力,如图1-5所示。 通过上面的例子可以看出,人工智能离不开数学建模。在解决一个人工智能的问题过程中,我们将模型的建立与求解进行了放大,以使其结果更加精准,如图1-6所示。 ▲图1-6 AI下对数学建模的流程修正 可见,从数学建模的角度去学习人工智能不失为一种合适的方法。 《Python 3破冰人工智能:从入门到实战》 作者:黄海涛 编辑推荐: 数学基础:从历年数学建模竞赛入手,解读人工智能中的数学方法。 编程实践:100余个代码实例,全面讲解网络爬虫、数据存储与数据分析等内容。 算法应用:实战案例辅以丰富图解,详尽分析人工智能算法特性及其应用场景。 本书创新性地从数学建模竞赛入手,深入浅出地讲解了人工智能领域的相关知识。本书内容基于Python 3.6,从人工智能领域的数学出发,到Python在人工智能场景下的关键模块;从网络爬虫到数据存储,再到数据分析;从机器学习到深度学习,涉及自然语言处理、机器学习、深度学习、推荐系统和知识图谱等。 此外,本书还提供了近140个代码案例和大量图表,全面系统地阐述了算法特性,个别案例算法来自于工作经验总结,力求帮助读者学以致用。 - END -
“代码千万行,注释第一行;编程不规范,同事两行泪”;"道路千万条,安全第一条。代码不规范,亲人两行泪。"在技术圈广为盛传,可见代码不规范让程序员们是多么的头痛。 近期全栈开发者 Nitin Sharma 分享了他理解的编程七宗罪: 协作时不使用版本控制 不使用合适的变量命名 使用过多的依赖,不经思考直接升级 不自解释的代码 格式不一致 不处理错误 使用不当的数据类型/数据结构 你是否产生了共鸣?这些错误问题,只要肯努力都可以避免发生。 如何让你的代码整洁而优雅?今天小编介绍的这本书教你在不改变外部环境的情况下,有条不紊的改善代码,也许你有所耳闻,他就是《重构:改善既有代码的设计(第2版)(精装版)》。全网已发售。首先了解一下重构的原则。 何谓重构 一线的实践者们经常很随意地使用“重构”这个词—软件开发领域的很多词汇都有此待遇。我使用这个词的方式比较严谨,并且我发现这种严谨的方式很有好处。“重构”这个词既可以用作名词也可以用作动词。名词形式的定义是: 重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。 这个定义适用于我在前面的例子中提到的那些有名字的重构,例如提炼函数(106)和以多态取代条件表达式(272)。 动词形式的定义是: 重构(动词):使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。 所以,我可能会花一两个小时进行重构(动词),其间我会使用几十个不同的重构(名词)。 过去十几年,这个行业里的很多人用“重构”这个词来指代任何形式的代码清理,但上面的定义所指的是一种特定的清理代码的方式。重构的关键在于运用大量微小且保持软件行为的步骤,一步步达成大规模的修改。每个单独的重构要么很小,要么由若干小步骤组合而成。因此,在重构的过程中,我的代码很少进入不可工作的状态,即便重构没有完成,我也可以在任何时刻停下来。 如果有人说他们的代码在重构过程中有一两天时间不可用,基本上可以确定,他们在做的事不是重构。 我会用“结构调整”(restructuring)来泛指对代码库进行的各种形式的重新组织或清理,重构则是特定的一类结构调整。刚接触重构的人看我用很多小步骤完成似乎可以一大步就能做完的事,可能会觉得这样很低效。但小步前进能让我走得更快,因为这些小步骤能完美地彼此组合,而且—更关键的是—整个过程中我不会花任何时间来调试。 在上述定义中,我用了“可观察行为”的说法。它的意思是,整体而言,经过重构之后的代码所做的事应该与重构之前大致一样。这个说法并非完全严格,并且我是故意保留这点儿空间的:重构之后的代码不一定与重构前行为完全一致。比如说,提炼函数(106)会改变函数调用栈,因此程序的性能就会有所改变;改变函数声明(124)和搬移函数(198)等重构经常会改变模块的接口。不过就用户应该关心的行为而言,不应该有任何改变。如果我在重构过程中发现了任何bug,重构完成后同样的bug应该仍然存在(不过,如果潜在的bug还没有被任何人发现,也可以当即把它改掉)。 重构与性能优化有很多相似之处:两者都需要修改代码,并且两者都不会改变程序的整体功能。两者的差别在于其目的:重构是为了让代码“更容易理解,更易于修改”。这可能使程序运行得更快,也可能使程序运行得更慢。在性能优化时,我只关心让程序运行得更快,最终得到的代码有可能更难理解和维护,对此我有心理准备。 两顶帽子 Kent Beck提出了“两顶帽子”的比喻。使用重构技术开发软件时,我把自己的时间分配给两种截然不同的行为:添加新功能和重构。添加新功能时,我不应该修改既有代码,只管添加新功能。通过添加测试并让测试正常运行,我可以衡量自己的工作进度。重构时我就不能再添加功能,只管调整代码的结构。此时我不应该添加任何测试(除非发现有先前遗漏的东西),只在绝对必要(用以处理接口变化)时才修改测试。 软件开发过程中,我可能会发现自己经常变换帽子。首先我会尝试添加新功能,然后会意识到:如果把程序结构改一下,功能的添加会容易得多。于是我换一顶帽子,做一会儿重构工作。程序结构调整好后,我又换上原先的帽子,继续添加新功能。新功能正常工作后,我又发现自己的编码造成程序难以理解,于是又换上重构帽子……整个过程或许只花10分钟,但无论何时我都清楚自己戴的是哪一顶帽子,并且明白不同的帽子对编程状态提出的不同要求。 为何重构 我不想把重构说成是包治百病的万灵丹,它绝对不是所谓的“银弹”。不过它的确很有价值,尽管它不是一颗“银弹”,却可以算是一把“银钳子”,可以帮你始终良好地控制自己的代码。重构是一个工具,它可以(并且应该)用于以下几个目的。 重构改进软件的设计 如果没有重构,程序的内部设计(或者叫架构)会逐渐腐败变质。当人们只为短期目的而修改代码时,他们经常没有完全理解架构的整体设计,于是代码逐渐失去了自己的结构。程序员越来越难通过阅读源码来理解原来的设计。代码结构的流失有累积效应。越难看出代码所代表的设计意图,就越难保护其设计,于是设计就腐败得越快。经常性的重构有助于代码维持自己该有的形态。 完成同样一件事,设计欠佳的程序往往需要更多代码,这常常是因为代码在不同的地方使用完全相同的语句做同样的事,因此改进设计的一个重要方向就是消除重复代码。代码量减少并不会使系统运行更快,因为这对程序的资源占用几乎没有任何明显影响。然而代码量减少将使未来可能的程序修改动作容易得多。代码越多,做正确的修改就越困难,因为有更多代码需要理解。我在这里做了点儿修改,系统却不如预期那样工作,因为我没有修改另一处—那里的代码做着几乎完全一样的事情,只是所处环境略有不同。消除重复代码,我就可以确定所有事物和行为在代码中只表述一次,这正是优秀设计的根本。 重构使软件更容易理解 所谓程序设计,很大程度上就是与计算机对话:我编写代码告诉计算机做什么事,而它的响应是按照我的指示精确行动。一言以蔽之,我所做的就是填补“我想要它做什么”和“我告诉它做什么”之间的缝隙。编程的核心就在于“准确说出我想要的”。然而别忘了,除了计算机外,源码还有其他读者:几个月之后可能会有另一位程序员尝试读懂我的代码并对其做一些修改。我们很容易忘记这这位读者,但他才是最重要的。计算机是否多花了几个时钟周期来编译,又有什么关系呢?如果一个程序员花费一周时间来修改某段代码,那才要命呢—如果他理解了我的代码,这个修改原本只需一小时。 问题在于,当我努力让程序运转的时候,我不会想到未来出现的那个开发者。是的,我们应该改变一下开发节奏,让代码变得更易于理解。重构可以帮我让代码更易读。开始进行重构前,代码可以正常运行,但结构不够理想。在重构上花一点点时间,就可以让代码更好地表达自己的意图—更清晰地说出我想要做的。 关于这一点,我没必要表现得多么无私。很多时候那个未来的开发者就是我自己。此时重构就显得尤其重要了。我是一个很懒惰的程序员,我的懒惰表现形式之一就是:总是记不住自己写过的代码。事实上,对于任何能够立刻查阅的东西,我都故意不去记它,因为我怕把自己的脑袋塞爆。我总是尽量把该记住的东西写进代码里,这样我就不必记住它了。这么一来,下班后我还可以喝上两杯Maudite啤酒,不必太担心它杀光我的脑细胞。 重构帮助找到bug 对代码的理解,可以帮我找到bug。我承认我不太擅长找bug。有些人只要盯着一大段代码就可以找出里面的bug,我不行。但我发现,如果对代码进行重构,我就可以深入理解代码的所作所为,并立即把新的理解反映在代码当中。搞清楚程序结构的同时,我也验证了自己所做的一些假设,于是想不把bug揪出来都难。 这让我想起了Kent Beck经常形容自己的一句话:“我不是一个特别好的程序员,我只是一个有着一些特别好的习惯的还不错的程序员。”重构能够帮助我更有效地写出健壮的代码。 重构提高编程速度 最后,前面的一切都归结到了这一点:重构帮我更快速地开发程序。 听起来有点儿违反直觉。当我谈到重构时,人们很容易看出它能够提高质量。改善设计、提升可读性、减少bug,这些都能提高质量。但花在重构上的时间,难道不是在降低开发速度吗? 当我跟那些在一个系统上工作较长时间的软件开发者交谈时,经常会听到这样的故事:一开始他们进展很快,但如今想要添加一个新功能需要的时间就要长得多。他们需要花越来越多的时间去考虑如何把新功能塞进现有的代码库,不断蹦出来的bug修复起来也越来越慢。代码库看起来就像补丁摞补丁,需要细致的考古工作才能弄明白整个系统是如何工作的。这份负担不断拖慢新增功能的速度,到最后程序员恨不得从头开始重写整个系统。 下面这幅图可以描绘他们经历的困境。 但有些团队的境遇则截然不同。他们添加新功能的速度越来越快,因为他们能利用已有的功能,基于已有的功能快速构建新功能。 两种团队的区别就在于软件的内部质量。需要添加新功能时,内部质量良好的软件让我可以很容易找到在哪里修改、如何修改。良好的模块划分使我只需要理解代码库的一小部分,就可以做出修改。如果代码很清晰,我引入bug的可能性就会变小,即使引入了bug,调试也会容易得多。理想情况下,我的代码库会逐步演化成一个平台,在其上可以很容易地构造与其领域相关的新功能。 我把这种现象称为“设计耐久性假说”:通过投入精力改善内部设计,我们增加了软件的耐久性,从而可以更长时间地保持开发的快速。我还无法科学地证明这个理论,所以我说它是一个“假说”。但我的经验,以及我在职业生涯中认识的上百名优秀程序员的经验,都支持这个假说。 20年前,行业的陈规认为:良好的设计必须在开始编程之前完成,因为一旦开始编写代码,设计就只会逐渐腐败。重构改变了这个图景。现在我们可以改善已有代码的设计,因此我们可以先做一个设计,然后不断改善它,哪怕程序本身的功能也在不断发生着变化。由于预先做出良好的设计非常困难,想要既体面又快速地开发功能,重构必不可少。 何时重构 在我编程的每个小时,我都会做重构。有几种方式可以把重构融入我的工作过程里。 三次法则 Don Roberts给了我一条准则:第一次做某件事时只管去做;第二次做类似的事会产生反感,但无论如何还是可以去做;第三次再做类似的事,你就应该重构。 正如老话说的:事不过三,三则重构。 预备性重构:让添加新功能更容易 重构的最佳时机就在添加新功能之前。在动手添加新功能之前,我会看看现有的代码库,此时经常会发现:如果对代码结构做一点微调,我的工作会容易得多。也许已经有个函数提供了我需要的大部分功能,但有几个字面量的值与我的需要略有冲突。如果不做重构,我可能会把整个函数复制过来,修改这几个值,但这就会导致重复代码—如果将来我需要做修改,就必须同时修改两处(更麻烦的是,我得先找到这两处)。而且,如果将来我还需要一个类似又略有不同的功能,就只能再复制粘贴一次,这可不是个好主意。所以我戴上重构的帽子,使用函数参数化(310)。做完这件事以后,接下来我就只需要调用这个函数,传入我需要的参数。 这就好像我要往东去100公里。我不会往东一头把车开进树林,而是先往北开20公里上高速,然后再向东开100公里。后者的速度比前者要快上3倍。如果有人催着你“赶快直接去那儿”,有时你需要说:“等等,我要先看看地图,找出最快的路径。”这就是预备性重构于我的意义。 ——Jessica Kerr 修复bug时的情况也是一样。在寻找问题根因时,我可能会发现:如果把3段一模一样且都会导致错误的代码合并到一处,问题修复起来会容易得多。或者,如果把某些更新数据的逻辑与查询逻辑分开,会更容易避免造成错误的逻辑纠缠。用重构改善这些情况,在同样场合再次出现同样bug的概率也会降低。 帮助理解的重构:使代码更易懂 我需要先理解代码在做什么,然后才能着手修改。这段代码可能是我写的,也可能是别人写的。一旦我需要思考“这段代码到底在做什么”,我就会自问:能不能重构这段代码,令其一目了然?我可能看见了一段结构糟糕的条件逻辑,也可能希望复用一个函数,但花费了几分钟才弄懂它到底在做什么,因为它的函数命名实在是太糟糕了。这些都是重构的机会。 看代码时,我会在脑海里形成一些理解,但我的记性不好,记不住那么多细节。正如Ward Cunningham所说,通过重构,我就把脑子里的理解转移到了代码本身。随后我运行这个软件,看它是否正常工作,来检查这些理解是否正确。如果把对代码的理解植入代码中,这份知识会保存得更久,并且我的同事也能看到。 重构带来的帮助不仅发生在将来—常常是立竿见影。我会先在一些小细节上使用重构来帮助理解,给一两个变量改名,让它们更清楚地表达意图,以方便理解,或是将一个长函数拆成几个小函数。当代码变得更清晰一些时,我就会看见之前看不见的设计问题。如果不做前面的重构,我可能永远都看不见这些设计问题,因为我不够聪明,无法在脑海中推演所有这些变化。Ralph Johnson说,这些初步的重构就像扫去窗上的尘埃,使我们得以看到窗外的风景。在研读代码时,重构会引领我获得更高层面的理解,如果只是阅读代码很难有此领悟。有些人以为这些重构只是毫无意义地把玩代码,他们没有意识到,缺少了这些细微的整理,他们就无法看到隐藏在一片混乱背后的机遇。 捡垃圾式重构 帮助理解的重构还有一个变体:我已经理解代码在做什么,但发现它做得不好,例如逻辑不必要地迂回复杂,或者两个函数几乎完全相同,可以用一个参数化的函数取而代之。这里有一个取舍:我不想从眼下正要完成的任务上跑题太多,但我也不想把垃圾留在原地,给将来的修改增加麻烦。如果我发现的垃圾很容易重构,我会马上重构它;如果重构需要花一些精力,我可能会拿一张便笺纸把它记下来,完成当下的任务再回来重构它。 当然,有时这样的垃圾需要好几个小时才能解决,而我又有更紧急的事要完成。不过即便如此,稍微花一点工夫做一点儿清理,通常都是值得的。正如野营者的老话所说:至少要让营地比你到达时更干净。如果每次经过这段代码时都把它变好一点点,积少成多,垃圾总会被处理干净。重构的妙处就在于,每个小步骤都不会破坏代码—所以,有时一块垃圾在好几个月之后才终于清理干净,但即便每次清理并不完整,代码也不会被破坏。 有计划的重构和见机行事的重构 上面的例子—预备性重构、帮助理解的重构、捡垃圾式重构—都是见机行事的:我并不专门安排一段时间来重构,而是在添加功能或修复bug的同时顺便重构。这是我自然的编程流的一部分。不管是要添加功能还是修复bug,重构对我当下的任务有帮助,而且让我未来的工作更轻松。这是一件很重要而又常被误解的事:重构不是与编程割裂的行为。你不会专门安排时间重构,正如你不会专门安排时间写if语句。我的项目计划上没有专门留给重构的时间,绝大多数重构都在我做其他事的过程中自然发生。 肮脏的代码必须重构,但漂亮的代码也需要很多重构 还有一种常见的误解认为,重构就是人们弥补过去的错误或者清理肮脏的代码。当然,如果遇上了肮脏的代码,你必须重构,但漂亮的代码也需要很多重构。在写代码时,我会做出很多权衡取舍:参数化需要做到什么程度?函数之间的边界应该划在哪里?对于昨天的功能完全合理的权衡,在今天要添加新功能时可能就不再合理。好在,当我需要改变这些权衡以反映现实情况的变化时,整洁的代码重构起来会更容易。 每次要修改时,首先令修改很容易(警告:这件事有时会很难),然后再进行这次容易的修改。 ——Kent Beck 长久以来,人们认为编写软件是一个累加的过程:要添加新功能,我们就应该增加新代码。但优秀的程序员知道,添加新功能最快的方法往往是先修改现有的代码,使新功能容易被加入。所以,软件永远不应该被视为“完成”。每当需要新能力时,软件就应该做出相应的改变。越是在已有代码中,这样的改变就越显重要。 不过,说了这么多,并不表示有计划的重构总是错的。如果团队过去忽视了重构,那么常常会需要专门花一些时间来优化代码库,以便更容易添加新功能。在重构上花一个星期的时间,会在未来几个月里发挥价值。有时,即便团队做了日常的重构,还是会有问题在某个区域逐渐累积长大,最终需要专门花些时间来解决。但这种有计划的重构应该很少,大部分重构应该是不起眼的、见机行事的。 我听过的一条建议是:将重构与添加新功能在版本控制的提交中分开。这样做的一大好处是可以各自独立地审阅和批准这些提交。但我并不认同这种做法。重构常常与新添功能紧密交织,不值得花工夫把它们分开。并且这样做也使重构脱离了上下文,使人看不出这些“重构提交”的价值。每个团队应该尝试并找出适合自己的工作方式,只是要记住:分离重构提交并不是毋庸置疑的原则,只有当你真的感到有益时,才值得这样做。 长期重构 大多数重构可以在几分钟—最多几小时—内完成。但有一些大型的重构可能要花上几个星期,例如要替换一个正在使用的库,或者将整块代码抽取到一个组件中并共享给另一支团队使用,再或者要处理一大堆混乱的依赖关系,等等。 即便在这样的情况下,我仍然不愿让一支团队专门做重构。可以让整个团队达成共识,在未来几周时间里逐步解决这个问题,这经常是一个有效的策略。每当有人靠近“重构区”的代码,就把它朝想要改进的方向推动一点。这个策略的好处在于,重构不会破坏代码—每次小改动之后,整个系统仍然照常工作。例如,如果想替换掉一个正在使用的库,可以先引入一层新的抽象,使其兼容新旧两个库的接口。一旦调用方已经完全改为使用这层抽象,替换下面的库就会容易得多。(这个策略叫作Branch By Abstraction[mf-bba]。) 复审代码时重构 一些公司会做常规的代码复审(code review),因为这种活动可以改善开发状况。代码复审有助于在开发团队中传播知识,也有助于让较有经验的开发者把知识传递给比较欠缺经验的人,并帮助更多人理解大型软件系统中的更多部分。代码复审对于编写清晰代码也很重要。我的代码也许对我自己来说很清晰,对他人则不然。这是无法避免的,因为要让开发者设身处地为那些不熟悉自己所作所为的人着想,实在太困难了。代码复审也让更多人有机会提出有用的建议,毕竟我在一个星期之内能够想出的好点子很有限。如果能得到别人的帮助,我的生活会滋润得多,所以我总是期待更多复审。 我发现,重构可以帮助我复审别人的代码。开始重构前我可以先阅读代码,得到一定程度的理解,并提出一些建议。一旦想到一些点子,我就会考虑是否可以通过重构立即轻松地实现它们。如果可以,我就会动手。这样做了几次以后,我可以更清楚地看到,当我的建议被实施以后,代码会是什么样。我不必想象代码应该是什么样,我可以真实看见。于是我可以获得更高层次的认识。如果不进行重构,我永远无法得到这样的认识。 重构还可以帮助代码复审工作得到更具体的结果。不仅获得建议,而且其中许多建议能够立刻实现。最终你将从实践中得到比以往多得多的成就感。 至于如何在代码复审的过程中加入重构,这要取决于复审的形式。在常见的pull request模式下,复审者独自浏览代码,代码的作者不在旁边,此时进行重构效果并不好。如果代码的原作者在旁边会好很多,因为作者能提供关于代码的上下文信息,并且充分认同复审者进行修改的意图。对我个人而言,与原作者肩并肩坐在一起,一边浏览代码一边重构,体验是最佳的。这种工作方式很自然地导向结对编程:在编程的过程中持续不断地进行代码复审。 何时不应该重构 听起来好像我一直在提倡重构,但确实有一些不值得重构的情况。 如果我看见一块凌乱的代码,但并不需要修改它,那么我就不需要重构它。如果丑陋的代码能被隐藏在一个API之下,我就可以容忍它继续保持丑陋。只有当我需要理解其工作原理时,对其进行重构才有价值。 另一种情况是,如果重写比重构还容易,就别重构了。这是个困难的决定。如果不花一点儿时间尝试,往往很难真实了解重构一块代码的难度。决定到底应该重构还是重写,需要良好的判断力与丰富的经验,我无法给出一条简单的建议。 《重构:改善既有代码的设计(第2版)》 作者:马丁·福勒(Martin Fowler) 本书是经典著作《重构》出版20年后的更新版。书中清晰揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以求改善。书中给出了60多个可行的重构,每个重构都介绍了种经过验证的代码变换手法的动机和技术。本书提出的重构准则将帮助开发人员小步地修改代码,从而减少了开发过程中的风险。 本书适合软件开发人员、项目管理人员等阅读,也可作为高等院校计算机及相关专业师生的参考读物。 作者:马丁·福勒(Martin Fowler) 世界软件开发大师,ThoughtWorks的首席科学家。他是一位作家、演说者、咨询师和泛软件开发领域的意见领袖。他致力于改善企业级的软件设计,对优秀的设计以及支撑优秀设计的工程实践孜孜以求。他在重构、面向对象分析设计、模式、XP和UML等领域都有卓越贡献。著有《重构》《分析模式》《领域特定语言》等经典著作。 点击图片直接下单 - END -
“认知”的核心技术是自然语言处理,这是人工智能领域中的一个重要方向,研究各种理论和方法,涉及的领域较多,主要包括机器翻译、阅读理解、智能写作、对话系统、基础技术和语义计算等。 计算机能“理解并开口说话”,意味着与人类可进行更广泛的交流,从而一步步逼近并超越“图灵测试”,让人工智能掀开新的篇章。 《Python和NLTK自然语言处理》 作者 [印度] 尼天•哈登尼亚(Nitin Hardeniya) 雅各布•帕金斯(Jacob Perkins) 迪蒂•乔普拉(Deepti Chopra) 尼什•斯乔希(Nisheeth Joshi) 伊提•摩突罗(Iti Mathur) 语言是我们日常生活的核心部分,处理与语言相关的任何问题都是非常有趣的。我希望此书能够让你一嗅NLP的芬芳,激励你去了解更令人惊奇的NLP概念,并鼓励你开发一些具有挑战性的NLP应用。 研究人类语言的过程称为NLP。深入研究语言的人称为语言学家,而“计算语言学家”这个专有名词适用于应用计算研究语言处理的人。从本质上讲,计算语言学家是深入了解语言的计算机科学家,计算语言学家可以运用计算技能,对语言的不同方面进行建模。计算语言学家解决的是语言理论方面的问题,NLP只不过是计算语言学的应用。 NLP更多探讨的是应用计算机,处理不同语言的细微差别,以及使用NLP技术构建现实世界的应用。在实际情景下,NLP类似于教孩子学语言。一些最常见的任务(如理解单词和句子,形成在语法和结构上正确的句子)对人类而言是很自然。在NLP领域,把这样的一些任务转化为标记解析(tokenization)、组块(chunking)、词性标注(part of speech tagging)、解析(parsing)、机器翻译(machine translation)、语音识别(speech recognition),这些任务中的大部分依然是计算机所面临的最严峻的挑战。 本文主要内容如下。 NLP及其相关概念。 安装Python、NLTK和其他库的方法。 编写一些非常基本的Python和NLTK代码片段的方法。 如果你从来没有听说过NLP这个词,那么请花一些时间来阅读这里提到的任何一本书籍,只要阅读最初几章即可。至少要快速阅读一些与NLP相关的维基百科网页。 由Daniel Jurafsky和James H. Martin合著的《Speech and Language Processing》。 由Christopher D. Manning和Hinrich Schütze合著的《Statistical Natural Language Processing》。 为什么要学习NLP 本节从Gartner的技术成熟度曲线开始讨论,从这条曲线上,你可以清楚地看到NLP处在技术成熟度曲线的顶部。目前,NLP是行业所需的稀有技能之一。在大数据到来之后,NLP面临的主要的挑战是,NLP需要大量不但精通结构化数据而且擅长于处理半结构化或非结构化数据的技术人员。我们正在生成拍字节量级的网络博客、推特信息、脸书(Facebook)的推送信息、聊天记录、电子邮件和评论。一些公司正在收集所有这些不同种类的数据,以便更好地为客户定位,并从中得到有意义的见解。为了处理这些非结构化数据源,我们需要了解NLP的技术人员。 我们身处信息时代;我们甚至不能想象生活中没有谷歌。我们使用Siri来处理大多数基本的语音功能。我们使用垃圾邮件过滤器过滤垃圾邮件。在Word文档中,我们需要拼写检查器。在我们周围,存在许多NLP在现实世界中应用的例子。 (图片来自gartner网站) 下面也提供一些你能够使用但是没有意识它们是建立在NLP上的令人赞叹的NLP应用的示例。 拼写校正(微软的Word/任何其他编辑器) 搜索引擎(谷歌、必应、雅虎和WolframAlpha) 语音引擎(Siri和谷歌语音) 垃圾邮件分类(所有的电子邮件服务) 新闻推送(谷歌和雅虎等) 机器翻译(谷歌翻译等) IBM的沃森 构建这些应用需要一种非常特殊的技能集,你需要对语言非常了解,并具有可以有效处理语言的工具。因此,让NLP成为最具优势的领域之一的原因不是广告宣传,而是可以使用NLP创建的这种应用使得NLP成为必备的最独特技能之一。 为了实现上述的一些应用,以及其他基本的NLP预处理,我们有很多可用的开源工具。在这些工具中,有一些是某些组织为建立自己的NLP应用而开发的,而有一些是开源的。这里是一张可用的NLP工具列表。 GATE Mallet Open NLP UIMA 斯坦福工具包 Genism 自然语言工具包(NLTK) 大部分工具是用Java编写的,具有相似的功能。其中一些工具非常健壮,可以获得NLP工具的不同版本。但是,当涉及易于使用和易于解释这两个概念的时候,NLTK得分最高。由于Python(NLTK的编码语言)的学习曲线非常快,因此NLTK也是非常易于学习的工具包。NLTK已经将大部分的NLP任务纳入篮中,非常优雅,容易用于工作中。出于所有这些原因,NLTK已成为NLP界最流行的库之一。 建议使用Anaconda和Canopy Python的发行版本。理由是,这些版本绑定了一些库,如scipy、numpy、scikit等,你可以使用这些库进行数据分析,开发出与NLP有关的应用,以及把这些库应用于相关领域。即使NLTK也是这个发行版本的一部分。 下面测试所有功能。 请在相应的操作系统中,启动终端。然后运行: $ python 这应该打开了Python解释器。 1Python 2.6.6 (r266:84292, Oct 15 2013, 07:32:41) 2[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 3Type "help", "copyright", "credits" or "license" for more information. 4>>> 我希望你得到的输出与这个类似。你有可能得到一个不同的输出,但是在理想情况下,你获得了Python的最新版本(建议的版本是2.7)信息、编译器GCC的信息,以及操作系统的详细信息。Python的最新版本是3.0+,但是,与任何其他开源的系统一样,我们应该试图保持相对稳定的版本,而不是跳跃到最新版本。如果你已经使用了Python 3.0+,那么请从python网站了解新版本中又添加了哪些新特征。 基于UNIX的系统将Python作为默认程序。Windows用户可以设置路径,让Python正常运行。下面检查一下是否已经正确安装了NLTK。 1>>>import nltk 2>>>print "Python and NLTK installed successfully" 3Python and NLTK installed successfully 我们准备好了。 从Python的基本知识开始 本节不会深入探讨Python。然而,我们会让你快速浏览一遍Python的基本知识。同样,为了读者的利益,我认为应该来一段5分钟的Python之旅。接下来的几节将谈论数据结构的基本知识、一些常用的函数,以及Python的一般构建方式。 列表 在Python中,列表是最常用的数据结构之一。它们几乎相当于其他编程语言中的数组。下面从Python列表所提供的一些最重要的函数开始讲述。 在Python控制台中,尝试输入以下内容。 11>>> lst=[1,2,3,4] 22>>> # mostly like arrays in typical languages 33>>>print lst 44[1, 2, 3, 4] 可以使用更加灵活的索引来访问Python列表。下面是一些例子。 >>>print 'First element' +lst[0] 你会得到这样的错误消息: TypeError: cannot concatenate 'str' and 'int' objects 原因是Python是一种解释性语言,我们在声明变量时,不需要初始化变量并声明变量的类型,Python只有在计算表达式时,才检查变量类型。在列表中,对象是整数类型的,因此它们不能与print函数串接。这个函数只接受字符串对象。出于这个原因,我们需要将列表元素转换为字符串。这个过程也称为强制类型转换(typecasting)。 1>>>print 'First element :' +str(lst[0]) 2>>>print 'last element :' +str(lst[-1]) 3>>>print 'first three elements :' +str(lst[0:2]) 4>>>print 'last three elements :'+str(lst[-3:]) 5First element :1 6last element :4 7first three elements :[1, 2,3] 8last three elements :[2, 3, 4] 自助 了解更多不同的数据类型和函数的最佳方法是使用帮助函数,如help() 和 dir(lst)。 可以使用dir(Python对象)命令,列出给定Python对象的所有给定的属性。如果传入一个列表对象,那么这个函数会列出所有可以使用列表执行的酷炫的操作。 1>>>dir(lst) 2>>>' , '.join(dir(lst)) 3'__add__ , __class__ , __contains__ , __delattr__ , __delitem__ , __ 4delslice__ , __doc__ , __eq__ , __format__ , __ge__ , __getattribute__ 5, __getitem__ , __getslice__ , __gt__ , __hash__ , __iadd__ , __imul__ 6, __init__ , __iter__ , __le__ , __len__ , __lt__ , __mul__ , __ne__ , 7__new__ , __reduce__ , __reduce_ex__ , __repr__ , __reversed__ , __rmul__ 8, __setattr__ , __setitem__ , __setslice__ , __sizeof__ , __str__ , __ 9subclasshook__ , append , count , extend , index , insert , pop , remove 10, reverse , sort' 使用help(Python对象)命令,我们可以得到给定Python对象的详细文档,并且这个命令也给出一些示例,告诉我们如何使用Python对象。 1>>>help(lst.index) Help on built-in function index: index(...) 4 L.index(value, [start, [stop]]) -> integer -- return first index of value. This function raises a ValueError if the value is not present. 因此,在Python的任何数据类型上,都可以使用help和dir,并且这是一种非常不错的方式,可用于了解关于函数和对象的其他详细信息。这也提供了一些基本示例,供你在工作中参考,在大部分情况下,这些示例非常有用。 在Python和其他语言中,字符串都非常相似,但是对字符串的操作是Python的主要特征之一。在Python中,使用字符串非常容易。在Java/C中,即使是一些很简单的操作(例如将字符串分割),我们也需要花很大的精力才能做到。然而,在Python中,你会发现这是多么容易。 在应用任何Python对象和函数时,你都可以从先前的help函数中获得帮助。下面使用最常用的数据类型字符串给你提供更多的例子。 Split:这是基于一些分隔符分割字符串的方法。如果不提供任何参数,这个方法默认以空格作为分隔符。 1 >>> mystring="Monty Python ! And the holy Grail ! \n" 2 >>> print mystring.split() 3 ['Monty', 'Python', '!', 'and', 'the', 'holy', 'Grail', '!'] Strip:这个方法可以删除字符串的尾随空格,例如'\n'和'\n\R'。 1 >>> print mystring.strip() 2 >>>Monty Python ! and the holy Grail ! 你是否发现'\n'字符被移除了?还有其他方法(如lstrip()和rstrip())可以移除字符串左侧和右侧的尾随空格。 Upper/Lower:使用这些方法,可以改变字符串中字母的大小写。 1 >>> print (mystring.upper() 2 >>>MONTY PYTHON !AND THE HOLY GRAIL ! Repalce:这个方法可以替换字符串中的子字符串。 1 >>> print mystring.replace('!','''''') 2 >>> Monty Python and the holy Grail 刚才谈到的是一些最常用的字符串函数,函数库中还存在大量的字符串函数。 提示:要了解更多函数和示例,请浏览Python网站。 正则表达式 NLP发烧友的另外一个重要技能是使用正则表达式工作。正则表达式描述了字符串的有效模式匹配。我们大量使用模式提取从众多杂乱无章的文本数据中获得有意义的信息。以下是读者所需要的正则表达式。在我一生中,我所用的正则表达式都不会超过这个范围。 (句点):这个表达式匹配除了换行符\ n外的任意单个字符。 \ w:这个表达式匹配[a~z A~Z 0~9]中的某个字符或数字。 \ W:匹配任何非单词字符。 \ s:这个表达式匹配单个空白字符——空格、换行符(\n)、回车符(\r)、制表符(\t)、换页符(\f)。 \ S:这个表达式匹配任何非空白字符。 \ t:这个表达式执行tab操作。 \ n:这个表达式用于换行符。 \ r:这个表达式用于回车符。 \ d:十进制数字[0~9]。 ^:这个表达式在字符串开始处使用。 $:这个表达式在字符串末尾处使用。 \:这个表达式用于抵消特殊字符的特殊性。 例如,要匹配$符号,可以在它前面加上\。 在现行的例子(即mystring是相同的字符串对象)中,搜索一些内容,并且试图在此字符串对象上寻找一些模式。子字符串搜索是re模块的其中一个通用用例。下面实现这一功能。 1>>># We have to import re module to use regular expression 2>>>import re 3>>>if re.search('Python',mystring): 4>>> print "We found python " 5>>>else: 6>>> print "NO " 一旦执行代码,得到的消息如下。 We found python 可以使用正则表达式进行更多的模式查找。为了找到字符串中的所有模式,我们使用的其中一个普通的函数是findall。这个函数搜索字符串中特定的模式,并且会给出一个包含所有匹配对象的列表。 1>>>import re 2>>>print re.findall('!',mystring) 3['!', '!'] 正如我们所见,在mystring中,有两个“!”实例,findall使用一个列表,返回了这两个对象。 词典 词典是另一种最常用的数据结构,在其他编程语言中,这也称为关联数组/关联记忆(associative array/memory)。词典是使用键(key)进行索引的数据结构,这些键可以是任何不可变的类型,如字符串和数字可以用作键。 词典是非常方便的数据结构,广泛应用于各种编程语言中来实现多种算法。在众多的编程语言中,Python词典是其中一个优雅地实现了散列表的词典。在其他语言中,相同的任务,可能需要花费更多的时间进行更繁重的编码工作,但是使用词典,工作就变得非常容易。最棒的事情是,程序员仅仅使用少量的代码块,就可以建立非常复杂的数据结构。这使得程序员摆脱了数据结构本身,花更多时间专注于算法。 我使用词典中一个很常见的用例,在给定的文本中,获得单词的频率分布。使用以下几行代码,就可以得到单词的频率。你可试着使用任意其他的语言执行相同的任务,马上就会明白Python是多么让人赞叹不已。 1>>># declare a dictionary 2>>>word_freq={} 3>>>for tok in string.split(): 4>>> if tok in word_freq: 5>>> word_freq [tok]+=1 6>>> else: 7>>> word_freq [tok]=1 8>>>print word_freq 9{'!': 2, 'and': 1, 'holy': 1, 'Python': 1, 'Grail': 1, 'the': 1, 'Monty': 101} 编写函数 正如其他编程语言,Python也有其编写函数的方式。在Python中,函数以关键字def开始,然后是函数名和圆括号()。这与其他编程语言相似,即任何参数和参数的类型都放在圆括号内。实际的代码以冒号(:)开头。代码的初始行通常是文档字符串(注释),然后才是代码体,函数使用return语句结束。例如,在给定的例子中,函数wordfreq以def关键字开始,这个函数没有参数,并且以return语句结束。 1>>>import sys 2>>>def wordfreq (mystring): 3>>> ''' 4>>> Function to generated the frequency distribution of the given text 5>>> ''' 6>>> print mystring 7>>> word_freq={} 8>>> for tok in mystring.split(): 9>>> if tok in word_freq: 10>>> word_freq [tok]+=1 11>>> else: 12>>> word_freq [tok]=1 13>>> print word_freq 14>>>def main(): 15>>> str="This is my fist python program" 16>>> wordfreq(str) 17>>>if __name__ == '__main__': 18>>> main() 这与上一节中所写的代码是相同的,使用函数的形式进行编写的思想使得代码可重用和可读。虽然在编写Python代码时解释器方式也很常见,但是对于大型程序,使用函数/类是一种非常好的做法,这也是一种编程范式。我们也希望用户能够编写和运行第一个Python程序。你需要按照下列步骤来实现这一目标。 (1)在首选的文本编辑器中,打开一个空的Python文件mywordfreq.py。 (2)编写或复制以上代码段中的代码到文件中。 (3)在操作系统中,打开命令提示符窗口。 (4)运行以下命令。 $ python mywordfreq,py "This is my fist python program !!" (5)输出应该为: {'This': 1, 'is': 1, 'python': 1, 'fist': 1, 'program': 1, 'my': 1} 现在,对Python提供的一些常见的数据结构,你有了一个非常基本的了解。你可以写一个完整并且能够运行的Python程序。我认为这些已经足够了,使用这些Python的入门知识,你可以看懂本书前几章。 提示:请观看维基百科网站中的一些Python教程,学习更多的Python命令。 NLTK 无须进一步研究自然语言处理的理论,下面开始介绍NLTK。我们从一些NLTK的基本示例用例开始。你们中的一些人,可能已经做过了类似的事情。首先,本节会给出一些典型Python程序员的做法,然后会转到NLTK,寻找一个更加高效、更加强大和更加清晰的解决方案。 下面从某个示例文本内容的分析开始。对于当前的例子,从Python的主页上获得了一些内容如下所示。 1>>>import urllib2 2>>># urllib2 is use to download the html content of the web link 3>>>response = urllib2.urlopen('http://python.org/') 4>>># You can read the entire content of a file using read() method 5>>>html = response.read() 6>>>print len(html) 747020 由于我们对在这个URL中所讨论的主题类型没有任何线索,因此从探索性数据分析(EDA)开始。一般来说,在文本领域,EDA具有多种含义,但是这里讨论一种简单的情况,即在文档中,何种术语占据了主导地位。主题是什么?它们出现的频率有多大?这一过程将涉及某种层次的预处理步骤。我们首先使用纯Python方式,尝试执行这个任务,然后会使用NLTK执行这个任务。 让我们从清理HTML标签开始。完成这个任务的一种方式是仅仅选择包括了数字和字符的标记(token)。任何能够使用正则表达式工作的人员应该能够将HTML字符串转换成标记列表。 1>>># Regular expression based split the string 2>>>tokens = [tok for tok in html.split()] 3>>>print "Total no of tokens :"+ str(len(tokens)) 4>>># First 100 tokens 5>>>print tokens[0:100] 6Total no of tokens :2860 7['', '', '', ''type="text/css"', 'media="not', 'print,', 'braille,'...] 8 正如你所看到的,使用前面的方法,存在过量的HTML标签和其他无关紧要的字符。执行同一任务的相对清洁的版本,如下所示。 1>>>import re 2>>># using the split function 3>>>#https://docs.python.org/2/library/re.html 4>>>tokens = re.split('\W+',html) 5>>>print len(tokens) 6>>>print tokens[0:100] 75787 8['', 'doctype', 'html', 'if', 'lt', 'IE', '7', 'html', 'class', 'no', 9'js', 'ie6', 'lt', 'ie7', 'lt', 'ie8', 'lt', 'ie9', 'endif', 'if', 10'IE', '7', 'html', 'class', 'no', 'js', 'ie7', 'lt', 'ie8', 'lt', 'ie9', 11'endif', 'if', 'IE', '8', 'msapplication', 'tooltip', 'content', 'The', 12'official', 'home', 'of', 'the', 'Python', 'Programming', 'Language', 13'meta', 'name', 'apple' ...] 现在,这看起来清爽多了。但是,你可以做更多的事情,使代码变得更加简洁。这里将这项工作留给你,让你尝试移除尽可能多的噪声。可以清除一些仍然弹出的HTML标签。在这个例子中,字长为1的单词(如7和8这样的元素)仅仅是噪声,你可能希望以字长作为标准,移除这些单词。现在,与其从头开始编写一些预处理步骤的代码,不如将目光转移到NLTK,使用NTLK执行相同的任务。有一个函数clean_html(),这个函数可以执行所需要的所有清洁工作。 1>>>import nltk 2>>># http://www.nltk.org/api/nltk.html#nltk.util.clean_html 3>>>clean = nltk.clean_html(html) 4>>># clean will have entire string removing all the html noise 5>>>tokens = [tok for tok in clean.split()] 6>>>print tokens[:100] 7['Welcome', 'to', 'Python.org', 'Skip', 'to', 'content', '▼', 8'Close', 'Python', 'PSF', 'Docs', 'PyPI', 'Jobs', 'Community', '▲', 9'The', 'Python', 'Network', '≡', 'Menu', 'Arts', 'Business' ...] 这很酷炫,对吧?这种方法绝对更加清洁,也更容易执行。 下面尝试获得这些术语的频率分布。首先,我们使用纯Python的方式执行这个任务,然后,我将告诉你NLTK的秘诀。 1>>>import operator 2>>>freq_dis={} 3>>>for tok in tokens: 4>>> if tok in freq_dis: 5>>> freq_dis[tok]+=1 6>>> else: 7>>> freq_dis[tok]=1 8>>># We want to sort this dictionary on values ( freq inthis case ) 9>>>sorted_freq_dist= sorted(freq_dis.items(), key=operator.itemgetter(1), 10reverse=True) 11>>> print sorted_freq_dist[:25] 12[('Python', 55), ('>>>', 23), ('and', 21), ('to', 18), (',', 18), ('the', 1314), ('of', 13), ('for', 12), ('a', 11), ('Events', 11), ('News', 11), 14('is', 10), ('2014-', 10), ('More', 9), ('#', 9), ('3', 9), ('=', 8), 15('in', 8), ('with', 8), ('Community', 7), ('The', 7), ('Docs', 6), 16('Software', 6), (':', 6), ('3:', 5), ('that', 5), ('sum', 5)] 自然而然地,由于这是Python主页,因此Python和(>>>)解释器符号是最常见的术语,这也展示了网站的第一感觉。 一个更好并且更有效的方法是使用NLTK的FreqDist()函数。为了进行对比,我们可以观察之前开发的执行相同任务的代码。 1>>>import nltk 2>>>Freq_dist_nltk=nltk.FreqDist(tokens) 3>>>print Freq_dist_nltk 4>>>for k,v in Freq_dist_nltk.items(): 5>>> print str(k)+':'+str(v) 6>>': 23, 'and': 21, ',': 18, 'to': 18, 'the': 714, 'of': 13, 'for': 12, 'Events': 11, 'News': 11, ...> 8Python:55 9>>>:23 10and:21 11,:18 12to:18 13the:14 14of:13 15for:12 16Events:11 17News:11 18 现在,让我们做一些更有趣的事情,画出这些频率分布。 1>>>Freq_dist_nltk.plot(50, cumulative=False) 2>>># below is the plot for the frequency distributions 可以看到,累积频率持续增长,整体上,曲线有一条长长的尾巴。一些噪声依然存在,一些单词(如the、of、for和=)是毫无用处的。对于这些单词(如the、a、an等),使用术语停用词(stop word)来称呼它们。由于在大部分文档中不定代词一般都会出现,因此这些词没有什么判别力,不能传达太多的信息。在大多数的NLP和信息检索任务中,人们通常会删除停用词。让我们再次回到当前的示例中。 1>>>stopwords=[word.strip().lower() for word in open("PATH/english.stop. 2txt")] 3>>>clean_tokens=[tok for tok in tokens if len(tok.lower())>1 and (tok. 4lower() not in stopwords)] 5>>>Freq_dist_nltk=nltk.FreqDist(clean_tokens) 6>>>Freq_dist_nltk.plot(50, cumulative=False) 现在,这看起来干净多了!在完成了这么多任务后,可以访问Wordle,将频率分布转换成CSV格式。你应该能够得到以下词云。 《Python和NLTK自然语言处理》 书号:978-7-115-50334-3 推荐理由:NLTK是自然语言处理领域中非常受欢迎和广泛使用的Python库。NLTK的优点在于其简单性,其中大多数复杂的自然语言处理任务使用几行代码即可完成。本书旨在讲述如何用Python和NLTK解决各种自然语言处理任务并开发机器学习方面的应用。本书介绍了NLTK的基本模块,讲述了采用NLTK实现自然语言处理的大量技巧,讨论了一些文本处理方法和语言处理技术,展示了使用Python实现NLP项目的大量实践经验。本书主要内容包括文本挖掘/NLP任务中所需的所有预处理步骤,如何使用Python 3的NLTK 3进行文本处理,如何通过Python开展NLP项目。 本书适合NLP和机器学习领域的爱好者、Python程序员以及机器学习领域的研究人员阅读。 - END -
在多种趋势榜单中,Java、C、Python 已成编程语言界的新任“铁三角”。而在开发者日常使用以及讨论中,编程语言又有什么样的现状? 近日,一年仅发布两次编程语言榜单的美国知名软件开发者行业分析公司 RedMonk 正式发布了 2019 年 Q1 季度的编程语言排行榜。与此前一月一发的 TIOBE 编程语言榜单不同,RedMonk 的编程语言排行榜数据主要来源于开发者最常使用的代码分享之 GitHub 社区和讨论之 Stackoverflow 社区。 其中 GitHub 的数据源是 GitHub Archive,而 Stack Overflow 则是基于 data explorer 工具收集所需的指标,以便开发者可深入了解潜在编程语言的未来应用趋势。 下面,我们就来一起看一下这份榜单。 2019 年 1 月发布 细细看来,该编程语言排行榜的 Top 20 如下所示: 1. JavaScript 2. Java 3. Python 4. PHP 5. C# 6. C++ 7. CSS 8. Ruby 9. C 10. Objective-C 11. Swift 12. Typescript 13. Scala 14. Shell 15. Go 16. R 17. PowerShell 18. Perl 19. Haskell 20. Kotlin 从中我们发现,更受欢迎的不是在企业级应用程序中使用最多的 Java,而是 JavaScript。此外,和去年 6 月,RedMonk 发布的编程语言排行榜相比,新的榜单并没有过多的浮动。 2018 年 6 月 事实上,一般来说,编程语言排行榜的前 10-12 种语言,每月甚至于每年几乎都没有太大的变化。虽然在如 GitHub 或者 Stack Overflow 等平台上,开发者在开发时所使用的技术每年可能会根据兴趣爱好或者项目需求发生一定的变化,但是主流且可获得高收益的编程语言就那么几种,这样的现状也导致新的语言想要在一堆强劲竞争的主流编程语言中提升排名越来越难。 不过在此次的榜单中,还是有几个值得我们关注的一些变化: TypeScript,和去年排行榜相比,上升了四个名次,位列第 12 名。在此也如上文所述,在如今几大主流编程语言当道之时,其他编程语言排名上升实属不易,而通过一年的时间,TypeScript 可以上升四个名次,这也是为什么其会如此值得我们关注的原因。而考量其中缘由,也必然和排名第一的 JavaScript 不无关系。众所周知,TypeScript 是 JavaScript 类型的超集,它可以编译成纯 JavaScript,同时在安全功能,如可选的静态类型检查等方面有很大的提升。但是仅凭功能特性本身不足以快速推动语言的发展,因此它必须通过广泛的项目来推广。近两年,GitHub 上出现了不少有关 TypeScript 的库以及项目。 Go 和 R 分别下降了一个名次:从宏观角度来看,这样轻微的浮动可以忽略不计。不过对于 R 语言来说,其在数据分析和机器学习领域的工具中依然占很大比重。但同时也鉴于 R 的领域局限性,其发展前景应该进不了排行榜的 Top 10。另一款语言,Go,虽然它在技术上受到了高度重视,并且也在各种基础设施项目中广受欢迎,但是到目前为止,它并没有任何的能力证明它会去遵循 Java 的成功脚步。 Kotlin 上升 8 位,进入 Top 20;Scala 下降一名;Clojure 下降 3 名;Groovy 下降三名:在本季度的编程语言排行榜中,变化较大的要属基于 JVM 的语言,如 Clojure、Groovy、Scala 均有所下降,而新贵 Kotlin 反而大幅增长。目前,Kotlin(第 20 名)仍然远远落后于 Scala(第 13 名),但是根据 RedMonk 的历史编程语言排行榜来看,Kotlin 的增长仅次于 Swift,所以,其未来值得期待。 对此,你怎么看? 更完整的报告,可查看: https://redmonk.com/sogrady/2019/03/20/language-rankings-1-19/ 一个编程语言一本畅销书 《Python编程快速上手——让繁琐工作自动化》 作者:【美】Al Sweigart 斯维加特 译者:王海鹏 推荐理由: 美亚畅销Python编程入门书 资深Python程序员力作 带你快速掌握Python高效编程 在本书中,你将学习利用Python 编程,在几分钟内完成手工需要几小时的工作,而事先却无需具备编程经验。一旦掌握了编程的基础知识,你就可以毫不费力地创建Python 程序,完成高效的自动化工作 本书是一本面向实践的Python编程实用入门指南。本书的目的,不仅是介绍Python语言的基础知识,而且还通过项目实践教会读者如何应用这些知识和技能。本书的第一部分介绍了基本Python编程概念,第二部分介绍了一些不同的任务,通过编写Python程序,可以让计算机自动完成它们。第二部分的每一章都有一些项目程序,供读者学习。每章的末尾还提供了一些习题和深入的实践项目,帮助读者巩固所学的知识。附录部分提供了所有习题的解答。 《C Primer Plus(第6版)中文版》 作者:【美】Stephen Prata(史蒂芬 普拉达) 译者:姜佑 推荐理由: 畅销30余年的C语言编程入门教程 近百万程序员的C语言编程启蒙教程;技术大牛案头常备的工具书 针对C11标准库更新 蔡学镛 孟岩 高博倾力推荐。 本书是一本经过仔细测试、精心设计的完整C语言教程,它涵盖了C语言编程中的核心内容。作为计算机科学的经典著作,讲解了包含结构化代码和自顶向下设计在内的程序设计原则。 《C++ Primer Plus(第6版)中文版》 作者:【美】Stephen Prata 译者:张海龙, 袁国忠 推荐理由: 一本经久不衰的C++畅销经典教程; 首本支持C++11新标准的程序设计图书。 它被誉为“开发人员学习C++的必备教程,没有之一”! 本书可以说是一本面向从未学习过C语言甚至是从未学习过编程的人的入门书籍,它的首章从基础内容讲起,先介绍了传统编程的规则,后面才着重讲解有关面向对象——C++的精髓之一——的有关内容。整个书的结构安排较为合理,难度爬升较慢。 《Linux就该这么学》 作者:刘遄 推荐理由: 本书源自日均阅读量近万次火爆的线上同名课程 口碑与影响力俱佳 旨在打造简单易学且实用性强的轻量级Linux入门教程。 本书基于红帽RHEL系统编写,且内容通用于CentOS、Fedora等系统。本书共分为20章,内容涵盖了部署虚拟环境、安装Linux系统;常用的Linux命令;与文件读写操作有关的技术;使用Vim编辑器编写和修改配置文件;用户身份与文件权限的设置;硬盘设备分区、格式化以及挂载等操作;使用PXE+Kickstart无人值守安装服务;使用LNMP架构部署动态网站环境等。此外,本书还深度点评了红帽RHCSA、RHCE、RHCA认证,方便读者备考。 《重构:改善既有代码的设计(第2版)(精装版)》 作者:[美]马丁•福勒(Martin Fowler) 译者:熊节,林从羽 推荐理由: 世界软件开发大师的不朽经典 生动阐述重构原理和具体做法 普通程序员进阶到编程高手必须修炼的秘笈 本书是经典著作《重构》出版20年后的更新版。书中清晰揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以求改善。书中给出了60多个可行的重构,每个重构都介绍了种经过验证的代码变换手法的动机和技术。本书提出的重构准则将帮助开发人员小步地修改代码,从而减少了开发过程中的风险。 4月上市畅销新书 《深入浅出Docker》 作者:【英】Nigel Poulton(奈吉尔 波尔顿) 译者:李瑞丰, 刘康 推荐理由: 亚马逊畅销图书作者,存储专家,Docker技术先驱Nigel Poulton全新作品 美亚操作系统排名第一的Docker入门书 被业内誉为:高中生也能看得懂的经典入门书 本书是一本Docker入门图书,全书分为17章,从Docker概览和Docker技术两部分进行全面解析,深入浅出地介绍了Docker的相关知识,清晰详细的操作步骤结合大量的实际代码帮助读者学以致用,将Docker知识应用到真实的项目开发当中。 《Scratch 3.0少儿游戏趣味编程》 作者:李强 李若瑜 推荐理由: 全彩印刷, 3个层级、15个精彩游戏寓教于乐 提供示例代码和编程素材下载,方便小朋友自学。 注重基础知识的介绍和铺垫,训练编程思维。 本书通过15款有趣的小游戏和小程序,由浅入深地向读者介绍Scratch 3.0编程的基本技能以及程序设计的思维和方法。 按照初级、中级和高级3个难度层次,详细介绍15款趣味游戏的开发过程。 《Scratch 3.0少儿编程趣味课》 作者:李强 林子为 郝敬轩 推荐理由: 全彩印刷,40个丰富多彩的项目,2个完整游戏案例 做中学,动手学,轻松掌握Scratch 3.0创意和编程 提供代码和素材下载 方便亲子互动和自学 Scratch 3.0是美国麻省理工学院(MIT)发布的新版编程语言和平台,相较于Scratch 2.0,功能和界面进行了较大的更新。 本书是学习Scratch 3.0创意和编程的趣味课程指南。本书从少儿学编程的基础和准备出发,介绍了Scratch 3.0的界面和功能,并通过30多个项目示例,详细展示了各类积木的用法和编程技巧,以及如何将Scratch 3.0与众多流行的硬件结合进行编程开发。最后,通过两个完整的游戏案例的开发,展示了如何综合应用前面课程所学的知识和技能。 《Python编程从入门到精通》 作者:叶维忠 推荐理由: 325个实例,更多的时间演练机会;650个拓展范例,真正地举一反三 1980分钟视频讲解,降低学习难度 ;63个技术解惑,破解学习难点 77个课后练习,巩固学习成效 ;2大综合实例,达到学习以致用 一本书包含3本书的内容:基础、范例、综合实战 超值赠送Python常见故障查询手册 本书循序渐进、由浅入深地详细讲解了Python 3语言开发技术,并通过具体实例演练了各个知识点的具体使用流程。全书共计23章,内容循序渐进,以“技术解惑”和“范例演练”贯穿全书,引领读者全面掌握Python语言。 《 Python机器学习》 作者:[印]阿布舍克·维贾亚瓦吉亚(Abhishek Vijayvargia) 译者:宋格格 推荐理由: Python机器学习实用入门书 本书提供配套资源可供读者下载 《Python机器学习》通过解释数学原理和展示编程示例对机器学习进行了系统、全面的解析。 本书共分为12章,内容涵盖了机器学习以及Python语言的基础知识、特征工程的概念与操作技术、数据可视化技术的实现、监督学习及无监督学习算法、文本分析、神经网络和深度学习、推荐系统的构建方法以及预测处理时间序列的方法等。 - END -
Docker 是 Golang 编写的, 自 2013 年推出以来,受到越来越多的开发者的关注。如果你关注最新的技术发展,那么你一定听说过 Docker。不管是云服务还是微服务(Microservices),越来越多的厂商都开始基于 Docker 作为基础设施自动化的工具。那么什么是 Docker?Docker怎么学? 今天我们有幸邀请到了《深入浅出Docker》译者李瑞丰老师,来听听他的所思所想。 异步社区:可以介绍一下自己吗?目前正在做哪些事情? 李瑞丰:我在2012年毕业于山东大学计算机科学与技术专业,同年7月加入英孚泰克,负责公司教育、气象等领域的多个项目开发。2015年加入浪潮信息,参与了虚拟化平台项目的建设,负责其中虚拟化存储相关工作。2017年加入美团外卖,负责门店相关业务的研发工作。长期关注新兴技术方向,对CI/CD保持极大的热情。 异步社区:是什么原因开始翻译《深入浅出Docker》一书的?您是如何评价这本书的? 李瑞丰:之前在浪潮时,参与研发的产品就属于虚拟化 & 云平台方向,所以一直也对相关领域的技术长期保持关注。但是网上的资料良莠不齐,学习的时候也遇到了不少痛点。机缘巧合中了解到《深入浅出Docker》已经被人邮谈下版权并且正在招募译者,而正好之前也看过这本书的英文版,觉得很不错,讲述的内容通俗易懂,不失为Docker初学者上手学习的佳作。 异步社区:《深入浅出Docker》最想推荐给谁看?怎么看? 李瑞丰:本书的内容相对基础,同时包含丰富的实操示例,非常适合Docker新手入门学习。此外,本书还包含了DCA考试相关的全部内容,并且Docker相关知识结构覆盖得很全面,对已经上车的Docker老司机也能起到查缺补漏的功效。 本书分为两大块:Docker概览与Docker技术,概览部分是对Docker历史发展&当前现状的一个整体介绍,同时包含了环境安装的相关步骤;Docker技术部分则循序渐进的对Docker核心技术点进行介绍,章节之间具有一定的递进关系。概览部分的内容,如果对Docker不熟悉的话强烈建议阅读,能很好地帮助理解Docker相关功能 & 特点。 Docker技术部分对于新手来说,建议循序渐进的方式依次学习; 对于Docker老司机来说,则可以有针对性的选择自己不熟悉的知识点对应章节进行学习; 对于想要参加DCA认证的同学,可以参考附录B,查看DCA考试相应知识点对应章节的内容,有针对性的进行学习 & 准备。 异步社区:Docker于2017年秋发布了第1版专业资质认证,称为Docker认证工程师,《深入浅出Docker》中覆盖了认证考试的所有知识点,对于想通过认证的读者,您有哪些建议? 李瑞丰:DCA是唯一的Docker官方认证,从权威性上来讲,毋庸置疑。 对于有丰富经验的Docker相关行业从业者,DCA是对自己Docker基本功的查缺补漏; 而对新入门的Docker工程师,DCA能帮助他们快速,完整的了解整个Docker的知识网络,为后续的发展构建一个良好的基础。 另外国内目前DCA相关资料比较缺乏,Nigel Poulton的这本书也为读者提供了很好的了解DCA的方式,非常值得一读。 异步社区:本书作者Nigel Poulton,亚马逊畅销图书作者,Docker Captains专家,存储专家,Docker技术先驱,您觉得作者在业内的影响力有哪些? 李瑞丰:Nigel Poulton作为Docker社区的领军人物,熟悉Docker相关技术并且热衷分享。著有Data Storage Networking,The Kubernetes Book,对操作系统和虚拟化技术有着深刻的理解。Nigel致力于创作最好的Docker和容器教学资源,在www.pluralsight.com上已经上传了16部相关的视频教学资料,对Docker和容器的推广有着重要的作用。 异步社区:曾经一度是容器代名词的 Docker,从开源创新者到转向企业用户,您怎么看待这件事? 李瑞丰:这也是开源软件发展的一种方式吧,并且是有着不少成功先例的。毕竟Docker的维护和迭代需要不少的人力和精力,单纯的开源社区模式运作起来会比较困难。同时Docker结合一些编排工具(如k8s)等,能帮助企业用户解决自身环境运维的很多痛点,转型企业用户也就成了一件水到渠成的事儿了。与此同时,to B 方向成功还能更好的反哺社区,保证社区的健康,良好的发展。所以在我看来,最终还是一件好事儿的。 异步社区:为什么有人会选择Docker而非大型二进制文件? 李瑞丰:PS:这个问题可能有点歧义,更常见的比较应该是Docker vs fat binary file。 关于fat binary file和Docker,在我个人看来,其实更像是两个不同层面的东西。如果单独将image拎出来,可能跟fat binary file还比较接近,但docker整体上,更偏向与一个工程问题的解决方案。选择Docker的可能性有很多,大部分都是因为Docker解决实际生产环境中的工程性问题,从而带来了效率的提升。 举一个例子:大型多服务部署场景下,如何管理各微服务的依赖、部署、启动等等流程?这个是 fat binary file所无法解决的。 异步社区:针对刚刚工作的小白,学习Docker您有哪些建议? 李瑞丰:尽量选择一本有体系性的书作为入门材料(如本书,),第一时间建立一个全面的知识网络是很重要的一件事儿。此外就是多加练习,有条件可以在公有云服务商上进行相应的实操,过程中会遇到很多读书本碰不到的问题,并且实际的印象也会深刻很多。 异步社区:Docker的优势是什么?您觉得最适合应用在哪些场景? 李瑞丰:Docker来源自VM,是一种更轻量级的虚拟化解决方案。比如现在的互联网公司中,频繁迭代部署的场景,包括弹性的扩容缩容需求,就非常适合使用Docker来支持。 异步社区:学习Docker除了书籍您最常逛的技术博客有哪些?有学习技巧可以推荐吗? 李瑞丰:如果英语基础不错,首推官网: https://docs.docker.com/; 如果一定要看中文的话,可以参考: http://www.docker.org.cn/, 其中有一个资源帖: http://www.docker.org.cn/page/resources.html,比较不错。 【英】Nigel Poulton(奈吉尔 波尔顿) 深入浅出Docker 在美国亚马逊,有一本书的影响力超高的Docker入门书,在操作系统分类中排行第一,超越了众多实力派Docker书,众多五星好评。也许你有所耳闻,这本书就是《深入浅出Docker》。 这是一本关于Docker的图书。这本书的宗旨是从零开始学习Docker,因此你无须任何前置知识储备。如果你对Docker感兴趣,希望了解Docker工作原理以及如何正确使用Docker,则本书适合你。同时本书也可作为Docker认证工程师考试的参考图书。 - END -
去年有一款名叫CoderMindz的棋类游戏在硅谷名声大噪,它的前身CoderBunnyz发布不到一年时间,销量超过1000余套,销售额以超35000美元,因此大家对新款CoderMindz充满期待。 而这款游戏的开发者,竟然是来自硅谷的10岁女童萨麦拉·梅塔(Samaira Mehta)。靠着自己出色的“编程”技术,被全球媒体誉为“硅谷未来之星”,连扎克伯格都赞她“年少有为”。 早在2015年,美国前总统奥巴马在接受媒体采访的时候就表示:“我们需要让孩子们参与数学和科学,这不仅仅是一小部分孩子,而应该是所有人。所有人都应更早地学习如何编程。” 在美国,STEAM教育理念受到普遍的重视和运用。孩子从比较小的年龄,就开始接受科学、技术、数学、艺术等方面的启蒙和熏陶。 在我国,特别是在一些经济比较发达的省份和地区,以中小学信息技术课程为基础的少儿编程教育也起步和发展较早。2014年,浙江省教育改革方案中,将信息技术科目(包含编程)纳入高考。 2018年,国务院发布《新一代人工智能发展规划》,提出完善人工智能教育体系,在中小学阶段设置人工智能相关课程,逐步推广编程教育。同年,全国计算机等级考试开始加入Python语言的内容。随后,一些省份在教育改革中加大了对编程的重视力度,山东省在小学六年级的信息技术教材中加入Python的内容,广东省也计划将信息技术纳入高考内容。 除了学校教育,校外的少儿编程培训也如雨后春笋般地迅速发展起来,很多培训机构都开设了少儿编程的相关课程。 1 为什么要学编程? 为什么人们对学习计算机编程的热情激增,尤其是对于孩子学习编程如此重视呢? 编程对孩子们想象力、创造力的启迪以及里面所呈现的对逻辑思维的探索精神,是其他任何阅读书籍都无法媲美的。 Scratch 3.0少儿编程趣味课 学习编程至少对孩子有以下几个方面的好处。 1.开发思维,增强逻辑思维能力 当学习编程的时候,孩子会成为一个很好的思考者。例如,孩子将学会如何把复杂的问题分解成简单的部分(也就是我们常说的分而治之的原理),学会如何找到问题并进行调试和解决,学会如何在一段时间内不断地迭代、完善和改进解决方案。而所有这些思维策略,一言以蔽之,就是“计算思维”的概念。在不知不觉之中,孩子的计算思维得到了开发,逻辑思维能力得到了增强。 学会了计算思维和逻辑思维,孩子们将会发现它不仅适用于计算机方面,而且也适用于所有的解决问题和设计活动中,甚至是生活的方方面面,例如,统筹烧开水沏茶的时间、确定按照菜谱炒菜的顺序、在超市中走最短的路径找到所有要买的东西等等。 2.培养孩子的专注力和细心程度 兴趣是最好的老师。一旦培养了对编程的兴趣,孩子就愿意投入时间、精力和热情来做这件事。此外,前面提到的查找问题并进行调试,几乎是编程过程中必不可少的步骤。有的时候,非常细微的错误,会导致程序无法运行。而无论是调试错误还是学会避免错误,都能够培养孩子的细致程度和耐性。 3.增加孩子的抽象思考能力 前面提到,编程和写作一样,是一种表达方式,更进一步来说,它们都是一种比较抽象的表达方式。具体来说,孩子需要把抽象的思路和想法,用有形的、具象化或符号化的东西表达出来。从这一点来说,编程是写作的一种延伸,它要求你“书写”出创新的东西,而这是以前所没有的东西,例如故事、游戏、动画、模拟等等。如果没有抽象思考的能力,不能充分发挥自己的想象力的话,是很难做到编程创新的。 4.增强孩子思考能力和动手解决问题的能力 编程的过程中,总是会面临一道道的关卡和挑战,这就要求孩子开动脑筋,积极思考,并且学会利用已有的知识、手边的资源、伙伴和老师或家长的帮助来解决问题。一旦养成这种思考和解决问题的习惯,给孩子带来的成长和收获是巨大的——当他们面对现实生活中形形色色的问题的时候,也将会积极思考,不断尝试和破解难题。 5.培养认同感和成就感 最后,学会编程还将给孩子带来巨大的认同感和成就感。在现代社会中,数字科学和信息技术已经相当普及,而且其发展日新月异,这些都极大地影响和改变着我们的社会和生活。一旦掌握了用数字技术表达自己和解决问题的能力,孩子就会用全新的视角来看待自己,并且会因为拥有这一技能且对社会做出贡献而获得极大的成就感。 编程竟然对孩子有这么多的好处,那么你还等什么呢?还不快抓住机会,让你的孩子来学习和掌握这种技能,以这种方式来进行流畅的表达! 2 孩子学编程为什么要学Scratch? 计算机编程语言的发展大概有几十年的历史。这期间,编程语言经历了从低级语言向高级语言发展的过程。我们这里所说的低级语言和高级语言,并不是指语言的功能和水平等,而且是指编程语言与人类自身语言的接近程度上的区别。低级的语言更加接近于机器语言,计算机理解起来比较容易,人类理解起来比较困难,这是比较底层的语言。而高级语言的语法和表达方式,更加接近于人类自身的语言,需要通过一种叫作编译器和解释器的东西(你可把编译器和解释器想象成翻译人员)将其转换为计算机比较容易理解的机器语言,然后机器才能执行。 各种编程语言的分类和层级如下图所示。 你一定已经听说过一些编程语言的名字,比如C、C++、Java、Python等等。我们现在所接触的这些现代编程语言,一般来说都是高级编程语言,其语法和人类自然语言比较接近,需要经过编译器或解释器才能转换为机器语言。还有一些更加易于学习的可视化语言,比如Scratch就是一种可视化语言,它们是在高级语言的基础上,经过包装或定制后,才成为更加容易学习和理解的编程语言的。 你可能会问,为什么不直接学习C、C++、Python这样的高级语言,而要学习Scratch这样的可视化语言呢?这主要是因为Scratch对于青少年来说更加容易理解和上手。Scratch包含了讲故事、做动画、设计游戏等功能元素,而这些元素都特别能够激发孩子的学习兴趣。等到他们通过Scratch逐渐熟悉和掌握了编程语言的一些基本原理,再去进一步学习Python或C++等高级语言,就会容易很多。 因此,学习编程需要一个从易到难的过程,而Scratch真的是一种更不错的入门语言,对于孩子来说更是最佳的选择。 2018年8月1日,Scratch 3.0测试版发布,这是自2013年Scratch 2.0问世以来的又一次升级。Scratch 3.0将能够在平板电脑和手机上使用,并且加入了更丰富的图像编辑、声音编辑、谷歌翻译等功能。另外,Scratch 3.0还可以与LEGO MINDSTORMS EV3和LEGO EDUCATION WeDo 2.0兼容。2019年1月3日,Scratch 3.0正式发布。 大部分教授编程的基础教程都是通关式的,孩子们创建一个程序,移动一个虚拟角色,让它做一些事情并达成目标。孩子们在编写程序解决问题的过程中,就学习到了编码的技能和计算机科学的概念。 但Scratch不同。作为Scratch的缔造者,米切尔·雷斯尼克及其团队认为Scratch不仅是一种编程语言,更是一个在线学习社区。Scratch专注项目,而不是问题解决,它鼓励孩子们创造自己的互动故事、游戏和动画,从创意开始,把这些想法实现为项目,然后再和其他人分享。 考虑到Scratch线上社区里不同受众的特点,围绕Scratch衍生的内容也日渐增多。ScratchEd是为教育者专门开发的独立线上资源社区,支持故事分享、互动教育资源、线上讨论等功能。目前,ScratchEd上的教育者资源覆盖幼儿园到大学全学段,内容类型包括教案、课程、评测、教材等,涉及的学科领域有数学、音乐、社会科学、视觉艺术等。 Scratch主要面向8~16岁儿童,而ScratchJr则主要针对5~7岁低龄儿童。相比Scratch,ScratchJr以平板电脑为载体,编程模块的体积更大、素材库中的图片更多、拼插方式也更直接。ScratchJr的界面示意图如下。 除了线上学习社区,Scratch还在世界各地举办名为“Scratch Day”的线下交流活动。2017年,全球举办了超过1000场Scratch Day活动。在各种社交媒体的Scratch社区和论坛,人们用各种语言记录着Scratch Day的编程、分享和游戏体验。 未来的世界充满了新鲜的事物。今天绝大多数的孩子,未来所从事的工作都离不开创造力和创造性。不管是什么年龄段的孩子,学习Scratch不仅能够培养他们的计算思维和创造能力,还能让他们和同龄人、老师和家长分享和沟通。Scratch是孩子们走向未来的一个“创造力游乐场”。 3 学习编程要学哪些书? - END -
杨绛在《读书苦乐》里说: “读书就好比到世界上最杰出的人家里去串门,要参见钦佩的老师或拜谒有名的学者,不必事前打招呼求见,也不怕搅扰主人"。翻开书面就闯入大门,翻过几页就升堂入室;而且可以经常去,时刻去,如果不得要领,还可以不辞而别,或者另就高明,和他对质。 对于爱好读书的人,读书的极大乐处就在于此:可以追求完全的精神享受。 互联网发展日新月异,互联网人时刻都有充电提高的需求,程序员读新书更是为了提升专业技能。3月异步新书上新,不仅有马丁大叔的重磅作品,更有不同领域新书升级,包含了Linux、Python、机器学习、算法、C++、Docker等等。相信它们值得你“浪费”时光。 3月异步新书上新 重构:改善既有代码的设计(第2版) 作者:马丁·福勒(Martin Fowler) 它在世界范围内畅销不衰,被翻译为中、德、日、俄等众多语言。 这本经典书20年后重磅升级,更新内容超30%,更新了众多项目案例。 本书是经典著作《重构》出版20年后的更新版。书中清晰揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以求改善。书中给出了60多个可行的重构,每个重构都介绍了种经过验证的代码变换手法的动机和技术。本书提出的重构准则将帮助开发人员小步地修改代码,从而减少了开发过程中的风险。 深入浅出Docker 作者:【英】Nigel Poulton(奈吉尔 波尔顿) 著 本书作者Nigel Poulton,亚马逊畅销图书作者,存储专家,Docker技术先驱。Nigel有丰富的运维技术经验,著有多部容器相关的图书,并开设了视频培训课程,在业界有非常大的影响力。 本书持续位居亚马逊榜单前列,图书内容经过多次补充完善,保证核心技术的实时更新。作为一本Docker实践指导手册,《深入浅出Docker》能够帮助读者从零开始走进Docker的世界。想要通过Docker认证工程师(DCA)考试的读者也将从本书中获益。 是一本高中生也能看得懂的入门书。 Scratch 3.0少儿游戏趣味编程 作者:李强 李若瑜 畅销书《Scratch 2.0少儿游戏趣味编程》后,作者又一力作。 采用全新Scratch 3.0 全彩印刷, 3个层级、15个精彩游戏寓教于乐 提供代码和素材下载,方便亲子互动和自学 本书通过15款有趣的小游戏和小程序,由浅入深地向读者介绍Scratch 3.0编程的基本技能以及程序设计的思维和方法。 适合6岁以上孩子学习。 Scratch 3.0少儿编程趣味课 作者 李强 林子为 郝敬轩 全彩印刷,40个丰富多彩的项目,2个完整游戏案例 做中学,动手学,轻松掌握Scratch 3.0创意和编程 提供代码和素材下载 方便亲子互动和自学 本书是学习Scratch 3.0创意和编程的趣味课程指南。本书从少儿学编程的基础和准备出发,介绍了Scratch 3.0的界面和功能,并通过30多个项目示例,详细展示了各类积木的用法和编程技巧,以及如何将Scratch 3.0与众多流行的硬件结合进行编程开发。最后,通过两个完整的游戏案例的开发,展示了如何综合应用前面课程所学的知识和技能。 软件工程(第4版•修订版) 作者 [美] 莎丽•劳伦斯•弗里格(Shari Lawrence Pfleeger) [加] 乔安妮•M. 阿特利(Joanne M. Atlee) 软件工程领域公认的经典名著,国际上众多名校采用的软件工程课程的经典教材,配有教学PPT和习题答案等丰富的教学资源。 本书分为3个部分:第一部分讨论项目计划的相关概念及其与软件开发过程的相关性;第二部分论述开发和维护的主要步骤;第三部分讲述软件评估和改进。两个贯穿全书的研究案例——一个信息系统和一个实时系统,以及书中的学期项目,引导读者很好地将概念有机地应用到实际项目中去。 Python和NLTK自然语言处理 作者:[印度] 尼天•哈登尼亚 本书是一本运用NLTK和其他Python库构建专业NLP和机器学习项目的学习指南。 详细讲述如何用Python和NLTK解决各种自然语言处理任务并开发机器学习方面的应用,涵盖NLTK的基本模块、自然语言处理的技巧,文本处理方法,以及使用Python实现NLP项目的大量实践经验。 Power Query For Excel:让工作化繁为简 作者:曾贤志 51CTO学院金牌讲师,“我要自学网”专家讲师曾贤志全新作品 Power Query是Excel中的新技术。Excel 2016版本中,默认增加了 Power Query 功能,此功能在Excel 2010或Excel 2013版本需要以插件形式安装使用。 Excel用户升级换代之利器,利用Power Query降低职场人士的技术成本、时间成本,实现数据处理的自动化。它比工作表函数更强大、比SQL更灵活、比VBA更简洁。 本书共6章,采用由浅入深、理论与实战相结合的方式,从操作和代码两个层面讲述Excel最新数据分析利器—Power Query的使用。 Unity 游戏开发技术详解与典型案例 作者:吴亚峰 徐歆恺 苏亚光 全面讲解了Unity2018的新特性 讲解了在Unity平台下进行3D应用开发各方面的知识,内容由浅入深,案例详细实用。 内容不仅包含了Unity 3D开发的知识,同时也包含了基于着色器语言、高级光影效果、动画等技术所实现的高级特效,以及Unity 3D强大的物理引擎与完整的游戏案例,帮助读者进一步提高开发水平。 本书对Unity 3D集成开发环境界面、脚本的编写和众多高级特效的实现进行了详细介绍。 C++ 黑客编程揭秘与防范(第3版) 作者 冀云 本书是上万名读者的选择,内容几乎涵盖了反病毒领域的所有知识,认真阅读完之后,就具备了成为一名反病毒工程师的基本素养。本书无疑是一本极好的引路名师。 市面上关于黑客入门的书籍较多,比如黑客图解入门类、黑客工具详解类、黑客木马攻防类等,但是,对于很多读者来说,可能并不是掌握简单的工具就够了。很多读者学习黑客知识是为了真正掌握与安全相关的知识。与安全相关的知识涉及面比较广,包括数据安全、存储安全、系统安全、Web安全、网络安全等,本书围绕Windows系统下应用层的开发来介绍一些安全方面的知识。 2月畅销新书 奔跑吧 Linux内核 入门篇 ISBN:978-7-115-50226-1 《奔跑吧 Linux内核》作者又一力作,内含70余个创新实验,配套视频+教学PPT,带你轻松入门Linux内核开发! 本书卖点 1. 原理+基础,从调试Linux内核到动手编写一个简单的内核模块,真正从零开始学习Linux内核。 2. 实验+案例,70余个创新实验贯穿全书,与你分享业内一线项目经验。 3. 课件+视频,教学资源丰富,视频讲解透彻,与你共享精品在线配套资源。 4. 涵盖当前Linux社区中新的开发工具和社区运作方式,反映Linux内核社区新发展。 内容提要 本书是一本介绍Linux内核实践的入门书,基于Linux 4.0内核,重点讲解Linux内核的理论和实验。本书分为12章,包括Linux系统入门、Linux内核基础知识、内核编译和调试、内核模块、简单的字符设备驱动、系统调用、内存管理、进程管理、同步管理、中断管理、调试和性能优化,以及如何参与开源社区等内容。此外,本书还介绍了Linux内核社区常用的开发工具和理论,如Vim 8和git工具等。书中包括70多个实验,帮助读者深入理解Linux内核。 Python机器学习 978-7-115-50135-6 [印]阿布舍克·维贾亚瓦吉亚(Abhishek Vijayvargia) Python程序员晋级必备图书,本书提供配套资源可供读者下载。 《Python机器学习》通过数学解释和编程示例描述了机器学习中的概念,每一章的内容都从技术的基本原理和基于真实数据集的工作实例开始,在提出应用算法建议的同时,指出了每种技术的优缺点。 scikit-learn机器学习(第2版) 978-7-115-50340-4 作者 [美]加文·海克(Gavin Hackeling) 掌握Python机器学习的有效工具,搞定scikit-learn的必备指南 scikit-learn是一个用Python语言编写的机器学习算法库,它可以实现一系列常用的机器学习算法,是一个不可多得的好工具。 本书通过14章内容,详细地介绍了一系列机器学习模型和scikit-learn的使用技巧。本书从机器学习的基础理论讲起,涵盖了简单线性回归、K-近邻算法、特征提取、多元线性回归、逻辑回归、朴素贝叶斯、非线性分类、决策树回归、随机森林、感知机、支持向量机、人工神经网络、K-均值算法、主成分分析等重要话题。 - END -
算法能力的考察,向来是顶级科研机构和IT公司面试时最具备区分度的成分,算法功夫扎实,提升面试效率。 算法长期以来被视作是聪明人的专利,好像有些人天生思路就开阔,遇到问题能马上整理出计算模型,然后实施巧思,而大多数人则只能望洋兴叹,一筹莫展。 这种想法其实也不无道理,从小接受系统化训练,参加过信息学竞赛或ACM,肯定会对算法问题反应更快一些。可是这样的人毕竟是极少数,而且即使是他们,也无一不是长期大量地训练才会不断进步。这至少说明,算法并非天外之学,而是一种能够通过训练掌握的技能。换言之,对于5%的真正难题,也许真的是只为5%的天才而存在的。但是其余的95%,却是95%像你我一样的普通人自学可以达成的目标。 提升算法能力,小编带来了一份高效书单。 01 算法入门 算法详解(卷1)——算法基础 这本书在美亚评分4.7,在作者倍受欢迎在线算法课程的基础之上编写的,是四卷本系列的第1卷。这个在线课程2012年起就定期更新,它建立在作者在斯坦福大学教授多年的本科课程的基础之上。也许你有所耳闻,这本书就是《算法详解(卷1)——算法基础》。如果你更喜欢听和看,可以在YouTobe上搜索这本书的主题课程,免费观看。 《算法详解(卷1)——算法基础》作者蒂姆·拉夫加登(Tim Roughgarden)是斯坦福大学计算机科学系的教授,也是该校管理科学和工程系的客座教授,他从2004年开始教授和研究算法。本书是他的《算法详解》四部曲的第一卷。 这本书详细讲解算法基础,展现算法本质 ,是一本囊括基本算法知识的详解指南。集斯坦福大学教授多年教学经验,深入浅出,通俗易懂。 趣学算法 本书从算法之美娓娓道来,没有高深的原理,也没有枯燥的公式,通过趣味故事引出算法问题,包含50多个实例及完美图解,结合学生提问,分析算法本质,并给出代码实现的详细过程和运行结果。这本书适合入门,中学生以上学历,都适合入门。 算法谜题 Anany Levitin和Maria Levitin编写的《算法谜题》一书,实在是令人眼前一亮。说实在的,我本人已经多年没有在这个领域里面见到有这么实用而且好看的作品了。本书的写作目的就是教你使用算法来解题,但它的定位却极其精准:它既不做数学演算,也不写具体代码,它只讲算法。 趣题学算法 一本有趣的、易学的、实用的,帮助读者快速入门应用的算法书;问题驱动,本书由80多个计算问题分门别类,串联而成。 Python算法教程 本书作者是畅销书Python基础教程(第2版)的作者,在Python领域颇有知名度和权威性。 本书用Python语言来讲解算法的分析和设计。本书主要关注经典的算法,但同时会为读者理解基本算法问题和解决问题打下很好的基础。 Java遗传算法编程 本书简单、直接地介绍了遗传算法,并且针对所讨论的示例问题,给出了Java代码的算法实现。全书共分为6章。第 1章简单介绍了人工智能和生物进化的知识背景,这也是遗传算法的历史知识背景。第 2章给出了一个基本遗传算法的实现;第4章和第5章,分别针对机器人控制器、旅行商问题、排课问题展开分析和讨论,并给出了算法实现。在这些章的末尾,还给出了一些练习供读者深入学习和实践。第6章专门讨论了各种算法的优化问题。 02 算法面试 百面机器学习 算法工程师带你去面试 书中收录了超过100道机器学习算法工程师的面试题目和解答,其中大部分源于Hulu算法研究岗位的真实场景。本书从日常工作、生活中各种有趣的现象出发,不仅囊括了机器学习的基本知识,而且还包含了成为出众算法工程师的相关技能,更重要的是凝聚了笔者对人工智能领域的一颗热忱之心,旨在培养读者发现问题、解决问题、扩展问题的能力,建立对机器学习的热爱,共绘人工智能世界的宏伟蓝图。 “不积跬步,无以至千里”,本书将从特征工程、模型评估、降维等经典机器学习领域出发,构建一个算法工程师必-备的知识体系;见神经网络、强化学习、生成对抗网络等新科研进展之微,知深度学习领域胜败兴衰之著;“博观而约取,厚积而薄发”,在末一章为读者展示生活中各种引领时代的人工智能应用。 编程之法:面试和算法心得 《编程之法:面试和算法心得》涉及面试、算法、机器学习三个主题。书中的每道编程题目都给出了多种思路、多种解法,不断优化、逐层递进。本书第 1章到第6章分别阐述字符串、数组、树、查找、动态规划、海量数据处理等相关的编程面试题和算法,第7章介绍机器学习的两个算法—K近邻和SVM。 此外,《编程之法:面试和算法心得》每一章都有“举一反三”和“习题”,以便读者及时运用所学的方法解决相似的问题,且在附录中收录了语言、链表、概率等其他题型。书中的每一道题都是面试的高频题目,反复出现在近5年各大公司的笔试和面试中,对面试备考有着极强的参考价值。 03 算法进阶 编程珠玑(续)(修订版) ● 历史上伟大的计算机科学著作之一 ● 融深邃思想、实战技术与趣味轶事于一炉的奇书 ● 带你真正领略计算机科学之美 多年以来,当程序员们推选出心爱的计算机图书时,《编程珠玑》总是位于前列。正如自然界里珍珠出自细沙对牡蛎的磨砺,计算机科学大师JonBentley以其独有的洞察力和创造力,从磨砺程序员的实际问题中凝结出一篇篇不朽的编程“珠玑”,成为世界计算机界名刊《ACM通讯》历史上受欢迎的专栏,结集为两部不朽的计算机科学经典名著,影响和激励着一代又一代程序员和计算机科学工作者。本书为首卷,主要讨论计算机科学中本质的问题:如何正确选择和高效地实现算法。 在书中,作者选取许多具有典型意义的复杂编程和算法问题,生动描绘了历史上众大师们在探索解决方案中发生的轶事、走过的弯路和不断精益求精的历程,引导读者像真正的程序员和软件工程师那样富于创新性地思考,并透彻阐述和总结了许多独特而精妙的设计原则、思考和解决问题的方法以及实用程序设计技巧。解决方案的代码均以C/C++语言编写,不仅有趣,而且有很大的实战示范意义。每章后所附习题极具挑战性和启发性,书末给出了简洁的解答。 编程珠玑(第2版•修订版) 《编程珠玑(第 2版·修订版)》是计算机科学方面的经典名著。书的内容围绕程序设计人员面对的一系列实际问题展开。作者JonBentley以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员实际编程生涯中到关重要的。本书的特色是通过一些精心设计的有趣而又颇具指导意义的程序,对实用程序设计技巧及基本设计原则进行了透彻而睿智的描述,为复杂的编程问题提供了清晰而完备的解决思路。《编程珠玑(第 2版·修订版)》对各个层次的程序员都具有很高的阅读价值。 04 人工智能算法 Python机器学习——预测分析核心算法 在学习和研究机器学习的时候,面临令人眼花缭乱的算法,机器学习新手往往会不知所措。本书从算法和Python 语言实现的角度,帮助读者认识机器学习。 本书专注于两类核心的“算法族”,即惩罚线性回归和集成方法,并通过代码实例来展示所讨论的算法的使用原则。全书共分为7 章,详细讨论了预测模型的两类核心算法、预测模型的构建、惩罚线性回归和集成方法的具体应用和实现。 神经网络算法与实现——基于Java语言 人工神经网络是由众多连接权值可调的神经元连接而成,具有大规模并行处理、分布式信息存储、良好的自组织自学习能力等特点,能够完成模式识别、机器学习以及预测趋势等任务。 本书通过9章内容,并结合Java编程语言,由浅入深地介绍了神经网络算法的应用。书中涉及神经网络的构建、神经网络的结构、神经网络的学习、感知机、自组织映射等核心概念,并将天气预测、疾病诊断、客户特征聚类、模式识别、神经网络优化与自适应等经典案例囊括其中。本书在附录中详细地指导读者进行开发环境的配置,帮助读者更加顺利地进行程序开发。 文本上的算法——深入浅出自然语言处理 ● 深入浅出讲解自然语言处理和机器学习技术 。 ● 广受读者好评的技术读物,微博总阅读量超过30万次 。 自然语言处理是研究人机之间用自然语言通信的理论和方法,是人工智能领域的一个重要分支,有着非常广泛的应用空间。 本书结合作者多年学习和从事自然语言处理相关工作的经验,力图用生动形象的方式深入浅出地介绍自然语言处理的理论、方法和技术。本书抛弃繁琐的证明,提取出算法的核心,帮助读者尽快地掌握自然语言处理所必备的知识和技能。 机器学习经典算法剖析——基于OpenCV OpenCV算法精解,机器学习算法必备,十大算法全涵盖,夯实机器学习数学基础。 本书首先对正态贝叶斯分类器、K近邻算法、支持向量机、决策树、AdaBoost、梯度提升树、随机森林、极端随机树、期望极大值、神经网络这十大经典的机器学习算法进行具体的原理分析,然后给出OpenCV的相关源码的逐句解释,最后完成一个基于OpenCV的应用实例。相信读者通过这3个步骤的学习,足以实现对算法理解的目的。 图像局部特征检测和描述:基于OpenCV源码分析的算法与实现 在计算机视觉处理中,特征指的是能够解决某种特定任务的信息。图像局部特征在目标识别、目标跟踪、目标匹配、三维重建、图像检索等应用中发挥着重要的作用。它是近20年来在计算机视觉领域中研究的热点问题之一。 本书以OpenCV 2.4.9为研究工具,对其实现的所有最新的特征检测和描述算法—Kitchen-Rosenfeld、Canny、Harris、Shi-Tomasi、FAST、MSER、MSCR、SIFT、SURF、BRISK、BRIEF、ORB、FREAK、CenSurE、SimpleBlob等,不仅详细分析了它们的原理和实现方法,还进行了详细的源码解析,并且给出了具体的程序实现范例,充分体现了理论与实践相结合的特点。
在美国亚马逊,有一本书的影响力超高的Docker入门书,在操作系统分类中排行第一,超越了众多实力派Docker书,众多五星好评。也许你有所耳闻,这本书就是《深入浅出Docker》。 这是一本关于Docker的图书。这本书的宗旨是从零开始学习Docker,因此你无须任何前置知识储备。如果你对Docker感兴趣,希望了解Docker工作原理以及如何正确使用Docker,则本书适合你。同时本书也可作为Docker认证工程师考试的参考图书。 本书作者 Nigel Poulton,亚马逊畅销图书作者,Docker Captain(Docker官方项目),存储专家,Docker技术先驱。Nigel有丰富的运维技术经验,著有多部容器相关的图书,并开设了视频培训课程。除了线上途径,他还热衷于开展线下会议讲座。他活跃于Docker Captain计划社区,致力于创造世界上最好的Docker和容器学习资源,在业界有非常大的影响力。 Docker Captain计划:Docker Captain是Docker官方颁发给社区中那些既精通各自领域又热衷于与他人分享Docker知识的成员的奖项。Captain和Docker专家分享他们的专业知识和经验,他们对Docker的发展产生了巨大的影响——无论是线上支持,还是线下活动——Docker技术的普及在他们的努力下成为可能。 Docker认证工程师(Docker Certified Associate) Docker于2017年秋发布了第1版专业资质认证,称为Docker认证工程师(Docker Certified Associate, DCA),面向想要评估自身Docker管理水平的人群。 本书覆盖了认证考试的所有知识点,但本书并非应试书,而是一本易于阅读的实用技术图书。 祝愿读者考试顺利! 为什么要阅读本书,为什么要关注Docker 如今Docker无处不在,这是不争的事实。开发人员都很喜欢它,运维工程师也需要它。他们都需要深入了解如何在关键业务环境中构建和维护符合生产级别要求的容器化应用,本书将帮助读者掌握它。 Docker仅能供开发人员所用吗 对于认为Docker是开发人员专属工具的人来说,恐怕要准备好颠覆自己的认知了。 容器化应用需要有地方运行,也需要有人来管理。如果认为只是开发人员来管理它,那就大错特错了,事实上运维需要构建和运行高性能、生产级别的Docker基础架构。对于专注于运维工作却尚未掌握Docker的朋友来说,日子恐怕不太好过。不过不必焦虑,本书将帮你掌握Docker。 如何读本书? 本书分为两部分。 Docker概览篇:本篇介绍Docker公司(Docker, Inc.)、Docker(Moby)项目、什么是OCI、为什么需要容器等。如果读者想要对Docker和容器有一个全面的了解,则需要阅读这些内容。 Docker技术篇:本篇是全书的主要内容,包含了掌握Docker所需的所有知识。这部分会详细介绍镜像、容器,以及越来越重要的关于编排的知识。此外,本书甚至还介绍了企业应用中比较关心的技术,比如TLS、RBAC、与AD的集成,以及备份。读者不仅能够了解相关的概念和原理,还能够参考本书给出的命令和例子进行练习。 Docker技术篇的多数章节都可以分为3个部分——简介、详解和命令。 “简介”部分是大约两三段的简要介绍,用于概括性地阐述相应章节的内容,也能够方便读者在复习时快速回忆相关的内容。 “详解”部分会详细介绍工作原理,并配有示例的介绍。 “命令”部分会以一种易于阅读的方式列出所有相关命令及其简要说明。 希望读者能够喜欢这种方式。 提到Docker时你该了解什么? 关于容器技术的图书和探讨总是不可避免地涉及Docker。但是当有人提到“Docker”时,可能是指如下3种概念之一。 Docker公司。 Docker的容器运行时和编排引擎。 Docker开源项目(Moby)。 如果读者希望在容器的世界中有所作为,那么需要对以上3个内容都有所了解。 Docker——简介 Docker是一种运行于Linux和Windows上的软件,用于创建、管理和编排容器。Docker是在GitHub上开发的Moby开源项目的一部分。Docker公司,位于旧金山,是整个Moby开源项目的维护者。Docker公司还提供包含支持服务的商业版本的Docker。 以上是一个简要介绍。下面针对每个概念进行详细介绍。此外还包含对容器生态的探讨,以及对开放容器计划(Open Container Initiative, OCI)的介绍。 Docker公司 Docker公司位于旧金山,由法裔美籍开发者和企业家Solumon Hykes创立,其标志如图1所示。 有意思的是,Docker公司起初是一家名为dotCloud的平台即服务(Platform-as-a-Service, PaaS)提供商。底层技术上,dotCloud平台利用了Linux容器技术。为了方便创建和管理这些容器,dotCloud开发了一套内部工具,之后被命名为“Docker”。Docker就是这样诞生的! 2013年,dotCloud的PaaS业务并不景气,公司需要寻求新的突破。于是他们聘请了Ben Golub作为新的CEO,将公司重命名为“Docker”,放弃dotCloud PaaS平台,怀揣着“将Docker和容器技术推向全世界”的使命,开启了一段新的征程。 如今Docker公司被普遍认为是一家创新型科技公司,据说其市场价值约为10亿美元。在本书撰写时,Docker公司已经通过多轮融资,吸纳了来自硅谷的几家风投公司的累计超过2.4亿美元的投资。几乎所有的融资都发生在公司更名为“Docker”之后。 图1 Docker标志 公司更名为Docker之后,进行了几次小规模的未公开价格的收购,来丰富其产品和服务组合。 至本书撰写时,Docker公司拥有约300~400名雇员,并举办名为DockerCon的年度会议。DockerCon的目标是聚拢不断发展的容器生态,并促进Docker和容器技术的推广。 本书将始终使用“Docker公司”来指代Docker这家公司,其他地方出现的“Docker”都是指容器技术或开源项目。 注:“Docker”一词来自英国口语,意为码头工人(Dock Worker),即从船上装卸货物的人。 Docker运行时与编排引擎 多数技术人员在谈到Docker时,主要是指Docker引擎。 Docker引擎是用于运行和编排容器的基础设施工具。有VMware管理经验的读者可以将其类比为ESXi。ESXi是运行虚拟机的核心管理程序,而Docker引擎是运行容器的核心容器运行时。 其他Docker公司或第三方的产品都是围绕Docker引擎进行开发和集成的。如图2所示,Docker引擎位于中心,其他产品基于Docker引擎的核心功能进行集成。 Docker引擎可以从Docker网站下载,也可以基于GitHub上的源码进行构建。无论是开源版本还是商业版本,都有Linux和Windows版本。 在本书撰写时,Docker引擎主要有两个版本:企业版(EE)和社区版(CE)。 每个季度,企业版和社区版都会发布一个稳定版本。社区版本会提供4个月的支持,而企业版本会提供12个月的支持。 社区版还会通过Edge方式发布月度版。 图2 围绕Docker引擎进行开发和集成的产品 从2017年第一季度开始,Docker版本号遵循YY.MM-xx格式,类似于Ubuntu等项目。例如,2018年6月第一次发布的社区版本为18.06.0-ce。 注:2017年第一季度以前,Docker版本号遵循大版本号.小版本号的格式。采用新格式前的最后一个版本是Docker 1.13。 Docker开源项目(Moby) “Docker”一词也会用于指代开源Docker项目。其中包含一系列可以从Docker官网下载和安装的工具,比如Docker服务端和Docker客户端。不过,该项目在2017年于Austin举办的DockerCon上正式命名为Moby项目。由于这次改名,GitHub上的docker/docker库也被转移到了moby/moby,并且拥有了项目自己的Logo,如图3所示。 图3 Moby的Logo Moby项目的目标是基于开源的方式,发展成为Docker上游,并将Docker拆分为更多的模块化组件。Moby项目托管于GitHub的Moby代码库,包括子项目和工具列表。核心的Docker引擎项目位于GitHub的moby/moby,但是引擎中的代码正持续被拆分和模块化。 作为一个开源项目,其源码是公开可得的,在遵循Apache协议2.0的情况下,任何人都可以自由地下载、贡献、调整和使用。 如果查看项目的提交历史,可以发现其中包含来自如下公司的基础技术:红帽、微软、IBM、思科,以及HPE。此外,还可以看到一些并非来自大公司的贡献者。 多数项目及其工具都是基于Golang编写的,这是谷歌推出的一种新的系统级编程语言,又叫Go语言。使用Go语言的读者,将更容易为该项目贡献代码。 Mody/Docker作为开源项目的好处在于其所有的设计和开发都是开放的,并摒弃了私有代码闭源开发模式下的陈旧方法。因此发布过程也是公开进行的,不会再出现某个秘密的版本提前几个月就宣布要召开发布会和庆功会的荒唐情况。Moby/Docker不是这样运作的,项目中多数内容都是开放并欢迎任何人查看和作出贡献的。 Moby项目以及更广泛的Docker运动一时间掀起了一波热潮。GitHub上已经有数以千计的提交请求(pull request),以及数以万计的基于容器化技术的项目了,更不用说Docker Hub上数十亿的镜像下载。Moby项目已经给软件产业带来了翻天覆地的变化。 这并非妄想,Docker已经得到了广泛的应用! 容器生态 Docker公司的一个核心哲学通常被称为“含电池,但可拆卸”(Batteries included but removable)。 意思是许多Docker内置的组件都可以替换为第三方的组件,网络技术栈就是一个很好的例子。Docker核心产品内置有网络解决方案。但是网络技术栈是可插拔的,这意味着Docker内置的网络方案可以被替换为第三方的方案。许多人都会这样使用。 早期的时候,经常出现第三方插件比 Docker 提供的内置组件更好的情况。然而这会对Docker公司的商业模式造成冲击。毕竟,Docker公司需要依靠盈利来维持基业长青。因此,“内置的电池”变得越来越好用了。这也导致了生态内部的紧张关系和竞争的加剧。 简单来说,Docker内置的“电池”仍然是可插拔的,然而越来越不需要将它们移除了。 尽管如此,容器生态在一种良性的合作与竞争的平衡中还是得以繁荣发展。在谈及容器生态时,人们经常使用到诸如“co-opetition”[1]与“frenemy”[2]这样的字眼。这是一个好现象!因为良性的竞争是创新之母。 [1] 意即合作与竞争,英文中co-operation与competition合并的词。——译者注 [2] 英文中朋友friend与敌人enemy合并的词。——译者注 开放容器计划 如果不谈及开放容器计划(The Open Container Initiative, OCI)的话,对Docker和容器生态的探讨总是不完整的。图4所示为OCI的Logo。 图4 OCI的Logo OCI是一个旨在对容器基础架构中的基础组件(如镜像格式与容器运行时,如果对这些概念不熟悉的话,不要担心,本书后续会介绍到它们)进行标准化的管理委员会。 同样,如果不谈历史的话,对OCI的探讨也是不完整的。和所有的历史记录一样,其版本取决于谁来讲述它。所以,以下是我眼中的容器历史。 我讲述的这段简短的历史是,一个名为CoreOS的公司不喜欢Docker的某些行事方式。因此它就创建了一个新的开源标准,称作“appc”,该标准涉及诸如镜像格式和容器运行时等方面。此外它还开发了一个名为rkt(发音“rocket”)的实现。 两个处于竞争状态的标准将容器生态置于一种尴尬的境地。 这使容器生态陷入了分裂的危险中,同时也令用户和消费者陷入两难。虽然竞争是一件好事,但是标准的竞争通常不是。因为它会导致困扰,降低用户接受度,对谁都无益。 考虑到这一点,所有相关方都尽力用成熟的方式处理此事,共同成立了OCI——一个旨在管理容器标准的轻量级的、敏捷型的委员会。 在本书写作时,OCI已经发布了两份规范(标准):镜像规范和运行时规范。 提到这两项标准时,经常用到的比喻就是铁轨。它们就像对铁轨的尺寸和相关属性达成一致,让所有人都能自由地建造更好的火车、更好的车厢、更好的信号系统、更好的车站等。只要各方都遵循标准就是安全的。没人会希望在铁轨尺寸问题上存在两个相互竞争的标准! 公平地说,这两个OCI规范对Docker的架构和核心产品设计产生了显著影响。Docker 1.11版本中,Docker引擎架构已经遵循OCI运行时规范了。 到目前为止,OCI已经取得了不错的成效,将容器生态团结起来。然而,标准总是会减慢创新的步伐!尤其是对于超快速发展的新技术来说更是如此。这在容器社区引起了热烈的讨论。以我之见,这是好事!容器技术正在重塑世界,走在技术前列的人们有热情、有想法,这很正常。期待关于标准和创新有更加热烈的讨论! OCI在Linux基金会的支持下运作,Docker公司和CoreOS公司都是主要贡献者。 【英】Nigel Poulton(奈吉尔 波尔顿) 深入浅出Docker - END -
“写代码时,每次都要告诉自己:最后负责维护代码的,会是一个知道你住在哪的变态暴力狂。”——约翰·伍德(John Woods) 生产代码(production code)是用户使用的产品中的代码。将软件部署到生产环境(production)后,就意味着用户可以公开访问了。本文将介绍13个最佳的编程原则,有助于大家编写可部署于生产环境的代码。这些原则来源于《Python编程无师自通》,读完这本书后我的代码质量大幅提升。 作者:[美] 科里•奥尔索夫(Cory Althoff) 《Python编程无师自通——专业程序员的养成》 01 13个最佳编程技巧 写代码是最后的手段 作为一名软件工程师,你在工作时应尽量少写代码。碰到问题时,你首先想到的不应该是“我怎么解决这个问题”,而是“其他人是不是已经解决了这个问题,我能使用他们的方案吗?”如果你自己去解决一个常见的问题,很有可能别人已经有了解决方案。先在网上检索解决办法,只有在确定没人解决过该问题之后,才开始自己动手解决。 DRY DRY是不要重复自己(Dont’t Repeat Yourself)的简称,指的是不要在程序中编写重复的或是基本相同的代码。正确的做法是将代码封装至函数中,后续可重复使用。 正交性 正交性(Orthogonality)是《The Pragmatic Programmer》中提倡并普及的另一个重要编程原则。亨特和托马斯认为,“该术语已经被用来表示某种独立性或解耦化。如果两个或多个事物之间的变化不会相互影响,那么它们之间就存在正交性。在设计优良的系统中,数据库代码与用户界面之间是正交的;调整用户界面不会影响数据库,替换数据库也不会改变用户界面。”实践中请牢记,“A不应该影响B”。假设我们有两个模块module_a和module_b,module_a不应对module_b中的内容进行修改,反之亦然。如果设计的系统中A会影响到B,而B又影响C,很快就会失去控制,系统将变得无法管理。 每个数据都只应保存在一处 假设手上有一个数据,我们只需要将其存储在一个地方。例如,我们正在开发用来处理手机号码的软件,其中有两个函数要使用地区编号的列表,这里要确保程序中只有一个地区编号列表,而不是为每个函数重复创建。正确的做法是创建一个保存地区编号的全局变量。更好的解决方案则是将信息保存在文件或数据库中。 函数只做一件事 我们写的每个函数应该只做一件事。如果发现函数太长,请检查其是否在完成多个任务。将函数限制为只完成一个任务有很多好处。首先,代码可读性增强,因为函数名称可以直接说明其功能。如果代码出错,调试也将更加方便,因为每个函数只负责一个特定的任务,我们可以快速隔离并调试问题函数。用许多知名程序员的话来说:“软件的复杂性大多源自试图两件事当一件事做。” 若耗费时间过长,你的做法很可能就是错的 如果你不是在处理非常复杂的问题,比如处理大数据,但是程序却要花很长时间才能加载,这时可以认为你的做法很有可能错了。 第一次就要用最佳的方法完成 在编程时你可能会这样想:“我知道有一个更好的做法,但是我已经开始编码了,不想回头重写。”那我建议你停止编码,改用更好的方法来完成。 遵循惯例 学习新编程语言的惯例,能够提升阅读用该语言编写的代码的速度。PEP8 是一系列编写Python代码的指南,强烈建议阅读,可前往https://www.python.org/dev/peps/ pep-0008/查看。 使用强大的IDE 到目前为止,我们一直使用的是Python自带的IDE——IDLE来编码。但是IDLE只是众多可选IDE中的一个,而且我也不推荐长期使用它,因为其功能有限。例如,如果使用更强大的IDE打开Python项目,每个Python文件都会有不同的选项卡。在IDLE中则是每个文件新开一个窗口,操作烦琐且文件之间来回切换困难。 笔者使用JetBrains公司开发的一款名为PyCharm的IDE。他们提供了免费版和专业版两个版本,这款IDE有如下特性能够帮助我们节省时间。 1.如果想查看某个变量、函数或对象的定义,PyCharm提供了一个快捷方式,可以跳转到定义变量、函数或对象的地方(即使是另外一个文件)。PyCharm还提供了跳回开始页面的快捷方式。 2.PyCharm有保存本地历史的特性,可以极大提升工作效率。PyCharm会在每次项目出现变动时保存一份,因此可以不推送到代码库,就能将PyCharm当做一个本地版的版本管理系统。用户不需要做任何操作,IDE将自动保存。在我了解该特性之前,我经常会在解决问题后,想要换一种方案,但是不久后又希望回滚到原方案。如果我不把原方案推送到Github,很可能早就遗失了,不得不重新编写。但是有了这个特性,我们就能回滚到10分钟前,然后重新载入当时的项目状态。如果又改变主意,也可以随意地在不同方案之前来回切换。 3.在日常工作过程中,很可能要经常复制粘贴代码。在PyCharm中,不需要复制粘贴,在当前界面上直接移动代码即可。 4.PyCharm支持Git和SVN等版本控制系统。无须使用命令行,即可直接在PyCharm中使用Git。在IDE和命令行之间切换次数越少,工作效率越高。 5.PyCharm提供了内置的命令行和Python Shell。 6.PyCharm内置了调试器(debugger)。调试器是支持中断代码执行,逐行查看代码效果的程序。通过调试器,我们可以查看不同代码中变量的值。 记录日志 记录日志(logging)指的是在软件运行时记录数据的做法。我们可通过日志来协助程序调试,更好地了解程序运行时的状态。Python自带了一个logging日志模块,支持在控制台或文件中记录日志。 程序出错时,我们不希望没有感知——我们应该记录下相关信息,方便以后核查。记录日志也有助于收集和分析信息。例如,可以搭建一个Web服务器来记录数据,包括每次收到请求的日期和时间。我们可以将所有的日志记录在数据库中,编写程序分析其中的数据,并生成图表展示访问网站的人次。 博客作者亨瑞克·沃纳(Henrik Warne)在博客中写过这样一段话:“伟大程序员与平庸程序员的区别之一,就是伟大的程序员会做日志记录,使得出错时的调试变得更简单。” 测试 程序测试指的是检查程序是否“达到了设计和开发要求,对各类输入返回正确的结果,功能执行耗时在可接受范围,可用性足够高,可在目标环境下安装和运行,并且实现了相关利益方所期待的效果。”为了进行程序测试,程序员要额外编写程序。 在生产环境中,测试是必须完成的。对于计划部署在生产环境的程序,我们应当认为在没有编写测试之前都是不完整的。但是,如果是一个不会再使用的临时程序,测试可能有些浪费时间。如果编写的是其他人也将使用的程序,则应该编写测试。很多知名程序员都曾说过:“未经测试的代码就是漏洞百出的代码。” 代码审查 在代码审查(code review)时,同事会阅读你的代码并提供反馈。建议尽可能多地进行代码审查,尤其对于自学成才的程序员来说。即使你遵守了本章中所列的所有最佳实践,也有可能存在错误的做法。你需要有经验的程序员对你的代码进行检查,指出所犯的错误,这样才有可能解决。 Code Review是一个专注于代码审查的程序员社区。任何人都可以登入该网站,提交代码。社区的其他成员会审查代码,并反馈做得好的地方以及可以改进的地方。 安全 对于自学的程序员来说,安全是一个很容易忽视的问题。在面试时也很少会被问到安全问题,在学习编程时我们也不会去考虑安全问题。但是,在实际工作中,我们需要对自己代码的安全性负直接责任。本节将给出几个提高代码安全性的建议。 我们在本书中已经学习了使用sudo命令以根用户的身份执行命令。非必要情况下,务必不要在命令行使用sudo执行命令,因为如果有黑客侵入程序的话,将会获得根访问权限。如果你是服务器管理员,还应该禁止根用户登录。每个黑客都会盯着根账号,在攻击系统时是首要选择的目标。 另外,总是假设用户的输入是恶意的。部分恶意攻击的发生,就是利用了可接受用户输入的程序漏洞,因此我们要假设所有的用户输入都是恶意的,并以此为依据进行编码。 另一个提高代码安全性的策略,是最小化你的攻击面积(attack surface),即黑客可从程序中提取数据或攻击系统的相关区域。通过最小化攻击面积,可以减少程序出现漏洞的可能性。最小化攻击面积的几种常见做法包括:避免保存敏感信息,赋予用户最低的访问权限,尽可能少用第三方库(代码量越小、漏洞越少),剔除不再使用的功能代码(代码量越小、漏洞越少)等。 避免以根用户身份登录系统,不要信任用户输入,以及最小化攻击面积,是确保程序安全性的几个重要手段。但这还只是提升安全性的一小部分。我们应该试着从黑客的角度进行思考。他们会如何利用你的代码?这样可以帮助我们找到之前可能忽略的漏洞。有关安全的话题非常大,不是本书所能涵盖的,因此建议大家时刻思考并学习如何提升安全性。布鲁斯·舒奈尔(Bruce Schneier)对此的总结十分精辟:“安全是一种思维状态。” 术语表 生产代码:某个产品中被用户使用的代码。 生产:将软件投入生产,指的是对外正式发布。 DRY:一个编程原则,“不要重复自己”的英文简称。 正交性:该术语已经被用来表示某种独立性或解耦化。如果两个或多个事物之间的变化不会相互影响,那么它们之间就存在正交性。在设计优良的系统中,数据库代码与用户界面之间是正交的;调整用户界面不会影响数据库,替换数据库也不会改变用户界面。 调试器:调试器是支持中断代码执行,可逐行查看代码效果的程序。通过调试器,我们可以查看不同代码中变量的值。 日志记录:指的是在软件运行时记录数据的做法。 测试:检查程序是否“达到了设计和开发要求,对各类输入返回正确的结果,功能执行耗时在可接受范围,可用性足够高,可在目标环境下安装和运行,且实现了相关利益方所期待的效果。” 代码审查:他人阅读你的代码并给予反馈的过程。 攻击面积:黑客可从程序中提取数据或攻击系统的相关区域。 02《Python编程无师自通》 在美国亚马逊,有一本书的影响力超高的Python入门书,Kindle版本在美国亚马逊网站的计算机软件、软件开发分类中排行均为第一,超越了众多实力派Python书,众多五星好评。也许你有所耳闻,这本书就是《Python编程无师自通——专业程序员的养成》 《Python编程无师自通——专业程序员的养成》作者是一名自学成才的程序员,作为一名文科生他通过自学编程,掌握了编程技能并在eBay找到了一份软件工程师的工作。这本书是作者结合个人经验写作而成,旨在帮助读者从外行成长为一名专业的Python程序员。 这本书可以满足几乎所有想要学习编程的初学者。本书适合高中、大学阶段想要自学编程的学生,以及其他行业想入门编程的人,同时也适合作为编程入门的培训教材。 《Python编程无师自通——专业程序员的养成》 每章结尾处都有术语表和挑战练习,让你更好地学习Python 3。 目录一览 第1章 概述 第2章 起步 第3章 编程概论 第4章 函数 第5章 容器 第6章 字符串操作 第7章 循环 第8章 模块 第9章 文件 第10章 综合练习 第11章 练习 第二部分 面对对象编程简介 第12章 编程范式 第13章 面向对象编程的四大支柱 第14章 深入面向对象编程 第15章 综合练习 第三部分 编程工具简介 第16章 Bash 第17章 正则表达式 第18章 包管理器 第19章 版本控制 第20章 融会贯通 第四部分 计算机科学简介 第21章 数据结构 第22章 算法 第五部分 找到工作 第23章 最佳编程实践 第24章 第一份编程工作 第25章 团队协作 第26章 更多学习资料 第27章 下一步 书单推荐 作者:【美】Al Sweigart(斯维加特) Python编程快速上手——让繁琐工作自动化 作者:[美] 泽德 A. 肖(Zed A. Shaw) “笨办法”学Python 3 作者:【美】Kenneth A. Lambert(兰伯特) 数据结构(Python语言描述) 作者:【美】Wesley Chun(卫斯理 春) Python核心编程(第3版) 作者:叶维忠 Python编程从入门到精通 - END -
重构20年,有人说Martin Fowler改变了人类开发软件的模式,这一点也不过分,从《分析模式》《UML精粹》《领域特定语言》,到这本《重构》新版可以看得出来,他的每一本书都是软件开发人员必备的案头读物。此前他参与的“敏捷宣言”,更是引领了整个行业对敏捷开发的认识,一直到现在。 2009年,熊节在为《重构》第1版的中译本再版整理译稿时,他已经隐约察觉行业中对“重构”这个概念的矛盾张力。 如今又是10年过去,只从国内的情况而论,“重构”概念的表里分离,大有愈演愈烈之势。随着当年的一线技术人员纷纷走上领导岗位,他们乐于将“重构”这块漂亮招牌用在更宽泛的环境下,例如系统架构乃至组织结构,都可以“重构”一下。然而基本功的欠缺,却也一路如影随形。当年在对象中的刀劈斧砍,如今被照搬到了架构、组织的调整。于是“重构”的痛苦回忆又一遍遍重演,甚而程度更深、影响更广、为害更烈。 此时转头看Martin Fowler时隔将近廿载后终于付梓的《重构》第2版,熊节说:“我不禁感叹于Fowler先生对‘微末功夫’ 的执着。在此书尚未成型之前,我和当时ThoughtWorks的同事曾有很多猜测,猜Fowler先生是否会在第2版中拔高层次,多谈谈设计乃至架构级别的重构手法,甚或跟随‘敏捷组织’ ‘精益企业’的风潮谈谈组织重构,也未为不可。孰料成书令我们跌破眼镜,Fowler先生不仅没有拔高,反而把工夫做得更扎实了。” 今天小编非常有幸邀请到了《重构》 (第2版)译者熊节老师,来听听他的所思所想。 熊节 在IT行业已经打拼了18年,在金融、零售、政府、电信、制造业等行业的信息化建设方面有着丰富经验,是中国IT业敏捷浪潮的领军人物。熊节拥有利物浦大学MBA学位。 异步社区:熊老师已经是异步的老朋友了,目前在做哪些项目,可以聊聊吗? 熊节:我去年离开了效力十几年的ThoughtWorks,加入了宝尊电商,目前在分管宝尊电商的成都研发中心。敏捷的思想正在不断下沉到大量的国内企业,宝尊的IT也在进行着敏捷的转型。用敏捷思想帮助国内企业提升响应变化的能力,从过去到现在一直是我关注的问题。 异步社区:时隔20年再次翻译《重构(第2版)》一书,是什么感觉?心态有很大的转变吗?为什么? 熊节:可以说有转变,也可以说变化不大。2008年《重构(第1版)》再版加印的时候,我有一个观察:国内真正采用重构技术的团队和个人,其实比例很小。虽然这本书有好几十万甚至上百万的读者,但更多的读者是叶公好龙。这个观察,到今天其实变化也不大,大部分团队和个人仍然处在没有测试、没有持续集成、不敢也不能重构的状态。对这种情况,我的悲观态度比起2008年来也没有什么改变。 不过在这十多年里,我也看到一些团队、一些个人真的从《重构(第1版)》中学到了东西,践行了其中的思想和实践,并且收到了好的效果。于是我的心态又增加了乐观的一面,我会想再多做一些重构的普及工作,多影响一些人学到好的编程方式。例如第2版的另一位译者林从羽,虽然很年轻,但是受重构思想的影响很深,也很坚定地在践行。这样的年轻人让我感到,做这样的普及工作还是有意义的。虽然对整个行业的影响微乎其微,至少可以影响到一些人。 异步社区:重构思想在国内发展史是怎样的?可以分享一些细节吗? 熊节:2001年12月的《程序员》杂志用十多页的篇幅介绍重构,这是国内的出版物首次介绍这个技术,当时负责这些内容的技术编辑就是我。后来随着极限编程丛书、《敏捷软件开发》的出版,2003年由我和侯捷老师翻译的《重构》出版时,我当时认为敏捷、极限编程、重构的理论基础已经齐备了,国内的行业应该很快能采纳这些新的技术、新的方法。 然而事实证明我太乐观了。当时的中国IT大环境,对高质量、响应变化没有太高的要求,整个行业都满足于不做自动化测试、没有持续集成的很原始的工作方式,重构的土壤是不存在的。到2008年,对重构感兴趣的团队和个人并不多。这可能也是当时机械工业出版社没有续签《重构(第1版)》版权、人民邮电出版社接手再版的原因。 2008年以后,随着互联网浪潮的到来,以及通信行业大规模向敏捷转型,重构(和其他敏捷实践一起)开始真正受到了重视,《重构》这本书也开始成为很多程序员的案头书。但是说实话,重构及其对单元测试的要求,对于一般的团队和个人来说,难度太大了。2010年以后,国内的敏捷浪潮开始转向Scrum,重管理实践、轻技术实践,很多团队和个人也就心安理得地把重构束之高阁了。 异步社区:本书作者Martin Fowler曾说“任何一个傻瓜都能写出计算机可以理解的代码。唯有能写出人类容易理解的代码的,才是优秀的程序员。”您认同吗?为什么? 熊节:100%认同。 关于“编程到底是个什么活动”这件事,我跟很多人有分歧。很多人认为编程是个科技活动,但是我始终认为,以调用API和简单的循环、条件逻辑为主,大多数日子里四则运算都用不全(主要是除法不怎么用——多谢郑晔的梗),这样的工作硬要说它是个科技活动,我觉得很牵强。 我一直认为,编程其实是个社会活动。一方面,程序员要把自然语言说出来的需求翻译成机器能运行的机器语言;另一方面,翻译出来的结果(也就是代码)还要支撑团队(包括技术和非技术的团队)不断地在它基础上协作和交流。前者(即“翻译”这一步)是很基础也很简单的,用郑晔的话来说,“四则运算都用不全”,也就是传说中找个高中生来培训几天就能干的活。然而实践证明,找个高中生来培训几天,是做不好软件的。问题出在哪儿,就因为编程的大挑战不是把代码写出来,而是要在代码的基础上建立有效的多方沟通。 当然,话不能说得太死。有没有真正属于科技活动的、把代码写出来本身就很困难的编程任务呢?是有的。但大部分(我保守点说吧,90%以上)程序员日常面对的是不是这样的任务呢?我觉得不是。90%的程序员在90%的时间面对的任务,还是四则运算都用不全的、以沟通和翻译为主的任务。我们应该谦卑地认识到这一点,并且诚恳地采纳能把这种任务做好的工作方式。 异步社区:有人说“重构代表了一种观点,是解决问题的一种方法论,是每个程序员写代码的必备技能”,您怎么看待? 熊节:一方面是我前面说的,大部分人在大部分时候处理的编程任务,本质上是个沟通活动,那么沟通就会有沟通不畅的情况,需要不断调整自己的沟通方式,找到好的沟通方式,让沟通的另一方(可能是业务的代表,可能是以后维护代码的人,可能是使用API的人,等等)能更好地理解。 另一方面,现在大家都在说这个时代是“VUCA”(易变、不确定、复杂、模糊)的,都在说要拥抱变化。那么到底要怎么拥抱变化,很自然的答案就是要降低变化的成本,不能每次要修改就造成破坏。怎么能修改而又不造成破坏呢?第一是要有测试,第二是要有靠谱的修改方法,这两点恰恰就是重构的思想。所以我完全赞同,每个程序员都需要掌握重构的技能,否则他/她的工作方式就会跟不上时代的要求。 异步社区:《重构 第2版》与第一版相比有哪些变化?这本书您最想推荐给谁看? 熊节:很多人说,《重构》第二版跟第一版相比最大的变化是举例所用的编程语言从Java变成了Javascript。但其实这不是一个非常重要的变化。作者展示的重构手法在各种主流的面向对象语言中基本上都可以通用,并且也没有太特别的Javascript语言特性。 在我看来,第二版最大的变化是变得更加务实了。这种务实感体现在几个方面: 第一是增加了一些颗粒度更小的重构手法; 第二重构的做法有所改进,更加注重行为保持; 第三是删去了第一版最后对“大规模重构”的介绍。 我觉得,Martin Fowler这种脚踏实地的态度是很值得钦佩的。我们这个行业里,有太多高举高打的浮夸,缺的是脚踏实地做好一件件小事的工匠精神。 我认为所有程序员都应该读《重构》,应该把坏味道列表背下来。缺乏这个基本知识,就无从谈论代码坏在哪里,更无从说改进了。 异步社区:您曾说:“我已经隐约察觉行业中对“重构”这个概念的矛盾张力”为什么这样说? 熊节:就是我前面说的叶公好龙的问题。所有人都喜欢说“重构”这个概念,但是很少人真的花精力把重构的基本功练扎实。这也折射我们这个行业的现实情况,吹漂亮话的人多,沉下心把一招一式练扎实的人少。 异步社区:您认为国内做的最好的重构案例是哪个?为什么? 熊节:我不知道这样的案例。 我有次跟朋友说到,重构是一个悖论:会重构的人,会把测试做到位,把持续集成搭建好,随时留意坏味道,随时重构,所以他根本不需要跟人说他在重构。跟人大张旗鼓讲重构、甚至把重构变成一个“案例”的,基本上可以肯定,他不会重构,他在打着“重构”的大旗瞎搞。 异步社区:在ThoughtWorks工作的经历给您最大的收获是什么? 熊节:最大的收获大概就是见到了、经历了很多不同行业、不同类型的软件系统和项目,然后明白了一个道理:软件都是一样的,写好代码的方法都是一样的。很多人会说“我们这个行业很特殊你这套方法搁我们这儿都不适用”,我在十多个不同的行业里每次都听人这么说,听多了就明白,这些都是扯淡,都是懒人给自己找借口。 异步社区:从2010年《重构》出版一直到现在,软件行业对这种重构方法越来越接纳,请问背后的根本原因是什么?在这样的过程中,代码重构的实践方法有没有发生变化? 熊节:我不觉得行业对重构方法越来越接纳。整个行业而言,我们最常看到的还是“刀劈斧砍”,做出修改的时候过于乐观,没有测试、没有认真考虑行为保持的修改过程,出了问题就靠加班来解决。大家只是越来越接纳“重构”这个词,因为这个词听起来很好,有一种积极应对变化的感觉。但真正在做的,还是跟以前一样,毫无规矩的修改。 大家愿意接纳“重构”这个词,我想是和时代背景相关的。现在大家都在说VUCA、都在说拥抱变化,有这么一种能响应变化的方法当然好。但是这个方法,实际做起来又太费脑子,大多数人只是喜欢这个概念,并没有真的去学习和实践如何做测试、如何重构。 重构的实践方法其实一直就没有变化。我以前在ThoughtWorks的同事王健总结了一个口诀:“旧的不变,新的创建,一步切换,旧的再见”。如果我们去看具体的重构手法如何实现,很多时候都是这个套路。放在以前没经历过的变更场景(比如把系统架构由单体变成微服务),也是这个套路。 但这个套路有一个最大的难点,就是在“一步切换”之前,你会有“旧的”和“新的”两个东西存在,那么就会有一个或长或短的时间段,你需要同时维护这两个东西。这是有成本的。如果“一步切换”没有出错,这个成本就丢掉了。很多人非常乐观,会觉得我做这个修改一步就修改完了不会出错,所以他们就不愿意接受这个“旧的不变,新的创建”的过程。 盲目乐观和缺乏事后吸取经验教训的能力,这是我们这个行业普遍的现象。从改一个函数名,到改一个服务接口,到改一个架构,我们总会看到这种盲目乐观说“一下就改好了”的人,然后这次他出错了,下次他仍然会说“一下就改好了”。人们愿意盲目乐观相信这次不会出错,愿意出错之后通宵加班,也不愿意平时把测试做好、修改的时候选择一条行为保持的路径。在这一点上,我们这个行业相比十七年前,没有任何进步。 异步社区:最后,给刚入门的小白推荐3本专业书,您最想推荐哪一本? 熊节:一本的话,我觉得应该读《实现模式》。我经常看见号称七年八年经验的程序员,起个变量名都起不好。我觉得一个程序员至少应该先读《实现模式》,或者至少应该先读《实现模式》的第6章,否则应该禁止他编程。 三本的话,那就《实现模式》、《重构》、《测试驱动开发》吧。 从来不推荐什么“道”啦什么“禅”啦什么“思想”啦之类的。中国IT业的现实是能把代码写顺畅的人都太少。我们应该谦卑地直面这个现实,然后诚恳地做点实在的事情,不要成天就想着变成Linus。 作者:马丁·福勒(Martin Fowler) 《重构:改善既有代码的设计(第2版)》 本书是经典著作《重构》出版20年后的更新版。书中清晰揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以求改善。书中给出了60多个可行的重构,每个重构都介绍了种经过验证的代码变换手法的动机和技术。本书提出的重构准则将帮助开发人员小步地修改代码,从而减少了开发过程中的风险。 - END -
1999年,世界软件开发大师,ThoughtWorks首席科学家马丁·福勒(Martin Fowler)出版《重构:改善既有代码的设计》,读者反馈甚佳,重构(Refactoring)的理念被广泛接纳,成为编程的词汇表中不可或缺的部分。2019年,恰逢《重构》一书推出20周年,马丁重新梳理他对重构理念的最新思考,不朽经典重磅升级。《重构:改善既有代码的设计(第2版)》中文版将于近日震撼上市! 《重构:改善既有代码的设计(第2版)》 ISBN:9787115508645 作者:[美]马丁·福勒(Martin Fowler) 译者:熊节,林从羽 《重构》一书被奉为软件开发界的经典之作,因其凝聚了软件开发社区专家多年摸索而获得的宝贵经验,书中所蕴涵的思想和精华,值得反复咀嚼,常读常新。《重构》第一版在我国累计发售11个版本,累计销售超20万册,包括英文影印版、英文评注版、精装版、中文简装版等,其受欢迎程度可见一斑。《重构(第2版)》英文版一经上市,即位列美亚计算机类图书畅销榜排名第一。 这本备受关注的第2版在第1版的基础上做了全面修订,反映了编程领域业已发生的许多变化。第2版中介绍的重构列表更加内聚,并用JavaScript语言重写了代码范例。此外,第2版中还新增了与函数式编程相关的重构范例,旨在教会读者如何在没有类的环境下开展重构。新版沿袭了第1版的结构,依次解释什么是重构,为什么要重构,如何通过“坏味道”识别出需要重构的代码,以及如何在实践中成功实施重构(无论用的是什么编程语言)。《重构(第2版)》中文版已在京东、当当、亚马逊等网络书店同步开启图书预售。 本书作者马丁·福勒已出版过7本软件开发方面的经典书籍。2000年3月,他成为ThoughtWorks的首席科学家。马丁同时是一位作家、演说者、咨询师和泛软件开发领域的意见领袖。他致力于改善企业级的软件设计,对优秀的设计以及支撑优秀设计的工程实践孜孜以求,在重构、面向对象分析设计、模式、XP和UML等领域都有卓越贡献。 谈到本书该如何阅读,本书最大的一个特点清晰揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以求改善。书中给出了 60 多个可行的重构,每个重构都介绍了一种经过验证的代码变换手法的动机和技术。本书提出的重构准则将帮助开发人员一次一小步地修改代码,从而减少了开发过程中的风险。 本书的另一个特点是,为了方便读者阅读,作者特别绘制了本书的内容组织结构图,指出了全书12章内容之间的相关关系,如图所示。读者可以根据自己的背景或需要,随意挑选阅读。 什么是重构 所谓重构(refactoring)是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构。重构是一种经千锤百炼形成的有条不紊的程序整理方法,可以最大限度地减小整理过程中引入错误的概率。本质上说,重构就是在代码写好之后改进它的设计。 “在代码写好之后改进它的设计”这种说法有点儿奇怪。在软件开发的大部分历史时期,大部分人相信应该先设计而后编码:首先得有一个良好的设计,然后才能开始编码。但是,随着时间流逝,人们不断修改代码,于是根据原先设计所得的系统, 整体结构逐渐衰弱。代码质量慢慢沉沦,编码工作从严谨的工程堕落为胡砍乱劈的随性行为。 “重构”正好与此相反。哪怕手上有一个糟糕的设计,甚至是一堆混乱的代码, 我们也可以借由重构将它加工成设计良好的代码。重构的每个步骤都很简单,甚至显得有些过于简单:只需要把某个字段从一个类移到另一个类,把某些代码从一个函数 拉出来构成另一个函数,或是在继承体系中把某些代码推上推下就行了。但是,聚沙成塔,这些小小的修改累积起来就可以根本改善设计质量。这和一般常见的“软件会 慢慢腐烂”的观点恰恰相反。 有了重构以后,工作的平衡点开始发生变化。作者发现设计不是在一开始完成的, 而是在整个开发过程中逐渐浮现出来。在系统构筑过程中,作者学会了如何不断改进设计。这个“构筑-设计”的反复互动,可以让一个程序在开发过程中持续保有良好的设计。 对本书的赞誉 过去20年,《重构》一直是我案头常备的图书。每次重读,仍有感悟。对我而言,《重构》的意义不只在于指导代码重构,更在于让人从一开始就知道什么是好的代码,并且尽量写出没有“坏味道”的代码。Martin Fowler这次对本书进行的重构,体现了近年来编程领域的一些思潮变化。看来,既有设计,永远有改进空间。 ——韩磊,《代码整洁之道》译者 重构早就成了软件开发从业者本能的一部分,每个IDE都内置了重构功能,每个程序员都定期重构自己的代码。技能上通常不再是问题,但是相对于当年第1版的读者,现在的程序员对于重构这个思想从何而来以及各种细节反而更陌生,这时候就更值得重新读一下这本书了。 ——霍炬,PRESS.one CTO 有人说Martin Fowler改变了人类开发软件的模式,这一点也不过分,从《模式分析》《UML精粹》《领域特定语言》,到这本《重构》新版可以看得出来,他的每一本书都是软件开发人员必备的案头读物。此前他参与的“敏捷宣言”,更是引领了整个行业对敏捷开发的认识,一直到现在。Martin Fowler是我们QCon全球软件开发大会进入中国时的第一届讲师,也是在那次会议上,他让国内的技术社区领略了国际领先的开发模式,从此“敏捷”二字开始风行国内IT领域。 今年是QCon进入中国的第十个年头,我特别开心看到Martin Fowler又重写《重构》这本影响深远的书,他几乎完全替换了书中所引用的模式案例,并且基于现在用户的习惯,采用了JavaScript语言来做说明语言。数十年来他始终保持对技术的关注,对创新的热情,乐此不疲,这是Martin最令人敬佩的地方,也是非常值得我们每一个技术人学习的地方。 ——霍泰稳,极客邦科技、InfoQ中国创始人兼CEO 当今软件开发的速度越来越快,带来的技术债也越来越多,我从CSDN自身的网站系统开发中充分认识到重构的重要性——如果我们的程序员能理解和掌握重构的原则和方法,我们的系统就不会有这么多沉重的债务。真正本质的东西是不变的,《重构》在出版20年后推出了第2版,再次证明:越本质的越长久,也越重要。衷心期待更多的新一代开发者能从这本书吸收营养,开发出好味道的系统。 ——蒋涛,CSDN创始人、董事长 最早看到本书第1版的英文原版并决定引进国内,算起来已经是20年前的事了。虽然时间是最强大的重构工具,连书里的示例语言都从Java变成JavaScript了,但书中的理念和实践的价值并没有随时间流逝。这充分证明,即使在日新月异的IT技术世界里,不变的东西其实还是有的,这种书才是真正的经典,是技术人员应该优先研读并一读再读的。 ——刘江,美团技术学院院长 “对于软件工程师来说,重构,并不是额外的工作,它就是编码本身。”直到我读过《重构》,并经过练习,才真正理解到这一点。真希望自己在20多年前写第一个软件时,就能读到这本书,从而能节省出大量调试或重复研究代码的时间。20年过去了,《重构》这本书也根据当前软件设计及相关工具的发展进行了一部分修订,更加贴近当前的软件开发者。希望更多的软件工程师能够应用这一技术节省出更多的时间。 ——乔梁,腾讯高级管理顾问、《持续交付2.0》作者 重构是一项被低估了的技术能力。说起来,重构就是“不改变外在行为,而提高代码质量”这么简简单单的一句话,但其带来的影响却非常深远:它使我们在解决问题时可以放心地“先做对,再做好”——这种思路本身就可以极大地简化问题;它使我们消除无谓的意气之争——“所谓好,就是更少的坏味道”。我由衷地认为,切实地读懂了《重构》的程序员,在能力上都会获得一个数量级的提升。 ——徐昊,ThoughtWorks中国区技术总监 当我还是编程菜鸟,想写出漂亮的代码而不得门道的时候,《重构》这本书就告诉了我,其实高手的代码也不是一次书就的,只要按这本书里的方法去做,谁都能把代码写得那么好;当我还是职场新人,没来得及写出太多垃圾代码的时候,这本书就教会了我,应该去追求编写人能够读懂的而不是仅机器能够读懂的代码。多年以后的某时某刻,当你编码自信而敏捷,因代码清晰而受人尊重时,你会庆幸读过这本书,你也会有些遗憾,应该再早一点去读这本书。无论过去了多少年,这本书,一直值得推荐。 ——阎华,京东7FRESH架构师 在大获成功的《重构》第1版里,Martin Fowler传达的核心理念是:代码会随时间流逝而烂掉。写得再好的程序代码,若是发布了就一直保持原样,照样会风化、破碎乃至分崩离析。这是客观规律,避免这种命运的唯一出路是持续重构。要想成为高素质的软件工程师,必须认识这一点。 20年之后,Martin Fowler用现身说法证明,经典的《重构》也会变得不合时宜,也需要重构。如今,不但讲解语言从Java改成了JavaScript,原来的重构示例也做了很多调整,新增了15个示例,更重要的是,新版示例不再那么“面向对象”,应当会收获更广泛的读者群。 软件不死,重构不歇。 ——余晟,《代码整洁之道:程序员的职业素养》译者 随着软件项目日积月累,系统维护成本变得越来越高昂是互联网团队共同面临的问题。用户在使用互联网系统的过程中,遇到的各类运行错误或者不可访问故障,以及开发团队面临的历史系统不可维护问题,很多时候是代码初次开发过程中各种细小的不规范引起的。持续优化已有代码是维护系统生命力最好的方法。《重构》是我推荐团队必读的技术图书之一。 ——杨卫华(Tim Yang),微博研发副总经理 软件行业已经高速发展数十年,就好似一个崭新的城市,从一个个村屋矮房到高楼林立。而你的代码库就好比你手下的一个房间、一幢平房、一条街道、一片社区乃至是一座摩天大楼。作为一本经典的软件开发书籍,《重构》告诉我们的不仅仅是如何推倒重建、清理、装修,而是像一个规划师一样从目的、成本、手段、价值等综合维度来思考重构的意义。在开发业务的同时,《重构》常伴我左右,警醒我如何写出更有价值的软件。 ——阴明,掘金社区创始人 重构,是一个优秀程序员的基本功,因为没人能保证其代码不随时间腐化,而重构会让代码重新焕发活力。整个软件行业对重构的认知始于Martin Fowler的《重构》,这本书让人们知道了“代码的坏味道”,见识到了“小步前行”的威力。时隔20年,Martin Fowler重新执笔改写《重构》,20年间的思维变迁就体现在这本书里,在第1版中,我们看到的是当时方兴未艾的面向对象,而第2版则透露出函数式编程的影响。如果说有什么程序员进阶秘笈,那就是不要错过Martin Fowler的任何一部著作,更何况是已经由时间证明过的重要著作《重构》的新版! ——郑晔,火币网首席架构师 如果看完本书,就兴冲冲地想要找一些代码来重构,那你可能就陷入某种“自嗨”之中了。 了解本书中列出的那些坏味道,不仅仅可以发现代码中的那些坏味道,更可以鞭策自己以及整个团队:在一开始的时候,就不写或者少些那种味道很坏的代码。还应该激励自己,深入地理解架构、理解业务、理解需求,减少因设计失误而导致徒劳无益地反复重构。 重构也是有成本的,所以应该思考如何降低重构的成本。我推荐每一个程序员都来学习“重构”这门手艺。因为学习《重构》,是为了减少“重构”! ——庄表伟,开源社理事、执行长,华为云DevCloud高级产品经理 图书基本信息: 书名:重构:改善既有代码的设计(第2版) ISBN:978-7-115-50864-5 精装版定价:168.00 作者:[美]马丁·福勒(Martin Fowler) 译者:熊节 林从羽 出版日期:2019年3月 更多信息,请访问人民邮电出版社异步社区:https://www.epubit.com/ 关于异步社区 异步社区(www.epubit.com)由人民邮电出版社出品,是国内领先的IT专业图书社区。异步社区于2015年8月上线运营,依托于人民邮电出版社30余年的IT专业优质出版资源和编辑策划团队,致力于优质学习内容的出版和分享,为读者提供优质学习内容,为作译者提供优质出版服务,实现作者与读者在线交流互动,实现传统出版与数字出版的融合发展。 关于人民邮电出版社 人民邮电出版社成立于1953年10月,是工业和信息化部主管的大型科技出版社。目前图书出版领域涵盖信息技术、少儿、经管、摄影、集邮、旅游、心理学、军事、家庭教育等,其中计算机类图书的零售市场占有率持续占据首位,在传统的编程开发、数据库、软件测试,以及新兴的热点领域如人工智能、大数据、前端技术,都占据了图书市场的领导地位。
作为程序员,要学习很多重要的主题。算法,数据结构,编程语言,数不胜数,代码重构也是其中必备技能之一。 今天小编推荐一本无敌厉害的书,接下来的很长时间你将被这本书刷屏,它将出现在各大畅销书排行榜内,这本书就是《重构(第2版)》。 它在世界范围内畅销不衰,被翻译为中、德、日、俄等众多语言。 这本经典书20年后重磅升级,更新内容超30%,更新了众多项目案例。 想要成为《重构(第2版)》中文版的首批读者,可以下滑到文末扫码申请四,我们将从报名的读者中选出50人,3月11日首批品鉴。同时京东、当当、天猫等各大书城已同步预售(点击网店名称可以直达购买)。 《重构:改善既有代码的设计(第2版)》作者:马丁·福勒(Martin Fowler) 01 《重构(第2版)》必读的四大理由 理由一:不可撼动的江湖地位 “重构”这个概念来自Smalltalk圈子,没多久就进入了其他语言阵营之中。由于重构是框架开发中不可缺少的一部分,所以当框架开发人员讨论自己的工作时,这个术语就诞生了。重构,一言以蔽之,就是在不改变外部行为的前提下,有条不紊地改善代码。多年前,正是《重构》原版的出版,使重构终于从编程高手们的小圈子走出,成为众多普通程序员日常开发工作中不可或缺的一部分。本书也因此成为与《设计模式》齐名的经典著作,被译为中、德、俄、日等众多语言,在世界范围内畅销不衰。 《重构》一书自第1版问世至今,读者的反馈甚佳,重构的理念已经被广泛接纳,成为编程的词汇表中不可或缺的部分。然而,对于一本与编程相关的书而言,20年己经太漫长,因此作者感到,是时候回头重新修订这本书了。作者几乎重写了全书的每一页,但从其内涵而言,整本书又几乎没有改变。重构的精髓仍然一如既往;大部分关键的重构手法也大体不变。作者希望这次修订能帮助更多的读者学会如何有效地进行重构。 《重构(第2版)》英文版美亚计算机类图书畅销榜排名第一,中文版累计发售了11个版本,累计销售超20万册,分别是英文影印版、英文评注版、精装版、中文简装版等。 美亚榜单截图2月27日 《重构》凝聚了软件开发社区专家多年摸索而获得的宝贵经验,拥有不因时光流逝而磨灭的价值。今天,无论是重构本身,业界对重构的理解,还是开发工具对重构的支持力度,都与本书最初出版时不可同日而语,但书中所蕴涵的意味和精华,依然值得反复咀嚼,而且往往能够常读常新。这本书在豆瓣评分高达9.3分。 理由二:世界级软件开发大师的不朽经典 本书作者马丁·福勒(Martin Fowler) ,世界软件开发大师,ThoughtWorks的首席科学家。他是一位作家、演说者、咨询师和泛软件开发领域的意见领袖。他致力于改善企业级的软件设计,对优秀的设计以及支撑优秀设计的工程实践孜孜以求。他在重构、面向对象分析设计、模式、XP和UML等领域都有卓越贡献。 马丁·福勒(Martin Fowler) 马丁·福勒在英格兰的沃尔索尔长大,去了玛丽皇后文法学校。1983年到2006年去了伦敦大学学院,获得了电子工程和计算机科学的学士学位(ENG)。毕业后他在在Coopers&Lybrand和一家名为Ptech的小型科技公司工作了一段时间,之后于1991年成为独立顾问。他于1994年搬到马萨诸塞州继续担任独立顾问,直到2000年加入ThoughtWorks。 在80年代初期开始从事软件工作,在80年代中期,他开始对面向对象开发的新世界感兴趣。开始专注于将对象引入商业信息系统,首先是与几家公司合作,然后作为独立顾问。在早期,这是使用Smalltalk和C ++,现在它是Java,C#和Ruby。每年他都会学到新东西,同时也发现过去的许多教训仍然适用。这项工作使他在面向对象分析和设计,UML,模式和敏捷开发方法方面发挥了主导作用。“ 马丁·福勒已出版过七本软件开发方面的经典书籍。2000年3月,他成为ThoughtWorks的首席科学家。福勒同时是敏捷联盟的成员,于2001年,同其他16名合著者一起协助创作了“敏捷软件开发宣言”。 来源于维基百科:https://zh.wikipedia.org/wiki/%E9%A9%AC%E4%B8%81%C2%B7%E7%A6%8F%E5%8B%92 马丁·福勒在20多年的时间里完成了多本影响深远的著作,成为软件开发行业的里程碑。耳熟能详的作品包括《重构》《分析模式》《领域特定语言》等经典著作。 理由三:20年后经典升级,更适合当下 重构,一言以蔽之,就是在不改变外部行为的前提下,有条不紊地改善代码。20 多年前,正是《重构:改善既有代码的设计》第1 版的出版,使重构终于从编程高手们的小圈子走出,成为众多普通程序员日常开发工作中不可或缺的一部分。如今,Martin Fowler 的《重构:改善既有代码的设计》一书已经成为全球有经验的程序员手中的利器,既可用来改善既有代码的设计、提升软件的可维护性,又可用于使既有代码更易理解、焕发出新的活力。 这本备受关注的第2 版在第1 版的基础上做了全面修订,反映了编程领域业已发生的许多变化。第2版中介绍的重构列表更加内聚,并用JavaScript 语言重写了代码范例。此外,第2版中还新增了与函数式编程相关的重构范例,旨在教会读者如何在没有类的环境下开展重构。 新版沿袭了第1 版的结构,依次解释什么是重构,为什么要重构,如何通过“坏味道”识别出需要重构的代码,以及如何在实践中成功实施重构(无论用的是什么编程语言)。 这些变化很细微,但是涉及到方方面面。变化细微是因为书的基本结构没有改变。书的开篇是一个开放式的例子、一个章节的原则、一个“代码坏味道”的调查和一个测试的介绍。这本书的主体仍然是重构,原来有68个重构示例,作者保留了其中10个,新增了17个。 虽然书的整体结构变化不大,但是文字的变化却很多。每一个章节和重构示例都几乎是从零开始重写,作者几乎没有复制粘贴旧版中的文字。 针对内容更新,作者Martin Fowler曾说:”新版重新调整重心,将重点更少地放在类上。虽然这听起来可能就像将“提取方法”的名称更改为“提取函数”一样简单,但它确实需要重新思考每个重构的所有方面。我需要重新考虑动机,经常需要重新设计。至少结构需要详细审查,通常都需要完全重写。对此我没有做详细的记录,但我觉得引用一个相对简单的旧的重构,就要重新考虑两个重构。“ 理由四:众多技术大咖鼎力推荐 本书译者熊节老师,在IT行业已经打拼了18年,在金融、零售、政府、电信、制造业等行业的信息化建设方面有着丰富经验,是中国IT业敏捷浪潮的领军人物。本书得到韩磊、霍炬、霍泰稳、蒋涛、刘江、乔梁、徐昊、阎华、余晟、杨卫华(Tim Yang)、阴明、郑晔、庄表伟等业内大咖联袂推荐。 下滑看看他们怎么说: 过去20年,《重构》一直是我案头常备的图书。每次重读,仍有感悟。对我而言,《重构》的意义不只在于指导代码重构,更在于让人从一开始就知道什么是好的代码,并且尽量写出没有“坏味道”的代码。Martin Fowler这次对本书进行的重构,体现了近年来编程领域的一些思潮变化。看来,既有设计,永远有改进空间。 ——韩磊,《代码整洁之道》译者 重构早就成了软件开发从业者本能的一部分,每个IDE都内置了重构功能,每个程序员都定期重构自己的代码。技能上通常不再是问题,但是相对于当年第1版的读者,现在的程序员对于重构这个思想从何而来以及各种细节反而更陌生,这时候就更值得重新读一下这本书了。 ——霍炬,PRESS.one CTO 有人说Martin Fowler改变了人类开发软件的模式,这一点也不过分,从《模式分析》《UML精粹》《领域特定语言》,到这本《重构》新版可以看得出来,他的每一本书都是软件开发人员必备的案头读物。此前他参与的“敏捷宣言”,更是引领了整个行业对敏捷开发的认识,一直到现在。Martin Fowler是我们QCon全球软件开发大会进入中国时的第一届讲师,也是在那次会议上,他让国内的技术社区领略了国际领先的开发模式,从此“敏捷”二字开始风行国内IT领域。 今年是QCon进入中国的第十个年头,我特别开心看到Martin Fowler又重写《重构》这本影响深远的书,他几乎完全替换了书中所引用的模式案例,并且基于现在用户的习惯,采用了JavaScript语言来做说明语言。数十年来他始终保持对技术的关注,对创新的热情,乐此不疲,这是Martin最令人敬佩的地方,也是非常值得我们每一个技术人学习的地方。 ——霍泰稳,极客邦科技、InfoQ中国创始人兼CEO 当今软件开发的速度越来越快,带来的技术债也越来越多,我从CSDN自身的网站系统开发中充分认识到重构的重要性——如果我们的程序员能理解和掌握重构的原则和方法,我们的系统就不会有这么多沉重的债务。真正本质的东西是不变的,《重构》在出版20年后推出了第2版,再次证明:越本质的越长久,也越重要。衷心期待更多的新一代开发者能从这本书吸收营养,开发出好味道的系统。 ——蒋涛,CSDN创始人、董事长 最早看到本书第1版的英文原版并决定引进国内,算起来已经是20年前的事了。虽然时间是最强大的重构工具,连书里的示例语言都从Java变成JavaScript了,但书中的理念和实践的价值并没有随时间流逝。这充分证明,即使在日新月异的IT技术世界里,不变的东西其实还是有的,这种书才是真正的经典,是技术人员应该优先研读并一读再读的。 ——刘江,美团技术学院院长 “对于软件工程师来说,重构,并不是额外的工作,它就是编码本身。”直到我读过《重构》,并经过练习,才真正理解到这一点。真希望自己在20多年前写第一个软件时,就能读到这本书,从而能节省出大量调试或重复研究代码的时间。20年过去了,《重构》这本书也根据当前软件设计及相关工具的发展进行了一部分修订,更加贴近当前的软件开发者。希望更多的软件工程师能够应用这一技术节省出更多的时间。 ——乔梁,腾讯高级管理顾问、《持续交付2.0》作者 重构是一项被低估了的技术能力。说起来,重构就是“不改变外在行为,而提高代码质量”这么简简单单的一句话,但其带来的影响却非常深远:它使我们在解决问题时可以放心地“先做对,再做好”——这种思路本身就可以极大地简化问题;它使我们消除无谓的意气之争——“所谓好,就是更少的坏味道”。我由衷地认为,切实地读懂了《重构》的程序员,在能力上都会获得一个数量级的提升。 ——徐昊,ThoughtWorks中国区技术总监 当我还是编程菜鸟,想写出漂亮的代码而不得门道的时候,《重构》这本书就告诉了我,其实高手的代码也不是一次书就的,只要按这本书里的方法去做,谁都能把代码写得那么好;当我还是职场新人,没来得及写出太多垃圾代码的时候,这本书就教会了我,应该去追求编写人能够读懂的而不是仅机器能够读懂的代码。多年以后的某时某刻,当你编码自信而敏捷,因代码清晰而受人尊重时,你会庆幸读过这本书,你也会有些遗憾,应该再早一点去读这本书。无论过去了多少年,这本书,一直值得推荐。 ——阎华,京东7FRESH架构师 在大获成功的《重构》第1版里,Martin Fowler传达的核心理念是:代码会随时间流逝而烂掉。写得再好的程序代码,若是发布了就一直保持原样,照样会风化、破碎乃至分崩离析。这是客观规律,避免这种命运的唯一出路是持续重构。要想成为高素质的软件工程师,必须认识这一点。 20年之后,Martin Fowler用现身说法证明,经典的《重构》也会变得不合时宜,也需要重构。如今,不但讲解语言从Java改成了JavaScript,原来的重构示例也做了很多调整,新增了15个示例,更重要的是,新版示例不再那么“面向对象”,应当会收获更广泛的读者群。 软件不死,重构不歇。 ——余晟,《代码整洁之道:程序员的职业素养》译者 随着软件项目日积月累,系统维护成本变得越来越高昂是互联网团队共同面临的问题。用户在使用互联网系统的过程中,遇到的各类运行错误或者不可访问故障,以及开发团队面临的历史系统不可维护问题,很多时候是代码初次开发过程中各种细小的不规范引起的。持续优化已有代码是维护系统生命力最好的方法。《重构》是我推荐团队必读的技术图书之一。 ——杨卫华(Tim Yang),微博研发副总经理 软件行业已经高速发展数十年,就好似一个崭新的城市,从一个个村屋矮房到高楼林立。而你的代码库就好比你手下的一个房间、一幢平房、一条街道、一片社区乃至是一座摩天大楼。作为一本经典的软件开发书籍,《重构》告诉我们的不仅仅是如何推倒重建、清理、装修,而是像一个规划师一样从目的、成本、手段、价值等综合维度来思考重构的意义。在开发业务的同时,《重构》常伴我左右,警醒我如何写出更有价值的软件。 ——阴明,掘金社区创始人 重构,是一个优秀程序员的基本功,因为没人能保证其代码不随时间腐化,而重构会让代码重新焕发活力。整个软件行业对重构的认知始于Martin Fowler的《重构》,这本书让人们知道了“代码的坏味道”,见识到了“小步前行”的威力。时隔20年,Martin Fowler重新执笔改写《重构》,20年间的思维变迁就体现在这本书里,在第1版中,我们看到的是当时方兴未艾的面向对象,而第2版则透露出函数式编程的影响。如果说有什么程序员进阶秘笈,那就是不要错过Martin Fowler的任何一部著作,更何况是已经由时间证明过的重要著作《重构》的新版! ——郑晔,火币网首席架构师 如果看完本书,就兴冲冲地想要找一些代码来重构,那你可能就陷入某种“自嗨”之中了。 了解本书中列出的那些坏味道,不仅仅可以发现代码中的那些坏味道,更可以鞭策自己以及整个团队:在一开始的时候,就不写或者少些那种味道很坏的代码。还应该激励自己,深入地理解架构、理解业务、理解需求,减少因设计失误而导致徒劳无益地反复重构。 重构也是有成本的,所以应该思考如何降低重构的成本。我推荐每一个程序员都来学习“重构”这门手艺。因为学习《重构》,是为了减少“重构”! ——庄表伟,开源社理事、执行长,华为云DevCloud高级产品经理 总之,这部经典,用方方面面的实力,等着征服你。 02 《重构(第2版)》如何读? 本书是一本为专业程序员编写的重构指南。目的是告诉你如何以一种可控且高效的方式进行重构。你将学会如何有条不紊地改进程序结构,而且不会引入错误, 这就是正确的重构方式。 本书的目标读者是专业程序员,也就是那些以编写软件为生的人。书中的范例和讨论,涉及大量需要详细阅读和理解的代码。这些例子都用JavaScript写成,不过这些重构手法应该适用于大部分编程语言。为了理解书中的内容,读者需要有一定的编程经验,但需要的知识并不多。 尽管本书的关注对象是代码,但重构对于系统设计也有巨大影响。资深设计师和架构师也很有必要了解重构原理,并在自己的项目中运用重构技术。最好是由有威望的、经验丰富的开发人员来引入重构技术,因为这样的人最能够透彻理解重构 背后的原理,并根据情况加以调整,使之适用于特定工作领域。如果你使用的不是 JavaScript而是其他编程语言,这一点尤其重要,因为你必须把将书中给出的范例用其他编程语言改写。 如果你的时间紧张,如何能够在不通读全书的情况下充分用好它? ■如果你想知道重构是什么,请阅读第1章,其中的示例会让你弄清楚重构的过程。 ■如果你想知道为什么应该重构,请阅读前两章,它们会告诉你重构是什么以及为什么应该重构。 ■如果你想知道该在什么地方重构,请阅读第3章,它会告诉你一些代码特征,这些特征指出“这里需要重构”。 ■如果你想着手进行重构,请完整阅读前四章,然后选择性地阅读重构名录。 一开始只需概略浏览列表,看看其中有些什么,不必理解所有细节。一旦真正需要实施某个重构手法,再详细阅读它,从中获取帮助。列表部分是供查 阅的参考性内容,你不必一次就把它全部读完。 ■从第5章往后的篇幅就是本书的核心部分——重构名录。尽管不能说是一份巨细靡遗的列表,却足以覆盖大多数开发者可能用到的关键重构手法。作者曾说:”这份重构名录的源头是20世纪90年代后期我开始学习重构时的笔记,直到今天我仍然不时查阅这些笔记,作为对我不甚可靠的记忆力的补充。每当我想做点什么——例如拆分阶段 (154)——的时候,这份列表就会提醒我如何一步一步安全前进。我希望这是值得你曰后一再回顾的部分。“ 给形形色色的重构手法命名是编写本书的重要部分。合适的词汇能帮助我们彼此沟通。当一名开发者向另一名开发者提出建议,将一段代码提取成为一个函数,或者将计算逻辑拆分成几个阶段,双方都能理解提炼函数(106)和拆分阶段(154)是什么意思。这份词汇表也能帮助开发者选择自动化的重构手法。 03 如何成为《重构(第2版)》首批读者? 说了这么多,是不是特别想成为《重构(第2版)》中文版的首批读者? 下面一定要仔细阅读哦~ 【活动详情】我们希望在它和读者朋友们正式见面之前,组织一次特别的读书分享活动。寻找首批《重构(第2版)》的有缘人。 只需要扫描海报上的二维码,回答几个简单的问题,就可以参与到我们的活动中来。我们会从所有参与者中,筛选50位抢读人,发送《重构(第2版)》的专属迷你电子书,并邀请你加入第一批《重构(第2版)》读书会。 什么是【专属迷你电子书】?迷你电子书节选自《重构(第2版)》的12个章节,内容为重构的经典案例部分,单本厚度80页左右,首季限量50册,阅读与收藏价值兼备。 你只需要在读完我们为你精选《重构(第2版)》迷你电子书后,在豆瓣本书页面(也可扫描下方二维码)下发布150字以上的书评,活动结束后(3月20日12点为书评最后截止时间),我们将评选10个优秀书评赠送《重构(第2版)》精装版纸书一本。 异步君,和《重构(第2版)》,在这里等你哦! - END - 异步图书 聊聊图书背后的故事
点 Google "相似图片搜索":你可以用一张图片,搜索互联网上所有与它相似的图片。 打开Google图片搜索页面: 点击【相机】使用上传一张《深度学习》的原图: 点击搜索后,Google会出现外观类似的图片,相似度越高,图片越靠前。 这种技术的原理是什么?计算机怎么知道两张图片相似呢? 为了满足大家的好奇心,下面我来讲一下“以图搜图”背后的故事。 01相似图像搜索引擎 “以图搜图”正式的名称应该叫“相似图像搜索引擎”,也称为“反向图片搜索引擎”。最初的图像搜索引擎是基于文本关键字检索的。早期的Altavista、Lycos等搜索引擎正是利用图像的文件名和路径名、图像周围的文本,以及Alt标签中的注释索引和搜索相关图像的。从本质上来说,这样的图像搜索引擎其实还是基于文本搜索引擎的。有时图像周边的这些文本信息和图像并没有关系,会造成搜索出来的部分图像结果和查询关键词并不一致。为了避免这种问题,有些搜索引擎采用人工的方式对图像进行标注索引。虽然人工标注保证了搜索引擎的查准率,但是它限制了图像索引的规模,不可能有很好的查全率。而有时,图像的内容是很难用几个关键词就能完整描述出来的。在某种情况下,无论是利用图像网页相关文本信息,还是人工标注文字说明,都很难做到较高的搜索准确度。 1992年,T. Kato提出了基于内容的图像检索(CBIR)的概念,它使用图像的颜色、形状等信息作为特征构建索引以实现图像检索,即我们通常所说的“以图搜图”。基于这一概念,IBM开发了第一个商用的CBIR系统QBIC(Query By Image Content),用户只需输入一幅草图或图像,便可以搜索出相似的图像。同一时期,很多公司也将这一技术引入搜索引擎。哥伦比亚大学开发的WebSEEK系统不仅提供了基于关键词的图像搜索和按照图像类目的主题浏览,还可以利用图像的颜色信息进行基于内容的图像搜索。Yahoo的ImageSurfer也提供了使用例图的颜色、形状、纹理特征,以及它们的组合来进行基于内容的图像搜索功能。随着视觉技术的进步和发展,越来越多的搜索引擎采用这一方式来进行图像搜索,并在此基础上不断演进。 早期曾使用过“以图搜图”方式进行图像搜索的读者可能会有这样的印象,这种图像搜索方式在返回的结果的准确度往往不太令人满意。为此,很多视觉研究人员、图像技术开发者不断提出新的图像特征表示算法。虽然准确率在一点点提高,但是并未根本性地解决准确度问题。这究竟是什么原因呢?原因在于无论是图像的颜色、纹理、形状这些全局信息,还是后来的SIFT等局部图像信息,都是人为设计的硬编码,还不能完整地表达人类对整幅图像内容的理解。 那图像搜索的准确率还能提高吗?随着人工智能(特别是深度学习理论和技术)的发展,人们逐步找到了解决方案。深度学习技术极大地提高了图像表达的准确性。诸多主流图像搜索引擎纷纷引入了深度学习算法来提高图像搜索的准确率。 如今我们日常使用的百度、搜狗等通用搜索引擎均提供了相似图像检索功能。淘宝、京东等电商平台也利用自己庞大的商品图像库开发了垂直领域内的图像检索功能来满足消费者们不易用文字描述的商品搜索需求。有更多的创业公司在各自的领域内使用相似图像搜索技术来满足形形色色图像检索需求,服务于更多的行业和消费者。 虽然图像检索技术已广泛应用于我们的生活当中,但目前这一技术还未完全成熟,仍有许多问题需要解决,改进和提高的空间还很大。搜索的结果和用户的期望还有一些距离,存在一定的图像语义鸿沟。这也是从事这项技术研究与开发的人员不断进步的源动力。 02搜索引擎的一般结构 根据一般的抽象方法,我们可以把事物非关键性的特征剥离出来,而只保留其最为本质的特征。对于现有技术条件下的搜索引擎,必须事先生成索引库,再在其上进行搜索查询。 如图所示,首先需要对输入数据进行一定的预处理,以使我们可以对其进行进一步分析。接下来,把文本搜索引擎的词法、语法分析等语言处理阶段抽象为对输入数据的特征提取,一个个提取出来的词就是构成一个文档特征向量的基本元素,反向索引库就是特征和文档对应关系的集合。对于查询数据,我们也要抽取其特征,然后计算它的特征向量与索引库中所有特征向量的相似度,最终返回规定数量的相似结果。 抽象搜索引擎结构 03自制AI图像搜索引擎 为了彻底弄清楚这类图像搜索引擎的技术原理,我反复查找和阅读当时互联网上甚为稀缺的相关资料,但收效甚微。直到后来,我遇到了一个叫作LIRE的开源项目,它让我初步理解了图像搜索引擎的技术原理。但是在实际应用中,LIRE的效果并不是太好。为了解决这个问题,我又找到“深度学习”这个强有力的助手。 在探索原理的过程中,我发现国内几乎找不到一本介绍图像搜索引擎基本原理和实现的书,这也成了《自制AI图像搜索引擎》诞生的缘由。 《自制AI图像搜索引擎》作者:明恒毅 扫描二维码,一键当当购买 扫描二维码,一键京东购买 图像搜索引擎有两种实现方式——基于图像上下文文本特征的方式和基于图像视觉内容特征的方式。本书所指的图像搜索引擎是基于内容特征的图像检索,也就是通常所说的“以图搜图”来检索相似图片。本书主要讲解了搜索引擎技术的发展脉络、文本搜索引擎的基本原理和搜索引擎的一般结构,详细讲述了图像搜索引擎各主要组成部分的原理和实现,并构建了一个基于深度学习的Web图像搜索引擎。 为什么要读《自制AI图像搜索引擎》? 业内仅此一本,你还在等什么? 目前在国内计算机专业图书市场上,有关图像检索的书籍甚为稀缺。据我所知,仅有两本中文专业书籍,分别是:科学出版社出版的清华大学章毓晋教授的《基于内容的视觉信息检索》,清华大学出版社出版的北师大周明全教授等人著的《基于内容图像检索技术》。这两本书均是纯正的学术著作,理论丰富,但实践相对不足。此外,这两本书均出版于本世纪初,也就是深度学习技术开始风靡之前,故两本书中均未包含将深度学习应用于图像检索的内容。 《自制AI图像搜索引擎》由一线开发人员所著,偏重实践,兼有传统和现代方法,可以说是目前市场上唯一一本有关AI图像检索的图书。 将深度学习理论和应用场景紧密结合,有技术、能落地 自2016年AlphaGo以4:1的比分战胜世界顶级围棋棋手李世石以来, AlphaGo所依赖的深度学习算法在公众中得到了快速的科普。与此同时,各大科技公司也纷纷在深度学习领域投入重金,开始高薪聘请首席科学家、算法研究员和工程师。图书市场也纷纷推出各种有关深度学习的理论书籍。但随着时间的推移,很多理论缺乏应用场景,并未产生实际效用。不同于其他的理论和技术,AI图像检索技术有着明确的应用场景和目标市场,能够紧密地将深度学习理论和应用场景相结合,可谓“有技术、能落地”。 用理论指导编码,用代码阐释理论,相得益彰 《自制AI图像搜索引擎》一书的每有个图像检索的理论都配有一段Java代码,使读者既能深刻地理解理论,又能将理论转变为编码实现。无论是对理论功底强、实践能力弱的学术读者,还是对实践能力强、理论功底弱的开发者,本书都能提供有针对性的指导。 循序渐进,深入浅出,适合各层次开发人员入手 《自制AI图像搜索引擎》一书采用循序渐进的叙述方式,沿着历史和技术发展的脉络,由文本搜索引擎的基本原理逐步抽象出搜索引擎的一般结构,进而由文本演进到图像。结合具体实现代码,全面讲述了图像搜索引擎中各个组成部分的基本原理。任何愿意了解和学习AI图像搜索引擎的读者在研读此书后,都能在理论与实践方面收获满满。 提供从零开始构建AI图像搜索引擎的案例教程,即学即用 《自制AI图像搜索引擎》一书在最后一章提供了一个从零开始构建一个基于深度学习的Web图像搜索引擎的教程和相应的可实际运行的项目代码,真正做到了即学即用。读者既可以先尝试一下运行效果,而后带着小小的成就感来学习相关的理论和技术,也可以在学习完相关的理论和技术后,再研究最后一章的代码与实现过程。 轻松学《自制AI图像搜索引擎》你需要掌握: 京东满200减100 - END - 异步图书 聊聊图书背后的故事 点击此处添加图片说明文字
微软弃 Windows 而拥抱 Linux 之后,国内首本SQL Server On Linux的图书出版,这本书教了很多新玩法。 SQL Server作为微软公司著名的数据库管理系统,多年以来一直稳居各种数据库排名的前三甲。作为最初由图灵奖数据库方面得主詹姆斯·格雷主导开发,并基于另外一位图灵奖数据库方面得主Michael Stonebraker开发的Ingres发展起来的SQL Server数据库管理系统,经过30多年的锤炼,已经得到业内的广泛认同和应用。 作为早已轻松支持TB甚至PB级别数据量的数据库产品,合理使用SQL Server足以应对绝大部分常规需求。由于某些原因,在国内SQL Server一直不被看好,这个现象从2014年微软第3任CEO萨蒂亚·纳德拉上任,并提出“Microsoft Open Source”之后得到了很大的改变。随着.NET、Visual Studio、Office等微软产品逐步实现跨平台应用,SQL Server也在2016年正式可运行在主流的Linux平台上(目前它支持Red Hat/CentOS、Ubuntu和SUSE)。 随着SQL Server 2017的正式发布,SQL Server除了跨平台之外,还引入了大量的新功能,这些功能不仅对数据库性能及数据库管理效率带来明显的提升,还加快了SQL Server和大数据、人工智能领域的整合。 鉴于目前国内尚未有系统介绍关于SQL Server在Linux上运行的图书,同时网上资料过于零散,作者经过近一年的实践及资料整合写了《SQL Server On Linux运维实战》,目的是让读者尽快上手,掌握基于Linux的SQL Server的安装、配置、管理及性能优化方法。书中部分内容不局限于Linux平台,但以Linux平台为主。 《SQL Server On Linux运维实战》 作者:黄钊吉, 熊章立 SQL Server凤凰涅槃,浴火重生; 跨平台,Linux和Windows平台均适用; 从入门到精通,突出运维监控、性能调优; 融入作者10年工作经历,系统、实用、经常翻阅的工具书。 通过阅读本书,你将会了解到如何使用基于Linux的SQL Server,如何更好地管理在Linux上的SQL Server及如何进行常规的SQL Server性能优化。 运行在Linux上的新版SQL Server,将其新特性及强大功能与Linux原生系统的优点进行结合,不仅在运维及性能上带来巨大的便利和提升,同时对大数据和数据挖掘领域的逐步兼容[如内置机器学习、图形处理、兼容HDFS(hadoop分布式文件系统)、Containers(容器)等特性],使得企业不需要从头开始搭建或者把现有环境迁移到“适合”大数据环境的其他关系型数据库中。 01 为何选择Linux平台的SQL Server 曾经由于大数据产生在Linux环境,SQL Server不能直接访问HDFS(其实从SQL Server 2012开始它已经可以访问了,但是需要一些辅助驱动),不能运行在Linux上,所以SQL Server认为是时代的弃子,只能守住现有的一亩三分地,会在传统领域中挣扎并慢慢消亡。 自现任微软CEO(萨蒂亚·纳德台)上台之后,微软有了翻天覆地的改变,随着云优先、移动优先的策略,“Microsoft Open Source”的大方针不断深化,微软故步自封的形象在逐步改变。SQL Server作为微软非云专属(微软云有其他数据库产品如Azure Cosmos DB)的最重要的数据库产品,在数据技术(DT)时代和人工智能(AI)时代,自然也有了革命性的改变。 在IT领域工作过的读者应该多多少少听说过,在大规模环境下,经过“合理管理”的Linux服务器在性能和稳定性方面,都比Windows Server好。其中一个例子就是在服务器重启频率和软件更新、补丁修复工作中Linux明显比Windows Server表现得更好。 实际上,从SQL Server 2016开始,SQL Server就能运行在Linux环境下。SQL Server 2017的正式发布进一步实现了其在Windows Server和主流Linux平台的无缝连接。同时,不只是SQL Server数据库引擎,还包括SQL Server Agent、某些高可用技术等,它们都能运行在Linux平台。 接下来我们稍微浏览一下为什么选择Linux平台上的SQL Server。 以下仅是作者总结,并不代表官方说法。以下仅是作者总结,并不代表官方说法。 大趋势:这几年最火的莫过于DT、AI、大数据、IoT(物联网)、区块链等,而且无一例外地它们都产生在Linux生态环境下。并非说Windows不好,但是从现状来看,我们也不得不面对Linux,有Linux方面的知识才能跟得上潮流,不至于被时代淘汰。作为微软技术从业者,单纯学Linux难免有点抵触。现在可以结合SQL Server来学习,作者认为这是再好不过的切入点,不管合不合理,给自己一个学习的理由并没有什么不好。 新版本新体验:不管是SQL Server还是其他主流的数据库管理系统,每一次的新版本都带来了各种新功能、新体验。在最近几个大版本(特别是2012及其后续版本)中,在数据引擎、传统BI甚至大数据领域,都可以看到SQL Server在不停地进步。比如我们可以使用一些功能(如分区)对大型库/表进行管理,借助In-Memory技术大幅度提升OLTP的性能,通过AlwaysON技术实现读写分离和HA+DR方案,提高资源利用率和系统稳定性,另外还能对安全方面的功能进行提升。本书会挑选一些比较重要的特性进行介绍和演示。 纯SQL Server的优缺点:除了少部分对SQL Server On Windows或SQL Server On Linux感兴趣的读者可能未接触过SQL Server之外,大部分读者都应使用过SQL Server,抛开一些排名,客观地对比一下现在主流的关系数据库管理系统。 主流的关系数据库管理系统 开源:虽然SQL Server不开源,但是Oracle/DB2/SAP这些也不开源。 原生负载均衡:虽然SQL Server不支持原生负载均衡,但是MySQL也不支持。Oracle还得花大价钱购买。 跨平台:从SQL Server 2016开始它已经不再是讨论的话题。 支持数据量:至于较大型的系统(比如单表超过1亿行),MySQL恐怕早就要借助分库分表或者其他技术来分摊负载,而SQL Server则不一定,在设计合理、硬件充足的前提下,适当进行一些处理(如表分区、文件组拆分等)操作,很容易应对亿级表的高效操作。 性能:除非业务逻辑及数据量确定到了一定程度,否则未经专家调优的Oracle也不一定比SQL Server好。同样,未经调优的Linux,比Windows更不安全。重点还是要看如何使用它们。 口碑:可能作者了解不多,到目前为止,作者从未听过国内出名的Oracle专家(包括各ACE、ACE Director)在公共场合说别的产品(特别是SQL Server)不好,他们不是不清楚各产品之间的差异,而是不想浪费时间精力在这些无谓的争吵当中。如果你并不同时精通(简历上写的那种不算)两种或以上的数据库产品,那么千万别轻易进行对比和下定论。还是那一句:不是产品真得不好,而是你水平有限。其实SQL Server活到现在,还是有它的优势的。另外在写作本书过程中,作者还看到国内某位Oracle ACED的关于Linux上SQL Server AlwaysON方面的文章,作为Oracle对非内部员工授予的最高称号获得者,他们也在学习SQL Server。这里作者不是想说SQL Server如何好,而是态度问题,要有一个开放包容的态度,你才能走得更远。 关于Linux上的SQL Server性能,可以见官方提供的资料,必应搜索“Microsoft, Red Hat, and HPE Collaboration Delivers Choice & Value to Enterprise Customers”。 02 SQL Server On Linux新特性简介 正如人类进化一样,传统数据库软件为了应对时代的发展,必须要做出很多的“进化”甚至“革新”。有些是我们看不到的,比如SQL Server 2000到SQL Server 2005就引入了一次彻底的重构,加入了SQLOS,到SQL Server 2016之前,我们大量使用的DMV都来自这里。从SQL Server On Linux/SQL Server 2017开始,又引入了SQL PAL,这些对于用户甚至DBA来说都是透明的。这些通常成了产品的卖点。 近年来SQL Server平均每两年发布一个大版本,每个大版本又包含了大量的新特性,没有必要一一详述,作者会根据经历及当前需求,挑选一些比较有价值的功能介绍和演示。 完整的新特性列表可见官方文档,可以用必应搜索“SQL Server 2016 中的新增功能”及其延伸阅读部分。 按照官方的安装过程,本节也从数据库引擎、SSIS、机器学习及兼容Linux这4大方面进行介绍,其中每个功能前面的小括号代表着它在哪个版本开始出现。 2.1 数据库引擎 数据库管理(含数据库安全) 这部分是数据库管理系统中的基础功能。它让数据库“可用”,只有可用的数据库,才能继续执行性能、高可用及数据利用等功能。SQL Server 2016~2017对数据库管理有了很多的新增功能或者原有功能的强化,读者可能会用到的有以下几个功能。 (2016+)TempDB增强:可在安装过程中配置多个TempDB数据文件,对此,作者认为它只是起到“提醒”用户注意的作用,因为它与过去没有什么本质的改变。在过去,对TempDB拆分多文件本身就是最佳实践中的一个,只是它没有出现在安装过程中。 (2016+)Temporal Tables:官方称临时表,但是为了避免与常用的临时表混淆,本书使用由必应翻译中得到的另外一个名字“时态表”,它记录所有数据的更改及其日期,这将在7.5节中详细介绍。 (2016+)Stretch Database:把本地数据库的数据动态、安全地存储到Azure的SQL数据库中,由SQL Server透明地查询本地数据和连接数据库中的远程数据。它适用于冷热数据的归档。由于目前Linux版本并不支持这些,同时该功能需要使用Azure环境,这并不适合入门,所以本书不介绍它。 (2016+)Always Encrypted:简称AE,中文常见名为始终加密。它启用后,只有具有加密密钥的应用程序才能访问数据库中的加密敏感数据,密钥绝不会传给SQL Server。 (2016+)Dynamic Data Masking:简称DDM,中文常见名为动态数据屏蔽。使用它后,不具有UNMASK权限的用户只能看到经过屏蔽处理的数据。 (2016+)Row-Level Security:简称RLS,中文常见名为行级安全性。它可以在数据库引擎层面上限制数据访问,用户只能看到与其相关的数据行。 (2017+)可恢复的联机索引重建(Resumable Online Index Rebuild):可以在发生故障停止处继续恢复重建索引,避免重新执行。它类似于暂停功能,对于大型索引的维护有很大帮助。 (2017+)改进高端服务器上小型数据库的备份性能:使得备份更具有智能化。 (2017+)图形处理:随着数据分析越来越普及和深入应用,在数据库中可以通过熟悉的语言来对大量图形进行处理,但这部分超出了本书范围。 数据库性能(含故障侦测) 性能及故障侦测将在性能篇进行深入探讨,SQL Server的每一次新版本发布,都必然带来性能上的大幅度提升。在过去,要想知道某个时间段执行了什么SQL语句,导致了什么性能问题,往往只能从大量的监控数据中获取,工作量很大,有时候甚至不可获取(比如宕机或者文件损坏等),而从SQL Server 2016开始提供的查询存储功能能够很好地减缓这种现象。同时SQL Server 2017出现的智能优化功能也可以协助那些没有高水平DBA的企业减少性能影响。 作者挑选了几个比较有特色的功能,进行一定的演示和介绍。 (2016+)查询存储(Query Store):用于存储查询文本、对应的执行计划和性能指标,如耗时最长、占用CPU或内存最多的SQL。详见12.2节。 (2014+)In-Memory OLTP:从SQL Server 2014开始引入并在后续版本中不断改进和增强。它对OLTP负载有大幅度的性能提升。详见第16章。 (2017+)新一代的查询处理器:可对工作负载的运行时状态进行优化,也称自适应查询处理。过去,我们通常是在事后进行性能分析,这个过程就丢失了大量有价值的信息,新一代查询处理器可以针对运行时进行优化,更贴近“理想化”优化。详见性能篇介绍。 (2017+)自动数据库优化:由SQL Server自己对潜在的性能问题进行深入研究,提出建议方案并自动解决已标识的问题。详见性能篇介绍。 等),而从SQL Server 2016开始提供的查询存储功能能够很好地减缓这种现象。同时SQL Server 2017出现的智能优化功能也可以协助那些没有高水平DBA的企业减少性能影响。 高可用 在现代社会中,核心系统、大型系统几乎无一例外都使用了某些高可用技术。高可用的目的主要是使系统尽可能长地在线并提供服务。作为微软主推的高可用技术,AlwaysON从SQL Server 2012出现开始,它不断地强化和完善,非常值得学习。 (2017+)AlwaysON全部数据库支持跨数据库事务。(2017+)支持无群集、最小副本提交和Windows-Linux跨操作系统迁移。 由于本书的主题是SQL Server On Linux,且不打算深入研究AlwaysON这一足以单独成书的技术,所以本书把篇幅留在Linux上搭建AlwaysON的演示,对于后续的进阶读者可以参见官方文档或作者博客。 大数据 (2016+)PolyBase查询引擎:用于将SQL Server和Hadoop或Azure Blob的外部数据进行集成,它可导入导出及查询。这超出本书范围。 除了PolyBase之外,SQL Server集成服务(简称SSIS)强化了大数据的数据采集,借助Power BI进行数据分析和展示。这对SQL Server参与大数据的系统搭建带来了不少的便利。 2.2 SQL Server Integration Services 这部分不在本书讨论范围,读者可用必应搜索“SQL Server Integration Services”进行深入阅读。 (2016+)支持AlwaysON可用性组。 (2016+)支持Always Encrypted。 (2016+)支持Hadoop文件系统(HDFS)。 (2017+)新增Scale Out功能。 2.3 机器学习 原为SQL Server R服务,从2017开始,它兼容Python,并更名为SQL Server机器学习服务。可以使用“机器学习服务”(数据库内)在SQL Server中运行R或者Python脚本,或者使用“机器学习服务器”(独立)来部署和使用不需要SQL Server的R及Python模型。这些不属于本书范畴,感兴趣的读者可以访问官方资料,使用必应搜索“What is SQL Server Machine Learning Services?” 虽然本书没有提及,但是这个服务将会是以后的重点服务,建议读者多多重视。 2.4 兼容Linux平台 SQL Server可以运行在Linux和Windows平台,并且大部分功能是一致的,除了一些与平台相关的功能会有所差异,作者相信随着时间的推移它们将逐步兼容。由于SQL Server On Linux正是本书的主要内容,所以这里暂时不展开。 2.5 其他 除了上面4大类之外,Linux上的SQL Server和Windows平台上的是相同的数据库引擎,绝大部分功能是一样的。同时SQL Server On Linux不仅支持Linux还支持Docker。 之所以说大部分功能是一样的,因为也有不支持或暂未支持的功能,截至2017年10月,SQL Server还有不少需要逐步添加的功能,详细清单可见官网资料,使用必应搜索“Linux 上的SQL Server概述”的概述中的“版本和支持功能”。 03 SQL Server On Linux新玩法 在构思本书的时候,作者思考首先它应该是一本工具书,值得随时翻阅,否则就意味着它过时,没有价值了;其次它应该是一本介绍系统知识的书(本书更多是以DBA的角度来编写),不成体系的知识很难掌握。 关于如何使用SQL Server On Linux,需要根据实际需求而定,但是抛开具体行业需要使用不同的功能之外,我们可以考虑针对以下的需求使用某些功能。 性能:使用In-Memory OLTP可极大地提高常规OLTP操作的性能,并对相对静态的数据使用Columnstore技术,Columnstore特别适合对数据仓库进行高效查询。同时可借助Automatic Plan correction和Adaptive Query Processing对数据库性能进行更好的优化提升。还可以借助AlwaysON技术对“读操作”进行更加智能的负载均衡。 HA/DR:SQL Server 2017提供AlwaysOn和Read-Scale这两种不同的可用性组架构。在Linux环境中,前者使用Linux群集的Pacemaker实现高可用、灾难恢复和读负载均衡。而Read-Scale实际上是提供只读副本来分摊读操作的压力,可以不需要群集管理器,所以它特别适用于混合操作系统(Windows-Linux)环境。注意它并没有高可用功能。 安全:对数据库进行TDE(透明数据加密)以保护数据库的安全,然后借助Always Encrypted功能实现全链路加密,还可以按实际所需的安全级别搭配使用RLS、DDM等加密功能。需要重点提醒的是,安全是技术问题也是管理问题,没有任何一个技术可以完全地杜绝安全风险。 运维:运维问题的重点在于使系统可用,除了一些高可用技术之外,还需要考虑历史数据、备份文件的容灾能力,另外对大型系统的日常维护也是重点之一,除了过去SQL Server提供的常规功能之外,还可以考虑使用以下3个功能使运维工作更加高效。 使用Stretch Database把历史数据存储到Azure上,使得最高性能的资源能专门服务于活动数据。 使用可恢复的联机索引重建(Resumable Online Index Rebuild)功能,改进大型索引的重建操作。 借助Azure,把数据库直接备份到Azure中,减少存储成本和文件损坏的风险。 大数据/AI:运行在Linux上的SQL Server内置对Python和R的支持,搭配图形处理(从SQL Server 2017开始出现),利用Azure上丰富的人工智能、机器学习还有HDInsight功能,以PowerBI作为数据展示,可以很好地完成大部分的大数据甚至AI工作。在未来的几年内,作者认为微软将会在这个领域投入大量精力,使SQL Server不再仅仅是一个传统的数据库管理系统。 04 本书结构 这里大概介绍一下本书的结构,本书目标是在实用的前提下,使其不仅能作为入门书籍,还能作为参考书,随时翻阅,所以在串联各种知识点的前提下,也尽量兼顾每章的相对独立。 简单来说,由于SQL Server在Windows上运行了三四十年,而在Linux上只运行了一年多,加上Linux本身只是一个“内核”。考虑到即使作为一个简单的服务器都需要进行较多的配置,所以SQL Server在Linux上需要进行的配置会比较多,而且很多界面操作到了Linux上后被简化甚至取消了。但总体来说,这并不会造成非常大的影响。 《SQL Server On Linux运维实战》 作者:黄钊吉, 熊章立 SQL Server凤凰涅槃,浴火重生; 跨平台,Linux和Windows平台均适用; 从入门到精通,突出运维监控、性能调优; 融入作者10年工作经历,系统、实用、经常翻阅的工具书。 - END -
来源 | 异步专访 | 审校 张爽 2017年9月《奔跑吧 Linux内核》一书出版后得到了广大Linux从业人员和爱好者(特别是从事Linux相关产品开发的工程师)的好评,也有不少高校采用该书作为研究生的Linux内核课程的参考书目。《奔跑吧 Linux内核》以实际工程中的问题为导向来分析Linux内核,很多读者认为它不太适合Linux初学者。因此,作者重新编写了一本适合Linux初学者学习Linux内核的入门教程。 2018年,中兴事件让芯片技术和操作系统变得火热起来,越来越多的人关注操作系统等基础学科。特别是Linux内核开源项目,已经成为操作系统研究和使用的典范。很多读者反映在看完《鸟哥的Linux私房菜》一书后已经能够熟练使用Linux系统,但是对Linux内核以及更深层次的技术问题仍一头雾水。《奔跑吧 Linux内核 入门篇》希望能帮助已经熟悉Linux系统使用的读者深入学习Linux内核。 今天我们有幸邀请到了《奔跑吧Linux内核 入门篇》作者笨叔叔,一起来看下他的所思所想。 Q :异步社区:可以介绍一下自己吗?目前正在做哪些事情? 笨叔叔:大家好,我是笨叔叔,我现在在上海紫竹一家小芯片公司做FAE,FAE就是客户支持。我自己从大学毕业到现在工作已经有15个年头了。我基本上是从第一份工作到现在的工作,都是和Linux相关的工作岗位。我的第一份工作是客户支持,当时Intel的xscale移动处理器很热门,我们那个时候就是做xscale处理器的开发板。在这之后,我做过一段时间的研发,现在又回到客户支持的老本行。 Q:异步社区: 恭喜您《奔跑吧Linux内核》出版1年多实现了销售与口碑双丰收,这本书出版后带给您最大的变化是什么?又是什么初衷开始创作《奔跑吧 Linux内核 入门篇》这本书,两次写书心态有什么变化吗? 笨叔叔:首先要感谢异步社区这个平台,让我可以实现自己的一个小心愿。写第一本《奔跑吧Linux内核》的初衷是想把自己多年的工作经验和总结用文字的方式记录下来。因为工作的关系,因为我是FAE嘛,常常需要面对客户的“蹂躏”。通常客户会给你一些刁钻的问题,而这些问题, FAE工作人员的通常做法是把它转发后端的研发同事来回答,而我喜欢自己研究代码,自己解决,当然不是所有的问题都能一个人解决。但是与研发同事的讨论会让自己学到很多东西。 另外,我自己有记笔记的习惯,是手写的笔记,我会把一些思考的问题和思路记录下来,这么多年来,我记录了两大本。《奔跑吧Linux内核》这本书通过奔跑卷和思考题的方式把我多年来遇到的问题、思考和总结都分享出来了,所以我感到很开心,因为这本书体现了一个FAE应有的独立思考和坚韧的品质。 《奔跑吧Linux内核》出版后得到了很多Linux工程师的喜欢,这令我感到很欣慰。但是有不少小伙伴纷纷给我留言,说这本书起点有点高,很多内容看不懂。另外也有大学老师反映书太厚,不适合作为大学本科教材,希望我可以出一本难度低一点、薄一点的书。《奔跑吧 Linux内核 入门篇》融入了很多老师给我的建议,特别是南昌大学的陈悦老师、大连理工的吴国伟老师,以及国防科大的余杰老师。还有一点就是,国内学Linux的小伙伴中有相当的一部分都学习了Linux运维相关的知识,但是从Linux运维到Linux专家之间还有一个巨大的鸿沟。希望读者在阅读完《鸟哥的Linux私房菜》之后,可以通过阅读《奔跑吧 Linux内核 入门篇》进入Linux内核的世界里,从而提升自己对Linux的理解,也为自己后面的职业发展增加实力。 第一次写《奔跑吧Linux内核》的时候,完全没有想到要出版,只是为了把自己东西用电子档案的方式记录下来。后来写的差不多了,才联系上异步社区,所以要非常感谢异步社区这个平台。第二次写书,也就是这本《奔跑吧 Linux内核 入门篇》,就是带着任务来的,反而有点忐忑不安,生怕辜负了读者和老师们的期望,也衷心希望各位读者朋友可以毫不留情地给我批评和建议,以便后续修改再版的时候可以做到更好。 Q:异步社区:《奔跑吧 Linux内核 入门篇》您最想将这本书推荐给谁看?怎么看? 笨叔叔:《奔跑吧 Linux内核 入门篇》最适合已经会安装Linux系统的读者,比如通过《鸟哥的Linux私房菜》这本书学会了安装和配置常用的Linux工具和软件服务。但如果把Linux当作产品开发平台和服务器运维平台,是远远不够的,因为我们知道国内的大公司,比如BAT,都有很强大的内核团队在维护着他们的服务器。因此,我们需要了解Linux内核的方方面面,入门篇这本书最适合Linux运维的小伙伴继续深入学习Linux系统和内核的入门教程。 另外,入门篇也适合高等院校操作系统课程的参考教材,这本书配套了70多个动手实验和将近500页的教学使用的PPT课件,以及全套的实验环境和参考代码。这本书出来之后,已经被多家高校选作操作系统课程的参考教材,比如大连理工大学、上海交通大学、南昌大学等。 同时这本书也适合各大企业作为新员工的培训教材,在出版之初,已经有多家国内的公司的研发部门经理表示采用这本书作为新员工培训教材。 自中兴事件后,国家对芯片和操作系统都非常重视。去年工信部组织了国产Linux相关的厂商进行了操作系统自主可控的资格考试,里面的考题与入门篇的实验题目相类似,所以这本书也非常适合作为Linux相关从业人员进修和考试的参考书籍。 Q:异步社区:我们关注到您也在创办自己的视频课程,写书与录制视频课程哪个挑战更大? 笨叔叔:视频课程,算是一个意外的事情。当时《奔跑吧Linux内核》出版后,不少读者纷纷留言表示对书中的内容理解起来比较困难,希望我可以出视频课程,这样方便阅读和理解书上的内容。基于这个原因,我开始尝试录制配套视频课程。视频课程和书中内容配套的,后来根据读者的需求,不断增加新的内容,比如Linux内核代码解读和导读、Vim 8工具的使用、git工具的使用,以及Kdump+crash挑战死机黑屏专题等。 Q:异步社区:国内外众多的公司和行业都采用Linux作为首选的操作系统,学习Linux操作系统的人员也越来越多。Linux 内核开发是一个让人听起来就觉得很了不起的工作,成为Linux 内核开发领域的程序员,最大的挑战是什么?职业发展路径是怎样的? 笨叔叔:没错,现在Linux系统是操作系统的绝对霸主。除了传统的服务器领域和嵌入式领域,我们可以看到越来越多的产业都在用Linux,包括工业4.0、IoT、人工智能、物联网等。可以说Linux才是操作系统的第一,不仅是装机量第一,而且参与开发的人数和公司数量也是第一。Linux的产业生态会带来很多的职位需求,Linux内核开发在这些职位当中是最有含金量的,薪水最高,发展前景也是最好的。 最新的Linux内核代码量已经远远超过了2000万行,庞大的代码量给Linux内核的学习带来了前所未有的挑战。有挑战,意味着机遇。有时我们需要问一下自己,如果没有不断挑战的能力,我们凭什么要求老板给高薪?或者说仅仅会安装Linux系统和配置一些服务,老板为什么要给我们高薪?所以,我觉得Linux内核对学习者来说充满了挑战和机遇。在中国制造2025、人工智能、物联网等发展的大趋势下,少不了Linux,大家一起加油奔跑吧! Q:异步社区:你觉得工作中最重要的软技能是什么?为什么? 笨叔叔:软技能这个词,我是最有感触了,我现在公司的第一个老板就经常教导我们要在公司里build 自己的soft skill,在这里我要特别感谢他。这里说的soft skill包含很多,比如怎么在一个team里建立自己的leadership、怎么和自己的老板建立信任、怎么在客户和其他team里体现自己的能力,等等。在我们IT工程师的思维里,常常以技术为主导,以技术能力来评价一个人,而忽略软技能。公司是由很多人建立的群体,技术能力本身很重要,但并不是唯一的。所以,我的建议是,程序员不要以技术能力为一切来看待问题,还需要关注技术以外的一些东西。 Q:异步社区:Linux程序员的自我修养,需要哪些硬核本领? 笨叔叔:Linux涉及的东西很多,比如体系结构、C语言编程、操作系统、编译原理、汇编语言、外设芯片总线(如USB、PCIe)等。我们需要学习东西很多很多,大家加油吧! Q:异步社区:弃 Windows 而拥抱 Linux 之后,有人预测2019年可能会是Linux年?您怎么看待这个预测? 笨叔叔:在我看来,早已经是Linux年了。Linux系统除了在PC领域被Windows打得“溃不成军”,在其他任何领域都绝对是老大,比如服务器、超级计算机、手机、嵌入式、IoT等。在操作系统领域,很难有其他的OS可以超越Linux。我觉得有两个原因,一是Linux的生态是完善的,支持的硬件是最多的,比如很多硬件厂商出来一些新东西,最先要支持的操作系统就是Linux;二是Linux的开发人员是最多的,也是最活跃的社区,有人气、有众多大公司的支持、有资金投入,这是其他任何一个社区都无法比拟的。 Q:异步社区:Linus Torvalds 于内核邮件列表(LKML)中正式宣布推出 Linux 5.0 rc1 版本,宣告Linux 进入 5.0 时代,对于Linux内核程序员有什么新的挑战?您觉得优势是什么? 笨叔叔:现在Linux内核的大版本升级已经不是因为有一些重大的特性,而是因为子版本号比较大了,所以Linux创始人Linus希望使用一个大版本号。 Linux 5.0的出现,对于所有Linux内核开发人员的最大挑战是,Linux内核代码更新速度太快,比如平均2个月一个新版本。隔几个版本之后,我们会发现有不少代码发生了变化。Linux内核是采用社区开发的方式,全球有200多家顶尖IT公司和1000多名优秀的程序员参与其中,大家可以想象一下,一个人要学会1000多人的智慧结晶,当然是挑战重重。 有资金投入,这是其他任何一个社区都无法比拟的。 Q:异步社区:异步社区:有没有写下一本书的打算?可以“剧透”一下吗? 笨叔叔:因为Linux 5.0出来了,因此打算把《奔跑吧Linux内核》更新到最新的Linux 5.0,会增加很多新特性。这些特性一部分是在Linux 4.x期间增加的特性,比如HMM等;另一部分是原来就在Linux内核里,只是《奔跑吧 Linux内核》没有讲到,比如IOMMU、VFIO、hugepage、cgroup、kdump死机等。我打算根据广大读者提的建议做比较大的改动,主要的改动是增加背景知识的部分,减少书中的代码量,把代码关键部分展现出来。另外还会增加思考题,这部分主要是从工作中提炼,还有一部分是读者提出来的疑问。 Q:异步社区:对您工作和生活帮助最大的三本书?一定要推荐的? 笨叔叔:计算机方面的图书,人民邮电出版社和异步社区里有很多经典的图书,我在这里就不一一推荐了,“计算机好图书哪里找,上异步社区”! 我想推荐两本我在过年期间看的书,是和计算机无关的书,我们这些程序员有时候可以换换脑子,这样工作会更有效率。一本是国内私募大佬但斌的书《时间的玫瑰》,这本书给我感触最大的一句话是:“巴菲特之所以伟大,不在于他在75岁的时候拥有了450亿的财富,而在于他年轻的时候想明白了许多事情,然后用一生的岁月来坚守”。对Linux的热爱,也值得我们用一生的岁月去坚守。 还有一本书是李驰的《投资是一场长途旅行》,李驰对生活和投资的理念很值得学习。书中有一句话让我印象深刻:“如何拍摄到角马渡河的壮观场面?等待。如何拍摄到海豚围猎沙丁鱼的奇观?等待。如何执到牛耳?还是等待,而且市场中通常是用99%的时间换来1%时间的惊人上涨”。这句话用在我们的人生中也是一样的,人生中99%的时间都是平淡的,但是我们一直坚持,总有一天会实现自己的小梦想。 笨叔叔著作 《奔跑吧 Linux内核 入门篇》作者:张天飞 扫描二维码,一键购买 原理+基础,从调试Linux内核到动手编写一个简单的内核模块,真正从零开始学习Linux内核。 实验+案例,70余个创新实验贯穿全书,与你分享业内一线项目经验。 课件+视频,教学资源丰富,视频讲解透彻,与你共享精品在线配套资源。 涵盖当前Linux社区中新的开发工具和社区运作方式,反映Linux内核社区新发展。 本书是一本介绍Linux内核实践的入门书,基于Linux 4.0内核,重点讲解Linux内核的理论和实验。本书分为12章,包括Linux系统入门、Linux内核基础知识、内核编译和调试、内核模块、简单的字符设备驱动、系统调用、内存管理、进程管理、同步管理、中断管理、调试和性能优化,以及如何参与开源社区等内容。此外,本书还介绍了Linux内核社区常用的开发工具和理论,如Vim 8和git工具等。书中包括70多个实验,帮助读者深入理解Linux内核。 《奔跑吧 Linux内核 入门篇》作者:张天飞 扫描二维码,一键购买 基于Linux 4.x内核、ARM体系架构,以实际问题为导向,重点介绍Linux内核中基本常用的内存管理、进程管理、并发与同步、中断管理等模块。 Greg Kroah-Hartman、陈文智等众多业内专家审阅并推荐! 本书内容基于Linux 4.x内核,主要选取了Linux内核中比较基本和常用的内存管理、进程管理、并发与同步,以及中断管理这4个内核模块进行讲述。全书共分为6章,依次介绍了ARM体系结构、Linux内存管理、进程调度管理、并发与同步、中断管理、内核调试技巧等内容。本书的每节内容都是一个Linux内核的话题或者技术点,读者可以根据每小节前的问题进行思考,进而围绕问题进行内核源代码的分析。 - END - 异步图书 聊聊图书背后的故事
点击此处添加图片说明文字 有这么一个故事,一个程序员去相亲,当女方问他的职业时,他说自己是一个底层架构工程师,女方听到“底层”两个字,很不屑地说:“底层啊,那你什么时候能升到中高层?”男方听后不知该如何接话。在程序员的世界里,Linux内核、底层其实是非常“高端”的内容,普通程序员需要在这个领域里积累多年,才能修炼到从事“底层”工作的层次。 Linux内核是当前操作系统领域的绝对霸主,同时也是开源软件中一颗璀璨的明星。国内外众多的公司和行业都采用Linux作为首选的操作系统,学习Linux操作系统的人员也越来越多。Linux 内核开发是一个让人听起来就觉得很了不起的工作,Linux 内核开发领域的程序员与其他领域的程序员相比是少之又少,更别提一些优秀的教程和书籍了。 《奔跑吧 Linux内核 入门篇》一书从 Linux 发行版、开发工具、调试工具入手,讲述了如何快速搭建内核开发环境、如何正确地编写和运行 Linux 内核模块,以及内核开发中的一些基础知识。本书有助于读者在短时间内理解内核开发的全貌,从而具备内核开发的能力。本书中实验+案例,70余个创新实验贯穿全书,与你分享业内一线项目经验。 点击此处添加图片说明文字 《奔跑吧 Linux内核 入门篇》 作者:张天飞 01 为什么要学Linux系统 Linux系统已经被广泛应用在人们的日常用品中,如手机、智能家居、汽车电子、可穿戴设备等,只不过很多人并不知道其使用的电子产品里面运行的是Linux系统。我们来看一下Linux基金会在2017年发布的一组数据。 90%的公有云应用在使用Linux系统。 62%的嵌入式市场在使用Linux系统。 99%的超级计算机在使用Linux系统。 82%的手机操作系统在使用Linux系统。 可能读者还不知道,全球100万个顶级域名中超过90%都在使用Linux;全球大部分的股票交易市场都是基于Linux系统来部署的,包括纽交所、纳斯达克等;全球知名的淘宝网、亚马逊网、易趣网、沃尔玛等电子商务平台都在使用Linux。 这足以证明Linux系统是个人电脑操作系统之外的绝对霸主。参与Linux内核开发的开发人员和公司也是最多、最活跃的,截至2017年有超过1600个开发人员和200家公司参与Linux内核的开发。 02 如何学Linux内核 Linux内核采用C语言编写,因此熟悉C语言是学习Linux内核的基础。读者可以重温C语言课程,然后阅读一些经典的C语言著作,如《C专家编程》《C陷阱和缺陷》和《C与指针》等。 对于刚刚接触Linux的读者,可以尝试在自己的电脑中安装一个Linux发行版,如优麒麟Linux 18.04,并尝试使用Linux作为操作系统。另外,建议读者熟悉一些常用的命令,熟悉如何使用Vim和git等工具,尝试去编译和更换优麒麟Linux的内核核心。 然后,开始在Linux机器上做一些编程和调试的练习,如使用QEMU+GDB+Eclipse来单步调试内核,熟悉GDB的使用等。 接下来,从一个简单的设备驱动程序开始。选择一个简单的字符设备驱动,如触摸屏驱动等。从编写和调试设备驱动到深入Linux内核的一些核心API的实现。 对Linux驱动有深刻的理解之后,就可以研究Linux内核的一些核心API的实现,如malloc()和中断线程化等。 学习Linux内核的过程是枯燥的,但是又那么吸引人,它的魅力只有你深入后才能体会到。Linux内核是全球顶级的程序员编写的,你每看一行代码,就好像和全球顶级的高手交流和过招,这种体验是在大学和其他项目上无法得到的。 因此,对于Linux爱好者来说,不要仅停留在会安装Linux和配置服务的层面,还要深入学习Linux内核。 03 本书特色 循序渐进地讲述Linux内核入门知识。 Linux内核庞大而复杂,任何一本厚厚的Linux内核书都可能会让人看得昏昏欲睡。因此,对于初学者来说,Linux内核的入门需要循序渐进,一步一个脚印。初学者可以从如何编译Linux内核开始入门,学习如何调试Linux内核,动手编写一个简单的内核模块,逐步深入Linux内核的核心模块中。 为了降低读者的学习难度,本书不会分析Linux内核的源代码,要深入理解Linux内核源代码的实现,可以参考《奔跑吧 Linux内核》。 突出动手实验。 对于初学者,理解操作系统最好的办法之一就是动手实验。因此,本书在每章中都设置了几个经典的实验,读者可以在学习基础知识后通过实验来加深理解。本书所有的实验都可以在优麒麟Linux 18.04系统中完成。 反映Linux内核社区新发展。 除了介绍Linux内核的基本理论之外,本书还介绍了当前Linux社区中新的开发工具和社区运作方式,比如如何使用Vim 8阅读Linux内核代码、如何使用git工具进行社区开发、如何参与社区开发等。 结合QEMU调试环境讲述,并给出大量内核调试技巧。 在学习Linux内核时,大多数人都希望有一个功能全面且好用的图形化界面来单步调试内核。本书会介绍一种单步调试内核的方法,即Eclipse+QEMU+GDB。另外,本书提供首个采用“-O0”编译和调试Linux内核的实验,可以解决调试时出现的光标乱跳和<optimized out>等问题。本书也会介绍实际工程中很实用的内核调试技巧,例如ftrace、systemtap、内存检测、死锁检测、动态打印技术等,这些都可以在QEMU+ ARM Linux的模拟环境下做实验。 配备丰富的电子教案和视频资源。 本书会在出版之后陆续提供配套的电子教案,并录制相应的配套教学视频,请关注异步社区官网和微信公众号。 04 Linux内核实验入门 实验1:在虚拟机中安装优麒麟Linux 18.04系统 1.实验目的 通过本实验熟悉Linux系统的安装过程。首先,要在虚拟机上安装优麒麟18.04版本的Linux。掌握了安装方法之后,读者可以在真实的物理机器上安装Linux。 2.实验步骤 1)从优麒麟官方网站上下载优麒麟18.04的安装程序。 2)到VMware官网下载VMware Workstation Player。这个工具对于个人用户是免费的,对于商业用户是收费的,如图1.1所示。 点击此处添加图片说明文字 图1.1 免费安装VMware Workstation Player 3)打开VMware Player。在软件的主界面中选择“Create a New Virtual Machine”。 4)在New Virutal Machine Wizard界面中,选择“Installer disc image file(iso)”单选按钮,单击Browse按钮,选择刚才下载的安装程序,如图1.2所示。然后,单击“Next” 按钮。 点击此处添加图片说明文字 图1.2 选择下载的安装介质 5)在弹出的窗口中输入即将要安装的Linux的用户名和密码,如图1.3所示。 点击此处添加图片说明文字 图1.3 输入用户名和密码 6)设置虚拟机的磁盘空间,尽可能设置得大一点。虚拟机的磁盘空间是动态分配的,如这里设置了200GB,但并不会马上在主机上分配200GB的磁盘空间,如图1.4所示。 点击此处添加图片说明文字 图1.4 设置磁盘空间 7)可以在Customize Hardware选项里重新对一些硬件进行配置,如把内存设置得大一点。完成VMware Player的设置之后,就会马上进入虚拟机。 8)在虚拟机中会自动执行安装程序,如图1.5所示。安装完成之后,自动重启并显示新安装系统的登录界面,如图1.5和1.6所示。 点击此处添加图片说明文字 图1.6 配置硬件 点击此处添加图片说明文字 图1.7 Vmware Workstation 14 Player登录界面(1) 点击此处添加图片说明文字 图1.8 Vmware Workstation 14 Player登录界面(2) 实验2:给优麒麟Linux系统更换“心脏” 1.实验目的 1)学会如何给Linux系统更换最新版本的Linux内核。 2)学习如何编译和安装Linux内核。 2.实验步骤 在编译Linux内核之前,需要安装如下软件包。 点击此处添加图片说明文字 到Linux内核的官方网站中下载最新的版本,比如写作本书时最新并且稳定的内核版本是Linux 4.16.3,其界面如图1.9所示。Linux内核的版本号分成3部分,第一个数字表示主版本号,第二个数字表示次版本号,第三个数字表示修正版本号。 点击此处添加图片说明文字 图1.9 Linux内核 可以通过如下命令对下载的xz压缩包进行解压: 点击此处添加图片说明文字 解压完成之后,可以通过make menuconfig来进行内核配置,如图1.10所示。 点击此处添加图片说明文字 图1.10 内核配置 除了手工配置Linux内核的选项之外,还可以直接复制优麒麟Linux系统中自带的配置文件 点击此处添加图片说明文字 开始编译内核,其中-jn中的“n”表示使用多少个CPU核心来并行编译内核。 点击此处添加图片说明文字 为了查看系统中有多少个CPU核心,可以通过如下命令实现。 点击此处添加图片说明文字 processor这一项等于7,说明系统有8个CPU核心,因为是从0开始计数的,所以刚才那个make -jn的命令就可以写成make -j8了。 编译内核是一个漫长的过程,可能需要几十分钟时间,这取决于电脑的运算速度和配置的内核选项。 通过make编译完成之后,下一步需要编译和安装内核的模块。 点击此处添加图片说明文字 最后一步就是把编译好的内核镜像安装到优麒麟Linux系统中。 点击此处添加图片说明文字 完成之后就可以重启电脑,登录最新的系统了。 点击此处添加图片说明文字 《奔跑吧 Linux内核 入门篇》 作者:张天飞原理+基础,从调试Linux内核到动手编写一个简单的内核模块,真正从零开始学习Linux内核。 实验+案例,70余个创新实验贯穿全书,与你分享业内一线项目经验。 课件+视频,教学资源丰富,视频讲解透彻,与你共享精品在线配套资源。 涵盖当前Linux社区中新的开发工具和社区运作方式,反映Linux内核社区新发展。 本书是一本介绍Linux内核实践的入门书,基于Linux 4.0内核,重点讲解Linux内核的理论和实验。本书分为12章,包括Linux系统入门、Linux内核基础知识、内核编译和调试、内核模块、简单的字符设备驱动、系统调用、内存管理、进程管理、同步管理、中断管理、调试和性能优化,以及如何参与开源社区等内容。此外,本书还介绍了Linux内核社区常用的开发工具和理论,如Vim 8和git工具等。书中包括70多个实验,帮助读者深入理解Linux内核。 - END - 异步图书 聊聊图书背后的故事
作为程序员,要学习很多重要的主题。算法,数据结构,编程语言,数不胜数。在我们开始编程之前,先了解一下现状。 Go现在正趋势化,Python是2018年最流行的语言之一,30亿个设备运行Java(显然是90年代以来)。但是当你不知道它的用途时,很难选择一种语言。 今天的文章是关于学校老师没有教授的工具和技能,当你获得第一份工作时会产生巨大的变化。无论您最终成为Web开发人员还是数据科学家,您都可以应用这些内容。当然,文章最后小编会奉献一份开学季经典书单。 Git Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。无论您是哪种开发人员或使用何种语言,您几乎每天都会使用它。 Git是源控制管理器或简称SCM。换句话说,它允许您使用不同版本的代码。 Git提供的工具可以让同一项目中的许多人一起工作,减少协作痛苦。 如果你自己做一个项目,那么使用Git是个好主意,原因有很多。显而易见的是,您可以免费将代码存储在云中。许多公司提供免费的公共存储库,例如Github,Gitlab和Bitbucket。但是如果你在一个团队中工作,那么你迟早会使用Git,所以最好先学习它。 沟通能力 一种被低估的软技能就是沟通。我们的开发人员如此专注于工作的技术方面,我们常常忘记要实现伟大的事情,我们必须与其他人合作。 在谈论沟通时,有许多要点需要改进。我想对开发人员来说,最重要的一个是如何正确描述问题。你最终会向某人寻求帮助,并且在获得实际帮助时,你需要首先描述什么是错的。 你的同事可能和你一样忙,也许他们的头脑中有很多事情要发生。不要向人们提出类似炸弹的问题,而是在寻求帮助之前给出背景信息。 让我来证明: 不要这样做 嘿$coworker,当我运行$ command时,$service没有按预期工作,你能帮我个忙吗? INSTEAD,做这个 嘿 $同事,怎么了?我需要一些建议。由于$ reason,我现在正在使用$ service。它应该做$行为来实现$ goal但是它正在做$wrong_behavior。我阅读了文档,但我找不到问题。既然你对这个话题比较熟悉,那么当你有空时,你可以帮我一把吗?咖啡包在我身上。 同事并不总是熟悉您正在使用的主题。通常情况下,正在处理与您的具体问题无关的事情。通过友好并在提出问题之前提供上下文,您会发现对话运行得更顺畅。你也可以更快地解决你的问题。 为了改善这一点,请在遇到问题时与自己交谈。尝试尽可能多地描述手头的情况。不知不觉中,当你将来与别人交谈时,你也会这样做。 写作能力 编写代码很容易。如果您的代码不能正常工作,机器会告诉您。为人写作是真正的挑战。 当你开始努力发现写作是你工作的一个重要部分时,不需要很长时间,我认为和编程一样重要。您需要它来记录代码中的更改,向同事发送电子邮件,定义技术要求,甚至使用注释描述代码的工作方式。 写作是关于将你的思想和情感转化为文字。当你写一些东西时,你需要考虑你正在使用的主题,读者和频道。 如果你正在与一位开发人员交谈,那么提高技术水平是可以的。当您解释系统如何对营销团队起作用时,回调和API等词语可能没有任何意义。您会发现,在发送消息时,您的说法通常比您说的更重要。 这也扩展到了口头交流,但写作要困难得多,因为当你为大量观众写作而不是一对一的对话时,你只有一次机会正确发送信息。如果有人一开始没有明白你的意思,他们就没有机会在同一时刻问你。 在编写代码文档和文章(如本文)时,这一点尤其重要。尽可能清楚地了解与您合作的观众,这一点非常重要。 为了提高你的写作技巧,我的建议是尽可能多地写下你认识和喜爱的东西,并阅读很多东西。例如,每天总是花些时间阅读新技术。你不仅可以提高你的写作水平,还可以学到很多新东西。 这是一篇关于这个主题的精彩文章。 总结 开发人员通常认为他们的工作是关于计算机的,而且这是错误的。开发人员的工作是关于人,计算机只是我们的工具。您创建的解决方案可以让人们的生活更轻松,更好,这需要大量的同理心。 如果你问我作为初级开发人员学习最重要的技能,我会说你应该学习如何在一个小组中工作。本文中的所有技能都有助于实现这一目标。 您可能会在几年内改变您的专业领域。您可能会放弃管理职位的编程,但您将与人合作直到您死亡。作为团队成员,雇主比成为摇滚明星开发者更受欢迎。 你第一次开始工作时希望有什么技能? 本文来源于:asya f,转载请与与原作者联系。 技能书单 向下滑动预览本期书单 1 软技能 软技能 代码之外的生存指南 Git版本控制管理(第2版) Git学习指南 2 职业素养 代码整洁之道 程序员的职业素养 重构 改善代码既有的设计 编程珠玑(第2版·修订版) 代码整洁之道 3.一个语言一本经典书 C Primer Plus 第6版 中文版 C++Primer Plus(第6版)中文版 Python神经网络编程 CSS世界 数据结构 python语言描述 深度学习 Python编程快速上手让繁琐工作自动化 Python核心编程第3版 Linux就该这么学 SQL入门经典(第5版) 4 畅销新书 Python编程无师自通专业程序员的养成 算法详解卷1 算法基础 奔跑吧Linux内核 入门篇 软技能 01 《软技能:代码之外的生存指南》 作者:【美】John Z. Sonmez(约翰 Z. 森梅兹) 扫描二维码,一键购买 这是一本真正从“人”(而非技术也非管理)的角度关注软件开发人员自身发展的书。书中论述的内容既涉及生活习惯,又包括思维方式,凸显技术中“人”的因素,全面讲解软件行业从业人员所需知道的所有“软技能”。 本书聚焦于软件开发人员生活的方方面面,从揭秘面试的流程到精耕细作出一份杀手级简历,从创建大受欢迎的博客到打造你,从提高自己工作效率到与如何与“拖延症”做斗争,甚到包括如何投资不动产,如何关注自己的健康。 本书共分为职业篇、自我营销篇、学习篇、生产力篇、理财篇、健身篇、精神篇等七篇,概括了软件行业从业人员所需的“软技能”。通过阅读本书,软件工程人员、编程人员和其他技术人员能够积极思考自己的职业生涯,丰富自己的生活,让自己更接近成功。 02 《Git版本控制管理(第2版)》 作者:【美】Jon Loeliger , Matthew McCullough 扫描二维码,一键购买 Git是一 款免费、开源的分布式版本控制系统,**早由LinilusTorvalds创建,用于管理Linux内核开发,现已成为分布式版本控制的主流工具。 《Git版本控制管理(第 2版)》是学习掌握Git的**佳教程,总共分为21章,其内容涵盖了如何在多种真实开发环境中使用Git;洞察Git的常用案例、初始任务和基本功能;如何在集中和分布式版本控制中使用Git;使用Git管理合并、冲突、补丁和差异;获得诸如重新定义变基(rebasing)、钩子(hook)以及处理子模块(子项目)等的高 级技巧;Git如何与SVN版本库交互(包括SVN向Git的转换);通过GitHub导航、使用开源项目,并对开源项目做贡献。 《Git版本控制管理(第 2版)》适合需要进行版本控制的开发团队成员阅读,对Git感兴趣的开发人员也可以从中获益。 03 《Git学习指南》 作者:【德】René Preißel(普莱贝尔), Bjørn Stachmann(斯拉赫曼) 扫描二维码,一键购买 Git是一 款免费、开源的分布式版本控制系统,也是当今流行的版本控制系统之一,在众多的项目开发中普遍使用,得到程序员和工程师的欢迎和喜爱。 本书是一本面向专业开发 者的图书。全书内容分为26章,从基础概念讲起,陆续向读者介绍了有关Git的各种操作和使用技巧,不仅将提交、版本库、分支、合并等命令讲解到位,还介绍了工作流、基于分支的开发、二分法排错、发行版交付、项目的拆分与合并、项目的迁移等内容。 本书适合从事项目开发的专业人士阅读,想要学习Git的读者也可以选用。 职业素养 01 《代码整洁之道:程序员的职业素养》 作者:【美】Robert C. Martin(罗伯特 C. 马丁) 扫描二维码,一键购买 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更高台阶。 02 《重构 改善既有代码的设计》 作者:马丁·福勒(Martin Fowler) 扫描二维码,一键购买 重构,一言以蔽之,就是在不改变外部行为的前提下,有条不紊地改善代码。多年前,正是本书原版的出版,使重构终于从编程高手们的小圈子走出,成为众多普通程序员日常开发工作中不可或缺的一部分。本书也因此成为与《设计模式》齐名的经典著作,被译为中、德、俄、日等众多语言,在世界范围内畅销不衰。 本书凝聚了软件开发社区专家多年摸索而获得的宝贵经验,拥有不因时光流逝而磨灭的价值。今天,无论是重构本身,业界对重构的理解,还是开发工具对重构的支持力度,都与本书出版时不可同日而语,但书中所蕴涵的意味和精华,依然值得反复咀嚼,而且往往能够常读常新。 03 《编程珠玑(第2版•修订版)》 作者:[美] 科里•奥尔索夫(Cory Althoff) 扫描二维码,一键购买 《编程珠玑(第 2版·修订版)》是计算机科学方面的经典名著。书的内容围绕程序设计人员面对的一系列实际问题展开。作者JonBentley以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员实际编程生涯中到关重要的。本书的特色是通过一些精心设计的有趣而又颇具指导意义的程序,对实用程序设计技巧及基本设计原则进行了透彻而睿智的描述,为复杂的编程问题提供了清晰而完备的解决思路。《编程珠玑(第 2版·修订版)》对各个层次的程序员都具有很高的阅读价值。 04 《代码整洁之道》 作者:【美】Robert C. Martin 扫描二维码,一键购买 《代码整洁之道》提出一种观念:代码质量与其整洁度成正比。干净的代码,既在质量上较为可靠,也为后期维护、升级奠定了良好基础。作为编程领域的佼佼者,《代码整洁之道》作者给出了一系列行之有效的整洁代码操作实践。这些实践在《代码整洁之道》中体现为一条条规则(或称“启示”),并辅以来自现实项目的正、反两面的范例。只要遵循这些规则,就能编写出干净的代码,从而有效提升代码质量。 《代码整洁之道》阅读对象为一切有志于改善代码质量的程序员及技术经理。书中介绍的规则均来自作者多年的实践经验,涵盖从命名到重构的多个编程方面,虽为一“家”之言,然诚有可资借鉴的价值。 一种语言一本经典 01 《C Primer Plus 第6版 中文版》 作者:[美]史蒂芬·普拉达(Stephen Prata) 扫描二维码,一键购买 畅销30余年的C语言编程入门教程;近百万程序员的C语言编程启蒙教程;技术大牛案头常备的工具书;针对C11标准库更新;蔡学镛 孟岩 高博倾力推荐。 本书是一本经过仔细测试、精心设计的完整C语言教程,它涵盖了C语言编程中的核心内容。作为计算机科学的经典著作,讲解了包含结构化代码和自顶向下设计在内的程序设计原则。 02 《C++ Primer Plus(第6版)中文版》 作者:【美】Stephen Prata 扫描二维码,一键购买 一本经久不衰的C++畅销经典教程;首本支持C++11新标准的程序设计图书。它被誉为“开发人员学习C++的必备教程,没有之一”! 本书可以说是一本面向从未学习过C语言甚至是从未学习过编程的人的入门书籍,它的首章从基础内容讲起,先介绍了传统编程的规则,后面才着重讲解有关面向对象——C++的精髓之一——的有关内容。整个书的结构安排较为合理,难度爬升较慢。 03 《Python神经网络编程》 作者:[英] 塔里克·拉希德(Tariq Rashid) 扫描二维码,一键购买 本书用轻松的笔触,一步一步揭示了神经网络的数学思想,并介绍如何使用Python编程语言开发神经网络。本书将带领您进行一场妙趣横生却又有条不紊的旅行——从一个非常简单的想法开始,逐步理解神经网络的工作机制。您无需任何超出中学范围的数学知识,并且本书还给出易于理解的微积分简介。 本书为美亚五星畅销书,备受关注。基于Python3.5,全彩印刷,如果只选一本神经网络图书,他是首选。 本书从前端开发人员的需求出发,以“流”为线索,从结构、内容到美化装饰等方面,全面且深入地讲解前端开发人员必须了解和掌握的大量的CSS知识 点。同时,作者结合多年的从业经验,通过大量的实战案例,详尽解析CSS的相关知识与常见问题。作者还为本书开发了专门的配套网站,进行实例展示、问题答疑。 本书是打破能力上升瓶颈之作。前端开发行业潜心近10年一直研究看似简单的CSS的人可谓是凤毛麟角,作者从2009年开始写原创技术文章,现在其博客已经成为国内访问量巨大的个人前端博客之一,可以说众多前端初学者是看着作者的博客成长的。 04 《CSS世界》 作者:张鑫旭 扫描二维码,一键购买 本书从前端开发人员的需求出发,以“流”为线索,从结构、内容到美化装饰等方面,全面且深入地讲解前端开发人员必须了解和掌握的大量的CSS知识点。同时,作者结合多年的从业经验,通过大量的实战案例,详尽解析CSS的相关知识与常见问题。作者还为本书开发了专门的配套网站,进行实例展示、问题答疑。 本书是打破能力上升瓶颈之作。前端开发行业潜心近10年一直研究看似简单的CSS的人可谓是凤毛麟角,作者从2009年开始写原创技术文章,现在其博客已经成为国内访问量巨大的个人前端博客之一,可以说众多前端初学者是看着作者的博客成长的。 05 《数据结构 Python语言描述》 作者:[美] Kenneth A. Lambert 兰伯特等 扫描二维码,一键购买 不管你是程序设计爱好者、计算机专业的学生还是一位专业程序员,本书都是你通过Python编程语言学习面向对象设计和数据结构的不错的入门教程。通过清晰的示例、按部就班的讲解以及众多实用的练习,本书教你通过Python理解并使用数据结构。 06 《深度学习》 作者:【美】Ian Goodfellow(伊恩·古德费洛) 扫描二维码,一键购买 AI圣经!深度学习领域奠基性的经典畅销书!长期位居美亚AI和机器学习类图书榜首!所有数据科学家和机器学习从业者的必读图书!特斯拉CEO埃隆·马斯克等国内外众多专家推荐! 深度学习是机器学习的一个分支,它能够使计算机通过层次概念来学习经验和理解世界。 07 《Python编程快速上手——让繁琐工作自动化》 作者:【美】Al Sweigart(斯维加特) 扫描二维码,一键购买 美亚畅销Python 3编程图书,帮助你通过编程快速实现工作自动化 。在本书中,你将学习利用Python 编程,在几分钟内完成手工需要几小时的工作,而事先却无需具备编程经验。一旦掌握了编程的基础知识,你就可以毫不费力地创建Python 程序,完成高效的自动化工作。 08 《Python核心编程 第3版》 作者:[美]卫斯理 春(Wesley Chun) 扫描二维码,一键购买。 《Python核心编程(第3版)》是经典畅销图书《Python核心编程(第二版)》的全新升级版本,为中级Python开发人员提供实践方法,涵盖大量实用的代码案例,每章末尾的习题有助于巩固所学知识,Python开发人员的案头常备。 本书源自日均阅读量近万次火爆的线上同名课程,口碑与影响力俱佳,旨在打造简单易学且实用性强的轻量级Linux入门教程。 本书基于红帽RHEL系统编写,且内容通用于CentOS、Fedora等系统。本书共分为20章,内容涵盖了部署虚拟环境、安装Linux系统;常用的Linux命令;与文件读写操作有关的技术;使用Vim编辑器编写和修改配置文件;用户身份与文件权限的设置;硬盘设备分区、格式化以及挂载等操作;使用PXE+Kickstart无人值守安装服务;使用LNMP架构部署动态网站环境等。此外,本书还深度点评了红帽RHCSA、RHCE、RHCA认证,方便读者备考。 09 《Linux就该这么学》 作者:刘遄 扫描二维码,一键购买 本书源自日均阅读量近万次火爆的线上同名课程,口碑与影响力俱佳,旨在打造简单易学且实用性强的轻量级Linux入门教程。 本书基于红帽RHEL系统编写,且内容通用于CentOS、Fedora等系统。本书共分为20章,内容涵盖了部署虚拟环境、安装Linux系统;常用的Linux命令;与文件读写操作有关的技术;使用Vim编辑器编写和修改配置文件;用户身份与文件权限的设置;硬盘设备分区、格式化以及挂载等操作;使用PXE+Kickstart无人值守安装服务;使用LNMP架构部署动态网站环境等。此外,本书还深度点评了红帽RHCSA、RHCE、RHCA认证,方便读者备考。 10 《SQL入门经典(第5版)》 作者:【美】Ryan Stephens, Ron Plew, Arie D.Jones 扫描二维码,一键购买 《SQL入门经典(第5版)》的作者都是数据库教学与应用的专家,有着丰富的经验。《SQL入门经典(第5版)》详细介绍了SQL语言的基本语法、基本概念,说明了各种SQL实现与ANSI标准之间的差别。书中包含了大量的范例,直观地说明了如何使用SQL对数据进行处理。每章后面还有针对性很强的测验与练习,能够帮助读者更好地理解和掌握学习的内容。在后的附录里还有关于安装MySQL的详细介绍、书中用到的关键SQL语句、测验和练习的答案。 《SQL入门经典(第5版)》的内容层次清晰,针对性强,非常适合初学者作为入门教材。 畅销新书 01 《Python编程无师自通》 作者:[美] 科里•奥尔索夫(Cory Althoff) 扫描二维码,一键购买 在美国亚马逊,有一本书的影响力超高的Python入门书,Kindle版本在美国亚马逊网站的计算机软件、软件开发分类中排行均为第一,超越了众多实力派Python书,众多五星好评。也许你有所耳闻,这本书就是《Python编程无师自通——专业程序员的养成》。 02 《算法详解(卷1)——算法基础》 作者:[美] 科里•奥尔索夫(Cory Althoff) 异步图书后台回复:“算法详解”获取视频 扫描二维码,一键购买 这本书在美亚评分4.7,在作者的在线算法课程的基础之上编写的,是四卷本系列的第1卷。这个在线课程2012年起就定期更新,它建立在作者在斯坦福大学教授多年的本科课程的基础之上。也许你有所耳闻,这本书就是《算法详解(卷1)——算法基础》。如果你更喜欢听和看,可以在YouTobe上搜索这本书的主题课程,免费观看。 《算法详解(卷1)——算法基础》作者蒂姆·拉夫加登(Tim Roughgarden)是斯坦福大学计算机科学系的教授,也是该校管理科学和工程系的客座教授,他从2004年开始教授和研究算法。本书是他的《算法详解》四部曲的第一卷。 这本书详细讲解算法基础,展现算法本质 ,是一本囊括基本算法知识的详解指南。集斯坦福大学教授多年教学经验,深入浅出,通俗易懂。 03 《Spring源码深度解析(第2版)》 作者:郝佳 扫描二维码,一键购买 畅销长销Spring图书全新升级版本 基于Spring 5.x编写庖丁解牛式讲解Spring工作原理 。 本书从核心实现、企业应用和Spring Boot这3个方面,由浅入深、由易到难地对Spring源码展开了系统的讲解,包括Spring 整体架构和环境搭建、容器的基本实现、默认标签的解析、自定义标签的解析、bean的加载、容器的功能扩展、AOP、数据库连接JDBC、整合MyBatis、事务、SpringMVC、远程服务、Spring消息、Spring Boot体系原理等内容。 04 《持续交付2.0:业务引领的DevOps精要》 作者:乔梁 扫描二维码,一键购买 经典图书《持续交付》已出版8年,一直受到软件行业从业者的关注。书中的软件开发原则和实践也随着商业环境VUCA特性的明显增强而逐渐受到软件技术人员的认可。这本书得以迅速、优质地在中国出版与译者乔梁密不可分,圈内人都亲切的称乔梁为“乔帮主”。 乔梁是《持续交付》译者,持续交付领域专家,持续交付和DevOps理念在国内的首批实践者和布道者,被业界称为“国内持续交付第一人”。国内最早致力于通过敏捷开发与精益理论改善软件价值交付效率的实践者之一,精研各种软件工程方法论。 8年后乔梁带着他的全新著作《持续交付2.0:业务引领的DevOps精要》面向大众。这本书将《持续交付》一书的思想融会贯通,经过8年的管理实践,精心总结与提炼,提出“持续交付2.0双环模型”;作者独创性地将持续交付理论与当前的技术热点DevOps理念完美结合。 05 《SQL Server On Linux运维实战》 作者:黄钊吉, 熊章立 扫描二维码,一键购买 SQL Server凤凰涅槃,浴火重生; 跨平台,Linux和Windows平台均适用; 从入门到精通,突出运维监控、性能调优; 融入作者10年工作经历,系统、实用、经常翻阅的工具书。 通过阅读本书,你将会了解到如何使用基于Linux的SQL Server,如何更好地管理在Linux上的SQL Server及如何进行常规的SQL Server性能优化。 运行在Linux上的新版SQL Server,将其新特性及强大功能与Linux原生系统的优点进行结合,不仅在运维及性能上带来巨大的便利和提升,同时对大数据和数据挖掘领域的逐步兼容[如内置机器学习、图形处理、兼容HDFS(hadoop分布式文件系统)、Containers(容器)等特性],使得企业不需要从头开始搭建或者把现有环境迁移到“适合”大数据环境的其他关系型数据库中。 《奔跑吧 Linux内核 入门篇》 作者:张天飞 扫描二维码,一键购买 原理+基础,从调试Linux内核到动手编写一个简单的内核模块,真正从零开始学习Linux内核。 实验+案例,70余个创新实验贯穿全书,与你分享业内一线项目经验。 课件+视频,教学资源丰富,视频讲解透彻,与你共享精品在线配套资源。 涵盖当前Linux社区中新的开发工具和社区运作方式,反映Linux内核社区新发展。 本书是一本介绍Linux内核实践的入门书,基于Linux 4.0内核,重点讲解Linux内核的理论和实验。本书分为12章,包括Linux系统入门、Linux内核基础知识、内核编译和调试、内核模块、简单的字符设备驱动、系统调用、内存管理、进程管理、同步管理、中断管理、调试和性能优化,以及如何参与开源社区等内容。此外,本书还介绍了Linux内核社区常用的开发工具和理论,如Vim 8和git工具等。书中包括70多个实验,帮助读者深入理解Linux内核。 扫描二维码 当当购书满100减50 - END - 异步图书 聊聊图书背后的故事
每月小编都会盘点本月的异步新书,送出一本你最爱的异步图书。1月上市新书本次带来8本,涉及到的领域分别是Python、算法术、软件工程、持续交付、游戏开发、安全等,从最新的书了解最新的技术,异步新书让你更好地应对快速变化的科技世界。 《Python编程无师自通》 作者:[美] 科里•奥尔索夫(Cory Althoff) 扫描二维码,一键购买 在美国亚马逊,有一本书的影响力超高的Python入门书,Kindle版本在美国亚马逊网站的计算机软件、软件开发分类中排行均为第一,超越了众多实力派Python书,众多五星好评。也许你有所耳闻,这本书就是《Python编程无师自通——专业程序员的养成》。 《Python编程无师自通——专业程序员的养成》作者是一名自学成才的程序员,作为一名文科生他通过自学编程,掌握了编程技能并在eBay找到了一份软件工程师的工作。这本书是作者结合个人经验写作而成,旨在帮助读者从外行成长为一名专业的Python程序员。 《算法详解(卷1)——算法基础》 作者:[美] 蒂姆•拉夫加登(Tim Althoff) 异步图书后台回复:“算法详解”获取视频 扫描二维码,一键购买 这本书在美亚评分4.7,在作者的在线算法课程的基础之上编写的,是四卷本系列的第1卷。这个在线课程2012年起就定期更新,它建立在作者在斯坦福大学教授多年的本科课程的基础之上。也许你有所耳闻,这本书就是《算法详解(卷1)——算法基础》。如果你更喜欢听和看,可以在YouTobe上搜索这本书的主题课程,免费观看。 《算法详解(卷1)——算法基础》作者蒂姆·拉夫加登(Tim Roughgarden)是斯坦福大学计算机科学系的教授,也是该校管理科学和工程系的客座教授,他从2004年开始教授和研究算法。本书是他的《算法详解》四部曲的第一卷。 这本书详细讲解算法基础,展现算法本质 ,是一本囊括基本算法知识的详解指南。集斯坦福大学教授多年教学经验,深入浅出,通俗易懂。 《持续交付2.0:业务引领的DevOps精要》 作者:乔梁 扫描二维码,一键购买 经典图书《持续交付》已出版8年,一直受到软件行业从业者的关注。书中的软件开发原则和实践也随着商业环境VUCA特性的明显增强而逐渐受到软件技术人员的认可。这本书得以迅速、优质地在中国出版与译者乔梁密不可分,圈内人都亲切的称乔梁为“乔帮主”。 乔梁是《持续交付》译者,持续交付领域专家,持续交付和DevOps理念在国内的首批实践者和布道者,被业界称为“国内持续交付第一人”。国内最早致力于通过敏捷开发与精益理论改善软件价值交付效率的实践者之一,精研各种软件工程方法论。 8年后乔梁带着他的全新著作《持续交付2.0:业务引领的DevOps精要》面向大众。这本书将《持续交付》一书的思想融会贯通,经过8年的管理实践,精心总结与提炼,提出“持续交付2.0双环模型”;作者独创性地将持续交付理论与当前的技术热点DevOps理念完美结合。 同时《持续交付》一书作者Jez Humble为本书作序。腾讯副总裁曾宇、百度地图事业部总经理李莹、ThoughtWorks中国区总经理 张松滴滴高级技术总监路宁、百度工程效率部负责人李涛、阿里巴巴研发协同平台负责人叶渡等众多企业高管和技术专家联袂推荐。 《Spring源码深度解析(第2版)》 作者:郝佳 扫描二维码,一键购买 畅销长销Spring图书全新升级版本 基于Spring 5.x编写庖丁解牛式讲解Spring工作原理 。 本书从核心实现、企业应用和Spring Boot这3个方面,由浅入深、由易到难地对Spring源码展开了系统的讲解,包括Spring 整体架构和环境搭建、容器的基本实现、默认标签的解析、自定义标签的解析、bean的加载、容器的功能扩展、AOP、数据库连接JDBC、整合MyBatis、事务、SpringMVC、远程服务、Spring消息、Spring Boot体系原理等内容。 《RISC-V架构与嵌入式开发快速入门》 作者:胡振波 扫描二维码,一键购买 本书是一本介绍RISC-V架构嵌入式开发的入门书籍,以通俗的语言系统介绍了嵌入式开发的基础知识和RISC-V架构的内容,力求帮助读者快速掌握RISC-V架构的嵌入式开发技术。 本书共分为两部分。第一部分为第1~14章,基本涵盖了使用RISC-V架构进行嵌入式开发所需的所有关键知识。第二部分为附录部分,详细介绍了RISC-V指令集架构,辅以作者加入的背景知识解读和注解,以便于读者理解。 《Windows黑客编程技术详解》 作者:甘迪文 扫描二维码,一键购买 《Windows黑客编程技术详解》介绍的是黑客编程的基础技术,涉及用户层下的Windows编程和内核层下的Rootkit编程。本书分为用户篇和内核篇两部分,用户篇包括11章,配套49个示例程序源码;内核篇包括7章,配套28个示例程序源码。本书介绍的每个技术都有详细的实现原理,以及对应的示例代码(配套代码均支持32位和64位Windows 7、Windows 8.1及Windows 10系统),旨在帮助初学者建立起黑客编程技术的基础。 本书面向对计算机系统安全开发感兴趣,或者希望提升安全开发水平的读者,以及从事恶意代码分析研究的安全人员。 《DirectX 12 3D 游戏开发实战》 作者: [美] 弗兰克·D.卢娜(Frank D. Luna) 扫描二维码,一键购买 本书是畅销书作者的最新力作。该作者在3D开发领域拥有丰富的经验和积累,本书容纳了作者多年来的重要经验。书中通过三个部分来讲解如何使用DirectX12进行3D游戏的开发,从基础开始,由浅入深地引导读者进行学习,通过阅读本书,读者能够快速掌握这一工具。 《WebAssembly标准入门》 作者:柴树杉, 丁尔男 扫描二维码,一键购买 WebAssembly是一种新兴的网页虚拟机标准,它的设计目标包括高可移植性、高安全性、高效率(包括载入效率和运行效率)、尽可能小的程序体积。本书详尽介绍了WebAssembly程序在JavaScript环境下的使用方法、WebAssembly汇编语言和二进制格式,给出了大量简单易懂的示例,同时以C/C++和Go语言开发环境为例,介绍了如何使用其他高级语言开发WebAssembly模块。
1月20日凌晨,互联网销售平台拼多多遭遇了“优惠券Bug”:网站每一位注册用户可以通过微信渠道、网页端、QQ渠道等,领取面值为100元的优惠券,该优惠券适用该网站的商品,有效期为一年。随后,有网友曝出,用领取的优惠券可以充值话费、Q币。上午9点,网友发现拼多多已将相关优惠券全部下架,直至10点左右,该漏洞才被拼多多官方修复。并网传拼多多一夜损失近200亿元,一时引起广泛关注。而拼多多的这一“优惠券Bug”,更多的还是网站安全隐患问题,拼多多成功追回损失后,更重要的事情是代码的安全要重视起来。 近年来,全球大规模爆发勒索病毒和挖矿病毒,让沉寂许久的黑客技术,又重新回到了人们的视野中。Windows操作系统市场占有率高达90%以上,所以面对勒索病毒、挖矿病毒,Windows用户首当其冲。 今天介绍一本信息安全类的图书。 为了揭开病毒木马的神秘面纱,更好地服务于信息安全,《Windows黑客编程技术详解》总结并剖析了常见的Windows黑客编程技术,用通俗易懂的语言介绍了用户层下的Windows编程和内核层下的Rootkit编程。这本书理论技术与实战操作相辅相成,凸显“道与术”;庖丁解牛式剖析Windows用户层和内核层黑客技术原理 ;代码兼容性高,支持Windows 7到Windows 10全平台系统。 《Windows黑客编程技术详解》 作者:甘迪文 扫描二维码,一键购买 作者自述 信息安全行业是一个朝阳行业,国家、企业以及高校都予以高度重视。其中,Windows系统的市场占有率高达90%以上,因此Windows系统上的安全需求更多,安全攻防更激烈。 我从本科开始就对黑客技术感兴趣,通过自学,积累了许多这方面的开发技术,并逐渐有了自己的心得和感悟。到了研究生阶段,之前积累的知识帮助我快速而高效地完成了项目的安全开发工作,但是却发现周围仍有很多安全相关专业的同学仍陷于开发难的苦恼中,于是便萌生了写作本书的想法,希望通过分享自己积累的心得体会,让更多的初学者能少走些弯路。 古人云“知其然,知其所以然”。作为一个初学者,首先要做到的是“知其然”,即学会怎么去做;然后再去理解这样做的缘由,即“知其所以然”。本书着重于“知其然”阶段,编写一本能够让初学者看懂的技术科普书。 所以,本书在详细介绍每一种黑客技术时,均是按照下述7个模块进行写作的。 1.背景:介绍技术的应用场景。 2.函数介绍:给出技术实现所需的前提知识。 3.实现原理(过程):讲解技术实现的原理。 4.编码实现:给出技术实现的部分关键代码。 5.测试:对程序进行测试,给出测试方法和测试结果。 6.小结:对该技术点进行总结,指出难易点和注意事项。 7.安全小贴士:针对一些有攻击性的技术,给出检测或防御方法。 本书所包含的知识点循序渐进,语言平实,每个技术点条理清晰,主要有3个突出的特点。 1.技术点讲解详细。因为我是一边编著本书,一边重写程序,所以,能够在书中把实现步骤和注意事项一一指明。 2.知识点兼容性高。本书的技术以及对应的示例代码 (包括内核层下的Rootkit技术代码),均支持32位和64位的Windows 7、Windows 8.1和Windows 10操作系统。 3.注重实战。本书所介绍的技术知识都贴近实战技术,可以让读者直接感受到实战的魅力。 由于本书是基于每一个技术点去撰写的,章节独立性较高。所以,读者可以按顺序阅读,也可以选择自己感兴趣的章节跳读。对于每一章的阅读,建议依次按照背景、函数介绍、实现原理、编码实现、测试和总结的顺序进行阅读,这样才能更好地提高自己的安全开发水平。 本书组织结构 本书分为“用户篇”(第1~11章)与“内核篇”(第12~18章)两篇,总计18章。为了帮助读者更好地了解本书所讲的内容,下面列出了每章所讲的主要内容。 第1章,开发环境,主要介绍VS 2013开发环境的安装、工程项目的设置,以及关于Debug模式和Release模式的相关注意事项。 •第2章,基础技术,介绍了运行单一实例、DLL延迟加载和资源释放等内容。 •第3章,注入技术,介绍了全局钩子注入、远线程注入、突破SESSON 0隔离的远线程注入、APC注入等内容。 •第4章,启动技术,介绍了创建进程API、突破SESSON 0隔离创建用户进程、内存直接加载运行等知识。 •第5章,自启动技术,涵盖了注册表、快速启动目录、计划任务和系统服务等内容。 •第6章,提权技术,包含进程访问令牌权限提升、Bypass UAC等内容。 •第7章,隐藏技术,讲解了进程伪装、傀儡进程、进程隐藏、DLL劫持等知识。 •第8章,压缩技术,介绍了数据压缩API、ZLIB压缩库等知识。 •第9章,加密技术,介绍了Windows自带的加密库、Crypto++密码库等知识。 •第10章,传输技术,介绍了Socket通信、FTP通信、HTTP通信、HTTPS通信等知识。 •第11章,功能技术,讲解了进程遍历、文件遍历、桌面截屏、按键记录、远程CMD、U盘监控、文件监控、自删除等知识。 •第12章,开发环境,介绍了内容开发环境的配置、驱动程序开发与测试、驱动无源码调试、32位和64位驱动开发等知识。 •第13章,文件管理技术,介绍了文件管理中用到的内核API、IRP、NTFS解析等知识。 •第14章,注册表管理技术,讲解了注册表管理中用到的API、HIVE文件解析等知识。 •第15章,HOOK技术,介绍了SSDT HOOK、过滤驱动等知识。 •第16章,监控技术,讲解了进程创建监控、模块加载监控、注册表监控、对象监控、Minifilter文件监控、WFP网络监控等内容。 •第17章,反监控技术,与第16章相反,它介绍了反进程创建监控、反线程创建监控、反模块加载监控、反注册表监控、反对象监控、反Minifilter文件监控等内容。 •第18章,功能技术,介绍了过PatchGuard的驱动隐藏、过PatchGuard的进程隐藏、TDI网络通信、强制结束进程、文件保护、文件强删等知识。 · 附录,函数一览表,介绍了本书使用的函数以及相应的作用。 由于本书中的代码均使用C/C++来编写,因此掌握C/C++语言的概念可以更容易理解本书。如果不具备编程知识,也可继续学习并理解所有技术点的开发流程。对于书中的内核层开发部分,即使读者没有接触过内核开发,也可根据本书的内容一步步学习内核开发技术。 最后需要提醒大家的是: 根据国家有关法律规定,任何利用黑客技术攻击他人计算机的行为都属于违法行为。希望读者在阅读本书后一定不要使用本书介绍的技术对他人的计算机进行攻击,否则后果自负。 名家评论 本书详解了注入、启动、权限、HOOK、监控等技术,从技术知识体系上对其细节(如实现原理、编码实战、案例测试等)进行了剖析,降低了学习难度,因此非常适合Windows安全、二进制安全、逆向工程等相关领域的爱好者、从业者群体阅读。大家可以通过本书对自己的Windows安全知识体系进行补充与巩固。值得阅读! —— 孔韬循(K0r4dji),丁牛科技有限公司首席安全官,破晓安全团队创始人 "黑客"当今已经不再是神秘的代言词,而是攻防技术的象征——如何利用简短的代码实现意想不到的结果,各类病毒木马是如何利用Windows的相关API技术实现传播、隐藏、启动、复制等操作——黑客已经把Windows的机制运用得淋漓尽致,这本《Windows黑客编程技术详解》带领读者从用户态到内核态一步一步地了解黑客如何巧妙地利用各类Windows的机制达成自己的目的,以及从攻与防出发的角度了解黑客是怎样的一个“神秘群体”!值得推荐! ——朱利军,四叶草信息技术有限公司首席安全官 阐述Windows下黑客编程常用技术的书籍有很多,但或涉猎不全,或代码健壮性及兼容性较差,而能将以上技术按照难易梯度依次汇集在一本书内,并且所有示例代码均是多系统全平台兼容的,我个人知道的仅此一本。本书内部穿插的那些作者苦心而作的若干精巧例子值得我们每个人细细品味,同时这本书对于软件安全领域的工作人员也不失为一本案头必备的代码、案例参考工具书。 ——任晓珲,十五派信息安全教育创始人,《黑客免杀攻防》作者 在当前网络安全逐渐娱乐化的时代,本书就像一股清流,让我想起10余年前和小伙伴们一起彻夜研究各种植入、逃逸技术的一幕幕。本书教会你制作网络空间的利刃的方法,对于技术流的小伙伴们是一门必修的功课,不过切记要把它用在正道。 ——王珩,赛宁网安副总经理,信息安全漏洞门户(vulhub.org.cn)创始人 目录一览 第1篇 用户篇 第1章 开发环境 3 1.1 环境安装 3 1.2 工程项目设置 5 1.3 关于Debug模式和Release模式的小提示 7 第2章 基础技术 10 2.1 运行单一实例 10 2.2 DLL延迟加载 13 2.3 资源释放 15 第3章 注入技术 22 3.1 全局钩子注入 22 3.2 远线程注入 27 3.3 突破SESSION 0隔离的远线程注入 34 3.4 APC注入 37 第4章 启动技术 42 4.1 创建进程API 42 4.2 突破SESSION 0隔离创建用户进程 48 4.3 内存直接加载运行 55 第5章 自启动技术 60 5.1 注册表 60 5.2 快速启动目录 66 5.3 计划任务 69 5.4 系统服务 75 第6章 提权技术 84 6.1 进程访问令牌权限提升 84 6.2 Bypass UAC 89 第7章 隐藏技术 97 7.1 进程伪装 97 7.2 傀儡进程 102 7.3 进程隐藏 106 7.4 DLL劫持 112 第8章 压缩技术 119 8.1 数据压缩API 119 8.2 ZLIB压缩库 126 第9章 加密技术 133 9.1 Windows自带的加密库 133 9.2 Crypto++密码库 152 第10章 传输技术 168 10.1 Socket通信 168 10.2 FTP通信 181 10.3 HTTP通信 190 10.4 HTTPS通信 202 第11章 功能技术 210 11.1 进程遍历 210 11.2 文件遍历 214 11.3 桌面截屏 219 11.4 按键记录 226 11.5 远程CMD 232 11.6 U盘监控 235 11.7 文件监控 241 11.8 自删除 245 第2篇 内核篇 第12章 开发环境 253 12.1 环境安装 253 12.2 驱动程序的开发与调试 254 12.3 驱动无源码调试 264 12.4 32位和64位驱动开发 268 第13章 文件管理技术 270 13.1 文件管理之内核API 270 13.2 文件管理之IRP 293 13.3 文件管理之NTFS解析 303 第14章 注册表管理技术 317 14.1 注册表管理之内核API 317 14.2 注册表管理之HIVE文件解析 329 第15章 HOOK技术 337 15.1 SSDT HOOK 337 15.2 过滤驱动 351 第16章 监控技术 357 16.1 进程创建监控 357 16.2 模块加载监控 363 16.3 注册表监控 369 16.4 对象监控 374 16.5 Minifilter文件监控 379 16.6 WFP网络监控 385 第17章 反监控技术 392 17.1 反进程创建监控 392 17.2 反线程创建监控 397 17.3 反模块加载监控 403 17.4 反注册表监控 407 17.5 反对象监控 411 17.6 反Minifilter文件监控 415 第18章 功能技术 421 18.1 过PatchGuard的驱动隐藏 421 18.2 过PatchGuard的进程隐藏 426 18.3 TDI网络通信 429 18.4 强制结束进程 437 18.5 文件保护 442 18.6 文件强删 444 附录 函数一览表 447 《Windows黑客编程技术详解》 作者:甘迪文 扫描二维码,一键购买 《Windows黑客编程技术详解》介绍的是黑客编程的基础技术,涉及用户层下的Windows编程和内核层下的Rootkit编程。本书分为用户篇和内核篇两部分,用户篇包括11章,配套49个示例程序源码;内核篇包括7章,配套28个示例程序源码。本书介绍的每个技术都有详细的实现原理,以及对应的示例代码(配套代码均支持32位和64位Windows 7、Windows 8.1及Windows 10系统),旨在帮助初学者建立起黑客编程技术的基础。 本书面向对计算机系统安全开发感兴趣,或者希望提升安全开发水平的读者,以及从事恶意代码分析研究的安全人员。 更多安全书单 《Wireshark数据包分析实战(第3版)》 作者:[美]克里斯 ▪ 桑德斯(Chris Sanders) 扫描二维码,一键购买 Wireshark是最流行的一款网络嗅探软件,本书在上一版的基础上针对Wireshark 2.0.5和IPv6进行了更新,并通过大量真实的案例对Wireshark的使用进行了详细讲解,旨在帮助读者理解Wireshark捕获的PCAP格式的数据包,以便对网络中的问题进行排错。 《Wireshark网络分析实战(第2版)》 作者:[印度]甘德拉·库马尔·纳纳 扫描二维码,一键购买 Wireshark大百科全书;巨细靡遗地讲解Wireshark操作细节;掌握Wireshark基本操作的唯一入门级图书;排除网络故障;性能调优的好帮手 每一位IT运维人员的必备利器。 本书包含了用Wireshark 2排除数通网络故障的实用秘诀。相较于之前的版本,Wireshark 2又增加了很多强大功能,获得了业界更广泛的关注。 本书扩充了上一版的主题,涵盖如何使用Wireshark监控TCP性能、网络安全、无线LAN以及云和虚拟系统,介绍了在单播/多播网络环境中如何借助Wireshark分析端到端的IPv4/IPv6连通性故障。读者将了解E-mail协议的正常运行机制,学会如何使用Wireshark来完成基本的故障分析和排除工作。利用Wireshark这款利器,读者可以解决企业网络中常用应用程序的故障。读者还将学习如何测量网络参数,如何检查并修复因网络参数引起的性能问题。
AI消除 bug ,彻底了实现了“bug-free″? 又一代码清库的惨案发生了,不过这次要背锅是 AI。 近日,美国最大点评网站 Yelp 的工程师训练的神经网络闯祸了。他们训练了一个用来消除 bug 的神经网络,万万没想到,该网络把所有代码都删除了,从根上彻底了实现“bug-free”......有点儿厉害。 Yep 团队在 APP 中向近期可能感到体验不畅的各位用户致歉,该团队还表示,他们将不得不进行回滚(Roll back),但随即话锋一转,他们说好的一面是,这说明 APP 中 100% 没 bug 了啊。 好吧,没跑了,这个锅还是工程师的。 神经网络算法的这一波操作,让人不禁想起郭德纲的一个相声段子,“我心善,见不得穷人,于是把自己目之所及的穷人全赶走了。”收到工程师的任务指令后,兴许 AI 发现一个个 debug 太不省心,心一横,干脆一键 all clear 算求。 这事要在国内互联网公司,搞这个大一个工程事故,九成要说杀一个工程师祭天,尽管 Yelp 最后的点睛自嘲蛮轻松的,但人前卖笑,谁知道代码清除后工程师是不是目瞪口呆或者心里在吐血呢......毕竟,要 Roll back。 Roll back 究竟意味着什么?它指的是程序或数据处理错误,将程序或数据恢复到上一次正确状态的行为。那 Roll back 工作量有多大呢?回滚对程序员意味着非常严重的失误,微博网友@互联网八卦民工评论说,Yelp 在真实环境训练自己的人工智能神经网络去删除 app 中的 bug,结果是人工智能把所有都东西都删了,这不是一个简单的 Roll back。 网友们更好奇的是 Yelp 的工程师训练了一个怎样的网络?拿何种样本训练的?损失函数是如何设计的?有人猜测,代码里面没有 bug,损失函数一直是零,BP 和优化器无用武之地,所以触发异常,把整段代码都视为 bug? 代码里面没有 bug 似乎不太可能,翻阅 Yelp 的版本更新历史记录,你会发现这简直是一部“除虫史诗”,你们感受一下: 本来是想让 AI 来帮忙 debug 的,现在工具反到成了阻碍。不知道是 debug 工具本身的黑箱问题,还是使用它的人没找到正确的“窍门”。至于这次 Yelp 工程事故报告还未有进一步的信息披露,但用神经网络算法 debug 应该有风险,部署需谨慎。 不过一款让工程师省时省力的 debug 工具显然是人人所期待的,AI科技大本营之前写过一篇《@程序员,终于可以放心写bug了!Facebook的debug神器你值得拥有》中提到,去年 9 月,Facebook 基于 AI 技术再次推出新款代码调试工具 SapFix,可针对特定的 bug 自动生成修复程序,然后将其提交给工程师,经确认之后,然后再部署到生产环境中。相比其一年前已投入大规模使用的智能自动化软件测试工具 Sapienz,SapFix 能够在没有 Sapienz 的情况下运行,主要用于修复 Sapienz 在生产前发现的程序 bug。 从发现 bug 到修复 bug,Facebook 有一套完整的流程:首先 Sapienz 以及 Facebook 的静态分析工具 Infer,会帮助定位代码中需要修补的点;一旦 Sapienz 和 Infer 精确定位与崩溃相关的特定代码部分之后,就会将该信息传递给 SapFix;最后,SapFix 会参考几种不同的策略,自动生成补丁。 根据 Facebook 的数据,Sapienz 报告的大约四分之三的错误都需要开发者来修复。自 Facebook 开始测试 SapFix 之后,该工具已经成功生成了被人类审核者接受并部署于生产的补丁。不过,目前 SapFix 总体上仍在开发阶段。 Facebook 都还只是在尝试阶段,Yelp 的工程师这次似乎对自家的 debug 工具太自信了,一键清库简直不能更酸爽,不知道他们这次有没有感受到来自深度学习的威力。 (*本文为 AI科技大本营原创文章,转载请联系微信 1092722531) 算法精品书单 《算法详解(卷1)——算法基础》 作者:[美] 科里•奥尔索夫(Cory Althoff) 异步图书后台回复:“算法详解”获取视频 扫描二维码,一键购买 这本书在美亚评分4.7,在作者倍受欢迎在线算法课程的基础之上编写的,是四卷本系列的第1卷。这个在线课程2012年起就定期更新,它建立在作者在斯坦福大学教授多年的本科课程的基础之上。也许你有所耳闻,这本书就是《算法详解(卷1)——算法基础》。如果你更喜欢听和看,可以在YouTobe上搜索这本书的主题课程,免费观看。 《算法详解(卷1)——算法基础》作者蒂姆·拉夫加登(Tim Roughgarden)是斯坦福大学计算机科学系的教授,也是该校管理科学和工程系的客座教授,他从2004年开始教授和研究算法。本书是他的《算法详解》四部曲的第一卷。 这本书详细讲解算法基础,展现算法本质 ,是一本囊括基本算法知识的详解指南。集斯坦福大学教授多年教学经验,深入浅出,通俗易懂。 趣学算法 作者:陈小玉 扫描二维码,一键购买 本书从算法之美娓娓道来,没有高深的原理,也没有枯燥的公式,通过趣味故事引出算法问题,包含50多个实例及完美图解,结合学生提问,分析算法本质,并给出代码实现的详细过程和运行结果。这本书适合入门,中学生以上学历,都适合入门。 编程珠玑(第2版·修订版) 作者:[美]乔恩·本特利(Jon Bentley) 扫描二维码,一键购买 历史上伟大的计算机科学著作之一 融深邃思想、实战技术与趣味轶事于一炉的奇书 带你真正领略计算机科学之美 多年以来,当程序员们推选出心爱的计算机图书时,《编程珠玑》总是位于前列。正如自然界里珍珠出自细沙对牡蛎的磨砺,计算机科学大师JonBentley以其独有的洞察力和创造力,从磨砺程序员的实际问题中凝结出一篇篇不朽的编程“珠玑”,成为世界计算机界名刊《ACM通讯》历史上受欢迎的专栏,结集为两部不朽的计算机科学经典名著,影响和激励着一代又一代程序员和计算机科学工作者。本书为首卷,主要讨论计算机科学中本质的问题:如何正确选择和高效地实现算法。 在书中,作者选取许多具有典型意义的复杂编程和算法问题,生动描绘了历史上众大师们在探索解决方案中发生的轶事、走过的弯路和不断精益求精的历程,引导读者像真正的程序员和软件工程师那样富于创新性地思考,并透彻阐述和总结了许多独特而精妙的设计原则、思考和解决问题的方法以及实用程序设计技巧。解决方案的代码均以C/C++语言编写,不仅有趣,而且有很大的实战示范意义。每章后所附习题极具挑战性和启发性,书末给出了简洁的解答。 更多算法书 扫描二维码,一键购买 畅享优惠
在过去10年中,持续交付思想已经从最前沿的想法变为业界公认的智慧。每个追求卓越的科技公司都希望能够随时随地发布,而无须工程师在晚上或周末进行部署。能够快速、频繁且安全地发布软件,并实现小批量交付,意味着我们可以快速获得对我们的想法的反馈。我们可以构建原型并使用真实用户对其进行测试,从而避免开发那些对用户没有任何价值的功能。反过来,这也意味着产品更好,客户更满意,员工更快乐。这些能力对需要这种工作方式的每个组织来说,都是非常关键的。 然而,获得这种能力并不是一件容易的事情。组织需要对软件系统架构进行不断演进,使其支持尽快且有效的测试,以及快速部署,同时,还需要培养快速试验的文化。文化因素对于成功实施持续交付和通过持续交付实现产品管理实践至关重要。 乔梁曾与中国的各类组织合作,帮助它们实施持续交付并实现其效益。《持续交付》作者Jez Humble曾说:“我想不出比乔梁更合适的人选,来写一本关于如何根据实际经验实现这些想法的书。希望《持续交付2.0》的每位读者都能在提高软件交付能力的不断尝试中取得圆满成功,并利用这种能力来构建更好的产品和服务,以及更快乐、更高效的团队”。 今天,作者对持续交付的理解和认识,相比8年前,在广度和深度方面都有了较大的提升。今天我们有幸采访了《持续交付2.0:业务引领的DevOps精要》作者乔梁,来看看他的所思所想。同时有什么话想对作者说? 乔梁老师 异步社区:经典图书《持续交付》已出版8年,这本书在中国出版,您功不可没,可以说说您与《持续交付》和《持续交付2.0》的缘分吗? 乔梁:说到我与“持续交付”的渊源,可以追溯到11年前我与Jez Humble一起工作的时候。Jez Humble是《持续交付》的作者之一。 当时我与他正在为最早的一款开源持续集成工具CruiseControl贡献代码,但我们发现,它无法满足企业级持续快速发布软件的管理诉求。因此我们就决定开发一款新的持续集成与持续发布管理工具——Cruise,现在已经更名为GoCD,http://github.com/gocd/gocd。 2010年,此产品已经迭代发布了多个版本,而Jez Humble也完成了《持续交付》的写作。该书中提及的原则与实践绝大部分都在我们自己的团队实施过。我在多次看过该书的初稿后,决定在第一时间将其引入中国。于是,该书英文版还没有出版,我就开始自己联系国内出版社引进它的简体中文版权。 在过去的8年中,我也一直从事与持续交付相关的咨询工作,而且涉及多种不同类型的软件企业。在此过程中,也积累了自己的心得与体会,并对该领域有了一定的新认识。因此,才有了《持续交付2.0》这本书。 异步社区: 《持续交付2.0:业务引领的DevOps精要》为什么为您的图书取这个名字?这本书是《持续交付》的延续吗?这本书您最想推荐给谁看? 乔梁:之所以称其为《持续交付2.0》,主要是因为它既站在“巨人”的臂膀上,对《持续交付》一书中所述的原则与实践进行了更加详细的解释,也提出了新的模型,即“持续交付双环模型”,对原有的框架体系进行了补充。对于那些希望提升持续交付2.0能力的软件企业来说,本书会使其更容易了解它的全貌,并在能力提升的过程中少走弯路。 它的副标题用“业务引领的DevOps精要”,主要是想提醒广大读者,无论什么样的方法与实践,都应该为业务价值负责,而不能与业务相脱离。任何问题的起点都是业务问题,而非技术问题。我们最终要解决的是业务价值问题,而非技术方案或软件交付问题。 异步社区:持续交付2.0的指导思想、工作理念和核心原则是什么?2016年DevOps在软件行业火了以后,很多人都在重读经典。是否可以结合您自己的理解,谈谈《持续交付2.0》这本书的内容可能对行业带来的改变? 乔梁:对于DevOps,目前行业内对其有很多种不同的定义,但其基石仍旧是持续交付能力。本书有很大篇幅讨论如何获得这样的能力,这也正是DevOps的精要部分。持续交付2.0是以精益思想为指导,以“识别并消除一切浪费”为工作理念,并坚持四项基本的工作原则,即“坚持少做”“持续分解”“坚持反馈”“持续改善”。我想这本书不会重要到对行业带来巨大的改变,但是正如我刚才提到的,我希望它能够让更多的企业少走一些弯路,以更少的资源投入得到持续交付能力的快速提升。 异步社区:我们了解到您曾先后就职于国内外知名移动设备公司和大型互联网公司,也担任了腾讯、搜狐畅游等多家互联网公司的高级管理顾问,每段工作经历带给您的收获分别是什么?可以具体说说吗? 乔梁:有一种声音说:“持续交付(换成‘敏捷’也成立)只适合于互联网软件企业,变化不快、质量要求高的传统软件企业并不需要。”这句好像是说,互联网软件质量要求不高一样。这通常是望文生义的结果,事情并不是这么简单,这一点很容易判断。事实上,“敏捷开发方法”“持续交付”这些原则、方法和实践都诞生于传统软件开发环境。 尽管不同公司的不同类型的软件产品在不同生命节点上,面临很多不同的挑战,但是持续交付的原则与很多实践都是适用的。当我在移动设备公司做手机操作系统的开发工作时,使用本书中讲述的多种实践方法,仍旧可以比传统开发方式更快交付高质量的软件需求。 当然,我们也不能忽略所在环境上下文的不同。例如,对直接面向消费者的互联网分发软件企业来说,由于其软件运行环境复杂,传统软件开发方法中通过全面测试保障软件质量的方式根本无法覆盖很多应用场景,只能通过强大的监控能力和软件配置的灵活性,在版本发布后在用户发现之前收集问题,并快速修复。 另外,不同公司有不同的文化、环境和发展背景。因此,很多所谓的“不适合”可能是希望将其作为一整套严密的方法体系在较大范围“齐步走”。如果是这种情况的话,持续交付的确是不适合“共同致富”的。 异步社区:您在书中曾说:“我认为思想对每个人对事物的认知和理解至关重要。但咨询经历告诉我,对事物的正确理解,并不能确保正确的思想和理念在现实中落地,也不能确保对企业有大的和直接的帮助。”可以具体的聊聊为什么这么说吗? 乔梁:这个问题可以算是上一个问题的延续。虽然在多年以前,我认为对“持续交付”有非常深入的理解,但那时我只是对“持续交付”本身有深入的理解而已,并不是对“它在企业中的落地”有很深入的理解。由人组成的企业是一个巨大的复杂系统,在这种环境中,两点之间的距离并不是直线最近,因此无法通过简单且相同的模式让其在企业内部落地生根。如果无法生根,就意味着无法成为组织的DNA,那么就很容易消逝。 异步社区:在创作《持续交付2.0:业务引领的DevOps精要》过程中遇到的最大困难是什么?您是如何平衡工作、写作和家庭的? 乔梁:最大的困难是如何更好地组织这本书的结构。因为它的内容涉及软件产品研发过程的很多方面,我自己希望在书中能够全面覆盖,但又怕过于分散。最后还是把其中关于“组织建设”的很多内容删掉了,只留下了组织文化中的重点部分(希望以后能够再将其补充完整。)在写作期间,也有大约5个月的“完全停滞期”,感觉无法动笔继续写下去,是家人和朋友的鼓励才让我完成了这本书的写作。我的夫人不但为我校稿,还提出了很多建议。 异步社区:现在,每当人们提起DevOps时,总会联想到微服务、Docker技术、Kubernetes服务编排、部署流水线等。团队应用“持续交付2.0”理念,在保障交付质量的前提下,既提高交付频率又减少人力投入吗?可以具体聊聊吗? 乔梁:2018年5月,我与Jez Humble在北京再次相聚时还讨论过相关问题。我们一致认为,与8年前相比,持续交付的理念已经被更广泛地接受,而工具技术的发展也令持续交付实践的门槛低了一些。但是,从组织、人员、架构的角度来看,还有较长的路要走。值得庆幸的是,“持续交付”本身并不是目标,而是手段。如果我们可以使用其他低成本的手段达成相同的目标,那也是非常不错的。通过很多企业的实施过程,我们也不难发现,它是一个波浪式的过程,即“增加投入——享受收益——再增加投入——再享受收益”的过程。 异步社区:您作为国内最早的持续交付实践和推动者之一,遇到的最大阻力是什么?同时最想感谢哪些人? 乔梁:我个人遇到的最大阻力吗?自己想学习的东西太多,总是感觉时间不够。这本书也让我重新认识了我自己。我自己也使用《持续交付2.0》中的工作原则,就是“坚持少做,持续分解,坚持反馈,持续改善”。我也是需要不断强化练习、不断提醒自己。我并不是一个我很聪明的人,我只想每天比昨天的我进步一点点就好了。不追求跨越,追求“复利”就好。 最想感谢的人,一是多年前在我面前打开大门,让我看到新的工作方式的那些朋友和同事;二是给我很多机会,让我参与到组织改进过程中的客户和朋友,让我有机会在不同类型的企业中,与聪明勤奋的人一起工作,收获不一样的经验,使我能够掌握更多“持续交付2.0的落地方式”。 异步社区:对您工作和生活帮助最大的三本书要推荐给大家的? 乔梁:与15年前的我相比,我现在每年的读书量应该是当年的数倍。当然,有些书读了也很快忘记了。我的感觉是,在人一生中的不同阶段,需要的书也是不同的。在我需要花大量时间写代码的那个年代,《解析极限编程》《重构》《代码整洁之道》对我的影响比较大。现在的工程师应该都能熟练掌握这些了吧。听说《重构(第2版)》(中文版)也要马上出版了,我也期待一下。 《重构2 》计划2019年3月出版 乔梁老师著作 《持续交付2.0:业务引领的DevOps精要》 作者:乔梁 扫描二维码,一键当当购买 扫描二维码,一键京东购买 持续交付2.0不只是关于软件的交付模型,而是从业务问题出发,关注业务假设验证速度的双环业务模型。只有从业务目标出发的持续交付实践才有强大的创造力和生命力! 书中指出,持续交付2.0双环模型高速运转的三个支柱分别是组织机制、软件架构和软件交付基础设施,同时给出了提升价值探索环以及快速验证环运转速度的多种可行方法。 本书还为我们呈现了在企业内部改善持续交付2.0能力所需遵循的基本原则,包括组织文化建设、软件系统架构、业务协作、配置管理、构建集成、自动化测试、发布与监控七大板块,并指出各领域实践关键点,以及多种可实操性方法。同时,通过3个完整的实践案例过程分析,说明每个企业或团队都必须从自己的业务目标出发,根据自己的实际情况,制定自己的改善路线。
如同两个月前,TIOBE 编程语言社区于官网预料的那般,2018 年的年度编程语言终将在一众老牌编程语言如 Java、C、C++、Python、Visual Basic .NET 中诞生。近日,TIOBE 排行榜官方正式宣布,时隔 8 年后: Python 再一次赢得了“年度编程语言”的称号! 意外吗?不意外! 惊讶吗?不惊讶! 合乎情理吗?还行! 毕竟在过去的一年中,Python 的流行度是其他一众编程语言无法比拟的。一方面,Python 在 TIOBE 榜单中三度(2018年9月、12月、2019年1月)超越了 C++,进入了排行榜的前三甲。不仅如此,它还在另一大知名的 IEEE Spectrum 编程语言榜单中,压住了 C++、C、Java、C#、PHP 等语言的势头,稳居第一。另一方面,根据 TIOBE 数据统计显示: 2018 年期间,Python 语言相比年初共计增长了 3.62% 的市场占有率,其次是 Visual Basic .NET(3.20%) 和 Java(2.69%)。 如今的 Python 已经成为应用范围较广的编程语言之一,无形之中它也打破了近 20 年来如铁一般的 Java、C 和 C ++ 的格局。对此,TIOBE 在发布本期编程语言排行榜时,如此评价道: Python 是当今高校中最常被教授的首选语言,它在统计领域排名第一、在 AI 编程中排名第一、在编写脚本时排名第一、在编写系统测试时排名第一。除此之外,Python 还在 Web 编程和科学计算领域处于领先地位。总之,Python 无处不在。 事实上,代表简单主义思想的 Python 凭借着易上手、可移植、可扩展、可嵌入以及拥有丰富的库等特性广受开发者的喜爱,但是一直以来,其版本的不兼容性也成为硬伤。不过值得注意的是,在明年的 2020 年,Python 2.7 即将停止支持,这意味着会有一大批 Python 项目在此之前将放弃对 Python 2.7 的支持,这其中就包括了著名的 pandas、Zulip、IPython、NumPy 等库,因此,开发者也需提前做好迁移准备。 本文来源 | CSDN(ID:CSDNNews),转载请向原作者授权。 《Python编程无师自通——专业程序员的养成》 作者:[美] 科里•奥尔索夫(Cory Althoff) 扫描二维码,一键购买 在美国亚马逊,有一本书的影响力超高的Python入门书,Kindle版本在美国亚马逊网站的计算机软件、软件开发分类中排行均为第一,超越了众多实力派Python书,众多五星好评。也许你有所耳闻,这本书就是《Python编程无师自通——专业程序员的养成》。 《Python编程无师自通——专业程序员的养成》作者是一名自学成才的程序员,作为一名文科生他通过自学编程,掌握了编程技能并在eBay找到了一份软件工程师的工作。这本书是作者结合个人经验写作而成,旨在帮助读者从外行成长为一名专业的Python程序员。 《算法详解(卷1)——算法基础》 作者:[美] 科里•奥尔索夫(Cory Althoff) 扫描二维码,一键购买 这本书在美亚评分4.7,在作者的在线算法课程的基础之上编写的,是四卷本系列的第1卷。这个在线课程2012年起就定期更新,它建立在作者在斯坦福大学教授多年的本科课程的基础之上。也许你有所耳闻,这本书就是《算法详解(卷1)——算法基础》。如果你更喜欢听和看,可以在YouTobe上搜索这本书的主题课程,免费观看。 《算法详解(卷1)——算法基础》作者蒂姆·拉夫加登(Tim Roughgarden)是斯坦福大学计算机科学系的教授,也是该校管理科学和工程系的客座教授,他从2004年开始教授和研究算法。本书是他的《算法详解》四部曲的第一卷。 这本书详细讲解算法基础,展现算法本质 ,是一本囊括基本算法知识的详解指南。集斯坦福大学教授多年教学经验,深入浅出,通俗易懂。 《持续交付2.0:业务引领的DevOps精要》 作者:乔梁 扫描二维码,一键购买 经典图书《持续交付》已出版8年,一直受到软件行业从业者的关注。书中的软件开发原则和实践也随着商业环境VUCA特性的明显增强而逐渐受到软件技术人员的认可。这本书得以迅速、优质地在中国出版与译者乔梁密不可分,圈内人都亲切的称乔梁为“乔帮主”。 乔梁是《持续交付》译者,持续交付领域专家,持续交付和DevOps理念在国内的首批实践者和布道者,被业界称为“国内持续交付第一人”。国内最早致力于通过敏捷开发与精益理论改善软件价值交付效率的实践者之一,精研各种软件工程方法论。 8年后乔梁带着他的全新著作《持续交付2.0:业务引领的DevOps精要》面向大众。这本书将《持续交付》一书的思想融会贯通,经过8年的管理实践,精心总结与提炼,提出“持续交付2.0双环模型”;作者独创性地将持续交付理论与当前的技术热点DevOps理念完美结合。 同时《持续交付》一书作者Jez Humble为本书作序。腾讯副总裁曾宇、百度地图事业部总经理李莹、ThoughtWorks中国区总经理 张松滴滴高级技术总监路宁、百度工程效率部负责人李涛、阿里巴巴研发协同平台负责人叶渡等众多企业高管和技术专家联袂推荐。 《Spring源码深度解析 第2版》 作者:郝佳 扫描二维码,一键购买 畅销长销Spring图书全新升级版本 基于Spring 5.x编写 庖丁解牛式讲解Spring工作原理 。 本书从核心实现、企业应用和Spring Boot这3个方面,由浅入深、由易到难地对Spring源码展开了系统的讲解,包括Spring 整体架构和环境搭建、容器的基本实现、默认标签的解析、自定义标签的解析、bean的加载、容器的功能扩展、AOP、数据库连接JDBC、整合MyBatis、事务、SpringMVC、远程服务、Spring消息、Spring Boot体系原理等内容。 《RISC-V架构与嵌入式开发快速入门》 作者:胡振波 扫描二维码,一键购买 本书是一本介绍RISC-V架构嵌入式开发的入门书籍,以通俗的语言系统介绍了嵌入式开发的基础知识和RISC-V架构的内容,力求帮助读者快速掌握RISC-V架构的嵌入式开发技术。 本书共分为两部分。第一部分为第1~14章,基本涵盖了使用RISC-V架构进行嵌入式开发所需的所有关键知识。第二部分为附录部分,详细介绍了RISC-V指令集架构,辅以作者加入的背景知识解读和注解,以便于读者理解。
《Python编程无师自通——专业程序员的养成》 [美] 科里•奥尔索夫(Cory Althoff) 著 从Python 3 中开始学习编程,并构建第一个程序;通过学习“面向对象的程序设计”并创建一个强大的Python程序来让读者掌握技能; 学习使用Git、Bash、正则表达式和数据库等工具,然后使用学习的新编程技能来构建一个网络爬虫;学习计算机科学的基本原理,包括计算机架构、数据结构、算法和网络编程;学习为项目编程:涵盖了软件开发过程、测试和最佳编码实践;了解如何完成团队合作,并获得编程工作。 《Spring源码深度解析(第2版)》 郝佳 著 本书从核心实现、企业应用和Spring Boot这3个方面,由浅入深、由易到难地对Spring源码展开了系统的讲解,包括Spring 整体架构和环境搭建、容器的基本实现、默认标签的解析、自定义标签的解析、bean的加载、容器的功能扩展、AOP、数据库连接JDBC、整合MyBatis、事务、SpringMVC、远程服务、Spring消息、Spring Boot体系原理等内容。 本书不仅介绍了使用Spring框架开发项目必须掌握的核心概念,还指导读者使用Spring框架编写企业级应用,并针对在编写代码的过程中如何优化代码、如何使得代码高效给出了切实可行的建议,从而帮助读者全面提升实战能力。 《IT运维之道(第2版)》 李鹏 著 本书共分为五篇(机遇篇、做事篇、处事篇、技能篇和深入篇),从不同的层面阐述了IT运维人员应掌握的方法及相关知识与技能。 本书深入浅出、化繁为简,将信息化服务中晦涩的IT标准规范、流程体系用浅显易懂的方式娓娓道来。“机遇篇”以2013年的一个实际案例为背景,帮助读者进行职业规划,引导从业人员在“软件开发”和“IT服务”之间做出正确的选择。“做事篇”针对IT服务做什么、怎么做、怎么做好等问题进行了阐述,帮助IT服务人员梳理了工作思路,明确了工作目标和方向。“处事篇”从内外兼修两方面阐述了如何赢得人心。“技能篇”系统地介绍了运维服务涉及的IT技术和技能。“高级篇”深入浅出地介绍了当今国内外先进的IT服务标准、架构、体系和方法。 《JavaScript函数式编程思想》 潘俊 著 本书主要介绍了函数式编程的基础理论、核心技术、典型特征和应用领域,以及它与面向对象编程的比较。本书既广泛介绍函数式编程的思想,也结合JavaScript的特点分析其应用和局限,注重从本质和内在逻辑的角度解释各个主题,并辅以相关的代码演示。对于函数式编程涉及的JavaScript语言本身的特性,以及与面向对象编程的比较,在书中也给予了重点讨论。 《RISC-V架构与嵌入式开发快速入门》 胡振波 著 本书的姊妹版《手把手教你设计CPU——RISC-V处理器篇》已经出版,提供了一个非常高效的超低功耗开源RISC-V处理器学习案例——蜂鸟E203,并对其进行了全方面剖析和讲解,解决了在CPU硬件设计方面中文资料欠缺的问题。 《算法详解(卷1)——算法基础》 Tim Roughgarden 著 算法详解系列图书共有4卷,本书是第一卷——基础算法。本书共有6章,主要介绍了4个主题,它们分别是渐进性分析和大O表示法、分冶算法和主方法、随机化算法以及排序和选择。附录A和附录B简单介绍了数据归纳法和离散概率的相关知识。本书的每一章均有小测验、章末习题和编程题,这为读者的自我检查以及进一步学习提供了较多的便利。
《Python深度学习》 [英] 尼格尔·刘易斯(N.D. Lewis) 著 本书是使用Python 进行深度学习实践的一本初学指南。本书并未罗列大量的公式,而是通过一些实用的实际案例,以简单直白的方式介绍深度神经网络的两项任务——分类和回归,解析深度学习模型中的一些核心问题,以期让读者对深度学习的全貌有一个清晰的认识。 本书适合期望用较短时间在深度神经网络领域初试牛刀的读者,也适合深度学习的初学者以及业内人士参考。 《AWS云计算实战》 [德] 安德烈亚斯·威蒂格(Andreas Wittig) 迈克尔·威蒂格(Michael Wittig) 著 Amazon Web Services(AWS)是亚马逊公司的云计算平台,它提供了一整套基础设施和应用程序服务,可以帮助用户在云中运行几乎一切应用程序。本书介绍了AWS云平台的核心服务,如计算、存储和网络等内容。读者还可以从本书中了解在云上实现自动化、保证安全、实现高可用和海量扩展的系统架构的实践。 本书分4个部分,共14章。本书从介绍AWS的基本概念开始,引入具体的应用示例,让读者对云计算和AWS平台有一个整体的了解;然后讲解如何搭建包含服务器和网络的基础设施;在此基础上,深入介绍如何在云上存取数据,让读者熟悉存储数据的方法和技术;最后展开讨论在AWS上如何设计架构,了解实现高可用性、高容错率和高扩展性的实践。 《C陷阱与缺陷》 【美】Andrew Koenig 著 本书适合有一定经验的C程序员阅读学习,即便你是C编程高手,本书也应该成为你的案头必备书籍。作者以自己1985年在Bell实验室时发表的一篇论文为基础,结合自己的工作经验扩展成为这本对C程序员具有珍贵价值的经典著作。写作本书的出发点不是要批判C语言,而是要帮助C程序员绕过编程过程中的陷阱和障碍。
这本书在美亚评分4.7,在作者的在线算法课程的基础之上编写的,是四卷本系列的第1卷。这个在线课程2012年起就定期更新,它建立在作者在斯坦福大学教授多年的本科课程的基础之上。也许你有所耳闻,这本书就是《算法详解(卷1)——算法基础》。如果你更喜欢听和看,可以在YouTobe上搜索这本书的主题课程,免费观看。 YouTube课程图 异步图书公众号后台回复:“算法详解”,获取视频地址。 《算法详解(卷1)——算法基础》作者蒂姆·拉夫加登(Tim Roughgarden)是斯坦福大学计算机科学系的教授,也是该校管理科学和工程系的客座教授,他从2004年开始教授和研究算法。本书是他的《算法详解》四部曲的第一卷。 这本书详细讲解算法基础,展现算法本质 ,是一本囊括基本算法知识的详解指南。集斯坦福大学教授多年教学经验,深入浅出,通俗易懂。 《算法详解(卷1)——算法基础》 作者:[美] 科里•奥尔索夫(Cory Althoff) 扫描二维码,一键购买 本书对以下4个主题进行了介绍。 渐进性分析和大O表示法 渐进性表示法为讨论算法的设计和分析提供了基本术语。它的关键概念是大O表示法,这是一种用于衡量算法的运行时间粒度的建模选择。我们将会看到,清晰的高层算法设计思想的一大优点就是可以忽略常数因子和低阶项,把注意力集中在算法的性能与输入长度之间的关系上。 分治算法和主方法 算法设计中不存在万能的捷径,不存在适用于所有的计算问题的一种解决问题的方法。但是,还是存在一些通用的算法设计技巧适用于一定范围内的不同领域。在本系列的第1卷中,我们将讨论“分治”技巧。分治法的思路是把一个问题分解为几个更小的子问题,然后递归地解决这些子问题,并把它们的解决方案快速组合在一起形成原始问题的解决方案。我们将讨论用于排序、整数乘法、矩阵乘法和基本的计算几何学问题的快速分治算法。我们还将讨论主方法,它是一个强大的工具,用于分析分治算法的运行时间。 随机化算法 随机化算法在运行时采用了“掷硬币”的方式,它的行为取决于掷硬币的结果。令人吃惊的是,随机化常常能够带来简单、优雅且实用的算法。其中一个经典例子是随机化的快速排序(QuickSort)算法,我们将详细介绍这个算法并分析其运行时间。我们还将在《算法详解》系列的第2卷看到随机化算法的进一步应用。 排序和选择 作为前3个主题研究的附加成果,我们将学习几个著名的排序和选择算法,包括归并排序(MergeSort)、快速排序和线性时间级的选择(包括随机化版本和确定性版本)。这些算法具有令人炫目的高速度,以至于它们的运行时间较之读取输入所需要的时间并没有多出很多。创建类似这样的“低代价基本操作”集合,既可以直接用它来操作数据,也可以将其作为更困难问题的解决方案的基本单位。 关于本书内容的更详细介绍,可以阅读每章的“本章要点”,它对每一章的内容进行了总结,特别是那些重要的概念。 《算法详解》系列其他几卷所涵盖的主题 《算法详解(卷2)》讨论了数据结构(堆、平衡搜索树、散列表、布隆过滤器)、图形基本单元(宽度和深度优先的搜索、连通性、最短路径)以及它们的应用(从消除重复到社交网络分析)。卷3重点讨论了贪婪算法(调度、最小生成树、集群、霍夫曼编码)和动态编程(背包、序列对齐、最短路径、最佳搜索树等)。卷4则介绍了NP完整性及其对算法设计师的意义,还讨论了处理难解的计算问题的一些策略,包括对试探法和局部搜索的分析。 本书经常会出现“Q.e.d”等字样,它是quod erat demonstrandum的缩写,表示“证明完毕”。在数学著作中,它出现在证明过程的最后,表示证明已经完成。 精通算法需要大量的时间和精力,那为什么要学习算法呢? 成为更优秀的程序员 读者将学习一些令人炫目的用于处理数据的高速子程序以及一些实用的数据结构,它们用于组织数据,并可以直接部署到自己的程序中。实现和使用这些算法将会扩展并提高读者的编程技巧。读者还将学习基本的算法设计范式,它们与许多不同领域的不同问题密切相关,并且可以作为预测算法性能的工具。这些“算法设计模式”可以帮助读者为自己碰到的问题设计新算法。 加强分析技巧 读者将会获得大量的实践以对算法进行描述和推导。通过数学分析,读者将对《算法详解》系列图书所涵盖的特定算法和数据结构产生深刻的理解。读者还将掌握一些广泛用于算法分析的实用数学技巧。 形成算法思维 在学习了算法之后,很难发现有什么地方没有它们的踪影。不管是坐电梯、观察鸟群,还是管理自己的投资组合,甚至是观察婴儿的认知,算法思维都如影随行。算法思维在计算机科学之外的领域,包括生物学、统计学和经济学越来越实用。 融入计算机科学家的圈子 研究算法就像是观看计算机科学最近60年的精彩剪辑。当读者参加一个计算机科学的鸡尾酒会时,会上有人讲了一个关于Dijkstra算法的笑话时,你就不会感觉自己被排除在这个圈子之外了。在阅读了本书系列之后,读者将会了解许多这方面的知识。 在技术访谈中脱颖而出 在过去这些年里,有很多学生向我讲述了《算法详解》系列图书是怎样帮助他们在技术访谈中大放异彩。 《算法详解》系列的在线课程当前运行于Coursera和Stanford Lagunita平台。另外还有一些资源可以帮助读者根据自己的心愿提升对在线课程的体验。 视频。如果你觉得相比阅读文字,更喜欢听和看,那么可以在YouTube的视频播放列表中观看。这些视频涵盖了《算法详解》系列的所有主题。我希望它们能够激发读者学习算法的持续热情。当然,它们并不能完全取代书的作用。 小测验。你怎么才能知道自己是否完全理解了本书所讨论的概念呢?散布于全书的小测验及其答案和详细解释就起到了这个作用。当读者阅读到这块内容时,最好能够停下来认真思考,然后再继续阅读接下来的内容。 章末习题。每章的末尾都有一些相对简单的问题,用于测试读者对该章内容的理解。另外还有一些开放性的、难度更大的挑战题。本书并未包含章末习题的答案,但是读者可以通过本书的论坛(稍后介绍)与我以及其他读者进行交流。 编程题。许多章的最后部分是一个建议的编程项目,其目的是通过创建自己的算法工作程序,来培养读者对算法的完全理解。读者可以在www.algorithmsi- lluminated.org上找到数据集、测试例以及它们的答案。 论坛。在线课程能够取得成功的一个重要原因是它们为参与者提供了互相帮助的机会,读者可以通过论坛讨论课程材料和调试程序。本书系列的读者也有同样的机会,你可以通过www.algorithmsilluminated.org参与互动。 第1章 绪论 1 1.1 为什么要学习算法 1 1.2 整数乘法 3 1.2.1 问题和解决方案 3 1.2.2 整数乘法问题 3 1.2.3 小学算法 4 1.2.4 操作数量的分析 5 1.2.5 还能做得更好吗 5 1.3 Karatsuba乘法 6 1.3.1 一个具体的例子 6 1.3.2 一种递归算法 7 1.3.3 Karatsuba乘法 9 1.4 MergeSort算法 11 1.4.1 推动力 11 1.4.2 排序 12 1.4.3 一个例子 13 1.4.4 伪码 14 1.4.5 Merge子程序 15 1.5 MergeSort算法分析 16 1.5.1 Merge的运行时间 17 1.5.2 MergeSort的运行时间 18 1.5.3 定理1.2的证明 19 1.5.4 小测验1.1~1.2的答案 23 1.6 算法分析的指导原则 23 1.6.1 第1个原则:最坏情况分析 24 1.6.2 第2个原则:全局分析 25 1.6.3 第3个原则:渐进性分析 26 1.6.4 什么是“快速”算法 27 1.7 本章要点 28 1.8 习题 29 挑战题 31 编程题 31 第2章 渐进性表示法 32 2.1 要旨 32 2.1.1 推动力 32 2.1.2 高级思维 33 2.1.3 4个例子 34 2.1.4 小测验2.1~2.4的答案 38 2.2 大O表示法 40 2.2.1 文本定义 40 2.2.2 图形定义 40 2.2.3 数学定义 41 2.3 两个基本例子 42 2.3.1 k阶多项式是O(nk) 42 2.3.2 k阶多项式不是O(nk-1) 43 2.4 大Ω和大表示法 44 2.4.1 大Ω表示法 44 2.4.2 大表示法 45 2.4.3 小O表示法 46 2.4.4 渐进性表示法的来源 47 2.4.5 小测验2.5的答案 48 2.5 其他例子 48 2.5.1 在指数中添加一个常数 48 2.5.2 指数乘以一个常数 49 2.5.3 最大值vs.和 49 2.6 本章要点 50 2.7 习题 51 第3章 分治算法 53 3.1 分治法规范 53 3.2 以O(n log n)时间计数逆序对 54 3.2.1 问题 54 3.2.2 一个例子 54 3.2.3 协同筛选 55 3.2.4 穷举搜索法 55 3.2.5 分治法 56 3.2.6 高级算法 57 3.2.7 关键思路:站在MergeSort的肩膀上 57 3.2.8 重温Merge 58 3.2.9 Merge和分离逆序对 60 3.2.10 Merge_and_CountSplitInv 61 3.2.11 正确性 61 3.2.12 运行时间 62 3.2.13 小测验3.1~3.2的答案 62 3.3 Strassen的矩阵相乘算法 63 3.3.1 矩阵相乘 63 3.3.2 例子(n = 2) 64 3.3.3 简单算法 64 3.3.4 分治法 65 3.3.5 节省一个递归调用 67 3.3.6 细节 68 3.3.7 小测验3.3的答案 69 *3.4 O(n log n)时间的最近点对(Closest Pair)算法 70 3.4.1 问题 70 3.4.2 热身:1D情况 71 3.4.3 预处理 71 3.4.4 一种分治方法 72 3.4.5 一个微妙的变化 74 3.4.6 ClosestSplitPair 74 3.4.7 正确性 76 3.4.8 辅助结论3.3(a)的证明 77 3.4.9 辅助结论3.3(b)的证明 78 3.4.10 小测验3.4的答案 80 3.5 本章要点 80 3.6 习题 81 挑战题 81 编程题 82 第4章 主方法 83 4.1 重温整数乘法 83 4.1.1 RecIntMult算法 84 4.1.2 Karatsuba算法 84 4.1.3 比较递归过程 85 4.2 形式声明 86 4.2.1 标准递归过程 86 4.2.2 主方法的陈述和讨论 87 4.3 6个例子 88 4.3.1 重温MergeSort 89 4.3.2 二分搜索 89 4.3.3 整数乘法的递归算法 90 4.3.4 Karatsuba乘法 90 4.3.5 矩阵乘法 91 4.3.6 一个虚构的递归过程 92 4.3.7 小测验4.2~4.3的答案 93 *4.4 主方法的证明 94 4.4.1 前言 94 4.4.2 重温递归树 95 4.4.3 单层所完成的工作 96 4.4.4 各层累计 97 4.4.5 正义与邪恶:需要考虑3种情况 98 4.4.6 预告运行时间上界 99 4.4.7 最后的计算:第一种情况 100 4.4.8 迂回之旅:几何级数 101 4.4.9 最后的计算:第二种情况和第三种情况 102 4.4.10 小测验4.4~4.5的答案 103 4.5 本章要点 103 4.6 习题 104 第5章 快速排序(QuickSort) 107 5.1 概述 107 5.1.1 排序 108 5.1.2 根据基准元素进行划分 108 5.1.3 高级描述 110 5.1.4 内容前瞻 110 5.2 围绕基准元素进行划分 111 5.2.1 简易方法 111 5.2.2 原地实现:高级计划 112 5.2.3 例子 113 5.2.4 Partition子程序的伪码 115 5.2.5 QuickSort的伪码 117 5.3 良好的基准元素的重要性 117 5.3.1 ChoosePivot的简单实现 118 5.3.2 ChoosePivot的过度实现 118 5.3.3 小测验5.1~5.2的答案 119 5.4 随机化的QuickSort 121 5.4.1 ChoosePivot的随机化实现 121 5.4.2 随机化QuickSort的运行时间 122 5.4.3 直觉:随机基准元素为什么很好 123 *5.5 随机化QuickSort的分析 124 5.5.1 预备工作 125 5.5.2 分解蓝图 126 5.5.3 应用蓝图 128 5.5.4 计算比较的概率 130 5.5.5 最后的计算 132 5.5.6 小测验5.3的答案 133 *5.6 排序需要 (n log n)的比较 134 5.6.1 基于比较的排序算法 134 5.6.2 具有更强前提的更快速排序 135 5.6.3 定理5.5的证明 136 5.7 本章要点 138 5.8 习题 139 挑战题 140 编程题 141 第6章 线性时间级的选择 142 6.1 RSelect算法 143 6.1.1 选择问题 143 6.1.2 简化为排序 144 6.1.3 分治法 145 6.1.4 RSelect的伪码 146 6.1.5 RSelect的运行时间 147 6.1.6 小测验6.1~6.2的答案 149 *6.2 RSelect的分析 150 6.2.1 根据阶段追踪进展 150 6.2.2 简化为掷硬币 151 6.2.3 综合结论 153 *6.3 DSelect算法 154 6.3.1 基本思路:中位的中位元素 154 6.3.2 DSelect的伪码 155 6.3.3 理解DSelect 156 6.3.4 DSelect的运行时间 157 *6.4 DSelect的分析 159 6.4.1 递归调用之外所完成的工作 159 6.4.2 一个粗略的递归过程 159 6.4.3 30-70辅助结论 160 6.4.4 解析递归过程 163 6.4.5 先猜后验方法 164 6.5 本章要点 166 6.6 本章习题 166 挑战题 167 编程题 168 附录A 快速回顾数学归纳法 169 附录B 快速回顾离散概率 173 趣学算法 作者:陈小玉 扫描二维码,一键购买 “笨办法”学Python 3 作者:[美] 泽德 A. 肖(Zed A. Shaw) 扫描二维码,一键购买 数据结构(Python语言描述) 作者:【美】Kenneth A. Lambert(兰伯特) 扫描二维码,一键购买 Python核心编程(第3版) 作者:【美】Wesley Chun(卫斯理 春) 扫描二维码,一键购买 Python编程从入门到精通 作者:叶维忠 扫描二维码,一键购买 Python编程无师自通 作者:[美] 科里•奥尔索夫 扫描二维码,一键购买 点击“阅读原文”购买《算法详解:卷1 算法基础》 阅读原文
经过 2万多粉丝近10天的踊跃投票, 最终2018年度优秀作译者TOP10终于尘埃落定! 接下来就一起来看看2018年优秀作译者TOP10—— 2018年异步社区优秀作者奖 张鑫旭《CSS世界》 王晓慧《Unreal Engine 虚拟现实开发》 邹达 《30天App开发从0到1:APICloud移动开发实战》 朱少民《全程软件测试(第3版)》 乔梁《持续交付2.0:业务引领的DevOps精要》 金飞《软件定义安全及可编程对抗系统实战》 路彦雄《文本上的算法——深入浅出自然语言处理》 王波《Java架构师指南》 甘迪文《Windows黑客编程技术详解》 胡振波《手把手教你设计CPU——RISC-V处理器篇》《RISC-V架构与嵌入式开发快速入门》 2018年异步社区优秀译者奖 门佳《UNIX Linux OS X中的Shell编程 第4版》 魏博《概率图模型 基于R语言》 高蓉 李茂《Java数据分析指南》 孙余强、王涛《Wireshark网络分析实战(第2版)》 《Kali Linux无线渗透测试指南(第3版)》 张卫滨《反应式Web应用开发》 张星辰《深入浅出数据科学》 王巍巍《笨办法学Python 3》 林赐《Python神经网络编程》 方延风《Kibana数据可视化》 何品 沈达《Scala实用指南》 方式:注册为异步社区会员,订单结算输入优惠码:1bc4bb-9,全场满100减25元。
经典图书《持续交付》已出版8年,一直受到软件行业从业者的关注。书中的软件开发原则和实践也随着商业环境VUCA特性的明显增强而逐渐受到软件技术人员的认可。这本书得以迅速、优质地在中国出版与译者乔梁密不可分,圈内人都亲切的称乔梁为“乔帮主”。 乔梁是《持续交付》译者,持续交付领域专家,持续交付和DevOps理念在国内的首批实践者和布道者,被业界称为“国内持续交付第一人”。国内最早致力于通过敏捷开发与精益理论改善软件价值交付效率的实践者之一,精研各种软件工程方法论。 8年后乔梁带着他的全新著作《持续交付2.0:业务引领的DevOps精要》面向大众。这本书将《持续交付》一书的思想融会贯通,经过8年的管理实践,精心总结与提炼,提出“持续交付2.0双环模型”;作者独创性地将持续交付理论与当前的技术热点DevOps理念完美结合。 同时《持续交付》一书作者Jez Humble为本书作序。腾讯副总裁曾宇、百度地图事业部总经理李莹、ThoughtWorks中国区总经理 张松滴滴高级技术总监路宁、百度工程效率部负责人李涛、阿里巴巴研发协同平台负责人叶渡等众多企业高管和技术专家联袂推荐。 《持续交付2.0:业务引领的DevOps精要》 作者:乔梁 2002年,我偶然得到一本书,名为《解析极限编程》。书中介绍的软件开发方法与现实中使用的工作方法截然不同。书中的很多实践看上去都不现实,如测试驱动开发、持续集成、结对编程、用户故事等,这让我感到很新奇,怎么会有团队这么做呢?但看上去这些方法的确很诱人,于是我带着“怀疑”的态度,在实际工作中引入了其中一些方法,但执行上还是打了一些折扣。例如,我没有做测试驱动开发,而只是增加一些单元测试;没有做结对编程,而是要求代码评审(code review);没有做持续集成,而是每日构建。一段时间后,虽然能感受到一些收益,但并没有那么显著。 直到2005年,我的一个朋友向我展示了他们如何使用这种开发方式交付真实的软件项目,和真实的编写代码的过程。每一次修改代码,都编写并执行一系列的自动化测试用例;每次提交都会进行持续集成。这是一种从未有过的编码体验,开发工程师很少需要启动程序,通过单步调试来找出代码中的问题。这使我真正相信,的确存在按照这种敏捷方式工作的团队,而且离我并不遥远。 2007年,我加入ThoughtWorks,希望能体验敏捷软件开发方式。作为一名需求分析师和交付经理,我加入了持续交付平台GoCD的产品研发,我的搭档就是Jez Humber(该产品的产品经理),他也是《持续交付:发布可靠软件的系统方法》的作者之一,书中很多实践都来自我们团队自己的软件产品研发过程。从想法的诞生到产品上架,我经历了一个完整的产品研发过程,也真正认识了敏捷开发方法,掌握了持续交付实践。 2009年以后,我作为外部顾问或内部教练,开始为国内外很多企业提供相关的组织敏捷与精益转型咨询服务,客户既有PC互联网时代的巨头,也有传统IT企业;既有国内知名大企业,也有高速成长的移动互联网创业公司。在与客户合作的过程中,我对“持续交付”有了更深刻的理解,也对如何帮助组织实现“持续交付价值”有了全新的认识。 2007年,我认为包括极限编程在内的众多敏捷开发实践是快速高质量软件交付的法宝;2010年之后,我发现实践本身虽然非常重要,但更重要的是支撑实践的组织管理方法、工作思路与理念。于是,我的口头禅成了“别提敏捷,只解决问题!”。2012年后,更多的软件开发方法与敏捷流派在国内开始盛行,但其背后的核心理念与主要工作原则并没有根本性的变化。无论什么样的方法,都应该以“解决问题”为出发点,而“解决问题”的一个重要前提是“能够正确定义问题,并达成共识”。 我当然不是思想无用论的支持者。相反,我认为思想对每个人对事物的认知和理解至关重要。但咨询经历告诉我,对事物的正确理解,并不能确保正确的思想和理念在现实中落地,也不能确保对企业有大的和直接的帮助。对方法应用者而言,其目标是通过对思想理念的认知,能够尽早解决自己(或者客户)所面临的棘手问题。 正如企业经营管理一样,软件工程发展的历程也是各种方法论不断出现与发展的过程。从20世纪60年代“软件工程”这一术语的诞生,到20世纪70年代提出瀑布软件开发模型,以及1985年提出的迭代增量开发和1986年Barry Boehm在“A Spiral Model of Software Development and Enhancement”一文中提出的喷泉模型,20世纪90年代的软件能力成熟度模型集成(Capability Maturity Model Integration,CMMI)的产生和多种轻量级软件开发方法,21世纪初敏捷宣言的正式发表,再到精益软件开发方法、看板方法,以及持续交付和DevOps运动。所有这一切变化,既反映出该领域的快速变化,也反映出没有哪一种理论或方法能够完全解决这个领域面临的所有问题。 本书希望能够让读者在了解“持续交付”全貌的基础上,当遇到与IT组织效能相关的问题时,能够以适当的思考方式和背景知识来应对,让你在今后的工作中少走一些弯路,至少遇到相似问题时,可以有所参考。 从“软件工程”这一名词诞生以来,“质量”和“效率”就是它的目标。IT组织大都在这条路上探寻,从最初的瀑布模型,到CMMI,很多组织曾经尊其为软件开发过程的“圣经”。而当“敏捷运动”兴起时,他们想要“做”敏捷;当听说“持续交付”,他们想要“做”持续交付。现在,DevOps也来了!在各种各样的交流大会里,不断传来DevOps胜利的凯歌,各种媒体也在报道它的好处。很多公司又想要“DevOps”了…… 我们的确听到过一些美妙的“故事”,但它们可能都不属于我们自己。在自己身边,就连“如何让大家对这些理念或实践达成共识”都成了一大困难,这令你感到无比困扰。就像走在一团迷雾之中,耳边一直听到美妙的音乐响起,也隐约看到远处的点点亮光,然而脚下的“路”却忽明忽暗。 多年工作经历让我对这一领域有了新的认识,并进行总结与反思。“持续交付”是一个非常有吸引力的名字,总会让人浮想联翩,业务人员似乎看到了一丝希望“所有的需求,上午提出来,下午就能拿到手”。然而,太多的企业低估了自己所面临的困难。这些困难一部分是显性的,如没有自动化测试,也做不到自动化部署,主干开发更是不可想象;还有一部分困难是隐性的,例如,职能部门之间的“墙”存在已久。业务人员嫌开发团队的软件交付速度慢,开发团队嫌业务人员提出的需求不靠谱。这很可能归因于每个人的价值思考方式。 本书的目标是希望企业中所有角色转换价值思考的角度,改进软件服务端到端的商业价值交付方式,提升相关人员之间的协作效率,最终达到以安全可靠的方式快速验证想法,缩短实现真正商业价值的时间。也就是说,《持续交付2.0:业务引领的DevOps精要》不仅关注“从需求列表到可运行的软件”这一过程,还提出“价值探索—快速验证”双闭环,如图0-1所示,这也是本书的书名“持续交付2.0”的由来。 事实证明,没有放之四海皆准的企业管理解决方案,能够完美解决每个企业遇到的问题。但是,管理者只有从整体视角出发,抵住局部优化的诱惑,才能在资源有限的情况下,引领企业创造更大的价值。本书提供了一个整体框架,给出了这个框架中各节点所涉及的原则与相关的实践方法,同时介绍了它们的优势与约束。 图1 持续交付双闭环模型 如果你将“持续交付2.0双环模型”应用到整个企业范围,就是一种企业级的组织管理变革指引;如果你将它引入某一个团队,对这个团队来说,就是团队工作模式的改进套路。既然“持续交付2.0”是一个管理框架,企业势必要根据自己的实际情况来进行定制。因此,书中列举了很多实际案例,告诉你,其他企业或团队如何应用这些实践方法,达到它们的目标。这些案例也说明,解决方案与实施路径很难在企业之间进行复制,企业必须应用书中的原则,结合自身的实际情况(产品形态及所处的商业竞争阶段、团队的规模与人员技能水平、软件系统架构,以及组织管理机制与文化等),逐步探索出自己的道路。 先谈谈本书的结构和内容。全书共包括3部分内容。第一部分介绍了“持续交付2.0”的双环模型;第二部分主要讨论使用“持续交付2.0”框架中可能遇到的问题,以及改进过程中需要遵循的原则。第三部分主要是案例分享,目的是让读者体会在持续改善过程中,不同企业和团队的实施重点与解决方案的不同。书中具体内容如下所示。 第一部分主要讲述“持续交付2.0”双环模型(即持续交付“8”字环)和“持续交付2.0”的4个工作原则,还会介绍两个闭环“价值探索”与“快速验证”的执行步骤与相关原则。 第1章讨论持续交付的发展必然性,并介绍“持续交付2.0双环模型”及其4个基本原则。 第2章讨论“价值探索环”(简称“探索环”)的4个核心环节,以及每个环节的指导原则与实践方法。只有业务方能够以“精益”方式思考,持续交付才能更显威力,否则很可能退缩成为持续交付1.0的单环模式,即只有“快速验证环”。 第3章简单阐述“快速验证环”(简称“验证环”)中各环节的主要活动,并给出各环节的工作方法。 第二部分主要阐述“持续交付2.0”的实施七巧板中,三大主要板块的工作原则与实践方法。这三大板块包括组织机制、软件架构与基础设施。其中组织机制是一个复杂课题,本书仅讨论持续交付所需的文化,以及建立文化的四步法。组织架构、人才结构、激励机制等内容将在本书的续篇中专题讨论。基础设施部分是产品研发过程中最基础的工作。这部分首先讨论持续交付部署流水线及其工具设计原则,然后分别介绍部署流水线的建立与优化必须关注的五大领域,也就是说,业务需求协作流程、分支与配置管理、构建与环境管理、自动化测试管理,以及部署发布与监控管理。 第4章讨论持续交付能力的提升需要企业具有信任、安全和持续改善的组织文化,并介绍丰田公司和谷歌公司用过的改善组织文化四步法。 第5章讨论软件架构对实现持续交付快速验证能力的重要性、有利于持续交付的软件架构特征,以及软件架构改造的3种方式,即“拆迁”“绞杀”和“修缮”。 第6章讨论如何利用约束理论和精益思想,发现流程中的瓶颈,使各角色之间的业务需求协作更加顺畅,提升需求流动速度。 第7章讨论快速验证环所依赖的部署流水线的设计原则与工具链建设草案。 第8章讨论代码仓库的分支方式对持续交付的重大影响,以及不同分支方式下部署流水线的建设方案。最后介绍代码分支的数量对发布策略的影响。 第9章回顾持续集成的历史,并讲解如何判断团队是否在实践“持续集成”,还给出企业实施持续集成的五大步骤。 第10章讨论软件发布以前制订自动化测试策略需要考虑的因素,还介绍持续集成对自动化测试用例的编写与运行要求。最后,为了提高自动化测试的投资回报率,团队如何为遗留系统编写和增加自动化测试用例。 第11章讨论软件配置管理,它是持续交付快速验证环的基础。对代码、配置、环境、数据做好配置管理,最终实现一键部署和一键测试,让各角色在协作过程中能够全部实现自动化服务,并且互不影响,解放人的大脑和双手,做更有价值的事情,而让机器做它擅长的事——不断地重复 第12章讨论降低生产部署与发布风险的技术与方法。 第13章讨论软件在运行时,数据收集与分析的重要性,以及衡量数据监测环节的衡量指标,包括正确性、完整性和及时性,此外,还介绍测试扁平化趋势,以及生产环境上的质量巡检与演习。 第三部分主要是实战案例的分析。它们分别代表不同类型的公司、不同大小的团队以及不同的软件产品特点。我将带你深入案例现场,了解当时状况,分析问题,并提出解决思路。 第14章介绍一个百人工程师的互联网产品团队历经一年时间,如何打造快速运转的“持续交付2.0双环模型”,并且做到可持续运转。 第15章介绍在无法“测试右移”的情况下,一个大项目中的小团队如何改变团队协作模式,从“死亡行军”转变为“无缺陷交付”。 第16章介绍一个微服务化开发团队如何在项目运行的过程中,通过逐步对基础设施板块中各模块进行改造,提升交付质量与频率,并推动运维人员也做出改变,真正成为一个“DevOps团队”。 持续交付1.0关注于“从提交代码到产品发布”的过程,如图2所示,并且提供了一系列工作原则和优秀的实践方法,可以提升软件开发活动的效率。 图2 持续交付1.0的关注点 但是,我在实际咨询过程中发现,一些软件功能在开发完成之后,对用户或者业务来说,并没有产生什么影响,有些功能根本没有用户来使用。可是,这些功能的确花费了团队的很多精力才设计实现。这是一种巨大的浪费。这种“无用”的功能生产得越多,浪费就越大。我们是否可以找到一些方法,让我们付出的努力对业务改善更加有效,或者只用很少的成本就可以验证对业务无效呢? 精益思想 2011年出版的《精益创业》一书给了我一些启示。其核心思想是,开发新产品时,先做出一个简单的原型——最小化可行产品(Minimum Viable Product,MVP),这个原型的目标并不是马上生产出一个完美的产品,而是为了验证自己心中的商业假设。得到用户的真实反馈后,从每次试验的结果中学习,再快速迭代,持续修正,在资源耗尽前从迷雾中找到通往成功的道路,最终适应市场的需求。 Eric Rise在书中强调,精益创业就是一个“开发—测量—认知”的验证学习过程,如图3所示。也就是说,把创意快速转化为产品,衡量顾客的反馈,然后再决定是改弦更张,还是坚守不移。 图3 “开发—测量—认知”环 该书主要关注于创业初始阶段,将精益思想贯穿于产品“从0到1”的过程。事实上,它也可以用于产品“从1到n”的过程中。 1996年,Womack、Jones和Roos在《精益思想》一书中指出,精益思想是指导企业根据用户需求,定义企业生产价值,按照价值流来组织全部生产活动,使价值在生产活动之间流动起来,由需求拉动产品的生产,从而识别整个生产过程中不经意间产生的浪费,并消除之。 在精益管理理论中,“浪费”是指从客户角度出发,对优质产品与良好服务不增加价值的生产活动或管理流程。并指出,业务生产中所有活动都可以归结为以下两种活动,也就是增加价值的活动和不增加价值的活动,而不增加价值的活动就是浪费。在被归类为“浪费”的活动中,又可以分为必要的非增值活动和纯粹的浪费。必要的非增值活动是指从客户的角度看虽没有价值,却可以避免(潜在的)更大的浪费或降低系统性风险的活动,如图4所示。 图4 软件产品开发中的活动浪费 例如,生产流水线上的装配工作是增值活动,质量检查是必要的非增值活动,而因材料供应不足产生的生产等待以及因质量缺陷导致的返工都被认为是不必要的浪费。在软件产品服务的全生命周期中,也同样包含多种“浪费”,例如,无效果的功能特性、各生产环节中的等待(如图5所示)、没人看的文档、软件缺陷、机械性的重复工作等。 图5 用户视角的增值活动与浪费 尽管“消除所有浪费”几乎是不可能的,但是,我们仍旧要全面贯彻“识别和消除一切浪费”的理念,持续不断地优化流程与工作方式,达到高质量、低成本、无风险地快速交付客户价值的目的。 双环模型 自2009年Flickr(一个聚合全球知名热门图片分享网站)声称其网站每天部署10次之时起,“主干开发+持续集成+持续发布”已成为硅谷知名互联网公司应对VUCA环境的一种主流软件研发管理模式。这种变化的原动力并不是来自技术团队本身,而是来自业务与产品方的诉求。为了在VUCA环境中更快地了解海量用户,快速验证大量业务假设和解决方案,他们改变了业务探索的模式,并催生了软件研发管理模式的改变,两种模式相互促进,从而形成了互联网软件产品研发管理的双环模式,即“持续交付2.0”,如图6所示。 图6 持续交付2.0的双环模型 “持续交付2.0”是一种产品研发管理思维框架。它将精益创业与持续交付1.0相结合,强调业务与IT间的快速闭环,以“精益思想”为指导,全面贯彻“识别和消除一切浪费”的理念,通过一系列工作原则与实践,帮助企业以一种可持续方式,高质量、低成本、无风险地快速交付客户价值。 对企业来说,开发软件产品的目标是创造客户价值。因此,我们不应该仅仅关注快速开发软件功能,同时还应该关注我们所交付的软件的业务正确性,以及如何以有限的资源快速验证和解决业务问题。也就是说,不断探索发现真正要解决的业务问题,提出科学的目标,设计最小可行解决方案。通过快速实现解决方案并从真实反馈中收集数据,以验证该问题是否得以解决。这是一个从业务问题出发,到业务问题解决的完整业务闭环,简称为持续交付“8”字环。 它由两个相连的环组成:第一个环为“探索环”,其主要目标是识别和定义业务问题,并制订出最小可行解决方案进入第二个环;第二个环为“验证环”,其主要目标是以最快速度交付最小可行方案,可靠地收集真实反馈,并分析和验证业务问题的解决效果,以便决定下一步行动,如图7所示。 探索环包含4个可持续循环步骤,分别是提问、锚定、共创和精炼。 (1)提问,即定义问题。通过有针对性的提问,找出客户的具体需求,并找出具体需求后的原因,即具体需求后要解决的根本问题。在提问中形成团队期望达成的业务目标或者想要解决的业务问题。如果问题无法清晰定义,那么找到的答案自然就会有偏差。因此,在寻找答案之前,应该先清晰地定义问题。 (2)锚定,即定义结果目标指示器。针对问题进行信息收集,经过分析,去除干扰信息,识别问题假设,得到适当的衡量指标项,并用其描述现在的状况,同时讨论并定义我们接下来的行动所期望的结果。 (3)共创,即共同探索和创造解决或验证该问题的多种具有可行性的解决方案。 (4)精炼,即对所有的可行试验方案进行选择,找到最小可行性解决方案,它既可能是单个方案,也可能是多个方案的组合。 验证环也包含4个可持续循环的步骤,分别是构建、运行、监测和决策。 (1)构建:是指根据非数字化描述,将最小可行性解决方案准确地转换成符合质量要求的软件包。 (2)运行:是指将达到质量要求的软件包部署到生产环境或交到用户手中,并使之为用户提供服务。 (3)监测:是指收集生产系统中产生的数据,对系统进行监控,确保其正常运行。同时将业务数据以适当的形式及时呈现出来。 (4)决策:是指将收集到的数据信息与探索环得出的对应目标进行对比分析,做出决策,确定下一步的方向。 探索环就像是一部车子的前轮,把握前进方向。验证环则像车子的后轮,使车子平稳且驱动快速前进。它们之间相互促进,探索环产生的可行性方案规模越小,越能够提高验证环的运转速度;如果价值验证环能够提高运转速度,则有利于探索环尽早得到真实反馈,有利于快速决策,及时对前进方向进行验证或调整。 本文摘自《持续交付2.0:业务引领的DevOps精要》 《持续交付2.0:业务引领的DevOps精要》 作者:乔梁 持续交付2.0不只是关于软件的交付模型,而是从业务问题出发,关注业务假设验证速度的双环业务模型。只有从业务目标出发的持续交付实践才有强大的创造力和生命力! 书中指出,持续交付2.0双环模型高速运转的三个支柱分别是组织机制、软件架构和软件交付基础设施,同时给出了提升价值探索环以及快速验证环运转速度的多种可行方法。 本书还为我们呈现了在企业内部改善持续交付2.0能力所需遵循的基本原则,包括组织文化建设、软件系统架构、业务协作、配置管理、构建集成、自动化测试、发布与监控七大板块,并指出各领域实践关键点,以及多种可实操性方法。同时,通过3个完整的实践案例过程分析,说明每个企业或团队都必须从自己的业务目标出发,根据自己的实际情况,制定自己的改善路线。
今天小编汇总异步图书最畅销的20种新书,包含2018年原创新书榜TOP10、2018年引进新书榜TOP10,下面,就让我们一起来看看有哪些好书榜上有名~ 2018年原创新书榜 《CSS世界》 《精通数据科学:从线性回归到深度学习》 《深入理解Spring Cloud与微服务构建》 《破茧成蝶2——以产品为中心的设计革命》 《深入浅出Spring Boot 2.x》 《Qt 5.9 C++开发指南》 《手把手教你设计CPU——RISC-V处理器篇》 《Scratch 2.0少儿游戏趣味编程》 《Python编程从入门到精通》 《HTTP抓包实战》 2018年引进版新书榜 《笨办法学Python 3》 《Python神经网络编程》 《数据结构 Python语言描述》 《人工智能(第2版)》 《Spring微服务实战》 《Python程序设计(第3版)》 《用Python写网络爬虫(第2版)》 《Docker实践》 《Linux二进制分析》 本书从前端开发人员的需求出发,以“流”为线索,从结构、内容到美化装饰等方面,全面且深入地讲解前端开发人员必须了解和掌握的大量的CSS知识点。同时,作者结合多年的从业经验,通过大量的实战案例,详尽解析CSS的相关知识与常见问题。作者还为本书开发了专门的配套网站,进行实例展示、问题答疑。 本书是打破能力上升瓶颈之作。前端开发行业潜心近10年一直研究看似简单的CSS的人可谓是凤毛麟角,作者从2009年开始写原创技术文章,现在其博客已经成为国内访问量巨大的个人前端博客之一,可以说众多前端初学者是看着作者的博客成长的。 本书全面讲解了数据科学的相关知识,从统计分析学到机器学习、深度学习中用到的算法及模型,借鉴经济学视角给出模型的相关解释,深入探讨模型的可用性,并结合大量的实际案例和代码帮助读者学以致用,将具体的应用场景和现有的模型相结合,从而更好地发现模型的潜在应用场景。 深入浅出讲解Spring Cloud组件、开发工具、框架等知识点; 使读者全面理解微服务的构建原理;实例丰富,解释清晰,易于读者真正理解原理,并学以致用;深入讲解Spring Cloud OAuth2,直击市场需求痛点。 本书作者结合多年从事互联网产品架构和设计工作的思路,融会贯通,提炼出顺应新时代的互联网产品设计内在规律,旨在帮助读者在波涛汹涌、充满不确定性的大环境下,改变命运,不惧未来! 本书从一个最简单的工程开始讲解Spring Boot企业级开发,其内容包含全注解下的Spring IoC和AOP、数据库编程(JDBC、JPA和MyBatis)、数据库事务、NoSQL(Redis和MongoDB)技术、Spring MVC、Spring 5新一代响应式框架WebFlux、互联网抢购业务、部署与监控、REST风格和Spring Cloud分布式开发等。 本书以Qt 5.9 LTS版本为开发平台,详细介绍了Qt C++开发应用程序的技术,包括Qt应用程序的基本架构、信号与槽工作机制、图形显示的Graphics/View架构、数据编辑和显示的Model/View架构、对话框和多窗口的设计与调用方法等,介绍了常用界面组件、文件读写、绘图、图表、数据可视化、数据库、多线程、网络和多媒体等模块的使用。每个编程主题都精心设计了完整的实例程序。 系统介绍RISC-V指令集架构; 结合实际RISC-V开源实例进行教学。;深入剖析RISC-V处理器的微架构以及代码实现。;使读者能够快速掌握并轻松使用RISC-V架构处理器。 通过学习实例蜂鸟E200的Verilog代码,您将能成为一名合格的数字IC设计工程师。 本书内容来自于程序员父亲教儿子学习Scratch编程的真实教学实践,通过介绍如何用Scratch 2.0编写14款有趣的小游戏和小程序,由浅入深地向读者介绍Scratch 2.0编程的基本技能以及程序设计的基本思维和方法。 本书循序渐进、由浅入深地详细讲解了Python语言开发技术,并通过具体实例演练了各个知识点的具体使用流程。全书内容循序渐进,以“技术解惑”和“范例演练”贯穿全书,引导读者全面掌握Python语言。 HTTP抓包利用Fiddler抓包工具来捕获HTTP数据包,然后对其进行重发、编辑等操作。HTTP抓包的用途非常广泛,主要用于Web开发调试、软件自动化测、接口自动化测试、性能测试和网络爬虫等方面。也用来检查网络安全。抓包也经常被用来进行数据截取等。 本书是基于Python 3.6版本编写的。百万粉丝程序员带你轻松入门Python语言!5小时的完整视频教程,纯美式发音,搭配中文字幕,边看边练两不误;52个精心设计的编程习题,拒绝拖沓,提供项目案例,学以致用不务虚。 本书用轻松的笔触,一步一步揭示了神经网络的数学思想,并介绍如何使用Python编程语言开发神经网络。本书将带领您进行一场妙趣横生却又有条不紊的旅行——从一个非常简单的想法开始,逐步理解神经网络的工作机制。您无需任何超出中学范围的数学知识,并且本书还给出易于理解的微积分简介。 本书为美亚五星畅销书,备受关注。基于Python3.5,全彩印刷,如果只选一本神经网络图书,他是首选。 不管你是程序设计爱好者、计算机专业的学生还是一位专业程序员,本书都是你通过Py thon编程语言学习面向对象设计和数据结构的不错的入门教程。通过清晰的示例、按部就班的讲解以及众多实用的练习,本书教你通过Python理解并使用数据结构。 美国经典入门教材,被誉为人工智能领域百科全书。人工智能领域近十年来最前沿教程,更加适合本科生使用。 本书基于人工智能的理论基础, 向读者展示全面、新颖、丰富多彩且易于理解的人工智能知识体系。本书给出诸多的示例、应用程序、全彩图片和人物轶事,以激发读者的阅读和学习兴趣;还引入了机器人和机器学习的相关高级课程,包括神经网络、遗传算法、自然语言处理、规划和复杂的棋盘博弈等。 本书以一个名为EagleEye的项目为主线,介绍云、微服务等概念以及Spring Boot和Spring Cloud等诸多Spring项目,并介绍如何将EagleEye项目一步一步地从单体架构重构成微服务架构,进而将这个项目拆分成众多微服务,让它们运行在各自的Docker容器中,实现持续集成/持续部署,并最终自动部署到云环境(Amazon)中。 《Python程序设计 第3版》是面向大学计算机科学专业的教材。本书以Python 3语言为工具,采用相当传统的方法,强调解决问题、设计和编程是计算机科学的核心技能。 本书讲解了如何使用Python来编写网络爬虫程序,内容包括网络爬虫简介,从页面中抓取数据的3种方法,提取缓存中的数据,使用多个线程和进程进行并发抓取,抓取动态页面中的内容,与表单进行交互,处理页面中的验证码问题,以及使用Scarpy和Portia进行数据抓取,并在最后介绍了使用本书讲解的数据抓取技术对几个真实的网站进行抓取的实例,旨在帮助读者活学活用书中介绍的技术。 本书由浅入深地讲解了Docker的相关内容,涵盖从开发环境到DevOps流水线,再一路到生产环境的整个落地过程以及相关的实用技巧。书中介绍Docker的核心概念和架构,以及将Docker和开发环境有机、高效地结合起来的方法,包括用作轻量级的虚拟机以及构建和宿主机编排、配置管理、精简镜像等。 不仅如此,本书还通过“问题/解决方案/讨论”的形式,将“Docker如何融入DevOps流水线”“如何在生产环境落地”等一系列难题拆解成101个相关的实用技巧,为读者提供解决方案以及一些细节和技巧方面的实践经验。 本书结合大量实例,简明扼要地介绍了目前热门的神经网络技术和深度学习技术。从经典的多层感知机到用于图像处理的深度卷积网络,从处理序列化数据的循环网络到伪造仿真数据的生成对抗网络,从词嵌入到AI游戏应用中的强化学习,本书引ling读者一层一层揭开深度学习的面纱,并在逐渐清晰的理论框架下,提供多个Python编码实例,方便读者动手实践。 二进制分析属于信息安全业界逆向工程中的一种技术,通过利用可执行的机器代码(二进制)来分析应用程序的控制结构和运行方式,有助于信息安全从业人员更好地分析各种漏洞、病毒以及恶意软件,从而找到相应的解决方案。
如果说软件的执行过程就像是CPU在无数条道路(指令流)间飞奔,那么开发软件的过程就是设计和构建这个交通网络的过程。其基本目标是要让CPU在这个网络中奔跑时可以完成需求(requirement)中所定义的功能。对这个网络的其他要求通常还有可靠(reliable)、灵活(flexible)、健壮(robust)和易于维护(maintainable),开发者通过简单的改造就能让其他类型的车辆(CPU)在上面行驶(portable)…… 开发一个满足以上要求的软件系统不是一件简单的事,通常需要经历分析(analysis)、设计(design)、编码(code)和测试(test)等多个环节。通过测试并发布(release)后,还需要维护(maintain)和支持(support)工作。在以上环节中,每一步都可能遇到这样那样的技术难题。 在软件世界中,螺丝刀、万用表等传统的探测工具和修理工具都不再适用了,取而代之的是以调试器为核心的各种软件调试工具。 软件调试的基本手段有断点、单步执行、栈回溯等,其初衷就是跟踪和记录CPU执行软件的过程,把动态的瞬间“凝固”下来,以供检查和分析。 软件调试的基本目标是定位软件中存在的设计错误(bug)。但除此之外,软件调试技术和工具还有很多其他用途,比如分析软件的工作原理、分析系统崩溃、辅助解决系统和硬件问题等。 综上所述,软件是通过指令的组合来指挥硬件,既简单又复杂,是个充满神秘与挑战的世界。而软件调试是帮助人们探索和征服这个神秘世界的有力工具。 今天,作者对软件调试的理解和认识,相比自己写本书第一版时,在广度和深度方面都有了较大的提升。我们有幸采访了《软件调试(第2版)卷1:硬件基础》作者张银奎,来看看他的所思所想。 张银奎老师 异步社区:请老师简单介绍一下自己?您目前正在做哪些事情? 张银奎: 我出生在70年代,90年代大学毕业。20多年的工作生涯中,有13年是工作在英特尔公司的上海分公司。2016年底我从英特尔离职,开始人生新一轮的征程。目前我主要做两件事情,一件是创业,把自己积累了20多年的编码手艺应用到实践中,希望可以解决一些工程问题,创作出一款“广为流传”的软件。 第二件事是知识传播,包括写书、讲课、举办庐山研习班等。两件事都是我非常热衷的,发自内心的喜欢,想起来就很开心,有后脑勺要乐开花(童年的俗语)的感觉。 异步社区: 从英特尔离职后?您平常每天都做些什么?或者说您典型的一天是如何度过的? 张银奎:是的,2016年底,我告别了英特尔,告别了那个舒适的工作环境。从普通的视角看,我的生活是比较单调的。如果我不出去讲课,那么就在我的办公室里。在为《软件调试》第二版冲刺那段时间里,我每天6点钟即起床,先送女儿上学,不到7点就到办公室,到了办公室后,就开始写作。清早的时候,思维活跃,很适合写作,而且安静没有打扰。闷头写两个小时后,大约9点,到了上班的高峰,这时我会休息一下,看看楼下拥挤的车流和人流。9点之后,我可能继续写作,一直到中午,也可能编写代码。吃过午饭后,大多时间是做开发,编写代码,调试,或者做各种实验。 晚上下班后,我有两件热衷的事,一件事是关于书的,包括读书和买书。买书方面,最好是逛实体书店,但是不能总去,所以有时也逛网上的书店。另一件事是关于孩子。我有两个女儿,大的已经读初中,我努力向她推销软件领域流行的“敏捷(Agile)”方法,目的是加快看似没有尽头的各种作业。小的还没有上幼儿园,她每天都有进步,每天都给我惊喜,真正的“日日新”,看着她成长,给我很多启发,和无限快乐。 异步社区: 我们在书中看到这样一句话——著名的计算机科学家布莱恩·柯林汉(Brian Kernighan)说过,“软件调试要比编写代码困难一倍,如果你发挥了最大才智编写代码,那么你的智商便不足以调试它。”那么,老师觉得软件调试的难点在是什么?具体表现是什么? 张银奎:难点很多。打个比方来说,很多人都会开车,但是不会修车。开车只要操作几个可见的装置就可以了,修车要掀开盖板,探查内部的隐秘世界。因为此,MSDN杂志上曾有一个著名的技术专栏,名字就叫Under the Hood(盖板下面)。对于软件系统来说,今天的软件栈越来越深,越来越复杂。“深”意味着难以见底。而学习底层往往是比较苦难的。底层的资料比较少,相对枯燥,难以理解。 除了需要比较多的底层知识之外,做好调试还需要较强的耐力和分析推理能力,一个复杂的bug可能需要几周的时间来攻克,这对耐力、意志和信心都是考验。 异步社区:老师在创作《软件调试(第2版)卷1:硬件基础》过程中遇到的最大困难是什么? 张银奎:非技术方面,最大的困难是分配时间。有人说过,诗歌的冷落是因为人类过了童贞的年龄。尼采说过,书的时代已经过去,电影的时代来了。这些话未必全对,但是有道理的。在这样一个快节奏的互联网时代里,对于一个IT技术者来说,写书真的是一件非常奢侈的事情。1934年8月,35岁的老舍冒着酷暑来到上海。他是从济南来的,刚刚辞去了在齐鲁大学的工作,到上海寻找机会。在后来的文章中,他曾这样回忆这次上海之旅,“我不是去逛,而是想看看,能不能不再教书而专以写作挣饭吃。”结果,老舍在上海住了十几天后,得到了一条结论:“专仗着写作吃不上饭”。于是又回到了山东,继续一边教书一边写作。今天距离老舍的时代又有近百年了,专职写作变得更加艰难。 技术方面,《软件调试(第2版)卷1:硬件基础》新增了大量篇幅来介绍GPU上的编程与调试。与传统的CPU编程相比,GPU编程有很多不同,代表着软件开发的新挑战和方向。今天,关于GPU内部结构和原理的资料还很少,我花了一年多的时间,一边查找资料,一边使用我习惯的“格物”方法进行调试和探索,摸索前进,终于比较全面地介绍了Nvidia、AMD、Intel、Imagination、ARM五大品牌的GPU,从内部结构到外部接口。在国际上,今天也还没有第二本书如此详细和深入地探讨GPU。 异步社区:据了解,《软件调试 (第2版)》将分成3卷出版,卷1覆盖处理器等基础内容,卷2、卷3分别介绍Windows系统和Linux系统的调试。本次南京签售上,有的读者我们卷2和卷3计划在什么时候出版?您可以稍稍“剧透”一下吗?。 张银奎:考虑多种因素,第2版会分三卷出版,第1卷是公共基础,第2卷和第3卷分别覆盖Windows和Linux平台。关于时间,因为上面提到的原因,现在还不能承诺。我会争取在2019年至少再推出一卷。内容方面,会延续卷1的几个特色,包括呈现技术背后的人文背景,追溯技术发展的历史,生动活泼的技术评点。 异步社区:您觉得现阶段软件领域的从业人员所面临的挑战和新要求是什么? 张银奎:信息技术是以越来越大的加速度在发展的,这意味着速度是沿着陡峭的上升曲线攀升的。从事软件技术的好处是不用担心碰到天花板,因为永远没有止境。对于每个人,要想跟的上技术发展的速度,一定要不断学习,不断更新自己。一方面要学会一套好的学习方法,用强大的工具武装自己。另一方面,要养成学习的习惯,通过各种途径不间断地学习。 异步社区:对于软件测试和软件调试,您认为这二者的关系是怎样的?软件测试人员是否都应该具备软件调试的技能呢? 张银奎:二者虽有联系,但有很大区别。简单说,测试的目的是发现和证明有bug,调试的目的是找到根源和去除bug。而且,调试的价值不仅仅在于去除bug,它还是深入理解软硬件系统的一种强大工具,是所有软件工程师都应该掌握的一项基本技能。 异步社区:针对刚毕业、初入职场的小白,您有什么建议? 张银奎:选择软件方向是绝对没有错的。在我看来,21世纪最有魅力的职业就是软件开发。我的建议有三个。 一是要有远大的目标,站在比较高的高度上为自己设计职业发展计划和技术发展计划。 二是脚踏实地,要从基础的工作做起,写好每一行代码,熟练使用开发工具和调试工具的每个常用功能。 三是不断钻研,不要止步于表面,对底层原理有热情。 异步社区:对您工作和生活帮助最大的三本书要推荐给大家的? 张银奎:读过的好书太多了。分三个方面各选择一本吧。 技术方面,英特尔的《英特尔架构软件开发者手册》(简称SDM)对我帮助很大,这本书分很多卷,网上有电子版本,我也有打印版本,书的每一册都比较厚,我经常读的是第三卷,胶状的书脊都被我翻的裂开了。 哲学方面,朱熹的书对我启发特别大,在我家里,与朱熹有关的书摞起来肯定超过1米高,大多数是他本人的著作,也有关于他的传记,还有他学生的书。书的形式有很多种,有单册,也有大部头。又分成不同时期出版的,有近现代的,也有一两百年前出版的线装书,是我从不同渠道淘到或者通过线上拍卖买来的。如果选择其中一本,那么就推荐朱熹的《四书集注》吧,有很多个版本供选择。 历史方面,《史记》对我的影响特别大。关于《史记》的书,我也有近百本。我觉得,对《史记》和它的作者司马迁的评价和赞美,再高也不过分。《史记》中有太多的大智大美!在写作《软件调试》第2版时,在我的办公室里,也放了一些书,每当写作间隙,我经常翻阅的书除了朱熹集注的《论语》线装书外,就是《史记评林》,两类书都是线装的,木板印刷,来自日本。 张银奎老师著作 《软件调试(第2版)卷1:硬件基础》 张银奎著,人民邮电出版社 扫描二维码,一键购买 软件调试领域的百科全书,历时十年,经典再现; 软件工程师的贴身宝典,向一流技术高手进阶的常备攻略; 设有“格物致知”实践环节,提供配套资源,可供读者动手实践; 丰富的行业背景知识和人文故事,让读者体验技术的有血有肉、有感情有温度。
2018年就要过去了。 这一年,我们曾许下美好的心愿,也曾经在堕落中挣扎。好与不好,都将成为过去。 在这个大家都在热情总结2018年的当口,小编也来凑热闹了。经过层层挑选,我们评选出了过去一年,人民邮电出版社2018年最畅销的45种图书,有科技类,社科类、艺术类、体育类以及家教类,每一本都是过去一年表现优秀被各位读者pick的好书。 畅销30余年的C语言编程入门教程;近百万程序员的C语言编程启蒙教程;技术大牛案头常备的工具书;针对C11标准库更新;蔡学镛 孟岩 高博倾力推荐。 本书是一本经过仔细测试、精心设计的完整C语言教程,它涵盖了C语言编程中的核心内容。作为计算机科学的经典著作,讲解了包含结构化代码和自顶向下设计在内的程序设计原则。 一本经久不衰的C++畅销经典教程;首本支持C++11新标准的程序设计图书。它被誉为“开发人员学习C++的必备教程,没有之一”! 本书可以说是一本面向从未学习过C语言甚至是从未学习过编程的人的入门书籍,它的首章从基础内容讲起,先介绍了传统编程的规则,后面才着重讲解有关面向对象——C++的精髓之一——的有关内容。整个书的结构安排较为合理,难度爬升较慢。 AI圣经!深度学习领域奠基性的经典畅销书!长期位居美亚AI和机器学习类图书榜首!所有数据科学家和机器学习从业者的必读图书!特斯拉CEO埃隆·马斯克等国内外众多专家推荐! 深度学习是机器学习的一个分支,它能够使计算机通过层次概念来学习经验和理解世界。 《Python核心编程(第3版)》是经典畅销图书《Python核心编程(第二版)》的全新升级版本,为中级Python开发人员提供实践方法,涵盖大量实用的代码案例,每章末尾的习题有助于巩固所学知识,Python开发人员的案头常备。 本书是基于Python 3.6版本编写的。百万粉丝程序员带你轻松入门Python语言!5小时的完整视频教程,纯美式发音,搭配中文字幕,边看边练两不误;52个精心设计的编程习题,拒绝拖沓,提供项目案例,学以致用不务虚。、本书是一本Python入门书籍,适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用。这本书以习题的方式引导读者一步一步学习编程,从简单的打印一直讲到完整项目的实现,让初学者从基础的编程技术入手,最终体验到软件开发的基本过程。 美亚畅销Python 3编程图书,帮助你通过编程快速实现工作自动化 。在本书中,你将学习利用Python 编程,在几分钟内完成手工需要几小时的工作,而事先却无需具备编程经验。一旦掌握了编程的基础知识,你就可以毫不费力地创建Python 程序,完成高效的自动化工作。 本书源自日均阅读量近万次火爆的线上同名课程,口碑与影响力俱佳,旨在打造简单易学且实用性强的轻量级Linux入门教程。 本书基于红帽RHEL系统编写,且内容通用于CentOS、Fedora等系统。本书共分为20章,内容涵盖了部署虚拟环境、安装Linux系统;常用的Linux命令;与文件读写操作有关的技术;使用Vim编辑器编写和修改配置文件;用户身份与文件权限的设置;硬盘设备分区、格式化以及挂载等操作;使用PXE+Kickstart无人值守安装服务;使用LNMP架构部署动态网站环境等。此外,本书还深度点评了红帽RHCSA、RHCE、RHCA认证,方便读者备考。 重构,一言以蔽之,就是在不改变外部行为的前提下,有条不紊地改善代码。多年前,正是本书原版的出版,使重构终于从编程高手们的小圈子走出,成为众多普通程序员日常开发工作中不可或缺的一部分。本书也因此成为与《设计模式》齐名的经典著作,被译为中、德、俄、日等众多语言,在世界范围内畅销不衰。 本书凝聚了软件开发社区专家多年摸索而获得的宝贵经验,拥有不因时光流逝而磨灭的价值。今天,无论是重构本身,业界对重构的理解,还是开发工具对重构的支持力度,都与本书出版时不可同日而语,但书中所蕴涵的意味和精华,依然值得反复咀嚼,而且往往能够常读常新。 本书用轻松的笔触,一步一步揭示了神经网络的数学思想,并介绍如何使用Python编程语言开发神经网络。本书将带领您进行一场妙趣横生却又有条不紊的旅行——从一个非常简单的想法开始,逐步理解神经网络的工作机制。您无需任何超出中学范围的数学知识,并且本书还给出易于理解的微积分简介。 本书为美亚五星畅销书,备受关注。基于Python3.5,全彩印刷,如果只选一本神经网络图书,他是首选。 本书是经典的、畅销的Spring学习和实践指南。 第4版针对Spring 4进行了全面更新。全书分为四部分。第 1部分介绍Spring框架的核心知识。第二部分在此基础上介绍了如何使用Spring构建Web应用程序。第三部分告别前端,介绍了如何在应用程序的后端使用Spring。第四部分描述了如何使用Spring与其他的应用和服务进行集成。 本书是基于Python 3.6版本编写的。百万粉丝程序员带你轻松入门Python语言!5小时的完整视频教程,纯美式发音,搭配中文字幕,边看边练两不误;52个精心设计的编程习题,拒绝拖沓,提供项目案例,学以致用不务虚。 本书是一本Python入门书籍,适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用。这本书以习题的方式引导读者一步一步学习编程,从简单的打印一直讲到完整项目的实现,让初学者从基础的编程技术入手,最终体验到软件开发的基本过程。 本书用轻松的笔触,一步一步揭示了神经网络的数学思想,并介绍如何使用Python编程语言开发神经网络。本书将带领您进行一场妙趣横生却又有条不紊的旅行——从一个非常简单的想法开始,逐步理解神经网络的工作机制。您无需任何超出中学范围的数学知识,并且本书还给出易于理解的微积分简介。 本书为美亚五星畅销书,备受关注。基于Python3.5,全彩印刷,如果只选一本神经网络图书,他是首选。 本书是打破能力上升瓶颈之作。前端开发行业潜心近10年一直研究看似简单的CSS的人可谓是凤毛麟角,作者从2009年开始写原创技术文章,现在其博客已经成为国内访问量巨大的个人前端博客之一,可以说众多前端初学者是看着作者的博客成长的。 本书全面讲解了数据科学的相关知识,从统计分析学到机器学习、深度学习中用到的算法及模型,借鉴经济学视角给出模型的相关解释,深入探讨模型的可用性,并结合大量的实际案例和代码帮助读者学以致用,将具体的应用场景和现有的模型相结合,从而更好地发现模型的潜在应用场景。 本书可作为数据科学家和数据工程师的学习用书,也适合对数据科学有强烈兴趣的初学者使用,同时也可作为高等院校计算机、数学及相关专业的师生用书和培训学校的教材。 本书以一个名为EagleEye的项目为主线,介绍云、微服务等概念以及Spring Boot和Spring Cloud等诸多Spring项目,并介绍如何将EagleEye项目一步一步地从单体架构重构成微服务架构,进而将这个项目拆分成众多微服务,让它们运行在各自的Docker容器中,实现持续集成/持续部署,并最终自动部署到云环境(Amazon)中。 针对在重构过程中遇到的各种微服务开发会面临的典型问题(包括开发、测试和运维等问题),本书介绍了解决这些问题的核心模式,以及在实战中如何选择特定Spring Cloud子项目或其他工具解决这些问题。 美国经典教材,在美亚上,被评价为自Russell & Norvig的《人工智能:一种现代方法》之后更好的教材,更加适合本科生使用。 本书是作者结合多年教学经验、精心撰写的一本人工智能教科书,堪称“人工智能的百科全书”。全书涵盖了人工智能简史、搜索方法、知情搜索、博弈中的搜索、人工智能中的逻辑、知识表示、产生式系统、专家系统、机器学习和神经网络、遗传算法、自然语言处理、自动规划、机器人技术、高级计算机博弈、人工智能的历史和未来等主题。 Scrapy是使用Python开发的一个快速、高层次的屏幕抓取和Web抓取框架,用于抓Web站点并从页面中提取结构化的数据。《精通Python爬虫框架Scrapy》以Scrapy 1.0版本为基础,讲解了Scrapy的基础知识,以及如何使用Python和三方API提取、整理数据,以满足自己的需求。 本书适合软件开发人员、数据科学家,以及对自然语言处理和机器学习感兴趣的人阅读。 《Python程序设计 第3版》是面向大学计算机科学专业的教材。本书以Python语言为工具,采用相当传统的方法,强调解决问题、设计和编程是计算机科学的核心技能。 深入浅出讲解Spring Cloud组件、开发工具、框架等知识点; 使读者全面理解微服务的构建原理; 实例丰富,解释清晰,易于读者真正理解原理,并学以致用;问题、深入讲解Spring Cloud OAuth2,直击市场需求痛点。 本书既适合Spring Cloud初学者入门使用,又适合正在做微服务实践的架构师或打算实施微服务的团队作为参考用书,同时也可作为高等院校计算机相关专业的师生用书和培训学校的教材。 本书作者结合数年来从事互联网产品架构和设计工作的实践经验,加以融会贯通,概括并阐释了“以产品为中心”的互联网产品设计内在规律,以帮助产品设计师快速成长进阶。 本书延续了“破茧成蝶”系列图书的一贯风格,语言平实生动、视野取材广泛、案例贴近实际,图文并茂,适合处于不同成长阶段的产品设计师、产品经理、产品运营人员阅读参考。 点击阅读原文,购买榜单图书 阅读原文原始链接
点击此处,一键购买 《微信小程序开发入门精要》 作者:李宁 微信小程序开发入门精要 系统全面、循序渐进地介绍了进行微信小程序开发的各方面知识、经验和技巧。微信小程序开发入门精要 内容包含目前微信小程序支持的所有组件和API的详细介绍,以及使用方法演示,并附有大量的实例代码。 除此之外,还增加了一些高 级UI技术的介绍,例如WeUI、wx-charts等,这些高 级UI技术会使开发工作事半功倍。微信小程序开发入门精要 的zui后提供了完整的微信小程序项目案例,可以让读者在全面深入地了解了微信小程序开发的知识和技巧后,达到学以致用的目的。 点击此处,一键购买 《Java从入门到精通(精粹版)》 作者:张玉宏 以零基础讲解为宗旨,用实例引导读者学习,深入浅出地介绍了Java的相关知识和实战技能。 第Ⅰ篇【基础知识】主要讲解Java开发环境搭建、Java程序要素、常量、变量、数据类型、运算符、表达式、语句、流程控制、数组、枚举、类、对象以及方法等;第Ⅱ篇【核心技术】主要介绍类的封装、继承、多态、抽象类、接口、Java常用类库以及异常的捕获与处理等;第Ⅲ篇【高级应用】主要介绍多线程、文件I/O操作、GUI编程、数据库编程、Java Web、常用设计框架以及Android编程基础等;第Ⅳ篇【项目实战】主要介绍智能电话回拨系统、饭票网以及Hadoop下的数据处理等。 点击此处,一键购买 《Redis入门指南(第2版)》 作者:李子骅 本书是一本Redis的入门指导书籍,以通俗易懂的方式介绍了Redis基础与实践方面的知识,包括历史与特性、在开发和生产环境中部署运行Redis、数据类型与命令、使用Redis实现队列、事务、复制、管道、持久化、优化Redis存储空间等内容,并采用任务驱动的方式介绍了PHP、Ruby、Python和Node.js这4种语言的Redis客户端库的使用方法。
“大多数优秀的程序员从事编程工作,不是因为期望获得报酬或得到公众的称赞,而是因为编程是件有趣的事儿。” ——林纳斯·托瓦兹(Linus Torvalds) 在美国亚马逊,有一本书的影响力超高的Python入门书,Kindle版本在美国亚马逊网站的计算机软件、软件开发分类中排行均为第一,超越了众多实力派Python书,众多五星好评。也许你有所耳闻,这本书就是《Python编程无师自通——专业程序员的养成》 《Python编程无师自通——专业程序员的养成》作者是一名自学成才的程序员,作为一名文科生他通过自学编程,掌握了编程技能并在eBay找到了一份软件工程师的工作。这本书是作者结合个人经验写作而成,旨在帮助读者从外行成长为一名专业的Python程序员。 这本书可以满足几乎所有想要学习编程的初学者。本书适合高中、大学阶段想要自学编程的学生,以及其他行业想入门编程的人,同时也适合作为编程入门的培训教材。 《Python编程无师自通——专业程序员的养成》 作者:[美] 科里•奥尔索夫(Cory Althoff) 作者自述 我毕业于克莱门森大学政治学专业,曾考虑过是否选择学习计算机科学专业,还在大一那年报名参加了“编程概论”课程,不过很快就退出了。实在是太难了。毕业后我一直住在硅谷,我发现我需要学习编程。一年后,我成为了eBay公司的一名中级软件工程师。我不想让大家觉得这是很轻松就能做到的。实际上,这是极具挑战的一件事。在这一年的不断尝试努力过程中,我得到了很多乐趣。 刚开始,很多人学习的是如何用流行的编程语言Python来进行编程。但是本书不仅是教你如何使用某种特定的语言编程,还会介绍标准教材中所不包括的其他所有知识点。本书分享的是我在成为软件工程师过程中不得不自学的内容。不管你的目标是成为一名软件工程师、企业家,还是在其他的岗位上使用编程技能,你都是本书的目标读者。 学会一门编程语言还不够,你还需要学会其他技能,才能像计算机科学家一样地工作。我会教授大家我从编程新手到专业软件工程师过程中学到的一切。我写是为了向有志于编程岗位的人分享他们需要掌握的知识框架。编程概论的书籍都大同小异——用Python或Ruby介绍编程的基础知识,然后就让你自己摸索。我经常从读完类似书籍的朋友那听到这样的反馈:我现在该做什么?我还不是一名程序员,也不知道下一步该学什么。 本书,就是我给出的答案。 本书结构 本书中涵盖很多主题,作者的目标不是包罗你需要了解的每个主题的所有细节,而是提供一份指引——一个编程职业发展所需要的所有技能的导览。 ▌第一部分:编程简介。让你尽快写出自己的第一个程序,最好在今天。 ▌第二部分:面向对象编程简介。这部分将介绍不同的编程范式,着重阐述面向对象编程。你会开发一个游戏,体会编程的强大能力。读完这部分后你会沉迷于编程。 ▌第三部分:编程工具简介。将介绍提升编程生产力的不同工具。这时,你已经沉迷于编程,并希望变得更好。你将会学习相关的操作系统、使用正则表达式提升效率、安装并管理他人的程序,以及使用版本控制与其他工程师协作的知识。 ▌第四部分:计算机科学简介。将简要介绍计算机科学知识,主要涵盖两个主题——算法和数据结构。 ▌第五部分:找到工作。最后一部分是关于最佳编程实践,如何找到软件工程师的工作,团队协作以及程序员的自我提升。本文会分享如何通过技术面试与团队协作的建议,以及如何进一步提升自己的技能。 从终点出发 一般来说,你会先花很多时间学习理论,理论知识学的太多以至于许多计算机科学的毕业生甚至不知道如何动手编程。杰夫·阿特伍德(Jeff Atwood),在其博客“为什么程序员不会编程”中写道:“和我一样,许多人都碰到了这样的情况,编程岗位的200位申请者中,有199个根本不会写代码。重申一遍:他们一点代码都不会写。”这种现象直接促使Atwood发明了FizzBuzz代码挑战,一种用来在面试中筛选申请者的编程测试。大部分人都通不过测试,这也是为什么你要学习本书并掌握实践中要使用到技能。 《王者之旅》电影中的主角乔什(Josh Waitzkin),在《学习的艺术》一书中回忆了他如何反向学习国际象棋。他没有和其他人一样研究开局,而是从学习象棋残局。这样做让他对国际象棋有了更深的理解,并赢得了多次大赛冠军。与此类似,先学习如何编程再学习理论的方法更高效,因为你会拥有了解背后原理的强烈驱动。虽然理论很重要,但是在你拥有了编程经验之后,理论的价值才更大。 《王者之旅》电影截图 你不是一个人在战斗 毕业后再学习编程,已经越来越常见。Stack Overflow(一个程序员在线社区)在2015年的一份调查中显示,48%的受访者不是计算机专业却从事编程职业。 自学的优势 在eBay工作期间,作者的团队中有从斯坦福大学、加州大学和杜克大学计算机科学专业毕业的程序员,还有两名物理学博士。当时他25岁,而年仅21岁的同事对编程和计算机科学的知识比其强10倍这个事实,让作者尤其惶恐。 虽然与拥有计算机科学学士、硕士甚至是博士学位的同事一起工作的压力很大,但别忘记了你还有“自学的优势”。你选择读本文,不是出于老师布置的任务,而是因为你内心学习的渴望,这一点是你所拥有的最大优势。苹果公司的创始人斯蒂夫·沃兹尼亚克(Steve Wozniak)就是一位自学成才的程序员;还有因在美国宇航局的阿波罗登月计划中做出卓越贡献而获得总统自由勋章的玛格丽特·汉密尔顿(Margaret Hamilton);还有Tumblr 的创始人大卫·卡普(David Karp),Twitter的创始人杰克·多西(Jack Dorsey),Instagram 的创始人凯文·斯特罗姆(Kevin Systrom),他们都是自学成才的程序员。 为什么应该编程 不管你从事什么工作,编程都有助于你的职业发展。学习编程将给你自己赋能。你喜欢尝试新想法,时刻都有希望启动的新项目。学会编程后,你就可以坐下来自己实现,而不需要依赖他人。 编程也会提升你在其他方面的技能。因为你熟练掌握了问题解决能力,鲜有其他工作不会因此而受益。如我最近要在网上租房,搜索并筛选房子是个非常费力的活儿。但是我写了一个程序来代替我搜索,最后将结果以邮件形式发送给我。学会编程,将把你从重复性工作中解放出来。 如果你想成为软件工程师,市场上对这类岗位的需求也日益增长,但是符合要求的候选者却总是供不应求。到2020年,预计将有一百万个编程岗位空缺。即使你的目标不是成为软件工程师,科学和金融等领域的岗位也开始倾向那些拥有编程经验的申请者。 坚持不懈 如果你之前没有任何编程经验,担心自己无法胜任编程工作,但是你要相信自己:你完全有能力做到。人们对程序员有一些常见的误解,比如程序员都得擅长数学。这是错误的印象,不过编程确实是一件困难的工作。幸运的是,本书涵盖的内容将让这一切变得比你想象得更加容易。 为了提高编程技巧,你应该每天练习编程。挡在你面前的唯一障碍就是无法坚持,所以我们要采取一些措施确保自己能够坚持不懈。准备一张检查清单,来确保每天都有做练习,而且也能够帮助你保持专注。 如果你还需要其他帮助,效率专家Tim Ferris建议采用如下技巧来保持驱动力。事先给家人或朋友一笔钱,如果你在规定的时间内完成了目标,就让他们把钱还给你,否则就将钱捐献给你讨厌的机构。 本书使用的技术 为了让读者尽可能的积累编程经验,书中会介绍多种技术。在某些情况下,必须在许多不同的技术中做出选择。我们将会学习Git的基础知识。Git是一个流行的版本控制系统,选择介绍Git是因为笔者认为它已经成为版本控制的业界标准。书中用Python来编写大部分的编程示例,因为它是一门很流行的初学者语言,而且即使从来没有使用过Python的人学习起来也比较简单。此外,目前几乎每个领域对Python开发者的需求都非常大。不过,会尽量做到内容与技术无关——注重概念,而非技术本身。 《Python编程无师自通——专业程序员的养成》 每章结尾处都有术语表和挑战练习,让你更好地学习Python 3。 目录一览 第1章 概述 第2章 起步 第3章 编程概论 第4章 函数 第5章 容器 第6章 字符串操作 第7章 循环 第8章 模块 第9章 文件 第10章 综合练习 第11章 练习 第二部分 面对对象编程简介 第12章 编程范式 第13章 面向对象编程的四大支柱 第14章 深入面向对象编程 第15章 综合练习 第三部分 编程工具简介 第16章 Bash 第17章 正则表达式 第18章 包管理器 第19章 版本控制 第20章 融会贯通 第四部分 计算机科学简介 第21章 数据结构 第22章 算法 第五部分 找到工作 第23章 最佳编程实践 第24章 第一份编程工作 第25章 团队协作 第26章 更多学习资料 第27章 下一步 书单推荐 推荐1 Python编程快速上手——让繁琐工作自动化 作者:【美】Al Sweigart(斯维加特) 推荐2 “笨办法”学Python 3 作者:[美] 泽德 A. 肖(Zed A. Shaw) 推荐3 数据结构(Python语言描述) 作者:【美】Kenneth A. Lambert(兰伯特) 推荐4 Python核心编程(第3版) 作者:【美】Wesley Chun(卫斯理 春) 推荐5 Python编程从入门到精通 作者:叶维忠
《数据科学实战手册(第2版)》 [印度]普拉罕•塔塔(Prabhanjan Tattar) [美]托尼•奥赫达(Tony Ojeda) 肖恩•帕特里克•墨菲(Sean Patrick Murphy) 本杰明•本福特(Benjamin Bengfort) 阿比吉特•达斯古普塔(Abhijit Dasgupta) 著 本书的主要内容有:学习数据科学项目的流程,并使用它来获取、清洗、分析和可视化数据;在多个实战项目中理解数据科学的关键概念;通过一步一步的代码实例来掌握R和Python强大的数据编程能力。无论你是数据科学的新手,还是有经验的专业人士,你都可以从本书提供的89个实际案例中掌握数据科学的关键概念和利用R、Python进行数据编程的能力。 《持续交付2.0:业务引领的DevOps精要》 乔梁 著 持续交付是重要软件开发方法之一。本书分三个部分:第一部分作者根据自己近十年的工作及咨询经历,对原有的持续交付进行了修正,将持续交付重新定义为实现组织战略目标的能力,并引入持续交付的能力模型;第二部分阐述组织打造持续交付能力所需遵守的原则,包括基础原则、组织原则和架构原则;第三部分通过多个案例解读,阐述如何根据组织的当前状况和应用原则,并对最佳实践进行取舍,快速达到组织能力目标。 《Python编程无师自通——专业程序员的养成》 [美] 科里•奥尔索夫(Cory Althoff) 著 从Python 3 中开始学习编程,并构建第一个程序;通过学习“面向对象的程序设计”并创建一个强大的Python程序来让读者掌握技能; 学习使用Git、Bash、正则表达式和数据库等工具,然后使用学习的新编程技能来构建一个网络爬虫;学习计算机科学的基本原理,包括计算机架构、数据结构、算法和网络编程;学习为项目编程:涵盖了软件开发过程、测试和最佳编码实践;了解如何完成团队合作,并获得编程工作。 《机器人爱好者 第8辑》 美国SERVO杂志 著 Servo的内容主题范围很广,从可编程逻辑,到步进马达基础、无线电通信基础、机器人基础知识、自助操作、闭环系统、语音识别、视觉添加等,到产品和图书评论,构建自己的Bot和系统项目等等。诸如DARPA、机器人世界杯足球赛、FIRST、ComBots、水下机器人挑战赛等等活动的报道。
《Python数据分析(第2版)》 [美]阿曼多·凡丹戈(Armando Fandango) 著 Python作为一种程序设计语言,凭借其简洁、易读及可扩展性日渐成为程序设计领域备受推崇的语言。同时,Python语言的数据分析功能也逐渐为大众所认可。 本书就是一本介绍如何用Python进行数据分析的学习指南。全书共12章,从Python程序库入门、NumPy数组和Pandas入门开始,陆续介绍了数据的检索、数据加工与存储、数据可视化等内容。同时,本书还介绍了信号处理与时间序列、应用数据库、分析文本数据与社交媒体、预测性分析与机器学习、Python生态系统的外部环境和云计算、性能优化及分析、并发性等内容。在本书的最后,还采用3个附录的形式为读者补充了一些重要概念、常用函数以及在线资源等重要内容。 本书延续了上一版示例丰富、简单易懂的优点,非常适合对Python语言感兴趣或者想要使用Python语言进行数据分析的读者参考阅读。 《B/S项目开发实战 HTML+CSS+jQuery+PHP》 周菁 著 HTML、CSS和JavaScript是每个网页前端开发人员所需要的基础知识,而PHP则一般用于服务器端的数据交互操作。 因此,一个完整的B/S项目开发一般都是需要前端、后端工程师相互配合完成的。这么多的知识点,对于初学者来说,确实有点无所适从。本书从大家喜闻乐见的“记事本”入手,采用“项目实例驱动”的方法,让每一个从未接触过B/S开发的初学者可以无障碍地学习Web页面开发。 本书非常适合网站相关工作人员、大中专院校师生、培训班学员以及业余爱好者阅读。 《游戏设计的100个原理》 【美】Wendy Despain 著 本书整合了众多游戏设计秘籍,它概括并阐释了100条重要的游戏设计领域的方法、原理和设计哲学。 本书分4篇向读者讲述了游戏创新、创作、平衡和解决问题的100个原理。每一个专题都采用丰富的案例来介绍多种不同的设计思路,同时以经典图片的形式点出了该原理所蕴含的真谛。 本书为全彩设计,适合从事或学习游戏设计的专业人士阅读,读者将从本书中学到如何让游戏流行,如何让玩家痴迷,如何设置关卡以及如何解决游戏设计中的问题。
12月上市新书本次带来9本,涉及到的领域分别是Linux、大数据技术、软件测试、GO语言、Wireshark数据包、C++编程、IT运营等,从最新的书了解最新的技术,异步新书让你更好地应对快速变化的科技世界。点击此处直达活动。 《RISC-V架构与嵌入式开发快速入门》 胡振波 著 本书的姊妹版《手把手教你设计CPU——RISC-V处理器篇》已经出版,提供了一个非常高效的超低功耗开源RISC-V处理器学习案例——蜂鸟E203,并对其进行了全方面剖析和讲解,解决了在CPU硬件设计方面中文资料欠缺的问题。 《IT运维之道(第2版)》 李鹏 著 本书共分为五篇(机遇篇、做事篇、处事篇、技能篇和深入篇),从不同的层面阐述了IT运维人员应掌握的方法及相关知识与技能。 本书深入浅出、化繁为简,将信息化服务中晦涩的IT标准规范、流程体系用浅显易懂的方式娓娓道来。“机遇篇”以2013年的一个实际案例为背景,帮助读者进行职业规划,引导从业人员在“软件开发”和“IT服务”之间做出正确的选择。“做事篇”针对IT服务做什么、怎么做、怎么做好等问题进行了阐述,帮助IT服务人员梳理了工作思路,明确了工作目标和方向。“处事篇”从内外兼修两方面阐述了如何赢得人心。“技能篇”系统地介绍了运维服务涉及的IT技术和技能。“高级篇”深入浅出地介绍了当今国内外先进的IT服务标准、架构、体系和方法。 《分布式缓存——原理、架构及Go语言实现》 胡世杰 著 随着互联网的飞速发展,各行各业对互联网服务的要求也越来越高,互联网系统很多常见的存储类场景都面临着容量和稳定性风险。此时,本地缓存已无法满足需要,分布式缓存由于其高性能、高可用性等优点迅速被广大互联网公司接受并使用。 本书共分3个部分,每个部分都有3章。第1部分为基本功能的实现,主要介绍基于HTTP的in memory缓存服务、HTTP/REST协议、TCP等。第2部分介绍性能相关的内容,我们将集中全力讲解从各方面提升缓存服务性能的方法,主要包括pipeline的原理、RocksDB批量写入等。最后一个部分则和分布式缓存服务集群有关,主要介绍分布式缓存集群、节点的再平衡功能等。本书选择用来实现分布式缓存的编程语言是当前流行的Go语言。 本书适合从事缓存方面工作的工程师或架构师,也适合想要学习和实现分布式缓存的读者。 《软件调试(第2版):卷1:硬件基础》 作者:张银奎 本书堪称是软件调试的“百科全书”。作者围绕软件调试的“生态”系统(ecosystem)、异常(exception)和调试器 3 条主线,介绍软件调试的相关原理和机制,探讨可调试性(debuggability)的内涵、意义以及实现软件可调试性的原则和方法,总结软件调试的方法和技巧。 《全程软件测试(第3版)》 朱少民 著 本书系统地总结了过去十年中软件测试发生的变化,浓缩了作者许多宝贵的软件测试经验。本书首先介绍对于软件测试的不同看法,全程软件测试的思想,软件测试的基础设施与TA框架、团队能力建设;然后逐步深入到测试的计划、设计、执行、持续反馈和改进;接着,讨论全程测试的思想,包括全程静态测试、全程性能测试、全程安全性、全程建模、全程可视化。本书最后展望了软件测试的未来。 本书适合软件测试人员阅读,也可作为相关专业人士的参考指南。 《D3 4.x数据可视化实战手册(第2版)》 [加] 朱启(Nick Zhu) 著 本书旨在通过大量的示例和代码,向读者讲述如何利用D3 4.x来实现数据可视化。只要读者了解JavaScript,就能完全掌握本书的内容。 本书共13章,从如何搭建D3.js的开发环境开始,逐步介绍D3中的各种操作,其中包括选集、数据的初步处理、数据映射、坐标轴组件、动画过渡效果、SVG相关介绍、绘制图表、安排布局、可视化交互、力学模拟、制作地图和测试驱动。为了帮助读者理解这些丰富的概念,本书提供了大量的示例和代码。最后,在附录部分,为读者介绍了另外两个JavaScript库,主要是关于三维制图和多维图表的。 《Wireshark网络分析实战(第2版)》 [印度]甘德拉·库马尔·纳纳 著 本书是同名畅销图书的全新升级版,按部就班地讲解了 Wireshark的用法以及如何使用该工具解决实际的网络问题。 本书共分为19章,其内容涵盖了Wireshark版本2简介,熟练使用Wireshark排除网络故障,抓包过滤器的用法,显示过滤器的用法,基本信息统计工具的用法,高级信息统计工具的用法,Expert Information工具的用法,Ethernet和LAN交换,无线LAN,网络层协议及其运作方式,传输层协议分析,FTP、HTTP/1和HTTP/2,DNS协议分析,E-mail协议分析,NetBIOS和SMB协议分析,企业网应用程序行为分析,排除SIP、多媒体及IP电话故障,排除由低带宽或高延迟所引发的故障,网络安全和网络取证等知识。 《Java数据分析指南》 [美]约翰·哈伯德(John R. Hubbard) 著 当今,数据科学已经成为一个热门的技术领域,例如数据处理、信息检索、机器学习、自然语言处理、数据可视化等都得到了广泛的应用和发展。而Java作为一门经典的编程语言,在数据科学领域也有着突出的表现。 本书旨在通过Java编程来引导读者更好地进行数据分析。本书包含11章内容,详细地介绍了数据科学导论、数据预处理、数据可视化、统计、关系数据库、回归分析、分类分析、聚类分析、推荐系统、NoSQL数据库以及Java大数据分析等重要主题。 《Windows黑客编程技术详解》 甘迪文 著 本书介绍的是黑客编程的基础技术,涉及用户层下的Windows编程和内核层下的Rootkit编程。本书分为用户篇和内核篇两部分,用户篇包括11章,配套49个示例程序源码;内核篇包括7章,配套28个示例程序源码。本书介绍的每个技术都有详细的实现原理,以及对应的示例代码(配套代码均支持32位和64位Windows 7、Windows 8.1及Windows 10系统),旨在帮助初学者建立起黑客编程技术的基础。
十年前,《全程软件测试》第1版和广大读者见面了,它是朱少民老师在WebEx七年测试工作之结晶。这本书受到了读者的喜欢,甚至有好几家公司把这本书作为测试工程师的入职培训教材。 十年过去了,软件测试领域发生了很大变化,作者也发生了很大变化。虽然离开了WebEx、Cisco,离开了在企业一线的测试工作,来到了同济大学教书,但我一直没有失去和工业界的联系,而且不再局限一家公司的实践,视野更开阔了。作者和近百家公司的测试工程师都有交流,为他们提供测试培训、咨询等服务(包括为中国南车、华为2012实验室的研发能力中心等提供较长期的测试技术咨询服务)。 今天,作者对测试的理解和认识,相比自己写本书第一版、第二版时,在广度和深度方面都有了较大的提升。今天我们有幸采访了《全程软件测试(第3版)》作者朱少民,来看看他的所思所想。 朱少民老师异步社区:朱老师您好,听说您在软件测试领域已经耕耘了30年,您能向读者朋友们分享一下这30年的经历吗?您目前正在做哪些事情? 朱少民:三十年,可谓一言难尽。一句话,从大学体制内走出,在跨国企业工作十多年,又重新进入体制内(大学12年-公司11年-大学8年)。虽没有波涛汹涌,但也并非一帆风顺,甚至也有磨难。磨难也不是坏事,是对自己的心智的磨练,成为一个更健康、更有力量的人。如果要了解我的经历,可以参考两个材料: 第一个,自己为软件测试MOOC在线课程制作的一个介绍,做过一个视频,扫二维码。 扫描二维码,认识朱少民第二个,《赢在测试》(2010年版本,非“赢在测试2” )第10章内容。 《赢在测试:中国软件测试先行者之道》也许是由于大学的情结,所以喜欢学习和思考、喜欢写书,即使写书很累。目前在同济大学工作,教学与科研并行,侧重软件工程和软件测试领域,先后开设了《软件测试技术》、《软件质量保证与测试》、《软件工程》、《软件项目管理》、《软件过程管理》和《软件构造》等课程,也先后出版了六本教材,其中《软件测试方法和技术》问世十几年,其第3版是软件测试领域唯一一本国家级十二五规划教材,并获得上海普通高校优秀教材,《软件项目管理(第2版)》,获得国家工信部十二五规划教材。 在科研上,先后与中国中车、华为技术公司等合作,侧重软件质量管理和测试体系建设、软件测试技术提升和国内外软件测试技术前沿的研究与合作,最近两年关注人工智能技术应用于软件测试,致力于人机结对测试(man-machine pair testing)、探索式测试与工具自动化测试的有机结合。 同时,我也服务社会,走入企业,指导企业如何做好质量管理、需求分析、项目管理和软件测试等工作,包括咨询和企业内训。 异步社区: 从测试经理、QA总监到大学老师,您最喜欢哪段经历?每段经历都给您带来了哪些感悟,可以分享一下吗? 朱少民:还是喜欢公司那种气氛,有朝气、团队氛围浓厚,而且更实在,关注实际问题的解决,不像大学,有时迫于职称的压力,为了写论文而写论文,感觉是在自娱自乐。但我的周围是一批特别优秀的年轻学者(一方面我喜欢和年轻人交流,另方面喜欢那些务实的学者),他们来自清华、北大、南京大学、复旦、天津大学、、新加坡南洋理工……力图解决工业界遇到的难题,将科研和产业结合得很好,看到软件工程的研究步入正规,其研究真正能够产生有巨大工程价值的成果。 我从大学进入企业,是一家美国企业(webex,2007被思科以32亿美元收购),能接触到硅谷先进的思想和方法、优秀的实践等,自己也有幸在硅谷工作一年半,也深刻体会质量是构建的,测试不是一个阶段,而是贯穿整个生命周期,也深刻感觉国内质量管理和测试的落后,这些促进我动手写《全程软件测试》。我2005年设计的软件研发与运维质量管理闭环(如图1所示)——DevOps的雏形,从国内来看,今天依旧是先进的。 软件研发与运维质量管理闭环异步社区: 《全程软件测试(第3版)》从第一版到第三版,历时10年,每一次出版都融入了您的全新思考和经验沉淀,您觉得这些年来,测试有什么最显著的变化?测试人员的挑战和新要求是什么? 朱少民:最近在“云测试行业峰会”和“2018年度华为测试体系颁奖典礼”等多个场合上都谈到当今软件测试的现状以及所遇到的挑战。十多年前,如果企业有专职的测试团队、一个完整的测试流程、测试的设计能采用常规的测试方法、测试的执行和缺陷可以全程跟踪、会用工具进行性能测试,软件测试就算做得不错的。 今天,软件测试的确有长足的进步,例如: 1.重视持续集成(CI)建设、关注DevOps 2.非常关注自动化测试(TA) 3.多数公司建成(TA)测试平台 4.开始大量使用开源测试工具 5.代码静态分析有较大提升 6.大数据、云平台的测试初有成效 但也看到一些问题的存在: 1.内建质量文化没有形成,缺陷预防做得较差 2.热衷于招测试开发、重复造轮子,但自动化测试成效还比较低 3.热衷技术,而缺乏对测试自身的思考 4.面对软件开发新模式缺乏应对策略,如敏捷测试是形似而神不似 5.介入研发深度不够,测试效率偏低 6.许多困惑依旧困扰不少测试人员 开发新模式(敏捷、DevOps等)、开发新技术(AI、容器、微服务等)、软件新环境(云计算、物联网、工业App等)等对软件测试是挑战,也是机遇,被它们驱动。例如,我们可以利用新技术(如AI、容器、微服务)为测试服务。敏捷对测试挑战很大,要求测试高度的自动化,但是如果把敏捷做得很极致,ATDD、BDD或RBE等,需求即测试,测试反而变得很简单。 异步社区:您能概括一下《全程软件测试(第3版)》的最大亮点是什么?与前两版相比,它的这次升级,在内容、结构乃至布局思路上有哪些变化? 朱少民:《全程软件测试(第3版)》的最大亮点是能结合传统开发和敏捷/DevOps两种共存环境下来讨论测试,有点类似“双态(敏态和稳态)IT联盟”所提倡的测试敏捷化。过去三个月,我也参加了《测试敏捷化白皮书》的编写工作,从当初讨论敏捷模式下的测试,到后来改为“测试敏捷化”——哪些因素或障碍阻挡测试做得又快又好,如何从文化、组织、技术、流程来改进软件测试。 《全程软件测试(第3版)》,这次是全新改版,无论从结构还是从内容上都有很大的改变,仿佛是一本新书,只是基本思想——“全程软件测试”没变,而且今天看“全程软件测试”更彻底(测试不仅左移而且右移,DevOps模式)、更具价值,所以书名还取为《全程软件测试》。 从结构上看,更彻底展示全过程的软件测试,不仅用一章(第2章)来诠释“全程软件测试”的思想,而且将全程软件测试思想及其实践扩展到非功能测试——性能测试和安全性测试、全程静态测试、全程建模、全程可视化管理等。 从内容上看,增加了DevOps模式下的测试、微服务/AI/云计算的测试,还增加了测试思维的训练、个人测试能力提升路线图、团队测试过程改进。像360度看测试、安全性测试、测试建模等几章内容几乎是全新的,加强了测试分析,删除了测试的基本方法(黑盒和白盒方法)的详细介绍。 这些改变,可以进行两个版本的目录对比,并参考第3版前言。 异步社区:《全程软件测试(第3版)》得到了30多位测试专家、产品经理、研发负责人、大学教授的联袂推荐,在本书的出版过程中,您最大的收获是什么? 朱少民:这30位专家乐于推荐,也感受到友谊和温暖,同时他们也提出一些宝贵的意见,帮助我进一步思考和提升。感谢他们的支持和推荐。在测试领域,我的确有很多朋友,现在微信朋友圈有1500多人,感觉有1000多朋友都是测试的,有些朋友不够熟,但熟悉的朋友也超过两百人,有些熟识的朋友还身居比较高的位置,但也没办法让每一个熟悉的朋友推荐,没有被邀请的朋友是否会不高兴呢?我不确定。正好借此机会说明一下,这个过程,不体现关系疏远或亲近,希望朋友们能够理解。 异步社区:测试岗位的职责越来越细化,测试人员的工作边界也越来越模糊,具体体现在哪一点?您觉得测试人越来越焦虑的原因是什么?对于这些人有哪些建议? 朱少民:测试岗位的职责也不一定越来越细化,因为也有公司提倡“全栈工程师”、开发和测试的彻底融合,开发可以做更多的测试,不仅做单元测试、集成测试,也可以做系统测试;不仅做功能测试,也可以做性能测试、可靠性测试等。缺乏开发能力的测试人员,其发展会受到一定的限制,也可以说,缺乏测试能力的开发人员,其发展也会受到一定的限制。今天来看,专职的测试人员可能会减少,但测试这项工作更重要了,每个开发人员也需要掌握测试方法和技术、工具。 测试人焦虑可能来自于这种趋势——测试与开发越来越融合,有些公司追求更低的测试:开发比,而同时对编程、设计有一种畏惧感。这种担心没必要,测试工作始终有其存在的价值,测试做好了,都会有自己的岗位或在另一公司能找到测试的工作。即使专职的测试岗位少了,也可以转行做开发、产品经理。在南京参加IAS峰会,一位七牛云的技术总监说,学会AI所用的python,半天就够了。即使这样说,有些夸张,但学会一门编程语言不是很难的事,更何况多数测试人之前还有C/C++/Java的基础。 《全程软件测试》会帮助您提升自己,不仅仅是测试自身的提升,而且也包括在产品、开发和运维、思维能力等方面的提升,帮助您从客户/用户角度来构建正确、完整的质量观,帮助您构建系统的产品和运维的认识,学习解决问题的工程方法。 异步社区:经过近30年的工作积累,您对测试工作的感觉是否还如当年一样热衷?如何在繁重的工作压力下,保持初心呢? 朱少民:工作三十年,测试有近20年,感觉时间的确过得太快,20年弹指一挥间。也许是太投入了,更感觉时间如梭。 能保持初心,一方面是兴趣使然,另方面保持一颗学习的心。活到老学到老,不断学习,不断有新的东西,就感觉测试很有趣,值得探讨、研究和投入。聪明的人太多,天才可以不努力,但对我们这些才智平庸的人,只有专注,才能有点成就。 异步社区:针对刚毕业、初入职场的小白,您有什么建议? 朱少民:先要系统地看一本书,了解自己的工作全局,清楚领域的发展动态或未来趋势,然后了解自己的特长和兴趣,抓住1-2个方向,深入下去,不断进取,必有成就。就像《全程软件测试》所提供的能力图谱,给出三个方向,选择其中一个发展方向。同时,也像本书提出的T字型或双T型能力结构,有较宽的知识面,有1-2个深度发展的能力,是自己立于不败之地。当然,我们要善于学习,善于利用周围的资源(外部资源、公司内部资源、身边的资深人士等),这样会成长的更快。 异步社区:老师近期有写新书的打算吗?可以“剧透”一下新书的方向或者大致内容吗? 朱少民:原来计划写一本真正意义的《敏捷测试》,但由于教材优先,而且一进入高教出版社的出版计划,将重点打造一本《敏捷模式下的软件工程》教材,还要修订《软件过程管理》(出版十年,还在印刷,没有更新,对不起读者)、《软件测试方法和技术(第3版)》两本教材,之前刚完成《软件质量保证与管理(第2版)》的修订工作。 朱少民老师著作 《全程软件测试(第3版)》朱少民 著,人民邮电出版社 扫描二维码,一键购买本书系统地总结了过去十年中软件测试发生的变化,浓缩了作者许多宝贵的软件测试经验。本书首先介绍对于软件测试的不同看法,全程软件测试的思想,软件测试的基础设施与TA框架、团队能力建设;然后逐步深入到测试的计划、设计、执行、持续反馈和改进;接着,讨论全程测试的思想,包括全程静态测试、全程性能测试、全程安全性、全程建模、全程可视化。本书最后展望了软件测试的未来。 本书适合软件测试人员阅读,也可作为相关专业人士的参考指南。