十年学会编程 (翻译:cxsharp)

博客指出人们急于学习计算机知识,但像《3天内学会Pascal》这类书只能传授肤浅知识。学者研究表明成为业界专家需10年,作者给出编程成功建议,如保持兴趣、与其他程序员交流、写程序、学多种语言等,强调个人经验的重要性。

十年学会编程

(说明:在http://blog.joycode.com/kaneboy/posts/14128.aspx看到不完整的译文,原文在http://www.norvig.com/21-days.html,觉得不错,翻译供大家学习,转贴请标明作者。感谢Koffer和Echo帮助校验,才使得翻译完成!错漏之处,请指教!)

为何每个人都这么心急?

走入任何书店里,你会看到《7天内学会Java》靠在一堆提供在几天或者几小时内学会VB、Windows、Internet...教学的书籍旁。我在Amazon.com上搜索:
      pubdate: after 1992 and title: days and
      (title: learn or title: teach yourself),

得到的书籍有248本,前面78本都是计算机书籍(第79本是《30天内学会孟加拉语》)。我用“hours”代替“days”再次搜索,得到非常相似的结果:多于253本书,接着前面77本计算机书籍的第78本是《24小时内学会语法和语态》,在前面200本书里面,96%是计算机书籍。

我得到的结论是--人们非常急于学习计算机相关知识,或者不知道何故,计算机难以置信的比其他任何东西都要容易学。却没发现一本书是关于在多少天内学会演奏贝多芬音乐、量子物理、甚至学会养狗。

让我们分析一下像《3天内学会Pascal》这样的书名的意味:

  • 学会:在3天内你根本没有时间写出一个像样的程序,不会有使用它编程的成功或失败过程中学习的经历。也不会有时间和一个经验丰富的程序员一起工作,更不会理解程序在实际的编程环境中是怎样的。简而言之, 你没有足够的时间学习更多的。所以这样的书只能谈一些肤浅的知识,不会让你深入的理解。亚历山大说过,肤浅的学习是危险的事情。
  • Pascal:3天内也许你能搞懂Pascal的语法(如果你以前过另外一种类似的语言),但是你不能学会如何利用这样的语法。简而言之,假如你是个Basic程序员,你会用Basic风格写Pascal代码,但不会明白什么是Pascal的优点(或者不足)。为什么有这样的观点?Alan Perlis说过:“一门语言没有影响你的编程思想,它就不值得学习。”另一个观点,你只是学习了Pascal(更像,Visual Basic或者JavaScript)很少的部分知识,因为你只是需要使用这样的工具去完成一个特定的任务。但是你没有学会如何编程;你只是学会如何完成一些特定的任务。
  • 3天内:不幸地,如下节要说的,这根本不够。

10年学会编程

学者们(Hayes, Bloom)研究表明,要想成为业界专家,任何一个宽广的领域,都需要10年的时间,比如下棋、作曲、绘画、演奏钢琴、游泳、网球,和研究神经心理学、地质学。这说明没有捷径:即使莫扎特,在4岁的时候就已经显示了音乐天赋,但在他写出了世界级的音乐作品前,他也花了13年的时间。另外一个例子,披头士乐队,好像是在1964年突然在Ed Sullivan冒出来的,但其实他们在1957年就开始演出了,并在更早就组成了乐队,他们第一张震撼唱片《Sgt.Pepers》(《佩帕军士》)在1967年才发行。Samuel Johnson认为10年可能还不够,“任何领域的卓越成就只有靠穷极一生的努力来获得,别想用更少的代价就取得。”Chaucer感叹到“生命如此短暂,而要学的东西如此多。”

下面是我对如何在编程上取得成功的建议:

  • 保持对编程的兴趣,感觉编程有乐趣。保证你在10年后都能够有乐趣。
  • 和其他程序员交流,阅读其他人的程序,这比读书和培训重要得多。
  • 写程序。最好的学习方法是边做边学。用更加学术的话来讲:“在一个给定的领域中,个人能力的提高并不会是自动的获得,就像经验一样的,把已有经验的延伸、扩展,而是需要通过特别有经验的人经过很大的努力来增长”。“而且对于特定的人,最有效的学习需要一个定义良好的、有一定难度的任务、该任务还要有丰富的信息反馈、有重复和纠正错误的机会。” 书《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life 》(《在实践中认识:心理,数学,和文化在人生中的每一天》)有趣的证明了这样的观点。
  • 如果你愿意,花4年时间呆在大学里(或者在研究院呆更长的时间)。这会让你能得到那些需要学历的工作,并且会让你对这个领域有更深的理解。但是如果你不喜欢上学,你也可以(做一些贡献)在工作中得到类似的经验。无论如何,仅有书本知识是不够的。《The New Hacker's Dictionary》(《新黑客字典》)作者Eric Raymond说,“计算机科学不像绘画,当学会了画笔和颜料技巧就能成为一个专业的画家,计算机科学教育不能让任何人成为专业的程序员。”。我雇佣过的最好的程序员之一就只有中学学历,但他写出了许多绝好的软件,拥有他自己的新闻组,并且因为享有股权比我有钱得多。
  • 和其他程序员一起做项目。在一些项目中做最好的程序员,在其他的一些项目中做最糟糕的程序员。如果你是最好的程序员,就试着领导一个项目以提高你的能力,通过你的远见来激发其他人。如果你是差劲的程序员,就学习其他高手是如何做的,并且去做那些他们不喜欢做的部分(因为他们让你去给他们做这些部分)。
  • 在其他程序员后面接手一个项目,因为需要你理解其他人写的程序是棘手的事情。看看在原作者不在的时候你如何理解和修改他们的代码。考虑如何设计你的程序能让接手你程序的人更容易理解。
  • 至少学会6种计算机语言。包括一种支持class abstractions(比如Java和C++)的语言,一种支持functional abstraction(比如Lisp和ML)的语言,一种支持syntactic abstraction(比如Lisp)的语言,一种支持declarative specifications(比如Prolog和C++模板)的语言,一种支持coroutines(比如Icon和Schema)的语言,一种支持parallelism(比如Sisal)的语言。
  • 记住“计算机科学”中的“计算机”。搞懂你的计算机执行一个指令要多长时间,从内存中取一个字要多长时间(在Cache命中和没命中的情况下),从磁盘上读连续的字要多长时间,在磁盘上搜索一个新位置要多少时间。
  • 参与制定一种语言标准。可以是ANSI C++委员会,也可以是把你周围人的几种编码风格统一起来,该采取几个字符缩进的锯齿状。不管是哪种,你都能弄懂其他人喜欢语言中的什么、有多喜欢、权衡他们为什么有这样的感觉。
  • 对将要开始的语言标准化取得成功充满信心。

做到上面的这些,光靠书籍学习就能得到是值得怀疑的。我第一个孩子降生前,我几乎读了所有的“How To”系列的书,但是还是感觉像个菜无能的初学者。30个月后,等我第二个孩子降生后,我又把这些书都又复习一遍了吗?不,没有,我认识到靠我自己的个人经验要比那些专家写到上千页的书上的东西有用和可靠得多。

Fred Brooks,在他的散文《 No Silver Bullets》(其实,就是《人月神话》中提到的没有银弹…加注)提出分三步的方法,发现优秀的软件设计师:

       1.尽可能早的发现设计天才。
       2.指派一个职业生涯的导师为他的发展前景负责,并且仔细保持一份职业生涯的档案。
       3.为成长的设计师们提供机会,使他们相互激励和影响。

这样做的前提是这些人已经有发展成为伟大设计师所必备的潜质;这样的工作需要一直很有耐心。Alan Perlis更直接:“每个人都需要教雕琢:Michelangelo却被告诉什么不需要做,这个道理也同样适合于伟大的程序员。”

前进一步,买这样的Java书;你会为它耗尽精力。但是你并没有改变你的生涯,你也不会在24小时、一天、几个月内成为卓越的程序员。


allyesno注:岂止编程呢 做一件事情 要真的有些成就 岂能 一蹴而就

内容概要:本文围绕“空地多无人平台协同路径规划技术”的论文复现展开,重点介绍了基于Matlab的多无人机与地面无人平台协同路径规划的算法实现与仿真研究。研究系统性地整合了无人机三维路径规划、动态避障、多机协同、任务分配及防撞机制等核心技术,结合智能优化算法(如遗传算法、粒子群算法、灰狼优化算法等)与经典路径规划模型(如Dubins路径、A*、RRT等),在复杂威胁环境下实现了高效、安全的协同路径规划。文中提供了完整的Matlab代码支持,便于科研人员进行算法验证、性能对比与二次开发,并强调通过复现高水平学术论文(如EI、SCI期刊及硕博论文)深入掌握该领域的前沿方法与技术路线。; 适合人群:具备一定Matlab编程基础,从事无人机系统、自动化控制、人工智能、路径规划等相关领域研究的研究生、科研人员及工程技术人员,尤其适用于正在开展科研项目、撰写学位论文或希望提升算法实践能力的研究者。; 使用场景及目标:① 复现并深入理解空地协同路径规划领域的高水平论文算法;② 掌握Matlab在多智能体路径规划中的建模、仿真与可视化方法;③ 应用于科研课题、毕业设计、项目申报及算法创新实践中,提升研究的技术深度与工程可行性。; 阅读建议:建议结合文中提供的网盘资源(含完整代码、仿真模型及参考文献资料)同步学习,优先选择与自身研究方向契合的案例进行复现,注重算法原理与代码实现之间的映射关系,并在掌握基础方案后尝试进行参数调优、算法融合或引入新约束条件以实现改进与创新。
内容概要:本文基于Android 15_r17源码深度解析Binder机制的核心原理与实现流程,涵盖Binder驱动交互、服务注册与获取、跨进程通信流程及关键类的作用。文章详细剖析了首个Binder服务ServiceManager的启动与发布过程,阐明其作为上下文管理者通过ioctl设置为Context Manager的机制;系统梳理了ServiceManager.addService和getService的全流程,包括Java层通过BinderProxy到native层BpBinder与IPCThreadState的跨进程调用链;解析了oneway与非oneway调用在事务处理与回复机制上的差异;完整展示了app调用bindService时Binder引用的流转过程,涉及Parcel中flat_binder_object的序列化与反序列化;同时归纳了Binder的特性如句柄管理、死亡通知及异常处理机制。文中还明确指出handle由Binder驱动在创建binder_ref时生成,客户端仅作引用。; 适合人群:具备Android系统开发经验,熟悉C++/JNI及操作系统原理,有一定Framework层开发背景的中高级研发人员; 使用场景及目标:①深入理解Android Binder驱动层与应用层的交互机制;②掌握ServiceManager的初始化与服务注册原理;③分析Binder跨进程调用中数据序列化、句柄管理与线程处理流程;④研究oneway调用与普通调用的差异及异常处理机制; 阅读建议:本文聚焦源码级分析,建议结合Android 15_r17源码同步阅读,重点关注IPCThreadState、ProcessState、BpBinder/BnBinder及Parcel的实现细节,理解Binder在内核与用户空间的数据流转过程。
内容概要:本文系统阐述了SDD(规范驱动开发)与Harness(驾驭式流程管理)相结合的AI全栈开发新范式,旨在解决AI编程助手在复杂工程中因上下文丢失、规范不一致导致的“代码能跑、工程难成”问题。SDD将规范作为唯一真实源,通过定义精确的领域语言(如OpenAPI、Gherkin)约束AI生成行为,确保前后端与测试间的一致性;Harness则提供执行引擎,通过上下文隔离、行为禁令、任务原子化与流程锁步等方式,引导AI在已有高质量参照下进行模式复刻,提升生成代码的可用性与PR保留率。二者共同构建从需求到生产的工程化闭环,实现规范可验证、变更可追溯、运维可反馈的“确定性”交付。; 适合人群:具备全栈开发经验、正在探索AI辅助工程落地的研发工程师、技术负责人及AI工程化实践者;尤其适合面临多模块协同、架构一致性维护难题的中高级开发者。; 使用场景及目标:①在AI辅助下高效生成符合统一架构规范的前后端代码与测试用例;②建立可编译、可测试、可持续演进的全栈自动化开发流水线;③实现从需求变更到生产部署的闭环验证与自动回滚机制;④提升AI生成代码在实际项目中的采纳率与系统稳定性。; 阅读建议:此资源强调工程思维转变,建议结合实际项目尝试将架构决策转化为机器可读规范,并搭建Harness流程控制机制,在实践中体会“约束生成”优于“自由创造”的AI协作新模式。
内容概要:本文档聚焦于“独立售电商购售电策略研究”,通过Python编程实现电力市场中独立售电商的购售电优化决策模型。研究内容涵盖在市场化竞争环境下,售电商如何制定最优购电计划、设计售电定价机制,并有效应对电价波动、负荷不确定性及新能源出力随机性等挑战,以实现利润最大化与风险控制的双重目标。文档深入探讨了多时间尺度调度、不确定性建模、市场竞价机制等核心技术,并利用代码进行仿真验证。此外,文档还提供了大量相关科研主题的参考资料,涉及微电网调度、综合能源系统、虚拟电厂、电动汽车、鲁棒优化等多个前沿方向,展现了广阔的技术应用前景和深厚的学术价值。; 适合人群:具备一定电力系统基础知识和Python编程能力,从事电力市场、能源管理、优化调度等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 学习并复现独立售电商在电力市场中的购售电决策模型;② 掌握基于Python的电力市场仿真与优化方法;③ 借鉴相关代码实现思路,拓展至微电网、虚拟电厂、需求响应等领域的研究与应用; 阅读建议:此资源以实际代码实现为核心,建议读者结合文中提及的相关研究主题进行系统性学习,重点关注模型构建逻辑与算法实现细节,同时可通过提供的网盘链接获取完整代码资源以便调试与二次开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值