编程开发进阶更重要的是掌握的核心设计思维[图]

编程开发进阶更重要的是掌握的核心设计思维[图]:
“单独写一个琐碎的代码块就等同于弹奏音阶一样,不幸的是,弹奏音阶并不能教会你任何关于音乐的东西,并且非常枯燥”
这是 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

时间: 2024-10-06 21:26:21

编程开发进阶更重要的是掌握的核心设计思维[图]的相关文章

IT视频课程集(包含各类Oracle、DB2、Linux、Mysql、Nosql、Hadoop、BI、云计算、编程开发、网络、大数据、虚拟化

马哥Linux培训视频课程:http://pan.baidu.com/s/1pJwk7dp Oracle.大数据系列课程:http://pan.baidu.com/s/1bnng3yZ 天善智能BI培训视频课程:http://pan.baidu.com/s/1pJ7FPXp 老方块Oracle培训全套课程:http://pan.baidu.com/s/1gdkpHxL Mysql培训课程:http://pan.baidu.com/s/1c0vliMW Oracle数据库性能优化实务课程视频+源码

iOS开发进阶

博客专栏>移动开发专栏>IOS开发进阶 分享到:新浪微博腾讯微博IOS开发进阶 iPhone开发进阶,如果你已经基本熟悉了Objective-c基本语法,你已经熟悉iOS程序开发的基础,那么我们再进一步的学习iOS开发的知识.比如多任务编程,网络,系统方面的原理,内存管理,debug或查找crash的技巧等. 收藏 订阅 最新更新文章 [移动开发] iOS界面-仿网易新闻左侧抽屉式交互 续(添加新闻内容页和评论页手势) 1.介绍有的博友看了上篇博文 iOS界面-仿网易新闻左侧抽屉式交互 ,在微

Manual | BSD手册| Linux手册 | 数据库手册 | 编程开发手册 | WEB开发手册 | 软件应用手册 | 网络技术手册 | GNU手册

豆豆手册 □ BSD手册 □ Linux手册 □ 数据库手册 □ 编程开发手册 □ WEB开发手册 □ 软件应用手册 □ 网络技术手册 □ GNU手册 在线手册 首 页 BSD手册 ·FreeBSD Handbook 简体中文版 ·NetBSD Internals ·NetBSD 指导手册 ·FreeBSD Porter 手册 ·FREEBSD 使用者手册 ·FreeBSD 5.x 架设管理与应用 ·FreeBSD 6.0架设管理与应用 ·OpenBSD FAQ中文版 Linux手册 ·Turb

Android应用开发进阶篇-场景文字识别

由于研究生毕业项目需要完成一个基于移动终端的场景文字识别系统,虽然离毕业尚早,但出于兴趣的缘故,近一段抽时间完成了这样一套系统.基本的架构如下: 客户端:Android应用实现拍摄场景图片,大致划出感兴趣文字区域,通过socket通信上传服务器端识别; 服务器端:Python server进行socket通信监听,连通后调用文字识别引擎(exe可执行程序),将识别结果返回; 下面是系统运行示例图: 1. 客户端 包含两个Activity,: MainActivity主界面如上图左1,选择拍摄后调

Android开发进阶:Google依赖注入库Roboguice

Roboguice是一个用于Android应用的依赖注入框架,使用Google官方的Guice库位极大地简化了Android的依赖注入.让你的Android应用开发之路更加平坦顺利,编程更加简单有趣. 什么是依赖注入? 依赖注入是一种软件设计模式,无论是在运行时还是在编译时,允许删除.改变硬编码依赖性. 一些常用和普遍的依赖注入库有: Roboguice是一个用于Android应用的依赖注入框架,使用Google官方的Guice库位极大地简化了Android的依赖注入.让你的Android应用开

少年学习java等编程开发课程是一种愚蠢的时尚[图]

少年学习java等编程开发课程是一种愚蠢的时尚[图]:这篇文章仅仅代表一种不同的发声,不代表大部分人的意见,让孩子坐在电脑前面敲打键盘,掌握他们父母梦寐以求的技能.God,没有什么比教会我们的孩子写编码,这种想法更让人向往了."未来的大多数工作都与写编码有关系"英国邦创新.科学.经济发展部部长Navdeep Bains向大家展示了他们最近拍摄的一张照片:房间里面坐满了正在写代码的少年儿童.Navdeep Bains宣布了一项耗资5000万美元的计划,向年轻人教授如何编程. "

Linux内核开发进阶书籍推荐(不适合初学者)

Linux内核开发进阶书籍推荐(不适合初学者) 很早之前就想写一篇文章总结一下Linux Kernel开发的相关资料,项目的原因,再加上家里的一些事情,一直没能找到闲暇,今天终于有些时间,希望可以完成这篇文章吧.首先需要说明的是不是所有的人都需要搞内核开发,因为据笔者了解,大部分的软件工程师的工作都在用户态开发,学习内核开发事倍功半,没什么实际意义,另外,初学编程的人也不太适合搞内核开发,因为信息量相对比较大,而且枯燥晦涩,很容易让初学者还没有入门,就已经放弃了,再有就是不想投入时间,总是试图走

Rails 5 开发进阶

Rails 5 开发进阶:https://www.gitbook.com/book/kelby/rails-beginner-s-guide/details cancan : http://blog.xdite.net/posts/2012/07/30/cancan-rule-engine-authorization-based-library-1/ Ruby官方文档翻译(Ruby官方文档中文版) : http://blog.csdn.net/liuk10/article/details/509

程序员在编程开发中的10个实用技巧

程序员在编程开发中的10个实用技巧,下面是我自己在工作中学到的一些简单的技巧和策略,希望能对各位有用.1.     橡皮鸭调试法不知道各位有没有这样的经历,当你正在给别人描述问题的时候,突然灵机一动想到了解决方案?这种情况的产生是有科学依据的.高谈阔论能让我们的大脑重新有条理地组织问题.在这种情况下,你的聊天对象就是“橡皮鸭”.团队中的每个人都应该积极主动乐意地成为彼此的“橡皮鸭”.有时候,如果你幸运的话,你的“橡皮鸭”搞不好还能给出有效的建议呢.2.     快速信息反馈一旦写好代码就要尽快得