随记 - A Programmer's Rantings

A Programmer’s Rantings(中译名:程序员的呐喊)
作者是Google比较有名的程序员Steve Yegge(不过我之前没听说过就是了……),基本整本书都是他的吐槽……(但是个人觉得是很有建设性的参考)
这本书其实是上学期毕业季在楼道里捡的,丢在走廊靠中间的位置,想来是卖也卖不出去索性丢掉了。正好最近刚放假学不进去什么东西,索性拿来看看,结果发现挺有意思的,讲的东西有许多之前没接触过或者了解的很浅,所以顺便记一下,加上现在规划内的排个兴趣优先级一类的东西。

to do

语言

  • 1
    • c++
      • 以抽象为基础
      • 解析困难
      • 弱运行时反射/获取类型能力?
      • c++特性
    • c
    • Ruby
      • Perl>字符串处理Unix集成
      • Lisp>列表处理
      • Smalltalk>OO
      • CLU>迭代器
      • 缺乏原生线程支持
    • Lisp(Scheme)
      • 列表?
      • 基于Lambda演算的编程语言
      • 映射计算是如何进行的 vs C映射计算机如何工作
  • 2
    • Lua
    • Python
    • C#
    • Rust
    • PHP
    • Go
      • 语法上与 C 类似
      • 容易读写
      • 强类型的
      • 可用于前端和后端应用程序开发。构建并发应用程序
      • 可以转换为JavaScript
    • Java
      • 虚拟机、类库、安全模型、可移植字节码、监控工具、架构决策
      • 缺少传引用、typedef、宏、重载操作符、模板、多重继承
      • 接口 是很糟糕的设计
      • 缺乏“动词”,必须使用对象,函数不作为基本对象
  • 3
    • Perl
      • 开发效率高、unix集成
      • 高性能字符串处理
      • 不友好的列表和对象实现、多变量命名空间
    • Mozilla Rhino
    • Clojure
    • Erlang
    • Smalltalk

工具/框架

  • Emacs
  • Rails
  • Django
  • Ajax

概念

DSL领域特定语言 domain-specific language
  • 简介
    • 在需求分析阶段中为了解决需求收集过程中需求描述方/问题描述者(领域专家)与解决方案提供方(模型构建者)间互相理解困难而设计的专门工具。在需求收集中,首先需要理解问题方遇到的问题,然后将其映射到解决方案提供方的解决技术上,构建者通过对领域活动及其问题的理解,加上对技术解决方案的理解,提出解决方案模型。这个过程中双方使用的语言就被称为“共同语言”。共同语言称为解决方案模型构建者用来表达解决方案中的词汇的基础。构建者将这些共同语言对应到模型中,在程序中就是模块名、在数据模型中就是实体名、在测试用例中就是对象。
    • 从概念上说,程序的编写过程就是把业务领域中的问题通过代码或者程序模型表达出来:由于计算机的程序模型较为单一(归根结底都是运算和存储),通常情况下计算机程序不能与业务领域中的概念一致,或者具有某些直觉的对应。因此,软件的修改和可维护性并没有想象中的容易。必须不断地将业务领域中的概念转换成相应的代码模型,再进行修改。这种间接性直接造成了软件的复杂度。DSL的主要目的就是要消除这样的复杂度,以贴近业务领域的方式来构造软件,使我们不用费太多的气力就能看懂代码所对应的业务含义。
  • 特点
    • 用于专门领域,不能用于其他领域。表现力有限,其只能描述该领域的模型,而通用编程语言能够描述任意的模型
    • 不描述解答域,仅描述问题域
    • 有更高级的抽象,不涉及类似数据结构的细节
    • 供非程序员使用,供领域专家使用
  • 分类
    • 内部 DSL(从一种宿主语言构建而来)
      • 通用语言的特定语法,用内部DSL写成的脚本是一段合法的程序,但是它具有特定的风格,而且仅仅用到了语言的一部分特性,用于处理整个系统一个小方面的问题
      • 通常所用的框架实际上就是一种内部 DSL。比如 Rails 框架就是基于 Ruby 的用于 Web 开发领域的内部 DSL。
    • 外部 DSL(从零开始构建的语言,需要实现语法分析器等)
      • 不同于应用系统主要使用的语言,通常采用自定义语法,宿主应用的代码采用文本解析技术对外部DSL编写的脚本进行解析。如正则表达式
    • 语言工作台
      • 一种专用的IDE,用于定义和构建DSL,具体的讲,语言工作台不仅用来确定DSL的语言结构,而且是DSL脚本的编辑环境,最终的脚本将编辑环境和语言本身紧密的结合在一起
  • ……
    • 基于groovy的DSL
编程范式
  1. 命令式编程
    • 关注计算机执行的步骤,即按步告诉计算机先做什么再做什么
    • 常见通用编程语言 C C++ Python Java
  2. 声明式编程
    • 用数据结构的形式来表达程序执行的逻辑。告诉计算机应该做什么,但不指定具体要怎么做
      • 不需要创建变量用来存储数据
      • 不包含流程控制代码
    • SQL HTML CSS
  3. 函数式编程
    • 与声明式编程相似,只关注做什么而不是怎么做,但不仅仅局限于声明式编程
    • 最重要的特点是“函数第一位”,函数可以出现在任何地方
      • 作为参数传递给另一个函数
      • 将函数作为返回值
    • 纯函数式数据结构
    • CPS Continue-Passing Style 函数式编程风格
AOP面向切面编程
细胞自动机
  • 基本思想
    • 自然界里许多复杂结构和过程,归根到底只是由大量基本组成单元的简单相互作用所引起。细胞自动机主要研究由小的计算机或部件,按邻域连接方式连接成较大的、并行工作的计算机或部件的理论模型。用于模拟复杂事物的演化过程
  • 原理
    • 在一个平面上(以平面为例,但不限于二维平面)纵横相交的多条直线构成了许多网格,每一个网格被看作一个细胞。这些细胞可以具有一些特征状态,譬如被染成不同颜色。在每个特定的时刻每个细胞只能处于一种特征状态。随着计算机迭代计算过程的进行,全体细胞各自根据周围细胞的状态,按照相同的规则同时自动改变它本身的状态,这就构成了一台细胞自动机。
  • 分类
    • 固定值型:细胞自动机经过若干步运算便停留在一个固定的状态
    • 周期型:细胞自动机在几种状态之间周期循环
    • 混沌型:细胞自动机处于一种完全无序随机的状态,几乎找不到任何规律
    • 复杂型:细胞自动机在运行的过程中可能产生复杂的结构,这种结构既不是完全的随机混乱,又没有固定的周期和状态。只有这种有研究意义
神经网络
  • 神经网络是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。
  • 特征
    1. 非线性:非线性关系是自然界的普遍特性。大脑的智慧就是一种非线性现象。人工神经元处于激活或抑制二种不同的状态,这种行为在数学上表现为一种非线性关系。具有阈值的神经元构成的网络具有更好的性能,可以提高容错性和存储容量
    2. 非局限性:一个神经网络通常由多个神经元广泛连接而成。一个系统的整体行为不仅取决于单个神经元的特征,而且可能主要由单元之间的相互作用、相互连接所决定。通过单元之间的大量连接模拟大脑的非局限性。联想记忆是非局限性的典型例子
    3. 非常定性:人工神经网络具有自适应、自组织、自学习能力。神经网络不但处理的信息可以有各种变化,而且在处理信息的同时,非线性动力系统本身也在不断变化。经常采用迭代过程描写动力系统的演化过程
    4. 非凸性:一个系统的演化方向,在一定条件下将取决于某个特定的状态函数。例如能量函数,它的极值相应于系统比较稳定的状态。非凸性是指这种函数有多个极值,故系统具有多个较稳定的平衡态,这将导致系统演化的多样性。
  • 网络模型
    • 前向网络
      • 网络中各个神经元接受前一级的输入,并输出到下一级,网络中没有反馈,可以用一个有向无环路图表示。这种网络实现信号从输入空间到输出空间的变换,它的信息处理能力来自于简单非线性函数的多次复合。网络结构简单,易于实现。
    • 反馈网络
      • 网络内神经元间有反馈,可以用一个无向的完备图表示。这种神经网络的信息处理是状态的变换,可以用动力学系统理论处理。系统的稳定性与联想记忆功能有密切关系。
运行时类型识别RTTI(Run-Time Type Information)
  • 操作符支持
    • typeid:返回指针和引用所指的实际类型。
    • dynamic_cast:将基类类型的指针或引用安全地转换为派生类型的指针或引用。
元编程
  • 指某类计算机程序的编写,这类计算机程序编写或者操纵其他程序(或者自身)作为它们的数据,或者在运行时完成部分本应在编译时完成的工作。很多情况下与手工编写全部代码相比工作效率更高。编写元程序的语言称之为元语言,被操作的语言称之为目标语言。一门语言同时也是自身的元语言的能力称之为反射。
XML+DTD
  • Document Type Definition 文档类型定义,帮助编写合法代码,对xml文档的各个节点进行约束定义
  • 应用形式
    1. 内部DTD文档 <!DOCTYPE 根元素[定义内容]>
    2. 外部DTD文档 <!DOCTYPE 根元素 SYSTEM "DTD文件路径">
    3. 内外部DTD文档结合 <!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>
DAO DTO(Java)
  • 数据访问对象DAO(Data Access Object)是一个面向对象的数据库接口
  • DAO实现有下列几个组件:
    1. 一个DAO工厂类;
    2. 一个DAO接口;
    3. 一个实现DAO接口的具体类;
    4. 数据传递对象(有些时候叫做值对象)
  • 数据传输对象DTO(Data Transfer Object),是一种设计模式之间传输数据的软件应用系统。数据传输目标往往是数据访问对象从数据库中检索数据。数据传输对象与数据交互对象或数据访问对象之间的差异是一个以不具有任何行为除了存储和检索的数据(访问和存取器)。
NoSQL数据库 (Not Only SQL/非关系型数据库)
  • 分类
    • 键值(Key-Value)存储数据库
      • 使用哈希表,有一个特定的键和一个指针指向特定的数据。优势在于简单、易部署。但是如果只对部分值进行查询或更新的时候,Key/value显得效率低下
    • 列存储数据库
      • 用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。
    • 文档型数据库
      • 同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。
    • 图形(Graph)数据库
      • 图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。
  • 适用情形:
    • 数据模型比较简单
    • 需要灵活性更强的IT系统
    • 对数据库性能要求较高
    • 不需要高度的数据一致性
    • 对于给定key,比较容易映射复杂值的环境
  • 共同特征
    • 不需要预定义模式:不需要事先定义数据模式,预定义表结构。数据中的每条记录都可能有不同的属性和格式。
    • 无共享架构:相对于将所有数据存储的存储区域网络中的全共享架构。NoSQL往往将数据划分后存储在各个本地服务器上。因为从本地磁盘读取数据的性能往往好于通过网络传输读取数据的性能,从而提高了系统的性能。
    • 弹性可扩展:可以在系统运行的时候,动态增加或者删除结点。不需要停机维护,数据可以自动迁移。
    • 分区:相对于将数据存放于同一个节点,NoSQL数据库需要将数据进行分区,将记录分散在多个节点上面。并且通常分区的同时还要做复制。这样既提高了并行性能,又能保证没有单点失效的问题。
    • 异步复制:和RAID存储系统不同,NoSQL中的复制,是基于日志的异步复制。这样,数据就可以尽快地写入一个节点,而不会被网络传输引起迟延。缺点是并不总是能保证一致性,这样的方式在出现故障的时候,可能会丢失少量的数据
    • BASE:相对于事务严格的ACID特性,NoSQL数据库保证的是BASE特性。BASE是最终一致性和软事务。
攻击面(attack surface)
  • 指软件环境中可以被未授权用户(攻击者)输入或提取数据而受到攻击的点位(攻击矢量),包括:用户输入字段、协议、接口和服务等
Actor模型
  • Actor模型是一个概念模型,用于处理并发计算。它定义了一系列系统组件应该如何动作和交互的通用规则
  • 一个Actor指的是一个最基本的计算单元。它能接收一个消息并且基于其执行计算。这个理念很像面向对象语言,一个对象接收一条消息(方法调用),然后根据消息工作(调用对应方法)。Actors一大重要特征在于actors之间相互隔离,互相并不共享内存。一个actor能维持一个私有的状态,并且这个状态不可能被另一个actor所改变
  • 许多actors同时运行,但是一个actor只能顺序地处理消息。消息异步地传送到actor,所以当actor正在处理消息时,新来的消息应该存储到Mailbox
  • 当一个actor接收到消息后,它能做如下三件事中的一件:
    • 创建其他actors
    • 向其他actors发送消息
    • 指定下一条消息到来的行为
  • https://www.cnblogs.com/MOBIN/p/7236893.html
  • https://mp.weixin.qq.com/s/mzZatZ10Rh19IEgQvbhGUg
memcached
  • 高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。
Hive数据仓库/Hadoop
  • hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
  • Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
  • Hive 没有专门的数据格式。 Hive 可以很好的工作在 Thrift 之上,控制分隔符,也允许用户指定数据格式。
SOAP
敏捷编程
  • 以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
REPL
  • A read–eval–print loop (REPL), also termed an interactive toplevel or language shell, is a simple, interactive computer programming environment that takes single user inputs (i.e., single expressions), evaluates them, and returns the result to the user; a program written in a REPL environment is executed piecewise. The term is most usually used to refer to programming interfaces similar to the classic Lisp machine interactive environment. Common examples include command line shells and similar environments for programming languages, and is very characteristic of scripting languages.
凸优化**

  • 重构 (+数据建模、架构)
  • 设计模式
  • 软件模式
  • 算法设计手册
  • 算法导论
  • Java并发编程
  • 没有银弹
  • 人月神话

Abbr

  • TL;DR
    • Too long; Didn’t read
  • LGTM
    • Looks good to me (pass code review)
  • ABD
    • All but dissertation 除了论文都完成了,临门一脚放弃学位

关于软件工程政治轴心

保守派 / 自由派
根本分歧:安全性

  • 保守派
    • 主要考量安全性和性能
    • 次要灵活性和开发效率
    • 严格建模、安全检查、数据定义、静态类型
  • 自由派
    • 简练、灵活性、效率
    • 延缓优化阶段
    • 隐式
  • 通用
    • 算法、数据结构
    • 类型理论、信息伦理、计算理论
    • 具体数学、复杂度
  • 语言机制分类
    • 究极自由:汇编
    • 极端自由:Ruby、Rerl、PHP、脚本
    • 非常自由:JavaScript、VB、Lua
    • 自由:Python、Common Lisp、Smalltalk/Squeak
    • 温和自由:C、Object-c、Scheme
    • 温和保守:C++、Java、C#、D、Go
    • 保守:Clojure、Erlang、Pascal
    • 非常保守:Scala、Ada、Ocaml、Eiffel
    • 极端保守:Haskell、SML

关于学习

  • 时间分配决定了利用效率
  • 不劳无获——学习是一件很困难的事,要是觉得简单,那肯定是在摸鱼;不挑战做不到的新事物,不可能提高自己
  • 荒废时间比学习更让人痛苦
  • 挖坑第一定律——“If you find yourself in a hole, stop digging”
  • 持之以恒,习惯成自然

关于编程/计算发展

  • “摩尔定律就是胡扯”——并没有考虑并行/分布式计算的影响
  • 下一步发展可能要摆脱冯诺依曼机、图灵机,用适应并行计算的新系统体系和针对新体系设计的高性能新语言,例如采用细胞自动机进行无惧单点失败的并行计算模型

关于类型机制

根据对稳定性和灵活性的要求来选择

  • 静态类型的优点
    • 提前于运行时的编译时检测
    • 易于优化
    • 可读性
    • 简化代码自动化处理
    • 根据API和数据库结构就能大致把握结构和用法
  • 静态类型的缺点
    • 限制了表达能力
    • 拖慢开发进度
    • 学习曲线更陡
    • 导致文档质量下滑
    • 很难写出兼具高度动态和反射特点的系统
  • 设计优秀的弱类型系统比同样优秀的强类型系统更有竞争力

关于程序员的数学

  • 对于计算机相关专业来说,绝大多数接触的数学都是离散的
  • 需要掌握(广度优先)
    • 离散/概率论
    • 统计
    • 代数/线性代数
    • 数理逻辑
    • 信息论 关于数据压缩
    • 柯氏复杂度 关于算法的复杂度
    • 微积分
    • 数学基础 维基
  • 大多数情况下,忘掉算法和证明,了解作用和局限性,以及相互之间的关联。大胆跳过,跟着感觉走。
  • 体现
    • 神经网络
    • 遗传算法
    • 贝叶斯分类
    • 集群算法
    • 图像匹配

关于编译原理

  • 计算机科学本科极重要的课程
  • 整合了全部的计算机原理
    • 计算机架构 理解底层机器才能高效翻译
    • 操作系统
    • 计算理论
    • 编程语言
  • 体现
    • 写程序处理自己的代码库
    • 语法高亮功能
    • 新特性支持
    • 搜寻特定模式内容
    • 自动提取文档
  • 阶段
    • 解析
      • 预处理
      • 词法分析
      • 语法分析
      • 中间代码生成
    • 类型检查
      • 分析程序目的,指出错误
      • 未来可能要走向模糊逻辑/概率型处理方式
    • 代码生成
      • 优化=黑洞
      • 不予考虑

关于Google/面试

  • 面试拒人团的存在
  • 前期准备
    • 读数据结构/算法书:强化分辨问题的能力,识别出问题属于的类型,用什么算法和数据结构来解决
    • 找朋友随机出面试题进行模拟
    • 保持谦逊、开明、专注的态度
  • 现场表现
    • 不要试图转移话题或通过长篇大论讲故事来回避或糊弄,应该专注于问题,尽力完整地解答
    • 询问面试官是否强调语法细节等
  • 技术面试内容
    • 算法复杂度
    • 排序:快排/并归。永远不要试图去排序链表
    • 哈希表
    • 树:至少熟悉一种平衡二叉树的实现细节,红黑树/伸展树/AVL树
    • 树的遍历算法
    • 图:三种内存表示方法(对象和指针/矩阵/邻接表)优缺点
    • 图遍历算法:广深,复杂度优缺点和实现。Dijkstra A*算法
    • 遇到问题时首先考虑图算法,尤其是设计问题
    • NP问题
    • 操作系统
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值