我想学习编程,但是不知道该怎么开始。

Python010

我想学习编程,但是不知道该怎么开始。,第1张

我建议最好是从基础入手,而不是一开始就进行可视化编程。虽然如今国内绝大多数pc都是使用的windows,但是毕竟这知识这个世界的冰山一角。扎实的基础自然会更有用处。编程其实重要的是程序思维,然后是算法和数据结构。这些都是超出语言的,就是说不管是学c学java学delphi还是别的什么,这一部分都是一致的。因此培养这部分的知识可以说是一本万利的事情。初学肯定是通过语言熟悉思想熟悉算法和数据结构,到一定的时候就是纯粹的思想和算法数据结构的学习,便已经脱离程序语言了。经历过这些阶段,换一种语言不过是重新了解一下描述的方式,就像你了解了中文思维,山东话和四川话的差别就不会太大;了解了拉丁语的思维,整个语系的语言都不过是简简单单的记忆工作,应用就好。入门的语言,理论上是怎么方便学哪个,看那个顺眼学哪个。当然这里面还是有不同的推荐的。一般来说我比较推荐pascal、c/c++、java。并不是因为这三个东西很通用很有前途,而是它们实在是严整而有规则(c/c++还显得稍微的宽松了一点),而严谨的语法要求和明确的概念区分是有利于编程思维的形成和算法数据结构的学习的。同样的因为这个理由我不推荐vb,而并不是因为它功能不强大(事实上vb在windows环境中是相当牛的语言)另外一个建议是,如果学c,不要一开始就用vc。ms提供的很多东西很方便,有很多很简单的实现方法,但是它们不标准。vc与ansi

c标准是有很大的差距的。首先一个不遵循标准的c/c++程序是不通用的,换个编译器说不定就不被承认了。所以我非常推崇gcc,理由之一是它完全符合

ansi

c标准,无论它的c还是c++编译器都很严整,功能上一点也不缺乏(有人说gcc不能做图形界面的程序,这一点完全错误,到处都有的qt库和gtk库都能做出很好的界面),另外一个理由便是它免费,毕竟稍微大一点的软件企业就不会屈从与微软的编译器和平台,而一个免费的c编译器无疑可以创造更多的利益;就算要转vc,标准的c程序也是几乎不要作任何改动的。当然,这一切的前提是,你真的很想很好的学编程,做一个这方面的精英。如果只不过是兴趣,或者只是想拿一个ms的工程师认证然后在国内企业找份诸如设计vf、vb程序之类的工作,那完全可以忽略我上面的话,去找个认证培训班,认认真真听听课,好好完成练习,从vb或者vc入手,考好认证是很不会太难的。毕竟现在很多很好的大学里都从来不缺乏计算机的课程,不会缺少算法或者编译原理的课程,不会没有计算机科学的研究院,而那里面出来的人一般都具备了很好的基础知识,会更加容易成为前面所说的精英。

学习程序语言的人,经常会出现以下几种心理,以至于他们会觉得有学不完的东西,或者走上错误的道路。以下我把这些心理简要分析一下,希望可以消除一些疑惑。

1. 追求“新语言”。

基本的哲学告诉我们,新出现的事物并不一定是“新事物”,它们有可能是历史的倒退。事实证明,新出现的语言,很多还不如早就存在的。正视这个事实吧,现代语言的多少“新概念”不存在于最古老的一些语言里呢?程序语言就像商品,每一家其实都是在打广告。而绝大多数的设计,包括某些最“艰深”最“理论”的语言里面的概念,都可能是肤浅而短命的。如果你看不透这些东西的设计,就会被它们蒙蔽住。过度的热情和过多的宣传,往往意味着肤浅。很多语言设计者其实并不真的懂得程序语言设计的原理,所以常常在设计中重复的犯前人犯过的错误。但是为了推销自己的语言和系统,他们必须夸夸其谈,进行宗教式的宣传。

2. “存在即是合理”。

记得某名人说过:“不能带来新的思维方式的语言,是没有必要存在的。”他说的是相当正确的。世界上有这么多的语言,有哪些带来了新的思维方式呢?其实少之又少。绝大部分的语言给世界带来的不过是混乱。有人可能反驳说:“你怎么能说 A 语言没必要存在?我要用的那个库 L,别的语言不支持,只能用 A。”但是注意,他说的是存在的“必要性”。

如果你把存在的“事实”作为存在的“必要性”,那就逻辑错乱了。就像如果二战时我们没能打败希特勒,现在都做了他的奴隶,然后你就说:“希特勒应该存在,因为他养活了我们。”显然这个逻辑有问题,因为如果历史走了另外一条路(即希特勒不存在),我们会过上自由幸福的生活,所以希特勒不应该存在。对比一个东西存在与不存在的两种可能的后果,然后做出判断,这才是正确的逻辑。按照这样的推理,如果设计糟糕的 A 语言不存在,那么设计更好的 B 语言很有可能就会得到更多的支持,从而实现甚至超越 L 库的功能。

3. 追求“新特性”。

程序语言的设计者总是喜欢“发明”新的名词,喜欢炒作。普通程序员往往看不到,大部分这些“新概念”其实徒有高深而时髦的外表,却没有实质的内涵。常常是刚学会一个语言 A,又来了另一个语言 B,说它有一个叫 XYZ 的新特性。于是你又开始学习 B,如此继续。在内行人看来,这些所谓的“新特性”,绝大部分都是新瓶装老酒。很多人写论文喜欢起这样的标题:《XYZ:A Novel Method for ...》。这造成了概念的爆炸,却没有实质的进步。可以说这是计算机科学最致命的缺点。

4. 追求“小窍门”。

很多编程书喜欢卖弄一些小窍门,让程序显得“短小”。比如它们会跟你讲 "(i++) - (++i)" 应该得到什么结果;或者追究运算符的优先级,说这样可以少打括号;要不就是告诉你“if 后面如果只有一行代码就可以不加花括号”,等等。殊不知这些小窍门,其实大部分都是程序语言设计的败笔或者历史遗留问题。它们带来的不是清晰的思路,而是是逻辑的混乱和认知的负担。比如 C 语言的 ++ 运算符,它的出现是因为 C 语言设计者们当初用的计算机内存小的可怜,而 "i++" 显然比 "i=i+1" 少 2 个字符,所以他们觉得可以节省一些空间。现在我们再也不缺那点内存,可是 ++ 运算符带来的混乱和迷惑,却流传了下来。现在最新的一些语言,也喜欢耍这种语法上的小把戏。如果你追求这些小窍门,往往就抓不住精髓。

5. 针对“专门领域”。

很多语言没有新的东西,为了占据一方土地,就号称自己适合某种特定的任务,比如文本处理,数据库查询,Web编程,游戏设计,并行计算,或者别的什么专门的领域。但是我们真的需要不同的语言来干这些事情吗?其实绝大部分这些事情都能用同一种通用语言来解决,或者在已有语言的基础上做很小的改动。只不过由于各种政治和商业原因,不同的语言被设计用来占领市场。就学习而言,它们其实是无关紧要的,而它们带来的“多语言协作”问题,其实差不多掩盖了它们带来的好处。其实从一些设计良好的通用语言,你可以学会所有这些“专用语言”的精髓。后面我会推荐一两个这样的语言。

我必须指出,以上这些心理不但对自己是有害的,而且对整个业界有很大的危害。受到这些思想教导的人进入了公司,就会开始把他们曾经惧怕的这些东西变成教条,用来筛选新人,从而导致恶性循环。

如何掌握所有的程序语言

可以老实的说,对几乎所有风格的程序语言,我都有专家级的见解。它们在我的头脑里如此简单,以至于我不再是任何语言(包括函数式语言)的“支持者”。但是我花费了太多的时间去摸索这条道路,我希望能够提取出一些“窍门”,可以帮助人们在短时间内达到这种通用的理解。具体的细节足够写成一本书,我现在只在这里提出一些初步的建议。

1. 专注于“精华”和“原理”。

就像所有的科学一样,程序语言最精华的原理其实只有很少数几个,它们却可以被用来构造出许许多多纷繁复杂的概念。但是人们往往忽视了简单原理的重要性,匆匆看过之后就去追求最新的,复杂的概念。他们却没有注意到,绝大部分最新的概念其实都可以用最简单的那些概念组合而成。而对基本概念的一知半解,导致了他们看不清那些复杂概念的实质。比如这些概念里面很重要的一个就是递归。国内很多学生对递归的理解只停留于汉诺塔这样的程序,而对递归的效率也有很大的误解,认为递归没有循环来得高效。而其实递归比循环表达能力强很多,而且效率几乎一样。有些程序比如解释器,不用递归的话基本没法完成。

2. 实现一个程序语言。

学习使用一个工具的最好的方式就是制造它,所以学习程序语言的最好方式就是实现一个程序语言。这并不需要一个完整的编译器,而只需要写一些简单的解释器,实现最基本的功能。之后你就会发现,所有语言的新特性你都大概知道可以如何实现,而不只停留在使用者的水平。实现程序语言最迅速的方式就是使用一种像 Scheme 这样代码可以被作为数据的语言。它能让你很快的写出新的语言的解释器。我的 GitHub 里面有一些我写的解释器的例子(比如这个短小的代码实现了 Haskell 的 lazy 语义),有兴趣的话可以参考一下。

几种常见风格的语言

下面我简要的说一下几种常见风格的语言以及它们的问题。注意这里的分类不是严格的学术性质的分类,有些在概念上可能有所重叠。

1. 面向对象语言

事实说明,“面向对象”这整个概念基本是错误的。它的风靡是因为当初的“软件危机”(天知道是不是真的存在这危机)。设计的初衷是让“界面”和“实现”分离,从而使得下层实现的改动不影响上层的功能。可是大部分面向对象语言的设计都遵循一个根本错误的原则:“所有的东西都是对象(Everything is an object)。”以至于所有的函数都必须放在所谓的“对象”里面,从而不能直接被作为参数或者变量传递。这导致很多时候需要使用繁琐的设计模式(design patterns) 来达到甚至对于 C 语言都直接了当的事情。而其实“界面”和“实现”的分离,并不需要把所有函数都放进对象里。另外的一些概念,比如继承,重载,其实带来的问题比它们解决的还要多。

“面向对象方法”的过度使用,已经开始引起对整个业界的负面作用。很多公司里的程序员喜欢生搬硬套一些不必要的设计模式,其实什么好事情也没干,只是使得程序冗长难懂。不得不指出,《Design Patterns》这本书,是这很大一部分复杂性的罪魁祸首。不幸的是,如此肤浅,毫无内容,偷换概念的书籍,居然被很多人捧为经典。

那么如何看待具备高阶函数的面向对象语言,比如 Python,JavaScript,Ruby,Scala?当然有了高阶函数,你可以直截了当的表示很多东西,而不需要使用设计模式。但是由于设计模式思想的流毒,一些程序员居然在这些不需要设计模式的语言里也采用繁琐的设计模式,让人哭笑不得。所以在学习的时候,最好不要用这些语言,以免受到不必要的干扰。到时候必要的时候再回来使用它们,就可以取其精华,去其糟粕。

《程序员的数学3线性代数》([日] 平冈和幸 / [日] 堀玄)电子书网盘下载免费在线阅读

链接: https://pan.baidu.com/s/17ZfVR3jU9sgDlpQqa-Q5Fg

?pwd=8ca4 提取码: 8ca4 

书名:程序员的数学3线性代数

豆瓣评分:8.2

者: [日] 平冈和幸 / [日] 堀玄

出版社: 人民邮电出版社

出品方: 图灵教育

副标题: 线性代数

译者: 卢晓南

出版年: 2016-3

页数: 384

内容简介:

本书沿袭“程序员的数学”系列平易近人的风格,用通俗的语言和具象的图表深入讲解了编程中所需的线性代数知识。内容包括向量、矩阵、行列式、秩、逆矩阵、线性方程、LU分解、特征值、对角化、Jordan标准型、特征值算法等。

作者简介:

堀玄

专攻应用数学和物理,主要从事脑科学与信号处理领域的研究。喜欢Ruby、JavaScript、PostScript等语言。最近正在研究基于统计学理论的语言处理。工学博士。

平冈和幸

专攻应用数学和物理,对机器学习兴趣浓厚。喜欢Ruby,热爱Scheme。最近被Common Lisp吸引,正在潜心研究。工学博士。