计算机编程技术蓝图

目录:

0 硬件

1 基本概念

2 操作系统

3 编程技术 

4 软件工程

5 高效的程序员

6 编程实践

 

自己主要关注2个方面,硬件方向的单片机(如何与各种硬件外设交互)和软件方向的计算机图形学(专注于图形图像的生成).其他还关心linux,网络. 从0开始 :)

0 硬件

对于一个计算机硬件,我们需要从哪些方面了解呢?以下是个列表(链接待整理).


模块


硬件


编程方面


接口方式


衡量指标


研究方向


处理器


pc,notebook,phone


线程


intel: Socket 478 ,LGA775,LGA 1150等

amd: Socket 939 Socket FM2等


多核/主频

工艺


程序设计基础


内存


内存


变量,地址

ddr3/4
带宽/延迟


程序设计基础


存储


硬盘/U盘/sd


文件  读取的方式:同步,异步


(ata)ide,sata3(串行ata)

usb


带宽

容量


数据库


网络


网卡/路由器/网线


socket

 
带宽,延迟


计算机网络

声音 声卡        

显示


gpu, 显卡/显示器/打印机


读写显示器  窗口


对外:

vga,dvi,hdmi,dp;

内部:

AGP,pci


分辨率

色域

色彩准确度响应时间

可视角度

清晰度

亮度

对比度

功耗

发热


计算机图形学


鼠标/键盘


键盘,鼠标


消息/事件/中断

usb,ps2
分辨率


程序设计基础

 

1 基本概念

在硬件向软件过渡过程中,或者说在使用硬件的过程中,理解基本概念是在最坚实,最困难的一步.这部分内容在 知识整理--基本概念中.(链接待整理),这些概念下面联系着硬件,上面联系着软件,起到承上启下的作用.每个概念的后面即有理论又有实践.理论是唯一的,实践却可以从不同的地方获取,比如不同的库(gdi,opengl)都不可以获取图形学的一些知识,也可以是不同的操作系统(win/linux/mac)都可以获取进程线程的一些知识.windows/mfc/qt都可以获取消息系统的一些知识.win/mac/android/ios都可以获取一些图形界面的一些知识.**都可以获取网络的一些知识,**都可以获取文件系统的一些知识.

对这些概念整理,分类如下

c&cpp
c:

变量

函数

结构体

指针

数组


cpp:

对象

模版

虚函数

构造函数

析构函数

重载

继承

封装

   
os操作系统/浏览器术语

进程

线程

链接库

虚拟内存

窗口

事件消息

堆栈

内存映射

异常

文件系统

文件
缓存
重定向
定时器

console

ssh

浏览器
字体
编码

gdi/ opengl图形学术语
ps:
透明/半透明
矢量
动画
调色板


gdi:

位图(bitmap)

画刷(brush)

画笔(pen)

颜色(color)

路径(path)

区域(region)

调色板

opengl:
图片
渲染
纹理
点阵
分辨率
蒙版
 
qt术语 信号/槽
mvc
     
网络
tcp/ip协议

端口

路由

     
软件工程术语 瀑布模型      

2 操作系统

逐步了解操作系统是我们工作的基础.在这个地球上常用的操作系统有windows和*nix(linux,unix,mac os),其它还有手机/嵌入式硬件的操作系统android ,ios, wp,symbian,meego,blackberry,webos.他们展现给用户的或许千差万别,但是对程序员来说区别不像看起来那么大(越底层越是这样).

a)系统使用/管理/探索工具

windows下面常用图形配置工具或者批处理命令来管理配置操作系统

*nix下面有一系列的工具(基于命令行)来配置,探索系统

1)如何管理软件(更新 卸载,生成)?

2)如何查看硬件信息?

b)自动化语言:

自动化可以更高效的使用计算机系统(操作系统)

包括windows下面的批处理,*nix下面的脚本

3 编程技术 

为了使用上面的硬件,就需要使用编程技术,即使用操作系统提供的接口来控制硬件.

a)编程基础

此部分属于程序员的个人修养,可能不能直接用于编程,但是可以直接用于深入编程.不一定需要知道具体怎么做,但是要明白计算机如何做一些事情(一个是机制,一个是实现细节)

什么是进程,文件,线程,内存,定时器,网络,重定向等基本概念,这些都是计算机提供给我们的解决问题的工具

比如理解软件的运行过程

比如理解c与汇编的关系

比如理解脚本的工作方式

比如一个可执行文件的格式(windows下的pe,*nix下的coff,mac下的mech-o)

比如理解操作系统的工作方式

比如理解设计模式(里面包含了经过实践的,好的编程准则)

如何高效的处理大量物体,如何处理动画

b)编程语言

计算机编程语言有很多种,共同的基础是系统api,原理即是函数调用,再往下就是堆栈保存,跳转执行:

通用编程语言 c c++ vc c# java objc等

通用脚本语言 python

浏览器脚本语言 js, html, css,其中html专注于结构化文档 css专注于界面展现,js相当于浏览器的脚本语言,主要是对浏览器的控制.

系统脚本语言:批处理,shell

其它还有专注于程序封包的nsis

注意理解这里的专注有2种: 专注于某一方面的语言和有一些库专注于某一方面有交集

附:我的编程语言世界观:(2014/08/07 15:46)

在windows的世界里混 c#必须要懂的吧

一个正儿八经的程序员c c++ vc也是要懂的吧

python也是要知道的吧,横跨windows和linux的语言

做服务器 linux是必须要懂的吧

想做网页 js html css 必须要懂的吧

想高效的工作,windows的批处理,linux shell也是要懂的吧

在linux下面你好意思说不会vi?

想做android程序吗,java得懂吧

想做ios程序吗,objc得懂吧

什么?你问我只会一种语言行不行?

不行,绝对不行!

除了说语言,我说库了吗?mfc,.net,stl就不说了,这都是标配.qt,opengl,directx,jquery,tornado,还有就是每一个东西的二次开发都是一个库.

你说其实上面的你都有所接触,其中大部分用的还不错,恭喜你,在编程的道路,你开始入门了!

c) 库(图形,网络,数据库,大数据等)

库分语言自带库和第三方库

编程语言都会带有库,比如c标准库,c++的stl,vc下面的mfc,c#的.net库,python有大量的库,

还有一些各种语言第三方库,有些库可能在几种语言下都可以工作,比如:

专注线程的 pthread

专注网络的

专注界面的 qt,win32 gui

专注于图形的:dictectx,opengl,win32 gdi

专注于科学计算的

专注于网站后台的 tornado

文件系统,数据库:sql,mysql,hadhoop

...

d)应用类型,实现载体.为什么要看上面的各种东西呢(开发什么)

可以做可以实现各种功能桌面程序

可以做网站

可以做桌面/手机客户端

e)工作中常需要处理基本方面

无论使用哪种操作系统,哪种语言,甚至是哪个库,甚至也不管你做何种开发,下面的都会常常遇到

1 网络访问

2 压缩解压

3 xml json ini

4 数据库访问

5 文件访问

6 注册表文件

7 界面(皮肤)

8 数据结构,字符串处理

9 图像处理(2012/11/1 14:26)

4 软件工程

用工程的观点看如何制作一个软件.是计算机编程的总结.如何去更好的使用上面的东西来完成具体的一个软件(系统),涉及以下活动:

需求分析和定义。

系统设计

程序设计

编写程序

单元测试

集成测试

系统测试

系统交付/验收

运行和维护

a)总体开发过程

瀑布模型

迭代开发

螺旋开发

敏捷开发

b) 代码编辑

windows下面主要使用ide(vs系列)

*nix常用vi等一系列的文本工具,cmake,gcc等编译工具链

代码编写规范

c) 代码管理

svn

git

d)测试技术

黑盒测试,白盒测试,灰盒测试

代码测试

产品测试

自动化测试

5 高效的程序员

1 快捷键

包括系统快捷键和一些软件专用的快捷键,系统常用也就记住了,软件专用的可以使用时查看

2 好的工具

工欲善其事,必先利其器.

有一些日常辅助工具比如mspaint,everything还有一些编程专用的工具比如spy++

常用软件即为各种工具,是否常用和获取的难易以及工具使用体验有很大关系.比如虽然notepad并一定是一个很好的文本查看工具,但是在每一个windows系统上都会带有,所以使用频率还是很高的.

在linux/mac下面这些工具一般是系统自带的,windows下面一般是第三方的(最出名的即为systeminternal,已经被微软收购), 也有少部分是自带的,另外visualstudio开发工具也自带一些.

可以体会一下编程实现和使用工具的异同点.

1) 文本工具

  notepad 编辑查看

  notepad++

  ultraedit

 

  vim

  hexedit

  beyondcompare 文本比较

  winmerge 

  svn 文本版本管理工具

 

2) 编程/开发工具

  vs ide/qt/python/js

  gnu工具链:ldd,objdump可执行文件查看工具

  vs自带工具:dumpbin,spyxx 可以查看windows窗口/消息

  systeminternal工具集合:procexp debugview

  depends 静态查看运行依赖

  stud_pe

 

3) 效率 时间管理工具

  totalcommand快速的操作文件

  everything 快速搜索硬盘文件

  youdao笔记本

  搜狗输入法


4) 网络浏览

  chrome

  firefox

  ie:据说微软要抛弃ie品牌,步live,message,msn后尘

  搜狗浏览器

  

5) 音视频图像工具

audition

Premiere 

photoshop 位图

mspaint系统自带的图片查看工具

 

字体

svg是一个标准

2D3D模型工具

illustrator 矢量图 PostScript

11) 其它

  fiddler 读写/监视网卡

  wireshark

  Advanced Serial Port Monitor(类似于syterminternal的   portmon ) 读写/监视串口

  disk investigator(类似于syterminternal的diskview)硬盘工具

  spacesniffer 图形化显示硬盘文件

6  编程实践(计算机应用)

1) 2009.1-2010.7

开始工作,使用win32(c),mfc(c++)

2) 2010.7-2012.12

接触了qt,python,mac/ios(object-c)

3) 2013-2---

接触了web客户端编程(js,html/html5,css,),web服务器编程(c,python,java,php),以及客户端与服务器交互技术.

更加关注计算机图像软硬件领域

以上是一些粗浅思考,希望交流指正

-----------------------update log------------------------------------------------------------------------

2014/07/25 09:44 创建文档

2015/02/05 11:11 添加了1 基本概念部分.

2015/03/26 16:50 全文措辞微调

2015/04/08 16:07 修改计算机硬件部分为一个列表

2015/04/14 09:49 全文措辞微调

时间: 2024-10-24 11:01:25

计算机编程技术蓝图的相关文章

一 GPU 编程技术的发展历程及现状

前言 本文通过介绍 GPU 编程技术的发展历程,让大家初步地了解 GPU 编程,走进 GPU 编程的世界. 冯诺依曼计算机架构的瓶颈 曾经,几乎所有的处理器都是以冯诺依曼计算机架构为基础工作的. 该系统架构简单来说就是处理器从存储器中不断取指,解码,执行. 但如今,这种系统架构遇到了瓶颈:内存的读写速度已经跟不上 CPU 的时钟频率了.具有此特征的系统被称为内存受限型系统,目前的绝大多数计算机系统都属于此类型. 为了解决这个问题,传统的解决方案是使用缓存技术.通过给 CPU 设立多级缓存,能够大

免费计算机编程类中文书籍

摘自github 语言无关类 操作系统 开源世界旅行手册 鸟哥的Linux私房菜 (简体) Linux 系统高级编程 The Linux Command Line (中英文版) Linux 设备驱动 (第三版) 深入分析Linux内核源码 UNIX TOOLBOX WEB服务器 Nginx开发从入门到精通 (淘宝团队出品) 版本控制 git - 简易指南 Git 参考手册 Pro Git Git Magic GotGitHub Git Community Book 中文版 Mercurial 使

网络编程技术

                                                     网络编程技术 Java 网络编程 网络基础知识 网络编程的目的:直接或间接地通过网络协议与其他计算机进行通讯. 网络编程中有两个主要的问题: 1.如何准确地定位网络上一台或多台主机. 2.找到主机后如何可靠高效地进行数据传输. 目前较为流行的网络编程模型是客户端/服务器(C/S)结构. 即通信双方一方作为服务器等待客户提出请求并予以相应.客户则在需要服务时向服务器提出申请. 服务器始终运行,

第一篇:GPU 编程技术的发展历程及现状

前言 本文通过介绍 GPU 编程技术的发展历程,让大家初步地了解 GPU 编程,走进 GPU 编程的世界. 冯诺依曼计算机架构的瓶颈 曾经,几乎所有的处理器都是以冯诺依曼计算机架构为基础的.该系统架构简单来说就是处理器从存储器中不断取指,解码,执行. 但如今这种系统架构遇到了瓶颈:内存的读写速度跟不上 CPU 时钟频率.具有此特征的系统被称为内存受限型系统,目前的绝大多数计算机系统都属于此类型. 为了解决此问题,传统解决方案是使用缓存技术.通过给 CPU 设立多级缓存,能大大地降低存储系统的压力

用函数式编程技术编写优美的 JavaScript

用函数式编程技术编写优美的 JavaScript_ibm作者: 字体:[增加 减小] 类型:转载函数式编程语言在学术领域已经存在相当长一段时间了,但是从历史上看,它们没有丰富的工具和库可供使用.随着 .NET 平台上的 Haskell 的出现,函数式编程变得更加流行.一些传统的编程语言,例如 C++ 和 JavaScript,引入了由函数式编程提供的一些构造和特性.在许多情况下,JavaScript 的重复代码导致了一些拙劣的编码.如果使用函数式编程,就可以避免这些问题.此外,可以利用函数式编程

计算机三级网络技术备考复习资料zhuan

计算机三级网络技术备考复习资料   第一章  计算机基础 分析:考试形式:选择题和填空题,6个的选择题和2个填空题共10分,都是基本概念 1.计算机的四特点:有信息处理的特性,有广泛适应的特性,有灵活选择的特性.有正确应用的特性.(此条不需要知道) 2.计算机的发展阶段:经历了以下5个阶段(它们是并行关系):大型机阶段(46年ENIAC.58年103.59年104机).小型机阶段.微型机阶段(2005年5月1日联想完成了收购美国IBM公司的全球PC业务).客户机/服务器阶段(对等网络与非对等网络

如何提高Web服务端并发效率的异步编程技术

作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升web应用服务端的并发能力.那么我们如何做到这点了,根据现有的并发技术我们会有如下选择: 第一个做法:为每个客户端发送给服务端的请求都开启一个线程,等请求处理完毕后该线程就被销毁掉,这种做法很直观,但是在现代的web服务器里这种做法已经很少使用了,原因是新建一个线程,销毁一个线程的开销(开销是指占用

[JAVA_开课吧资源]第五周 I/O操作、多线程、网络编程技术

主题一 I/O操作 » 流的概念 在面向对象语言中, 数据的输入和输出都是通过数据流来实现的.数据流是一组有顺序.有起点和终点的字符集合.就好比是两个不同的池子,一个池子中存满了水,而另一个池子中则没有任何的东西,在这两个水池中安放一个管子,水就可以从一个池子流向另一个池子了.在从一个池子向另一个池子输送水的过程中,水扮演的角色就是数据流. [请点击查看更多内容 转自文章] » Stream stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源.在Java的IO中,所有

我是如何学习计算机编程的

我在很小年纪的时候就开始学习编程,我学习编程的方法是创建大量的不同的网站.下面列出的是我创建的主要的网站,其中最早的一个是我11岁时开发的.我希望读者能从我这些复述中获得的信息是:如果你想学习编程,做大量的练习性的项目是非常必要的. 学习一种技术最好的方法就是练习,练习,练习.所有我知道的最优秀的程序员都深深的享受编程——编程是一件让他们干起来无由的高兴的事情.也因此他们大量的编程.经常,那是一种不健康的废寝忘食.学习如何编程——以及如何编好程——并不需要你具有超人的能力.你只需要去按照自己的意