每个 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. :)

Recommended Reading for Developers

Jeff Atwood

This list was last updated in March 2015.

Why are updates to my reading list so rare? Because computers change a lot in 10 years, but people don’t.

To make better software, you need to understand how people work, and that is what the books I recommend tend to focus on.

Code Complete 2

cover

Steve McConnell’s Code Complete 2 is the Joy of Cooking for software developers. Reading it means that you enjoy your work, you’re serious about what you do, and you want to keep improving. In Code Complete, Steve notes that the average programmer reads less than one technical book per year. The very act of reading this book already sets you apart from probably ninety percent of your fellow developers. In a good way.

I like this book so much that the title of this very website is derived from it – the examples of what not to do are tagged with the “Coding Horror” icon. There’s nothing funnier than a Coding Horror – until you have to deal with one yourself. Then it’s suddenly not so funny any more. Do yourself a favor. Make this the first book you read, and the first book you recommend to your fellow developers.


The Mythical Man-Month

cover

Arguably the only classic book in our field. If you haven’t read it, shame on you.

I challenge any developer to pick up a copy of The Mythical Man Month and not find this tale of a long-defunct OS, and the long-defunct team that developed it, startlingly relevant. This twenty-five year old book boldly illustrates one point: computers may change, but people don’t.

Reading this classic work will certainly be a better use of your time than poring over the latest thousand page technical tome du jour.


Don’t Make Me Think

cover

The single best book on usability I’ve ever read. The title says “web usability” but don’t be fooled by its faux specificity. Steve Krug covers every important usability concept in this book, and covers it well. It’s almost fun. If you choose to read only one book on usability, choose this one. It’s chock full of great information, and it’s presented in a concise, approachable format. It’s suitable for any audience: technical, non-technical, user, developer, manager, you name it.

sample graphic from Don't Make Me Think

Er… yeah. Never been in a meeting like that. The solution to this problem, by the way, is quick and dirty usability testing. Imagine that: making decisions based on actual data instead of never ending, last man standing filibuster style religious debates. Revolutionary!


Rapid Development

cover

The full title of this book is Rapid Development: Taming Wild Software Development Schedules, which isn’t just long-winded and vaguely ridiculous, it’s also an unfortunate misnomer.

Rapid Development isn’t about rapid development. It’s about* the reality of failure* . The vast majority of software development projects will fail: they will overrun their schedules, produce substandard results, or sometimes not even finish at all. This isn’t an argument; it’s a statistical fact. The unpleasant truth is that your team has to be very good to simply avoid failing, much less to succeed. While that may sound depressing – okay, it is depressing– you’ll still want to read this book.

Why? Because half* of success is not repeating the same mistakes you, or other people, have made. The epiphany offered in this book is that making mistakes is good– so long as they are all new, all singing, all dancing mistakes. If you’re making the same old classic mistakes, you’ve failed before you’ve even begun. And you probably have no idea how likely it is that you’re making one of these mistakes right now.

Our field is one of the few where change is the only constant, so it’s only natural to embrace that change and try different “Rapid” development techniques. But the converse isn’t true. We can’t assume that so much has changed since 1970 that all the old software development lessons are obsolete and irrelevant when compared to our hot new technology. It’s the same old story: computers have changed; people haven’t. At least have some idea of what works and what doesn’t before you start– in McConnell’s words, “read the instructions on the paint can before painting.” Sure, it sounds obvious enough until you read this book and realize how rarely that actually happens in our field.

* According to the book, technically, one-quarter. But I think it’s more than that.


Peopleware

cover

If you’ve ever seen the performance of an all-star sports team suffer due to poor coaching, you’ll appreciate this book. It doesn’t matter how many “coding superstars” you’ve got when none of them can talk to each other, or agree on anything. And it no developer, however talented, can work effectively when constantly being barraged with minor interruptions. Developers aren’t known for their people skills, per se, but here’s the ironic part: the success of your project may hinge on just that. If you have any legitimate aspirations to be a “Team Leader” in practice instead of in name only, you need to pick up a copy of this book.

While Peopleware is full of great, totally valid points, it also implies a level of employee control over the workplace that is pure fantasy at most companies. But at least you’ll know when your work environment, or your team, are the real problem – and more importantly, what to do about it.


The Design of Everyday Things

cover

It can be incredibly frustrating to develop software, because so much can go wrong. A lot of what we do is defensive: trying to anticipate what will go wrong before it does. It’s mentally fatiguing, and can eventually manifest itself in some negative ways. I sometimes describe this to non-technical people as building a watch with a thousand moving parts, all of which can fail randomly at the slightest provocation. Good times!

Designing software is difficult, to be sure, but designing a door is difficult too. The nuances of design extend into every object you touch, whether it’s some hot new SQL engine, or a humble shoe. This book will give you a new appreciation of the “devil in the details.” If designing a door isn’t the no-brainer we thought it was, maybe it’s time to give ourselves a break for not being able to design software perfectly, either.


About Face: The Essentials of Interaction Design

cover

Alan Cooper, father of Visual Basic, godfather of usability. I’ve owned a few versions of this book now (this is version four), and it is the rare book which is getting better and better as it is revised, and more authors are added for different perspectives.

About Face is full of generally applicable guidelines for mobile and web. Of the GUI problems used for illustration – with examples from the hoary old Windows 95 UI – it’s interesting to compare which have been mostly resolved (using visual examples to show the effects of dialog selections before you make them), and which have not (stopping the proceedings with modal idiocy).

It’s a fantastically useful book; I’ve used whole chapters as guides for projects I worked on.


The Inmates Are Running the Asylum

cover

This is the book that introduced the world to the concept of personas: rather than thinking of users as an abstract, difficult-to-describe, amorphous group of people, personas instruct us to talk about specific users who have names, personalities, needs, and goals. Would our users want a print preview feature? Who knows? But if Gerry Manheim, Account Executive, has to print out his weekly expense report as a part of his job, you better believe print preview needs to be in there. There’s nothing magical here; as always, it boils down to knowing who your users are and what they really do – and the personas technique is a great way to get there.

There’s also an interesting analysis here of how developers tend to think themselves qualified to make usability decisions on behalf of “regular” users, when in reality they’re anything but. Developers are freakish, extreme users at best– “Homo Logicus” versus “Homo Sapiens.” Unless you happen to be writing a compiler where developers are the end users.

One hidden lesson in this book is that sometimes it doesn’t matter how good your design is: the scanner software and the web development software which Alan consulted on, and uses as examples in this book, both failed in the marketplace for reasons that had nothing to do with their usability– which was verifiably excellent.* Sometimes great products fail for reasons beyond your control, no matter how hard you try. Feel free to use this fact to counterbalance the sometimes bombastic tone of the book.

* I owned the exact model of “behind the keyboard” USB scanner pictured in the book, and I was quite impressed with the bundled scanning software. I eventually gave this scanner to my Dad. One time I was chatting on the phone with him and without any prompting at all, he mentioned to me how much he liked the scanning software. This was before the book had been published!


Programming Pearls

cover

I hesitated to include Programming Pearls because it covers some fairly low-level coding techniques, but there are enough “pearls” of software craftsmanship embedded in this book to make it well worth any developer’s time. Any book containing this graph..

.. is worth its weight in gold. TRS-80 versus DEC Alpha to illustrate 48n versus n3 algorithms? Come on folks, it just doesn’t get any better than that. Programming Pearls is the next best thing to working side by side with a master programmer for a year or so. It is the collective wisdom of many journeyman coders distilled into succinct, digestible columns.

I won’t lie to you: there are entire chapters that can probably be ignored. For example, I can’t imagine implementing sorting, heap, or hash algorithms as documented in columns 11, 13, and 14 respectively, given today’s mature libraries of such basic primitives. But for every textbook-tedious exercise, there is real, practical advice alongside. Just scan through the book, ignoring the code sections, and I doubt you’ll be disappointed. Column 8, “Back of the Envelope” is essential, probably the best treatment of estimation I’ve seen anywhere. It also goes a long way towards explaining those crazy interview questions that companies love to annoy us with.
You can read sample sections of the book online if you’re still on the fence. I recently used the chapter on strings to illustrate the use of Markov chains in generating synthetic data to fill an empty database with – a performance estimation technique covered in “Back of the Envelope”.


The Pragmatic Programmer: From Journeyman to Master

cover

This book reminds me a lot of Programming Pearls, but it’s actually better, because it’s less focused on code. Instead of worrying about code, the authors boiled down all the practical approaches that they’ve found to work in the real world into this one book. Not all of these things are technically programming. For example, asking yourself “why am I doing this? Is this even worth doing at all?” isn’t thinking outside the box; it’s something you should incorporate into your daily routine to keep yourself – and your co-workers – sane. And that’s what makes Pragmatic Programmer such a great book.

If you’d like to know a little more about the book, I created a HTML version of the pullout reference card included inside, which provides a nice overview of the contents.


Designing Web Usability

cover

Jakob Neilsen is well known for his usability site, and his career as a usability expert extends back to 1989 when his first book was published. Designing Web Usability is of course a full-on web usability primer, so it’s a bit different than the GUI-oriented Cooper books.


The Visual Display of Quantitative Information

cover

Visual Explanations: Images and Quantities, Evidence and Narrative

cover

Envisioning Information

cover

Beautiful Evidence

 

cover

Information is beautiful. And so is a well-designed GUI.

You don’t need to own all four books in the series unless you’re a completist (or a masochist, I suppose), but the first two are essential.

Chris Sells has some interesting insight on the Tufte books based on a Tufte seminar he attended in June 2004.


Regular Expressions Cookbook

cover

UNIX has a well-deserved reputation for being complex and impenetrable. So do Regular Expressions.

I may be a card carrying member of the “Keep It Simple Stupid” club, but I’m making a meteor sized exception for regular expressions. Written properly, they will save you a tremendous amount of time in string manipulation, and I’ve never run across a project where they didn’t come in handy somewhere.

Once you delve into the world of regular expressions, you may become drunk with the amazing power and potential they have, which results in things like Perl. Remember, absolute power corrupts absolutely. But it also rocks absolutely.

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演讲-我是怎样开始编程的。他分享自己怎样走上编程之路:玩游戏,开发游戏,找到苹果的开发平台,学会利用网上资源自己去开发游戏,并且建立了一个孩子们开发各种应用的俱乐部……演讲很有范……

最后,一个小投票:

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

2016年,互联网创业者一定要读这20本书

2016-02-10 方军 做書

创业成为热潮,互联网创业更热,从2016开始暂列名为“互联网创业的二十本书”清单,和在创业的朋友们“共同学习”,或者说“共同度过”。

在创业或创造的过程中,我们会有很多的迷惑和困惑,而其中一个重要的解决方法是去读书,和伟大的头脑对话,在他们的思考中印证和反思。

这个书单将分为几个部分:关于观念,关于方法,关于思维。

这个清单基本上没有商业人物传记,那是创业者获取灵感和激励的重要阅读品类,但正因为其明显而无需纳入;也没有纳入商业模式讨论的,那也是自然的阅读选择。

这个清单有不少新书,但也有很多老书,这个清单并不需要一口气读完,它所列的图书及提到的只是给出一个提示,当你遇到困惑或者有空闲时,你可以找到它。

关于观念

 01 《网络经济的十种策略》

凯文·凯利(Kevin Kelly, KK),广州出版社,2000年

“蜜蜂比狮子重要;级数比加法重要;普及比稀有重要;免费比利润重要;网络比公司重要;造山比登山重要;空间比场所重要;流动比平衡重要;关系比产能重要;机会比效率重要。”

虽然清单并无先后,但把凯文·凯利的这本《网络经济的十种策略》放在第一个,还是有选择的:

在2013年再听到他拿二十年多前的PPT讲述时,发现这些思考者的厉害之处在于,他们预见到了我们正在经历的一切。

正如这几年我一再推荐的科幻小说《雪崩》(斯蒂芬森)一样,在所有人设想的未来是控制操作系统的人控制世界的科幻小说界,它描绘了一个“快递员”控制的世界——我们就活在这样的世界。

 02 《创业维艰:如何完成比难更难的事》

本·霍洛维茨/著,中信出版社,2015年

“创业公司的CEO不应该计算成功的概率。创建公司时,你必须坚信,任何问题都有一个解决办法。而你的任务就是找到解决办法,无论这一概率是十分之九,还是千分之一,你的任务始终不变。”

这本书的英文版、中文版,我读过很多遍,因为已经转型成为成功风险投资人的本·霍洛维茨没有讲漂亮话,他讲自己所面对的处境,他如何选择的,他如何思考的。

这本书遍是金句,因此除了上面所引这句外,我另加一句:

“真正的难题不是绘制一张组织结构图表,而是让大家在你刚设计好的组织结构内相互交流。”

 03 《麦哲伦传》

茨威格/传,海燕出版社,2001年

“这个从来不再任何人面前流露自己感情的严厉的军人,突然被内心深处涌出的一股热流所制服了。他的眼睛模糊了,激动的热泪盈眶而出,滚落到他那散乱的黑须上。”

是的,就是那个第一个完成全球航行的麦哲伦传,是的,就是那个作家茨威格。

自从申音在某次推荐这本书之后,我一再阅读,读的理由不是麦哲伦在那个时代如何证明地球是圆的,对我们今天来说,环绕地球不过是坐飞机而已。

读它是反复体会他所经历的那个过程:拥有一个大胆的计划,怀着一个后来被证明正确的信念,成功找到钱和一大批人,带着错误的假设和错误的行动方案出发,遇到困难和团队不断地哗变,但最终完成第一人的航行。

 04 《一代新机器的灵魂》

特雷西·基德尔/著,机械工业出版社,1990年

“至于机器的真正发明人,工程师们,我看他们在这种活动中显得有点不合群、或许是因为这些人很少经历这样的场合。……不知为什么,我竟冷不丁冒出这样一句话:“只不过是台计算机,你知道,这在世界上确实是件很小的事。””

这本书讲述了还在小型计算机时代,一台计算机被创造出来的历程。

如果不是这两年的智能手机制造和智能硬件热潮,我们很多人应该很少有机会感受一个“机器”创造出来的过程。

我们创造的多数是网站、APP、商业系统,但是,所经历的过程是一样的。其实这本书和迈克尔·刘易斯记录早期互联网创业的《将世界甩在背后》(The New New Thing)争夺一个清单推荐位,而最终选择了《机器》,因为读它的过程很多感慨,而《世界》并没有。

 05 《黑客与画家:硅谷创业之父Paul Graham文集》

Paul Graham/著,人民邮电出版社,2011年

“创造优美事物的方式往往不是从头做起,而是在现有成果的基础上做一些小小的调整,或者将已有的观点用比较新的方式组合起来。”

YC创业营的创办人Paul Graham已经变成一种象征,推荐这本书实际上并非仅仅推荐这本书,因为这本书是完结不变的,而他还在不断地写作长文(essay),讲述他的思考,值得持续关注。

比如他最近有一篇新文章讨论的是“Life is short”,他讨论的这个问题,他的答案隐藏在题目中:“从问题的终极反过来看,去培养一种对你想做的事迫不及待的急躁习惯。”

关于方法

 06 《精益创业:新创企业的成长思维》

埃里克·莱斯/著,2012年

“新创企业是一个由人组成的机构,在极端不确定的情况下,开发新产品或新服务。”

精益创业度过了一次热潮大概在慢慢地沉寂,但偶尔看看还是很有价值,因为他以一个逻辑模型讲述了我们在过程中必然经历的学习过程,一个公司(产品)从没有到有的过程。

 07 《创业必经的那些事》

1/2共两册,迈克尔·格伯/著,2010年10月

“如果你正在经营一家小公司,或者说你想拥有一家小公司,那么,本书正是为你而写的。”

格伯的这本书不是为那些要创办指数级公司的创业者写的,其实这本书在创业热潮之前的书名是很朴实的《突破瓶颈》,它是一个管理故事,把小企业主所要经历的一些体会、知识放进去了。

但是,谁不是从小企业主走过来的。

我隐约还记得当时从这本书得到的一个实用智慧:即便只有一个人,也要把管理结构图画出来。

这个人既是董事长,又是CEO,又是负责市场的副总,又是负责运营的副总,又是负责财务的副总,又是销售经理,又是行政经理……董事长给CEO和管理班子派任务,CEO又给负责市场的自己、负责运营的自己、负责财务的自己派任务,如此下去。

 08 《启示录:打造用户喜欢的产品》

Marty Cagan/著,华中科技大学出版社,2011年

“本书是写给软件产品(包括企业级产品和大众产品)开发团队(特别是互联网软件产品团队)中负责定义产品的成员看的,他们通常被称为产品经理。这个职位常常由公司的创始人、高层主管、主程序员、设计师兼任。”

这是一本朴实的手册,讲些软件或互联网产品(及技术)团队的基本常识,比如需要哪些人、分别是什么角色;比如怎么定义产品;也有一些开发方法的讨论。很朴实,又很全面。

 09 《四步创业法》

Steven Blank/著,华中科技大学出版社,2012年

“提出客户发展方法的目标是解决产品开发方法面临的10大问题。该方法把创业初期与客户相关的活动按目标划分为四个易于理解的阶段:客户探索、客户验证、客户培养和组建公司。”

仔细读过《精益创业》的都了解这本名为《The Four Steps to the Epiphany》的书,它是《精益创业》的灵感之源,埃里克·莱斯说他送了很多箱出去。

这本书还值得单独占有清单推荐位是因为,客户发展方法,是从客户的视角讲述这个过程,和精益强调学习不一样,客户是一切。

 10 《大决策:九个不朽的领导力传奇故事》

迈克尔·尤西姆/著,机械工业出版社,2007年

“此次探险活动需要一个强有力的领导,而不是一个独裁者。”

沃顿商学院教授迈克尔·尤西姆讲述了一系列领导力时刻,我为此还专门找他带队攀登雪山的书阅读。

在读的过程中,几乎都是非商业性的故事却一再激发我去想这个问题:换作是我,会怎么做?

 11 《丰田汽车案例:精益制造的14项管理原则》

杰弗里·莱克/著,中国财政经济出版社,2004年

“丰田模式可以扼要地总结为两大支柱:一为“持续改进”(continuous Improvement),二为“尊重员工”(respect for people)。

一般把持续改进成为日语的改善(kaizen),它挑战所有事,其精髓含义不仅仅是个人贡献的实际改善,更重要的是创造持续学习的精神,接受并保持变革的环境。”

这本不是关于精益的最经典的著作,最经典的是沃麦克等所著的《改变世界的机器》和《精益思想》。

但杰弗里·莱克也是知名的丰田与精益研究专家,更重要的是这本简单明了,比较容易投入实用。

精益创业的思路曾经大热门,但其实精益生产的思路只有到了一定的规模时才有使用价值。

不过,早点了解没有坏处,万一突然高速发展了呢?丰田的例子的价值还在于,它基本上是一个完备的系统,而不是一个的被强调的个别理念/工具,它的整套兄从文化、到组织、到产品开发、到生产都可以沿用。

 12 《跨越鸿沟:颠覆性产品营销圣经》

杰弗里·摩尔/著,机械工业出版社,2009年

“在高科技产品市场的开发过程中,最危险最关键的一点就是由少数有远见者所主宰的早期市场向由实用主义占支配地位的大批顾客所占据的主流市场的过渡。”

这就是提出技术产品接纳周期曲线、指出这条曲线里的 “鸿沟”(Chasm )的那个杰弗里·摩尔最早的作品之一。

要理解那条曲线可以看看他的多本书,其实那条曲线并不如平常所见那么直观,有很多微妙之处。

 13 《创新者的窘境》

克莱顿·克里斯坦森/著,中信出版社,2010年

““技术”一词指的是一个组织将劳动力、资本、原材料和技术转化为价值更高的产品和服务的过程。”

这就是时下热门的“颠覆式创新” (disruptive creation,破坏式创新)的原典,最早读夹杂在汉译大众精品文库中这本时,做了非常多笔记,尤其对克里斯坦森对理论和现实的看法感兴趣,在当面向他请教时提了很多问题,但现在已经完全不记得那一个多小时问了什么,只依稀记得讨论linux、google docs等等。

这本书为什么会在过去三十年吸引创业者的眼光,大概是因为克莱顿·克里斯坦森以超级严谨的案例和逻辑论证了,新事物终究要战胜老的,以及究竟在什么样的场合下最可能战胜。

 14 《企业参谋》

大前研一/著,中信出版社,2007年

“我的处女作《企业参谋》是我30岁到31岁间所做的笔记。29岁那年我进入麦肯锡公司工作,对经营一无所知,于是一边工作一边学习,留下这些笔记。那时我初出茅庐,做这些笔记时完全没有想到有一天能出版,我只是按照自己多年的习惯把学到的东西表达出来,仅此而已。”

没有更好的公司战略思考手册,过了几十年这本书依然有效,它并没有多少结论,仅仅是讲述了方法和过程。

 15 《创业之初你不可不知的融资知识》

桂曙光/著,机械工业出版社,2012年

“VC其实跟一般的生产企业模式类似,他们先从一些优质的创业者手里低价买入原料——这些创业企业的股份,然后对原料进行加工——给企业提供一些增值服务,或者干脆就等着创业者自己努力,从而使这些股份原材料成为更加规范的产品,并获得价值提升。”

读完它,关于风险投资该了解的东西基本上都了解到了。需要时再读,提前读意义不大。

关于思维

 16 《错不在我?》
卡罗尔·塔夫里斯、艾略特·阿伦森/著, 中信出版社,2013年

“在有意识撒谎欺骗他人与下意识地自我辩护欺骗自己之间,有一块被不可靠、自利的记忆掌握的灰色地带。记忆通常都会受自我提升偏误(self-enhancing bias)修正和改变,让过去发生的事情变得模糊,减轻责难,扭曲事实的真相。”

创业者大概很难有机会说“错不在我”,但这本书还是要看,因为它不是讲怎么逃避责任的,而是讲我们的思维习惯的。

我们所有人都有着一种强烈的“事后合理化”的倾向,只有意识到我们的思维习惯,有意识地看它,我们才能看到它对我们的影响。

 17 《创业无畏:指数级成长路线图》

彼得·戴曼迪斯、斯蒂芬·科特勒/著,浙江人民出版社,2015年

“为便于大家更加方便地掌握指数型技术的特点,我构建了一个“6D”框架:数字化(digitalization)、欺骗性(deception)、颠覆性(disruption)、非货币化(demonetization)、非物质化(dematerialization)和大众化(democratization)。这6D其实是指数型技术发展的连锁反应,也是导致巨大动荡并带来难得机遇的快速发展路线图。”

对我来说,多次阅读来自奇点大学的几本著作,的确总能激发技术乐观情绪,包括:《指数型组织》、《富足》、《创业维艰:指数级成长路线图》等。

我们也看到马斯克以一个人的力量在四个领域突破着:电动汽车、私人航天、太阳能和超级高铁,他几乎是技术乐观主义的现实商业代言人。

奇点大学的几位研究者和以往的技术乐观派不同的是,他们不是未来学家的方式,他们是技术实干派,他们将理论和实战混合在一起。

这有时会增加他们的魅力,有时又显得不够未来感,因为过于实用易于被挑刺,实用就需要快速迭代修正。但这是他们真实的状态。

这可能也是我们在实务中的人应该有的状态,保持一种实用的技术乐观,并努力将它实现。

 18 《九败一胜:美团创始人王兴创业十年》

李志刚/著,北京联合出版社,2014年

“我们是一家电商公司,交易额是由B端和C端完成的,怎样把用户从七八千万,变成2亿、4亿、5亿,这需要我们扩展B,也扩展C,有足够的B,足够的C就有足够的交易额。我们会尝试新的机会,包括餐饮、酒店、电影、休闲游等;在公司外面也会有新的尝试。总体上来说,应对这场战争,我们是要增强团队,通过各方面的改进提升人均效率,我们还有太多地方需要改进和提升。”

原来的美团,已经合并大众点评变成新美大(据说英文名为China Internet Plus),但它还在奋战。

书名是借鉴自优衣库的《一胜九败》,把这本书放在思维方式,是因为它是关于我们怎么看待和经历失败,优衣库的更朴实些,一胜九败,但还在继续,其实王兴九败一胜,但也还没最终取胜。王兴的思维应该是中国互联网创业者里面最强大的思维。

 19 《深度生存:生还是死难?》

劳伦斯·冈萨雷斯/著,中国对外翻译出版公司,2006年

“一般而言,我建议大家尽量远离那些英雄气过重的人,比如兰博式的硬汉人物,也不要接近那些总爱抱怨或者啼啼哭哭的人。应该信赖富有幽默感——特别是自嘲的那种幽默感——以及对自己有清醒认识的人。谁能充分利用周围条件,而且能够承认现实,熟悉环境,并且关爱他人,谁的生还几率就往往更大。说来说去,无论身处何境地,生还不外乎是对环境的适应。”

这本是《创业维艰》的户外探险版,这是真的生死。第9章“扭曲的地图”是我最推荐的部分。

 20 《卓有成效的管理者》

彼得·德鲁克/著,上海译文出版社,1999年

““认识你自己”这句充满智慧的古训对现代的凡人来说实在是太难理解了。不过,如果你喜欢自己的工作卓有成效、能为别人作出贡献的话,那你还是可以遵照掌握自己的时间这一条去做的。”

这是一本平淡无奇的书,讲了些普通的道理:卓有成效是可以学到的,掌握自己的时间,问我能能作哪些贡献,如何发挥自己的优势,重要的事先做,等等。

与之相似的,英特尔的格鲁夫也有一本平淡无奇的书《格鲁夫给经理人的第一课》(high output management),他相对更关注系统的高效率一些,也值得推荐。

但是,如果这20本关于所谓互联网创业只看一本的,毫无疑问,请读德鲁克的《卓有成效的管理者》。

如何从菜鸟程序员成长为高手

2016-02-24 蛋疼的axb ACSE
关注上方“ACSE”来及时了解中国理工科留学生联盟的最新动态以及新鲜科技好文章
小编有话说
从今天开始ACSE公众号每天会更新一篇科技相关的精选好文章来帮助大家了解科技前沿以及提高自己的技术水平。
今天这篇文章是由大神级别程序员总结的学习方法,值得收藏起来每周看一遍,只要照着一一做到,总有一天能够成为高手。
1.摘要
最近有一些毕业不久的同事问我:“你工作的时候有没有什么窍门?怎么才能快速成为高手?”
想起当初刚入职,新人培训的时候,也跟其他同事讨论过这个问题:如何才能成为业界大牛?当时自己只是觉得兴趣是最好的老师,思路方法什么的没有多想。
加 入微博平台架构部的时间也不短了,趁着快过春节总结了一下自己入职微博以来的工作情况,从互联网开发的半个门外汉,到如今能设计一些架构、排查一些问题、 分享一些经验,收获颇多,感想颇多,也逐渐意识到思路和方法的重要性,在此跟大家分享一下。主要分为学、做、想三方面。
2.学会学习
学习无疑是程序员最为重要的素质之一,尤其是互联网这种日新月异的行业,把学习当做工作的一大半也不为过。
2.1.自主学习
最近发现身边的人并不是不想学习,只是每天都在纠结自己到底学什么好:简单的没挑战,复杂的看不懂;旧技术怕过时,新技术没方向…… 
讲 讲自己毕业后的经历,毕业之后去了个不大不小的公司,工作主要是做一些XX管理系统之类的东西,没什么挑战,也用不上什么技术,基本上前端用个extjs 后面套个sql server就解决了。工作稳定了几年,业余时间除了wow没别的事情做,觉得这么闲下去不是办法,于是之后一年的时间里,用上班摸鱼和下班休息的时间学 了这些东西:
1. 闲着无聊想做个小游戏,发现游戏相关的书大多是英文的,看不懂,一咬牙翻译了《Real-time rending 3rd》的前几章,刚开始前言都看不懂,只能一个词一个词的翻字典,一句话要琢磨几个钟头到底作者说的到底是什么意思。翻译了几百页英文书之后,发现自己 看英文书没什么障碍了,于是开始每天用休息和摸鱼的时间看书。
2. 看完游戏引擎的书之后,把irrlicht引擎的代码看了一遍,然后自己山寨了一个3d渲染的场景管理器,还有个朴素的渲染引擎。
给自己的游戏引擎写了个基于脚本语言的解释器,为此看了不少编译原理和虚拟机的书,了解了程序究竟是什么东西,这是我觉得收益很大的一件事情。
3. 看编译原理的书的时候发现操作系统的知识有些欠缺,又去看了linux内核相关的书。之后买了个开发板天天修改内核玩,毕业以后又一次了解了内核的cpu 调度、内存管理和文件系统,了解了应用是怎么跑在操作系统上,操作系统又是怎么运行在硬件上的,这也是收益很大的一件事情。
4. 看完操作系统又顺着看网络相关的书,之后把lighthttpd的代码看了一遍,用c写了个linux下的http服务器,把几种网络编程模型挨个实现了一遍。
5. 实现http服务器的过程中觉得自己编码能力还是有欠缺,把代码大全翻了一遍,顺着又去看了设计模式的书,并且用自己的理解把每个模式用文字重新描述了一遍。
6. 中间还看了很多语言和框架相关的书,就不一一列举了。可以参考这里。
我把学习的方向分为三类:
1. 为了工作,满足当前工作所必备的知识
2. 为了提升,与当前工作相关的知识(深度)
3. 拓展视野,与当前工作无关的知识(广度)
学习(1)之后只是个熟练工,2和3才是提升自己的途径,伴随着知识储备的提升,接触新事物时更容易找到相似的知识加以类比,加快理解,也更容易掌握本质。如果每天都在纠结“到底学什么”,那么只能说明还是学的太少了。(真正没什么可学的大牛们应该不会读到这里吧……)
所 以,如果觉着没什么东西可以学的时候,那么可以考虑一下学一下更有深度的知识(比如虚拟机或编译器),或者完全不同的知识(新的语言或当前比较火的方 向),甚至完全不相干的知识(单纯练习英文阅读,学习ppt排版之类)吧。随着知识储备增加,自己的不足和未来的学习的方向也会更加明确起来。
2.2.向历史学习
以微博为例,在微博发展的过程中经历了不少波折,并逐渐衍生出了目前的系统架构。很多新人最喜欢问的问题便是“现在线上是怎么做的?”
这 个问题不错,但是还不够好。在程序员的世界里罕有能解决所有问题的“银弹”,当前的做法用不了多久也会被替换掉,如果想了解一件事情,那么就多关注一下 “它是怎么变成今天这样的”吧。学会用发展的眼光看问题,了解一些经历过的经验教训,收获会比单纯学会一件什么事情多的多。
那么,如何向历史学习?
1. 公司内部的资料库、wiki等大都会有旧时的资料,刚入职时大多不会太忙,这些资料库简直是挖不完的宝藏
2. 部门内部分享,比如我当初入职时经常去听“微博XXXX架构演化历程”之类的内部分享
多问一下自己”它为什么不那么设计“
3. 老员工忆苦思甜吹牛逼的时候多奉承几句_(:з」 ∠)_
2.3.向他人学习
这里有两个极端,
1. 有的人喜欢自己闷头捣鼓,什么也不问,这必然是不利于自己提高的;
2. 也有人碰到问题就问,这也有问题,浪费他人时间不说,更关键的是说明这人向他人学习的思路错了,要学习他人的并不是具体某个知识(要学知识看书就能解决了),而是学习别人的思维方式。
但是思维方式这种东西很难通过交流的方式学到,后来我发现有个很简单的学习方式:口头禅。举几个例子,大家体会一下:
“这个其实是两个问题”
“有没有更好的方案”
“能不能举个例子”
“能不能给个一句话总结”
除了口头禅,很多牛人都会有非常鲜明的思维方式和处事原则,如果有幸与业界的大牛共事,那么恭喜你,只要多交流、多观察、多思考,那么提升速度会提升好几个数量级。
3.多做有意义的事情
有的人每天时间浪费在跟问题本身无关的事情上,比如我要设计架构的时候还要考虑架构图怎么画,写完代码还要反复部署测试好几轮才pass,查bug的时候把时间浪费在扫日志上。人的精力总是有限的,把时间浪费在这些事情上面,让自己提高的时间就变得少了。
3.1.练习,更多的练习
这里有个误区:“做有意义的事情”不等于“只做自己没做过的事情”。
对于程序员来说,写代码是基本功中的基本功,编码的规范、设计的权衡、甚至顺手的IDE快捷键都要靠平日的试错和积累,很难通过几本书或者几天培训领悟到。
曾 经目睹一些人写代码一年之后开始做一些小项目的设计,然后就迫不及待的把重心全都转移到设计甚至架构上,这种没有基础能力支撑做出的设计和架构最多只能算 是高级意淫,大多没等落地就荒废了,意义不大。究其原因,大多是设计出来的东西“不好做”或者“不好用”,就像是只看过一遍课本就去参加高数考试,现实 吗?(学霸们我错了……)
举 个例子,几年前在看设计模式的过程中,用qt做了个看漫画的应用,把能用的模式都试了一遍,当然有很多用的不合适的地方,正是这些不合适的地方让我对面向 对象编程和设计模式的思考深入了很多,如何权衡灵活性和复杂性也有了新的认识。之后在设计很多系统的时候少走了很多弯路,既保证了时间点又保证了质量。如 果当时指望着“用的时候再说”,大概已经被项目坑的不能自理了。
3.2.善用工具
工具能解决的事情就用工具去解决,好的工具能节约大把的时间用在更有意义的事情上。
工具的范畴很广,比如linux的各种命令、比如团队内部的各种系统、比如顺手的应用、甚至包括上下班骑的自行车。只要能节约时间、提高效率,那就值得一试。
在这里我列举几个大幅度提升了我的效率的东西:
1. 双屏显示器
2. 顺手的键盘
3. google(不是baidu!不是bing!)
4. mac
5. mac上的应用:idea、alfread、omnifocus、甚至synergy和istats menus之类跟开发本身关系不大的应用。
我更倾向于把“使用工具”作为一种生活态度:是否希望让自己的生活专注于有意义的事情。如果你认同这个观点,那么想一想投入和回报比例,还是很可观的。
(当然,为了不花钱而自己破解应用的大神也是极叼的……)
3.3.提高时间的利用率
时间是所有期待提升自己的人最宝贵的资源,效率再高,没时间做也没意义。
网上有个流传挺广的图:打扰程序员的成本。事实上我每天的工作时间非常碎片化,来到公司之后可能不断的接电话、被问问题、被拉去开会、回复邮件等等;也经常会有时间不够用或者没事做的困惑,这里分享一下心得:
1. GTD可以整合很多碎片时间。除了把事做完之外,把上下文相关的事情集中在一起完成也很有帮助。比如把几件想去其他办公室做的事情整合成一趟完成。
2. 减少无意义的时间浪费,比如家住在公司边上可以每天节省几个小时的时间用来学习或者做别的事情。(但如果节省下来的时间用来刷微博,那就没有必要了。)
另外一个很有趣的现象:一个软件的注册费就10几刀,贵些的几百刀,把日常用到的所有工具的费用全加起来都顶不上一个肾6贵,但是很多人还是坚持着没有破解不用的观念,为了几百块钱浪费了大把时间。
3. 加班可以创造很多时间,并且能有效减少被打扰的几率,但是也会给身体和精神带来很大负担。因此加班做的事情必须能对个人进步产生足够多的收益。如果加班只是用来处理无意义的工作的话,那应该是日常工作出了什么问题。
4. 事情可以分成紧急重要、紧急不重要、重要不紧急、不重要不紧急四类,在todo列表里随时要有重要不紧急的事情。
4.学会思考
4.1.深究
当有什么问题解决不了的时候,很多人会有畏难或者拖延的情绪,典型口头禅就是“就这么凑合着用吧”或者“先这样吧,以后有时间再研究”,说这些话的人大多并不是真的那么忙,甚至有人一边刷着微博一边跟我说没时间研究……(你tm在逗我?)
要克服畏难情绪其实很简单,找一个具体的似懂非懂的问题,想尽办法把问题研究清楚,体会几次解决问题时的愉悦感,建立自信。
大部分问题其实没有什么高深的科学原理,甚至只要翻几页书就解决了,但是遇到问题不深究,久而久之会形成自我暗示:这些问题是我懂的,那些是我不懂的,自己反而把自己进步的路给堵上了。
说到如何深究,也有几条心得:
1. 遇事多想为什么,并且要反复问为什么。很多貌似理解了的问题过一阵再重新想想,往往会发现之前还有没考虑到的地方
2. 问题要有明确答案,哲学之类的就别纠结了
3. 查找资料时选权威的书籍或者网站,避免被误导
4. 找人讨论,或者直接拉小伙伴入伙,既可以互相交流,又可以互相监督
5. 分享你的成果
6. 不要所有事情全都深究,会给自己太多压力
4.2.多说,多写,多交流
平常工作中有一个感受,有交流和写作习惯的人思路会更清晰一些,能接触到的观点也会多一些。这方面其实属于我的弱项,大概总结几个观点。
1. 隔一段时间最好能书面形式总结一下最近的工作,比如说写个心得感悟,或者持续更新自己的简历
2. 写作的时候有两个难点:对要说明的事情做总结和抽象,形成观点统一、调理清晰的主线;从对方的视角考虑,把事情说明白,避免自言自语。
3. 找人讨论之前自己先要有个基本完整的思路,否则大部分的时间都要耗在解释原理之类的上网查反而更快的事情上。
4. 讨论之后要有一句话就能说明白的结论和描述清晰的时间点。
5. 有些人喜欢纠结于“这个不是我的问题,为什么要我处理”之类的事情。在我看来这是很好的机会。既能增长见识,又能展示水平,还能留个认真负责的好名声,何乐而不为呢。
5.最后
最后分享一下关于我理解的程序员的自我修养,在我看来,可以总结为:负责任,重名声。
负责任,说的更具体些:写的代码自己有没有测过、做的框架自己有没有用过、设计的架构自己有没有认真权衡过。
重名声,说的直接些:没有测过的代码、没有用过的框架、没有权衡过的方案有没有脸交付给别人。
与各位共勉。
作者:蛋疼的axb

原网址:http://blog.2baxb.me/archives/1077
中国理工科留学生联盟(ACSE)
致力于推动留美各校理工科留学生间的相互交流以及资源共享和对接