320 likes | 498 Views
在学校里打好程序设计之基础. 潘爱民 微软亚洲研究院,网络与多媒体组. 程序设计之重要性. 计算机软件的一切在于软件,而软件是靠程序设计得来的 点子固然值钱,但点子能变成现实才真正值钱. 看计算机发展史上的成功者. Bill Gates 在哈佛大学读书的盖茨与伙伴保罗 · 艾伦一起为 Altair 8800 电脑设计 Altair BASIC 解译器. 看计算机发展史上的成功者. Linus Torvalds 当今世界最著名的电脑程序员、黑客。 Linux 内核的发明人及该计划的合作者。大学时出于个人爱好写出了 Linux 内核的第一个版本.
E N D
在学校里打好程序设计之基础 潘爱民 微软亚洲研究院,网络与多媒体组
程序设计之重要性 • 计算机软件的一切在于软件,而软件是靠程序设计得来的 • 点子固然值钱,但点子能变成现实才真正值钱
看计算机发展史上的成功者 • Bill Gates • 在哈佛大学读书的盖茨与伙伴保罗·艾伦一起为Altair 8800电脑设计Altair BASIC解译器
看计算机发展史上的成功者 • Linus Torvalds • 当今世界最著名的电脑程序员、黑客。Linux内核的发明人及该计划的合作者。大学时出于个人爱好写出了Linux内核的第一个版本
看计算机发展史上的成功者 • David Cutler • VMS和Windows NT的首席设计师。NT之父。 • 去微软前号称硅谷最牛的kernel程序员
看计算机发展史上的成功者 • Edsger Wybe Dijkstra • Dijkstra最短路径算法 • Semaphore概念 • Goto语句的论述 • THE multiprogramming system
看计算机发展史上的成功者 • Tony Hoare • 1960年发明Quicksort算法 • formal language Communicating Sequential Processes (CSP)
看计算机发展史上的成功者 • Anders Hejlsberg • 主攻编译器 • Turbo Pascal、Delphi的设计师 • VJ++、.NET的设计师
看计算机发展史上的成功者 • Donald E. Knuth • “The Art of Computer Programming” • TEX排版软 • KMP算法
看计算机发展史上的成功者 • Ken Thompson & Dennis M. Ritchie • UNIX • B & C语言
看计算机发展史上的成功者 • Bjarne Stroustrup • C++ Creator“I designed and implemented the C++ programming language” from his homepage
看计算机发展史上的成功者 • Richard Stallman • Emacs (GNU Emacs) • GNU C complier • GNU debugger • The founder of GNU project, and the author of GNU GPL
看计算机发展史上的成功者 • 王选 • 当代毕昇
理解软件和程序 • 软件 • 代码和数据,融入了各种知识,算法,经验,等许多无形的东西 • 程序 • 软件的执行流,可以理解为指令流,也涉及到环境的信息:输入、输出、存储介质 怎么理解“a= a+1”? 数学中的“ai+1= ai+1”?
计算机是如何工作的 机器代码
程序在哪里 • 纸带上的程序 • 磁带中的程序 • 软盘上的程序 • 光盘上的程序 • 硬盘上的程序 内存中的程序
哪一条指令,哪一个数据单元? • 刚开始那个?上一个?下一个?还是最后那个? • 第0个?第1个?——编号 • 索引——一维,还是二维? • 地址,可寻址的 • 每条指令,每个数据单元都有地址 • 在有些语言中,称为“指针(pointer)”,或者“引用(reference)”
内存,外存 • 机器有内存,要执行的代码,以及在执行过程中要用到的数据都在内存中 • 机器也有外存,很多种,像硬盘、U盘、CD-ROM,等等 • 一般而言,外存比内存大得多,对于计算机的运行,内存是必不可少的 • CPU直接操作内存中的数据,而外存中的数据被换到内存中以后,才能被CPU使用
计算机会做什么 • 计算,加减乘除,位操作,浮点运算 • 挪内存中的数据单元
从机器代码开始工作 现在,这种能力接近于特异功能了,虽然实际上,正常人都能学得会
在汇编语言上工作 能够精准地控制计算机做最微小的事情,控制力很强,但工作效率低下 时钟频率的提高,人已经无法手工处理如此巨量的指令
进入高级语言 • 用高级语言来告诉计算机该做什么 • 通过编译器,把高级语言的语句翻译成计算机的指令 • 高级语言更加接近于人们的思考方式,和数学描述 • 主流的语言:Basic,Fortran,Pascal,C/C++,Java,C#,Python,等等
语言和算法 • 把想法变成用高级语言来描述的程序代码 • 进入程序设计(programming),俗称编程序 • 算法是一种知识的积累,用于完成一些常见的任务。 • 熟练掌握常用的算法是大学期间的学习任务之一 • 对于某些算法,清楚其细节,包括其性能
常用的数据结构和算法 • 以下数据结构需要熟练掌握 • List, stack, queue, binary tree • 以下算法需熟练掌握 • Sorting,基本的hash算法 • 字符串的处理 • 建议研习STL
程序设计是一门艺术 • 在程序设计过程中,除了程序和代码本身,还有许多相关的东西 • 程序设计中的思想 • 结构化的思想 • 面向对象的思想 • 类型泛化的思想 • 虚拟机的思想 • 你的程序是一件艺术品,如何迎接同行审视的目光
写代码的层次 • 按照任务指示,写一个没有下家的程序 • 只要正确地完成功能 • 写一个给大量用户使用的程序 • 考虑到用户的各种意外行为,要健壮 • 写一个可复用的程序组件 • 对接口的理解和实现,包括错误处理 • 写一个代码库,供自己及同伴使用 • 预知客户的行为,库的扩展性 • 写一个开源软件 • 你的面子全在程序上了
大学时期的程序设计课程 • 汇编语言一定要学,要学到精通掌握 • 精通一门高级语言,推荐C++ • 数据结构 • 算法课程、离散数学 • 建议再学习一门数值计算 • 编译原理 • 软件工程 • 高级程序设计(选学,像网络编程、设计模式等)
如何自我训练 • 靠老师?靠课程? • 师傅领进门,修行在个人 • 自悟 • 自己最了解自己:你明白了多少,还有什么不明白的。 • 强力训练 • 写程序也是一门工艺,熟练活——功到自然成 • 忌盲目训练——时时反思 • 找一个选题,别担心重复选题
定位自己 • 基础知识是必需的,没有别的选择 • 平台和工具,甚至语言,你都可以选择 • 平台是相通的,工具是相通的,语言基本上也大同小异 • 精通其一,可走遍天下 • 发扬和控制自己对技术的情绪 • 利用在校时间,把基础打好
工业界怎么筛选学生 • 基础无疑是最为重要的 • 解决和分析问题的能力 • 动手能力,编程经验
关于计算机图书 • 少而精 • 每个主题,选一本适合自己的书来精读 • 再选一本参考书,如果上一本不适合做参考 • 建议完整地读几本英文书,中文书可作浏览用