游戏里常有这样的设定,开局的时候,整张地图都是雾蒙蒙的,什么也看不见。先选个地方造兵采矿,建立基地,再派兵去周围的地方探索,继续造兵采矿,占领的地方越来越多,整张地图也越来越清晰。
编程也是这样,一开始的时候,什么都看不清,什么都不懂,学了几年也写不出个软件。传统的学习模式是,学习,理解,运用,而学编程的时候,可以灵活一点。
把编程知识想象成一个3D网络,每个知识点都是网络中的一个节点,每个节点上有一盏灯,你学会了,灯就亮了,可以看到周围的节点,接着走,点灯,再走,再点灯,这样,灯亮的越来越多,看的越来越清楚,对于自己要走的方向也越来越有信心。
基本的思想是,先用后学,缩短反馈,反复迭代。
举个例子来说,假如初学Java,想写个下载软件,怎么办?
第一次迭代:写出个下载文件的类。
破冰阶段。这个阶段的目标是,先跑起来,懂不懂没关系,先有一份能运行,能打印log的代码出来。这样就有了反馈。其实很简单,网上搜一下,直接可以找到代码段,放进IDE就可以跑。
public class DownloadFile { public static void main(String[] args) throws IOException { String fileName = "file.txt"; //The file that will be saved on your computer URL link = new URL("http://shayconcepts.com"); //The file that you want to download //Code to download InputStream in = new BufferedInputStream(link.openStream()); ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; int n = 0; while (-1!=(n=in.read(buf))) { out.write(buf, 0, n); } out.close(); in.close(); byte[] response = out.toByteArray(); FileOutputStream fos = new FileOutputStream(fileName); fos.write(response); fos.close(); //End download code System.out.println("Finished"); } }
学习阶段。捋出代码中的知识点,分别点亮。文件系统,Input/OutStream,URL,这些都是用到的知识点,研读官方文档,尝试调用不同的method, 跑起来就能看到结果,尽快学会运用。
专家阶段。想象自己是专家,试图理解为什么是这样。为什么要用ByteArrayOutputStream?还有其他的OutputStream吗?组织结构是什么?为什么要用URL类?还有其他的选择吗?各有什么优缺点?很多问题可能解答不了,但只要想了,就会很不一样。
这样,一轮迭代就完成了,也点亮了几个知识点,File, input/out stream, url。接着来,
迭代2:实现断点续传。知识点:http request, response.
迭代3: 管理多个下载文件。知识点:多线程,embedded db,sql。
迭代4: 加个UI。知识点:GUI,消息处理,响应模式。
到这时候,基本上代码已经改的乱七八糟,难以为继了。
迭代5:重构。知识点:软件工程,代码管理,设计模式。这是相当痛苦的过程。
迭代6: Web版,通过网页管理下载任务。知识点:web ui,server,db,各种协议,通讯模式,相当不容易。
迭代7: App版,同样的server端,通过手机客户端管理下载。知识点: app开发,各种实现方式。
迭代8: 爬虫版,专门用来爬网页,或者特定信息的版本。知识点: 爬虫,文本处理,dom。
迭代9: 股市版,爬下股票价格,画出各种图表,指标。知识点:画图,数学计算,金融知识。
在这个过程中,同步学习专业课里的OS,DB,软件工程,网络,会时不时有醍醐灌顶的感觉。
点亮的知识点越来越多,路也会越来越好走。可以选择向上走,做应用,也可以向下走,做底层。有的喜欢做app,有的能给玩具熊编程,有的可以操纵空调,有的可以做股票交易。
学习的过程不是线性的,而是在不断的调整,朝向最重要,最有兴趣的方向,完善自己的技能树。
就当作是程序员养成游戏吧。