- summary zip abt. ZoomQuiet
- labels Featured,Intro,ZoomQuiet
SEE:图灵社区 : 活动 : Translate Geeks to Chinese 翻译活动
GDNet论坛的热门话题之一是这样的:
* "嗨,俺刚刚 买了一台电脑|写了一个简单的游戏|发现一个游戏引擎,俺想知道接下来怎么整?
我想 [最终完成一些特定的目标]. 我需要怎么学/做来达成目标?"
首先,俺是理解为毛 Peter Norvig 从N久以前就恨不能钉在所有人头上的话: "程序员必须经过十年以上的学习!". (参考:10年编程无师自通,Google+NASA的大牛吼出的心声;-) 即使,现在有一堆堆 "X天掌握X语言"的图书; 一坨坨的博客文章在分享: "如何轻松提高你的编程水平"; 总是有人在寻求如何通过最小的努力就变成高手的灵丹妙药.
俺得对 "5种方法令你在21天内部完成惊人的编程" 这种高论唱个反调. 俺想说的是如何真正喜愛编程,这就是:"艰难的6步才能成为高手"
当然,可能你已能折腾出精巧的 shell 脚本,或是几个小游戏; 但是,如果你有限的技能唯一目标是用各种手段快速完成简单的东西. 那么,俺不想在这儿讨论前述选项的合法性:
* 有些人的确没有时间(或是根本不渴望)成为大师
如果你并不打算耗费十年以上的时间来达到目标, 那么,别上俺的当, 一生里你可以作以及作好的事儿,永远是有限的. 这的确可以作为你合理的权衡标准, 你完全可以不用理会俺的文章.
不过,对于有的人,真正成为高手是非常NB的事儿. 我们渴望成为专家,忍者,大师...我们追求各种极致的称号. 要为之付出10年,虽然有点沉重,但绝对是值得投资的, 如果这事儿值得作,就应该作好,不是嘛?
因此,想成为真正的编程高手, 第一步就是要硬着头皮接受, 这不仅是为期10年的一个过程,而且是终身的征途. Norvig还提醒,这样做必须是出于你真心想作. 没人因为自个儿都不想作的事儿而成就卓越. 这也是为什么世界记录不会进入历史书的原因, 所谓记录都是那种并不是因为饥饿,只是一次比赛里吃下最多热狗而已.
在很长一段时间里,你的代码可能都算不上是优良的. 任何时刻,只要遇到日常生活中,有关电脑的小烦恼,你都应该思考如何用编程的方式来解决问题. 任何时刻,只要遇到有趣的事儿,你都应该进行实践,尽可能的体验各种新概念/工具和语言.
学习过程将永不停息, 你能走多远,取决于你的学习方法和态度,在于你每天可以每天挤出多少时间投入学习. 具体到每天/周/月,如果你没有学到什么有趣的东西,只能说明是你的心态有问题. 有足够的东西在那儿,你绝对可以每天学习到很酷的东西,也许坚持15年后很难学对你而言更酷的,但是,仍然可能找到些. 当然,在编程世界里没有任何人可以吸收所有的知识, 所以,只要你感觉没什么可学时,找个新的项目,并编写更多的代码吧.
当你这样做,注意。寻找模式 - 东西你往往可能有用的自动化,或在你的代码,你也许可以分成共享库或其他集中的地点,你写的东西。寻找语言,容易使某些任务。寻找其他语言,在这些相同的任务不那么好,弄清为什么一个是比其他更具生产力。
只是要注意,编程时,你得坚持发掘模式:
* 你经常性作的总是可以自动化的 * 你代码中很大一部分也许可以分解成共享库,或是集中管理起来
在开发言语中寻找可以更加简单完成任务的方式. 探寻为什么相同的任务,用其它语言就不那么爽,整明白什么是开发语言的生产力.
但最最最重要的是: **写代码.** 坚持每天都写,即使只是个通过正则表达式来搜索您的电子邮件历史或其它什么. 尽可能的坚持编程,如果还能体验到编程的乐趣,就不要停; 除了享受编程,这一阶段没有其它要点.
当你有一些小项目的经验后,就应该开始阅读其它人的代码了. 当然,开始这会很难; 他们总在用你不习惯的样式没学过的语言完成你从末作过的软件. 如果你发掘出一些很酷的东西,只要可能,尽量阅读她们的代码吧. 起初,先表担心什么深度分析; 许多大型项目里,了解现存代码可能是个全职的活儿计. 先挑几个期望从中学到的功能点,然后找出来都是怎么实现的.
尝试阅读并理解他人的代码,有助于开放你的头脑,接受新的思维方式. 这样也确保你不断发现有可以学的新东西.
同时,也要确实和其它程序员进行交谈. 请教他们为什么以及如何作了那些事儿? 请教他们如果有机会会用什么不同的方式完成任务? 请教他们你的代码有哪里可以改进? (切记,要礼貌!很多高级程序员都很忙,基本没有时间也没有必要来迁就你的提问.尊敬可以令你走得长久,在IT这一绵密的产业中,好名声意味着很多.)
对于时间,你不会有大段的盈余,除非极其幸运,一般是不可能有足够的时间专门用来掌握新的开发语言. 因此,学习其它开发语言,可以先在浅层的了解:
* 了解如何运行起来 * 能完成什么特殊工作 * 有什么弱点
这里,重要的是拓展视野,不能只是在命令式语言中打转, 例如C,或是Java 这类"面向对象"的语言; 要扩展到函数式和声明式语言里才好.
即使在日常编程中并不会使用 Lisp 真正作什么, 但是,她会令你体验到一个简单的递归系统可以达到多么深刻的美,使你能更好的思考. 一开始,Lisp 看起来只是锅奇怪的语法和公约纠结在一起的汤. 不断深入之后,有一天你就会不禁"啊哈!"的感叹出来, 至此,她将作为有史以来人类发明的最令人观止的优雅概念之一,在你的职业生涯里始终伴随.
然后,学习一门纯粹的函数式语言. 我推荐 Haskell, 因为她能迫使你从其它并不纯粹的函数式语言(包括大多数Lisp方言)的思想里挣脱出来). 你将不得不扭曲你的心神,不过,每当"啊哈"无可避免的发生时 (根据俺的体验,多数是在理解 monads 之时), 你的思维和典雅系统的设计能力都将大步迈进!
最后,学习种声明性语言. SQL就算一种,虽然仅学习SQL实在有点弱. Prolog是被经常推荐的一种语言,但不一定要着力学习. 在实际中, XAML/XSLT/XQuery都是该境界已知的好工具, 会向你介绍说明性编程背后的概念. (概括地说,你告诉计算机你想让它做什么,最终它输出结果; 在命令式编程里,得你告诉计算机如何做的事情,并期待它时作对; 而功能式编程,是由你来描述数据和类型的转换.)
作为奖励, 在学习 Lisp 方言之后,学习基于XML的工具, 就能体验到明显的不同.
这门语言,不用复杂,或丰富,或精致,甚至特别优雅. 它也不用比原型要好. 作为学习基础的好招,我就经常建议编写一个Lisp编辑器(完成这种Lisp方言可以当成奖励积分). 从本质上讲, 你能获得一种计算机程序设计的基本感觉: 词法分析,语法分析,编译,解释,虚拟机, 等等,对不同的任务,基础设计的决策将引发什么影响.
这会令你完成三件事:
这是最难的最后一步. 截至目前为止,你学习都是已知的东西, 你可以通过阅读别人的代码或书籍,或学术论文来学习; 都是些好东西,但是新东西.
现在你得打破的界限, 真正上升到大师的境界. 步入他人还末涉及的领域进行冒险.
没错, 这是在你"第十个年头"的经验之上,一般不会抓住的念头; 因为之前你多数是在他人的基础上"重造轮子",很少进行原创创新式的研究. 但是,一但你在领域里有充分的把握时,其实并不难发现未开拓的领域,计算机科学中未尽的知识.
这就是机会, 能带领你再学习十年. 不要放弃,要记住,这仍然是有趣的. 但是,任何时间点上,如果你享受不到乐趣了, 去做些别的事情. 人生苦短,不应该浪费时间在你不想作的事儿上!
不是每个人都会成功, 但每个人都能受益于努力. 不要让失败率让阻止你的学习. 即使你从来没有赢得过图灵奖,但是, 作为程序员而言,向终极精通迈进的不断成长,取决于智域的持续扩展 -- 那么紧紧抓住未解决的问题,是最好的扩展方式.
哦,等一下...实际上,你只是老死了. 对不起. 愿来生你能走运!
死亡,在所有的严重性,但不指望过完成。 在你的进步旅程中,止步的那一刻,其实就已经开始死亡了, 你将变得无关紧要. 我所知的,编程世界里最悲惨的失败,就是给自个儿某个理由不再学习了; 作为男子汉,他们在软件世界里完全不重要了, 他们将永远原地踏步 -- 当然,除非他们决定重新开始学习.
您停止您的旅程中向前进步的瞬间,你开始死了,变得无关紧要。我见过在编程的人得到某种方式下来的路径,并决定他们做学习干的世界最悲惨的失败;一个人,他们现在完全在软件世界不重要,可能永远都不会超越他们目前的状况 - 当然,除非他们决定重新开始学习。
好了,进发吧,写代码吧! 也许有一天,当你成为一名伟大的程序员时,你可以来告诉我,你是怎么作到的.
我将始终热爱学习.
想起了:轉貼:什麼是博士?
简单的说,这6步是这样的:
# 菜鸟 ~ 得决定是否要在这条路上走下去,真心的!
# 小白 ~ 开始自主扫盲,用编程的形式,坚持,每天!
# 码农 ~ 开始不断的学习他人的丰富知识
# 程序员 ~ 开始不断挑战,用各种类型的语言,训练思维能力
# 工程师 ~ 开始自主解决本质问题,能从大局上找最合适的方案
# 大师 ~ 开始任性的玩,绝对不要玩别人玩过的
<wiki:toc></wiki:toc>