当前位置: 首页 > news >正文

本杰明·富兰克林会怎样学习编程?

优秀的编程方法是极难教的。编程书籍大抵都是这样开头的:“这是X方法的例子,还有下面这个例子”。教教基础是容易的,因为基础知识也就那么多。难 就难在,要教明白每种选择带来的结果。一般我们会建议多写代码,慢慢提高水平。这是必要但非充分条件。要想学的更好,我们还要判断应该写哪些代码,以及如 何改善这些代码。

我们接下来转向与编程紧密相关的领域——写作,寻求改善技艺的灵感。从很多方面看,编程就像是写作。二者的核心关注点,都是以容易沟通的形式表达自 己的思想。我们会发现二者都很困难,因为我们的思想是高度密集交错的,而文本又是极其地线性化。利用文本,我们有无数中表达思想的方法,这使得学习写作的 艺术,以及编程的艺术,变得很困难。

幸运地是,本杰明·富兰克林记录下了他锻炼写作技巧的方法。我们只需要查看Amazon网站上传记畅销书单,就会发现富兰克林的写作水平之高超。数百年后,他的自传仍位居畅销书之列。如果这都证明不了他的写作能力,我不知道到底还有什么可以证明。

本杰明在少年时期就找到了练习的方法,并且一直刻苦地按这种方法练习写作。下面是他的自传中相关介绍的摘录。

大约在这时候,我偶然看到了一本《旁观者》的零本,是第三册。在这以前,我从未曾看见过这个刊物。我买了这本散册,反复读了几遍,十分中意,我认为文章写得好极了,如果可能的话,我想模仿它的风格。

因此我从中选了几篇文章,简要地摘录下了每一句的大意,接着把它们搁置几天。然后不看原书,用我自己想得起来的合适辞句,把每一个句子尽量完整地表 达出来,又凑成整篇的文章,使它表达得像以前一样地完整。最后,我把我自己写的《旁观者》与原文比较,发现了一些我的错误,作了修正。

但是我发现我的词汇贫乏,或是说我不能很快地想起适当的词来用。我想,假如我以前没有放弃写诗的话,那时候我的词汇一定会丰富得多了,因为经常不断 地有机会寻找具有同样意义而有不同长度的词去适合诗的韵律,或是不同音素的词去凑韵脚,会迫使我不断地搜索具有不同形式的同义词,这将有助于我记忆这些不 同的词并使我掌握它们。因此,我把其中的一些故事改写成了诗,过了一些时候,当我差不多已经遗忘了原来的散文的时候,我又把它们重新还原。有时候我也把我 摘录的思想搞乱了,经过几个星期以后,设法把它们用最好的次序排列起来,然后再把它们写成完整的句子,组合成文章。这样做,是为了教我如何整理思想的方法

本杰明·富兰克林式编程练习模式

  1. 找一个你特别喜欢的程序,阅读它的代码。

  2. 记录下每个主要组件的角色、输入和输出。

  3. 记录下每个组件之间是如何交互的。

  4. 重写这个程序。

  5. 把你的代码与源代码进行比较。

  6. 记录下你要在哪方面改进,并学习相应的知识。

不要只是一味地写程序。通过学习伟大的程序,并尝试模仿这些程序,将会极大地提升你的能力。

如果你觉得本文介绍的方法有用,请与朋友分享!每一次分享,都是一份关爱!


来源:51CTO

相关文章:

  • WCF 消息帧格式
  • 《SEO的艺术(原书第2版)》——3.6 为原始流量开展SEO
  • PHP开发:使用PHP抓取百万知乎用户以及知识点札记
  • 在人才竞争上,国内明星公司都使用哪些手段抢 AI 人才
  • 工控安全要避开传统IT安全思路的几个“暗坑”
  • 助阵智能化环境监控 长虹佳华推CHEWS无线管理解决方案
  • 一个不错的GO语言SHA/MD5加速库
  • 深度学习如何将个性化引入互联网
  • MSSQL收缩事务日志日志文件过大无法收缩
  • 04-常见内存错误以及valgrind使用
  • 别轻易说取代:容器不会取代虚拟机
  • Android带你解析ScrollView–仿QQ空间标题栏渐变
  • 向上扩展型SSD 将可满足向外扩展需求
  • Lua程序块(chunk)
  • Handler、Looper与MessageQueue源码分析
  • SegmentFault for Android 3.0 发布
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 0基础学习移动端适配
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • co模块的前端实现
  • GitUp, 你不可错过的秀外慧中的git工具
  • java2019面试题北京
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • js继承的实现方法
  • Just for fun——迅速写完快速排序
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Vultr 教程目录
  • 二维平面内的碰撞检测【一】
  • 给初学者:JavaScript 中数组操作注意点
  • 工程优化暨babel升级小记
  • 使用putty远程连接linux
  • 《码出高效》学习笔记与书中错误记录
  • 第二十章:异步和文件I/O.(二十三)
  • #Linux(make工具和makefile文件以及makefile语法)
  • #pragam once 和 #ifndef 预编译头
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (007)XHTML文档之标题——h1~h6
  • (02)vite环境变量配置
  • (175)FPGA门控时钟技术
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (四)模仿学习-完成后台管理页面查询
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • ../depcomp: line 571: exec: g++: not found
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .NET/C# 使用反射注册事件
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .NET运行机制
  • .php文件都打不开,打不开php文件怎么办
  • [APUE]进程关系(下)
  • [AX]AX2012 R2 出差申请和支出报告
  • [C#基础]说说lock到底锁谁?