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

最后,一个小投票:

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