当前位置: 首页 > 后端技术 > Node.js

后台好书阅读与推荐

时间:2023-04-03 16:16:03 Node.js

后台好书阅读与推荐这两年养成了买书看书的习惯。先后买了几十本书,却一直没有养成天天看书的习惯。习惯。今天突然想做一个决定:每天至少花1-3个小时看书。在这里我想对这两年读过的书做一个简单的总结,并对即将要读的书做一个计划,整理成一个书单供自己学习,同时我也会推荐给有需要的孩子。ps:本书只关注同一类的知识点,一般都是循序渐进的,越学越深入,顺序越具体。JavaScriptAdvancedProgrammingJavaScriptAdvancedProgramming(第3版)(豆瓣)https://book.douban.com/subje...可能有人会有疑问,后端为什么要学JavaScript?其实就是为了更好的使用node.js做铺垫。这本书说是高级编程,其实还是比较基础的,但难能可贵的是几乎囊括了所有的基础知识,而且对基础知识的讲解也比较深入,至少看完之后,你不会犯那些常见的错误(比如for循环绑定了变量i,这个问题几乎天天被问到(⊙﹏⊙)),可以知其然,知其所以然,说了一大堆最好实践,所以它真的很先进。后端的同学,只能看基础部分,浏览器相关的部分可以不看(当然时间多了也能看懂)。这本书有很多值得学习的地方。例如,建议始终在语句末尾添加分号,并始终在分支中添加花括号。虽然有一些小麻烦,但可以省去很多麻烦:提高解析器的性能,避免压缩错误,代码的可读性和可维护性更好。推荐使用===和!==而不是==和!=,这样可以保证代码中数据的完整性,避免歧义。with语句不仅容易造成混淆,还会影响性能,所以不推荐使用。函数按值传递参数,而不是按引用传递参数,更不用说基本类型了。即使是引用类型参数a,函数也不能修改a使指向堆中的另一个对象,所以也是传值。在给函数传递参数时,使用对象字面量{}来封装大量的可选参数,比直接命名多个参数更加灵活。提升函数声明,不提升函数表达式。apply和call的作用是扩大函数运行的范围,将函数与对象(调用者)解耦,从而可复用。构造函数与其对应的原型对象之间有指针相互指向,重写函数原型对象会切断已有对象与已有原型之间的联系。在创建自定义类型时,构造函数放置实例属性,原型放置共享方法和属性,既保证了共享,节省了内存,又保证了隐私,达到了封装的目的。使用延迟加载来提高代码执行效率。将函数中多次使用的全局对象保存为局部变量可以减少查询开销。O(1)用于变量和数组访问,O(n)用于对象属性访问。自减循环比自增循环好,如果是大数据集,甚至可以展开循环来提高性能。当然,这本书也有一些问题,主要是时效性。这本书主要是按照ECMAScript3来讲解,最多提到ECMAScript5,但是现在ECMAScript8已经有了,所以看相关部分的时候要注意查看最新的特性是否解决了一些问题(例如,es8提出Object.values先不用Object.keys直接获取对象的所有值,然后通过key遍历),这本书有个trade-off(顺便说一句,几乎所有的技术书,甚至我的文章,迟早都会有时效性的问题。毕竟我们处在一个大变革的时代,但这并不影响它们成为经典,只要我们有选择,取其精神,弃之不顾。形式)。深入浅出Node.js深入浅出Node.js(豆瓣)https://book.douban.com/subje...不同于一般的node书籍,这本书不是简单的关于如何使用npmAPI文档类书籍asexpress或者连连mysql都非常简单易懂。本书首先介绍了node的来源和使用,让我们知道它存在的意义,然后介绍了模块机制、异步IO的实现、异步编程解决方案、内存控制、缓冲区、网络编程、web应用、进程管理,测试,生产。这本书有很多优点:异步IO的讲解比较深入。首先说明node是单线程的,可以避免死锁和同步等问题,而它的异步IO本质上是在内核中使用了一个线程池,这样也可以达到充分利用多核的效果,提高吞吐量。对于异步编程的痛点,作者提到了发布-订阅模型、Promise、各种流程库。更重要的是,作者自己写了一个名为EventProxy的库。我自己也用过,可以说是非常好用了。这一章很好的帮助我们解决了深度嵌套的问题。内存控制讲的是分代垃圾回收机制。V8将内存分为新生代和老年代。新生代使用空间划分(from,to)和复制机制来回收非存活对象。如果新生代对象在多次复制后仍然存活,则将其移动到老年代,老年代采用标记清除和标记整理的方法。这种针对不同代使用不同算法的方法可以达到最高效的效果。和Java一样,垃圾回收也会让世界停止,所以尽量避免低效或频繁的垃圾回收(虽然老年代使用增量标记、延迟清理、增量整理来减少停顿时间),比如主动释放变量,减少使用closures等Buffer可以解决数据拼接时的中文乱码问题;IO直接使用buffer,网络传输可以提高吞吐量。多进程是为了最大化利用内核资源,句柄传递达到了多进程监听同一个端口的目的。将静态资源交给nginx或CDN等服务器处理,可以提高性能。本书的不足之处可能在于组织。感觉有点头重脚轻。比如对于初学者,一般希望先看看node是怎么做web或者网络服务的,体验一下成就感,然后再学习它的实现原理,书本倒过来;对于高级用户来说,后面的web和网络服务部分显得肤浅无用,有点鸡肋(⊙﹏⊙)。但是我们可以根据自己的需要选择性地阅读章节,就可以避免这个问题。Java编程思想Java编程思想(第4版)(豆瓣)https://book.douban.com/subje...这本书是经典之作,不是一本基础知识全面的入门书(Java核心技术卷1:基础知识(原书第9版)(豆瓣),这本书涵盖了所有的基础知识,不仅是浅尝辄止,而且有深入的探讨,所以也推荐),真的就像翻译的标题一样,它体现了Java的思想,是Java中一些精华的集合。我们不必按照作者的顺序阅读,而是可以根据自己的需要有选择地阅读。本书还融入了很多设计模式,需要我们去理解其中的思想。本书比较精彩的部分:将面向对象的程序员分为两类:“类创建者”(创建新数据类型的人)和“客户端程序员”(在自己的应用程序中使用现成数据类型的人),前者负责构建类,只打开必要的,隐藏其他细节(开闭原则),后者负责收集这些类来完成特定的任务。您需要采用最适合您的需求(和习惯)的计划方法。无论计划有多小,某种形式的计划都会比根本没有计划大大改善您的项目。当第一次创建一个对象或者访问这个类的静态字段和方法时,这个类会被初始化。静态初始化只会在第一次运行,其他字段会在每次创建对象时运行。我顺便总结一下对象的初始化过程:(1)Main类的每个父类按照从高到低的顺序初始化静态成员及其静态初始化块,不管静态成员是否私有。(2)主类静态成员的初始化,静态初始化块的初始化。//创建实例的时候,如果实例没有创建,下面的就不会执行(3)主类的父类会从高到低依次调用默认构造函数。在调用每个父类的默认构造函数之前,先初始化父类的非静态成员和非静态初始化块。(4)主类非静态成员的初始化,非静态初始化块的初始化。(5)调用主类的构造函数。final引用类型变量本身是不可变的,但是它所引用的对象是可变的(这个规则也适用于数组),所以不要指望一步就能达到常量对象的效果。当方法代码较少或者想禁止覆盖时使用final方法可以获得一定程度的性能提升。将方法调用与方法体链接起来称为“绑定”。如果绑定是在程序运行之前(由编译器和链接器,如果有的话)进行的,则称为“早期绑定”、“后期绑定”,这意味着绑定是在运行时进行的,以对象的类型为基础。后期绑定也称为“动态绑定”或“运行时绑定”。在Java中绑定的所有方法都使用后期绑定技术,除非方法已声明为final。这意味着我们通常不必决定是否应该进行后期绑定——它会自动发生。Java包含一个名为Throwable的类,它描述了所有可以作为异常“抛出”的东西。Throwable对象一般有两种类型(即“继承自Throwable”)。其中Error代表编译时和系统错误,我们一般不需要捕获(特殊情况除外)。异常是一种原始类型,可以从任何标准Java库类方法中“抛出”。此外,它们可以从我们自己的方法以及运行时突发事件中“抛出”。对于作为程序一部分的每个类,它们都有一个Class对象。也就是说,每写一个新的类,同时也创建了一个Class对象(更准确的说,保存在同名的.class文件中)。在运行时,一旦我们要生成该类的对象,用于执行程序的Java虚拟机(JVM)会首先检查是否加载了该类型的Class对象。如果尚未加载,JVM将查找具有相同名称的.class文件并加载它。上面说了,这本书也有时效性的问题,所以要查阅最新的Java8甚至Java9;同时本书代码过多,部分代码可以忽略不影响理解。这本书适合作为一本整体掌握Java的书,但是Java太大了。要真正详细掌握每一个知识点,比如多线程、网络编程、Spring,就得看专门的书,比如我接下来要讲的那本。Java并发编程实战Java并发编程实战(豆瓣)https://book.douban.com/subje...本书从并发和安全的基本概念入手,逐步深入。讲了用类库构建线程安全的类,然后讲了如何使用多线程提高吞吐量,Java中已有的一些多线程框架的使用,性能测试,最后讲了显示锁和原子变量等进阶知识点。基本涵盖了所有可以使用的多线程知识点。本书亮点:线程安全的定义:一个类在被多个线程访问时始终表现正确。线程安全类本身封装了必要的同步机制,调用者不需要采取进一步的同步措施。无状态对象必须是安全的。由不适当的执行时机引起的并发编程错误称为竞争条件。最常见的是先检查再执行的操作。例如,i++就是一个典型的例子。向无状态类添加状态。如果状态是线程安全的,那么这个类也是安全的,但是如果加入多个状态,每个状态都线程安全是不够的。还需要保证在一次操作中同时更新所有状态(如果每个状态都是独立的)内置锁是可重入的,也就是说获取锁的粒度是线程而不是调用,这意味着锁对应一个线程。锁机制可以保证可见性和原子性,而volatile只能保证可见性。ConcurrentHashMap使用分段锁机制来实现更大程度的共享。任意数量的读取线程都可以访问Map,并且可以并行化一定数量的写入线程。修改同一个Map,一般情况下,只有在需要独占访问Map的时候,才应该放弃使用ConcurrentHashMap。使用tryLock代替内置的永远等待的锁,可以消除死锁的可能性。确保线程在获取多个锁时使用一致的顺序也可以避免一些死锁。您不应该依赖于业务逻辑的线程优先级,因为这取决于平台并且无法得到保证。避免过早优化,首先使程序正确,然后在必要时提高运行速度——如果不够快的话。使用并发安全的容器类、读写锁、不可变对象、原子变量等替代排他锁,提高吞吐量。使用显式锁时,应该在finally中释放,因为它不会像内置锁那样自动释放。一般来说,公平锁(先到先得)的性能要比非公平锁低很多(几倍,几十倍)。必要时不要使用公平锁。非公平锁在统计意义上是公平的,只要就足够了,而ReentrantLock默认是不公平的,内置锁也是如此。上面说了,这本书的时效性也有问题,主要使用Java5和6,所以大家也要注意最新文档的对比(Java高并发编程实战(豆瓣)https://book.douban.com/subje..这本书时效性比较好,讲的是Java8,也比较通俗易懂,推荐~),另外关于Swing的部分可以跳过。JavaWeb高级编程JavaWeb高级编程(豆瓣)https://book.douban.com/subje...本书的强项在于本书几乎涵盖了javaweb的所有主流技术。手头有Java(⊙﹏⊙)……开玩笑的,书很大很厚,所以很全面,所以没看完,但是看的那部分真的让我觉得是一本好书。本书从servlet原理入手,讲jsp,循序渐进讲Spring。过渡是自然的,让人明白Spring存在的原因。然后讲了Hibernate(虽然我没看过),最后讲了Springsecurity。可以说是一气呵成。同时,它是有组织的和系统的。看完之后,你应该能够对Javaweb有一个整体的把握。本书亮点:多使用jdk7的trywithsource,有助于自动释放资源,减少错误。JavaEE一般采用child-first类加载方式,JavaSE一般采用parent-first类加载方式。Servlet是所有Web应用程序的核心类。它是唯一可以直接处理和响应用户请求并可以将处理工作委托给其他部分的类。javaEE7支持的唯一Servlet协议是http。表现层要和业务层分离,所以jsp中不要用Java代码,jsp表达式EL本身就足够强大了。Controller依赖Service,Service依赖Repository,Repository依赖数据库。这四者就像食物链中的食肉动物、杂食动物、植物和大自然。不同于传统的MVC架构,在这种架构中,Service才是真正的业务逻辑,而Controller负责不同的页面逻辑,比如网页和移动应用的API。这种架构可以重用真正的业务逻辑,这一点优于MVC。我觉得这本书唯一的缺点是它太厚了:-D,这吓坏了很多人(包括我)。HeadFirstDesignPatternHeadFirstDesignPattern(中文版)(豆瓣)https://book.douban.com/subje...这本书最大的特点就是讲的知识不拘一格,他不会跟你讲一个直面这个一个叫观察者模式,一个叫装饰者模式。。。但是通过一些通俗易懂的例子(会飞会叫的鸭子,气象站探测应用的搭建)和丰富的图例,游戏(使用认知科学方法)来说明不同设计模式的含义、用途、优点和缺点,令人印象深刻,易于理解和记忆。本书展示了许多有意义的设计原则,例如:封装变化,即找出应用程序中的变化,将它们分离,而不是将它们与未更改的代码混合在一起。所以,在设计系统的时候,就要开始考虑可能改变的东西,把它隔离起来,在做的过程中可能需要重构。毕竟,唯一不变的就是变化。针对接口编程,而不是实现。即变量的声明应该是超类,这样真正的行为在执行时会根据实际情况执行,而不会被超类的行为所束缚。多用组合,少用继承。组合比继承有更多的灵活性和更稳定的结构,而继承只有在确实是的时候才应该使用——a...对于设计模式的初学者来说,这本书似乎比四人组的设计模式更容易接受,因为没有那么严肃,没有那么迂腐,当然,如果你想认真学习,或者水平更高,还是看看四人组(豆瓣)https://book.douban。com/subje...这本书可以说是一本学习方法论或者工作方法论的书,在更高的层次上可以说是一本哲学书。本书原名ThePracticalProgrammer,即注重实效的程序员。全书的讨论围绕着关注实效展开,包括务实的理念(责任、改变、权衡、管理知识、沟通)、方法(避免重复、随时记录、估算)、工具(文本、shell、游戏、源代码控制)、偏执或特殊(标准契约、断言、异常使用)等。这本书从推荐的序言来看还是蛮精彩的:如果只是以正常的浏览方式阅读,很容易陷入“啊,我知道这个,啊,我明白这个,嗯,这个要注意了”的套路将来”。这种阅读方式只会加强你所知道的原有知识,不太可能将“以后需要注意的”全部内化。所以狂妄自大的读者一定会觉得“哈哈,高手就这些了,大部分我都知道”,而不是“是的,我还有很多需要注意的地方”。这段可以说是抓住了我的一个大问题。一直觉得看完书什么都懂了,但是真正开始做的时候还是一头雾水。这就是为什么我们在学校都有作业要做。体会非常深刻。定期投资于你的智力资产,比如每年学习一门新语言以开阔你的视野,每季度阅读一本书(是不是少了一点:-D)。不要重复自己,重复是维护的灾难(因为你可能不记得还有什么地方用过这个东西)。估计以避免意外。学会估计和发展到你对事物的量级有直觉的程度,你才能更好地判断任务的可行性。按合同设计,明确权责,解决待人接物难题。说实话,做了两个小项目后才真正意识到这个的重要性。没有文件和合同,只会拖延进度,到处推卸责任,士气不稳。分析工作流提高并发性,从而判断哪些任务可以并行,哪些不可以,从而更合理的安排,加快进度。当然,这是对大任务的处理方式,小任务我是用这些分析的时间做完的。这本书读起来很过瘾,但是实施起来确实不容易,我觉得应该反复看,因为每积累一些工作经验,都会遇到一些问题,对问题的理解也会更深刻书中提到的要点,这样才能更好的解决问题。ArchitectureistheFutureArchitectureistheFuture:ScalableWebArchitecture,Processes,andOrganizationsforModernEnterprises(原书第二版)(豆瓣)https://book.douban.com/subje...这本书可能会令人困惑乍一看以为是在讲架构,比如MySQL读写分离、redis集群、CDN、负载均衡等架构问题。看了介绍和第一章,发现不是这样的(⊙﹏⊙),原来前面有一大段空格都在讲人员结构,后面是技术结构。会不会有被骗的感觉?其实大可不必。这本书相当于站在更高的角度看问题。毕竟要做好技术方面的事情,离不开强大的团队和完善的人员管理。在结构上,本书分为4个部分:团队组织、管理与领导、构建可扩展技术平台与危机管理的解决方案、可扩展架构解决方案、大数据、云计算等新趋势的架构。我认为比较激动人心的一些点是:如果一辆汽车没有油量表和速度表,那么大多数人都不会考虑开这辆车。同样,系统也需要一系列的指标来帮助我们达到预期的效果。管理是推,领导是拉。领导者设定目标和路线图,管理层努力实现目标。责任不明确,就是有些事情没有人在做,或者一件事情是多人做的。直接后果就是进度滞后,效率低下。当您定义组织的角色和职责时,您就是在设计权力下放的蓝图。对于一个团队,如果少于6人,则无需单独组建团队。如果超过15人,管理者就很难管理,成员之间的沟通也会更加困难。因此,一个团队的人数应该根据管理者的能力、对人员的熟悉程度、要达到的目标共同制定。一般来说,相信自己被授权的人比那些认为自己只是在执行命令的人更有效率。在我的理解中,他们比较主观,有主人翁意识(ownership),自然会尽力而为。要把事情做好,而不仅仅是打工仔:-D。架构原则:监控设计使我们能够进行自我修复和自我诊断,在用户发现问题之前解决问题;多活数据中心可实现负载均衡和容灾;使用成熟的技术,谨慎采用在线系统中的新技术,因为通常故障率很高,我们一般可以自己做很多试验再决定是否使用;水平扩展而不是垂直扩展,即系统扩展性取决于更多的机器而不是更强大的机器。......2017.8.3后记7.26开始是手写的,但是为了更好的总结这些书,我全部翻了一遍再写。直到8.3才写完。我希望我能起到一些作用。以后会继续更新更多好书,涉及到Linux、Jvm、Redis、MySQL、Docker等,欢迎拍砖交流。我的主页-Mageek`sWonderlandhttp://mageek.cn/archives/33/