每个 CS 系学生都应该知道的事

英文:Matt

译文:伯乐在线 – 阿喵

链接:http://blog.jobbole.com/101168/

点击 → 了解如何加入专栏作者

考虑到计算机科学领域的膨胀增长,想要辨识现代计算机科学到底包含什么,成了一件有挑战性的事。我们系进行了这个讨论, 所以我整合一下自己的想法来当作这个问题的解答,“每个 CS 系的学生应当知道哪些事?”

我尝试从 4  方面来回答这个问题:

  • 学生想要获得好的工作应当知道哪些事?
  • 学生想要得到终生雇佣应当知道那些事?
  • 学生想要进入研究生院应当知道哪些事?
  • 学生想要有益于社会应当知道那些事?

下面我会把自己的想法分为现代计算机领域的一般性的原则和一些特别推荐两部分来写。

计算机系的学生:把本文当作自学指南随意使用。

作品集 portfolio ,而不是简历

自从计算机科学从工程学和数学分离出来之后,计算机程序行业就开始依靠简历来雇佣毕业生。

一份简历无法说明程序员的能力。

每一个计算机系的的学生都应当有其作品集。

一个作品集可以简单到是一个个人博客,上面有工程或实现的帖子。更好些的话每个工程的有其单独页面和可供公共浏览的代码(也许托管到 Github 或者 Google Code 上)。

对开源代码的贡献应当给出链接和说明。

一个代码作品集能够使雇主直接评价雇员的能力。

而 GPA 和简历却做不到。

教授应该设计课题来使作品集更出彩,学生在课程结束时应该花些时间更新这些课程项目。

示例

  • Edward Yang’s web site.(http://ezyang.com/)
  • Michael Bradshaw’s web site. (http://www.mjbshaw.com/)
  • Github is my resume. (http://pydanny.blogspot.com/2011/08/github-is-my-resume.html)

技术交流

在计算机科学界“独狼”已然成为濒危物种。

当代计算机科学家必须练习与非程序员清晰且有说服力地交流自己的想法。

在小公司,程序员能否和管理层交流她的想法能够影响到公司的成败。

不幸的是,单独增加一个课程并不能有什么改变(当然一个合理的科技交流课程没有坏处)。

应当提供给学生更多的机会来给予他们通过口头讲演的方式展示自己工作和想法。

特别推荐

我建议学生掌握一种演示工具,比如说 PowerPoint 或者(我最喜欢的)KeyNote。(抱歉,尽管我喜爱基于 LaTex 的演示工具,它们还是太静态了)。

不过,要是想生成漂亮的数学文档,LaTex 是无可比拟的。所有的科技课程的写作作业都应该以 LaTex 的形式提交。

建议阅读

  • Writing for Computer Science by Zobel.
  • Even a Geek Can Speak by Asher.
  • The LaTeX Companion.
  • The TeXbook by Knuth. (Warning: Experts only.)
  • Notes on Mathematical Writing.
  • Simon Peyton-Jones’s advice on How to Give a Good Research Talk.
  • My advice on how to send and reply to email.

一颗工程学的心

计算机科学不是完全的工程学。

但也差不多。

计算机科学家终会发现他们和工程师在一起工作。计算机科学家和传统的工程师需要说相同的语言——一种扎根于实分析、线性代数、概率论与物理学的语言。

计算机科学家理应掌握物理学中的电磁学,但要达到这一点,他们还需掌握多元微积分,(外加学习微分方程)。

在进行声音仿真时,精通概率论(通常还包括)线性代数是极有益处的。在说明计算结果时,对统计的牢固理解是无可替代的。

推荐阅读

  • Spivak 的 Calculus
  • Wasserman 的 All of Statistics: A Concise Course in Statistical Inference

Unix 哲学

计算机科学家应当习惯并且熟练使用 Unix 哲学的处理。

Unix 哲学(不同于 Unix 本身)是一种注重语言学抽象和整合来达到预期处理的方法。

在实践中,这意味着要习惯于命令行形式处理、文本文件进行配置和轻型IDE的软件开发。

特别推荐

考虑到 Unix 系统的流行度,当今的计算机科学家应当熟练地掌握基本的 Unix 能力:

  • 浏览和操作文件系统
  • 使用管道进行组合操作
  • 习惯于使用 emacs 和 vim 编辑文件
  • 新建、修改和运行一个软件项目的 Makefile 文件
  • 编写简单的 shell 脚本 学生在不理解 Unix 哲学强大能力时会抵制它。此时最好让学生尝试完成一些 Unix 有相对优势的有用的任务,比如:
  • 找到指定目录下占用空间最大的5个文件夹
  • 找到计算机中重复的 MP3 文件(相同的文件内容而不是文件名)
  • 找到名字列表中姓名首字母是小写的名字,并调整大小写
  • 找到第二个字母是 x,倒数第二个是 n 的英语单词
  • 把你的手机的声音输入经由网络传送到另一台电脑的音响播放
  • 把指定文件夹下的文件名中的空格替换为下划线
  • 报告指定 IP 地址接入 web 服务器的最近十个错误连接

建议阅读

  • The Unix Programming Environment by Kernighan and Pike.
  • The Linux Programming Interface: A Linux and UNIX System Programming Handbook by Kerrisk.
  • Unix Power Tools by Powers, Peek, O’Reilly and Loukides.
  • commandlinefu.
  • Linux Server Hacks.
  • The single Unix specification.

系统管理

一些计算机科学家嘲笑系统管理是一件“IT”任务。

他们的想法是可以自学技术人员能做得到的所有事。

这是正确的(嗯,理论上是)。

然而计算机科学家能够完全且安全地控制他们的系统和网络的态度是有些误导人的。

软件开发中很多任务不传给系统管理员来做是最高效的。

特别推荐

每个当代的计算机科学家应当能够:

  • 安装和管理一个 Linux 发行版
  • 配置和编译 Linux 内核
  • 使用 dig、ping 和 traceroute 命令来排解故障
  • 编译和配置 web 服务器,比如 apache
  • 编译和配置 DNS 守护进程,比如 bind
  • 使用文本编辑器维护一个站点
  • 自己制作水晶头

建议阅读

  • UNIX and Linux System Administration Handbook by Nemeth, Synder, Hein and Whaley.

编程语言

编程语言有周期的兴起与衰落。

而一个程序员的职业不应如此。

尽管教授与获得工作相关的语言很重要,学生能够自学新的编程语言也同等重要。

学习怎样学习新的编程语言的最好方式是学习多种编程语言和编程范式。

学习第n个语言的难度是第(n – 1)个的一半。

然而,要想真正理解编程语言,应该自己实现一个。理想情况下,每个计算机科学系的学生都参加过编译的课程。至少,每个学生应该实现一个解释器。

一些语言

下面的编程语言涵盖了编程范式和实际应用:

  • Racket
  • C
  • Javascript
  • Squeak
  • Java
  • Standard ML
  • Prolog
  • Scala
  • Haskell
  • C++ 和
  • 汇编

Racket

Racket,作为功能全面的 Lisp 的方言,有着极简单的语法。

对少部分的学生来说,这种语法是一种学习障碍。

不过坦率地讲,如若一个学生觉得即使是暂时接受一种相异的语法规则也是很大的脑力障碍的话,他缺乏从事计算机科学职业的灵巧心智。

Racket 丰富的宏系统和高阶编程组件彻底打破了数据和代码的分别。

如果教的合理,能够充分发挥 Lisp 的能力。

建议阅读

  • How to Design Programs by Felleisen, Findler, Flatt and Krishnamurthi.
  • The Racket Docs.

ANSI C

C 是对底层(硅)的简洁至极的抽象。

C 在嵌入式系统的编程中无可替代。

学习 C 能提供对冯·诺依曼体系的深入理解,其程度没有其他语言能匹拟。

考虑到差的 C 编码与普遍的缓冲区溢出安全隐患有着亲密的关系,程序员学习正确地编写 C 程序是很重要的。

建议阅读

  • ANSI C by Kernighan and Ritchie.

Javascript

Javascript是动态、高级语言比如 Python、Ruby 和 Perl 的语义模型的很好的一个代表。

作为 web 原生语言,它的实用性优势是独一无二的。

建议阅读

  • JavaScript: The Definitive Guide by Flanagan.
  • JavaScript: The Good Parts by Crockford.
  • Effective JavaScript: 68 Specific Ways to Harness the Power of JavaScript by Herman.

Squeak

Squeak 是最纯正的面向对象语言 Smalltalk 的现代方言,它展现了“面向对象”的本质。

建议阅读

  • Introductions to Squeak

Java

Java 将保持流行久到无法将其忽略。

建议阅读

  • Effective Java by Bloch.

Standard ML

Standard ML 是 Hindley-Milner 系统的一个干净实现。

Hindley-Milner 类型系统是现代计算计算机领域最伟大(然而却是最不知名)的成就。

尽管有着指数级的复杂性,Hindley-Milner 的类型推断对于正常的程序来说是足够快的。

类型系统支持复杂的结构化不变量表达,事实上,它丰富到类型定义良好的程序经常是没有 bug 的。

建议阅读

  • ML for the Working Programmer by Paulson.
  • The Definition of Standard ML by Milner, Harper, MacQueen and Tofte.

Prolog

尽管在应用上占有一席之地,逻辑编程是计算思维的另一种范式。

在程序员需要在其他编程范式里模拟逻辑编程时,理解逻辑编程是值得的。

另一种值得学习的逻辑编程语言是miniKanren。miniKanren强调纯粹的逻辑编程。这个约束逐步形成了另一种风格的逻辑编程称为关系程序设计,并且它授予通常Prolog程序不支持的属性。

建议阅读

  • Prolog Tutorial.
  • Another tutorial.

Scala

Scala 是定义良好的函数式与面向对象的融合语言。

Scala 是 Java 应该做到的样子。

建立于 Java 虚拟机之上,并兼容现存的 Java 代码库,Scala 最有可能成为 Java 的后继者。

建议阅读

  • Programming in Scala by Odersky, Spoon and Venners.
  • Programming Scalaby Wampler and Payne.

Haskell

Haskell 是 Hindley-Milner 语言家族的王冠。

充分利用惰性求值,Haskell 是主流编程语言中最接近于纯数学的。

建议阅读

  • Learn You a Haskell by Lipovaca.
  • Real World Haskell by O’Sullivan, Goerzen and Stewart.

标准 C++

C++ 是无法避免的灾祸。

但是既然必须要教 C++,那就教全。

特别地,计算机科学系的学生毕业时应该掌握模板元编程.

建议阅读

  • The C++ Programming Language by Stroustrup.
  • C++ Templates: The Complete Guide by Vandevoorde and Josuttis.
  • Programming Pearls by Bentley.

汇编

任何汇编语言都行。

既然 x86 很流行,最好学它。

学习编译器的最好方式便是学习汇编,因为汇编直观地展示了将高级代码转化为低级代码。

特别推荐

计算机科学家应该理解产生式编程(宏编程);词法(动态)范围;闭包;continuation;高阶函数;动态调度;子类型;模块和函子还有不同于其他特定语法的 monads 语义概念。

建议阅读

  • Structure and Interpretation of Computer Programs by Abelson, Sussman and Sussman.
  • Lisp in Small Pieces by Queinnec.

离散数学

计算机科学家必须要对形式逻辑及其证明有牢固的理解。代数操作和自然推理证明是处理例程任务的有力方法,归纳总结证明在构建递归函数时很有用处。

计算机科学家必须对形式数学记号很熟悉,并且对基本的离散数学结构–集合、元组、队列、方法和幂集能进行的严格推理。

建议阅读

对于计算机科学家,掌握这些理论很重要:

  • 树;
  • 图;
  • 形式语言;和
  • 自动机 学生应该学习足够多的数论知识来研究和实现基本的加密协议。

建议阅读

  • How to Prove It: A Structured Approach by Velleman.
  • How To Solve It by Polya.

数据结构和算法

学生应该必须见过常见(或者罕见但异常有效的)数据结构和算法。但是,比起知道特定算法和数据结构(这些经常是很容易查阅到的),计算机科学家应该理解知道如何去设计算法(比如贪心、动态规划策略等)并且知道如何将理想中的算法真正实现。

特别推荐

对于想获得长期雇佣关系的计算机科学家来说至少要知道这些:

  • 哈希表;
  • 链表;
  • 数;
  • 二分查找树;和
  • 有向、无向图 计算机科学家应该可以实现或者扩展操作这些数据结构的算法,包括增删改查特定元素。考虑到完备性,计算机科学家应该知道每个算法的指令式和函数式实现。

建议阅读

  • CLRS.
  • Any of the Art of Computer Programming series by Knuth.

理论

理解理论是在研究生院进行研究的先决条件。当能提供了一个问题的hard boundaries(或者是提供转化为最初是hard boundaries的方法) 时理论是无价的。

计算复杂度可以说是所有计算机“科学”的真正的预测理论之一。

计算机科学家必须 知道易处理性和可计算性的程度,如果忽略了这些限制,最好的情况是有些挫折,最差的情况是导致失败。

特别推荐

在本科阶段,理论至少应涵盖计算模型和计算复杂度。

计算模型应该包括有限状态自动机、正则语言(和正则表达式)、下推自动机、上下文无关语言、形式文法、图灵机、lambda 演算和不可判定性。

在本科阶段,学生至少要学习足够复杂的知识来理解 P、NP、NP-Hard 和 NP-Complete 的区别。

为了防止留下错误的印象,学生应该通过将一些 NP 的问题规约到 SAT(Boolean satisfiability problem,布尔可满足性问题)并使用 SAT 求解程序求解。

建议阅读

  • Introduction to the Theory of Computation by Sipser.
  • Computational Complexity by Papadimitriou.
  • Algorithms by Sedgewick and Wayne.
  • Introduction to Algorithms by Cormen, Leiserson, Rivest and Stein.

架构

对软件架构有见识的理解是无可替代的。

计算机科学家应该从晶体管起理解一个计算机。

架构的理解包含一些标准的抽象:晶体管、逻辑门、加法器、多路复用器、触发器、算术逻辑单元、控制单元、缓存和随机存取存储器。

对高性能计算 GPU 模型的理解在可预知的未来是很重要的。

特别推荐

要想在现代系统上达到高性能对缓存、总线和物理内存管理的理解是很重要的。

要想理解机器架构,学生应该设计和仿真一个小的 CPU。

建议阅读

  • nand2tetris, which constructs a computer from the ground up.
  • Computer Organization and Design by Patterson and Hennessy.
  • “What every programmer should know about memory” by Drepper.

操作系统

任何足够大的程序最终都将成为一个操作系统。

正因如此,计算机科学家应该知道内核是如何处理系统调用、分页、调度、上下文切换、文件系统和内部资源管理的。

对操作系统的理解仅次于对编译器和实现高性能的架构的理解。

理解操作系统(我想当然也包括运行时的系统)在对嵌入式系统进行编程是非常重要。

特别推荐

学生必须在一个真正的操作系统上动手实践,在 Linux 和虚拟化技术的帮助下,这比之前容易些。想要对内核有很好的理解,学生应该:

在启动过程中输出 “hello world”;

设计他们自己的调度器;

修改分页策略;

创建他们自己的文件系统

建议阅读

  • Linux Kernel Development by Love.

网络

考虑到网络的普遍性,计算机科学家应该对网络栈和网络中的路由协议有坚实的理解。

对计算机科学家来说,在不可靠传输协议(比如 IP)的基础上构建可靠的传输协议(比如 TCP)的机制不应是不可思议的而应是核心知识。

他们应该理解在协议设计中的权衡—比如,什么时候选择 TCP,什么时候选择 UDP。(程序员需要知道在大型网络中有阻塞,他们也应更大规模地使用 UDP。)

特别推荐

考虑到当代程序员进行网络编程的频繁性,理解现存协议标准是有用的:

  • 802.3 和802.11;
  • IPv4 和 IPv6;
  • DNS, SMTP 和HTTP. 计算机科学家应该理解包冲突时的指数回退和在拥塞控制中的加法增大和乘法减少机制。每个计算机科学家应该实现:
  • 一个 HTTP 的客户端和守护进程;
  • 一个 DNS 解析器和服务器;以及
  • 一个命令行的 SMTP 的邮件程序 要想通过网络介绍课程,每个学生都应该使用wireshark来嗅探他们导师的谷歌搜索。

也许要求每个学生基于 IP 来从头实现一个可靠的传输协议是有些强人所难了,但可以说这是我学生时代的一个对我个人改变很大的经历。

建议阅读

  • Unix Network Programming by Stevens, Fenner and Rudoff.

安全

一个悲伤的事实是大多数安全漏洞都来源于粗心的编码,更悲哀的事实是很多学校在训练程序员编写安全代码上做的很差。

计算机科学家必须知道程序被攻破的方式。

他们需要形成防御型编码的意识——考虑他们自己的代码可能被攻击的方式。

安全最好在整个课程体系中分布开来进行训练:每个学科都应该提醒学生关于这个学科的原生漏洞。

特别推荐

每个计算机科学家至少应该了解:

  • 社会工程;
  • 缓冲区溢出;
  • 整数溢出;
  • 代码注入漏洞;
  • 竞态条件;
  • 权限混淆 一些读者指出计算机科学家也应知道基本的 IT 安全措施,比如选择合理的好密码和使用 iptables 配置防火墙。

建议阅读

  • Metasploit: The Penetration Tester’s Guide by Kennedy, O’Gorman, Kearns and Aharoni.
  • Security Engineering by Anderson.

密码学

密码学使得我们的大部分数字生活成为现实, 计算机科学家应该理解并能够实现下面的概念,并且知道实现这些的常见陷阱:

  • 对称密码系统;
  • 公钥密码系统;
  • 安全哈希函数;
  • 询问-响应认证;
  • 数字签名算法;
  • 门限密码系统 在实现这些密码系统时有个常见的错误——为手头工作获得 足够 随机的数,而这是每个计算机科学家应该知道的。
  • 最后,如此多的数据泄露表明,计算机科学家应该知道如何在存储密码时进行加盐和哈希处理。

特别推荐

每个计算机科学家应该有使用手工统计工具来破解使用前现代加密系统的密文的乐趣。

RSA 是容易实现的 ,每个人都应试试。

每个学生都应创建他们自己的数字签名并在 apache 上建立 https 连接(做这个是出乎意料的费劲)。

学生还应该写一个使用 SSL 进行连接的 web 客户端。

作为实践,计算机科学家应该知道如何使用 GPG、ssh 的公钥认证、加密一个文件夹或者硬盘。

建议阅读

  • Cryptography Engineering by Ferguson, Schneier and Kohno.

软件测试

软件测试必须贯穿整个课程体系。一个软件工程的课程可以涵盖基本的测试风格,但是只有练习才能掌握这项艺术。

应该根据学生上交的测试用例来给他们打分。

我使用学生上交来的测试用例来对其他学生进行测试。

学生看起来并不很在意防御性的测试用例,但是当向同学下手时却很是不客气。

用户体验设计

程序员大多是给其他程序员写程序,或者更糟糕,给他们自己写。

用户接口设计(更宽泛的讲,用户体验设计)可能是计算机科学最不受重视的方面。

即使是在专家之间也有这种误解,即用户体验是一种无法被教授的“软”技能。

在现实中,现代用户体验设计根植于人因工程学和工业设计中的人工经验。

如果没有别的办法,计算机科学家至少应知道接口执行任何任务的难易程度应该与任务的频率与重要性的乘积成比例。

为实用性考虑,每个程序员应该习惯于使用 HTML、CSS 和 Javascript 等设计可用的 web 接口。

建议阅读

  • Paul Graham’s essay on Web 2.0.
  • “The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets” by Spolsky.
  • HTML and CSS: Design and Build Websites by Duckett.
  • JavaScript: The Definitive Guide by Flanagan.

可视化

好的可视化是可以将数据表现为人类可以感知的信息,而做到这点并不容易。

现代世界是数据的海洋,而开发人眼感知的局部最大值是理解这些信息的关键。

建议阅读

  • The Visual Display of Quantitative Information by Tufte.

并行化

如今并行化比以往更落后、更丑陋。

不幸的是要掌握并行化需要对架构:多核、缓存、总线、GPU 等等有很深的理解。

并且需要练习,大量练习。

特别推荐

并行化的“终极”答案还不得而知,但是一些领域特定的解决方案已经给出。

当下学生应该学习 CUDA 和 OpenCL。

线程是脆弱的并行化抽象,特别是引入缓存和缓存一致性之后。但是,线程很流行且微妙,所以值得学习,Pthread 是一个合理的轻量库。

对于对大规模并行化感兴趣的人来说,MPI是首要条件。

在理论上,map-reduce 是经久不衰的。

软件工程

软件工程的原理改变地和编程语言一样快。

一个好的动手实践的团队软件开发练习能够展现出软件工程固有误区并提供关于这些误区的工作知识。 一些读者建议说学生应该分为三人一组并且在不同的项目中轮流当作组长。

学习如何与现存大代码库打交道是每个程序员的必备技能,并且最好是在学校而不是在工作中掌握此项技能。

特别推荐

所有的学生都应知道集中版本控制系统如 svn 和分布式版本控制系统如 git。

对于调试工具如 gdb 和 valgrind 的使用很长时间后会有裨益。

建议阅读

  • Version Control by Example by Sink.

形式化方法

随着对安全可靠软件的需求提高,形式化方法也许将是开发这种软件的唯一方法。

当前软件的形式化模型和证明还很有挑战性,但是这项领域的进程是稳健的:一年比一年容易。

也许在当前的计算机系学生的有生之年,形式化软件开发能成为一种预期技能。

每个计算机科学家应至少熟练使用一种定理证明器(我认为具体是哪一种并不重要)。

学习使用定理证明方法能够立刻影响代码风格。

比如说,一个人本能的不愿写无法覆盖所有可能性的 match 和 switch 语句,。

再比如当写递归函数时,使用理论证明方法的人有很强的欲望去消除 ill-foundedness。

建议阅读

  • Software Foundations.

图形仿真

没有学科比图更能体现“聪明”。

这个领域是由“足够好”驱动甚至由之定义的。

因此,没有比图形仿真更好的方式来教授巧妙的编程和进行性能优化。

我所学到的半数编码技巧都来自于对图的学习。

特别推荐

简单的光线追踪器可以在百行代码内实现。

实现从 3D wireframe engine 获取 3D 投影是费些脑力的。

类似于 BSP 的数据结构以及类似于 z-buffer 渲染的算法是巧妙的设计的例子。

在图形仿真领域,还有很多其他实例。

建议阅读

  • Mathematics for 3D Game Programming and Computer Graphics by Lengyel.

机器人

机器人是教授编程入门的最具吸引力的方式之一。

并且随着机器人的价格持续走低,哪一款将引发个人机器人浪潮成为了门槛。

对于会编程的人来说,个人机器自动化的伟大时代即将来临。

相关推荐

  • Multitouch gesture control for a robot.

人工智能

仅是考虑到对早期计算历史的特大影响,计算机科学家也应学习人工智能。

即使人工智能的最初梦想还远未实现,人工智能在一些领域已有成效,比如机器学习、数据挖掘和自然语言处理等。

建议阅读

Artificial Intelligence by Russell and Norvig.

机器学习

除去出色的技术技术优点,对“relevance engineer”工作岗位的需求增大表示出每个计算机科学家都应该了解一下基本的机器学习。

机器学习也更加强调了理解概率论和统计的重要性。

推荐阅读

Machine Learning by Mitchell.

数据库

数据库十分常见和有用以至于人们常常忽略它。

理解支撑数据库引擎的数据结构与算法是有用的,因为程序员经常需要在一个大的软件系统中实现一个数据库系统。

在sub-Turing 的计算模型的极大成功背后关系代数和关系计算起了极大的作用。

比起 UML 模型,ER 模型更适于可视化编码设计和约束的软件设计。

建议阅读

  • SQL and Relational Theory by Date.

非特定的阅读推荐

  • Gödel, Escher, Bach by Hofstadter.
  • Nick Black’s advice for MS students.

还有什么?

由于我自己也是知识盲点的,所以上面这些建议也是有局限的。

如果还有哪些应当包含但没有列出的东西,请大家在评论中补充。

How to Learn JavaScript Properly

Source: http://javascriptissexy.com/how-to-learn-JavaScript-properly/

Learn JavaScript Properly (For Beginners and Experienced Programmers)

This study guide, which I also refer to as a course outline and a road map, gives you a structured and instructive outline for learning JavaScript properly. In fact, you will find two study guides below, one for absolute beginners and the other for experienced programmers and web developers.

Our Career Paths and Courses Website Is Now Live

Learn.Modern Developer Launched

Our first cohort is in session: 97% of our first cohort on target to graduate. Enroll in the second cohort. Career Path 1: JavaScript Developer and Career Path 3: Modern Frontend Developer usually fill up quickly.

https://learn.moderndeveloper.com

You do want to learn JavaScript. I presume you are here for that reason, and you have made a wise decision. For if you want to develop modern websites and web applications (including an internet startup), or if you want a high-paying developer job ($75K to $250K+), JavaScript is undoubtedly the best web-development language to learn today, unless you want to develop native iOS or Android apps exclusively. And while there exist ample online resources to teach you JavaScript, finding the most efficient and beneficial method to learn the “language of the web” can be a frustrating endeavor. This study guide streamlines and simplifies the process; it has proven successful in helping thousands, and thousands more read and follow it each day.

Study Groups
People have started study groups for this study guide. You can find such groups on Reddit here and here, and other places, including Code Crew Meetup.

What You will Learn

You will learn the JavaScript language (up to advanced-intermediate, if you follow the “Beginners” study guide; or up to advanced, if you follow the “Experienced Programmers” study guide). You will also learn HTML, CSS, jQuery, and Git. And you will build a simple HTML/CSS website, an interactive HTML/CSS/JavaScript website, and a moderately sophisticated JavaScript quiz application.

  • Receive Updates

How Will Your Life Change After You Learn JavaScript Properly?

Maybe you will look more lovely and have a kinder, more pleasant personality after you learn JavaScript properly. Who knows? I don’t know.

But I do know that you will emerge more confident, more assured in your ability, and amply trained with a highly valued skill—a skill more valuable than most college degrees. For as a JavaScript developer, you will have the capacity not only to create whatever startup or web app you imagine, but also to work, making a handsome salary, as a front-end or full-stack developer, developing modern and futuristic applications. In fact, if you have never developed any kind of application before, you will experience ecstasy, so exultant and euphoric that you will want to enthusiastically practice more and build something—anything, like a hungry chef discovering a furnished kitchen with every tool, every utensil, and a stocked refrigerator.

It is worth noting that unlike just a couple of years ago—when you needed to know a true server-side language (such as PHP, Rails, Java, Python, or Perl) to develop scalable, dynamic, and database-driven web applications—today you can do as much and more with JavaScript alone.

This is the flourishing and glorious age of the JavaScript developer.

Be Empowered

This course outline transcends an entire semester of college coursework. If you complete the study guide, you will have learned enough programming to develop modern web applications, and with a bit of experience and a couple of completed projects, you will have become a sought-after programmer. Indeed, JavaScript developers are in high demand today. But you must prove your worth by developing a few impressive (interesting and non-trivial, though not necessarily complex) web applications.

How NOT To Learn JavaScript

  • Do not try to learn JavaScript the first time from bits of unrelated or related JavaScript tutorials online; this is the worst way to learn a programming language. It could work for some after countless such tutorials, but it is an inefficient process that lacks the proper hierarchical structure needed for learning a subject matter thoroughly. And this could lead to your being stuck quite frequently, when you start to build websites and web applications with the language. In short, you will not have the know-how—the comprehensive knowledge—you need to use that language as a tool—as your tool.
  • In addition, some will recommend you learn JavaScript from “JavaScript: The Good Parts,” by the venerable Douglas Crockford. While many regard Mr. Crockford as a JavaScript godfather, his book, The Good Parts, is not the best JavaScript book for beginners. It does not explain JavaScript’s core concepts in a detailed, clear, and easily digestible form. I do recommend you follow Crockford’s advanced videos, however, as part of the Learn Advanced JavaScript road map.
  • And do not try to learn the language by using only Codecademy; while you will learn how to program bits of small JavaScript tasks, you will not have learned enough to build complex web applications. Nonetheless, below I do recommend Codecademy as a supplemental learning resource.

Resources for the Two Study Guides

I have outlined two different study guides below, one for beginners and one for experienced web developers.

  1. Beginners should follow the Learn JavaScript Properly Study Guide for Beginners and get this book:
    Beginning JavaScript.Experienced programmers and web developers should follow the Learn JavaScript Properly Study Guide for Experienced Programmers and get this book:
    — The paperback Version: Professional JavaScript for Web Developers (3rd Edition)
    — The Kindle Version: Professional JavaScript for Web Developers (3rd Edition)
  2. Sign up for an account on Stack Overflow (a FREE service). It is a forum for asking and answering programming questions. This website will be considerably more useful than Codecademy for answering your programming questions, even very basic, seemingly stupid (remember, there is never a stupid question) questions.
  3. Sign up for an account on Codecademy. We will complete 4 Codecademy tracks. Codecademy is an online platform to learn programming: you can write code on their website, right in your browser. (It is also a FREE service.)
  4. JavaScriptIsSexy.com (this blog :) ): We will read 4 articles
  5. CodeSchool.com: We will complete 1 free course

Resources:
Beginning JavaScript (4th Edition)
— JavaScriptIsSexy.com (4 articles)
— Codecademy.com (4 tracks)
— CodeSchool.com (1 short course)
Notice for Visual Learners: If you are a visual learner, that is, if you prefer to see lots of images, schematics, and the like when learning a topic, you may find JavaScript and jQuery: Interactive Front-End Web Development more appealing than the Beginning JavaScript book. If you do get the JavaScript and jQuery book, note that the chapters are similar enough that you can use it (instead of Beginning JavaScript) to follow this study guide, though you will have to modify the sections a bit.

Learn JavaScript Properly Study Guide for Beginners

Prerequisite: Completed at least some high school (no programming experience necessary)

The Level of JavaScript Covered in this Study Guide: Absolute Beginner to Intermediate

How to Get the Best Out of This Study Guide

Type out and test every example code you encounter in the book. You can type the code and tweak it (experiment with it) in Firefox’s or Chrome’s console. The browser console is an area of the browser where you can write and run JavaScript code. Or use JSFiddle. JSFiddle is a web application that allows you to write and test your code online, right in your browser. You can test all sorts of code, including a combination of HTML, CSS, and JavaScript (and jQuery).

Don’t use Safari. I recommend Chrome, but if you use Firefox, get the Firebug Add on for Firefox; use it for testing and debugging your code.

Watch this Firefox’s and Chrome’s Console Tutorial on YouTube.

And watch this Chrome Dev Tools Tutorial (also on YouTube) to learn how to use Chrome Dev Tools.

Also, work all the end-of-chapter exercises.

Let’s get to work.

Weeks 1 and 2

Week 1: Making a Website with HTML and CSS; Learn JavaScript Data Types, Functions, Control Flow, and Loops

  1. Codecademy.com: If you do not already know HTML and CSS, complete the Web Fundamentals Track on Codecademy.
  2. Codecademy.com: Then follow the Make a Website track to make your first little website, using what you learned above.
  3. Beginning JavaScript: Read Chapter 1 (Introduction to JavaScript and the Web) and Chapter 2 (Data Types and Variables).
  4. Beginning JavaScript: Read Chapter 3 (Decisions, Loops, and Functions).
  5. Codecademy.com: Work through the JavaScript Track on Codecademy. Specifically, work through these sections: “Introduction to JavaScript,” “Functions,” “‘For’ Loops in JavaScript,” “‘While’ Loops in JavaScript,” and “Control Flow.”
  6. Beginning JavaScript: Read Chapter 4 (Common Mistakes, Debugging, and Error Handling).

Week 2: Learn JavaScript Objects, the Browser Object Model (BOM), and Events; Learn jQuery

  1. Beginning JavaScript: Read Chapter 5 (JavaScript — An Object- Based Language).
  2. JavaScriptIsSexy.com: Read my article, JavaScript Objects in Detail
  3. Codecademy.com: Work through the last three sections of the Codecademy JavaScript track: “Data Structures,” “Objects 1,” and “Objects 2.”
  4. Beginning JavaScript: Read Chapter 6 (Programming the Browser).
  5. Beginning JavaScript: Read Chapter 15 (JavaScript Frameworks), and stop just after you complete this section: “Digging Deeper Into jQuery”.
  6. Codecademy.com: Work through the entire jQuery Track on Codecademy.

Weeks 3 and 4

Week 3: HTML Forms and Frames; JavaScript Strings; Build Your First Interactive Website

  1. Beginning JavaScript: Read Chapter 7 (HTML Forms: Interacting with the User).
  2. Beginning JavaScript: Read Chapter 8 (Windows and Frames).
  3. Beginning JavaScript: Read Chapter 9 (String Manipulation).
  4. Codecademy.com: Now, make your first cool website. Work through the entire Make an Interactive Website track on Codecademy.

Week 4: JavaScript Date, Timers, and Cookies

  1. Beginning JavaScript: Read Chapter 10 (Date, Time, and Timers).
  2. Beginning JavaScript: Read Chapter 11 (Storing Information: Cookies).

Weeks 5 and 6

Week 5: JavaScript “this,” Variable Scope, and Hoisting, the DOM, JavaScript XML, and AJAX

  1. JavaScriptIsSexy.com: Read my post JavaScript Variable Scope and Hoisting Explained
  2. JavaScriptIsSexy.com: Read my post Understand JavaScript’s “this” With Clarity, and Master It
  3. Beginning JavaScript: Read Chapter 12 (Dynamic HTML and the W3C Document Object Model).
  4. Beginning JavaScript: Read Chapter 14 (Ajax).

Week 6: Build a Real-World JavaScript Quiz Application

At this juncture, you have learned enough to build a solid JavaScript web application. Don’t proceed any further until you can successfully build this application I describe below. Don’t be afraid to ask questions on Stack Overflow, and do reread sections of the book to properly understand the concepts.

You are building a JavaScript quiz web application (you will use HTML and CSS as well) that will function as follows:

  • It is a simple quiz that has radio button choices, and it will show the quiz taker his or her score upon completion.
  • The quiz can show any number of questions and any number of choices.
  • Tally the user’s score and display the final score on the last page. The last page will only show the score, so remove the last question.
  • Use an array to store all the questions. Each question, along with its choices and correct answer, should be stored in an object. The array of questions should look similar to this (Notice that only one question is in this example array; you will add many questions):
    var allQuestions = [{question: “Who is Prime Minister of the United Kingdom?”, choices: [“David Cameron”, “Gordon Brown”, “Winston Churchill”, “Tony Blair”], correctAnswer:0}];
  • Dynamically (with document.getElementById or jQuery) remove the current question and add the next question, when the user clicks the “Next” button. The Next button will be the only button to navigate this version of the quiz.
  • You can ask for help in the comments below or preferably on Stack Overflow. You will likely to get a prompt and accurate answer on Stack Overflow.

Improve Your Quiz

You should be very comfortable with JavaScript, probably feeling like a Jedi. No, you are not. Not yet. You must keep using your newly acquired knowledge and skills as often as possible to keep learning and improving.

Improve Your Quiz Application From Earlier:

  • Add client-side data validation: make sure the user answers each question before proceeding to the next question.
  • Add a “Back” button to allow the user to go back and change her answer. The user can go back up to the first question. For the questions that the user has answered already, be sure to show the radio button selected, so that the user is not forced to answer the questions again, which she has completed.
  • Use jQuery to add animation (fade out the current question and fade in the next question).
  • Test the quiz on IE 9, and fix any bugs. This will give you a good workout 😉
  • Store the quiz questions in an external JSON file.
  • Add user authentication: allow users to log in, and save their login credentials to local storage (HTML5 browser storage).
  • Use cookies to remember the user, and show a “Welcome, ‘First Name’” message when the user returns to the quiz.

Week 7 (Extra Credit)

Getting Started with Git; Objective Oriented JavaScript; Improve Your Quiz Even More

  1. CodeSchool.com: Take the FREE Try Git course.
  2. JavaScriptIsSexy.com: Read my post, OOP In JavaScript: What You NEED to Know.
  3. Improve Your Quiz Application Even Further:
    — Use Twitter Bootstrap for the entire page layout, including the quiz elements to make it look more polished. As an added bonus, use the tabs user interface component from Twitter Bootstrap and show 4 different quizzes, one on each tab.
    Learn Handlebars.js and add Handlebars.js templating to the quiz. You should no longer have any HTML in your JavaScript code. Your quiz is getting more advanced, bit by bit.
    — Keep a record of all the users who take the quiz and show each user how his or her score ranks among the scores from other quiz takers.
  4. Later (after you have learned Backbone.js and Node.js or Meteor.js), you can use these technologies to refactor your quiz code and turn the same quiz into a sophisticated, single-page, modern web application built with the latest JavaScript frameworks. And you will store the users’ authentication credentials and scores in a MongoDB database.
  5. Next: Decide on a personal project to build, and start building your project promptly (while everything remains fresh in your memory). Use the book as a reference. And of course be an active member on Stack Overflow: ask questions and answer other programmers’ questions. I am confident you will be able to answer a number of questions.

Continue Improving

    1. Learn Backbone.js Completely, if you want to be a front-end developer or learn how to develop web applications with a JavaScript front-end framework.

Alternatively, if you want to develop complete applications, that is, the front-end and the backend, learn Meteor.js properly.

  1. At this point, you will definitely need my book, MongoDB for JavaScript Applications, to help you build your own jQuery, Backbone.js, Node.js, or Meteor.js applications, since none of the noted resources, or any other book for that matter, cover MongoDB in depth for JavaScript applications.
  2. Learn Intermediate and Advanced JavaScript
  3. Learn Node.js Completely and With Confidence

Words of Encouragement

I wish you success with your studies and in your JavaScript career. Never give up! When you are struggling and feeling incompetent (you may from time to time), always remember that most (probably all) programmers, new and experienced alike, feel this way sometimes, or have felt this way at some point during their programming career.

Remember to dig deep and don’t get frustrated; just carry on and stick with the task until you figure it out, for a worthwhile reward awaits you when you triumph in the end: programming is fun, liberating, and lucrative. The ecstasy one gets from building an application is a powerful feeling that you must experience to understand. Even more satisfying, however, is the empowerment you experience when you realize you have attained the skill and knowledge to build applications from scratch, to change the world with any idea you dream up.

The moment will come when you realize that all the difficulties you endured were worth while. Just as the millions before you have triumphed, so too, you will vanquish the toughest bugs, master the incomprehensible topics, and overcome the seemingly impossible tasks.

Feel free to share your links with us below when you build something, even if it is a tiny, itsy-bitsy project. :)

旧金山大学数据结构和算法的可视化学习工具

来源:伯乐在线 – 资源频道

链接:http://hao.jobbole.com/visualizing-algorithms-and-data-structure/

 

简介

理解复杂数据结构的最佳方法就是看它们的实际操作。旧金山大学计算机系的助理教授  David Galles  在 2011 年开发了一套用于学习数据结构和算法的交互工具。这个可视化工具是用 JavaScript 编写,用上了 HTML5 画布元素,兼容所有现代浏览器。iPhone 和 iPad 等 iOS 设备和 Kindle 上的浏览器都支持。

(编注:建议在非手机设备上使用,这个工具并不是自适应的,屏幕过小不利于操作和查看。)

 

如何使用

以链表队列为例,进入网页后,上方有一个操作按钮的工具栏。最左侧可输入队列元素,然后进行入队(Enqueue)和出队(Dequeue)操作。

下方是另外一个操作按钮的工具栏,用于设置动画参数等操作。

其他

这个工具的源码已公开,感兴趣的计算机课程教师,请参阅这个网页,然后可基于 David 的代码编写自己的教程动画。

官方网站:http://www.cs.usfca.edu/~galles/visualization/Algorithms.html

Free Resources for Beginners on Deep Learning and Neural Network

By

Source: http://www.analyticsvidhya.com/blog/2015/11/free-resources-beginners-deep-learning-neural-network/

Introduction

Machines have already started their march towards artificial intelligence. Deep Learning and Neural Networks are probably the hottest topics in machine learning research today. Companies like Google, Facebook and Baidu are heavily investing into this field of research.

Researchers believe that machine learning will highly influence human life in near future. Human tasks will be automated using robots with negligible margin of error. I’m sure many of us would never have imagined such gigantic power of machine learning.

To ignite your desire, I’ve listed the best tutorials on Deep Learning and Neural Networks available on internet today. I’m sure this would be of your help! Take your first step today.

Time for some motivation here. You ‘must’ watch this before scrolling further. This ~3min video was released yesterday by Google. Enjoy!

 

Time for proceed further. Firstly, let’s understand Deep Learning and Neural Network in simple terms.

 

What is Neural Network?

The concept of Neural Network began way back in 1980s. But, has gained re-ignited interest in recent times. Neural network is originally a biological phenomenon. Neural network is a ‘network’ of interconnected neurons which maintain a high level of coordination to receive and transmit messages to brain & spinal cord. In machine learning, we refer Neural Network as ‘Artificial Neural Network’.

Artificial Neural Network, as the name suggests, is a network (layer) of artificially created ‘neurons’ which are then taught to adapt cognitive skills to function like human brain. Image Recognition, Voice Recognition, Soft Sensors, Anomaly detection, Time Series Predictions etc are all applications of ANN.

 

What is Deep Learning?

In simple words, Deep Learning can be understood as an algorithm which is composed of hidden layers of multiple neural networks. It works on unsupervised data and is known to provide accurate results than traditional ML algorithms.

Input data is passed through this algorithm, which is then passed through several non-linearities before delivering output. This algorithm allows us to go ‘deeper’ (higher level of abstraction) in the network without ending up writing lot of duplicated code, unlike ‘shallow’ algorithms. As it goes deeper and deeper, it filter the complex features and combines with those of previous layer, thus better results.

Algorithms like Decision Trees, SVM, Naive Bayes are ‘shallow’ algorithm. These involves writing lot of duplicated code and cause trouble reusing previous computations.

Deep Learning through Neural Network and takes us a step closer to Artificial Intelligence.

 

What do Experts have to say?

Early this years, AMAs took place on Reddit with the masters of Deep Learning and Neural Network. Considering my ever rising craze to dig latest information about this field, I got the chance to attend their AMA session. Let’s see what they have to said about the existence and future of this field:

1

Geoffrey Hinton said, ‘The brain has about 1014 synapses and we only live for about 109 seconds. So we have a lot more parameters than data. This motivates the idea that we must do a lot of unsupervised learning since the perceptual input (including proprioception) is the only place we can get 105 dimensions of constraint per second.’

 

2

Yann LeCunn, on emotions in robot, said, ‘Emotions do not necessarily lead to irrational behavior. They sometimes do, but they also often save our lives. If emotions are anticipations of outcome (like fear is the anticipation of impending disasters or elation is the anticipation of pleasure), or if emotions are drives to satisfy basic ground rules for survival (like hunger, desire to reproduce), then intelligent agent will have to have emotions’

 

3

Yoshua Bengio said, ‘Recurrent or recursive nets are really useful tools for modelling all kinds of dependency structures on variable-sized objects. We have made progress on ways to train them and it is one of the important areas of current research in the deep learning community. Examples of applications: speech recognition (especially the language part), machine translation, sentiment analysis, speech synthesis, handwriting synthesis and recognition, etc.’

 

4

Jurgen Schmidhuber says, ’20 years from now we’ll have 10,000 times faster computers for the same price, plus lots of additional medical data to train them. I assume that even the already existing neural network algorithms will greatly outperform human experts in most if not all domains of medical diagnosis, from melanoma detection to plaque detection in arteries, and innumerable other applications.’

 

P.S. I am by no means an expert on Neural Networks. In fact, I have just started my journey in this fascinating world. If you think, there are other free good resources which I have not shared below, please feel free to provide the suggestions

 

Below is the list of free resources useful to master these useful concepts:

 

Courses

Machine Learning by Andrew Ng: If you are a complete beginner to machine learning and neural networks, this course is the best place to start. Enrollments for the current batch ends on Nov 7, 2015. This course provides a broad introduction to machine learning, deep learning, data mining, neural networks using some useful case studies. You’ll also learn about the best practices of these algorithms and where are we heading with them

 

Neural Network Course on Coursera: Who could teach Neural Network better than Hinton himself? This is a highly recommended course on Neural Network. Though, it is archived now, you can still access the course material. It’s a 8 week long course and would require you to dedicate atleast 7-9 hours/week.  This course expects prior knowledge of Python / Octave / Matlab and good hold on mathematical concepts (vector, calculus, algebra).

 

In addition to the course above, I found useful slides and lecture notes of Deep Learning programs from a few top universities of the world:

Carnegie Mellon University – Deep Learning : This course ended on 21st October 2015. It is archived now. But, you can still access the slides shared during this course. Learning from slide is an amazing way to understand concepts quickly. These slides cover all the aspects of deep learning to a certain point. I wouldn’t recommend this study material for beginners but to intermediates and above in this domain.

 

Deep Learning for NLP – This conference happened in 2013 on Human Language Technologies. The best part was, the knowledge which got shared. The slides and videos and well accessible and comprises of simple explanation of complex concepts. Beginners will find it worth watching these videos as the instructor begins the session from Logistic Regression and dives deeper into the use of machine learning algorithms.

 

Deep Learning for Computer Vision – This course was commenced at the starting of year 2015 by Columbia University. It focuses on deep learning techniques for vision and natural language processing problems. This course embraces theano as the programming tool. This course requires prior knowledge in Python and NumPy programming, NLP and Machine Learning.

 

Deep Learning: This is an archived course. It happened in Spring 2014. It was instructed by Yann LeCunn. This is a graduate course on Deep Learning. The precious slides and videos are accessible. I’d highly recommend this course to beginners. You’d amazed by the way LeCunn explains. Very simple and apt. To get best out of this course, I’d suggest you to work on assignments too, for your self evaluation.

 

Books

6

 

This book is written by Christopher M Bishop. This book serves as a excellent reference for students keen to understand the use of statistical techniques in machine learning and pattern recognition. This books assumes the knowledge of linear algebra and multivariate calculus. It provides a comprehensive introduction to statistical pattern recognition techniques using practice exercises.

 

 

Because of the rapid development and active research in the field, there aren’t many printed and accessible books available on Deep Learning. However, I found that Yoshua Bengio, along with Ian Goodfellow and Aaron Courville is working on a book. You can check its recent developments here.

Neural Networks and Deep Learning: This book is written by Michael Neilson. It is available FREE online. If you are good at learning things at your own pace, I’d suggest you to read this book. There are just 6 Chapters. Every chapters goes in great detail of concepts related to deep learning using really nice illustrations.

 

Blogs

Here are some of the best bet I have come across:

Beginners

Introduction to Neural Networks : This is Chapter 10 of Book, ‘The Nature of Code’. You’ll find the reading style simple and easy to comprehend. The author has explained neural network from scratch. Along with theory, you’ll also find codes(in python) to practice and apply them at your them. This not only would give you confidence to learn these concept, but would also allow you to experience their impact.

 

Hacker’s Guide to Neural Networks : Though, the codes in this blog are written in Javascript which you might not know. I’d still suggest you to refer it for the simplicity of theoretical concepts. This tutorial has very little math, but you’ll need lots of logic to comprehend and understand the following parts.

 

Intermediates

Recurrent Neural Network Part 1, Part 2, Part 3, Part 4 : After you are comfortable with basics of neural nets, it’s time to move to the next level. This is probably the best guide you would need to master RNN. RNN is a form of artificial neural network whose neurons send feedback signals to each other. I’d suggest you to follow the 4 parts religiously. It begins RNN from basics, followed by back propagation and its implementation.

 

Unreasonable Effectiveness of RNN: Consider this as an additional resource on RNN. If you are fond of seeking options, you might like to check this blog. It start with basic definition of RNN and goes all the way deep into building character models. This should help you give more hands on experience on implementing neural networks in various situations.

 

Backward Propogation Neural Network: Here you’ll find a simple explanation on the method of implementing backward propagation neural network. I’d suggest beginners to follow this blog and learn more about this concept. It will provide you a step by step approach for understanding neural networks deeply.

 

Deep Learning Tutorial by Stanford: This is by far the best tutorial/blog available on deep learning on internet. Having been recommended by many, it explains the complete science and mathematics behind every algorithm using easy to understand illustrations. This tutorial assumes basic knowledge of machine learning. Therefore, I’d suggest you to start with this tutorial after finishing Machine Learning course by Andrew Ng.

 

Videos

Complete Tutorial on Neural Networks : This complete playlist of neural network tutorials should suffice your learning appetite. There were numerous videos I found, but offered a comprehensive learning like this one.

 

Note: In order to quickly get started, I’d recommend you to participate in Facial keypoint Detection Kaggle competition. Though, this competition ended long time back, you can still participate and practice. Moreover, you’ll also find benchmark solution for this competition. Here is the solution: Practice – Neural Nets. Get Going!

 

Deep Learning Lectures: Here is a complete series of lectures on Deep Learning from University of Oxford 2015. The instructor is Nando de Freitas. This tutorials covers a wide range of topics from linear models, logistic regression, regularization to recurrent neural nets. Instead of rushing through these videos, I’d suggest you to devote good amount of time and develop concrete understanding of these concepts. Start from Lecture 1.

 

Introduction to Deep Learning with Python: After learning the theoretical aspects of these algorithm, it’s now time to practice them using Python. This ~1 hour video is highly recommended to practice deep learning in python using theano.

 

Deep Learning Summer School, Montreal 2015: Here are the videos from Deep Learning Summer School, Montreal 2015. These videos covers advanced topics in Deep Learning. Hence, I wouldn’t recommend them to beginners. However, people with knowledge of machine learning must watch them. These videos will take your deep learning intellect to a new level. Needless to say, they are FREE to access.

 

Also See: Top Youtube Videos on Machine Learning, Deep Learning and Neural Networks

 

Research Papers

I could list here numerous paper published on Deep Learning, but that would have defeated the purpose. Hence, to highlight the best resources, I’ve listed some of the seminal papers in this field:

Deep Learning in Neural Networks

Introduction to Deep Learning

Deep Boltzmann Machines

Learning Deep Architectures for AI

Deep Learning of Representations: Looking Forward

Gradient based training for Deep Architechture

 

End Notes

By now, I’m sure you have a lot of work carved out for yourself. I found them intimidating initially, but these videos and blogs totally helped me to regain my confidence. As said above, these are free resources and can be accessible from anywhere. If you are a beginner, I’d recommend you to start with Machine Learning course by Andrew Ng and read through blogs too.

I’ve tried to provide the best possible resources available on these topics at present. As mentioned before, I am not an expert on neural networks and machine learning (yet)! So it is quite possible that I missed out on some useful resource. Did I miss out any useful resource? May be! Please share your views / suggestions in the comments section below.

这门多数学校还没教的课程正在变得越来越“时髦”,你会让孩子去学么?

2016-05-01 王青等 小花生网

檩子:最近看到王青博士的一篇博文《美国孩子最时髦的课程是什么》;打开文章前,我猜想这最时髦的课程会是跟STEM有关的,结果还是没完全猜准,按王青博士的观察,答案是电脑编程;他分享了自己孩子在美国上学遭遇“电脑编程”的经历,还挺有意思的,先来看看他的描述:

对美国教育比较了解的朋友,大概都知道STEM教育这个概念,这是Science(科学),Technology(技术),Engineering(工程),和Math(数学)的首字母缩写。以科学技术为核心内容的STEM课程,被称作为21世纪的课程,颇有点高精尖的味道。

不过现在,美国说的都是STEAM了,多出来的A,指的是艺术 Art;艺术在这里出现,可不是让孩子们个个都成为毕加索,而是让艺术成为孩子认识世界和表达自己的工具。

而当前美国最“IN”的这门课,竟然跟STEAM里面的5项内容每一项都紧紧相关。它的提倡者直接就说了,这是现在每一个孩子今后在社会生存所必须具备的能力。

关于这门课程还有一个5分钟的宣传短片《多数学校不会教的东西》,在YouTube上已经有了1千多万次的收看,比尔盖茨和扎克伯格这样的人物都在片中露面倡导。

这门能够主宰今后社会生活每一个层面、目前在美国孩子中非常新锐的课程,就是电脑编程(Coding / Computer Programming)。


Everybody in this country should learn how to program, because it teaches you how to think.

“这个国家的每一个人都应该学习电脑编程,因为它会教你如何思考。”

前面提到的大热宣传短片,用了已故苹果大佬乔布斯的这句话开头。

那么多大的孩子可以开始学编程呢?美国比较普遍的操作,像STEAM一类的课程,一般在四年级出现。因为我儿子的学校校长特别注重于电脑科技,所以学校决定在三年级尝试开课。

这一试不打紧,惊动了我们选区的州议员,他动用自己的相关力量,在儿子的小学搞了一个现场观摩会。议员出面,不光是各类媒体跟风而至,周围学区的相关人员也都出动了,最重要的是,谷歌负责推广的地区经理也到场了,场面变得非常正式。好在学校有一个全部苹果设备的电脑室,挺拿得出手,而孩子们的表现更是神勇,一点怯场的意思都没有,急于要向大家展示自己的成果。

其实,孩子的编程内容一点也不难,有点类似于搭建电子积木,是在调动不同的模块,不光有形状颜色这些内容,还有运动、速度和声音这些维度。下面这张照片大致能看到孩子电脑屏幕上的工作,颇有点像在玩电子游戏。其实,我三年级的儿子在上了几个星期的课以后,就完全沉浸在电子游戏“设计”中了,利用这些搭积木的技术,开始想象和设计自己游戏的主角,从长相到声音到超能力,把创造性发挥得淋漓尽致。

现在这所小学的编程课程已经扩展到了二年级,从网上出现的报道来看,还有年纪更小的。

凡是跟儿童编程打过交道的相关人士都知道一点,编程对于孩子来说,就像天生的本事一样,其实并不费力气。都把电脑程序叫做“语言”,其实它跟人类语言有很多道理相通的地方。而孩子的天性,就是利用一切交际媒介表达自己,可以是母语,可以是母语里夹杂了外语,可以是画画唱歌,可以是肢体语言。到了用电脑语言表达自己这个层面,他们也是表现得那么自然,绝对的天生优势,没有仔细了解过的大人,很难想象的。宣传短片中包括扎克伯格在内的行业领军人物,都在强调,不需要等掌握了全部电脑科学之后,才开始学习编程。

 

的确,扎克伯格20岁的时候就创建了Facebook,他小学开始接触编程,在此之前已经积累了近十年的编程和创造产品的经验。而中国的学生,即使读完了计算机系,也还没有多少编程开发实战经验。

总之,这部大热的宣传片和王青博士的经历,告诉我们电脑编程已经存在于现代社会的每一个毛孔,无论是创业,还是完成一个project,或者解决一个具体问题,都离不开电脑编程,这方面的技能成了人们的一种基础能力,就跟懂基本的数学运算一样,趋势是越来越多的孩子会把电脑编程不仅仅作为兴趣爱好、而是当作基本技能去学。

之前,我们介绍过一些目前世界上儿童学编程的资源,今天正好贴在这里,一并作为参考!今天这篇文章最后有一个小投票,欢迎参加,发表你的看法!

目前教孩子学编程的主流App和网站

这些APP和网站都声誉卓著,普遍有这些特点:易上手、好玩、能产生作品,可以做动画、特效、游戏、网站和APP等,让孩子感到动力十足,而且很多都是免费的。

制作小动画,开始编程启蒙

1、Daisy the Dinosaur

这款 iPad APP 连幼儿园的小朋友都可以开始用。教孩子基本的编程逻辑;孩子们只需把相关的模块设定并排列好,如滚(roll)、跳(jump)或者长大(grow)等,然后再按下播放键,一个小动画就做成了,里面能看到小恐龙根据刚才的指令做出的相应动作。总之,很好上手,几乎没有任何难度,小朋友会很着迷于自己创作出来的小动画。适合年龄:4-8岁

2、Hopscotch: Coding for kids, a visual programming language

和 Daisy the Dinosaur 来自同一个开发商,这款iPad应用得过很多科技类奖项,像是 Daisy the Dinosaur 的升级版,多了很多模块和参数设置。在操作上还是很简单,不需要进行任何输入操作,就像是堆积木一样,把模块一个个放进去就好,点击播放就能看到各种卡通人物在屏幕上根据自己的指令做动作的动画。这个很锻炼孩子的逻辑理解能力,不仅要处理时间和空间的问题,还要给不同的角色分配不同的任务。它能让孩子独立地做出一部小动画片,很有成就感。适合年龄:8-12岁

开始认真学习一点编程

3、Scratch

在网上搜怎样教孩子学习编程,总会被带到这个网站,口碑非常好,全球有超过百万孩子在使用。可视化语言和接口是由美国麻省理工学院媒体实验室(MIT Media Labs)创建,即使孩子不了解复杂的程序语言,也可以轻松编程。孩子可以通过它来创建互动故事,动画,甚至游戏等,然后和全世界的朋友分享。适合年龄:8岁以上

4、Alice

估计男孩和女孩的思维方式是不太一样,所以还专门有为男孩和女孩各自设计的学编程软件。老外考虑得真周到。在美国,Alice 和 Scratch 是最著名的两个教孩子学编程的工具,针对女孩子学编程的Alice 由弗吉尼亚大学开发,名字来源于《爱丽丝漫游奇境》,主要教3D编程。在Alice里面,小朋友可以通过拖拽虚拟模块即可看到虚拟世界中3D精灵的实时变化,可以边玩变测试。开发者强调了这款软件的重点在于吸引年轻女孩来编程。适合:10岁以上女孩,适用设备:电脑

5、Codea

这是一款iPad应用,也是一个具有丰富资源带孩子编程的软件开发工具,得过年度最佳应用大奖。国外有孩子就用它自己做出APP游戏。大点的孩子,具有一定逻辑思维能力和理解能力,可以跟着走。界面简洁,简单易学是它最大的特点。重要的是,它有中文版,不会有语言障碍。适合年龄:8岁以上

6、RoboMind

RoboMind主要的功能是通过编程让机器人去执行一系列任务,这个过程中,孩子对人工智能会有基本了解。如果孩子在学LEGO的机器人课程,那这个就更适合了,它有一个导出功能,可以把你编的程序连接到LEGO MINDSTORMS NXT 2.0里去。适合年龄:10岁以上,适用设备:电脑

大孩子编程

7、Codecademy

Codecademy被认为是可以指导任何人学习编程的一款基于浏览器的应用,包括13岁以下的儿童。但这款应用并不像其他儿童应用,没有卡通风格的精灵和色彩丰富的界面,但它仍不失为一款友好的,简单易学的app。

通过Codecademy,12岁以上的儿童可以学习Python、Ruby、PHP、HTML或JavaScript等编程语言,甚至API。不过,该应用也正在扩大用户群体,尝试吸引一些年轻的程序员,鼓励学生和教育工作者参加他们在学校举办的编程俱乐部活动。

还有一本教孩子编程的书

这本《与孩子一起学编程》,如果家里有爸爸妈妈对这个感兴趣的,或者有点懂行的, 可以用这本书来教孩子学编程,或者和孩子一起学编程。

这本书的特点之前介绍过:

1、使用了大量贴近孩子生活的插图,凡是稍显复杂的概念,都尽可能用漫画比喻来辅助说明。
2、对于孩子们来说,纯粹的数学计算并不是那么的有趣;而能够做出一个看得到的东西,则是一件很有成就感的事情。这本书尽量做到这一点。

3、每一章的长度都不长,短小的学习单元有助于减少孩子们学习新事物时候的压力,也有利于维持他们的兴趣。

4、对于概念的讲述都非常的简单。涉及术语的地方,都尽可能用有亲和力的话语来说明。
编程少年的TED演讲

如果真的有心让孩子早点开始这方面的实践,不妨和他一起看看这位从小接触编程的12岁外国孩子的TED演讲-我是怎样开始编程的。他分享自己怎样走上编程之路:玩游戏,开发游戏,找到苹果的开发平台,学会利用网上资源自己去开发游戏,并且建立了一个孩子们开发各种应用的俱乐部……演讲很有范……

最后,一个小投票:

来源:本文第一部分引在王青博士授权小花生转载的新浪博客文章,有简化和编辑,资源部分由小花生网编写,媒体转载须获授权

程序员必读书单 1.0

作者:Lucida

原文链接:http://lucida.me/blog/developer-reading-list/

本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及延伸阅读。旨在成为最好最全面的程序员必读书单。

前言

Reading makes a full man; conference a ready man; and writing an exact man.

Francis Bacon

优秀的程序员应该具备两方面能力:

  • 良好的程序设计能力:
    • 掌握常用的数据结构和算法(例如链表,栈,堆,队列,排序和散列);
    • 理解计算机科学的核心概念(例如计算机系统结构、操作系统、编译原理和计算机网络);
    • 熟悉至少两门以上编程语言(例如C++,Java,C#,和Python);
  • 专业的软件开发素养:
    • 具备良好的编程实践,能够编写可测试(Testable),可扩展(Extensible),可维护(Maintainable)的代码;
    • 把握客户需求,按时交付客户所需要的软件产品;
    • 理解现代软件开发过程中的核心概念(例如面向对象程序设计,测试驱动开发,持续集成,和持续交付等等)。

和其它能力一样,程序设计能力和软件开发素养源自项目经验和书本知识。项目经验因人而异(来自不同领域的程序员,项目差异会很大);但书本知识是相通的——尤其是经典图书,它们都能够拓宽程序员的视野,提高程序员的成长速度。

在过去几年的学习和工作中,我阅读了大量的程序设计/软件开发书籍。随着阅读量的增长,我意识到:

  • 经典书籍需要不断被重读——每一次重读都会有新的体会;
  • 书籍并非读的越多越好——大多数书籍只是经典书籍中的概念延伸(有时甚至是照搬);

意识到这两点之后,我开始思考一个很功利的问题:如何从尽可能少的书中,获取尽可能多的关键知识?换句话说:

  • 优秀的程序员应该掌握哪些关键概念?
  • 哪些书籍来可以帮助程序员掌握这些关键概念?

这即是这篇文章的出发点——我试图通过程序员必读书单这篇文章来回答上面两个问题。

标准

进入必读书单之前,我先介绍下书单里的书籍选择标准和领域选择标准。当然你也点击这里直接跳转到书单开始阅读。

书籍选择标准

  1. 必读:什么是必读书籍呢?如果学习某项技术有一本书无论如何都不能错过,那么这本书就是必读书籍——例如Effective Java于Java,CLR via C#于C#;
    • 注意我没有使用“经典”这个词,因为经典计算机书籍往往和计算机科学联系在一起,而且经典往往需要10年甚至更长的时间进行考验;
  2. 注重实践,而非理论:所以这个书单不会包含过于原理性的书籍;
  3. 入门—必读—延伸:必读书籍的问题在于:1. 大多不适合入门;2. 不够全面。考虑到没有入门阅读和延伸阅读的阅读列表是不完整的——所以书单中每个关键概念都会由一本入门书籍,一本必读书籍(有时入门书籍和必读书籍是同一本),和若干延伸阅读书籍所构成。

概念选择标准

  1. 全面:全面覆盖软件开发中重要的概念;
  2. 通用:适用于每一个程序员,和领域特定方向无关;
  3. 注重基础,但不过于深入:优秀的程序员需要良好的计算机科学基础,但程序员并没必要掌握过于深入的计算机科学知识。以算法为例,每个程序员都应该掌握排序、链表、栈以及队列这些基本数据结构和算法,但计算几何、线性规划和网络流这些算法可能就不是每个程序员都需要掌握的了;

通过这几个标准,我把程序员应掌握的关键概念分为程序设计,软件开发,以及个人成长三大类,每一大类均由若干关键概念组成。

快速通道

自从开博以来,经常会有朋友在论坛,微博,和QQ上提问学习X技术读什么书合适(例如:学习Java读什么书合适?如何学习程序设计?)所以我在这 里列出了一个“快速通道”——把常见的问题集中在一起,点击问题,即可直接进入答案。(当然,如果你把本文从头读到尾帮助会更大 :–))

程序员必读书单

入门书籍

程序设计:

  1. 基础理论编码:隐匿在计算机软硬件背后的语言
  2. 编程语言
  3. 编程语言理论编程语言实现模式
  4. 程序设计程序设计方法
  5. 算法与数据结构算法(第4版)
  6. 程序调试调试九法——软硬件错误的排查之道

软件开发:

  1. 编程实践程序设计实践
  2. 面向对象程序设计Head First设计模式
  3. 重构重构
  4. 软件测试How to Break Software
  5. 项目管理极客与团队
  6. 专业开发程序员修炼之道:从小工到专家
  7. 大师之言奇思妙想:15位计算机天才及其重大发现
  8. 界面设计写给大家看的设计书
  9. 交互设计通用设计法则

个人成长:

  1. 职业规划软件开发者路线图
  2. 思维方式程序员的思维修炼:开发认知潜能的九堂课
  3. 求职面试金领简历:敲开苹果微软谷歌的大门
  4. 英语写作The Only Grammar Book You’ll Ever Need

必读书籍

程序设计:

  1. 基础理论深入理解计算机系统(第2版)
  2. 编程语言
  3. 编程语言理论程序设计语言——实践之路(第3版)
  4. 程序设计计算机程序的构造与解释(第2版)
  5. 算法与数据结构编程珠玑(第2版)
  6. 程序调试调试九法——软硬件错误的排查之道

软件开发:

  1. 编程实践代码大全(第2版)
  2. 面向对象程序设计设计模式
  3. 重构修改代码的艺术
  4. 软件测试xUnit Test Patterns
  5. 项目管理人月神话
  6. 专业开发程序员职业素养
  7. 大师之言编程人生:15位软件先驱访谈录
  8. 界面设计认知与设计:理解UI设计准则(第2版)
  9. 交互设计交互设计精髓(第3版)

个人成长:

  1. 职业规划软件开发者路线图
  2. 思维方式如何把事情做到最好
  3. 求职面试程序员面试金典(第5版)
  4. 英语写作风格的要素

这个阅读列表覆盖了软件开发各个关键领域的入门书籍和必读书籍,我相信它可以满足绝大多数程序员的需求,无论你是初学者,还是进阶者,都可以从中获益:

  • 基础理论包括了程序员应该掌握的计算机基础知识;
  • 编程语言对软件开发至关重要,我选择了CC++JavaC#Python,和JavaScript这六门主流编程语言进行介绍,如果想进一步理解编程语言,可以阅读编程语言理论里的书目;
  • 在理解编程语言的基础上,优秀的程序员还应该了解各种程序设计技巧,熟悉基本的算法数据结构,并且能够高效的进行程序调试
  • 良好的程序设计能力是成为优秀程序员的前提,但软件开发知识也是必不可少的:优秀的程序员应具备良好的编程实践,知道如何利用面向对象重构,和软件测试编写可复用,可扩展,可维护的代码,并具备软件项目管理知识和专业开发素养;
  • 就像我们可以从名人传记里学习名人的成功经验,程序员也可以通过追随优秀程序员的足迹使自己少走弯路。大师之言包含一系列对大师程序员/计算机科学家的访谈,任何程序员都可以从中获益良多;
  • 为了打造用户满意的软件产品,程序员应当掌握一定的界面设计知识和交互设计知识(是的,这些工作应该交给UI和UX,但如果你想独自打造一个产品呢?);
  • 专业程序员应当对自己进行职业规划,并熟悉程序员求职面试的流程,以便在职业道路上越走越远;
  • 软件开发是一项需要不断学习的技能,学习思维方式可以有效的提升学习能力和学习效率;
  • 软件开发是一项国际化的工作,为了让更多的人了解你的代码(工作),良好的英语写作能力必不可少。

尽管我尽可能的去完善这个书单,但受限于我的个人经历,这个书单难免会有所偏颇。所以如果你有不同的意见,或者认为这个书单漏掉了某些重要书籍,请在评论中指出,我会及时更新。:–)

程序设计

1. 基础理论

编码:隐匿在计算机软硬件背后的语言

编码:隐匿在计算机软硬件背后的语言这本书其实不应该叫编码——它更应该叫“Petzold教你造计算机”——作者Charles Petzold创造性的以编码为主题,从电报机和手电筒讲到数字电路,然后利用数字电路中的逻辑门构造出加法器触发器,最后构造出一个完整的存储程序计算机。不要被这些电路概念吓到——编码使用大量形象贴切的类比简化了这些概念,使其成为最精彩最通俗易懂的计算机入门读物。

深入理解计算机系统(第2版)

深入理解计算机系统(第2版)这本书的全名是:Computer Systems:A Programmer’s Perspective(所以它又被称为CSAPP),我个人习惯把它翻译为程序员所需了解的计算机系统知识,尽管土了些,但更名副其实。

深入理解计算机系统是我读过的最优秀的计算机系统导论型作品,它创造性的把操作系统,计算机组成结构,数字电路,以及编译原理这些计算机基础学科中的核心概念汇集在一起,从而覆盖了指令集体系架构,汇编语言,代码优化,计算机存储体系架构,链接,装载,进程,以及虚拟内存这些程序员所需了解的关键计算机系统知识。如果想打下扎实的计算机基础又不想把操作系统计算机结构编译原理这些书统统读一遍,阅读深入理解计算机系统是最有效率的方式。

延伸阅读:

2. 编程语言

编程语言是程序员必不可少的日常工具。工欲善其事,必先利其器。我在这里给出了C,C++,Java,C#,JavaScript,和Python这六种常用编程语言的书单(我个人不熟悉Objective-C和PHP,因此它们不在其中)。

需要注意的是:我在这里给出的是编程语言(Programming Language)书籍,而非编程平台(Programming Platform)书籍。以Java为例,Effective Java属于编程语言书籍,而Android编程权威指南就属于编程平台书籍。

C

C和指针

忘记谭浩强那本糟糕不堪的C程序设计,C和指针才是C语言的最佳入门书籍。它详细但又不失简练的介绍了C语言以及C标准库的方方面面。

对于C语言初学者,最难的概念不仅仅是指针和数组,还有指向数组的指针和指向指针的指针。C和指针花了大量的篇幅和图示来把这些难懂但重要的概念讲的清清楚楚,这也是我推荐它作为C语言入门读物的原因。

C程序设计语言(第2版)

尽管C程序设计语言是二十多年前的书籍,但它仍然是C语言——以及计算机科学中最重要的书籍之一,它的重要性不仅仅在于它用清晰的语言和简练的代码描述了C语言全貌,而且在于它为之后的计算机书籍——尤其是编程语言书籍树立了新的标杆。以至于在很多计算机书籍的扉页,都会有“感谢Kernighan教会我写作”这样的字样。

延伸阅读:

  • C专家编程:不要被标题中的“专家”吓到,这实际是一本很轻松的书籍,它既包含了大量C语言技术细节和编程技巧,也包含了很多有趣的编程轶事;
  • C陷阱与缺陷:书如其名,这本书介绍了C语言中常见的坑和一些稀奇古怪的编程“技巧”,不少刁钻的C语言面试题都源自这本小册子;
  • C语言参考手册:全面且权威的C语言参考手册,而且覆盖C99,如果你打算成为C语言专家,那么这本书不可错过;
  • C标准库:给出了15个C标准库的设计思路,实现代码,以及测试代码,配合C程序设计语言阅读效果更佳;
  • C语言接口与实现:这本书展示了如何使用C语言实现可复用的数据结构,其中包含大量C语言高级技巧,以至于Amazon上排行第一的评论是“Probably the best advanced C book in existance”,而排行第二的评论则是“By far the most advanced C book I read”。

C++

C++程序设计原理与实践

作为C++的发明者,没有人能比Bjarne Stroustrup更理解C++。Bjarne在Texas A&M大学任教时使用C++为大学新生讲授编程,从而就有了C++程序设计原理与实践这本书——它面向编程初学者,既包含C++教程,也包含大量程序设计原则。它不但是我读过最好的C++入门书,也是我读过最好的编程入门书。

比较有趣的是,C++程序设计原理与实践直到全书过半都没有出现指针,我想这可能是Bjarne为了证明不学C也可以学好C++吧。

C++程序设计语言(第4版)

同样是Bjarne Stroustrup的作品,C++程序设计语言是C++最权威且最全面的书籍。第4版相对于之前的版本进行了全面的更新,覆盖了第二新的C++ 11标准,并砍掉了部分过时的内容。

延伸阅读:

  • A Tour of C++:如果你觉得C++程序设计语言过于庞大,但你又想快速的浏览一遍新版C++的语言特色,那么可以试试这本小红书;
  • C++语言的设计与演化:C++的“历史书”,讲述了C++是如何一步一步从C with Classes走到如今这一步,以及C++语言特性背后的故事;
  • C++标准库(第2版):相对于其它语言的标准库,C++标准库虽然强大,但学习曲线十分陡峭,这本书是学习C++标准库有力的补充;
  • 深度探索C++对象模型:这本书系统的讲解了C++是如何以最小的性能代价实现对象模型,很多C++面试题(包括被问烂的虚函数指针)都可以在这本书里找到答案;
  • Effective C++More Effective C++:由于C++的特性实在繁杂,因此很容易就掉到坑里。Effective系列既讲述了C++的良好编程实践,也包含C++的使用误区,从而帮你绕过这些坑。

Java

Java核心技术(第9版)

平心而论Java核心技术(即Core Java)并不算是一本特别出色的书籍:示例代码不够严谨,充斥着很多与C/C++的比较,语言也不够简洁——问题在于Java并没有一本很出色的入门书籍,与同类型的Java编程思想相比,Java核心技术至少做到了废话不多,与时俱进(Java编程思想还停留在Java 6之前),矮子里面选将军,Java核心技术算不错了。

Effective Java(第2版)

尽管Java没有什么出色的入门书籍,但这不代表Java没有出色的必读书籍。Effective Java是我读过的最好的编程书籍之一,它包含大量的优秀Java编程实践,并对泛型和并发这两个充满陷阱的Java特性给出了充满洞察力的建议,以至于Java之父James Gosling为这本书作序:“我很希望10年前就拥有这本书。可能有人认为我不需要任何Java方面的书籍,但是我需要这本书。”

延伸阅读:

  • 深入理解Java虚拟机(第2版):非常优秀且难得的国产佳作,系统的介绍了Java虚拟机和相关工具,并给出了一些调优建议;
  • Java程序员修炼之道:在这本书之前,并没有一本Java书籍系统详细的介绍Java 7的新特性(例如新的垃圾收集器,try using结构和invokedynamic指令),这本书填补了这个空白;
  • Java并发编程实践:系统全面的介绍了Java的并发,如何设计支持并发的数据结构,以及如何编写正确的并发程序;
  • Java Puzzlers:包含了大量的Java陷阱——以至于读这本书时我说的最多的一个词就是WTF,这本书的意义在于它是一个反模式大全,Effective Java告诉你如何写好的Java程序,而Java Puzzlers则告诉你糟糕的Java程序是什么样子。更有意思的是,这两本书的作者都是Joshua Bloch

视频教程:

  • Java语言学习极速之旅:系统全面的Java语言教程,6个阶段Java基础入门,循序渐进掌握Java面向对象精髓。3个Java进阶方向,Java SE、Java EE、Android开发,每一个都包含相应的知识点精讲和项目开发实例,快速上手。
  • Android 0基础极速养成计划:Android开发快速入门视频教程,通过对Android基础知识讲解,详细介绍Android开发环境搭建,同时包含Android实战案例解析,通过全新实战的Android课程,系统学习Android开发。

C#

精通C#(第6版)

可能你会疑问我为什么会推荐这本接近1200页的“巨著”用作C#入门,这是我的答案:

  1. C#的语言特性非常丰富,很难用简短的篇幅概括这些特性;
  2. 精通C#之所以有近1200页的篇幅,是因为它不但全面介绍了C#语言,而且还覆盖了ADO.NET,WCF,WF,WPF,以及ASP.NET这些.Net框架。你可以把这本书视为两本书——一本500多页的C#语言教程和一本600多页的.Net平台框架快速上手手册。
  3. 尽管标题带有“精通”两字,精通C#实际上是一本面向初学者的C#书籍,你甚至不需要太多编程知识,就可以读懂它。

CLR via C#(第4版)

CLR via C#是C#/.Net最重要的书籍,没有之一。它全面介绍了.Net的基石——CLR的运行原理,以及构建于CLR之上的C#类型系统,运行时关系,泛型,以及线程/并行等高级内容。任何一个以C#为工作内容的程序员都应该阅读此书。

延伸阅读:

  • 深入理解C#(第3版):C#进阶必读,这本书偏重于C#的语言特性,它系统的介绍了C#从1.0到C# 4.0的语言特性演化,并展示了如何利用C#的语言特性编写优雅的程序;
  • .NET设计规范(第2版):C#专业程序员必读,从变量命名规范讲到类型系统设计原则,这本书提供了一套完整的.Net编程规范,使得程序员可以编写出一致,严谨的代码,
  • C# 5.0权威指南:来自O’Reilly的C#参考手册,严谨的介绍了C#语法,使用,以及核心类库,C#程序员案头必备;
  • LINQ to Objects Using C# 4.0Async in C# 5.0:LINQ和async分别是.Net 3.5和.Net 4.5中所引入的最重要的语言特性,所以我认为有必要在它们上面花点功夫——这两本书是介绍LINQ和async编程的最佳读物。

JavaScript

JavaScript DOM编程艺术(第2版)

尽管JavaScript现在可以做到客户端服务器端通吃,尽管JQuery之类的前端框架使得一些人可以不懂JavaScript也可以编程,但我还是认为学习JavaScript从HTML DOM开始最为适合,因为这是JavaScript设计的初衷。JavaScript DOM编程艺术系统的介绍了如何使用JavaScript,HTML,以及CSS创建可用的Web页面,是一本前端入门佳作。

JavaScript语言精粹

JavaScript语言包含大量的陷阱和误区,但它却又有一些相当不错的特性,这也是为什么Douglas Crockford称JavaScript为世界上最被误解的语言,并编写了JavaScript语言精粹一书来帮助前端开发者绕开JavaScript中的陷阱。和同类书籍不同,JavaScript语言精粹用精炼的语言讲解了JavaScript语言中好的那部分(例如闭包,函数是头等对象,以及对象字面量),并建议读者不要使用其它不好的部分(例如混乱的类型转换,默认全局命名空间,以及奇葩的相等判断符),毕竟,用糟糕的特性编写出来的程序往往也是糟糕的。

延伸阅读:

Python

Python基础教程(第二版)

Python的入门书籍很多,而且据说质量大多不错,我推荐Python基础教程的原因是因为它是我的Python入门读物——简洁,全面,代码质量很不错,而且有几个很有趣的课后作业,使得我可以快速上手。

这里顺便多说一句,不要用Python学习手册作为Python入门——它的废话实在太多,你能想象它用了15页的篇幅去讲解if语句吗?尽管O’Reilly出了很多经典编程书,但这本Python学习手册绝对不在其中。

Python参考手册(第4版)

权威且实用的Python书籍,覆盖Python 2和Python 3。尽管它名为参考手册,但Python参考手册在Python语法和标准库基础之上对其实现机制也给出了深入的讲解,不容错过。

延伸阅读:

3. 编程语言理论

编程语言实现模式

大多数程序员并不需要从头编写一个编译器或解释器,因此龙书(编译原理)就显得过于重量级;然而多数程序员还是需要解析文本,处理配置文件,或者写一个小语言,编程语言实现模式很好的满足了这个需求。它把常用的文本解析/代码生成方法组织成一个个模式,并为每个模式给出了实例和应用场景。这本书既会提高你的动手能力,也会加深你对编程语言的理解。Python发明者Guido van Rossum甚至为这本书给出了“Throw away your compiler theory book!”这样的超高评价。

程序设计语言——实践之路(第3版)

程序员每天都要和编程语言打交道,但是思考编程语言为什么会被设计成这个样子的程序员并不多,程序设计语言——实践之路完美的回答了这个问题。这本书从编程语言的解析和运行开始讲起,系统了介绍了命名空间,作用域,控制流,数据类型以及方法(控制抽象)这些程序设计语言的核心概念,然后展示了这些概念是如何被应用到过程式语言,面向对象语言,函数式语言,脚本式,逻辑编程语言以及并发编程语言这些具有不同编程范式的编程语言之上。这本书或极大的拓宽你的视野——无论你使用什么编程语言,都会从这本书中获益良多。理解这一本书,胜过学习十门新的编程语言。

延伸阅读:

  • 七周七语言:理解多种编程范型:尽管我们在日常工作中可能只使用两三门编程语言,但是了解其它编程语言范式是很重要的。七周七语言一书用精简的篇幅介绍了Ruby,Io,Prolog,Scala,Erlang,Clojure,和Haskell这七种具有不同编程范式的语言——是的,你没法通过这本书变成这七种语言的专家,但你的视野会得到极大的拓宽;
  • 自制编程语言:另一本优秀的编译原理作品,自制编程语言通过从零开始制作一门无类型语言Crowbar和一门静态类型语言Diksam,把类型系统,垃圾回收,和代码生成等编程语言的关键概念讲的清清楚楚;
  • 计算的本质:深入剖析程序和计算机:披着Ruby外衣的计算理论入门书籍,使你对编程语言的理解更上一层楼。

4. 程序设计

程序设计方法

现代编程语言的语法大多很繁杂,初学者使用这些语言学习编程会导致花大量的时间在编程语言语法(诸如指针,引用和类型定义)而不是程序设计方法(诸如数据抽象和过程抽象)之上。程序设计方法解决了这个问题——它专注于程序设计方法,使得读者无需把大量时间花在编程语言上。这本书还有一个与之配套的教学开发环境DrScheme,这个环境会根据读者的程度变换编程语言的深度,使得读者可以始终把注意力集中在程序设计方法上。

我个人很奇怪程序设计方法这样的佳作为什么会绝版,而谭浩强C语言这样的垃圾却大行其道——好在是程序设计方法第二版已经被免费发布在网上。

计算机程序的构造与解释(第2版)

计算机程序的构造与解释是另一本被国内大学忽视(至少在我本科时很少有人知道这本书)的教材,这本书和程序设计方法有很多共同点——都使用Scheme)作为教学语言;都专注于程序设计方法而非编程语言本身;都拥有相当出色的课后题。相对于程序设计方法计算机程序的构造与解释要更加深入程序设计的本质(过程抽象,数据抽象,以及元语言抽象),以至于Google技术总监Peter Norvig给了这本书超高的评价

延伸阅读:

  • 编程原本STL作者的关于程序设计方法佳作——他把关系代数和群论引入编程之中,试图为程序设计提供一个坚实的理论基础,从而构建出更加稳固的软件。这本书是程序设计方法计算机程序的构造与解释的绝好补充——前者使用函数式语言(Scheme)讲授程序设计,而编程原本则使用命令式语言(C++);
  • 元素模式设计模式总结了面向对象程序设计中的模式,而元素模式这本书分析了程序设计中的常见模式的本质,阅读这本书会让你对程序设计有更深的理解;
  • The Science of Programming:会编程的人很多,但能够编写正确程序的人就少多了。The Science of Programming通过前条件——不变式——后条件以及逻辑谓词演算,为编写正确程序提供了强有力的理论基础,然后这本书通过实例阐述了如何应用这些理论到具体程序上。任何一个想大幅提高开发效率的程序员都应阅读此书。

5. 算法与数据结构

算法(第4版)

我在算法学习之路一文中提到我的算法入门教材是数据结构与算法分析:C语言描述,我曾经认为它是最好的算法入门教材,但自从我读到Sedgewick算法之后我就改变了观点——这本算法才是最好的算法入门教材:

  • 使用更为容易的Java语言作为教学语言;
  • 覆盖所有常用的数据结构和算法,并均给出其完整实现;
  • 包含大量的图示用于可视化算法——事实上这是我读过的图示最为丰富形象的书籍,这也是我称其为最好的算法入门书籍的原因。

编程珠玑(第2版)

编程珠玑(第2版)是一本少见的实践型算法书籍——它并非一一介绍数据结构/算法的教材,而是实践性极强的算法应用手册。作者(Jon Bentley)从他多年的实际经验精选出一些有趣而又实用的问题,然后展示了他解决这些问题的过程(分析问题,选择合适的算法,解决问题,以及验证答案)。任何程序员都可以从中获益。

延伸阅读:

  • 编程珠玑(续):严格来说这本书并非编程珠玑的续作,而是一本类似于番外篇的编程技巧/实践手册;它不像编程珠玑那般重视算法的应用,而是全面覆盖了程序员所需的能力;
  • 算法导论(第3版):尽管我在这边文章开头提到会尽量避免理论性的书籍,但没有算法导论的算法阅读列表是不完整的,我想这本书就不需要我多介绍了; :–)
  • 算法设计与分析基础(第3版):侧重于算法设计,这本书创新的把常见算法分为分治,减治,变治三大类,并覆盖了动态规划,回溯,以及分支定界等高级算法设计方法,属于算法设计的入门佳作;

6. 程序调试

调试九法——软硬件错误的排查之道

一个让非编程从业人员惊讶的事实是程序员的绝大多时间都花在调试上,而不是写程序上,以至于Bob大叔调试时间占工作时间的比例作为衡量程序员开发能力的标准。调试九法——软硬件错误的排查之道既是调试领域的入门作品,也是必读经典之作。调试九法的作者是一个具有丰富实战经验的硬件工程师,他把他多年的调试经验总结成九条调试法则,并对每一条法则都给对应的实际案例。任何程序员都应通过阅读这本书改善调试效率,即便是非程序员,也可以从这本书中学到系统解决问题的方法。

延伸阅读:

  • Writing Solid Code最好的调试是不调试——Writing Solid Code介绍了断言,设计清晰的API,以及单步代码等技巧,用于编写健壮的代码,减少调试的时间;
  • 软件调试的艺术:调试工具书——这本书详细的介绍了常见的调试器工具,并通过具体案例展示了它们的使用技巧;

软件开发

1. 编程实践

程序设计实践

Brian Kernighan是这个星球上最好的计算机书籍作者:从上古时期的Software Tools,到早期的Unix编程环境C程序设计语言,再到这本程序设计实践,每本书都是必读之作。

尽管程序设计实践只有短短200余页,但它使用精炼的代码和简要的原则覆盖了程序设计的所有关键概念(包括编程风格,算法与数据结构,API设计,调试,测试,优化,移植,以及领域特定语言等概念)。如果你想快速掌握良好的编程实践,或者你觉着900多页的代码大全过于沉重,那么程序设计实践是你的不二之选。我第一次读这本书就被它简洁的语言和优雅的代码所吸引,以至于读研时我买了三本程序设计实践——一本放在学校实验室,一本放在宿舍,一本随身携带阅读。我想我至少把它读了十遍以上——每一次都有新的收获。

代码大全(第2版)

无论在哪个版本的程序员必读书单,代码大全都会高居首位。和其它程序设计书籍不同,代码大全用通俗清晰的语言覆盖了软件构建(Software Construction)中各个层次上所有的重要概念——从变量命名到类型设计,从控制循环到代码结构,从测试和调试到构建和集成,代码大全可谓无所不包,你可以把这本书看作为程序员的一站式(Once and for all)阅读手册。更珍贵的是,代码大全在每一章末尾都给出了价值很高的参考书目(参考我之前的如何阅读书籍一文),如果你是一个初出茅庐的程序员,代码大全是绝好的阅读起点。

延伸阅读:

  • 编写可读代码的艺术:专注于代码可读性(Code Readability),这本书来自Google的两位工程师对Google Code Readability的总结。它给出了大量命名,注释,代码结构,以及API设计等日常编码的最佳实践,并包含了很多看似细微但却可以显著提升代码可读性的编程技巧。这本书的翻译还不错,但如果你想体会书中的英语幽默(例如Tyrannosaurus——Stegosaurus——Thesaurus),建议阅读它的英文影印版
  • 卓有成效的程序员:专注于生产效率(Productivity),它既包含源自作者多年经验的高生产率原则,也包含大量的提高生产率的小工具,每个追求高生产率的程序员都应该阅读这本书;
  • UNIX编程艺术:专注于程序设计哲学,这本书首先总结出包括模块化,清晰化,可组合,可分离等17个Unix程序设计哲学,接下来通过Unix历史以及各种Unix编程工具展示了这些原则的应用。尽管个人觉的这本书有些过度拔高Unix且过度贬低Windows和M$,但书中的Unix设计哲学非常值得借鉴。

2. 面向对象程序设计

Head First设计模式

无论是在Amazon还是在Google上搜索设计模式相关书籍,Head First设计模式都会排在首位——它使用风趣的语言和诙谐的图示讲述了观察者,装饰者,抽象工厂,和单例等关键设计模式,使得初学者可以迅速的理解并掌握设计模式。Head First设计模式在Amazon上好评如潮,就连设计模式原书作者Erich Gamma都对它给出了很高的评价。

需要注意,Head First设计模式是非常好的设计模式入门书,但千万不要把这本书作为学习设计模式的唯一的书——是的,Head First设计模式拥有风趣的语言和诙谐的例子,但它既缺乏实际的工程范例,也没有给出设计模式的应用/适用场景。我个人建议是在读过这本书之后立即阅读“四人帮”)的设计模式Bob大叔敏捷软件开发,以便理解设计模式在实际中的应用。

设计模式

设计模式作为设计模式领域的开山之作,Erich Gamma,Richard Helm,Ralph Johnson等四位作者将各个领域面向对象程序开发的经验总结成三大类23种模式,并给出了每个模式的使用场景,变体,不足,以及如何克服这些不足。这本书行文严谨紧凑(四位作者都是PhD),并且代码源自实际项目,属于设计模式领域的必读之作。

需要注意:设计模式不适合初学者阅读——它更像是一篇博士论文而非技术书籍,加上它的范例都具有很强的领域背景(诸如GUI窗口系统和富文本编辑器),缺乏实际经验的程序员很难理解这本书。

延伸阅读:

3. 重构

重构

任何产品代码都不是一蹴而就,而是在反复不断的修改中进化而来。重构正是这样一本介绍如何改进代码的书籍——如何在保持代码行为的基础上,提升代码的质量(这也是重构的定义)。

我见过很多程序员,他们经常声称自己在重构代码,但他们实际只做了第二步(提升代码的质量),却没有保证第一步(保持代码行为),因此他们所谓的重构往往会适得其反——破坏现有代码或是引入新bug。这也是我推荐重构这本书的原因——它既介绍糟糕代码的特征(Bad smell)和改进代码的方法,也给出了重构的完整流程——1. 编写单元测试保持(Preserve)程序行为;2. 重构代码;3. 保证单元测试通过。重构还引入了一套重构术语(诸如封装字段,内联方法,和字段上移),以便程序员之间交流。只有理解了这三个方面,才能算是理解重构。

修改代码的艺术

这里再重复一遍重构的定义——在保持代码行为的基础上,提升代码的质量。重构专注于第二步,即如何提升代码的质量,而修改代码的艺术专注于第一步,即如何保持代码的行为。

提升代码质量并不困难,但保持代码行为就难多了,尤其是对没有测试的遗留代码(Legacy Code)而言——你需要首先引入测试,但遗留代码往往可测试性(Testability)很差,这时你就需要把代码变的可测试。修改代码的艺术包含大量的实用建议,用来把代码变的可测试(Testable),从而使重构变为可能,使提高代码质量变为可能。

延伸阅读:

  • 重构与模式:这本书的中文书名存在误导,它的原书书名是Refactoring to Patterns——通过重构,把模式引入代码。这本书阐述了重构和设计模式之间的关系,使得程序员可以在更高的层次上思考重构,进行重构。

4. 软件测试

How to Break Software

关于软件测试的书籍很多,但很少有一本测试书籍能像How to Break Software这般既有趣又实用。不同于传统的软件测试书籍(往往空话连篇,无法直接应用),How to Break Software非常实际——它从程序员的心理出发,分析软件错误/Bug最可能产生的路径,然后针对这些路径进行残酷的测试,以保证软件质量。

我在第一次阅读这本书时大呼作者太过“残忍”——连这些刁钻诡异的测试招数都能想出来。但这种毫不留情(Relentless)的测试风格正是每个专业程序员所应具备的心态。

注意:如果你是一个测试工程师,那么在阅读这本书前请三思——因为阅读它之后你会让你身边的程序员苦不堪言,甚至连掐死你的心都有 :-D。

xUnit Test Patterns

How to Break Software注重黑盒测试,而这本xUnit Test Patterns则注重白盒测试。正如书名所示,xUnit Test Patterns覆盖了单元测试的每个方面:从如何编写良好的单元测试,到如何设计可测试(Testable)的软件,再到如何重构测试——可以把它看作为单元测试的百科全书。

延伸阅读:

  • Practical Unit Testing with JUnit and Mockito:尽管xUnit Test Patterns覆盖了单元测试的方方面面,但它的问题在于不够与时俱进(07年出版)。Practical Unit Testing弥补了这个缺陷——它详细介绍了如何通过测试框架JUnit和Mock框架Mockito编写良好的单元测试,并给出了大量优秀单元测试的原则;
  • 单元测试的艺术(第2版):可以把这本书看作为前一本书的.Net版,适合.Net程序员;
  • Google软件测试之道:这本书详细介绍了Google如何测试软件——包括Google的软件测试流程以及Google软件测试工程师的日常工作/职业发展。需要注意的是:这本书中的测试流程在国内很可能行不通(国内企业缺乏像Google那般强大的基础设施(Infrastructure)),但它至少可以让国内企业有一个可以效仿的目标;
  • 探索式软件测试James Whittaker的另一本测试著作,不同于传统的黑盒/白盒测试,这本书创造性的把测试比喻为“探索”(Exploration),然后把不同的探索方式对应到不同的测试方式上,以便尽早发现更多的软件错误/Bug。

5. 项目管理

极客与团队

很多程序员都向往成为横扫千军(One-man Army)式的“编程英雄”,但卓越的软件并非一人之力,而是由团队合力而成。极客与团队就是这样一本写给程序员的如何在团队中工作的绝好书籍,它围绕着HRT三大原则(Humility谦逊,Respect尊重,和Trust信任),系统的介绍了如何融入团队,如何打造优秀的团队,如何领导团队,以及如何应对团队中的害群之马(Poisonous People)。这本书实用性极强,以至于Python之父Guido van Rossum都盛赞这本书“说出了我一直在做但总结不出来的东西”

人月神话

尽管人月神话成书于40年前,但它仍是软件项目管理重要的书籍。人月神话源自作者Fred Brooks领导并完成System/360OS/360这两个即是放到现在也是巨型软件项目的里程碑项目的经验总结。它覆盖了软件项目各个方面的关键概念:从工期管理(Brooks定律)到团队建设(外科团队),从程序设计(编程的本质是使用正确的数据结构)到架构设计(概念完整性),从原型设计(Plan to Throw one away)到团队交流(形式化文档+会议)。令人惊讶的是,即便40年之后,人月神话中的关键概念(包括焦油坑,Brooks定律概念完整性外科团队第二版效应等等)依然适用,而软件开发的核心复杂度仍然没有得到解决(没有银弹)。

延伸阅读:

  • 人件(原书第3版):从人的角度分析软件项目。人件从雇佣正确的人,创建健康的工作环境,以及打造高效的开发团队等角度阐述了如何改善人,从而改善软件项目;
  • 门后的秘密:卓越管理的故事:这本书生动的再现了软件项目管理工作的场景,并给出了各种实用管理技巧,如果你有意转向管理岗位,这本书不容错过;
  • 大教堂与集市:这本书从黑客的历史说起,系统而又风趣的讲述了开源运动的理论和实践,以及开源软件项目是如何运作并发展的。了解开源,从这本书开始。

6. 专业开发

程序员修炼之道:从小工到专家

不要被庸俗的译名迷惑,程序员修炼之道是一本价值极高的程序员成长手册。这本书并不局限于特定的编程语言或框架,而是提出了一套切实可行的实效(Pragmatic)开发哲学,并通过程序设计,测试,编程工具,以及项目管理等方面的实例展示了如何应用这套开发哲学,从而使得程序员更加高效专业。有人把这本书称之为迷你版代码大全——代码大全给出了大量的优秀程序设计实践,偏向术;而程序员修炼之道给出了程序设计实践背后的思想,注重道。

程序员职业素养

程序员修炼之道指出了如何成为专业程序员,这本程序员职业素养则指出了专业程序员应该是什么样子——承担责任;知道自己在做什么;知道何时说不/何时说是;在正确的时间编写正确的代码;懂得自我时间管理和工期预估;知道如何应对压力。如果你想成为专业程序员(Professional Developer)(而不是码农(Code Monkey)),这本书会为你指明前进的方向。

延伸阅读:

7. 大师之言

奇思妙想:15位计算机天才及其重大发现

奇思妙想:15位计算机天才及其重大发现是一本极具眼光的技术访谈书籍——在这本书访谈的15位计算机科学家中,竟出现了12位图灵奖获得者——要知道图灵奖从1966年设奖到现在也只有六十几位获奖者而已。

奇思妙想把计算机科学分为四大领域:编程语言;算法;架构;人工智能。并选取了每个领域下最具代表性的计算机科学家进行访谈。因为这些计算机科学家都是其所在领域的开拓者,因此他们能给出常人无法给出的深刻见解。通过这本书,你可以了解前三十年的计算机科学的发展历程——计算机科学家做了什么,而计算机又能做到/做不到什么。从而避免把时间浪费在前人已经解决的问题(或者根本无法解决的问题)上面。

编程人生:15位软件先驱访谈录

同样是访谈录,同样访谈15个人,编程人生把重点放在程序员(Coders at work)上。它从各个领域选取了15位顶尖的程序员,这些程序员既包括Ken ThompsonJamie Zawinski这些老牌Unix黑客,也包括Brad Fitzpatrick这样的80后新生代,还包括Frances AllenDonald Knuth这样的计算机科学家。这种多样性(Diversity)使得编程人生兼具严谨性和趣味性,无论你是什么类型的程序员,都能从中受益良多。

延伸阅读:

  • 图灵和ACM图灵奖(1966-2011):通过图灵奖介绍整个计算机科学发展史,非常难得的国产精品图书;
  • 编程大师访谈录:可以把这本书看作为二十年前的编程人生,被访谈者都是当时叱咤风云的人物(例如微软的创造者Bill Gates,Macintosh的发明者Jeff Raskin,以及Adobe的创始人John Warnock等等)。有趣的是这本书中大量的经验和建议到如今依然适用;
  • 编程大师智慧:类似于编程人生,不同的是被访谈者都是编程语言的设计者——这本书覆盖了除C语言以外的几乎所有主流编程语言。通过这本书,你可以从中学到编程语言背后的设计思想——编程语言为什么要被设计成这样,是什么促使设计者要在语言中加入这个特性(或拒绝那个特性)。从而提升对编程语言的理解。

8. 界面设计

写给大家看的设计书

书如其名,写给大家看的设计书是一本面向初学者的快速设计入门。它覆盖了版式,色彩,和字体这三个设计中的关键元素,并创造性的为版式设计总结出CRAP四大原则(Contrast对比,Repetition重复,Alignment对齐,Proximity亲密)。全书使用丰富生动的范例告诉读者什么是好的设计,什么是不好的设计,使得即便是对设计一无所知的人,也可以从这本书快速入门。

认知与设计:理解UI设计准则(第2版)

写给大家看的设计书强调实践,即如何做出好的设计;认知与设计:理解UI设计准则强调理论,即为什么我们会接受这样的设计而反感那样的设计。如果你想要搞清楚设计背后的心理学知识,但又不想阅读大部头的心理学著作,那么认知与设计是你的首选。

延伸阅读:

  • GUI设计禁忌 2.0:这本书指出了GUI设计的原则和常见误区,然后通过具体范例指出了如何避免这些误区。如果你的工作涉及到用户界面,那么这本书会为你减少很多麻烦;
  • 界面设计模式(第2版):这本书将用户界面中的常见元素/行为组织成彼此关联的模式,以便读者理解并举一反三,从而将其运用到自己的应用中;
  • 移动应用UI设计模式:类似于界面设计模式,但面向移动平台。它给出了iOS,Android,以及Windows Phones上常用的90余种界面设计模式,从而使得你不必把这些平台的应用挨个玩一遍也可以掌握各个平台的设计精髓。如果你主攻Android平台,那么Android应用UI设计模式会是更好的选择;
  • 配色设计原理版式设计原理:如果你读过写给大家看的设计书之后想继续深入学习设计,这两本书是不错的起点。

9. 交互设计

通用设计法则

书如其名,通用设计法则给出了重要的125个设计原则,并用简练的语言和范例展示了这些原则的实际应用。每个原则都有对应的参考文献,以便读者进一步学习。我之所以推荐这本书,是因为:1. 程序员需要对设计有全面的认识;2. 程序员并不需要知道这些设计原则是怎么来的,知道怎么用即可。这本书很好的满足了这两个要求。

交互设计精髓(第3版)

交互设计精髓是交互设计领域的圣经级著作。交互设计专家(以及VB之父)Alan Cooper在这本书中详细介绍了交互设计的原则,流程,以及方法,然后通过各种范例(主要来自桌面系统)展示了如何应用这些原则。

需要注意的是这本书的第4版已经出版,它在第三版的基础上增加了移动设计以及Web设计等内容。

延伸阅读:

  • The Design of Everyday Things:交互设计领域的另一本经典之作,它通过解读人类行动背后的心理活动,展示了设计问题的根源,并给出了一系列方法用以解决设计问题(需要注意,尽管这本书有中译版,但中译版对应的是02年的旧版,而非13年的新版);
  • The Inmates Are Running the AsylumAlan Cooper的另一本经典,这本书非常辛辣的指出让不具备人机交互知识的程序员直接编写面向用户的软件就像让精神病人管理疯人院(The Inmates Are Running the Asylum),然后给出了一套交互设计流程以挽救这个局面;
  • 简约至上:交互式设计四策略:专注于把产品变的更加简单易用。作者通过删除,组织,隐藏,和转移这四个策略,展示了如何创造出简约优质的用户体验。

个人成长

1. 职业规划

软件开发者路线图

软件开发者路线图是一本优秀且实用的程序员职业规划手册。这本书由若干个模式组成,每个模式都对应于程序员职业生涯中的特定阶段。通过这本书,读者可以很方便的找到自己目前所处的模式(阶段),应该做什么,目标是什么,以及下一个模式(阶段)会是什么。如果你时常感到迷茫,那么请阅读这本路线图,找到自己的位置,确定接下来的方向。

延伸阅读:

  • 卡耐基全集:非常著名的为人处世书籍。很多人把这本书归类到成功学,但我并不这么认为——在我看来,这本书教的更多的是如何成为一个让大家喜欢的人。作为天天和机器打交道的程序员,这套书会帮助我们与人打交道;
  • 沃顿商学院最受欢迎的谈判课:这本书不是教你去谈判,而是教你通过谈判(Negotiation)去得到更多(Getting more,这也是这本书的原书书名)。小到买菜砍价,大到争取项目,这本书中的谈判原则会让你收益良多;
  • 程序员健康指南:作为长期与计算机打交道的职业,程序员往往会受到各式各样疾病的困扰,这本书正是为了解决这个问题而出现:它从改善工作环境,调整饮食结构,预防头痛眼痛,以及进行室内/室外锻炼等方面出发,给出了一套全面且可行的程序员健康改善计划,以帮助程序员打造健康的身体。

2. 思维方式

程序员的思维修炼:开发认知潜能的九堂课

作为程序员,我们需要不断地学习——既要学习新技术,也要学习如何解决各种领域的问题。为了提升学习效率,我们需要学习如何学习程序员的思维修炼正是这样一本讲如何学习的书,它集合了认知科学,神经学,以及行为理论的最新研究成果,并系统的介绍了大脑的工作机制。通过这本书,你将学会如何高效的使用自己的大脑,从而提高思考能力,改善学习效率。

如何把事情做到最好

Mastery is not about perfection. It’s about a process, a journey. The master is the one who stays on the path day after day, year after year. The master is the one who is willing to try, and fail, and try again, for as long as he or she lives.

为什么同样资质的人,大多数人会碌碌无为,而只有极少数能做到登峰造极?如何在领域内做到顶尖?如何克服通往顶尖之路上的重重险阻?如何把事情做到最好回答了这些问题,并极具哲理的指出登峰造极并不是结果,而是一段永不停止的旅程。阅读这本书不会让你立刻脱胎换骨,但它会指引你走向正确的道路——通往登峰造极之路。

延伸阅读:

  • 怎样解题:数学思维的新方法:不要被标题中的“数学思维”吓到,它并不仅仅只是一本数学解题书,它所提出的四步解题法(理解题目->拟定方案->执行计划->总结反思)适用于任何领域;
  • 暗时间刘未鹏所写的关于学习思维方法的文章集,既包含了他对学习方法的思考,也包含了大量进一步阅读的资源;
  • 批判性思维:带你走出思维的误区:这本书系统的分析了人类思维的常见误区,并针对各个误区给出了解决方案,从而帮助程序员养成严谨正确的思考方式;
  • Conceptual Blockbusting: A Guide to Better Ideas:与批判性思维相反,这本书专注于创造性思维(Creative Thinking),它分析了阻碍创造性思维的常见思维障碍(Blockbuster)以及这些思维障碍背后的成因,并给出了各种方法以破除这些障碍。

3. 求职面试

金领简历:敲开苹果微软谷歌的大门

知己知彼,百战不殆。金领简历:敲开苹果微软谷歌的大门是程序员求职的必读书籍,它覆盖了程序员求职的方方面面:从开始准备到编写简历,从技术面试到薪酬谈判。由于该书作者曾在Google,微软,和苹果任职并进行过技术招聘,因此这本书的内容非常实用。

顺便吐个槽:这本书翻译的还不错,但我实在无法理解封面上的“进入顶级科技公司的葵花宝典”这段文字——找个工作而已,用不着切JJ这么凶残吧。-_–#

程序员面试金典(第5版)

同样是来自金领简历作者的作品,程序员面试金典(第5版)专注于技术面试题,它既包含了IT企业(诸如微软,Google,和苹果)的面试流程以及如何准备技术面试,也包含了大量(超过200道)常见技术面试题题目以及解题思路。无论你打算进入国内企业还是外企,你都应该把这本书的题目练一遍,以找到技术面试的感觉(我在求职时就曾经专门搞了一块白板,然后每二十分钟一道题的练习,效果很不错)。

延伸阅读:

  • 编程之美:微软技术面试心得:恐怕是国内技术面试第一书,这本书里面的多数题目都曾经是国内IT企业面试的必问题目。这本书的缺点是它太旧而且被用滥了(以至于一些企业开始避免使用这本书上的题目)——但你可以把它当成一本算法趣题来读;
  • 剑指Offer:名企面试官精讲典型编程题:相对于东拼西凑的XX面试宝典,剑指Offer是一本少见的国产精品技术面试书籍,尽管这本书的技术面试题目不多(60余道),但作者为大多数题目都给出了不同方式的解法,并分析了这些解法之间的优劣,此外作者还以面试官的视角分析了技术面试的各个环节,从而帮助读者把握技术面试;
  • 人人都有好工作:IT行业求职面试必读:可以把它看做金领简历的补充阅读——这本书的特点在于它给出了非常详细的简历/求职信/电子邮件编写技巧,而这正是不少国内程序员所缺乏的。

4. 英语写作

The Only Grammar Book You'll Ever Need

词汇量决定阅读能力,语法决定写作能力。计算机专业词汇并不多,但精确性非常重要,因此每个程序员都应具备良好的英语语法,但程序员并不需要过于专业的英语语法——掌握常用语法并把它用对就可以。The Only Grammar Book You’ll Ever Need正好可以满足这个需求,尽管它篇幅不大(不足200页),却覆盖了英语中的关键语法以及常见错误。把这本书读两遍,它会大幅度提高你的英语写作能力。

风格的要素

既是最畅销的英语写作书籍,也是计算机书籍中引用最多的非计算机书籍。风格的要素用极其简练的语言讲述了如何进行严肃精确清楚的英语写作。从这本书中,你不仅可以学到英语写作,更可以学到一种严谨至简的处事态度,而这正是专业开发所必需的。

延伸阅读:

  • 牛津英语用法指南(第3版):全面且权威的英语用法指南,它覆盖语法,词汇,发音,以及修辞等方面,并兼顾口语和书面语,以帮助读者掌握合理的英语用法(Proper English Usage)。不要被这本书的篇幅(1000多页)吓到——原书并没有这么厚,因为这本书被翻译成中文但又得保留原有的英文内容,所以它的篇幅几乎翻了一倍。考虑到这本书使用的词汇都很基础,所以我认为具有英语基础的读者直接阅读原版(Practical English Usage)会更合适;
  • 写作法宝:非虚构写作指南(30周年纪念版):详尽的非虚构(Non-Fiction)写作指南,无论你要写地方,技术,商务,运动,艺术,还是自传,你都可以从这本书中找到珍贵的建议;
  • 中式英语之鉴:中国人使用英语最大的问题就是会把中式思维掺杂其中,从而形成啰里啰嗦不伦不类的中式英语(Chinglish)。中式英语之鉴系统的探讨了中式英语以及其成因,然后根据成因对中式英语进行归类,并对每个类别给出了大量的实际案例以及修改建议。如果你想摆脱中式英语,那么这本书是绝好的起点。

如何使用这个书单

学而不思则罔,思而不学则殆。

不愤不启,不悱不发。举一隅不以三隅反,则不复也。

不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之,学至于行之而止矣。

来自他人的书单

它山之石,可以攻玉。我在本文最后给出其他中外优秀程序员的书单,以便参考&补充。

刘未鹏(暗时间作者)

以下同一条目下用“/”隔开的表示任选,当然也可以都读。

  1. 编码:隐匿在计算机软硬件背后的语言
  2. 深入理解计算机系统 / Windows核心编程 / 程序员的自我修养
  3. 代码大全 / 程序员修炼之道
  4. 编程珠玑 / 算法概论 / 算法设计 / 编程之美
  5. C程序设计语言
  6. C++程序设计语言 / C++程序设计原理与实践 / Accelerated C++
  7. 计算机程序的构造与解释
  8. 代码整洁之道 / 实现模式
  9. 设计模式 / 敏捷软件开发(原则模式与实践)
  10. 重构

云风(中国游戏编程先行者,前网易游戏部门资深程序员,简悦创始人)

  1. C++编程思想
  2. Effective C++
  3. 深度探索C++对象模型
  4. C++语言的设计与演化
  5. C专家编程
  6. C陷阱与缺陷
  7. C语言接口与实现
  8. Lua程序设计
  9. 链接器和加载器
  10. COM本质论
  11. Windows核心编程
  12. 深入解析Windows操作系统
  13. 程序员修炼之道
  14. 代码大全
  15. UNIX编程艺术
  16. 设计模式
  17. 代码优化:有效使用内存
  18. 深入理解计算机系统
  19. 深入理解LINUX内核
  20. TCP/IP详解

洪强宁(豆瓣技术总监)

  1. 代码大全
  2. 人月神话
  3. 编码:隐匿在计算机软硬件背后的语言
  4. 计算机程序设计艺术
  5. 程序员修炼之道
  6. 设计模式
  7. 计算机程序的构造与解释
  8. 重构
  9. C程序设计语言
  10. 算法导论

陈皓(CoolShell博主)

  1. 点石成金:访客至上的Web和移动可用性设计秘笈
  2. 重来:更为简单有效的商业思维
  3. 黑客与画家
  4. 清醒思考的艺术
  5. TCP/IP详解
  6. UNIX环境高级编程
  7. UNIX网络编程

张峥(微软亚洲研究院副院长)

  1. 算法概论
  2. Data Structure and Algorithms
  3. C程序设计语言
  4. UNIX操作系统设计
  5. 编译原理
  6. 计算机体系结构:量化研究方法
  7. 当下的幸福
  8. 异类:不一样的成功启示录

Jeff Atwood(Stackoverflow联合创始人)

  1. 代码大全
  2. 人月神话
  3. 点石成金:访客至上的Web和移动可用性设计秘笈
  4. 快速软件开发
  5. 人件
  6. The Design of Everyday Things
  7. 交互设计精髓
  8. The Inmates Are Running the Asylum
  9. GUI设计禁忌 2.0
  10. 编程珠玑
  11. 程序员修炼之道
  12. 精通正则表达式

Joel Spolsky(Stackoverflow联合创始人)

软件项目管理

  1. 人件
  2. 人月神话
  3. 快速软件开发

编程技艺

  1. 代码大全
  2. 程序员修炼之道

编程哲学

  1. 禅与摩托车维修艺术
  2. 哥德尔、艾舍尔、巴赫:集异璧之大成
  3. 建筑模式语言

界面设计

  1. 点石成金:访客至上的Web和移动可用性设计秘笈
  2. 交互设计精髓
  3. The Design of Everyday Things

资本运作

  1. 漫步华尔街

图形设计

  1. 写给大家看的设计书

思维方式

  1. 影响力
  2. Helplessness On Depression, Development and Death

编程入门

  1. 编码:隐匿在计算机软硬件背后的语言
  2. C程序设计语言

DHH(Ruby on Rails创始人)

  1. Smalltalk Best Practice Patterns
  2. 重构
  3. 企业应用架构模式
  4. 领域驱动设计
  5. 你的灯亮着吗?发现问题的真正所在

参考

  1. 怎样花两年时间去面试一个人
  2. What is the single most influential book every programmer should read?
  3. Recommended Reading for Developers
  4. Book Reviews — Joel Spolsky
  5. The five programming books that meant most to me

 

 

作者:Lucida

原文链接:http://lucida.me/blog/developer-reading-list/

一个程序员的顿悟:这6点带来的差距真的不是一点点

来自:建造者说
链接:
http://guoze.me/2015/03/02/excellent-programmer/
作者:微博:@GavinBuildSomething

我算是靠坑蒙拐骗进了程序员的门,然后一路狂奔。26岁之前几乎没有任何写代码的经验,研究生毕业却意外选择了一家不可能提供培训的初创公司,在每日担忧公司倒闭、害怕被炒鱿鱼以及同事冷落白眼的三重压力下逆流而上,一年半后离职,已是拥有500万用户产品的后台主程。从前我对计算机技术心怀畏惧,认定技术高人一定有佛光笼罩,昼夜不息运键如飞日吐代码上万行。现在也算见过一些世面了,回首那段忐忑不安宛如初夜的过程,我却不发觉有任何的励志意味,而是视为一种理所当然。理想的程序员,和理想的建筑师、理想的财务师、理想的按摩师没有任何的差别,他们本质上都是一群手艺人。我相信理想的程序员人人皆可成为。

近三年总在互联网圈厮混,我认识过一些程序员,共事过一些程序员,领导过一些程序员,又面试过一些程序员。他们学历不同,有的来自北大,有的来自培训机构,有的是博士,有的是高中肄业;资历也不同,有的来自BAT,有的来自某破产基金公司(还是一个销售);年限也从 0 到 15年不等。但我认为程序员只需分三类:天才的程序员、理想的程序员、平庸的程序员。天才的程序员我只敢说接触过 3 个,这是天命。7分由你是颗精子的时候就已决定,拥有绝佳的数学天赋、冷静致密的逻辑、为解决难题宁愿不眠不休而深以为乐的技术热情;3分来自起步要早早早,恨不得同龄人玩泥巴的时候就得开始玩电脑,大学毕业前就突破一万小时法则,后面的已是游戏人生。

天才的程序员可遇不可求,更不能长有,我看到的90%仍是平庸的程序员。IT时代的膨胀,已让程序员如同文艺复兴时的印刷匠一样的普通,多数投入祖师爷门下的人,仅是为了更大的饭碗,更高的待遇,更好的生计。平庸的程序员编写腐烂的代码,没有规范和一致性,固守旧世界的语言,还好谈论大的架构和性能,说的比做的漂亮。而毫无例外的,他们认定技术没有出路,做产品、营销和管理的是更高大上的手艺,而他们当中的99%,又会自然的流露出自己恰巧具备了那方面的天赋,至于进程为什么会崩溃这样的小问题是不屑于去了解的。

而我最喜欢和理想的程序员相处,恨不得与他们同吃同住,如果允许,我希望我的队伍能插满他们的旗帜。理想的程序员心眼儿不坏(他们从来都不是办公室政治的宠儿,是一群单纯明亮快乐的手艺人),有天真烂漫的好奇心(他们的眼睛里经常闪着 「哇,这个是怎么做到的!」),永远精益求精(他们的口头禅是「我再研究一下」),还乐于分享(他们活跃于GitHub、各大问答社区和你的身边,舍得将 宝贵时间用于帮助新手)。是的,他们不需要被管理,只需要给一个大的方向,总能回报以意想不到的结果。

理想的程序员与平庸的程序员只有一墙之隔。两者的差距只有 6个一点点,而人与人的差距,正是在这日积月累的一点点中,被永远拉开了。有意思的是,我发现这 6个一点点都和意识有关,也就是程序员和其他一切新兴产业的工种一样,只需要意识加上时间的锤炼,人人皆可达到理想的阶段。理想的程序员必然也是一个优秀的problem-solver。

第1个一点点:专注眼下

见过太多心猿意马的程序员,我不得不把「专注眼下」作为天字第一条。他们往往有各式各样的小梦想,比如做个小茶农、做个小鹅贩、做产品、做销售、做投 资,却被程序员的高薪或是没有转行的魄力「耽误」了,而因为不专注,他们不在意做好自己的本分,不在意锤炼自己的技能,不在意学习新兴的技术。不可否认, 这世界上存在着伟大的产品(像乔老爷)、伟大的销售(像埃里森)、伟大的投资客(像彼得菲),而他们毫无例外都是程序员出身。可你听说过巴菲特评价盖茨的 话么,比尔盖茨如果转行去卖狗,那他一定是全世界最大的狗贩。我坚信除了少数的天才外,冥冥众生均可以在多个领域取得成功,只要保持足够的专注。而哪怕你 下一年就想卖狗去,程序员的经验仍然能训练你强大的逻辑、谨慎和耐心,放在哪个行业都是相当可观的竞争力。

第2个一点点:思考力与推动力

我认为处理bug、崩溃、调优、入侵等突发事件比编程本身更能体现平庸程序员与理想程序员的差距。当面对一个未知的问题时,如何定位复杂条件下的核心问 题、如何抽丝剥茧地分析问题的潜在原因、如何排除干扰还原一个最小的可验证场景、如何抓住关键数据验证自己的猜测与实验,都是体现程序员思考力的最好场 景。是的,在衡量理想程序员的标准上,思考力比经验更加重要。

有时候小伙伴跑过来,问我「提交了一个任务被卡住了,怎么办」的时候,我总觉得他可以做得更好。比如,可以检查试验别的任务,以排除代码自身的原因;可以通过 Web UI 检查异常(如果没有账号,可以让我提供);可以排查主机日志或删除缓存,再不济,总应该提供任务 ID和控制台日志给我。理想的程序员永远不会等事情前进,他们会用尽一切方法让事情前进。

第3个一点点:Never Say No

记得从前厂离职之前,找老板谈话,他说我最大的优点就是从来不和他说这个做不到。后来我发现在很多团队里,都存在一种技术和产品的对立,程序员往往以 「技术上无法实现」来挡产品的需求,而产品也往往以「Facebook可以为什么我们做不到」来奚落程序员。这两句话应该属于禁语,从根本上都不利于程序 猿和产品狗的相亲相爱。

一句「技术上无法实现」是容易出口,可有多少人在说出这句话的时候,心里是100% 肯定的?如果不肯定,为什么不能回去谷歌一下再回答?原本我以为程序员是充满想象力,在因为有想象力,才能诞生那么多改变我们生活的软件和互联网产品。见 识多了,才了解大部分程序员已经在与bug的对抗中变得保守而不愿担当风险,与此同时许多团队也不愿意宽容失败。于是「Say No」变成一种习惯性的抵触,还记得曾国藩为什么解散湘军么?他说那支军队已「暮气渐深」,不能打仗了。要做理想的程序员,就不能给自己滋生暮气的机会, 如果面对不合理的需求,可以把时间成本摆出来,把曲线救国方案亮出来,简单粗暴「Say No」是不可取的。

第4个一点点:投资未来

程序员是一个非常残忍的职业。你所学所用的语言、框架、模式,很可能在数年内就成昨日黄花了;你现在嘲笑的另一群程序员,可能马上就能转身来嘲笑你了。 所以理想的程序员除了做好自己的本分,还要花费时间来投资未来。什么是「投资」?投资就是你现在投入的时间,在未来会以更多的时间或者金钱(看看早几年学 习iOS的程序员现在的薪酬!)回报你。举我自己的领域 — 数据挖掘为例,08年左右Hadoop开始兴起,一时「大数据」概念火热,Hadoop工程师万金难求,各互联网公司纷纷把数据统计、数据分析和数据 挖掘的业务切换到分布式平台上。这几年眼看 Hadoop 还在不断迭代,Spark又异军突起,一举刷新了 Hadoop 保持的排序记录,以内存存储中间数据带来的性能优势和丰富的数据结构让人爱个不停,各种奇异的小 bug和陡峭的学习曲线又让人打退堂鼓。那么,明眼人都知道 Spark 是未来的趋势(内存会越来越便宜),在主业务放在 Hadoop的条件下,就可以适当把一些小模块切换到 Spark 上,同时留意 Spark 社区的发展。很快从 Spark 获得的性能收益就能把之前投入的学习时间挣回来。

第 5 个一点点:善用工具

善用工具可以分为4个层面:

  • 搜索引擎
  • 不相信重复
  • 代码片段
  • 自动化

我刚入行那会,一个计算机专业却当了公务员的朋友问我,你一点都没学过编程,平时怎么 写代码?我说,谷歌,于是遭到无情的耻笑,以至于我在哪里的账号都叫2shou,告诫自己是一个无耻的二手程序员。这是一个笑话,但如果现在问我,我还是 要回答谷歌。程序员的成长就像膨胀的圆饼,外面是无边无际的大海,圆饼越大,与大海接触的面也越大,懂的越多,不懂的越多,而计算机科学又是一门更新换代 异常迅速的学科,同时也是知识互联网化最好的学科,很难利用传统的科班式有教有学的方法,相反通过搜索引擎则很容易获取到最新的知识。

不相信重复,大师的话叫DRY原则(Dont repeat yourself),代码写多了,会有人为的直觉判断好的和烂的代码,我的标准是简洁和规范,简洁并不是美感上的标准,重复越少,给自己出错的机会也越少,后期维护的成本也越少。

如果你不幸丢了三周前的代码,也许你能凭着过人的记忆力把脑子里残余的片段复写出 来,但如果丢的是三个月前的代码,恐怕就没有那么好的运气了。理想的程序员会着力找寻有效的资料保存方式,把工作里灵光闪现写下的代码、脚本、配置、 经验等短的片段保存起来,以便任何时候都能复查。

理想的程序员必须懒惰。对他们来说,重复的步骤和重复的代码一样丑陋,如果意识到一项工作有可能长期要重复,那么自动化的时间总是越早越好。

第6个一点点:管理时间

之所以管理时间会对程序员这个行当特别重要,是因为在完成任务时你必须像荒野里的狼一样,「独行」。没有外界约束的情况下还能稳定控制自己,保证能高效率地工作和学习,那么日积月累你肯定会变得比一般人厉害。

程序员干的是高强度的脑力活,一般每天集中4-5 个小时应对本职工作就足够了,但工作之外,一定要安排时间用于学习。除了学习,留点时间放空自己也是必要的,利用泡茶或者喝咖啡的间隙,把弥足珍贵的时间留给自己,往前想往后想,事半功倍。

说了这么多,想必有人会问,费劲心思成为一个理想的程序员,又有什么用处?会有高薪吗?不。能升职吗?也不见得。迎娶白富美呢?不如去卖狗。

稻盛和夫曾经说过一个故事,明治时期的手艺人被天皇召见,虽然都是不读书的乡下人,但一辈子兢兢业业地做一件事情,自然有一股高贵的气质。理想的程序员,应该就是循着这种高贵的气质而去的吧。

CMU大师对软件工程师的系统建议

2016-04-16 新智元 新智元

 新智元翻译1

来源:Quora

【新智元导读】软件工程师想学机器学习,有什么好建议?机器学习专家、卡耐基梅隆大学教授、1-Page公司首席科学家 Alex Smola 在 Quora 上给出了系统、具体的回答,还列出了推荐图书和论文。当然,如果你认为还有其他值得推荐的内容,留下评论,欢迎补充!

 

问题:你对想要学习机器学习的软件工程师有哪些建议?(What would be your advice to a software engineer who wants to learn machine learning?)

Alex Smola: 这 很大程度上取决于软件工程师的背景及其具体想掌握机器学习的哪部分知识。简而言之,我们以一名拥有四年本科学位和一到两年行业经验的初级程序员为例,并假 设这位程序员希望学习计算广告学、自然语言处理、图像分析、社交网络以及搜索和排序。那么,我们先说掌握机器学习有哪些基本要求(致学术界同仁的免责声 明:下列内容并不完整,如果未列入你的论著,在此提前致歉)。

线性代数

机器学习以及数据统计和优化都需要这方面知识。这也是为什么GPU(图形处理器)远比CPU(中央处理器)适合进行机器学习。作为程序员,至少需要基本掌握以下内容:

  • 标量、向量、矩阵、张量
    把它们看作你可以组建并相互转换的零维、一维、二维、三维和更高维物体,有点像乐高玩具,它们使得基本的数据转换成为可能。
  • 特征向量、范数、矩阵近似、分解
    这些概念本质上是让你习惯线性代数的用法。如果你希望分析一个矩阵的情况(比如,检查为何循环神经网络中出现梯度消失,为何增强学习算法中控制器出现分歧(diverge)),你就必须要理解在应用矩阵和向量时可能出现的增长和减小范围是多少。如果你希望代码表现出色和稳定,那么低秩等矩阵近似算法或乔列斯基分解就很有用。
  • 数值线性代数

    如果你需要做很多最优化计算,那么这部分知识就很有用。对核方法和深度学习来说如此,对图像模型和采样器而言则不那么重要。

最优化(和基本演算)

在许多情况下,设置要问的问题是相当容易的,但得出答案却没没那么简单。举例来说,如果要对一些数据进行线性回归(即找到一条线),你可能希望尽量减少与观测值的距离平方的总和。同样,如果想获得一个好的点击率预测模型,你就得最大化对于人们点击广告概率预测的准确性。这意味着我们通常会有一些目标、一些参数和大量数据,而我们需要通过一种方式来解决问题。这一点很重要,尤其因为我们常常不会有一个闭合式解决方案。

凸优化

很多时候,在优化问题不存在许多局部解决方案的情况下是不错的。当问题为凸时就会发生这种情况。(若你能在一个集合内任意两点间画出一条直线且这条直线处于该集合内,则这一集合就是凸的。若你能在图上任意两点间画出一条直线且这条直线位于图形上方,则这一函数是凸的。)

也许这一领域的经典书籍是这本由Steven Boyd和Lieven Vandenberghe所撰写的 Convex Optimization 。本书免费且非常棒。(回复041501下载,共730页)此外,Boyd的课程里也有许多很不错的幻灯片集。Dimitri Bertsekas也已经编写了关于最优化、控制等的宝典。这些应该足以供任何人开始了解这个领域了。

随机梯度下降算法

这一算法早期在很大程度上只是凸优化的一种特殊情况(至少早期定理是这样的),但最近发展很大,并且绝非是由于数据的增多。原因是,想象一下你有一些数据要处理,而你的算法需要将所有的数据都浏览一遍后才能继续新的步骤。而如果我故意给你10份同样的数据,那么你就必须重复10次工作,却没有什么实质性用处。显然,现实情况不会如此糟糕,但如果你需要操作多次小的新步骤,而每个小步骤之后都需要观测,它就能帮上忙。这在机器学习领域带来了相当大的变革型影响。此外,许多关联算法都容易得多。

我们面临的挑战是如何将其并行化。也许这个方向的第一步之一就是我们2009年的 Slow Learners are Fast 论文(回复041502下载)。最新版本是无锁变异型,例如Niu等于2013年所著的Hogwild论文(回复041503下载)。简而言之,这些算法通过人工计算机计算局部梯度并以异步方式更新共识参数集来运作。

另一个挑战是如何应对控制过度拟合的各种方法,例如通过正则化来实现。对于凸罚函数来说,有一种所谓近端梯度算法。一种比较流行的选择是Amir Beck和Marc Teboulle的FISTA算法。部分代码参见Francis Bach的SPAM toolbox(http://spams-devel.gforge.inria.fr/)。

非凸方法

许多机器学习问题都是非凸问题。从本质上来说,任何与深度学习相关的问题都是。但聚类、主题模型和几乎任何潜变量方法和当前几乎所有在机器学习领域有意思的问题也都是。部分加速技术可以提供帮助。例如,我的学生 Sashank Reddy最近展示了在这种情况下如何获得收敛的良好比率。

有许多被称为谱方法的技术可以使用。 Anima Anandkumar在她最近的Quora session中已经非常详尽地回答了这一问题。请参阅她的回复,因为其回复无比详细(https://www.quora.com/profile/Anima-Anandkumar-1)。概括地说,凸问题并非唯一能够确切解决的问题。在某些情况下,可以得出一个难题的数学表达式以显示只有某一组特定的参数能找到所有的集群、主题、相关比例、神经元或所有数据中的任何东西。这仅在你有能力且愿意花很多数学的功夫时才有效。

在培训深层网络方面(Deep Networks),最近有许多新技巧。我会在后面的内容中提及这些,但在某些情况下,目标不仅仅是优化,而是制定出一套具体的解决方案(几乎像是那本题为The Journey is the goal《旅程即是目的》的书)。

系统

机器学习正在成为大部分有关于人、测量、传感器和数据的关键要素,这与过去十年标度算法(scaling algorithms)的突破密不可分。Jeff Dean去年出了六套机器学习教程,也并非偶然。如果有人过了十年与世隔绝的生活,在这里给补充一下,他就是MapReduce、谷歌文件系统、BigTable和其他十多项成就了谷歌的关键技术背后的男人。

说笑归说笑,关于系统的研究为解决分布、异步、容错、可扩展和简易问题提供了宝贵的工具。后者是机器学习研究人员常常忽视的一点。简易是一种特性,不是一个错误。一些基本的技巧将带给你很多:

分布式哈希表

这实质上是如分布式缓存(memcached)、dynamo、 pastry和orceph等方法

构建的基础。它们都解决同一个问题——如何在避免访问之前数据输往的中央储存库的情况下向多台机器发布数据。为了达到这一目的,你需要将地址以一种随机又确定的方式编码(也就是哈希)。此外,你需要解决如果任何一台机器出现故障时谁将负责处理。

这就是我们在参数服务器(Parameter Server)中使用的数据布局。我的学生李沐是这个项目背后的智囊。工具组合参见DMLC(http://dmlc.ml/)。

一致性和信息传送

所有这一切的教父是Leslie Lamport的PAXOS 协议。它解决了在不是所有机器任何时候都可用或有些机器出现故障时如何达成共识的问题(是的,我在这儿就一句带过了)。如果你曾经使用过版本控制,你可能靠直觉知道它是如何工作的——大量机器(或开发者)产生更新(或代码段),而你希望将这些都结合成有意义的信息(例如,你不该两次运用微分),但又不需要所有机器与其他所有机器一直传递着信息。

在系统中,解决方案是使用向量时钟(参见例子:谷歌的Chubby)。我们在参数服务器中使用它的一种变体。关键的区别在于(均引自李沐)在参数范围内使用向量时钟。这可以确保不会因为时间标识耗尽内存,就像一个文件系统并不需要为每一个字节都记录一个时间标识。

容错、Scaling和云


最简单的自学方法就是在亚马逊AWS、谷歌GWC、微软Azure, 或你可以找到的各个其他平台上运行算法。当你第一次启动1000个服务器,意识到你正在向一个实际上的合法僵尸网络发送大量指令时,还是很令人激动的。我在谷歌工作时,我们控制了欧洲某处了5000个高端机器,用于主题模型中的推理。我们所调用的能源价值如果和一个核电站相比,也要占很大的比重了。我的经理当时把我叫到一旁,说这真是个昂贵的实验……

或许最容易起步的是学习docker。为了让scaling更容易,人们热火朝天地开发了不少工具。Docker Machine和Docker Cloud或许是近来最好的新工具,使你能像更换打印机驱动一样方便地连接不同的云端。

硬件


这似乎显而易见,但如果你了解自己算法所运行的硬件,的确会很有帮助。这会让你知道你写的代码是否已经接近峰值性能。初学者可以阅读Jeff Dean的Numbers every engineer should know一书。我在面试时最喜欢问的问题(曾经)是,应聘者的电脑有多快。知道算法的局限大有裨益:是缓存、内存带宽、延迟时间还是硬盘等等。Anandtech上有非常棒的介绍性文章,以及对微处理器架构等相关内容的测评。只要英特尔、ARM、AMD发布新硬件时,都可以去看一看。

统计学


我特意把这点留到最后。因为每个人都知道这是关键(的确如此),然后就忽略了其他所有东西。统计学确保你能问出好问题,同时帮助你理解自己在数据建模时用了多少估算。
从图像模型、核方法到深度学习等等,很多改进其实来自提出对的问题,也即定义了合理的优化目标,从而进行最优化。

Statistics Proper


Larry Wasserman的《统计学完全教程》(All of Statistics)是不错的入门教材。另外也可以看一下 David McKay 的 Machine Learning 一书。该书免费(篇幅很长、内容全面,回复041504下载)。其他还有不少好书,比如说 Kevin Murphy, Chris Bishop, Trevor Hastie, RobTibshirani 以及 Jerome Friedman 的著作The Elements of Statistical Learning:Data Mining, Inference, and Prediction。是的,Bernhard Scholkopf 和我也写了一本Learning with Kernels

随机算法和概率统计


本质上就是用计算机科学解决一样的问题,关键区别在于他们是设计算法的一种工具,而非用来适配参数的一个问题。我特别喜欢 Michael Mitzenmacher 和Eli Upfal 写的书Probability and Computing: Randomized Algorithms and Probabilistic Analysis ,非常易读但同时谈到了许多深刻的问题。如果你想更深入地了解这些工具,还有 Rajeev Motwani 和 Prabhakar Raghavan 的书Randomized Algorithms,写得很好,不过如果你没有较好的统计学背景,可能较难读懂。

我的回答可能已经够长了,很少有人会一直读到这里。所以我接下来说得比较简短。网上有许多非常棒的视频资料。许多教授现在有自己YouTube频道,并上传自己的课程视频。如果你在学习比较复杂的工具,这些视频会有所帮助。我的视频在这里(https://www.youtube.com/user/smolix/playlists),Nando de Freitas的要好很多。

 

其他还有一些工具。DMLC是好的起点,其中有许多用于分布式可扩展推理的算法,包括基于MXNET的神经网络。

 

还有很多没谈到的:编程语言、数据源等等。但这个回答已经太长了,我会在其他问题中继续讨论。

附录,Alex Smola 著书:

  • G. Bakir, T. Hofmann, B. Schölkopf, A.J. Smola, B. Taskar, and S.V.N. Vishwanathan, editors. Predicting Structured Data. MIT Press, Cambridge, MA, 2006.
  • S. Mendelson and A. J. Smola, editors. Machine Learning, Proceedings of the Summer School 2002, Australian National University, volume 2600 of Lecture Notes in Computer Science. Springer, 2003.
  • B. Schölkopf and A. J. Smola. Learning with Kernels. MIT Press, 2002.
  • B. Schölkopf, C. J. C. Burges, and A. J. Smola, editors. Advances in Kernel Methods–Support Vector Learning. MIT Press, Cambridge, MA, 1999.
  • A. J. Smola, P. L. Bartlett, B. Schölkopf, and D. Schuurmans, editors. Advances in Large Margin Classifiers. MIT Press, Cambridge, MA, 2000.

Slow Learners are Fast 论文(回复041502下载)。最新版本是无锁变异型,例如Niu等于2013年所著的Hogwild论文(回复041503下载)

关于这一讨论,你认为还有其他值得推荐的内容?留下评论,欢迎补充!

购书可扫二维码或点击 阅读原文 获取促销链接

你可以培养下一个乔布斯吗?

编者按:中西方文化和教育在很多方面大相径庭。海外的华人父母常常感概,不仅是孩子,自己也需要在文化适应方面作出大的努力。

如何培养孩子尊重规则又不失去创造和想象的动力,是很多父母面临的育儿难题。受幼年乔布斯故事的触动,一位旅美中国妈妈反思了对三个孩子的抚养,指出了传统教育中禁锢孩子潜在成长的相关问题。

文/ 李青原 (本公号创刊专栏作者) 三个充满了好奇心、能量无穷男孩的妈妈。 毕业于上海外国语大学,随后继续到美国深造。在北美金融投资业闯荡十五年后,终于在2014年决定辞去投资业工作,力争专心做个妈妈,且同时在寻找一份可寄予爱心和为社会做出更直接贡献的事业。


最近读了沃特·伊沙克森的乔布斯传,感触很深。苹果的创始人乔布斯是现代社会无可非议的创造力和应用想象力的代表。他不但将Pixer和苹果创建成为世界一流的公司,而且对个人电脑,动画,音乐,电话,平板电脑,电子发行六大行业做出前所未有的改革。

面对着书中那个桀骜不驯,藐视权威,玩世不恭的儿时的乔布斯,我不禁问自己:“如果我有一个这样的儿子,他是否能成为乔布斯?” 答案是,可能性很小。之所以这样想,是因为传统的教育模式和社会期望会让我把孩子的创造性和想象力给扼杀了。 换句话说,如果幸运的话,他也许会有一份不错的工作,但他很难成为像乔布斯一样的创新人物和社会进步的推动力量。

读到幼年的乔布斯的篇章,触动我反思自己的育儿方式以及东西方社会的教育理念。无论是中国还是西方的父母都可能碰到以下几个方面的问题和困惑。希望以此文,来展开对相关问题的讨论。

奖惩分明(关于奖励)?

大家常说,教育孩子应以奖励为主。当我们的孩子们做对了一道题,做好了一件事时,我们常会奖励他们,比如说一张粘纸,一颗星星,或者是加分。一旦他们做错了什么,我们就会严厉批评。奖励也就因此成为孩子做事的动力。

然而,现代心里科学研究却发现,频繁的奖励对孩子的创造力和情商有很大负面影响。 首先,奖励是外界刺激。一旦失去外界刺激,人的行为很可能又回到刺激以前的样子。关键是要理解孩子,激发他们内在动力,这样的结果才能长久稳定。第二,过多的奖励与创造力和冒险精神成反比。比如说,当他们知道一种解题方法能给他们带来频频奖励时,他们就不愿意冒险去尝试一个新的方法。第三,频频奖励会让孩子们计较得失,急于求成,养成了功利心。

成功的道路是漫长的,艰苦的,可能要经历无数次的失败。在奖励中成长起来的孩子,能有毅力和耐性承受住这样的寂寞与煎熬吗? 再者,有很多人为别人,为社会,默默无闻几十年如一日地做好事,做义工,而不求报酬。在奖励下培养出的、做任何事都可能有功力心的孩子,会有这样一颗无私心和博大的胸怀吗?

满满的时间表?

放学后,孩子要练钢琴,念中文,做补充作业,阅读和游泳。到了周末,他们的日程安排更紧张,做课外作业,参加球队训练,上中文课,上钢琴课,学跆拳道,上课外辅导班,学画画,学下棋….,我们没有为孩子们留下足够的时间以让他们自行去经历,观察,总结,幻想,去热爱并体验大自然。他们更没有时间投入到自己的爱好与特长中,做自己喜欢的事情。他们的大脑和身体都被紧紧地囚禁在我们家长制定的框架中。在这种环境下长大的孩子即使有乔布斯和比尔·盖茨的智商,也很难将自己的特长和爱好发扬光大,更别提有时间去钻研创造了。

敬畏师长?

我们总是要求孩子从小就要听话,要服从父母和师长,不能和长辈顶嘴,更不能说长辈是错的。我们到处找有关教育的书,目的之一就是能让我们的孩子听话。作为家长的我们也为有尊师守纪的孩子而欣慰,为不听话的孩子而焦虑。 我们最常用的批评孩子(特别是对男孩子的)的话就是:“你怎么那么不听话!”

有一次我对四岁的二儿子说他应听话,因为听话的孩子人人喜欢。他疑惑地问我:“Why? Mummy, how do you know what you said is correct? “ (孩子回问:妈咪,你怎么知道你说的就全对呢?) 我当时不知道该怎样回答。仔细一想,他反问的不无道理!我们大人说的每句话、做的每件事就都是对的吗?有时候我们觉得他们不听话时,他们其实并没有做错什么,他们只是做了我们大人不喜欢的或认为不妥当的事罢了。

教育孩子尊敬他人是非常重要的,但尊敬不等于畏惧, 不管那个人是何种权威。记得几年前我的公司招了十几个刚从研究生院毕业的硕博士,其中一半是中国学生。 这些年轻人大多来自牛津,伦敦商学院,哈佛,斯坦福等世界著名学府。 但是,很明显的是,相比中国学生的内敛和拘谨,外国的年轻人更加勇于向领导提出建议,指出问题,表达创新意见,甚至试图去影响他们的管理人员。同样交上去一份报告,外国年轻人敢于每天敦促老板给他回复,而中国学生却被动地等待反馈。

怕他们犯错误?

孩子们做作业的时候,特别是男孩子,总是不专心。 于是,我们一有空就坐在他们身边陪同,不停地敦促他们。一看见他们做得有错,遇到难题,就忍不住指出并帮助。他们在做其他任何事的时候,我们也都是尽可能地予以关注,一见到他们遇到困难,就忍不住帮他们一把,以免他们犯错误。

记得我父亲常常对我说:“我天天敦促你,就是为了你少走弯路,甚至不走弯路。”但我们都知道,不走弯路是不可能的。关键不是不让孩子在幼年时做错事,而是通过幼年时的种种小“错误”,让他们学会思考,分析,自己寻找解决的办法,懂得无论做什么事情都需要承担责任和后果。我们不能保证孩子今后在社会上、工作上,不走弯路,不犯错误;我们所能做的是,教给他们处理和解决问题的能力。这样他们在社会上才能少犯错误,少走弯路。即使犯了错,走了弯路,也能很快认识及时纠正。

帮他们做选择?

作为家长的我们经常不由自主地对孩子的事务包揽包管,小到每天穿什么,吃什么,作文该写什么;大到上什么样的学校,做什么样的工作,交什么样的朋友。这样长久以来我们的孩子就不仅失去了主动性,更形成了依赖性。我们都知道人生就是无数选择的组合,要让我们的孩子有一个良好的未来,我们必须让他们学会在不同的环境中作出合适的选择。

最近和一位有过二十多年教育经验,并在世界各国(包括中国)帮助开设十几所国际学校的美国教育界人士谈起选择。他的观点是,相比起亚洲国家,西方国家,特别是美国的社会自由度太大了。他认为,如果孩子从小没有得到对事物分析能力和选择能力的培养,他们在稍大以后,会有困难抗拒不良的朋辈压力(peer pressure),做出不适当的决择,因此可能导致一系列问题,包括吸毒和患上忧郁症等。

选择的能力从小就要锻炼起来,但是这不等于娇惯他们让他们随心所欲。一开始的时候,可以限制他们的选择范围,随着年龄的增长,这个范围可以渐渐扩大。还有一点需要再次强调的是,要让他们对他们的选择结果负责,特别是错误的选择。在这个过程中我们可以帮助他们分析,但最终还是由他们做出选择,承受结果。

比如说早上穿衣服,他们要自己挑衣服。这时,做父母的可以拿出两到三件他们喜欢的,让他们在一定时间中(比如3分钟里)做出选择。父母可以告诉他们说:“你有两个选择。第一,你可以自己在这些衣服里选;第二,如果你们在三分钟内还选不好,我就要选一套给你了。” 很重要的是,三分钟内如果选不好,不管孩子怎么哭闹,他们都要穿上你给他选的衣服。

再比如,如果一个十几岁的孩子上学总迟到,你就可以给他这样的选择:1. 如果他能按时走,父母可以用车送他;2. 如果他晚了,他必须用自己的零花钱叫出租去上学。

总而言之,传统的教育方式在很大程度上禁锢了孩子的创造力,主动性,责任感。我认为,教育不仅要让孩子学会课本上的知识,更重要的是培养他们独立自主和处理事物的能力和责任感。因此,我们应该在一定范围内多给孩子自由和选择的空间,并且要让孩子学会对自己的选择和行为负责;鼓励他们敢于提问,不要害怕权威;不要怕孩子摔跤,要让他们学会在一次次摔跤后重新勇敢地站起来。

正如儿童发展研究领域先驱、美国心理学家和儿科医生阿诺德·格塞尔博士(Arnold Lucius Gesell,1880  – 1961)说的,孩子们的智慧会自我展现。他提出,如果我们给孩子提供一个可适度激发他们身心发育的环境,并且花合理的时间和他们在一起,那么他们将会按需学习并成长,他们的心智也将因此得到完善。

编辑: 王冬莹、韩桦

公号原创文章,欢迎转发分享

转载请务必注明出处 (作者/编辑 + 公众号名称)

15 Must Read Books for Entrepreneurs in Data Science

Source: http://www.analyticsvidhya.com/blog/2016/04/15-read-books-entrepreneurs-data-science/

,

Introduction

The roots of entrepreneurship are old. But, the fruits were never so lucrative as they have been recently. Until 2010, not many of us had heard of the term ‘start-up’. And now, not a day goes by when business newspapers don’t quote them. There is sudden gush in the level of courage which people possess.

Today, I see 1 out of 5 person talking about a new business idea. Some of them even succeed too in establishing their dream company. But, only the determined ones sustain. In data science, the story is bit different.

The success in data science is mainly driven by knowledge of the subject. Entrepreneurs are not required to work at ground level, but must have sound knowledge of how it is being done. What algorithms, tools, techniques are being used to create products & services.

In order to gain this knowledge, you have two ways:

  1. You work for 5-6 years in data science, get to know things around and then start your business.
  2. You start reading books along the way and become confident to start in first few years.

I would opt for second option.

15 must read books for entrepreneurs in data science

Why read books ?

Think of our brain as a library. And, it’s a HUGE library.

How would an empty library look like? If I close my eyes and imagine, I see dust, spider webs, brownian movement of dust particles and darkness. If this imagination horrifies you, then start reading books.

The books listed below gives immense knowledge and motivation in technology arena. Reading these books will give you the chance to live many different entrepreneurial lives. Take them one by one. Don’t get overwhelmed. I’ve displayed a mix of technical and motivational books for entrepreneurs in data science. Happy Reading!

List of Books

Data Science For Businessdata science for business vidhya

This book is written by Foster Provost & Tom Fawcett. It gives a great head start to anyone, who is serious about doing business with big data analytics. It makes you believe, data is now business. No business in the world, can now sustain without leveraging the power of data. This books introduces you to real side of data analysis principles and algorithms without technical stuff. It gives you enough intuition and confidence to lead a team of data scientists and recommend what’s required. More importantly, it teaches you the winning approach to become a master at business problem solving.

Get the book: Buy Now

Big Data at Workb2

This book is written by Thomas H. Davenport. It reveals the increasing importance of big data in organizations. It talks with interesting  numbers, researches and statistics. So until 2009, companies worked on data samples. But with advent of powerful devices and data storage capabilities, companies now work on whole data. They don’t want to miss even a single bit of information. This book unveils the real side of big data, it’s influence on our daily lives, on companies and our jobs. As an entrepreneur, it is extremely important for you understand big data and its related terminologies.

Get the book: Buy Now

Lean Analyticsb3

This book is written by Alistair Croll and Benjamin Yoskovitz. It’s one of the most appreciated books on data startups. It consist of practical & detailed researches, advice, guidance which can help you to build your startup faster. It gives enough intuition to build data driven products and market them. The language is simple to understand. There are enough real world examples to make you believe, a business needs data analytics like a human needs air. To an entrepreneur, this will introduce the practical side of product development and what it takes to succeed in a red ocean market.

Get the book: Buy Now

Moneyballb4

This book is written by Michael Lewis. It’s a brilliant tale which sprinkles some serious inspiration. A guy named billy bean does what most of the world failed to imagine, just by using data and statistics. He paved the path to victory when situations weren’t favorable. Running a business needs continuous motivation. This can be a good place to start with. However, this book involves technical aspects of baseball. Hence, if you don’t know baseball, chances are you might struggle in initial chapters. A movie also has been made on this book. Do watch it!

Get the book: Buy Now

Elon Muskb5

This book is written by Ashlee Vance. I’m sure none of us are fortunate to live the life of Elon Musk, but this book let’s us dive in his life and experience rise of fantastic future. Elon is the face behind Paypal, Tesla and SpaceX. He has dreamed of making space travel easy and cheap. Recently, he was applauded by Barack Obama for the successful landing of his spaceship in an ocean. People admire him. They want to know his secrets and this is where you can look for. As on entrepreneur, you will learn about must have ingredients which you need to a become successful in technology space.

Get the book: Buy Now

Keeping up with the Quantsb6

This book is written by Thomas H Davenport and Jinho Kim. As we all know, data science is driven by numbers & maths (quants). Inspired from moneyball, this book teaches you the methods of using quantitative analysis for decision making. An entrepreneur is a terminal of decision making. One must learn to make decisions using numbers & analysis, rather than intuition. The language of this book is easy to understand and suited for non-maths background people too. Also, this book will make you comfortable with basics statistics and quantitative calculations in the world of business.

Get the book: Buy Now

The Signal and the NoiseCover of the book 'The Signal and the Noise' by Nate Silver. Published by The Penguin Press

The author of this book is Nate Silver, the famous statistician who correctly predicted US Presidential elections in 2012. This books shows the real art and science of making predictions from data. This art involves developing the ability to filter out noise and make correct predictions. It includes interesting examples which conveys the ultimate reason behind success and failure of predictions. With more and more data, predictions have become prone to noise errors. Hence, it is increasingly important to understand the science behind making predictions using big data science. The chapters of this book are interesting and intuitive.

Get the book: Buy Now

When Genius Failedb8

This book is written by Roger Lowenstein. It is an epic story of rise and failure of a hedge fund. For an entrepreneur, this book has ample lessons on investing, market conditions and capital management. It’s a story of a small bank, which used quantitative techniques for bond pricing throughout the world and ensured every invested made gives a profitable results. However, they didn’t sustain for long. Their quick rise was succeeded by failure. And, the impact of their failure was so devastating that US Federal bank stepped in to rescue the bank, because the fund’a bankruptcy would have large negative influence on world’s economy.

Get the book: Buy Now

Lean Startupb9

This book is written by Eric Ries. In one line, it teaches how to not to fail at the start of your business. It reveals proven strategies which are followed by startups around the world. It has abundance of stories to make you walk on the right path. An entrepreneur should read it when he/she feel like draining out of motivation. It teaches to you to learn quickly, implement new methods and act quickly if something doesn’t work out. This book applies to all industries and is not specific to data science.

Get the book: Buy Now

Web Analytics 2.0

b10This book is written by Avinash Kaushik. It is one of the best book to learn about web analytics. Internet is the fastest mode of collecting data. And, every entrepreneur must learn the art of internet accounting. Most of the businesses today face the challenge of weak presence on social media and internet platforms. Using various proven strategies and actionable insights, this book helps you to solve various challenges which could hamper your way. It also provides a winning template which can be applied in most of the situations. It focuses on choosing the right metric and ways to keep them in control.

Get the book: Buy Now

Predictive Analyticsb11

This book is written by Eric Seigel. It is a good follow up book after web analytics 2.0. So, once you’ve understood the underlying concept of internet data, metrics and key strategies. This book teaches you the methods of using that knowledge to make predictions. It’s simple to understand and covers many interesting case studies displaying how companies predict our behavior and sell us products. It doesn’t cover technical aspects, but explains the general working on predictive analytics and its applications. You can also check out this funny rap video by Dr. Eric Seigel:

Get the book: Buy Now

Freakonomicsb12

This book is written by Steven D Levitt and Stephen J Dubner. It shows the importance of numbers, data, quantitative analysis using various interesting stories. It says, there is a logic is everything which happens around us. Reading this book will make you aware of the unexplored depth at which data affects our real lives. It draws interesting analogy between school teachers and sumo wrestlers. Also, the bizarre stories featuring cases of criminal acts, real-estate, drug dealers will certainly add up to your exciting moments.

Get the book: Buy Now

Founders at Workb13

This book is written by Jessica Livingston. Again, this isn’t data science specific but a source of motivation to get you moving forward. It’s a collection of interviews with the founders of various startups across the world. The focus has been kept on early days i.e. how did they act when they started. This book will give you enough proven ideas, strategies and lessons to anticipate and avoid pitfalls in your initial days of business. It consist of stories by Steve Wozniak (Apple), Max Levchin (Paypal), Caterina Fake (Flikr) and many more. In total, there are 32 interviews listed which means you have the chance to learn from 32 mentors in one single book. Must read for entrepreneurs.

Get the book: Buy Now

Bootstrapping a Businessb14

This book is written by Greg Gianforte and Marcus Gibson. It teaches about the things to do when you are running short of money and still don’t want to stop. This is a must read book for every entrepreneur. Considering the amount of investment required in data science startups, this book should have a special space in an entrepreneur’s heart. It reveals various eye opening truths and strategies which can help you build a great company. Greg and Marcus proves that money is not always the reason for startup failure, it’s all about founder’s perspective. This book has stories of success and failures, again a great chance for you to live many lives by reading this book.

Get the book: Buy Now

Analytics at Workb15

This book is written by Thomas H Davenport, Jeanne G Harris and Robert Morrison. This books reveals the increased use of analytical tools & concepts by managers to make informed business decisions. The decision making process has accelerated. For a greater impact, it also consists of examples from popular companies like hotels.com, best buy and many more. It talks about recruiting, coordination with people and the use of data and analytics at an enterprise level. Many of us are aware of data and analytics. But, only a few know how to use them together. This quick book has it all !

Get the book: Buy Now

End Notes

This marks the end of this list. While compiling this list, I realized most of these books are about sharing experience and learning from the mistake of others. Also, it is immensely important to posses quantitative ability to become good in data science. I would suggest you to make a reading list and stick to it throughout the year. You can take up any book to start. I’d suggest to start with a motivational book.

Have you read any other book ? What were your key takeaways? Did you like reading this article? Do share your knowledge & experiences in the comments below.