转 十年学会程序设计

2024-05-30 09:58
文章标签 学会 程序设计 十年

本文主要是介绍转 十年学会程序设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为何大家如此匆忙?

走进任何一家书店,你会看到书架上一排不见尽头的放着如 《7天自学Java语言》以及几天或者几小时学会Windows, 因特网或者Visual Basic这类书。我在Amazon网上书店用以下的方式进行高级搜索:

出版年份: 1992以后 书名包括:“天” 和 “学习” 或“自学”

得到了268条搜索结果,其中前78条都是计算机书(第79条是30天学会孟加拉语)。

我用“小时”代替“天”作为关键字,得到了神奇般类似的结果:这次有253本书,前77本是计算机书,第78本是24小时自学语法和写作风格。排名前200的书中有96%是计算机书。

由此可见,人们要不就是急着想学会计算机,要不就是计算机相比于其他事情太容易学会了。比如说把,没有书是写在几天弹奏贝多芬或几天学会量子物理,甚至也没有几天学会帮小狗打扮这样的书。

让我们分析一下三天学会Pascal语言 [英文网页] 这样的标题表达了什么意思:

1. 学会:

在三天内,你没有时间去写几个有意义的程序,或者从成功和失败中学到东西。你也没时间跟有经验的程序员一起工作,所以也无法了解在真正编程是什么样子。简短的说,就学会而言,时间显然不够。所以这些书只是浮于表面的熟悉,而不是深刻的理解。如同Alexander Pope 所说,一知半解是危险的。

2. Pascal 语言:

三天内你可能学会Pasacl语言的语法(如果你已经掌握一个类似的编程语言),但你无法学会如何合理运用这些语法。简言之,如果你是个Basic程序员,你可以用Pascal 语言写出类似Basic风格的程序,但你学不到Pascal语言的优点(还有缺点)到底在哪。重点是什么呢?

Alan Perlis曾说: “如果编程语言不能影响你的编程思维,那就不值得去学.”

另一个可能是,你必须学会一点点Pascal语言(或是像VB语言、Javascript等),因为你需要跟现成的工具组合完成特定的工作。不过这个时候,你实际上学的不是怎么写程序,而是要学着如何完成工作。

3. 三天

不幸的是三天根本不够;下面的章节会告诉你为什么

十年学会程序设计

研究者 Hayes, Bloom 的研究表明,在几乎所有的各种领域,大约要十年才能培养出专业技能。这些领域包括下西洋棋、音乐作曲、绘画、钢琴、游泳、网球,及神经心理学和数学拓扑学。似乎没有真正的捷径--即便是莫扎特在四岁就展露出音乐天才,在他写出世界级的音乐之前仍然用了超过十三年的时间。

再看另一种类型的领域。披头士乐团似乎是在1964年的Ed Sullivan剧场表演突然地火起来并成为第一乐队的。但其实他们从 1957年开始,就在利物浦、汉堡等地的小型俱乐部表演。虽然他们很早就显现强大的吸引力,但他们决定性的成功作品 Sgt Pepper 也到1967年才发行。Samuel Johnson则认为或许还不止十年才行,他说:任何领域的卓越成就都必须用一生的努力才能取得;稍微低一点的代价都是换不到的。Chaucer 则感叹道:“生命如此短促,学习技艺却要这么地长”

以下是我在编程上成功的秘诀:

  • 对编程产生感兴趣并因为乐趣而写程序。确信你自始至终都能乐在其中,这样你才愿意将十年光阴投入编程事业.
  • 与其他程序员交流;阅读别人的代码。这比任何书任何培训都重要。
  • 不断地编写。最好的学习方法是在实践中学习。从技术角度说,”在特定领域的个人最高效率并不因为经验够多就会自动获得;但若有意识的通过努力去提升经验,个人效率会变高”(第336页)而“高效的学习一般需要明确的任务和因人而异的适当难度,以及及时的反馈和重复或者修正错误的机会”(20~21页)Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life(实践中认知:心智、数学与日常文化)是这个观点的一本有趣参考书籍。
  • 如果你愿意,你可以去读四年大学(或再读研究生)。这可以让你满足一些工作的学历要求,同时也可让你对这个领域有更深的认识。但如你不喜欢上学,你也能(得有牺牲)通过工作获得类似的经验。无论如何,只读书是不够的。《New Hacker’s Dictionary》的作者Eric Raymond 曾经说过:“计算机的教育无法让人成为编程的专家,正如研究画笔与颜料不能让人成为专业画家一样.” 一个在我所有招聘过的人中属于最优秀之一的程序员只有高中毕业,但他写出很多很棒的程序,他甚至有自己的新闻组。他获得的股票期权使得他可以拥有自己的午夜酒吧.
  • 跟其他程序员一起完成项目。在一些项目中成为最好的程序员;在一些中则充当最差的一个。当你是最佳的,你要测试自己领导项目的能力,并以你的能力鼓励他人。当你是最差的,要看看高手做些什么,他们不喜欢做什么(因为他们会叫你去帮他们做).
  • 接手别的程序员完成项目。全心投入并理解别人的程序。当原作者不在的时候,看看在理解与修改时有什么要注意的。想想如何设计你的程序使得后来维护的人容易上手。
  • 至 少学会六门编程语言。一种要支持类/对象(class abstractions)的语言,如Java或C++; 一种函数式(functional abstraction)语言, 如 LISP 或 ML;一种支持语法抽象(syntactic abstraction) 的语言 如 LISP;一种声明式语言, 如Prolog或 C++模版; 一种支持协同式(coroutines)编程,如 Icon 或 Scheme; 还有一种支持并行(parallelism)的语言, 如 Sisal.
  • 记住在 “计算机科学” 中包括”计算机”这个词。要知道你的计算机执行一条指令需要多久,到内存中取一个字需要多久(缓存是否击中),到磁盘读取连续的字需要多久,而磁盘的定位又需要多久. (解答见文末)
  • 进行语言标准化的工作。可以像是由ANSI C++委员会,或由你自己的团队,来决定你们的编码风格,譬如说缩排是2或4个空格。不管怎样,你都能学到别人到底喜欢什么,对语言的感受有多深,甚至能了解到一点他们为什么有这样的感觉。
  • 并具备良好的判断力,也别老纠缠在语言标准化上.

谈了上面所有的想法后,我不禁要问究竟能从书上学到多少。在第一个孩子出生前,我读完了所有的“怎样…”的书,仍觉得自己是个一无所知的(照顾孩子的)菜鸟。30个月后,第二个孩子出世,我要重回这些书好好复习么?

不!取而代之的是,我开始相信自己的个人经验。这些难得的经验,比专家写的几千页手册还要有用,而且让我重新找到了自信.

Fred Brooks (译注: 《人月神话》作者) 在他的文章没有银弹中指出,发掘卓越软体设计者的三部曲:

  1. 尽早尽可能地以系统化的方式发掘最佳设计人员。
  2. 给有潜力者指派生涯规划师,并谨慎地规划他们的职业生涯。
  3. 提供机会给正在成长的程序员,让他们能相互影响,彼此激励。

这里假定了某些人已具备成为卓越设计师的必要潜能;工作只是诱导他们前进。 Alan Perlis 说得更简洁了,你可以教任何人学雕塑,但对米开朗基罗而言,要教他的反倒是有哪些事不要做, 卓越的程序员也一样。

所以,尽管买那些 Java书吧!你或许能从中找到点有用的,但是在24小时,几天或者几个月中,这些都不会改变你的人生,你也不能掌握一个真正的程序员应该具备的真正的综合的技能。

参考文献

  • Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
  • Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19.
  • Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
  • Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.

解答

各种操作的时间,以2001年夏季,典型配置的 1GHz 个人计算机为标准:

命令 速度
执行单一指令 1 纳秒
从L1 高速缓存取一个字 2 纳秒
从内存取一个字 10 纳秒
从磁盘取连续存放的一个字 200 纳秒
磁盘寻址并取字 8 毫秒

附录 I: 语言的选择

好几个人问过我一开始应该先学哪个计算机编程语言,这个问题没有唯一的答案,不过选择的时候可以从以下的几个方面考虑:

  • 朋友在用的. 当人们问我:”我该用什么操作系统的时候”,我通常的回答是:“用你朋友用的”.这样的好处是从朋友那儿学习可以弥补复杂的操作系统差异或者编程语言差异(给你造成的困惑)。这里也要考虑你未来的朋友:如果你一直使用的话,开发社区会是你的朋友。你选择了一个具有有巨大的增长的开发社区还是一个小的快消失的开发社区的语言?它有相关的书,网站和论坛可以获取解答么?你喜欢那些论坛上的人么?
  • 保持简单.诸如C++和Java是为那些关心代码执行效率的有经验的大型团队的开发人员设计的。因此这些语言中有些为这些特殊场合设计的部件。你只是关心编程而不需要关心复杂情况。你需要一个为新学编程的人设计的容易学习和理解的语言。
  • 实践.什么是学习钢琴的好方法呢?
    是一边听音一边弹奏的“交互式”的方法呢,还是全听完整首歌然后再弹奏的那种“批处理”方式呢? 很显然,交互学习的方式能够让学钢琴变得简单–这也适用于编程.选取一种交互式的编程语言并且坚持使用.

基于以上的这些标准,我对于第一次接触编程的人推荐 Python 或 Scheme.但是情况各有不同,或许也有其他的选择. 如果你不满10岁,你可能会喜欢Alice或者Squeak(年龄大的人或许也喜欢这些). 重要的是在选择后,立即开始学习和使用.

附录II: 书和其他资源:

很多人问我该从什么书或者什么网页开始看起。我重申一句:“仅仅看书是不够的”,不过我也推荐一下的一些:

  • Scheme: 计算机程序的结构和释义 (Abelson & Sussman) 可能是计算机科学最好的导论了, 他还告诉程序员怎么理解计算机科学,你可以访问这本书的 在线视频讲座 和 全文在线 .这本书也很有挑战性,可能会排除掉一些可能在其他领域成功的人.
  • Scheme: 怎样设计程序(Felleisen ) 是讲解怎样设计优雅的函数式语言的最好的书之一.
  • Python: Python 编程,面向计算机科学的导论(Zelle) 是用Python介绍计算机科学的好书.
  • Python: 一些关于Python的 入门教程 可以在 Python.org 上找到.
  • Oz: 计算机编程的概念,技术和模型(Van Roy & Haridi) 可以视为第一本书的现代版.他是关于编程的一些总揽,包含了比第一本书更加广泛也更加容易阅读和理解的领域。这本书使用了一个不太为人所知的编程语言叫Oz, 不过这个可以作为学习其他编程语言的一个基础。

注: T. Capey 指出,在Amazon 的 问题彻底解决者的页面上购买了这本书的人还买了: “21天学孟加拉语” 和 “自学语法和写作风格”这两本书,我估计大部分是我这个页面带过去的用户.

  • Peter Norvig (Copyright 2001)
  • Eric You XU 翻译,2007年4月

这篇关于转 十年学会程序设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1016103

相关文章

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

为何我建议你学会抄代码?

文章目录 为何我建议你学会抄代码?一、引言二、抄代码的艺术1、理解抄代码的真正含义1.1、抄代码的好处 2、如何有效地抄代码2.1、发现问题2.2、整理需求2.3、造轮子标准流程 三、抄代码的实践案例1、发现问题2、整理需求3、设计重试机制4、实现重试工具类5、使用重试工具类6、优化和扩展 四、总结 为何我建议你学会抄代码? 一、引言 在编程的世界中,“抄代码” 常被视为一

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

智能工厂程序设计 之1 智能工厂都本俱的方面(Facet,Aspect和Respect)即智能依赖的基底Substrate 之1

Q1、昨天分别给出了三个智能工厂的 “面face”(里面inter-face,外面outer-face和表面surface) 以及每个“面face” 各自使用的“方”(StringProcessor,CaseFilter和ModeAdapter)  。今天我们将继续说说三个智能工厂的“方面” 。在展开之前先看一下三个单词:面向facing,取向oriented,朝向toword。理解这三个词 和

C语言程序设计 笔记代码梳理 重制版

前言 本篇以笔记为主的C语言详解,全篇一共十章内容,会持续更新基础内容,争取做到更详细。多一句没有,少一句不行!  形而上学者谓之道,形而下学者谓之器 形而上学者谓之道,形而下学者谓之器 第1章 C语言的流程 1.C程序经历的六个阶段 编辑(Edit)预处理(Preprocess)编译(Compile)汇编(Assemble)链接(Link)执行(Execute)  2.

上海市计算机学会竞赛平台2024年7月月赛丙组求和问题

题目描述 给定 nn 个整数 a1,a2,…,ana1​,a2​,…,an​,请问这个序列最长有多少长的前缀,满足元素的和大于或等于 00?如果任何长度大于 00 的前缀之和都为负数,则输出 00 输入格式 第一行:单个整数表示 nn第二行:nn 个整数表示 a1,a2,…,ana1​,a2​,…,an​ 输出格式 单个整数:表示最长的前缀长度,使得前缀的和大于等于 00 数据范围

ACM东北地区程序设计大赛

不得不说随着参赛级别的提高,题目真的是越来越难啊,不过队长真是给力啊,在我们三个共同努力之下拿下了地区赛三等奖,哈哈我们可是大一唯一一只获奖队,终于在这次比赛打败了田大神。。。大神是失手了,俺和他差距还是挺大的。。。队友陈彤马上要去服兵役了,他说这是我们送给他最好的离别礼物,希望那家伙在部队好好干,以后谁干揍我!!!东北地区赛结束后,今年已经估计没机会参加亚洲区比赛了,赶紧补高数和线数啊!!别挂了

上海市计算机学会竞赛平台2024年8月月赛丙组等差数列的素性

题目描述 给定三个整数 nn,aa 与 dd,表示一个项数为 nn 的等差数列,首项为 aa,公差为 dd。 请统计,从这个等差数列中有多少数字是素数 输入格式 三个整数: nn,aa 与 dd 输出格式 单个整数:表示素数数量 数据范围 50%50% 的数据,1≤n≤10001≤n≤1000100%100% 的数据,1≤n≤100001≤n≤100001≤d≤10001≤d≤10

【数据结构】你真的学会了二叉树了吗,来做一做二叉树的算法题及选择题

文章目录 1. 二叉树算法题1.1 单值二叉树1.2 相同的树1.3 另一棵树的子树1.4 二叉树的遍历1.5 二叉树的构建及遍历 2. 二叉树选择题3. 结语 1. 二叉树算法题 1.1 单值二叉树 https://leetcode.cn/problems/univalued-binary-tree/description/ 1.2 相同的树 https://leet

每个游戏公司的领导都应该看看Supercell的“十年总结”

我知道,你一定会说,Supercell的案例太特殊了。手游出现以来,全世界就只有这么一个Supercell,它的经历、理念和公司架构这些文化,其他公司学不来,不管对中国公司还是海外公司,都没有什么实际借鉴意义。 但Supercell真的有这么“特殊”吗? 比如他们对于留存数据的看重,尤其是测试期留存的看重,和国内——和任何一家常规游戏公司看重留存的态度,都没有什么明显不同。 他们也会试着设立