十年磨一剑 - 优秀程序员养成之道

专科生要怎么做才能进入阿里巴巴、百度、腾讯这样的公司? 马云说:“我从来不看大学文凭,这个不太重要。重要的是这个人聪明,积极向上。我发现优秀的人都很积极,不抱怨。如果一个人整天抱怨,别要他。” 虽然马云是这么说,但学历依然是一块十分重要的敲门砖。不过就我身边的一些程序员朋友中,是有人专科毕业还进了大厂的。所以说,只要你足够优秀,学历并不是问题。学历上的短板也是可以通过其它方面来弥补的,不要让学历成为你心里那块放不下的石头。 关于如何进入大厂,我们可以从自身条件和应聘过程两方面进行分析: 一、自身条件 1、扎实的专业技能 现在的本科教育着重培养学生的理论基础,而在 阅读详情

By Peter Norvig

为何每个人都如此心急?

走进书店,我们会看到许许多多像《教你7天学会Java》(Teach Yourself Java in 7 Days)这样的书,还有其他的书声称能在几天之内甚至几小时之内教会你Visual Basic, Windows, Internet等等。 我在Amazon.com上做了如下的搜索:

     1992年以后发行;

     标题包含 天(days);

     标题包含 学习(learn)或者自学(teach yourself);

得到了248个链接. 头78个都是计算机方面的书(第79个是Learn Bengali in 30 days). 我把天(days)换成小时(hours)得到了差不多相同的结果: 253 本书, 前77本都是计算机书籍,第78本为 Teach Yourself Grammar and Style in 24 Hours . 在前200本里有96%是计算机书籍。

结论就是要不是人们急于学习计算机相关理论,要不就是计算机相比于其他的理论学起来要简单的多。目前还没有类似的在几天内学习贝多芬,或者量子理论,物理,甚至是Dog Grooming。

让我们分析下标题为Learn Pascal in Three Days包含的意思:

  • Learn: In 3 days you won't have time to write several significant programs, and learn from your successes and failures with them. You won't have time to work with an experienced programmer and understand what it is like to live in that environment. In short, you won't have time to learn much. So they can only be talking about a superficial familiarity, not a deep understanding. As Alexander Pope said, a little learning is a dangerous thing.
  • Pascal: In 3 days you might be able to learn the syntax of Pascal (if you already knew a similar language), but you couldn't learn much about how to use the syntax. In short, if you were, say, a Basic programmer, you could learn to write programs in the style of Basic using Pascal syntax, but you couldn't learn what Pascal is actually good (and bad) for. So what's the point? Alan Perlis once said: "A language that doesn't affect the way you think about programming, is not worth knowing". One possible point is that you have to learn a tiny bit of Pascal (or more likely, something like Visual Basic or JavaScript) because you need to interface with an existing tool to accomplish a specific task. But then you're not learning how to program; you're learning to accomplish that task.
  • in Three Days: Unfortunately, this is not enough, as the next section shows.

十年磨一剑 - 学习编程之道

Researchers (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) have shown it takes about ten years to develop expertise in any of a wide variety of areas, including chess playing, music composition, telegraph operation, painting, piano playing, swimming, tennis, and research in neuropsychology and topology. The key is deliberative practice: not just doing it again and again, but challenging yourself with a task that is just beyond your current ability, trying it, analyzing your performance while and after doing it, and correcting any mistakes. Then repeat. And repeat again. There appear to be no real shortcuts: even Mozart, who was a musical prodigy at age 4, took 13 more years before he began to produce world-class music. In another genre, the Beatles seemed to burst onto the scene with a string of #1 hits and an appearance on the Ed Sullivan show in 1964. But they had been playing small clubs in Liverpool and Hamburg since 1957, and while they had mass appeal early on, their first great critical success, Sgt. Peppers, was released in 1967. A study of students at the Berlin Academy of compared the top, middle, and bottom third of the class and asked them how much they had practiced:

Everyone, from all three groups, started playing at roughly the same time - around the age of five. In those first few years, everyone practised roughly the same amount - about two or three hours a week. But around the age of eight real differences started to emerge. The students who would end up as the best in their class began to practise more than everyone else: six hours a week by age nine, eight by age 12, 16 a week by age 14, and up and up, until by the age of 20 they were practising well over 30 hours a week. By the age of 20, the elite performers had all totalled 10,000 hours of practice over the course of their lives. The merely good students had totalled, by contrast, 8,000 hours, and the future music teachers just over 4,000 hours.

So it may be that 10,000 hours, not 10 years, is the magic number. Samuel Johnson (1709-1784) thought it took longer: "Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price." And Chaucer (1340-1400) complained "the lyf so short, the craft so long to lerne." Hippocrates (c. 400BC) is known for the excerpt "ars longa, vita brevis", which is part of the longer quotation "Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile", which in English renders as "Life is short, [the] craft long, opportunity fleeting, experiment treacherous, judgment difficult." Although in Latin, ars can mean either art or craft, in the original Greek the word "techne" can only mean "skill", not "art".

Here's my recipe for programming success:

  • 培养编程的兴趣,我们编程是因为喜欢编程。要确保编程能够引起你足够的兴趣,这样你才能坚持10年。
  • 同你的同行们多交流,多读他们的程序。这比看任何书或者参加任何形式的培训都重要。
  • 写代码。 The best kind of learning is learning by doing. To put it more technically, "the maximal level of performance for individuals in a given domain is not attained automatically as a function of extended experience, but the level of performance can be increased even by highly experienced individuals as a result of deliberate efforts to improve." (p. 366) and "the most effective learning requires a well-defined task with an appropriate difficulty level for the particular individual, informative feedback, and opportunities for repetition and corrections of errors." (p. 20-21) The book Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life is an interesting reference for this viewpoint.
  • 如果你愿意,在学院里呆个4年,或者研究院 (a graduate school). This will give you access to some jobs that require credentials, and it will give you a deeper understanding of the field, but if you don't enjoy school, you can (with some dedication) get similar experience on the job. In any case, book learning alone won't be enough. "Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter" says Eric Raymond, author of The New Hacker's Dictionary. One of the best programmers I ever hired had only a High School degree; he's produced a lot of great software, has his own news group, and made enough in stock options to buy his own nightclub.
  • 同其他程序员一起做项目. Be the best programmer on some projects; be the worst on some others. When you're the best, you get to test your abilities to lead a project, and to inspire others with your vision. When you're the worst, you learn what the masters do, and you learn what they don't like to do (because they make you do it for them).
  • 修改其它程序员写的项目. Be involved in understanding a program written by someone else. See what it takes to understand and fix it when the original programmers are not around. Think about how to design your programs to make it easier for those who will maintain it after you.
  • 学习至少六种编程语言. 包括一种支持类抽象class abstractions的语言如Java 或者 C++, 一种支持函数抽象functional abstraction 的语言如Lisp 或者 ML, 一种支持语义抽象syntactic abstraction 的语言如Lisp, 一种支持declarative specifications的语言如Prolog 或者 C++ templates, 一种支持coroutines的语言 如Icon 或者 Scheme, 一种支持parallelism 的语言如Sisal.
  • 谨记在计算机科学里还有个计算机(Remember that there is a "computer" in "computer science"). 知道你的计算机需要花费多久去执行一条语句, 从内存里读取一个字 (with and without a cache miss), read consecutive words from disk, and seek to a new location on disk. (Answers here.)
  • Get involved in a language standardization effort. It could be the ANSI C++ committee, or it could be deciding if your local coding style will have 2 or 4 space indentation levels. Either way, you learn about what other people like in a language, how deeply they feel so, and perhaps even a little about why they feel so.
  • Have the good sense to get off the language standardization effort as quickly as possible.

With all that in mind, its questionable how far you can get just by book learning. Before my first child was born, I read all the How To books, and still felt like a clueless novice. 30 Months later, when my second child was due, did I go back to the books for a refresher? No. Instead, I relied on my personal experience, which turned out to be far more useful and reassuring to me than the thousands of pages written by experts.

Fred Brooks, in his essay No Silver Bullets identified a three-part plan for finding great software designers:

  1. Systematically identify top designers as early as possible.
  2. Assign a career mentor to be responsible for the development of the prospect and carefully keep a career file.
  3. Provide opportunities for growing designers to interact and stimulate each other.

This assumes that some people already have the qualities necessary for being a great designer; the job is to properly coax them along. Alan Perlis put it more succinctly: "Everyone can be taught to sculpt: Michelangelo would have had to be taught how not to. So it is with the great programmers".

So go ahead and buy that Java book; you'll probably get some use out of it. But you won't change your life, or your real overall expertise as a programmer in 24 hours, days, or even months.


References

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.

Bryan, W.L. & Harter, N. "Studies on the telegraphic language: The acquisition of a hierarchy of habits. Psychology Review, 1899, 8, 345-375

Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.

Chase, William G. & Simon, Herbert A. "Perception in Chess" Cognitive Psychology, 1973, 4, 55-81.

Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.


Answers

 

Approximate timing for various operations on a typical 1GHz PC in summer 2001:

execute single instruction

1 nanosec = (1/1,000,000,000) sec

fetch word from L1 cache memory

2 nanosec

fetch word from main memory

10 nanosec

fetch word from consecutive disk location

200 nanosec

fetch word from new disk location (seek)

8,000,000 nanosec = 8 millisec


Appendix: Language Choice

Several people have asked what programming language they should learn first. There is no one answer, but consider these points:

  • Use your friends. When asked "what operating system should I use, Windows, Unix, or Mac?", my answer is usually: "use whatever your friends use." The advantage you get from learning from your friends will offset any intrinsic difference between OS, or between programming languages. Also consider your future friends: the community of programmers that you will be a part of if you continue. Does your chosen language have a large growing community or a small dying one? Are there books, web sites, and online forums to get answers from? Do you like the people in those forums?
  • Keep it simple. Programming languages such as C++ and Java are designed for professional development by large teams of experienced programmers who are concerned about the run-time efficiency of their code. As a result, these languages have complicated parts designed for these circumstances. You're concerned with learning to program. You don't need that complication. You want a language that was designed to be easy to learn and remember by a single new programmer.
  • Play. Which way would you rather learn to play the piano: the normal, interactive way, in which you hear each note as soon as you hit a key, or "batch" mode, in which you only hear the notes after you finish a whole song? Clearly, interactive mode makes learning easier for the piano, and also for programming. Insist on a language with an interactive mode and use it.

Given these criteria, my recommendations for a first programming language would be Python or Scheme. But your circumstances may vary, and there are other good choices. If your age is a single-digit, you might prefer Alice or Squeak (older learners might also enjoy these). The important thing is that you choose and get started.


Appendix: Books and Other Resources

Several people have asked what books and web pages they should learn from. I repeat that "book learning alone won't be enough" but I can recommend the following:


Notes

T. Capey points out that the Complete Problem Solver page on Amazon now has the "Teach Yourself Bengali in 21 days" and "Teach Yourself Grammar and Style" books under the "Customers who shopped for this item also shopped for these items" section. I guess that a large portion of the people who look at that book are coming from this page. Thanks to Ross Cohen for help with Hippocrates.

分清C#语言与.NET平台:跨平台开发的认知基石 编程语言是语法契约,平台是运行时生态——这是理解现代跨平台开发的起点。C#作为一门语言,其代码通过编译生成中间语言(IL),真正决定执行能力的是底层平台实现(如CoreCLR、Mono)和目标配置(如iOS AOT限制)。这种语言与平台的解耦,赋予了.NET跨平台能力的技术合理性,也解释了为何同一段C#代码在Windows、Linux或iOS上行为迥异。它支撑起Xamarin、.NET MAUI等框架的工程实践,更直接影响API兼容性、P/Invoke可用性及反射支持等关键决策。掌握这一分层模型,是构建可移 阅读详情

相关推荐

Unity开发微信小游戏,使用Addressables管理游戏资源(本地进行远程测试)

快速构建Unity微信小游戏 使用Addressables管理游戏资源 使用小皮助手在本地进行远程资源加载测试

the_vnas的博客 6391

《程序员的修炼——从优秀到卓越》一一1.10 十年磨一剑

本节书摘来自异步社区出版社《程序员的修炼——从优秀到卓越》一书中的第1章,第1.10节,作者:【美】Jeff Atwood,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.10 十年磨一剑 程序员的修炼——从优秀到卓越Gmail的原开发主管Paul Buchheit曾经说过,Gmail的成功是一个漫长的过程。 Gmail的开发始于2001年8月...

weixin_33981932的博客 308

香橙派5b 移植 imx415

修改设备树,以为例,关闭ov13855,添加imx4151;0;1;0;1;0;1;0;1;0;1;0;1;0;以此类推,修改三个dtsi。

ChenYX的博客 4538

Epigrams in Programming

   One mans constant is another mans variable. Functions delay binding: data structures induce binding. Moral: Structure data late in the programming process. Syntactic sugar caus

第三只眼的专栏 1209

【程序化天空盒】过程记录01:日月 天空渐变 大气散射

在做一个仿照原神的天空盒,写文章作为技术总结和记录。

qq_41835314的博客 6741

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据一,Xilinx BRAM介绍二,BRAM对应的IP核调用和使用1,BRAM对应的IP核介绍2,BMG例化IP核的调用 一,Xilinx BRAM介绍 BRAM 就是Block Memory,是Zynq的PL端的存储RAM单元。可以利用BRAM,在PS和PL之间进行数据的交换。Zynq中还有一类存储器,称为分布式随机访问存储器(D...

weixin_43941525的博客 3万+

Epigrams on Programming

Epigrams on Programming Alan J. Perlis, Yale, September 1980 The phenomena surrounding computers are diverse and yield a surprisingly rich base for launching metaphors at individual and group activi

浩瀚星空,法力无边;其大无外,其小无内。 1774

基于PID算法的循迹小车

这一期为创客们带来基于PID算法的循迹小车制作 1.标准赛道示意图: (该赛道包含了:左直角、右直角、十字路口等路况) 2.灰度传感器安装示意图: (可根据实际情况调节各传感器之间的间距) 3.硬件原理图: 4.控制逻辑: 5.程序如下: #define leftA_PIN 7 #define leftB_PIN 6 #define left_Pwm_PIN 5 #define STBY...

qq_44343584的博客 4万+

自学编程,十年磨一剑

黄小非译注:本文作者Peter Norvig目前任职于Google,其职位是研究主管(Director of Research). Peter Norvig是享誉世界的计算机科学家和人工智能专家。他是AAAI 和 ACM 的会员,是业界内经典书籍《Artificial Intelli...

chuangong2592的博客 317

深度学习笔记(1)机器学习与深度学习基础

一些深度学习的简单概念和Transformer的学习。

hanliu2003的博客 1492

LoRa物联网实战:用新大陆模块打造智能LED呼吸灯(附完整代码解析)

本文详细介绍了如何利用新大陆LoRa模块实现工业级智能LED呼吸灯的设计与开发。通过256级PWM调制的呼吸灯效果,结合LoRa无线控制技术,实现设备状态的可视化反馈和多设备同步控制。文章包含完整的硬件选型、电路设计、算法优化和代码实现,特别适合物联网开发者和硬件工程师参考。

github5actions的博客 86

<Teach Yourself Programming in Ten Years>十年之后,教你怎么样编程。

Teach Yourself Programming in Ten Years                    Peter Norvig  Why is everyone in such a rush? 为什么每个人都那么匆忙?(急功近利) Walk into any bookstore, and you'll see how to Teach Yourself Java in 7

MyISDB--Focus On Database 1392

分布式训练中All-Reduce、All-Gather、Reduce-Scatter原理

Reduce-Scatter = 先对所有进程的数据做 Reduce(如 sum / mean),再把结果“切分”分发给各进程。(是 Reduce + Scatter 的融合操作。

comli_cn的博客 341

别让“防御性编程”毁了我们的职业

最近,随着一些大厂的陆续暴雷,以及一些裁员风波,我在不少自媒体平台都刷到了关于新式“防御性编程”的段子,初看感觉只是个文娱的文案,但之后回忆过往,再结合自己的工作经历,发现现在这种现象确实是越来越普遍了。

weixin_42055277的博客 480

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

TFS(Team Foundation Server)敏捷使用教程

一、引言 1 中国式软件过程的坏味道 RUP,CMM/CMMI到了中国就变了味。。。。。。 2 Team Foundation Server TFS是软件开发的协作平台,它要解决的首要问题是团队成员的协作问题。比如说: 研发团队内部怎么协作,产品经理,架构师,设计师,开发人员,测试人员怎么进行协作,并行工作? 研发团队之间怎么协作,开发人员怎么共享重用技术,加强横向的联系? 研发团队与运营...

sinolover的专栏 7636

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

十年磨一剑!程序员老兵成新将

点击查看活动详情 https://t.csdnimg.cn/L4B8 关于OpenStack社区 OpenStack于2010年发布,到现在已有10年之久。OpenStack社区拥有来自45个国家/地区、160个不同组织、近1350位开发人员,它是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作。OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack通过各种互补的服务提供了基础设施即服务...

程序人生的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java开发人员应该知道的关于Ruby的10点内容

A language that doesn’t affect the way you think about programming is not worth knowing                                                     

Struts 2 的专栏 1375

10年学到的编程经验总结

我作为一个web开发者的旅程始于2000年,那时我还只有21岁,我依然可以清楚地记得那些日子里激荡在我内心的感觉。如果一定要找一个词来形容的话,我觉得那是——愉悦。 我不需要担忧时间、最后期限和轻重缓急,也不需要担心生产力。我所要关心的只有一件事,那就是学习,尽可能多和尽可能快地学习。 我急急忙忙地前进不是因为时间期限这些事情,仅仅是因为这让我感觉良好,让我觉得有趣。学习如何构建东西,发现一个

lollipop的专栏 541

十年学会程序设计

十年学会程序设计 发表回复 翻译:杨彪 原作者:Peter Norvig 原文链接:Teach Yourself Programming in Ten Years 为什么每个人都如此的匆忙? 走进任何一家书店,你都会看到类似七天学会JAVA程序设计、几小时或者几天学会Visual Basic, Windows, Internet等书籍。我在亚马逊网上书城尝试了如下搜索: 出版日期:1

feifly329的专栏 1943

Teach Yourself Programming in Ten Years

Why is everyone in such a rush?Walk into any bookstore, and youll see how to Teach Yourself Java in 7 Days alongside endless variations offering to teach Visual Basic, Windows, the Internet, and so

思想比知识更重要 成长比成功更重要 555

A C++ developer looks at Go------值得一读

      转载地址:https://www.murrayc.com/permalink/2017/06/26/    A C++ developer looks at Go (the programming language), Part 1: Simple Features I’m reading “The Go Programming Language” by Brian Kernig...

认知 行动 坚持 5261

用十年学习编程 / Teach Yourself Programming in Ten Years

“计算机语言(C++、JAVA等),学起来简单,教起来也简章”。是不是这样?今天浏览互联网,无意看到下面的文章,大家看后可以点评。以下是译文与原文。用十年学习编程 为什么每个人都急不可耐?走进任何一家书店,你会看见《Teach Yourself Java in 7 Days》(7天Java无师自通)的旁边是一长排看不到尽头的类似书籍,它们要教会你Visual Basic、W

教学 & 技术专栏 1万+

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 413

从一段视频到可漫游的 4D 有声场景:思路拆解与最小复现手记

只需一段手机视频,你就能生成可"走进去"的 4D 有声场景:转头时狗叫声方向随之变化,走近时声音更清晰。本文拆解 Video-to-4DAVScene 的核心思路,手把手带你用几十行 Python 搭出最小管线,把视频中的运动物体变成带空间位置的声源,并附上三个真实踩坑的排障经验,代码可直接跑。🎧

helloagent的博客 235

【每天一个 Python 小案例30】Python 基础知识综合小项目:我的工具盒

作为系列收官,本篇把前 29 篇的知识点合成一个能直接用的命令行工具"我的工具盒":计算器(用 ast 解析表达式,不碰 eval)、单位换算与温度转换(一张换算表 + 特例分支)、记账与分类统计(Decimal + JSON 持久化)、以及用"字典当命令表"把菜单和业务逻辑解耦的主循环。文中对比了 eval 的安全隐患与 ast 白名单的做法,解释了 lambda 闭包在字典里的写法与晚绑定陷阱,并在最后给出整个系列的知识地图,把变量、数据结构、控制流、函数、类、异常、文件、标准库八块内容对应到具体篇目。

xinjiyaya的博客 427

详解Python条件语句

在 Python 中,if...else 是一种条件语句,可以根据给定的条件执行不同的操作。这个语句通常用于控制程序的流程。

2601_96798737的博客 208
上一篇: Events In C#
下一篇: 逃离x86架构-----CPU体系结构CISC与RISC之争
LemIST
博客等级 码龄18年 37粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值