对我来说,编程这件事与其说是工作,不如说是兴趣。尽管和自己理想中的编程比,自己的所谓编程只不过是小打小闹,但是现在又有多少所谓的IT从业者是做真正的编程?产业化的今天,其实真的没有必要区分所谓的程序员和码农,每个人的路线和生活都不相同,也不可能相同,有人学编程只是为了一份工作,有人纯粹为了爱好。我的理解,无论出发点如何,只要尊重自己的选择,能够有所收获就够了。
这系列文章,是自己当初学习编程的一些方法和经验,整理了一下,可以分成几块记录。对于专业的程序员,我的经验并不适合,一些计算机专业出身的朋友,也不太适合。个人认为,我的这些经验更适合对编程感兴趣和转行的同学,当然更多的是入门的东西,不必太严肃,也不会太枯燥,当初自己学习编程像听故事一下,也希望这里的经验分享也能当故事一样。
这里的分享主要是计算机基础和编程基础为主,着重编程思维和编程的学习方法,核心的目标有三个:学习编程思想,学习解决问题的思路,学习乐观的态度。
简单的介绍一下自己,性别:男,年龄:29,学历:本科(数学专业),比较感兴趣的方向是数据库、算法、大数据、统计、浏览器技术,自动化框架设计等,之前从事过医疗软件测试、office开发、windows客户端(浏览器、输入法等)测试,现在大部分时间在做云产品和基础安全产品(ddos等)的测试,主要语言是C系列, python, java,matlab。
第一篇作为预备起,包含两部分内容,一部分是对编程基础的整体介绍,另一部分是编程的预备知识。
编程入门的目的
狭义来讲,我认为编程入门的目的有下面四个:
- 编写程序解决实际问题
- 看懂别人的代码和思维方式
- 培养编程的兴趣
- 学会如何学习
广义上的目的有如下三个:
- 培养计算机思维
- 了解计算机的功能范围和它的局限
- 学会将实际问题转化为计算机模型
编程入门知识包含的内容
入门的知识如何界定是一个模糊的概念,一些常用的需要掌握的内容如下:
- 数据类型、变量、运算、语句和结构
- 函数编程和面向对象编程
- 高级数据类型
- 常用算法
- 异常、调试、故障定位和优化
- 基本的仿真和模拟
- 常用编程思想和模式设计
学习方法
考虑我个人的学习方法(我接触编程较晚,大学毕业后才学习),我推荐的一些方法如下:
- 抛弃老师或者书上的笔记,以自己记录的笔记为主
- 主动思考为主,遇到问题不要问别人答案,如果要就要提示
- 多看看面试题和开源的东西
- 简单的语言着手,但是需要对比的学习其他语言
- 学习不限制形式,轻松一点最好,但是要求要严格
- 切忌自欺欺人
- 学会分享
下面是一些储备知识,这些知识在网上都可以轻松的检索到,可以多参考一些资料:
- 冯诺依曼体系硬件模型
建议学习编程的人在写helloworld之前,先了解计算机是怎么工作的,至少当你运行代码的时候,要知道程序并不是屏幕上的几行代码,至少需要一段可以运行的程序、专属的堆栈空间、有内核控制块、有独立的存储空间(内存)。
请参考维基百科以及涉及到的主要资料: http://zh.wikipedia.org/wiki/%E5%86%AF%C2%B7%E8%AF%BA%E4%BC%8A%E6%9B%BC%E7%BB%93%E6%9E%84
- 计算机启动过程
比如linux加电自检后的启动过程:
参考 http://roclinux.cn/?p=1301 和 http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html
- 编译过程
百度百科的资料可以参考 http://baike.baidu.com/link?url=v2YMwgziW6Z81dl_d0lUML8T9xL-rXWYWV4fVYJo6QAZLQYfemh3cNhCmtddMjM35gMlbx3LfiDUAT6X0PT4vq ,不需要严格的去学习编译原理,但是也不能仅仅限制于百科上的东东
- 内存进程模型
建议每一个学习编程的人,都要了解内存进程模型,这部分的东西可以参考经典的《深入了解计算机系统》第一章相关部门
- 程序执行过程
可以参考 http://beyondjhf-2008.iteye.com/blog/394316 和 http://blog.sina.com.cn/s/blog_4cb133e501000au3.html
- 问题的抽象方法
大部分遇到的问题,都可以抽象为两种最小粒度描述,描述结论的和描述过程的,即陈述型和推导型:
陈述型:描述为主,一般有绝对的结果性,这种方法更多的时候是在说明一件实事和结果,比如加减计算;
推导型:推导为主,一般只有相对和较优的结果(有时无结果),这种方法更多的是诠释一个过程,比如开平方和线性逼近;
- 编程语言类型
分类的方法太多了,常用的分类如下:
High vs. low
General vs. targeted
Interpreted vs. compiled
对比编程语言的时候,另一个需要了解的东西是图灵兼容:
图灵兼容:
只要有适用的基本指令集,好的程序员能编出任何程序。1936年,图灵认为只要六条简单的基本指令,一切都可以通过机械工艺解决。随之产生了一些有趣的推论。其中有条是,只要能在一种编程语言中实现,就能在另一种语言中实现。C中能实现的没有Fortran不能实现的。
- 语意和语法
编程语言和人类语言一样也是沟通的一种方法,了解基本的语意语法,有助于快速的学习编程语言——从这点讲,疯狂英语的学习方法在编程语言的学习上并不适用。
简单来说:
语法错误可以认为程序本身是“错”的,即说的不是“人话”,比如“猫狗是”这样的表达,程序角度来讲,这样的错误编译是通不过的,大多数ide都会有这方面的处理;
语意错误更多认为程序内容是错的,而程序本身没问题,即说的是“人话”,句子是对的,但是想表达的意思是不对的,比如“猫是狗”,这样的问题只能在代码执行的时候才能表现出来;
编程之前的储备知识就这么多了,下一篇是变量、结构、语句和类型的一些学习经验分享。