编程开发进阶更重要的是掌握的核心设计思维[图]:
“单独写一个琐碎的代码块就等同于弹奏音阶一样,不幸的是,弹奏音阶并不能教会你任何关于音乐的东西,并且非常枯燥”
这是 Eric S. Raymond 在他的文章《How to learn Hacking》中所描述的一段话。作为一个已经从入门走到进阶的编程者,我非常赞同他所说的这句话。
然而,大部分老师,课本和大学课程都会通过琐碎的代码块练习来教授编程知识。
即使这样的编程练习可以让你明白条件语句和循环的工作机制以及如何编写一个基本的函数,但是却不能让你对编程有一个更深的思考。
琐碎的代码块练习所存在的问题就是它不能够让你做到以下四点:
提升你的代码直觉-比如如何模块化你的代码
解决如何编写一个可重用的程序,以便于扩展这个程序去解决新的应用问题
清楚如何权衡代码的可读性和简洁性
关注如何保持良好和一致的编程风格
总之,他们没有教会我们关于创建更大程序所需要掌握的核心设计思维。
编写可扩展的代码可不简单!
除了这些缺陷,这种学习方式还非常无聊!拥有前面所述特点的代码设计首先可以让你的程序变得有趣。编写小型的代码块没有足够的空间让学生去思考并且获得必要的代码直觉。另一方面,在真正的程序设计中,这些技巧又是非常必要的。
这意味着,除了编写琐碎的代码块,你必须依靠自己去发现问题,通过编程解决这个问题。
找到一个好问题
一个好的问题可以提供一个平台,让你在上面应用你的知识,看到它的效果,总结并改进,然后重新实现你的解决方案。
选择一个你想解决的问题非常重要——这对你来说也许并不简单,但同时也会让你觉得“如果我写一个程序去解决,这会很酷!”。当你尝试编写一个程序去解决你所关系的问题时,你将会有动力去学习和成长。你会总想着如何改进自己的解决方案。
找到一个好问题并尝试去解决它一开始会让你觉得很难,这只是因为你把标准定得太高。你可能看了很多遍《社交网络》,并且想要让自己的解决方案变成下一个谷歌或脸书。但这只会让你定立不切实际的目标,降低你的学习速度,耽搁你的发展。
记住,你的目标不是去写一个价值十亿美元的软件,而是通过编写一个程序为自己提供一个练习和学习的平台。
找到好问题的途径
你是否感觉到自己在做一些多余且无聊以至于可能让自己变笨的事情?你是否曾希望能拥有一些聪明的宠物或精灵为你做这些事情?你知道它们可以把这些事情做的更快,因为它们不会像自己一样偷懒。
你知道吗,你已经有了这样的宠物——你的电脑。每一个单调枯燥的任务都提供了一个机会让你去编写一个程序,并告诉这个“聪明的宠物”应该怎么做。
写下好的解决方案
在你选择好了问题之后,你需要制定最佳解决方案,让我们来看看Brian W. Kerninghan在他的书中是怎么描述“好软件”的。
“好软件的产生有这些最基本的原则:简易,好软件的代码是精简和便于管理的;清晰,好的软件可以让用户很快上手;普遍性,好的软件可以在较广的用户场景下使用,并且能够很好地适用新的用户场景;自动化,好的软件可以将我们从单调的工作中解放出来”
遗憾的是,只有少数的《xx编程入门》书籍涉及到了这些原则,更令人遗憾的是很多大学的编程课程完全忽略了编程的这个方面。
当你有一个自己发现的问题,你将会拥有一个你非常关心并且愿意持续优化它的解决方案。
在这一部分,我将要使用自己的一个例子来解释我想要表达的东西。
在日常生活中,我经常使用Chrome标签!但我发现了一点问题。
真的非常多!
问题1:为具有长标题的网页书签添加注释
如果你仔细看,你可能会发现我在这些网页书签的最后都添加了个人注释。这是因为,有时候,我很难想起当初收藏网页的具体原因或动机。当然,网页的标题已经能很好地解释网页包含的内容了,但是却不能解释我当初为什么觉得这些内容很有用,这就是为什么我添加这些注释的原因。
我一般会在网页原标题和我的注释之间使用符号“||”分隔开,那么,问题来了。
有时候网页的原标题真的非常长,就需要“Ctrl+left”,跳到最后再添加个人的注释!好麻烦!
我意识到这个问题可能不是很严重,但是它有时确实会减缓自己收集知识的速度。而且,正如我前面所说,我们不是为了制造一个十亿美元的软件,问题虽小,着手解决它才是最重要的!
问题2:将网页书签和标题一起复制
我收藏了每一个我害怕失去的好网页,并且根据它们所属的话题进行归入到文件夹,添加注释。因此,它们对我来说非常有价值。每当有人问我一些我所了解的话题,我都会尝试引导话题,以便我可以分享该话题的一些书签文件夹。
不,我不是想夸耀自己知道一切或证明我不是自私的人。我是真的认为这对他们有所帮助,因为:
这个文件夹包含了我关于这个话题的知识。通过网页的标题和个人的注释,获得这个文件夹的人就不只是获得一堆超链接,还获得了它的附加价值。我相信这比口头解释和填鸭式灌输更好。只有当人们自己去浏览了这些网页他们才真正学到了东西。那么问题来了,据我所知,Chrome无法提供快速简便的方式将网页书签和标题一起复制。如果我复制一些网页书签,粘贴在一些编辑器里面,我只能得到一个超链接。
所以,如果我想要分享链接、标题(包括注释),我就需要切换到编辑模式,全选标题,然后粘贴到别的地方,然后对超链接再做一遍同样的事情。如果我想要分享一大堆书签怎么办?就需要把前面的流程对每一个网页书签做一遍!
一项非常单调枯燥的任务
然而,这才是我理想中的为Chrome添加网页书签的样子:
我希望点击地址栏右上角的星形图标后能有一个“评论”输入框伴随着“名称”和 “文件夹”.
我希望Chrome允许我下载书签文件夹中的所有网页到本地电脑上,并且存放在一个纯文本文件里。在这个文件里,所有的网页书签会按照下面的格式展示:
○ 标题 - <bookmark_title>
○ 注释 - <bookmark_comment>
○ URL - <bookmark_url>
所以我擦了擦我的神灯,“哦,精灵!这些是我的愿望。能够请你让它们成真吗?”
解决方案
直到上个月,我甚至都认为实际上没有可行的方法。我认为唯一的方法可能是使用一个开源的浏览器,修改其中的代码来满足自己的需求。
经过一些初步的研究,我发现我不应该这样做。浏览器是最难和最庞大的软件之一,我目前肯定做不到修改浏览器的代码。
然后,我阅读了一个Quora问题“对于初学者来说有哪些很棒的程序项目”的回答。它描述了一个新手如何制作一个Chrome扩展将所有Facebook新闻推送中的图片替换成了猫的图片。
在这一刻,我意识到了浏览器扩展的力量,并且认为它将会帮助我达成愿望。
Chrome 浏览器扩展程序和Chrome. API
Chrome浏览器有一整套API可供使用,每个API的名字都是这种形式:chrome. API。(比如chrome.alarms API、chrome.bookmarks API等等)
任何人都可以使用它们创建自己的浏览器扩展程序。Chrome浏览器提供了让开发者得以轻松创建更多抽象代码的基本工具。
一个浏览器扩展程序只用到了普通的HTML/CSS 和JavaScript。我觉得哪怕对于初学者,也能轻易创建一个简单的浏览器扩展程序。你所需要的只是一点关于HTML/CSS 和 JavaScript的知识。
我之前已经通读了《Head First HTML with CSS & XHTML》,但是我完全不懂JavaScript。我想要避开这个方案,因为我原本只是想要做个项目来提升自己已经掌握的编程语言的流畅度(Python or C++)。
但我也迫切需要一个项目来展示我的Github 个人资料。
是时候学习一门新的语言了
我决定学习JavaScript的基础,比如变量、函数声明和定义、循环和条件语句。这几乎没有花什么时间,因为这些基础在所有的编程语言中都是几乎都是一样的。
我会在创建扩展程序的过程中学习其他的JavaScript特性,所以现在我就可以开始创建我自己的扩展程序了。
阅读并学习文档
可能是因为浏览器扩展一直都不是很火,只有少数教程视频或文章可以指导你去创建一个浏览器扩展程序。
我发现我所需要的东西就在chrome.bookmarks API里面。结果我发现这是一个不常用的调用,很少扩展程序会用到它,这意味着网上也没有关于如何使用这个请求的教程。
在这之前,我都是从精心制作的教程和指导手册学习知识,不需要花费太多精力。但这次,我只能通过阅读这个文档来学习。
这种感觉就像,我在面对一个像兵工厂一样庞大的工具包,但是只有一本小型的用户手册可供参考。现在,我需要自己去辨别,哪些工具最有助于实现我的目标。
在做这些的过程中,我意识到“Hello World”程序的重要性
我经常感觉到“Hello World”程序被高估了。
我的意思是虽然它非常受新人的欢迎,但是它应该还没有好到让所有的编程书/教程都需要从它开始的地步。
对我来说,它没有足够的吸引力。
我重新设置了浏览器,以便于可以在本地加载扩展程序。我按照文档中的说明创建了一些强制文件。现在,我可以开始使用bookmarks API 编写真正的扩展程序。城南旧事(http://www.simayi.net/dushubiji/6110.html)读书笔记摘抄好词好句及感悟赏析,可是等等,如果设置有问题怎么办,如果我错过了文档中的一些关键性问题怎么办?我需要先搞清楚,以免花了很多时间和精力后才发现程序无法运行。
这个时候我才真正觉得我需要创建一个叫“Hello World”的扩展程序
我认为“Hello World”程序与其说是你在项目中的第一个程序,不如说是项目能正常运行的保证。如果能正常运行“Hello World”,那么我的项目同样可以正常运行。
问题1:解决了
这就是我当晚想出来的:
收藏当前的网页书签
我认为网页标题是书签的一个很好的默认标题。所以,我没有在弹出的窗口中添加“标题:”的输入框。
在撰写本文时,我写的代码没有模块化,也不便于管理,它只是能跑起来而已。我接下来会优化它,这才是我真正的编程课题。
问题2: 不可解决?
据我所知,Chrome不提供任何方式让你可以生成并下载网页书签的文本文件到本地。这意味着我也不能下载这些网页书签。
重写页面
官方文档为我提供了一个解决方案。
Chrome. API 文档
读完后,我想,这就是我要做的。
我将要使用我自定义的书签管理页面来重写原本的网页书签管理页面。
在其中,书签将不会像现在这样显示在可选择的选项卡中。
如果对于每个网页书签,都有简单的文本表示,就像大多数其他网页一样,那将会很棒(比如你正在阅读的这个)。每个用文本表示的书签应该有如下的格式:
标题- < bookmark_title >
*注释- < bookmark_comment >
- URL - < bookmark_url >
虽然我还没有实现这个页面,但是我有信心能在近期实现。感谢你的阅读!
原文地址:http://blog.51cto.com/13868750/2145870