接着《程序猿的呐喊》读书笔记(上)。继续分享下篇。这次干货比較多哦。有静动态类型的优缺点、强弱类型系统的对抗、设计模式、程序猿的数学、编译器的重要性以及保守派自由派的较量,一时消化不了的建议保存以便read it later。


静态类型和动态类型的优缺点

  1. 静态类型的长处
    以下列出了静态类型的主要长处:
    (1)静态类型能够在程序执行之前。依赖其与生俱来的限制来及早发现一些类型错误。(或是在插入/更新记录,解析XML文档等情况下进行检測。)
    (2)静态类型有很多其它机会(或者说更easy)优化性能。比如仅仅要数据模型完整丰富,那么实现智能化的数据库索引就会更easy一些。编译器在拥有更精确的变量和表达式类型信息的情况下能够做出更优的决策。
    (3)在C++和Java这样拥有复杂类型系统的语言里,你能够直接通过查看代码来确定变量、表达式、操作符和函数的静态类型。
    这种优势也许在ML和Haskell这种类型推导语言里并不明显,他们显然认为到哪里都要带着类型标签是缺点。

    只是你还是能够在有助阅读理解的情况下标明类型一而这些在绝大多数动态语言里是根本做不到的。
    (4)静态类型标注能够简化特定类型的代码自己主动化处理。比方说自己主动化文档生成、语法高亮和对齐、依赖分析、风格检查等各种“让代码去解读代码”的工作。换句话说,静态类型标签让那些相似编译器的工具更easy施展拳脚:词法工具会有很多其它明白的语法元素,语义分析时也比較少要用猜的。

    (5)仅仅要看到API或是数据库结构(而不用去看代码实现或数据库表)就能大致把握到它的结构和使用方法。
    还有其它要补充的吗?

  2. 静态类型的缺点例如以下:
    (1)它们人为地限制了你的表达能力。
    比方,Java的类型系统里没有操作符重载、多重继承、mix-in、引用參数、函数也不是一等公民。原本利用这些技术能够做出非常自然的设计,如今却不得不去迁就java的类型系统。不管是Ada还是C++,或是OCaml等不论什么一种静态类型系统都有这种问题。差点儿相同半数的设计模式(不光是Gof的那些)都是扭曲原本自然直观的设计,好将它们塞进某种静态类型系统:这根本就是方枘圆凿嘛。
    (2)它们会拖慢开发进度。

    事先要创建非常多静态模型(自顶向下的设计)。然后还要依据需求变化不断改动。这些类型标注还会让源码规模膨胀导致代码难以理解,维护成本上升。(这个问题仅仅在Java里比較严重,由于它不支持给类型取别名。)还有就是我上面已经提到过的,你得花很多其它的时间来调整设计。以适应静态类型系统。
    (3)学习曲线比較陡。
    动态类型语言比較好学。

    静态类型系统则相对挑剔,你必须花非常多时间去学它们建模的方式。外加静态类型的语法规则。

    另外。静态类型错误(也能够叫编译器错误)对于刚開始学习的人来说非常难懂,由于那时程序根本还没跑起来呢。

    你连用printf来调试的机会都没有,仅仅能撞大运似的调整代码,祈求能让编译器惬意。

    因此学习C++比C和Smalltalk难,OCaml比Lisp难,Nice语言比Java难。

    而Perl所具备的一系列静态复杂性—各种诡异的规则,怎么用,什么时候用等—让它的难度比Ruby和Python都要高。我从来没见过有哪门静态类型语是非常好学的。

    (4)它们会带来虚幻的安全感。

    静态类型系统确实能降低执行时的错误,提升数据的完整性。所以非常easy误导人们认为仅仅要能通过编译让程序跑起来,那它基本上就没什么bug了。人们在用强静态类型系统的语言敲代码时似乎非常少依赖单元測试,当然这也可能仅仅是我的想像罢了。
    (5)它们会导致文档质量下滑。
    非常多人认为自己主动生成的javadoc就足够了,哪怕不凝视代码也没关系。 Sourceforge 上充斥着这种项目,甚至连Sun JDK也经常有这个问题。

    (比方,Sun非常多时候都没有给static final常量加入javadoc凝视。


    (6)非常难用它们写出兼具高度动态和反射特点的系统。
    绝大多数静态类型语言(大概)都出于追求性能的目的,在执行时丢弃了差点儿全部编译器生成的元数据。可是这样一来这些系统通常也就非常难在执行时作出改动(甚至连内省都做不到)比方,若要想给模块加一个新函数,或是在类里加个方法,除了又一次编译,关闭程序然后重新启动之外别无他法。

    受此影响的不单是开发流程整个设计理念也难逃波及。你可能须要搭建个复杂的架构来支持动态功能而这些东西会无可避免地和你的业务代码混在一起。

  3. 动态类型的优缺点:
    仅仅要把上面的列表对调一下,你基本上就能够列出动态类型语言的优缺点了。

    动态语言的表达能力更强。设计灵活度也更大;易学易用,开发速度快;通常执行时的灵活性也更高。

    相对地,动态语言无法及时给出类型错误(至少编译器做不到)。性能调优的难度也比較高,非常难做自己主动化静态分析,另外。变量和表达式的类型在代码里非常不直观。没办法一眼看出来。
    静态语言终于会向用户屈服開始加入一些动态特性,而动态语言经常也会尝试引入一下可选的静态类型系统(或是静态分析工具)。此外它们还会设法改善性能添加错误检測,以便及早发现问题。非常遗憾。除非一開始设计语言的时候就考虑到可选的静态类型,否则强扭的瓜怎么也不会甜的。

强类型与弱类型系统的较量

  1. 以下我会以略微有点戏谑的方式解释这两种理念(指的是强类型和弱类型)的工作流程,尽可能将它们本质差别展现出来。
    强类型阵营基本是这样工作的:首先是依照当前的需求进行设计。制定出文档哪怕仅仅是初稿也没关系;然后定义接口和数据模型。如果系统要承受巨大流量,因此每一个地方都要考虑性能。避免採用垃圾收集和正則表達式这类抽象。(注意:即便是Java程序猿,通常也会努力避免触发垃圾收集,他们总是在開始敲代码之讨论对象池的问题。


    他们仅仅有在无计可施的情况下才会考虑动态类型。比如,一支採用Corba的团队仅仅有在极端情况下才会在每一个接口调用上加入一个XML字符串參数,这样他们就能绕开当初选择的死板的类型系统了。

    第二个阵营基本是这样工作的:先搭建原型。仅仅要你写代码的速度比写同等具体程度的文档快。你就能够更早地从用户那里获得反馈。依照当下的需求定义合理的接口和数据模型,可是别在上面浪费太多时间。

    一切以能跑起来为准。怎么方便怎么来。如果自己肯定要面对大量的需求变化,所以每一个地方首先考虑的是尽快让系统执行起来。能用抽象的地方就尽量用(比方如每次都去收集数据而先不考虑缓冲,能用正则的地方就先不用字符串比較)就算明明知是牛刀也没关系,由于你换回的是更大的灵活性。

    代码量比較少,通常bug的数量也会更少。
    他们仅仅有在被逼无奈的情况下才会进行性能调优以及禁止改动接口和数据定义。

    比如。一支Perl团队可能会将一些关键的核心模块用C重写。然后创建XS绑定。

    时间—长。这些抽象就渐渐变成了既定标准,它们被包裹在数据定义和仔细的OO接口里,再也无法改动。(就算是Perl程序猿也经常会忍不住祭出银弹,为经常使用的抽象编写OO接口)
    那你认为终于採用这些策略的结果会怎么样?

设计模式

  1. 只是如今大家都清醒过来了,不是吗?设计模式不是特性。

    工厂不是特性,托付、代理、桥接也都不是。它们仅仅是提供了美丽的盒子,以松散的方式来装载特性。

    可是别忘了。盒子、袋子和隔板自己也是要占用空间的。

    设计模式也不例外(至少在“四人帮”的书里所介绍的大多数模式都是这样)。更悲剧的是“四人帮”模式里唯一能精简代码的解释器(Interpreter)模式却被那些恨不得把设计模式纹在身上的程序猿忽略了。

    依赖注入是还有一个新型的Java设计模式。Ruby、Python、Perl还有Javascript,程序猿大概听都没听过吧。就算他们听过,他们也能正确地得出他们根本不须要这种玩意儿的结论。

    依赖注入是一种惊人的描写叙述式架构。让Java能在某些方面和更高级的语言一样,变得更动态一点。你猜得没错,依赖注入会让Java代码变得更大。

    变大是Java中无法回避的东西。成长是生活的一部分。Java就像是俄罗斯方块,只是积木和积木之间的空隙都填不满,结果仅仅能越堆越高。

    me:如今Java程序猿相信都知道依赖注入了,由于它太重要了,用在各大框架里,比方spring。依赖注入使得能够在文件中配置类及其各种关系。当然使得Java更灵活更强大了。

程序猿须要了解的是哪些数学分支?

  1. 实际生活中,计算机科学家经常使用的数学和上面那个列表差点儿没有重叠。其一。小学和中学里教的绝大部分数学都是连续的,也就是实数上的数学。而对计算机科学家来说。95%有趣的数学都是离散的。也就是整数上的数学。

    me:程序猿所要解决的数学问题一般都是离散数学。当中最实用的课程应该就是组合数学和概率论统计。

  2. 除了概率论和离散数学。其它数学分支也是有助于程序猿的。可惜除非你去辅修数学。否则学校是不会教你的。它们包括了:
    (1) 统计。我的离散数学书里讲到了一点。可是统计是一门完整的学科,并且是非常重要的学科,重要到根本不须要额外介绍。
    (2)代数和线性代数(比方矩阵)。线性代数应该紧跟在代数后面教。它不是非常难,并且在非常多领域都非常非常实用,比方机器学习。
    (3)数理逻辑。
    (4)信息论和柯氏复杂度。信息论(粗略地讲)主要是关于数据压缩的。而柯氏复杂度(相同粗略地讲)则是关于算法的复杂度(比方最小空间是多少,须要多长时间,程序或者数据结构有多优雅等)的。它们都是好玩,有趣,实用的学科。
    当然还有其它的分支。并且有些学科互有重叠。

    但重点在于:对你实用的数学和学校认为实用的数学是非常不同的。

  3. 微积分的本质就是连续一变化的速度,曲线下的面积,固体的体积。

    非常实用。记忆和非常多烦琐的步骤程序猿通常不须要这些东西。

    知道大致概可是须要大量的概念和技巧就能够了,细节方面等到须要的时候再查也来得及。

编译器,你懂吗?

  1. 我在招人的时候有一个诀窍。就是在寻找优秀的软件project师“通才”的时候。通常在简历上你能够看到到各种让你认为不行的keyword和词,但“编译器”是我唯一感兴趣的词。

    me:作者强烈要求程序猿学编译器原理。你还记得吗?

  2. 编译器会接收一串符号流,依据预先定义好的规则,分析出这串符号的结构。然后把它转换成还有一串符号流。是不是非常笼统?的确是。一幅图片能不能被当成是符号流?当然能够。

    它能够是每一行像素所组成的流。

    每一个像素就是一个数字。每一个数字就是一个符号。编译器当然能够转换图片。

    英语能够被当做符号流叫吗?当然能够。规则也许会非常复杂,可是自然语言处理的确能够被看成是某种非常炫的编译。

  3. 编译过程中第一个大阶段就是解析,即把输入的内容变成一棵树。中间要经过预处理,词法分析(也叫单词化)然后是语法分析和中间代码生成这几个步骤。词法分析一般是由正則表達式来完毕的。语法分析则是依据语法完毕。你能够採递归向下(最常见)或是解析器生成器(在小语言中比較常见)或是更炫的算来实现。仅仅只是对应的执行速度也会慢一点。不管怎样,最后的结果通常都是某解析树。
    第二个大阶段是类型检查。这是一群狂热的学术分子(包括他们的组织以及或者手下的研究生)他们自信能够写出非常聪明的程序,能分析出你的程序想干什么。并且在你出错的时候帮你指出。只是奇怪的是,他们并不认为自己是在研究人工智能毕竟人工智能界已经(明智地)放弃确定性的方法了。

    第三个阵营是代码生成。他们通常都被边缘化了。仅仅要你对递归有足够的了解,知道自己的祖先不是亚当和夏娃。那么代码生成还是挺直观的。这里要讲的事实上是优化就是那种生成足够正确的代码,让绝大多数用户都意识不到有问题的艺术。

    等等不好意思。这是亚马逊化。

    优化是指依据你那些昂贵的菜鸟程序猿写出来的垃圾代码生成“正确”代码的艺术。

保守派和自由派,你属于哪派?

  1. 软件project有自己的政治轴心,—端是保守派,另—端是自由派。
    毕竟“保守的”这个形容词基本上和慎重、厌恶风险就是同义词。金融上的保守主义经常(也是显而易见的)和年龄以及財富联系在一起。公司会随着时间逐渐变得保守起来。由于它们熬过过了各种法律诉讼、技术失败、公共危机、金融风暴等危机。连蚂蚁和蚱蜢的寓言故事都告诉我们寒冬将至。要储存食物。
    本质上,保守主义就是风险管理。
    相同自由派的观点经常和年轻、理想主义、天真无邪联系在一起。在企业里。创业公司往往是典型的自由派,一部分原因是他们本来就是为了(在一定程度上)改变世界而存在的(而自由主义原本就意味着变化),还有一部分则是他们必须全力以赴完毕投资人设定的目标,所以放弃一点软件安全也就变得合理(不得已)了。

    me:保守派,尽量修复全部bug,回避错误。学不会新语法,通过编译器安全检查。数据必须遵循事先定义好的格式,公共接口必须严格建模。生产系统里绝不同意存在危急过有风险的后门,安全性有疑虑就不能上线。快比慢好,注重性能。

    自由派则相反。

  2. 各大语言的分派:(作者自己使用语言的经验。仅供參考)
    难以言喻的自由:汇编语言
    极端自由:Perl、Ruby、PHP、脚本
    非常自由:Javascript、VB、Lua
    自由:Python、Common Lisp、Smalltalk/Sqeak
    温柔自由:C、Object-C、Schema
    温柔保守:C++、Java、C#、D、Go
    保守:Clojure、Erlang、Pascal
    非常保守:Scala、Ada、Ocaml、Eiffel
    极端保守:Haskell、SML

  3. (1)Facebook是极端自由的。

    他们主要用的是C++和PHP,他们的数据都放在memcached里:仅仅有键值对,没有数据库结构。他们把数据导出来放到一个后台Hⅳe数据仓库里,然后用Hadoop来进行离线数据分析。每两个星期左右他们仍然会举办通宵黑客马拉松,反正他们的程序猿大多都是单身男青年(至少我上次去參观的时候还是如此),股票的估值也还非常高(我上次查价格的时候好像已经没那么好了)。作为一家公司,Facebook是非常紧密的。具有非常强的执行力,十分注重程序猿在站点上公布新功能的单兵能力。没有什么官僚主义。这对一家规模这么大、用户那么多多的公司来讲是难能可贵的。保守派毫无疑问会厌恶蔑视他们。可是Facebook证明了不管具有什么世界观的程序猿,仅仅要联合起来。就能解决非常多问题。
    (2)Amazon是自由的。
    (3)Google是保守的。開始是有点自由的 ,然后就变得越来越保守了。

    仅仅有在刚刚開始的时候才是软件自由的。那时候的搜索引擎是用Python写的。

    随着公司不断壮大,他们非常快就转向了软件保守主义,而这全然是由project师自己主导的。他们写了非常多宣言警告太多语言所带来的危急,而仅有的几门语言里。也里,也有严格的风格指南,限制使用那些端保守。险”或者“难以阅读”的语言特性。
    (4)微软是难以言喻的保守。

转载于:https://www.cnblogs.com/blfbuaa/p/6946025.html

《程序猿的呐喊》读书笔记(下)相关推荐

  1. 《Spring Boot+Vue全栈开发实战》读书笔记

    写在前面 嗯,回家处理一些事,所以离职了,之前的公司用开源技术封装了一套自己的低代码平台,所以之前学的spring Boot之类的东西都忘了很多,蹭回家的闲暇时间复习下. 笔记整体以 Spring B ...

  2. 读书笔记《Spring Boot+Vue全栈开发实战》(下)

    本书将带你全面了解Spring Boot基础与实践,带领读者一步步进入 Spring Boot 的世界. 前言 第九章 Spring Boot缓存 第十章 Spring Boot安全管理 第十一章 S ...

  3. Spring Boot+Vue全栈开发实战——花了一个礼拜读懂了这本书

    很幸运能够阅读王松老师的<Spring Boot+Vue全栈开发实战>这本书!之前也看过Spring Boot与Vue的相关知识,自己也会使用了Spring Boot+Vue进行开发项目. ...

  4. Spring Boot 专栏全栈开发实战

    2020 年 11 月 12 日,Spring 官方发布了 Spring Boot 2.4.0 GA 的公告,链接为 Spring Boot 2.4.0 available now.为了让大家能够学习 ...

  5. 《1天搞定Spring boot +vue 全栈开发》后端学习笔记

    前言 课程 b站链接:1.课程介绍及环境准备_哔哩哔哩_bilibili 对springboot 的开发实践有很好的指导作用(原理涉及的不多),课程很干,适合初学者,但需要有Jave EE 基础. 涉 ...

  6. 《SpringBoot+vue全栈开发实战项目》笔记

    前言 Spring 作为一个轻量级的容器,在JavaEE开发中得到了广泛的应用,但是Spring 的配置繁琐臃肿,在和各种第三方框架进行整合时代码量都非常大,并且整合的代码大多是重复的,为了使开发者能 ...

  7. SpringBoot+vue全栈开发实战笔记太香了

    Spring 作为一个轻量级的容器,在JavaEE开发中得到了广泛的应用,但是Spring 的配置繁琐臃肿,在和各种第三方框架进行整合时代码量都非常大,并且整合的代码大多是重复的,为了使开发者能够快速 ...

  8. ehcache springboot_阿里内部进阶学习SpringBoot+Vue全栈开发实战文档

    前言 Spring 作为一个轻量级的容器,在JavaEE开发中得到了广泛的应用,但是Spring 的配置烦琐臃肿,在和各种第三方框架进行整合时代码量都非常大,并且整合的代码大多是重复的,为了使开发者能 ...

  9. spring boot @value_spring+vue全栈开发实战-第二章Spring Boot 基础配置-笔记0302-2020

    Spring Boot 基础配置 1. Web 容器配置 2.Properties 配置 3.类型安全配置属性 1. Web 容器配置 a.常规配置 在 Spring Boot 项 目 中,可以内置 ...

  10. 《Vue+Spring Boot前后端分离开发实战》专著累计发行上万册

                杰哥的学术专著<Vue+Spring Boot前后端分离开发实战>由清华大学出版社于2021年3月首次出版发行,虽受疫情影响但热度不减,受到业界读者的热捧,截至今日 ...

最新文章

  1. Python 字典的 使用
  2. 在Ubuntu 14.04 64bit上搭建Scala开发环境
  3. 【组队学习】【29期】9. 基于transformers的自然语言处理(NLP)入门
  4. MATLAB中的vpa函数简单实用记录——精度控制
  5. java正则测试_Java的正则表达式
  6. 查询手机号段对应地区编码_想知道海关统计数据吗?这里有详细的查询教程
  7. 被 C# 的 ThreadStatic 标记的静态变量,都存放在哪里了?
  8. jug java_架构大型企业Java项目–我的虚拟JUG会话
  9. 卡西欧82es计算机怎么玩游戏,卡西欧计算器fx82es-如何使用卡西欧fx-82es计算器计算矩阵 – 手机爱问...
  10. 前端学习(1378):express静态资源处理
  11. $(document).scrollTop()与$(window).scrollTop()
  12. 亏了1000万,卖房卖车也要坚持梦想,值吗?
  13. some ubuntu shell commands
  14. 230页10万字智慧城管系统整体建设方案
  15. Python xlsx转xls xls文件修复
  16. 云pos系统的服务器性能,实施云POS系统的五大优势
  17. Java 学生管理系统--------13
  18. ADC基本原理与STM32F030ADC应用
  19. python计算时间
  20. html上标下标标签 示例_带有示例HTML th表标题标签教程

热门文章

  1. 自研开源框架 Midway Serverless ,让前端提效 50% 背后的故事
  2. Linux纯干货知识总结|面试专用
  3. 前端生产方式:过去 10 年回顾和未来 10 年展望
  4. 双11稳定性负责人叔同讲述:九年双11的云化架构演进和升级
  5. 天谕手游与奥特曼联手,玩家看到有多么激动?
  6. pyecharts基础系列总结(含全系列文章路径)
  7. 程序员数学基础【二、时间复杂度】(Python版本)
  8. 使用Oracle的审计功能监控数据库中的可疑操作
  9. ORACLE的analyze及生成方式
  10. dubbo-admin构建问题总结