├── .gitignore
├── .travis.yml
├── README.md
├── SUMMARY.md
├── book.json
├── chapter1-what-is-programming
└── README.md
├── chapter2-how-to-learn-programming
└── README.md
├── chapter3-advanced-programming-part1
└── README.md
├── chapter4-advanced-programming-part2
├── README.md
├── cli-and-gui.md
└── projects.md
├── chapter5-programming-languages
└── README.md
├── chapter6-useful-tools
├── README.md
├── good-habits.md
├── ide-vs-terminal.md
├── improve-efficiency.md
├── search-engine.md
├── text-editor.md
└── version-control.md
├── chapter7-textbooks
├── README.md
├── algo-data-struct.md
├── android.md
├── c-plusplus.md
├── c-programming.md
├── data-mining.md
├── database.md
├── go.md
├── gui.md
├── java.md
├── linux.md
├── machine-learning.md
├── misc.md
├── network.md
├── operating_system.md
├── python.md
├── spark.md
├── web-back-end.md
└── web-front-end.md
├── conf
└── qiniu_sync.json
├── downloads
├── .DS_Store
├── Beginner 1- Picking the right search terms.pdf
├── LearningNetworkProgramming.pdf
├── TCPIP网络编程之四书五经.pdf
└── leetcode-cpp.pdf
├── images
├── .picasa.ini
├── 1280px-Blue-punch-card-front-horiz.png
├── 800px-FortranCardPROJ039.agr.jpg
├── eniac4.jpg
├── git-branch-1.png
├── gitbook_editor.png
├── python-big-data.png
├── questions4mind.png
├── suanpan.jpg
└── vim_cheat_sheet_for_programmers_print.png
├── package.json
└── part_i_introduction_to_programming
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | # Node rules:
2 | ## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
3 | .grunt
4 |
5 | ## Dependency directory
6 | ## Commenting this out is preferred by some people, see
7 | ## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git
8 | node_modules
9 |
10 | # Book build output
11 | _book
12 |
13 | # eBook build output
14 | *.epub
15 | *.mobi
16 | *.pdf
17 |
18 | # docs for other materials
19 | !/docs/*
20 |
21 | # MAC OS X
22 | **/.DS_Store
23 |
24 | # draft
25 | draft
26 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 |
3 | node_js:
4 | - "stable"
5 |
6 | before_install:
7 | # update first
8 | - sudo apt-get update -qq
9 | # install Chinese fonts
10 | - sudo apt-get install -y fonts-arphic-gbsn00lp
11 | # Install Gitbook
12 | - npm install gitbook-cli -g
13 | - npm install svgexport -g
14 | # Clone the repository
15 | - cd ~
16 | - git clone --depth=10 --branch=master git://github.com/billryan/programming-notes.git
17 |
18 | before_script:
19 | # install calibre latest version
20 | - sudo -v && wget --no-check-certificate -nv -O- https://raw.githubusercontent.com/kovidgoyal/calibre/master/setup/linux-installer.py | sudo python -c "import sys; main=lambda:sys.stderr.write('Download failed\n'); exec(sys.stdin.read()); main()"
21 | # install qiniu sync
22 | - wget http://devtools.qiniu.io/qiniu-devtools-linux_amd64-current.tar.gz
23 | - tar xfz qiniu-devtools-linux_amd64-current.tar.gz
24 | - cp programming-notes/conf/qiniu_sync.json ~/
25 |
26 | script:
27 | # replace with real key
28 | - sed -i "s/AccessKey/$QAK/g" qiniu_sync.json
29 | - sed -i "s/SecretKey/$QSK/g" qiniu_sync.json
30 | - mkdir -p ~/upload
31 | - cd ~/programming-notes
32 | - gitbook install
33 | - gitbook build ./ --format=json
34 | - gitbook build ./
35 | - gitbook pdf ./ ~/upload/programming_notes_billryan_print.pdf
36 | - gitbook epub ./ ~/upload/programming_notes_billryan.epub
37 | - gitbook mobi ./ ~/upload/programming_notes_billryan.mobi
38 |
39 | after_success:
40 | # copy website html files to upload
41 | - tar czf programming_notes_billryan_html.tar.gz _book/
42 | - cp programming_notes_billryan_html.tar.gz ~/upload/
43 | # upload to qiniu
44 | - ~/qrsync ~/qiniu_sync.json
45 | # # cd ~
46 | # - cd ~
47 | # # install source code pro
48 | # - mkdir -p /tmp/code_pro
49 | # - cd /tmp/code_pro/
50 | # - wget https://github.com/adobe-fonts/source-code-pro/archive/1.017R.tar.gz
51 | # - tar xzf 1.017R.tar.gz
52 | # - mkdir -p ~/.fonts/fontconfig/conf.d/
53 | # - cp source-code-pro-1.017R/OTF/*.otf ~/.fonts/
54 | # - sudo fc-cache -f -v
55 | # # install google noto Simplified Chinese
56 | # - mkdir -p /tmp/noto
57 | # - cd /tmp/noto
58 | # - wget https://www.google.com/get/noto/pkgs/NotoSansCJKSC-hinted.zip
59 | # - https://www.google.com/get/noto/pkgs/NotoSerif-unhinted.zip
60 | # - unzip NotoSansCJKSC-hinted.zip
61 | # - unzip NotoSerif-unhinted.zip
62 | # - mkdir -p ~/.fonts/noto
63 | # - mv *.otf ~/.fonts/noto
64 | # # update fonts
65 | # - cd ~
66 | # - cp ~/algorithm-exercise/conf/10-latin.conf ~/.fonts/fontconfig/conf.d/
67 | # - cp ~/algorithm-exercise/conf/15-noto-cjksc.conf ~/.fonts/fontconfig/conf.d/
68 | # - cp ~/algorithm-exercise/conf/20-noto-cjk.conf ~/.fonts/fontconfig/conf.d/
69 | # - sudo fc-cache -f -v
70 | # # generate different locales
71 | # - sudo locale-gen zh_CN.UTF-8
72 | # - cd ~/algorithm-exercise
73 | # - export LANG=zh_CN.UTF-8
74 | # - gitbook pdf ./ ~/upload/algorithm_billryan_desktop.pdf
75 | # - ~/qrsync ~/qiniu_sync.json
76 |
77 | branches:
78 | only:
79 | - master
80 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 编程笔记 By billryan
2 |
3 | [](https://travis-ci.org/billryan/programming-notes)
4 |
5 | 弹指之间,从我开始接触编程至今已五年有余,从大一刚接触 C 语言到现在对计算机编程的一知半解,其中曲折坎坷一言难尽,这本在线笔记记录了我在学习计算机编程过程中的点点滴滴。
6 |
7 | # About - 关于本文档
8 |
9 | - 本笔记的在线托管仓库为 https://github.com/billryan/programming-notes 你可以在github中star本项目查看更新。
10 | - 在线阅读网址为 http://prog-notes.yuanbin.me 在线阅读的网页通过gitbook后端生成,推送到github后会触发 gitbook 和 travis-ci 的编译,相应的编译输出下载链接提供Gitbook官网和七牛两种下载方式,七牛的链接中文显示比较好。
11 | 1. Read on the [website](http://prog-notes.yuanbin.me). **力荐**
12 | 2. EPUB. [Gitbook](https://www.gitbook.com/download/epub/book/yuanbin/programming-notes), [七牛](http://docs4bill.qiniudn.com/doc/programming_notes_billryan.epub) - Recommended for iPhone/iPad/MAC. 最适合离线查看,实测效果极好。
13 | 3. 离线html. [七牛](http://docs4bill.qiniudn.com/doc/programming_notes_billryan_html.tar.gz) - 解压后即为整个网站的内容,用于本地查看,目前内容更新频繁,不推荐下载。
14 | 4. PDF. [Gitbook](https://www.gitbook.com/download/pdf/book/yuanbin/programming-notes), [七牛- 适合打印版](http://docs4bill.qiniudn.com/doc/programming_notes_billryan_print.pdf) - Recommended for Desktop. 推荐下载七牛的版本。
15 | 5. MOBI. [Gitbook](https://www.gitbook.com/download/mobi/book/yuanbin/programming-notes), [七牛](http://docs4bill.qiniudn.com/doc/programming_notes_billryan.mobi) - Recommended for Kindle. 未测试,感觉不适合在 Kindle 上看此类书籍,尽管 Kindle 的屏幕对眼睛很好...
16 | - 全文大体上分为三大部分。
17 | 1. 第一部分为 Part I Introduction to Programming, 是对计算机编程相对宏观的介绍,前身为「碧蓝右耳」07年发布的 [C/C++ FAQ](http://www.vcgood.com/BBS/forum_posts.asp?TID=1559),我在此基础上做了大量的整合,以便适应如今蓬勃发展的计算机浪潮。
18 | 2. 第二部分为一些方法论的介绍。
19 | 3. 相关编程资料的总结。
20 | - 广而告之:本书的姊妹篇——[数据结构与算法/leetcode/lintcode题解](http://algorithm.yuanbin.me/) 也在火热更新中~
21 |
22 | 第一部分浅析了一些计算机编程背后蕴含的思想,同时提供了不少方法论层面上的技巧——形而下者是也。目的是希望能为大家从全局去把握编程提供一定的思路,不为细节所困。本书是一篇散文,形散神不散——以编程为神,以各章节为形;它同时又是一篇科普文章,读起来自然不难理解,甚至是轻松幽默的,不过也不要对这本书期望过高,Part I 是从一个初学者/非 CS 专业学生的角度去感悟计算机编程的,功力自然是比不过各路大神大牛。
23 |
24 | ## 为什么要整理并公开这个编程笔记
25 |
26 | 独乐乐不如众乐乐,并且公开之后还可以借助 Google 强大的网络搜索功能方便自己搜索该文档,何乐而不为~
27 |
28 | 正如许三多当初选择在五班修路一样,我们也抱着同样的信念选择为大家奉献这么一本小册子,虽然自身水平有限,但我还是非常愿意和大家一起分享成长路上所获得的点点滴滴...
29 |
30 | 大约是在2009年,也就是我当年大一的时候,对计算机各方面了解都不多,上了很久的「计算机文化」和C语言也没搞懂编程到底是在干啥,只是觉得编程是一件很神奇的事,就像是魔法一般,不过雾里看花终隔一层,始终也未能亲身体验它的乐趣。那时多希望有个诸葛能扶一扶我这个阿斗,即便不是卧龙,凤雏也行嘛!我想现在一定也有那么一小撮人抱着这种想法,我只想对你说:「该醒醒了!现在不是立波梦话板块!」**在任何关键时刻,能帮助你的人只有你自己,即便你能找到愿意帮助你的人,那也要你花心思去找不是么?**
31 |
32 | 作为一个曾经的新手,我深知从新手过渡到老鸟需要拨开天空的乌云,翻山越岭... 正如你们所看到的,书店和网络上充斥着无数的编程教材,同时可以肯定的是,目前已经面世的教材,穷一人一生之力是不可能看完的。在这些书中,有大量的垃圾书,海量的平庸之作,还有少量的精品,而即使是这少量的精品,也不可能看全。既然书这么多,我为什么还要抽时间再来整理一篇呢?拿本书蓝本创作者碧蓝右耳的话来说,他还能多画几张效果图挣俩钱花呢。
33 |
34 | 情况是这样的,市场上的书虽多,但其中几乎没有几本是面向初学者的。这样的书是如此之少,以至于要去购买或是阅读到它们都是很困难的事。他们要么是一下子告诉你所有的事,好像你能在千分之一秒中突然从菜鸟变成高手,要么就是认为有些事你早就应该知道,拿你当高手看,导致你有一种赤身裸体被抛弃于猛兽横行的非洲旷野的感觉。你还没有穿上衣服走出帐篷,连刀子都没有摸过,他们就试图告诉你草原上有多少可以捕获的猎物以及他们的位置,告诉你几百种武器和毒药的使用秘籍,告诉你两百条以上的陷阱安放要领。你没有经过丝毫的练习,甚至还没有杀死过一只刚出壳的小鸡,他们就要你独自去捕猎数十头饥饿的狮子。这种看似荒谬的情况从过去持续到今天,至今仍然存在。这并不是说那些写教材的朋友都是傻瓜,他们面向的读者是专业的程序员。专业的程序员就像是猎人,他们更换语言就像猎人更换武器一样,不管他使用哪一种武器,捕猎的基本原理没有变化,变化的只是武器的使用方法。对一个成熟的猎人而言,再强调基本原理就没有必要,所以教材编者们对地球人都知道的一些事也就避而不提。
35 |
36 | **一个成熟的猎人,他心中的捕猎知识是浑然一体的,武器的选择,野兽的习性,陷阱的安放,怎样做和为什么这样做都结合在一起,没有哪一部分可以独立出来。**一部分一部分的教给别人是极度困难的,要教就只能混杂在一起。编程的情况类似,它的知识体系是一个完整系统,谈到一个问题总会牵扯到另一个,只不过初学者平时遇到的问题太简单了,以至于没有感觉到一个完整知识体系的存在,学起来自然只能是云里雾里。
37 |
38 | 那么怎么写好一本面向新手的教材呢?个人认为除了介绍一些必要的基础和核心知识外,更重要的是知识背后的思维逻辑,功力欠佳的作者往往很难将其如庖丁解牛般解剖到深入浅出的程度。同时思维上的过程有时只可意会而不可言传,很少有人能很好地注意到思维过程的弥足珍贵。这两方面原因共同导致了好教材难以复制。
39 |
40 | ### 读者群
41 |
42 | 读完上边的那几段话你就应该能猜到本书的服务对象了。没错,就是为那些**毫无编程经验但对计算机感兴趣**的人准备的,甚至是**接触计算机不多**的人。这本笔记的目的也正在于此——**为新手介绍一些编程所必需的背景知识和有利的方法,以便于更好地去开启计算机编程这扇神奇的大门。** 如果你认为自己已有一定的编程经验,那你可以把你编程入门的这一段经历与大伙儿分享一下,完善一下这本书或者提 issue 等都是极好的 :)
43 |
44 | ## 约定、排版及其它
45 |
46 | 本书中所采用的语言和句法与正规书籍并不完全一样,中英文混排贯穿全文,有些例子只是为说明问题方便而假设,严谨性可能不够,偶尔还会耍点小聪明或是利用编程中常用的符号,例如用 && 代表和,|| 代表或者,更多的东西等着你们自己去挖掘。在这次改版中我尽量做到中英文分离,不必要的中英文混排其实对读者并不太友好。
47 |
48 | **尽信书则不如无书**——本笔记仅仅只是把各种资料收集之后再结合我的编程体验进行一次大的整合,但是水平毕竟有限,无法保证所有内容都是正确合理的,信口雌黄和胡说八道仅一步之差,部分评论我尽量保持中立态度。本文引用参考的地方会尽量标注出处以供进一步查阅,同时希望大家阅读的时候带着怀疑的态度。
49 |
50 | ### 鸣谢
51 |
52 |
53 | - Blue Auris
54 | - 中文昵称:碧蓝右耳,本笔记第一部分原材料创作者,前言中提到的 C/C++ FAQ 正是出自他之手,经他本人同意以公用创作许可协议重新发布,我只是做了大量的组织和整合。可以说,没有他的 C/C++ FAQ 就没有这个合辑,谨在此致以崇高的敬意!
55 |
56 | - Everyone
57 | - 本书的最终完善者,没有大家的努力与汗水就没有这个优质的笔记。
58 |
59 |
60 | ### License(许可证)
61 |
62 | 
63 |
64 | 如无特殊说明,本作品采用 [知识共享署名-相同方式共享 4.0 国际许可协议](http://creativecommons.org/licenses/by-sa/4.0/) 进行许可,**欢迎 fork 和传播本文档,但是请注意遵循以上许可协议。**
65 |
66 | ## Contribution - 如何贡献本文档
67 |
68 | 如果你发现本文档有任何可以改进之处,欢迎提交你的改进,具体形式有如下几种。
69 |
70 | 1. 成为本项目的 contributor, 发邮件并把你的 github 账户名告诉我就可以了,我收到邮件后把你的github账号加到 Collaborators 中。
71 | 2. 提交 Pull Request, fork本文档的github repo, 发PR给我就好了。
72 | 3. 在本文档的github repo处提交issue, 指出有问题的地方。
73 | 4. 在 website http://prog-notes.yuanbin.me 相应网页下的disqus评论框中添加评论,指出一些typo或者可以改进的地方。
74 |
75 | ### 文档格式及编辑工具 - GFM && kramdown Markdown
76 |
77 | 使用markdown编写,只使用 gitbook 支持的 markdown 语法。gitbook 底层的 markdown renderer 为改动的 kramdown,并增加了GFM支持, 支持的扩展 markdown 语法算是非常多了,具体特性详见 [GitbookIO/kramed](https://github.com/GitbookIO/kramed)
78 |
79 | 推荐的 markdown 编辑器为 gitbook 自家的 [GitbookIO/editor](https://github.com/GitbookIO/editor), 支持 Windows/Linux/MAC 三大平台,业界良心!但是实测在Arch Linux下可能会出现占用内存过高的情况... OS X 下目前表现还算良好,编辑界面如下图所示,最左边为章节预览,中间为 markdown 编辑框,右边为实时渲染页面,可选择使用全屏模式。
80 |
81 | 
82 |
83 | 使用其他如 Mou/Vim/Emacs/Sublime Text也不错,但是在新增Chapter/Section时就比较闹心了,嗯,你也可以新建 Section 后再使用其他编辑器编辑。
84 |
85 | 对 Gitbook 不熟的建议看看 [Gitbook Documentation](http://help.gitbook.com/),有助于了解 http://algorithm.yuanbin.me 网页上的文字及各章节等是如何编辑及渲染的。
86 |
87 | ### 章节名及编号
88 |
89 | 章节等文件名全部采用英文,子章节最多到三级,章节编号无需操心,这种琐事交给 Gitbook 去做就好,如果一定要手动调整,修改`SUMMARY.md`文件,注意其中的缩进关系,Gitbook就指望这个自动给章节编号了。
90 |
91 | 举个例子,我现在想新增「动态规划」及其子章节。首先在 Gitbook 顶部菜单栏「Book」中找到「Add Chapter」,填入「Dynamic Programming」。好了,在Gitbook左侧章节栏中就能看到新生成的「10. Dynamic Programming」了,左键击之,Gitbook 就会生成「dynamic_programming」目录及本章的说明文件「dynamic_programming/README.md」。如果想在「10. Dynamic Programming」下新增子章节,右键击之,「Add Section」即可,同上,子章节文件名仍然使用英文名,网页显示的标题可以通过 rename 更改再加入中文。
92 |
93 | 嗯,以上步骤均可直接新建文件夹及操作`SUMMARY.md`文件完成。
94 |
95 | ### 数学公式
96 |
97 | 其实代码里是用不着写数学公式的,但是偶尔分析算法可能会用着,用过 LaTeX 的都知道她生成的数学公式有多优雅,以至于不用她来写数学公式都有点不舒服...
98 |
99 | 这个文档里对于较复杂的数学公式建议使用 LaTeX, 因为托管在gitbook上,所以就用了轻量级的katex插件,没有用重量级的 MathJax。行内和行间公式都是 两个$, 区别在于行间公式写到下一行行首,而行内公式不能写在行首(废话...)。katex非常脆弱,对一些高级的 LaTeX 语法不支持,否则无法编译输出到网站和pdf,尽量用简单的 LaTeX 语法或者不用。
100 |
101 | ### 正文书写风格
102 |
103 | 1. 中英文混排贯穿全文,优雅美观起见,尽可能在英文单词前后加空格,这个使能输入法的中英文间加入空格功能就好了。
104 | 2. 代码的函数名或短代码建议使用 \`code\`
105 | 3. 使用空行进行分段,嗯,markdown通用
106 |
107 | 通过github合作时,添加/修改内容时给出能看懂的commit就好了。暂时就想到这么多,其实没那么多讲究啦,感觉看着清楚就好,其他想到的再补充。:-)
108 |
109 | ### 附件及图片引用
110 |
111 | 图片统一存放在`images`目录下,其他附件存放在`docs`目录下。引用图片链接一般可以通过``声明。
112 |
113 | 图片体积太大不利于页面加载,建议先压缩后再放入,如果是png图片可考虑使用 [TinyPNG – Compress PNG images while preserving transparency](https://tinypng.com/)
114 |
115 | 说了这么多,好像真的有人会协作一样... =_= #sigh
116 |
117 | ## To-Do
118 |
--------------------------------------------------------------------------------
/SUMMARY.md:
--------------------------------------------------------------------------------
1 | # Summary
2 |
3 | * [Introduction](README.md)
4 | * [Part I Introduction to Programming](part_i_introduction_to_programming/README.md)
5 | * [第一章-编程所谓何物](chapter1-what-is-programming/README.md)
6 | * [第二章-咋学编程](chapter2-how-to-learn-programming/README.md)
7 | * [第三章-编程进阶-数据结构与算法](chapter3-advanced-programming-part1/README.md)
8 | * [第四章-操作系统及项目开发杂谈](chapter4-advanced-programming-part2/README.md)
9 | * [控制台和图形用户界面](chapter4-advanced-programming-part2/cli-and-gui.md)
10 | * [工程和单个文件的关系](chapter4-advanced-programming-part2/projects.md)
11 | * [第五章-编程语言](chapter5-programming-languages/README.md)
12 | * [第六章-编程方法论杂谈](chapter6-useful-tools/README.md)
13 | * [好书哪里找](chapter6-useful-tools/improve-efficiency.md)
14 | * [高效使用搜索引擎](chapter6-useful-tools/search-engine.md)
15 | * [好习惯](chapter6-useful-tools/good-habits.md)
16 | * [文本编辑器](chapter6-useful-tools/text-editor.md)
17 | * [版本控制](chapter6-useful-tools/version-control.md)
18 | * [编程开发](chapter6-useful-tools/ide-vs-terminal.md)
19 | * [第七章-教材推荐及其它](chapter7-textbooks/README.md)
20 | * [数据结构与算法类](chapter7-textbooks/algo-data-struct.md)
21 | * [Operating System](chapter7-textbooks/operating_system.md)
22 | * [C](chapter7-textbooks/c-programming.md)
23 | * [C++](chapter7-textbooks/c-plusplus.md)
24 | * [Java](chapter7-textbooks/java.md)
25 | * [Python](chapter7-textbooks/python.md)
26 | * [Golang](chapter7-textbooks/go.md)
27 | * [Network](chapter7-textbooks/network.md)
28 | * [数据库](chapter7-textbooks/database.md)
29 | * [Web-前端](chapter7-textbooks/web-front-end.md)
30 | * [Web-后端](chapter7-textbooks/web-back-end.md)
31 | * [机器学习](chapter7-textbooks/machine-learning.md)
32 | * [Linux](chapter7-textbooks/linux.md)
33 | * [GUI](chapter7-textbooks/gui.md)
34 | * [Android开发](chapter7-textbooks/android.md)
35 | * [数据挖掘与分析](chapter7-textbooks/data-mining.md)
36 | * [Spark](chapter7-textbooks/spark.md)
37 | * [杂项](chapter7-textbooks/misc.md)
38 |
--------------------------------------------------------------------------------
/book.json:
--------------------------------------------------------------------------------
1 | {
2 | "plugins": [
3 | "disqus",
4 | "ga",
5 | "yahei",
6 | "katex",
7 | "richquotes"
8 | ],
9 | "pluginsConfig": {
10 | "disqus": {
11 | "shortName": "prog-notes"
12 | },
13 | "ga": {
14 | "token": "UA-32317667-6"
15 | }
16 | }
17 | }
--------------------------------------------------------------------------------
/chapter1-what-is-programming/README.md:
--------------------------------------------------------------------------------
1 | # 第一章-编程所谓何物
2 |
3 | 简单点来说,编程就是编制程序(呵呵,这不是废话么...)。程序是让计算机发挥功能的命令的集合,大体上有两种形式,让计算机真正执行的是电脉冲形式,叫机器码,譬如0101这种二进制数字。程序员编制的通常是文本形式,叫源代码。使用一个称为编译器/解释器的工具,可以把源代码转变为机器码。而编程就是产生那些源代码的工作。这个工作类似于谱曲、编菜谱、写工作手册。我们知道,谱曲和菜谱并不是一蹴而就的,往往需要反复的修改,直到最后满意为止,编程也是一样。
4 |
5 | ## 编程的对象——计算机
6 |
7 | 一般来说,如果你看到的这篇文章是电子版的话,你眼前的东西就是计算机,也就是俗称电脑的东西。这样的说法对普通用户来说是已经足够了,但是电气工程师认为一堆电路板、缆线、马达、和机壳的组合才算,联想的销售人员认为他们卖的那些方块才是计算机,而中央军委的人大概觉得银河V才能称得上。程序员的看法和他们并不完全相同,在程序员看来,只要能自动计算的东西,就是计算机。这个说法的重点在于自动和计算这两个词。广义的计算是指能对外界的某种输入做出反应,不一定就是数学运算。比如电梯就可以对按键做出反应,所以它也是能计算的。自动是说计算是通过自身的运作来完成的,不需外界干预。
8 |
9 | 在有电的时候,电梯就可以自动运行,这样看来电梯也是计算机。算盘虽然能计算,但不是自动完成的,不过如果把打算盘的人一起算上,那就是不错的计算机了。使用指纹或虹模的智能锁、秦始皇陵里的机关和自动钢琴似乎也都是一种计算机,情况确实是这样,计算无处不在,计算机也无处不在。甚至可以把我们的世界看作一台巨大的计算机,然后就觉得我们是生活在Matrix里,这是一个很有意思的哲学问题,有兴趣就去看看黑客帝国三部曲吧。通常在实际编程中,程序员只考虑现代数字电子计算机,也就是使用电能为动力,在运算时以电子电路和逻辑代数为基础的计算机。他们用途广泛,种类也是极其繁多,手机、PC、服务器是比较常见的样子,电梯、收银台、智能门禁则是各种隐藏的版本。虽然设备的外在形式千变万化,但现代电子计算机的基本原理和体系结构并没有太大的变化。
10 |
11 | ### 为什么要使用二进制
12 |
13 | 从计算机导论课程(或其他相关课程)我们知道在计算机底层是用二进制来表示各种信息的,有些人肯定会问计算机底层为什么不用咱们熟悉的十进制来进行各种运算?这样不是更接近人类的思考习惯么?这种想法还是不错的,你看咱们人类多聪明,让计算机使用十进制它是不是同样会变得很聪明呢?很遗憾的告诉你,不会,至少目前不会,那样只会拖累它,想想地球上有一半人改用火星文进行沟通,会出现什么情况?计算机的全称为电子计算机,既然是基于电子组成的,它就得遵循电子世界的规矩。
14 |
15 | 在数字电路中一般用0表示低电平,1表示为高电平。电平是个逻辑量(就是聪明的人类根据自己的思维逻辑定义的一种东西),只有逻辑高、逻辑低两种值,但逻辑的高低是用电压的大小来表示的。譬如与电源负极的电压差值很小的某一点可以表示为逻辑低电平——0,电压差值很大的那一点则可以表示为逻辑高电平——1。在目前的电路结构中,判断逻辑高、低电平两种状态是很容易做到的,而要判断多于两种状态则比较麻烦。
16 |
17 | ## 为什么需要编程
18 |
19 | 编程这件事存在,完全是迫不得已,人类发明了计算机,想让它做事,仅此而已。但机器有三大特点,使得如果要让机器做事,完全不像吩咐人那么简单。
20 |
21 | ### 第一个特点就是机器很傻
22 |
23 | 很多人希望自己像计算机一样聪明,真要是那样你就完了,赶紧卷好被子回家吧,不过待在竹园实验室也许是个不错的选择,至少还有你的难兄难弟陪着你——值班桌上那台破破烂烂的电脑。For example, 从三个数里选出最大最小值,人类可以一眼就看出,但机器只能先从两个里找出最大的,再把这个最大的和第三个比较,然后再这样重复一遍找出最小值。如果是七个八个数,机器也是这样反复操作,O(∩\_∩)O\~是不是想到了冒泡排序?这就类似工地上搬砖,人类的做法一次搬很多很多砖,用推车或者别的运输工具把砖码得高高的然后运到目的地,但计算机的做法是每趟只搬一块砖,你没看错,每趟一块,一块只需998!998,抱回家! =\_= 那为什么计算机这么厉害呢?
24 |
25 | ### 它的第二个特点,快而不乱
26 |
27 | 机器可以不知疲倦地用同一方法,重复重复再重复地做某件事,而且每次重复都相当的快。这一点是人类做不到的,让一个人搬一堆砖,也许没什么问题,但是一车砖就会让人疲惫不堪,如果有一火车皮的砖,想必大多数人想都不想就放弃了,即使有坚持去做的人,他的动作质量也只会越来越差。但机器不同,他搬砖不是每趟一块么,但他每趟来回的时间很短,比如少于0.00...001秒,不管砖头有多少,十万块也好,十亿块也罢,按同一方法处理,既没有差别也不会厌烦,直到全部处理完。真是不怕苦、不怕脏、不怕累,新时代的劳动模范呀!所以从总体来比较结果,机器就比人强了。还是以选最大最小数为例,人可以用肉眼检视三四个数,但超过100个数就要用其它的方法。对机器来说,三个和三万个数只是重复次数的差别,单调快速的重复,这就是机器的诀窍。想想金庸笔下的绝招都是啥?——把最简单的招数练到极致,那就是绝招呀!!!
28 |
29 | ### 更重要的一点,机器和我们言语不通
30 |
31 | 就是说,我们不可能一抬手一挑眉毛就吩咐它做事。不要和我抬杠说你可以用鼠标画圈让机器做事,也可以声控,那都已经不是纯粹的机器了。机器和我们处在不同的感知空间,所以它不能理解我们的言语。我们要命令它,必须用它能够理解的形式。从根本上来说,就是电脉冲——也就是节 [为什么要使用二进制](#why-binary) 所说的数字信号「0」和「1」。
32 |
33 | 基于以上这三个特点,要让机器做事情,就必须让把我们的要求转化成最简单适于重复的命令集合,而且是电脉冲形式。比如我们要让机器在屏幕上显示一幅图,首先我们要把这幅图分解成很多很多的小方格,也就是所谓像素,每个像素只有一个颜色,每个颜色都用一个很长的数字表示,然后所有这些数字转化成内存里的电平信号,再用另外的电路信号来一个个的把这些电平送到显像电路。所有这些电平和信号的集合就是程序,而编程,就是制造这些程序的工作。
34 |
35 | 也许有一天,我们不再需要编程序,程序员这个职业也将不复存在。不过我想如果那天到来,那就是机器已经能完全理解人类的语言和思想的时代了。在肉眼所及的范围里,似乎还看不到哩 :)
36 |
37 | ## 为什么要学编程
38 |
39 | 这个问题有两层意思。首先是编程为啥要学,很简单,因为这玩意不是生来就会,就像木匠活一样属于一门手艺,自然要通过学习才能掌握。你怎么也得花上几年来学英语不是么?第二层涵义才是重点,为啥我要学它?答案自然是因人而异:
40 |
41 | 1. 能提升和挑战自己的智力
42 | 3. 非常有趣儿
43 | 4. 编程是一门艺术
44 | 5. 造物主一般的感觉
45 |
46 | 以上几种都属于自虐一族... 再来看看以下几种
47 |
48 | 1. 学校的必修课程...
49 | 2. 可以赚好多好多钱
50 | 2. 一种莫名的优越感
51 | 3. 等等等等...
52 |
53 | 在我眼中,学习编程的意义更多的在于可以利用现代计算机技术来推动本专业和社会的发展,通过计算机(这里泛指广义的计算机)这个平台可以相对便利地实现自己的想法,说白了它就是一个很好的工具——「造物主一般的感觉」。对于非计算机专业的学生来说,了解一点编程的基础知识也是十分有利的——可以自己亲手实现那些天马行空的想法。现代的高级语言如 Python 玩起来就异常地爽,各种第三方库数都数不清。
54 |
55 | ## 编程到底是个什么玩意儿
56 |
57 | 计算机本身什么也做不了,必须依靠程序来指挥他做事。程序就是操作流程的顺序,或者说是顺序排列的多个操作过程,它是方法的描述,同时又往往包含着《孙子兵法》中**分而治之&&各个击破**的思想。
58 |
59 | Long long ago, 有一个叫张三的人,是一个木匠,老本行是做家具的。一次李四让他帮做张摇椅,于是乎张三先把原木分割成木条木板,再把木条木板弯曲到指定的形状,然后把他们放置到适当的位置,接着设法固定他们,最后雕花抛光和上漆,一张漂亮的摇椅就做好了。这整个的流程如果记录下来,就是一个程序。
60 |
61 | 任何程序都有三个要素,执行者、操作对象(也称为资源)和操作方法(指令)。在做摇椅的这个程序里,张三就是执行者,木头就是他所对付的资源,在指令的持续作用下,木头(资源)的状态(如形状大小、颜色位置等)不断发生变化,最后,在程序结束时,木头变成了漂亮的摇椅。
62 |
63 | 电脑程序和上面一样,是方法的描述。只是这些程序的执行者不再是人,而是CPU,命令也变成了CPU的指令,而资源则是CPU可以改变其状态的东西,通常是内存,当然端口、硬盘等也是,不过一般的应用程序都只使用内存就可以完成工作。有的时候会听到别人说:「我的电脑内存是500G的,怎么玩起DOTA来还是很卡呢?」如果这种事情真的发生在你的电脑上,那我只能说:「恭喜你的电脑成功完成穿越,该电脑的准确生产年代不是史前,那应该就是在2014年之后。」一般来说个人电脑内存不超过8G,硬盘500G倒是比较普遍了。CPU并不直接从硬盘读取数据,而是通过内存间接获取。
64 |
65 | 有一点要注意,CPU其实并不知道自己在做什么,是程序在指挥CPU的运作。这一点比较难理解,让我们来看看算盘是如何完成计算的。
66 |
67 | 
68 |
69 | 要使用算盘,只需要一件东西:口诀。记熟口诀(当然还有它对应的操作),就可以用算盘计算。在这个用算盘计算的过程里,口诀就是程序,指导着计算过程。算盘自身并不知道自己在计算,他只产生了物理上的一些变化(算珠位置的变化),做珠算的人同样也不需要知道,他只需要按照口诀调整算珠的位置。当程序结束的时候,算珠必定会处在某个位置上,这个位置的状态可以按照某种约定被读出,被读成某个数值,比如下面4个算珠全都在中档而上面的珠子没有落下的状态就是4。
70 |
71 | 操作和储存状态的设备并不需要知道状态是怎么转换成信息的,转换由阅读者来完成。举个不是非常准确的例子,显示器在显示图像的时候,在显示屏上总是按照如下的规则进行:
72 |
73 | ```
74 | 坐标(1,1)黑色、(1,2)白色、(1,3)白色、(1,4)白色、(1,5)白色、(1,6)白色、(1,7)白色、(1,8)白色、(1,9)白色、(1,10)黑色...
75 |
76 | 坐标(2,1)黑色、(2,2)黑色、(2,3)黑色、(2,4)白色、(2,5)白色、(2,6)白色、(2,7)白色、(2,8)白色、(2,9)白色、(2,10)黑色...
77 | ```
78 |
79 | 虽然显示器只是在适当的坐标显示黑色或是白色,但我们却在显示器上看到了文字、图片和动画,你不会认为显示器知道这些是鸟山明的漫画吧?如果你能造出这样的显示器,那真是太有才了!
80 |
81 | 计算机也是一样。比如计算圆周率的程序,CPU只是不断地对某一块内存进行操作,当程序结束的时候,这块内存恰好处在某种特殊的状态。而按照事先的约定,这个状态在被读出来的时候,它正好和圆周率相同,于是我们可以说,算出了圆周率。其实CPU只是在那里象手指头一样拨动内存的算珠而已。这种算珠极其简单,他只有两个位置,0和1,拨动它也很方便,电流就可以,但这种算珠实在太多,使得他们能组合起来表示很复杂的信息,就像只有黑白两色的屏幕点当数量足够多的时候,就可以用来表现有趣的漫画。
82 |
83 | 所以程序代表人期望电脑能做的事(注意不是电脑要做的事,这一直混淆着许多人),当人需要做这些事时,人提供指令,再给出某些资源以期电脑能对其做正确的改变。程序只是方法的描述,本身是不能发生任何效用的,直到它被执行,人为给定它一块内存,告诉它计算结果的精度及计算结果的存放位置后,他通过控制CPU才改变人为给定的这块内存的状态以表现出计算结果。
84 |
85 | 通常,我们把计算机的物理实体部分称为硬件,包括电路板、机箱、键盘鼠标等,而把不可见的非实体部分称为软件,软件大体就是程序和主要由程序产生的数据。广义的说,乐谱、菜谱、工作手册、仪器的操作说明也是某种程序,我们不妨称之为类程序。
86 |
87 | ### 编程语言又是怎么回事
88 |
89 | 如果以上所说的就是编程,那编程语言(比如C语言)又是怎么一回事?
90 |
91 | 菜谱、仪器的操作说明可以用法语来写、也可以用中文来写,不影响实质效果。因为人类生存在同一个四维物理时空中,具有相同或类似的感知。虽然人类的语言五花八门,但都可以通过翻译得到正解。
92 |
93 | 仪器操作说明、一般的菜谱,所描述的都是人类世界的事物,人类可以理解,因此它们可以用人类的语言来描述。但计算机程序显然与菜谱有不同,他是指挥计算机用的。首先CPU所能感受到的物理空间和与人类的感受严重不同,很多概念根本无法传达,其次没有大脑的计算机并不懂得人类的语言,何况人类的语言并不那么完美,很多事不能精确的描述,所以人类的语言不论英语还是中文都不能胜任这个任务。这个情况和音乐有点类似,解决方案是发明一种人造语言专门用于这个领域。比如五线谱就是一种专门的供音乐使用的人造语言(数字简谱也是,由于它与中国的工尺谱相当接近,所以在中国得到了最大程度的发扬光大,有点地方话的味道)。于是就有一些专门的纯粹用于计算机的语言被创造出来。
94 |
95 | 其中最早的一种基于电路原理,直接用0和1来表示电路的开关通断,不断的拨动开关,就形成了程序。这种语言就是机器语言,它可以直接被计算机听懂,但遗憾的是,人类虽然可以看懂这种语言,但它不符合我们通常的交流习惯,很难被人所阅读,更不要谈设计和修改了。
96 |
97 | 人类的智慧总是无穷的,后来人们提出这样一个方案,我们可以先按某种方法和规则,生成一个我们能看懂的指令序列(就是源代码),再通过某个转化的工具(就是编译器),把它变成机器可以运行的指令(也就是可执行程序)。这个我们能看懂的指令序列的规则的总和(也就是词汇和语法[[1]](#ref1)),就是我们通常说的计算机语言。为了和机器语言相区别,被称为高级语言。
98 |
99 | 章节开始所说文本形式的源代码其实是有些规定的,就像我们和老美用英语交流。首先你得说英文单词,不能冒法语词汇日文假名出来,其次你得按语法讲话,不能一个个单词往外蹦。程序也同样有词汇和语法上的一些规定,这些规定就构成一门语言。显然任何一门编程语言都是人造语言,既然是人造的东西,因发明人的想法而不同,就形成了不同的语言。当然,编程语言的区分远不止以上所说的词汇和语法上的不同,还有其运行机制也不完全一样。
100 |
101 | 常见的编程语言有很多种,静态语言如 C & C++ & JAVA, 前三种语言近几年几乎一直占据着TIOBE编程语言排行榜的前三甲,其他著名语言有Python, Ruby, Perl和Golang等。他们各有所长,在不同的领域发挥着各自的作用。但由于计算机的体系结构大致相同,这些语言也大同小异,具有共通之处。这情况很好理解,通常真实世界的拳法看起来都有点相似,只有漫画这类幻想作品里才会有手脚飞出或者口吐火焰眼下喷水这种怪异的事情发生。
102 |
103 | ### 编译器所谓何物
104 |
105 | 前边不少地方提到编译器,那是什么东东?——代码翻译机,前面的章节中或多或少地解释了这个东西。不过这里不介意再解释一次,是的,前文中提到过,程序其实是电脉冲形式的指令的集合——对机器这是绝对正确的。但你认为人类可以直接操作电脉冲么?——当然不能。所以最早的时候,程序员们是通过反复的拨动开关或者插拔插头来做这件事的,就像老电影里的电话接线员和发报员。下图为给ENIAC写程序的两只程序媛。
106 |
107 | 
108 |
109 | 后来技术进化了,人们可以把脉冲信号设置在打了孔的纸带上,然后让纸带穿过有灯管的感应器,有孔电路就通,没有就是断,由纸带机实现了在电脉冲和纸带之间转换。老电影里的工程师们经常拿起一条长长的纸带来阅读——真是高深莫测啊!不过即使这样,要理解程序还是很困难,更别说阅读编写和修改了,人毕竟不是机器。下图为80列、矩形孔的标准的IBM打孔卡片,相当于存储器。
110 |
111 | 
112 |
113 | 其实人们最习惯用来表达思想的方法是文字,于是人们设想能否直接写出文字形式的程序。通过不懈的工作,这个目标实现了。今天人们可以写出文本形式的称为源代码的程序,然后再利用特定的工具把代码转换成机器能理解的电脉冲形式,也就是目标程序。这种转换工具就叫做编译器,作用相当于翻译,以前是纯粹的机电设备,到了现代它也成了程序的一种。
114 |
115 | 从某种角度来说,其实没有任何人能被称为程序员,编译器才是真正的程序制造者。人所制造的只是源代码,从这个角度往下想的话,其实是程序在制造程序,换言之,程序在借助人类之手自我进化。还记得前边说过的Matrix么?
116 |
117 | 在这里顺便讲解下编译和解释的差别。编译器的工作本质上类同于翻译,而我们知道其实翻译有口译和笔译两种工作模式。程序员写完所有的源代码,由编译器一次性转为可执行文件留待以后执行,这种类似笔译的模式我们称为编译。程序员每次输入一行或数行代码,编译器马上把他转换并执行,接着等待程序员的后续输入,这种类似即时口译的方式就称为解释,此时编译器就被叫作解释器。C/C++ & Pascal等语言是编译型的,Perl & Python等语言就是解释型的,Java语言很特殊,他先编译成一种中间代码,然后在不同的机器上边解释边执行,这样就能实现跨平台运行,称为半编译模式,微软的.NET也是这种机理。现代的新型解释性语言很多都是半编译的——兼顾了运行效率和跨平台性。一般来说,编译型要比解释型的运行效率高些——因为不需要等待程序员的输入,也便于系统优化。但解释型在编程的时候容易排错,界面友好,而且通常程序编写比较方便,比如Python。但不管用哪种语言编程,你总需要一个编译/解释器。
118 |
119 | 现代的编译器,往往不止是编译器,它还会包含有着色和搜索等功能的代码编辑器,支持单步调试并行调试的调试器,能够读入文件的多个版本并进行比较分析的版本控制,编辑图标等的资源编辑器,在大型项目中用于统一协调的项目管理,和用于自动化代码生成的向导工具等等。这样的编译器,我们就称它为集成开发环境(IDE:Integrated development environment ),代表就是[开放源代码](http://zh.wikipedia.org/wiki/%E5%BC%80%E6%94%BE%E6%BA%90%E4%BB%A3%E7%A0%81)的[Eclipse](http://zh.wikipedia.org/wiki/Eclipse)和稍微有点软那个公司的[Visual Studio](http://zh.wikipedia.org/wiki/Visual_Studio)系列。
120 |
121 | ### Notes
122 |
123 | [1] 关于语言词汇和语法上的详细说明可参考[程序的基本概念-自然语言和形式语言](http://songjinshan.com/akabook/zh/intro.html#intro-naturalformallang)
124 |
--------------------------------------------------------------------------------
/chapter2-how-to-learn-programming/README.md:
--------------------------------------------------------------------------------
1 | # 第二章-咋学编程
2 |
3 | 前边说了那么多编程的基本概念,那我怎么开始学习呢?
4 |
5 | ## 听说编程很难,那我能学会吗
6 |
7 | 你觉得说中文难么?汉语是世界上最难学习掌握的语言之一,但你不是每天都能流利地用普通话和别人聊天么?任何一种计算机语言的难度都不会超过英语,更比不上汉语,编程这件事的难度基本上等价于指挥IQ<20的壮汉。那么你认为你能不能学会编程呢?
8 |
9 | 请记住学会和学好是两个层次,就像中学生作文和报刊出版物之间的差距。达到学会那个程度,只要有小学三年级的知识基础就可以开始了,也就是识字就行。而如果要学好,那需要初高中毕业的文化水准,也就是应该略懂英文和解析几何。当然还有更高的技术层次,比如在相当于职业作家的水平上,你将被称为专业程序员。而如果你被称为大师,那就是诺贝尔文学奖,当然,抵达那个程度需要付出艰苦的努力。
10 |
11 | ### 我的英语很差,怎么办
12 |
13 | 无法回避的事实,当今世界中的信息技术,绝大部分是欧美人的发明,更准确地说,是美国人的功劳。顺理成章的,各种资料文档技术手册,尤其是记载最新技术的, 都是用美国通用语也就是英语撰写的。可能在其它领域不懂英语没有什么大的问题,但在IT行业,不懂英语就是无法掌握最先进的技术,基本等于没有出头之日。不懂?——不懂就去查呗。
14 |
15 | 不过话说回来,不是说你一定要有个托福雅思的高分才能去学编程的。由于历史原因,大部分计算机语言借用了部分英语的词汇作为基本词汇,但绝不是说必须先学英语才能学习编程。就编程本身而言,它所需要的英语水平不过是死记硬背好几个单词而已。你在看好莱坞大片时,一部片子下来总能记住主角和主要配角的名字吧,C语言全部关键字一共32个,而其中有6到7个的使用率超过78%,这样你还有什么可担心的。但是,要想成为高手,阅读大量的相关资料是免不了的,这个时候,英语就显出它的重要性了。能使用英文原版的软件就尽量不要用中文汉化版,能读经典的原版英文教材就尽量不要读翻译过来的中文版。在这里不是崇洋媚外,而是使用汉化版的软件极易引起各种不可预料的问题,国人翻译过来的教材或多或少有失原味,下边来一段小插曲:
16 |
17 | > 如果只因为那几个屈指可数的英文单词而放弃学习编程,我只能说这样的人趁早离开为好。顺便提一句,本文作者(这里指BlueAuris)一向认为那个叫易语言的中文编程语言是个不折不扣的笑话。理由很简单,其他流行的语言都有自己的独到之处,就像武当剑少林拳打狗棒一样在江湖上占有一席之地,而这个语言除了有几个中文标识符之外,一无所长。而这几个中文标识符也不过是使用了文本替换的方式把C语言的几个特定词汇换成了意思相对应的中文而已,任何一个文本编辑器都可以做到这一点。形象的表现一下,这就是有个猥琐的家伙特地身穿全套阿拉伯长袍练了整路正宗少林长拳然后大声叫嚷这就是他发明的具有民族特色的中东石油大亨拳。
18 |
19 | ## 我能学好编程吗
20 |
21 | 如果你已经看完前面的部分到达这里,显然你是确实想要学习编程的新手。不论你是为了什么目的来学习,在看了上面的话之后是不是很有信心呢?不过我要打击你一下,不是谁都学得好编程的。人人学开车,但不是谁都能上赛道,舒马赫更是只有那么一个。就像有些惊险刺激的游乐设施禁止高血压心脏病患者参与一样,编程作为一项耗费智力和体力的活动,对参与者也有一定的要求。先来看看吧,满足以下这些条件,你就可以放心大胆的开始了。:-)
22 |
23 | 先说体质要求。太祖说:身体是革命的本钱。健康的身体对编程大有益处,但并不是说残疾人就不能参与。就目前的技术水平,除了脑瘫和目盲这两项,其他的肢体残缺根本不妨碍。Stephen William Hawking在这样严重的情况下还能持续研究的事实,还不够激励你么。(^o^)
24 |
25 | 紧随其后的是足够的精力和时间。亲爱的小伙伴,只要你能静坐半小时安静的看完这本小册子,你的体能就达标了。如果你想告诉我,你能够一天在电脑前连续操作18小时以上,我要说的是,小伙伴,虽然你很犀利,但请注意保护好身体和眼睛。只要每天你能抽出30分钟来学习编程,那你的时间也合格了,当然有更多时间确实会更好,不过也没必要每天12小时。编程并不是世界上最重要的事,我们还有别的事要做。必须认识到,学习编程重要的是持之以恒,而不是依靠爆发力,每天半小时比一周一次6小时效果好的多。
26 |
27 | 第三个要求是你要略微懂一点计算机。不错,只要略懂就可以了。因为这正是本文的主要目的之一:向略懂计算机的人介绍编程。那么,怎么才算略懂呢?能浏览网页和用文本编辑器输入代码并且把键盘上的26个字母和十个数字挨个输入一遍就OK了!
28 |
29 | 最后一点,你需要有顽强的毅力。编程并不像你想象的那样轻松,不是野餐和聚会。尤其是对于职业程序员都应掌握的C++,它可以用两句话来形容:三年不开张,开张吃三年。千万记住,C++被称为是真正的程序员使用的语言不是没有理由的,它的复杂度和性能超出你的想象。有无数的编程新手在第一个月不到就放弃了,你最好确定你不是他们中的一员。毅力没有尺子可以来度量,在这里我只能先祝愿各位都能坚持到最后。Good luck~
30 |
31 | ### 一定要有一台计算机吗
32 |
33 | 到目前为止,是的。在老年时期,Beethoven可以凭空作曲而不依靠钢琴之类的东西,但几乎没有哪个程序员不依靠电脑而只在大脑里编写,尤其是开始学习的阶段。但这也不意味着只能在电脑上才能编程。在电脑还属于稀有电子产品的那个年代,哪有那么多人能非常方便的在电脑上编程呢?但最后不同样也诞生了不少优秀程序员么?那他们是怎样编程的呢?——纸、笔和大脑。当然,能有一台电脑显然更好。
34 |
35 | 用各种语言所编写的程序被运行在各种各样的机器和设备上,从掌上设备到巨型服务器,从台式电脑到微波炉,所有能够自动运行的地方都有程序的身影。但是很遗憾,并不是只要能够运行的设备就可以用来进行编程的,这就像虽然可能洗衣机也能发出悦耳的声音,但你不能指望用洗衣机来录制流行歌曲(额...也许SONY有这样的产品,我保留意见)。
36 |
37 | 目前大部分语言,所需要的电脑并不如你想象的那样高级。当然作为学习,我们还是需要有比较称手的设备。不错,最重要的就是称手两个字,所谓称手,就是不会由于设备的问题,妨碍你的思考,不需要高速的处理器,也不需要巨大的显示器,更不需要海量的硬盘,只要称手。当然,如果你是游戏或者影音发烧友,那你可以当我说的是废话。编程不是豪华海上旅游,而是修行。修行不需要五星级宾馆,但也要有破屋以遮风雨,否则感冒发烧了,怎么来修行呢?
38 |
39 | ## 编程第一步
40 |
41 | 首先确保你的健康状况和基本计算机操作水平(不会?不会就去学,健康状况不好?这个我只能建议你多锻炼身体)。
42 |
43 | 编程这件事上,没人可以无师自通,天才也不行。所以你要做的第一件事是找一本好的入门教材,最好是经典作品(后边会集中介绍)。反复地看教材,要牢记一点,你所提出的大部分问题,教材上都有解释,只是你没有认真看而已。反复地阅读,直到你觉得你已经可以编写出那本教材了,才可以丢弃它。教材比老师好的理由之一是,你可以带教材上厕所去卧室,而老师不行。当然,老师也有比教材优越的地方,那就是他可以给你解释教材上没有的问题。但记住老师也是人,你不动脑子就去找他,他会厌烦的。不要鄙视你的老师,即使他其他方面不如你,但至少在编程这件事上他能做你的老师就是他比你强的硬道理。尊师重道是中华民族的传统美德,O(∩\_∩)O 哈哈~
44 |
45 | 你以为光看语法书和背诵单词而不练嘴就能说好英语么?显然不对。编程也是,熟能生巧在任何地方都是一样的。首先看懂教材上的那些例子,确保看懂之后,按着他的思路把它默写出来,当你尝试过就会知道看懂和默写是两个完全不同的程度。然后就可以做书后面的习题,独立想,想好之后最好是能在电脑上敲一遍,不到万不得已不要看答案或提示。等到整本书后面的习题你都能做对的时候,你就算入门了。如果你的目的仅仅只是为了考试拿高分,现在就可以去睡大觉了,但如果想要用编程来解决一些实际问题,对不起,你还欠火候。这其中的差别就相当于大学英语四级作文和畅销英文小说之间的差异。
46 |
47 | 会做书后边的习题只是编程的第一步而已,你掌握了大量的单词和熟悉语法并不能让你写出优美的英语小说。你得学习修辞手法和谋篇布局这类文学技巧,还得掌握历史典故、谚语俗话以及文化背景这些文字外的东西。如果要畅销,还需要超凡的主题、生动的故事和跌宕的情节。编程圈子里正好有和这些类似的玩意儿,这些都留到下一章细说。
48 |
49 | ## 问题向谁问
50 |
51 | 还记得郑钧的《路漫漫》歌词中有:
52 |
53 | > 记住没人会同情你 我亲爱的兄弟
54 |
55 | > 你最好鼓起勇气才能活下去
56 |
57 | > 因为路漫漫 其修远 我们要上下而战斗
58 |
59 | ### 编译器/解释器-案发现场
60 |
61 | 编程这件事,基本上是不能指望有人帮你的,因为你很可能问了别人半天后才发现你们俩说的根本就不是一个东西。当你编程遇到问题,首先应该是去看编译器提供的信息,它可是最直接的来源,相当于案发现场,很少有刑警不看尸检报告就直接破案的(当然,对于柯南这种我保持沉默)。
62 |
63 | 现代的编译器已经不止编译那么简单,编译本身就能送出大量的提示,调试功能更是强大到可以让你检视程序运行的每一步都发生了什么变化,只要你能看懂。机器的问题,就应该用机器来解决,而不是用人的肉眼去检查(在你还没练就火眼金睛前)。不过也不要过分依赖编译器,尤其是初学编程的时候,有错误时先在纸上用大脑跑一跑程序,实在搞不定了再单步跟踪,多试几次你的编程能力自然会有很大的提高。
64 |
65 | ### 教材和文档-手边的工具
66 |
67 | 手边的教材和文档能解决70%以上的问题,[Linux](http://zh.wikipedia.org/wiki/Linux)下的 manual 就非常好,一些IDE的help文档也不错。如果还不够,上网去查。如果找不到,请记住有个东西叫搜索引擎。
68 |
69 | ### 搜索引擎-第二大脑
70 |
71 | 在如今的知识爆炸时代,海量的信息被存放在互联网上,那么如何从这些海量的信息中筛选出自己需要的信息呐?——答曰搜索引擎。首推 [Google](https://www.google.com),使用得当的话,绝大多数问题可以得到解决。搜索引擎适合解决一个点的问题,而接下来要推荐的 [Wikipedia](http://zh.wikipedia.org) 则比较适合解决一个面的问题,维基百科页面的下方往往会有相应主题的一些链接和同一类别的其他主题介绍。后边就搜索引擎的高效使用再做详细介绍,这里先知道有搜索引擎这么个东西就够了。
72 |
73 | ### 向他人求助
74 |
75 | 如果以上三种方式都没能解决你的问题,确认你已经努力过而没有答案,那么接下来可以向老师、同学请教或者在邮件列表上提问。在你确定要提问之前,请先把 [How To Ask Questions the Smart Way](http://linuxmafia.com/faq/Essays/smart-questions.html) [[1]](#ref1) [[2]](#ref2) [[3]](#ref3) 好好读一读。解决完一个问题后可以记录在自己的博客或者wiki上,独乐乐不如众乐乐。:)
76 |
77 | ### Notes
78 |
79 | 1. [1] 大家网论坛上有一份整理不错的 [中文翻译](http://club.topsage.com/thread-220478-1-1.html)
80 | 2. [2] [Zoom.Quiet](http://zoomquiet.org/) 制作的 [提问的智慧中文版-思维导图](../images/questions4mind.png)
81 | 3. [3] [啄木鸟社区整理地比较好的一份提问及答题指南](http://wiki.woodpecker.org.cn/moin/AskForHelp)
82 |
--------------------------------------------------------------------------------
/chapter3-advanced-programming-part1/README.md:
--------------------------------------------------------------------------------
1 | # 第三章-编程进阶-数据结构与算法
2 |
3 | 首先让我们看看Wikipedia上对数据结构和算法的定义。
4 |
5 | > 数据结构(Data Structure)是计算机中存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来最优效率的算法。
6 |
7 | > 算法(Algorithm)是指完成一个任务所需要的具体步骤和方法。也就是说给定初始状态或输入数据,能够得出所要求或期望的终止状态或输出数据。
8 |
9 | 算法和数据结构就是程序里的修辞手法和谋篇布局。人类编程虽然不过几十年,但运用程序所解决的问题,已经覆盖世界的每个角落各个方面。各种各样的问题,被前辈和大师提炼归纳,有些人直接找出了解决的方法,有些人找到了寻找解决方法的途径,还有些人索性证明了在现阶段是不可能解决的,这些解决方案就被统称为算法。学习算法就是学习前人的智慧,少走弯路。禅语有云:不走弯路就是捷径!!!连牛顿爵士都是站在巨人的肩膀上的,除非你自我感觉比老牛还牛,凭空就能解决别人十几年才想清楚的问题。为了更形象的说明这一关系,下面我们来玩一个经典的数学游戏:
10 |
11 | > 有三个瓶子,容量分别为两升、三升、七升,现在要快速准确量出六升的水,请问该怎样得到?
12 |
13 | 显然我们必须用这三个瓶子组合起来才能得到准确的六升水,那如何得到呢?我想聪明的你肯定很快就有了答案。接下来的问题就是怎么用算法表示出来呢?——这就是在考验我们的数学思维能力了。瓶子装水这一类问题抽象出来其实就是一个求整系数多项式方程整数解的问题。OK,点到为止。
14 |
15 | 按照Wikipedia上对数据结构的定义,我们可以把上边装水的瓶子类比为数据结构——瓶子在人的干预下干了装水和倒水的工作,通过三个步骤——你的算法,最终实现了在七升的瓶子中装了六升的水。通过三个瓶子才能得到六升水,这种事肯定不是聪明的人想出来的,那么聪明一点的人会怎么想呢?——找一个六升的瓶子不就一步完成了嘛!所以说有时找到了合适的数据结构该是多重要...
16 |
17 | 前辈们已经总结出很多算法和产生算法的方法,我们可以直接学习。如果你积极进取,总有一天,你会发现有需要自己开创新的算法的时候。这个时候,数学功底会帮你很大的忙。也许只是数学工具在起作用,但更有可能的是你的大脑受过的数学思想训练在帮助你。总之,为了前途着想,提高数学素养是没错的。这不是说多背数学公式和多做数学题,而是指一种**数学的思维方式。**
18 |
19 | 学算法很简单,也是找教材,做习题。教材容易找,但新手往往找不到合适的习题。可以尝试在完成教材上的所有习题之后去找编程竞赛的练习题来做,也就是所谓的 [Online Judge](http://en.wikipedia.org/wiki/Online_judge),后续将深入讨论这个东西。
20 |
21 | ## 算法+数据结构=程序
22 |
23 | > *Algorithms + Data Structures = Programs* is a 1976 book written by Niklaus Wirth covering some of the fundamental topics of computer programming, particularly that algorithms and data structures are inherently related.
24 |
25 | 算法与数据结构的基本概念已经在上文介绍过了,这里再稍微深入一步探讨,对于新手来说不必在本小节纠结过多,本节的存在一方面是为了本章的完整性而充实的,另一方面可供有一定基础的人参考。
26 |
27 | 实际上,数据结构与算法解决的问题是整个编程中最有限,最底层的那些问题,(它没有涉及到设计,用户等编程三层架构中的最重要的后二层)。它只解决对于计算机在组织内存,支持对这些内存中数据进行操作(排序,查找)等有限问题的问题,它仅仅能很好地解决这些问题,所以说它是面向计算机的功能性方案,是计算机的科学,解决对于计算机来说最为迫切要解决的那些问题,比如效益敏感类问题。如果放在整个大编程中来讨论,那么它是颇为有限的那类东西。
28 |
29 | 承载计算机科学最最根本的东西,是数据结构跟算法,而不是语言(语言只是表达工具)。难怪宏大的 [TAOCP](http://zh.wikipedia.org/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%89%BA%E6%9C%AF) 写的几乎全是数学和算法分析等内容,跟语言相比,语言本身并不能解决一个问题,它只是反映事物的工具,跟解决问题没有绝对的联系,数据结构与算法才是“真正能解决”计算机问题的手段与技术。你看路由器算法,这些底层的东西,都是数据结构与算法发挥作用的地方。
30 |
31 | 于是,当用数学和机器的眼光直面解决问题的时候,很自然地就产生了一门学科,即数据结构和算法。
32 |
33 | **算法与数据结构实际上就是计算机编程界将应用问题离散化建模的方案,这样,就可以将应用问题转化为软件上可用的抽象,而所有一切软件上的问题,不过都是抽象。** [[1]](#ref1)
34 |
35 |
36 | ## 不会Coding如何破?
37 |
38 | 「能看懂别人的程序,但自己就是写不出来,Why?」——这个问题其实每个刚开始学习编程的人都会遇到,你所见到的各位达人大牛都曾经有过这么一段经历,所以完全不必为这种情况而怀疑自己的能力。为什么会有这样的情况出现?——因为思维模式。
39 |
40 | 在小学的数学教材里,有一种题型,叫应用题。它会给出很多生活中的场景,然后让你用数学知识来解决。在解这种题时,其实分为三个步骤,首先是要提取出数理模型,比如常见的追逐相遇这类问题,就要使用速度时间模型,然后把这个模型数学化,找出各个变量之间的关系,确定已知量和未知量,形成可求解的方程,最后求解。
41 |
42 | 编程的情况与此类似。首先要建立一个抽象描述模型,然后建立数学表达,接下来略有不同,不是亲自求解,而是给出求解的方法——也就是算法,最后是把算法转化为程序。而新手通常之所以会卡壳,是由于这个流程中有两个难关。建立模型不是问题,数学表达也不难,但找出算法却是非常艰难的事情,即使找到正确的算法,要把它写成正确的代码也不容易。新手常说我在学习XX语言,XX语言真复杂啊。其实学习语言本身只能保证你在最后一步,也就是翻译代码(又名coding)那里少出错误,即使你顺利的学习了一万种语言,你也会觉得编程很难,假如你没有学习算法的话。让我们找个具体的例子来说明,假设现在有个题目要找N个正整数中的最大值。显然这个题目模型很清楚,本身就是数学问题,也不需要数学表达了。接下来就是解法,新手这时就卡在这个地方了。
43 |
44 | 刚接手这个题目,很多人就会想用一种类似人类的快捷操作,比如三个数,瞥一眼就可以找出最大值,四个数也毫无问题,甚至十个数也是一下子。这时我问你,你怎么把这个瞥一眼的动作表示成程序,另外如果N大于10000怎么办?——哑口无言。原因是,人类的头脑过于聪明,可以同时处理很多事务,也就是可以并行处理一定量的数据(当然大规模数据就要另外对待)。而计算机——很遗憾,这方面的能力有所欠缺。这个时候你肯定会说:「现在不是有多处理器多核多线程等各种各样的并行处理的计算机了么?」我要告诉你,那些都是不同层次的概念。
45 |
46 | 目前这个时代的计算机,在出现革命性的变化之前,从CPU指令的层次来说,都是单线程单参数工作的。再说明白一点,这些机器任何时候只能一次处理两个数,而且其中一个还必须已经在CPU内部了,任何N>=3个数相加都必须转化成持续的两个数相加,就是先把第一个第二个加起来得到结果之后,才能和第三个相加,照此重复求得所有的和——这是目前的科技无法改变的铁律。这个时候我要请你记住一个重要的思想:编程中任何问题都要分解到足够小,小到机器可以一次解决的程度!当然,这不是意味着我们每次编程都得从CPU执行一次指令的角度去解决问题。
47 |
48 | 回到刚才的那个题目:寻找N个正整数中的最大值。我们知道直接解决是不可能的。而按照刚才讲过的铁律,我们知道直接找到两个数中的最大值是一次可以做到的。那怎样从2个扩展到N个呢?这里就是算法的天下了。一种很常见的想法是,完全可以从两个中找出最大值,再让它和接下来的一个比较,这就是N=3的情况,再把三个中的最大值和第四个比较,这就解决了 N=4,依此类推,我们似乎找到了通用的算法。是的,找到前N-1个中的最大值,然后与第N个比较——不要怀疑,这个算法方向是正确的。接下来就是把它细化使他能变成代码。
49 |
50 | 你注意到,首先要设法从1增加到N,而且每次前进一步都要做类似的操作,显然可以用一个循环来实现。每一次循环中,都需要将保留的最大值和当前的这第n个数比较,如果最大值比它大,那就保留,否则就要把最大值替换成新的——这就是条件语句的作用了。写完这个循环之后,还有些小细节,比如这个最大值在与第一个数比较之前应该是多少呢?太大的话,可能会比整个数列的数都大,这就会出问题。因此常用的做法是,就让他等于第一个数。然后包括读入那N个数,而输出最大值这些琐碎的细节就属于收尾工作了,没什么可多谈的。当然,即使是这样的小题,也不仅这一种算法。
51 |
52 | 你记不记得有一种叫做单淘汰赛的机制——最后顶点的就是最大值。用在这个地方正合适。不过,如果要把这个淘汰赛算法实现成程序的话,如何实现分组,如何表达这个淘汰过程和取出顶点的值,正是算法描述里要解决的。这个就是排序里很有名的最大堆排序。 一旦算法(伪代码)描述齐备,程序编写不过是打字校对的工作。
53 |
54 | 为什么你可以看懂别人的程序呢?——因为他的算法隐含在程序中已经被实现了。就像你读王维的诗,总能在眼前浮现出一幅幅绝美的风景画,但轮到自己写,却描绘不出那样的画面。一方面是因为你束手无策,不知道怎样找到可实现的算法;另一方面是即使你找到了算法,也只是爱在心中口难开,不知道怎样去表达。
55 |
56 | 算法总是从问题出发,通过一定的模式,逐渐细化再细化,直到可以直接转成程序。新手很难一下子领会什么样的算法是可以实现的,但好在新手接触的问题一般不是很难,算法通常非常清楚明白,所以重点是要解决后面那个怎样把算法表达出来的问题。因此在这里建议各位新手默写教材上经典的例题程序。很显然对于那些例题,只要你用心看过就会领会它的算法。那么,你再默写一遍,即使和它的原程序样子不一样,也总算是把这个算法表达出来了。反复这样练习,这个表达问题不就解决了么?而且在这个过程中,至少你学到了一个算法。基于此原则,任何你遇到的可以看懂的例程(当然要是好的例程才行),都建议你默写它——尤其是开源的精品代码。
57 |
58 |
59 | ### Notes
60 |
61 | 1. [1] 本小节内容引自 [算法+数据结构的本质 | 兮软](http://dev.gameres.com/Program/Other/bcxszyforgameres/bcxszy/xisofts.sinaapp.com/@p=104.htm),该书完整版见[编程新手真言Ver3.0](http://dev.gameres.com/Program/Other/bcxszyforgameres/bcxszy/xisofts.sinaapp.com/@p=5.htm)
62 |
--------------------------------------------------------------------------------
/chapter4-advanced-programming-part2/README.md:
--------------------------------------------------------------------------------
1 | # 第四章-操作系统及项目开发杂谈
2 |
3 | 在众多的程序里,有一大类特殊的程序,它们就叫操作系统(OS: Operating System)。操作系统是最基础的程序,它让计算机:
4 |
5 | 1. 运行起来
6 | 2. 所有的硬件各就各位
7 | 3. 接受别的程序给予的指令
8 |
9 | 相应的,其它程序就叫应用程序。操作系统和应用程序的关系,就像人的基本意识和数学水平一样。想让一个连基本意识都没有的人(譬如植物人)参加数高考——看来你和我都疯了。一般的计算机都是硬件、操作系统和应用程序相互分离的,需要的时候分别安装。有些特殊的设备直接把操作系统做在硬件里(比如嵌入式操作系统),比如各种电子游戏机,可以开机,但是要有游戏光盘或游戏卡才能玩,还有些计算机把操作系统和应用程序都做在一起,放在机器内部,N年前很流行的俄罗斯方块掌上游戏机和电子宠物就是这样的设备。
10 |
11 | ## 操作系统漫谈 [[1]](#ref1)
12 |
13 | Long long ago, 就是上个世纪60 年代的美国一个春天啦,那个时代的计算机是个新鲜玩意,非常笨重,家庭用户是没有的,都是商用或者试验,科学计算用的机器。你说你想买个电脑斗地主?把你卖给地主你也买不起呀。再说那时候的计算机不是随便一个人就会用的,那时候的计算机使用的时候是由人来输入一条条的指令来进行各种运算的。他们输入的指令大约相当于现在的汇编指令,所以这个效率和操作难度有多高就可想而知了。
14 |
15 |
16 | 那时候计算机大都没有什么操作系统,顶多有个批处理系统,可以把要输入的指令记录在某种媒介上(比如纸带)一次性输入进去,让人们省去一条条重复输入指令的麻烦。后来慢慢有了很简单的操作系统,但并不像现在我们见到的操作系统这样通用。这个时候,卖计算机的厂商要为每一型号的计算机设计不同的操作系统,一个程序如果在这个型号的计算机上写好了,拿到其他型号的计算机上是运行不了的,因为这两台机器连操作系统都不一样,怎么可能程序通用呢。计算机要是老这样肯定是不行啦,否则你今天要玩斗地主,人家游戏公司就得专门派人到你家机器上现写出一个来——因为不同型号的计算机上的操作系统不通用嘛。
17 |
18 |
19 | 这个斗地主的问题,终于还是被那个时代IT业界的大地主,蓝色的IBM公司率先着手解决了。1964年他们公司推出了一个系列的大型机,用途、价位各不一样,但他们上面运行的操作系统,都是System/360。(这360可不是卖鞋的,也不是跟QQ打架的那个)这一下获得了很大的成功,因为省去了为每一台电脑单独编写系统的成本嘛。直到今天,IBM 的大型机上依然可以运行这个360 系统,可见其当初设计时充分考虑的兼容性。然而我们要讲的主角不是360,而是另一个伟大的操作系统。
20 |
21 |
22 | 那时候有个聚集了很多牛人的地方,叫做贝尔实验室,是1925 年由AT&T 公司成立的。一帮头脑发达四肢也不一定简单的家伙整天聚在那里,研究新奇的东西,什么任意门啊,竹蜻蜓啊,记忆面包啊——呃……都不是他们发明的(发明这些的人是个日本科学家)。那贝尔实验室那帮人研究什么呢?贝尔实验室的工作可以大致分为三个类别:基础研究,系统工程和应用开发。在基础研究方面主要从事电信技术的基础理论研究,包括数学、物理学、材料科学、行为科学和计算机编程理论,反正都是大学听不懂的那几门就对了。系统工程主要研究构成电信网络的高度复杂系统。开发部门是贝尔实验室最大的部门,负责设计构成贝尔系统电信网络的设备和软件。具体来说贝尔实验室研究出来过的东西有晶体管、发光二极管、数字交换机、通信卫星、电子数字计算机、蜂窝移动通信、有声电影、立体声录音,等等。(怎么样,不比机器猫那些东西差吧?)通信网的许多重大发明都诞生自这里。
23 |
24 | 那时候还有个聚集了很多牛人的地方,叫做麻省理工学院(MIT),这是美国的一所综合性私立大学,有「世界理工大学之最」的美名。从这里走出的牛人很多,到2009 年为止,先后有76 位诺贝尔奖得主,都曾经在麻省理工学院学习或者工作。麻省理工学院的自然及工程科学在世界上享有极佳的盛誉,其管理学、经济学、哲学、政治学、语言学也同样优秀。另外,麻省理工研发高科技武器和美国最高机密的林肯实验室、领先世界一流的计算机科学及人工智能实验室、世界尖端的媒体实验室、和培养了许多全球顶尖首席执行官斯隆管理学院也都是麻省理工赫赫有名宝贵资产。有着毋庸置疑的实力,麻省理工自然非常不差钱,截至2008 年底麻省理工有101亿美元的总资产,因为不差钱,于是该校对家庭年收入低于75000美元的学生一律免学费。
25 |
26 | 那时候,又有个聚集了很多牛人的地方。(哪那么多地方阿!)这地方是个公司,叫做通用电气。这公司可是个大公司,当年是个卖灯泡的,他们的灯泡可非同一般,虽然不节能,虽然寿命不如现在的长,虽然价格比现在贵, 虽然外形也不一定好看,但是——他们是第一家卖灯泡的!因为他们的老大,就是大名鼎鼎的Thomas Edison。1876年,发明灯泡的爱迪生同学成立了爱迪生灯泡厂,为节约蜡烛和灯油做出了突出的贡献,估计那年的五一劳动奖章肯定是他的了。到1890年,爱迪生同学将灯泡厂重组,成立的爱迪生通用电气公司,到1892 年又与汤姆森-休斯顿电气公司合并,成立了通用电气公司。
27 |
28 |
29 | 好,时间到了1965 年,这三个聚集着不少牛人的地方有一天忽然想合作一把。于是,大名鼎鼎的贝尔实验室,大名鼎鼎的麻省理工学院和大名鼎鼎的通用电气公司一起开始了一个制作操作系统的计划。为了结束长期以来计算机上面没有统一的操作系统的混乱局面,他们决定要创造出一套**前无古人后无来者,上得厅堂,下得厨房,念天地之悠悠,独怆然而泣下**的惊世骇俗的操作系统!具体来说吧,这个操作系统应该是一个支持多使用者、多任务、多层次的操作系统,因为这三多,所以这个操作系统就起名叫做——MULTICS。有了这三家的强强联合,那开发的结果还用问么?这个MULTICS 操作系统的项目在1965 年成立,到了1969 年就... 被取消了。
30 |
31 | 咳咳,这个... 其实编写操作系统也不是一件容易的事儿啦。毕竟道路是曲折滴,研究是辛苦滴,成绩还是有滴,失败捏... 也是可以原谅滴嘛。项目失败了,大家都很沮丧。在这些沮丧的人中,Kenneth Lane Thompson只是很普通的一个——1943年出生在美国的新奥尔良,吃着烤翅长大的他没有辜负养育他长大的父母和那些没有了翅膀的鸡。1960年,汤普逊考上了加州大学博克莱分校主修电气工程,顺利取得了电子工程硕士的学位。1966年,他加入了贝尔实验室,参与了MULTICS项目。做项目是个很辛苦的事情,在疲劳的揉揉因熬夜而发红的眼睛后,他很想能有个电脑游戏来玩玩。然而那时候别说超级玛丽,连吃豆也没有啊!所以汤普逊同学就自己编了一个游戏,叫做星际旅行。这个星际旅行跟星际争霸那肯定是没的比的了,不过在那时候已经算是很有吸引力了。这个游戏自然是被设计运行在MULTICS 系统上的,由于MULTICS系统还不完善,所以游戏运行的也不是很流畅,所以,能够顺畅的玩星际旅行,成为了汤普逊同学努力工作的动力。可是后来项目被干掉了,如果事情就这样结束,那么汤普逊同学就再也不可能流畅的玩他的星际旅行了,这是多么遗憾的事情阿。可是现实是残酷的,项目确实就是取消了,要想顺畅的玩游戏怎么办?老毛教导我们说:自己动手,丰衣足食。我估计汤普逊没有背过毛泽东语录,但是他用自己的行动证明了这两句话的正确性。他在墙角淘换出一台PDP-7 的机器,并且伙同其同事Dennis Ritchie,打算将星际旅行移植到这台PDP-7上。当然,要想运行这游戏,还是得有个系统。有了固定的系统,那以后再编写别的游戏就更方便了。可是系统从哪里来?MULTICS?已经停工了,并且这系统绝对不是两个人可以搞定的。那怎么办?还得自己动手!于是Ken Thompson 和Dennis Ritchie 再次发扬自己动手的精神,用汇编语言写出来个系统,这就是最初的,非常简陋的,UNIX 的前身。这个系统不像 MULTICS 那么牛,不支持很多的用户,只能支持两个用户,(估计是为了避免做好了之后俩人抢机器玩的局面发生。也可能是为了以后俩人对战?)支持的进程也有限,其他功能也都没有MULTICS 设计的那么复杂。相对于那个MULTICS 系统——MULTiplexed Information and Computing System,Brian Kernighan开玩笑地戏称他们的系统其实是:「UNiplexed Information and Computing System」,缩写为「UNICS」。后来大家取其谐音,就诞生了UNIX 这个词。这一年,已经是1970 年,史称Unix元年。
32 |
33 | 直到现在,计算机中都是用1970年1月1日0点0分0秒为原点来记录时间。(计算机中的时间记录的是自1970年1月1日0点0分0秒开始,到现在经过的总秒数,再用这个秒数计算出年,月,日)后来,Brian Kernighan觉得用汇编写的系统不好维护,于是... 他发明了C语言(符合大牛一切自己动手的风格),然后用C 语言又重写了一遍。从此,Unix 走上了发展的快车道,并且一直用到现在。许多世界级的大服务器,用的都是Unix系统(其实就现在而言,很多服务器上是用的开源的Linux系统)。**而这一切的努力,就是为了玩个游戏。-\_-b**
34 |
35 | ### 操作系统及平台
36 |
37 | 总体而言,没有操作系统的计算机,就像没有意识的身体,是无法动弹的。
38 |
39 | 是不是觉得操作系统很酷?想不想自己写一套?编写操作系统要比通常想象的困难的多,它涉及到大量的背景知识和底层操作。所有连这本书都还不能消化的新手应该完全打消诸如自己制作操作系统的念头,否则吐血身亡我可负责不起,有实力之后再来尝试也不迟。
40 |
41 | 提供给钢琴和手风琴的乐谱并不是完全一样的,这是一种共识。为什么?——因为这是两种不同的乐器。同样,在这个世界上有很多种的计算机,他们相互之间的差别也很大。每一种计算机都需要操作系统,而某一款计算机可能有好几种操作系统可以使用,就像我们可以说中文,也可以说英语。但也有可能它只能装某几种操作系统,比如Mac OS X就不是普通的电脑能原生支持的。**特定的计算机和特定的操作系统的组合,就被称为平台。**就像钢琴曲不是给京韵大鼓使用的,对印度土著说中国成语也不会有什么好效果,编程通常都要针对某种平台来做。有一些高级语言号称能够跨平台——也就是可以在很多平台下运行。跨平台并不意味着在每一种平台上都能运行,一般能支持一些主流平台就可以称为跨平台。
42 |
43 | 如果你想要在编程上面有所成就,你不得不选定一个平台深入地钻研。个人认为,初学者不适宜同时在两个完全性质不同的平台上学习,不同的特性绝对会把你搞晕,在你确认掌握了一个之后再学习另一个,相互借鉴的作用才能体现出来。
44 |
45 | ### Notes
46 |
47 | 1. [1] 本节摘抄自《笨兔兔的故事》,如原作者觉得放这里不合适还请及时指出。
48 |
49 |
--------------------------------------------------------------------------------
/chapter4-advanced-programming-part2/cli-and-gui.md:
--------------------------------------------------------------------------------
1 | # 控制台和图形用户界面
2 |
3 | `Hello world` 恐怕是家喻户晓的编程语言第一堂课了,当你开始照书上的例子编写`Hello world`时,很快就会问出这个问题。回想平时见到的那些程序,他们通常都有标题栏,有菜单和工具栏,可以用鼠标在上面点来点去好像还有很多别的功能。可是这个程序似乎完全不同,难道出了什么问题?其实没有问题,这是一个控制台程序。
4 |
5 | 世界上有各种各样的程序。几乎所有的程序都要和用户交流,接受用户的输入,输出运行的结果,但它们接受和输出的方式是不一样的,程序与用户交流的方式被称为界面。还记得早期科幻电影里那种出现在计算机屏幕上可以和人对话的巨大人脸吗?或者《贝克街的亡灵》中被称为「茧」的游戏——那就是界面的一种。事实上这种界面到现在还没有实现,人类的想象力总是能超前实际技术很多。
6 |
7 | 界面有很多种,有些程序不需要界面,因为它们根本不必和用户交流,它们和其它的程序交流,你可以叫它无界面,典型的例子就是驱动程序,你什么时候见过驱动程序运行的样子?一般在Windows和Mac OS X下的程序所使用的则称为图形用户界面(GUI: Graphics User Interface),Linux下同样也有很多采用GUI的应用程序。简单来说,就是所有的输入和输出都使用图形的方式。它接受用户图形化的输入,譬如用户用定位设备(鼠标、轨迹球、手写板)输入坐标、绘图,把程序的输出反映在可以显示图形的设备上,譬如显示器、打印机、头戴式监视器,通常这种程序会提供菜单、工具条等方式而极大地方便用户。这种程序直观明了,一般用户能很容易的掌握使用,只需要点击就可以完成大部分的任务。魔兽世界和Word就是典型的GUI程序。
8 |
9 | 虽然GUI程序便于一般人使用,但其实图形界面的编程是相当复杂的。你能想象每次你都要画出显示器上所有的东西有多困难。窗口移动缩放时,你需要重画窗口里的每一样东西;在多窗口并存的时候,如果你的窗口被别人的窗口挡住了一部分(这是很常见的情况),你需要控制窗口上哪些部分被显示、哪些被遮挡;鼠标移动的时候,你需要把被鼠标遮住的部分盖住,并重画鼠标;当鼠标点击时,你需要判断鼠标的位置,还要判断这个点击是你的程序的,还是别人的;当鼠标点击到菜单的时候,你要确定是菜单还是按钮,以及是哪个菜单项,然后执行相应的操作。所有这些情况,都必须一一解决。其中有些是可以由操作系统解决的,但你要知道怎样利用操作系统提供的资源才能让它帮你做,还有些就必须你自己想办法,种种问题使得图形界面的编程变得异常复杂。
10 |
11 | 与此同时,由于图形处理的需要,图形界面对计算机硬件的要求也比较高。画面绚丽的3D游戏,远比记事本程序对系统的要求要高的多。虽然现代的计算机早已能够满足这些要求,但早期的计算机并不是这样强大的。所以,在早期(也不是很远,大约是上世纪七、八十年代)的时候,程序的界面并不是图形,而是字符的。用户在键盘上输入文字,比如dir,系统找到相对应的命令,然后执行,执行的结果也是以一行行文字的形式输出在可以输出文字的设备上(当然也主要是显示器),用户阅读文字,进行下一步的操作。
12 |
13 | 现代的一些科幻片,在表现黑客侵入或者是操作高级设备(比如美国国防部的核武器系统)时,往往出现操作员在啪啪啪啪快速打字,然后突然一回车,就大功告成的场景,很少会出现卡通化的菜单和工具栏。想想黑客帝国的那个接线员,你见过他什么时候抓着鼠标吗?这种方式就叫命令行界面(CLI: Command Line Interface),由于操作员通常是坐在一个操作台前,而这个操作台确实可以控制整个系统,所以也被称为控制台界面(Console Interface)。控制台下运行的程序,就是控制台程序;运行控制台程序的系统,就叫控制台环境。控制台看起来很高级,很酷很眩,黑客们操作的时候也显得很高深,其实反倒是比较容易编程实现的。因为你只要处理和输出字符就可以,系统自然会把字符放在屏幕上适当的位置。你不用去管字体大小颜色这些事,更甭提窗口、菜单和鼠标这些不存在的东西,只要把注意力全部放在程序的功能上。电脑系统也不用消耗资源来画图,系统自然比较高效。所以,命令行界面一出现,就得到了广泛的应用,它的历史可比图形界面古老多了。和GUI程序比起来,命令行的程序通常不那么漂亮,对普通用户来说操作也不直观。**但由于它的高效和快捷**,命令行方式的程序迄今仍然在使用,命令行方式不但没消失,相反,有许多系统反而更加加强这部分的功能,譬如 Windows7 下的 [Windows PowerShell](http://zh.wikipedia.org/wiki/Windows_PowerShell),按下“Windows”徽标键(键盘左下侧类似一个窗户的图案),输入PowerShell试试,进入后试试ls & tab,可以像Linux的终端一样自动补全噢\~
14 |
15 | 在很多时候,人们宁可使用命令行的程序来完成某些工作,这一点在BSD、 Linux和其它的UNIX系统中体现较为明显。DOS就是一个标准的控制台环境,Windows系的操作系统,也提供了控制台环境,不过连鸡肋都不如就是。还有很多的GUI程序,借鉴控制台方式,仍然保留有直接使用键盘操作的方法。比如魔兽争霸,几乎每个命令都有快捷键以加速操作。
16 |
17 | 实际上,很多系统管理员更偏爱控制台程序,除了它比图形界面程序更高效之外还有一个原因:同样要增加实现一个选项,控制台只要增加一个输入字符作为开关,而图形界面至少需要增加一个按钮。想想看,屏幕上是可以增加的按钮多还是可以增加的字符数多呢?**所以控制台程序往往更能实现纷繁复杂的功能,只要你记得住相应指令。**
18 |
19 | 让我们在Windows下打开一个控制台环境并使用几个控制台程序感受一下。Linux下的后边附录部分会单独截图演示。假如你使用的是Windows XP,点击开始,找到程序-\>附件,在里面有一个叫“命令提示符”的快捷方式,点击运行它。Windows7下类似,也可以点击开始后输入`cmd`. 还可以同时按住「Windows」徽标键和R,在弹出的窗口中输入`cmd`。
20 |
21 | 你是不是看到了一个窗口,没有菜单,没有工具栏,只有标题栏和最大最小化的按钮,这就是Windows下的控制台环境,在这里就可以运行控制台程序。现在,输入`dir`,然后回车。你看到了输出吧,这就是控制台程序的运行了。只要输入命令再回车,就可以运行了。再来运行一个,`time`,再来一个,`ipconfig`。最后再来一个,`help`。他给出了当前系统提供的各种命令,你可以看着提示分别试一试。其实不止可以运行这些,试试 `notepad`,你发现了什么?`explorer`, `calc`等等都是可以这样运行的哦。玩够了,好吧,输入`exit`,再回车,控制台环境就被关闭了。有没有发现 Windows对命令行界面一点也不友好,相比之下Linux和MAC OS则对命令行界面友好地多,所以也才会有了cygwin之类的软件出现。
22 |
23 | 控制台程序容易编写,易于理解,所以对于初学者,控制台程序是比较好的选择。在学会了控制台程序的基础上,再转到窗口程序就比较轻松了。
24 |
25 | ## 图形用户界面编程
26 |
27 | 黑客们很偏爱Console,但对于普通用户来说,图形界面是他们更熟悉的。我们大多数人也喜欢编写GUI程序,因为那看起来似乎更友好也似乎更有成就感,那怎样才能编写GUI程序?
28 |
29 | 每一个操作系统,都会提供一套API,如果该系统支持GUI,那么它的API中就会有一个图形子系统和窗口管理子系统。其中图形子系统包括了基本图形元素的绘制,比如画点线面、显示文字图片和上色渲染等等,窗口管理子系统首先会包含图形子系统,再增加包括窗口和窗口元件的绘制、窗口的遮盖、移动调整,以及鼠标点击这类事件的传递处理等等这些内容。Windows下,图形子系统就叫[GDI](http://zh.wikipedia.org/wiki/%E5%9B%BE%E5%BD%A2%E8%AE%BE%E5%A4%87%E6%8E%A5%E5%8F%A3)(Graphics Device Interface)。为了高效处理多媒体编程,微软在Windows95发布前夕开发出了[DirectX](http://zh.wikipedia.org/wiki/DirectX)——除了图形之外它还整合了很多其它功能,用它搞出了大量的Windows游戏。另一套著名的图形API则是跨平台&跨编程语言的[OpenGL](http://zh.wikipedia.org/wiki/OpenGL),渲染能力很强!!
30 |
31 | 另外值得一提的就是微软自Vista发布以来广泛用于界面开发的WPF,WPF 是下一代图形API 在桌面上的延伸。以WPF 撰写应用程序,具有更高的视觉品质,Win7丰富的界面效果很大程度上要归功于[WPF](http://zh.wikipedia.org/wiki/Windows_Presentation_Foundation)的应用。
32 |
33 | 即使有图形库窗口管理库,GUI编程仍然是相当的繁琐。首先是要完成某个工作必须填写大量按部就班的代码,而且这些代码在程序内部和各个程序之间重复着,这提示人们应该在图形库的基础上作进一步的抽象。简单来说就是要在画点画线函数的基础上做出画二次曲线画立方体的模块。幸运的是,这些工作已经有人完成了,而且是不止一套。这些东西按照功能强弱,有的叫图形用户界面库,有的则叫应用程序框架。在Windows下,使用VC++的人可以选择[MFC](http://zh.wikipedia.org/wiki/VC%2B%2B) [ATL](http://zh.wikipedia.org/wiki/Active_Template_Library),如果你选择.NET阵营,[.NET Framework](http://zh.wikipedia.org/wiki/.NET%E6%A1%86%E6%9E%B6)就是你最好的选择,结合C\#开发比较方便。
34 |
35 | 如果你希望程序不止在Windows使用,那么跨平台的[Qt](http://zh.wikipedia.org/wiki/Qt), [GTK+](http://zh.wikipedia.org/wiki/GTK%2B), [wxWidgets](http://zh.wikipedia.org/wiki/WxWidgets) 都是你的好选择。它们在保证效率的同时,适当抽象,抚平了底层操作系统的差异。对于学习C++的人来说,上述库都是可以用的,当然也有其它语言支持——比如Python。这三个平台相对来说QT的资料会多一些,但是有一定的版权问题困扰,不过个人使用没有问题。
36 |
--------------------------------------------------------------------------------
/chapter4-advanced-programming-part2/projects.md:
--------------------------------------------------------------------------------
1 | # 工程和单个文件的关系
2 |
3 | 有一件很明显的事情,当软件项目变得很大的时候,仅仅使用一个文件来完成所有的内容是不现实的。以《魔兽世界》这款游戏为例,游戏中需要声音、动画、图片这样的素材,也需要地图编辑、人工智能、光影渲染这些不同的模块,在制作的时候,需要有不同的部门完成不同的工作,工作中所使用的文件和工具都不相同,不可能生成同一个文件。这时,就存在一个协调的问题。因此,对于大型的开发工具来说,它们不是以单个文件为单位进行处理的,而是以项目为单位。一个开发项目包含一个到几个工程,每个工程都包含有大批的文件,有源代码,有程序所使用的图片音乐等资源,还有编译时需要记录的各种参数。每次编译都要完全编译整个工程(当然在优化状态可以只考虑更新变动的部分)。
4 |
5 | 显然工程对于类似《魔兽世界》这样的大型项目的编写是十分必要的,但在新手练习的小程序上,使用工程就像你只想在家给你的小狗搭个窝,却拉来了整个中国长江三峡工程开发总公司,实在有点小题大做。而且,以后我们要编写很多这样的小程序,如果每一个都新建工程,那会生成多少垃圾文件啊!所以,我们需要一种只编译单独文件的方法。幸运的是,不论哪种开发工具,它们都提供了这样的方法。虽然这种方法通常不会在菜单上直接出现,但它确实是常用和正确的方法。
6 |
7 | ### 函数、API、类、控件、开发包与软件复用
8 |
9 | 还有件事也很明显,随着工程项目的越来越浩大,每一次都从零开始编写一个项目是不经济也是不现实的。我们注意到,不论是程序还是源代码,都有以下两个特性。第一,它们都是人类智慧的成果,每一行源代码都凝聚了程序员的聪明才智,花费了开发者的时间和金钱。第二:几乎每一行源代码本身都可以毫不费力的零成本的被复制到另一处,另一个代码块、另一个程序甚至另一个项目。基于这样的特性我们认识到:如果能够重复利用已经编写过的程序和源代码,尤其是那些在使用中已经被证明健壮而正确高效的程序,就能够节约巨大的人力物力财力和时间。即使只能使用其中的一小部分,也是了不起的成就,这就叫做软件复用。
10 |
11 | 软件复用最重要的好处就是能够让程序员不再把有限的智慧放到早已解决过的问题,而是投身新的问题,也就是:**不要再重复发明轮子。**开放源代码的一个重要理由就是为了软件复用。软件复用的一个行之有效的方法是使用函数。所谓函数,就是把一些具有固定功能的代码段组合在一起,并给予一个名字。在需要这些功能的时候,只要在适当的地方填入函数的名字。在编程时使用函数而不是纯粹手工打造,就像在盖楼时使用砖块而不是用粘土堆砌——已经是不小的进步了。盖楼时使用的砖块,既可以自己制造,也可以到市场上去购买。购买来的砖块,虽然有某些差异,但总是遵循某些共同特性。这些砖块虽然是一块块地使用,但总是一车车的大量购买。函数也一样,市场上总是有专业公司提供函数出售,他们出售的函数按照功能聚集在一起,成为函数库。虽然不同公司的函数库可能具有相同的名字和功能,但内部是怎样构成的却不尽相同。
12 |
13 | 大部分现代编程语言,在规定了语言本身的语法和词汇(当然其中也包括了函数的使用方法)的同时,还会规定一个函数库。这个函数库只规定了每个函数的名称和用途。至于函数的具体实现方案,有的是由语言本身直接定义,有的是由实现该语言的编译器的厂商提供。而使用这种语言的用户,只要在需要的时候使用,而不用去管函数库内部的问题,大大提高了效率。这个库就叫做标准函数库。通常,现成的函数库都是经过了大量的实践检验证明是高效而健壮的,要比自己徒手打造的函数好用的多。**所以在可能的情况下,要充分使用已有的函数库,尤其是标准函数库。**C语言之所以如此强大,原因之一就是它有一个强大完备的标准函数库。Python同样也是一门功能强大的语言,其拥有一个强大的标准库,同时还有数不清的第三方库!第三方库的功能覆盖科学计算、Web开发、数据库接口、图形系统多个领域。
14 |
15 | 软件通常是运行在操作系统下的,从软件复用的角度看,操作系统如果能提供某些通用的服务,程序就可以集中注意力做自己的事。这些服务包括文件读写、设备操作、网络通讯、窗口绘制等等。否则,程序就会把大把的精力浪费在这些基础工作上。幸运的是,几乎所有的现代操作系统都提供了这样的服务。这些服务以函数的形式出现,程序使用这些服务,就像使用函数一样。这些函数形式的系统服务,就叫做应用程序接口API(Application Programing Interface)。遗憾的是,不同的操作系统,提供的API通常是不同的。使用某个操作系统的API编写的程序,搬动到另一操作系统时,由于API不能相互对应,也就不能运行了。这就是编程要针对平台的原因之一。
16 |
17 | 有些大型程序,比如Autodesk公司的AutoCAD,当你对它的某些功能不满或是感到有改进的必要时,它提供了编程改变的可能,相对于第一次开发来说这就叫二次开发。二次开发时,原始程序所提供的那些服务也被称为API。
18 |
19 | 使用砖块盖楼确实很方便,但如果能使用预制板,那就更方便了!比函数更高一级的可以复用的程序模块叫做类,类的使用比函数复杂,但是它可以更广泛的复用,是更高级的软件复用形式。类,同样可以聚集成类库。能够使用类的语言,就会规定标准类库。C++比C更强大,更难学,原因之一就是因为,C++除了具有C 所有的函数库之外,还有一个完整强大的标准类库。在类库当中,有一种很特殊的类,称为控件(control)。控件在快速的窗口程序开发中特别有用,它可以实现拖放式的编程。举例来说,想要编写一个有一个按钮的窗口程序,那么只要先创建一个窗口程序的工程,这个工程会自带一个窗口控件,而且直接显示在工作区里,然后再用鼠标把按钮控件从控件板上拖到窗口里需要的位置,按钮就摆放好了。至于按钮对应的功能,就需要程序员来编程实现。将来编译运行之后,程序的外观就和设计的外观一模一样。控件极大的提高了编程效率,但因为它需要自动生成某些代码,所以需要编辑环境的支持,支持控件的编辑环境总体来说比较少。控件的总和,就是控件库。
20 |
21 | 所有这些,函数、API、类乃至控件,开发必备,就像旅行时必需携带的行李一样,于是被统称为开发包(SDK : Software Development Kit)。
22 |
23 | 有些开发包是编译器自带的,如标准库等等,有些包是第三方厂商提供的。大部分开发包都需要集成开发环境(内带编译器)的支持,有的要编译器提供内部实现,有的要编译器给予连接,有的要编译器生成代码。不同的编译器提供的方式不太相同,这就造成了编译器之间的差异,有时甚至导致某个开发包不能在某款编译器上使用。为了进一步提高程序员的工作效率,很多集成开发环境还发明了另一些方法,相当于直接用一间间的房子叠在一起做成居民楼,你几乎只要刷刷外墙漆,就可以完成了,这被称为应用程序框架。可惜,不同的厂商的方法根本不同,这进一步扩大了集成开发环境之间的差异。不管未来怎样,至少现在,编程的规模变得越来越大,也越来越需要更多人的智慧。每个人的智慧都是有限的,不应该被浪费,充分使用每个人的智慧,才能取得最大的成功。软件复用就是整合所有人智慧的方式之一。从你编程的第一天开始,请牢牢记住:**软件复用**。要复用&复用&&再复用。
24 |
25 | ### 函数、API、库小结
26 |
27 | 相当于历史典故、谚语俗话、文化背景的东西,就是各个编译器和平台上的接口和库了。假设现在有个程序要读写文件,不要误认为你需要亲自写个程序去控制硬盘的磁头伸缩,或者是光驱的透镜移动或者是U盘的地址定位,除非你是想做个Linux或者Windows那样的操作系统。否则所有包括文件操作、网络通讯、人机界面这些,都是由操作系统提供的现成模块,只等着你来使用。这些模块通常称为应用程序接口(API - Application Programming Interface),不同的操作系统提供的API不一样。在接口的基础上,很多编译器和程序员做了进一步的包装形成了库,你可以比直接使用接口更方便地使用这些库而达到同样的功能。
28 |
29 | 由于系统的不一致,编译器的不同,所以在学库之前,先要确定你所要工作的平台和环境,还有应用方向。Windows下编游戏和Linux下做数据库用的库是大相径庭的。然后就是同样的一套步骤,找教材,做练习。这个教材通常就是官方文档,Unix/Linux平台有大量的文档,分布于man页和各种手册上,Windows下最好最全的就是MSDN,其他平台自行搜索。可以去找习题,但更好的方案是去找一个实际的小型应用,在使用中学习效果无与伦比。编写一个QQ或者BT,绝对能让你对网络操作部分了如指掌。网络上有很多开源项目,有兴趣可以自己去找找。
30 |
31 | 学习库和学习算法可以同时进行,在你完成这两个阶段的时候,你已经是一个合格甚至是优秀的程序员了。
32 |
33 | 优秀的文学作品有个共同的特征,他们虽然立足于不同的民族文化,但关心的却是全人类共通的思想感情,体现着终极的人文关怀,我们都会为 *The Old Man and the Sea* 中的Santiago所感动不是么。**优秀的程序虽然应用方向不同以及平台各异,但它们一定都完全符合计算机原理,并且用最合理的数学模型来展现。**如果你想成为合格的程序员,计算机组成原理和相关的数学知识是一定要补习的理论课。
34 |
35 | 除了看书和做题之外,还有一个内容不可缺少,就是阅读别人的程序。没有哪个作家不大量阅读别人的作品,同样你也可以从别人的代码中吸取营养。代码就是程序的全部,是真实的实现方法,一切都在代码中,甚至有时长篇累牍的说明还不如几行代码清晰明白。今天的程序员是幸运的,开源运动的发展使得他们能够无偿而方便地得到世界上最优秀的并且是实际运作中的代码,几乎遍布任何应用领域。只要你有心,就可以找到任何想要的代码。但读代码也是一件考验你毅力的事,读优秀的代码更是一种享受。但请阅读和你水平相当的代码,差距太大将会是严重的身心打击。你不会告诉我你C都还没学就想精通Linux内核吧?
36 |
37 | 超凡的主题跌宕的情节——其实就是你的程序的应用方向。如果说前面都是练习的话,那现在就是你自主创新的时候了。很多人都只是在老板的安排下为了工资而被动做些既不喜欢又没有价值的流水线产品,少数人才有机会做自己喜欢的东西。想想看, 3DMAX、WOW、Firefox、Nginx、Linux甚至Mac OS X都是多么知名的程序,也许有朝一日你的程序将会和它们一样知名。不过我还是不得不给你泼冷水,这需要不懈的努力、敏锐的眼光和少量的运气,只有极少数的程序员能做到这一点。不过,有梦想才能不断前进,不是么?:-)
38 |
--------------------------------------------------------------------------------
/chapter5-programming-languages/README.md:
--------------------------------------------------------------------------------
1 | # 第五章-编程语言
2 |
3 | 如果读到这儿还不知道编程语言是啥的,请回头阅读第一章,下边的介绍仅仅只是蜻蜓点水式的,想详细了解的请自行Google或者Wikipedia,每种语言都有其优缺点和适用领域,不可一概而论。
4 |
5 | ## C
6 |
7 | 在第四章中已经初步提及了C语言的产生历史。C语言是一种通用的、过程式的编程语言,广泛用于系统与应用软件的开发。具有高效、灵活、功能丰富、表达力强和较高的移植性等特点,正是由于这些特点,在嵌入式领域也得到了最为广泛的应用。
8 |
9 | C语言是由UNIX的研制者Dennis Ritchie于1970年由Ken Thompson所研制出的B语言的基础上发展和完善起来的。目前,C语言编译器普遍存在于各种不同的操作系统中,例如UNIX、MS-DOS、Microsoft Windows及Linux等。C语言的设计影响了许多后来的编程语言,例如C++, Java, Golang和C#等。
10 |
11 | 在发展的过程中,出现了许多略有差别的C语言版本。1989年,美国国家标准研究所(ANSI)为C语言制定了一套ANSI标准,就是所谓的C89。经过10年的发展,在C89的基础上又颁布了C99标准。大约又过了十年,2011年12月,ISO 正式公布C语言新的国际标准草案:ISO/IEC 9899:2011。目前大多数编译器完全支持C99,也可以指定为C89进行编译。
12 |
13 | ## C++
14 |
15 | C++和C的关系非比寻常。1979年,当Bjarne Stroustrup在新泽西州的Murray Hill实验室工作时,发明了C++。Stroustrup最初把这种新语言称为「带类的C」,1983年,改名为C++。C++通过增加面向对象的特性扩充了C。因为C++产生在C的基础之上,因此它包括了C所有的特征、属性和优点。在这个意义上,你可以认为C++是C语言的进化,这个进化的原因是复杂性(complexity)。一旦一个程序的代码超过25,000~100,000行,就很难从总体上把握它的复杂性了。C++突破了这个限制,帮助程序员理解并且管理更大的程序。
16 |
17 | 当然今天的C++已经不只是C的进化那么简单,它还包含了其它很多很多的新内容,C++对于C的进化着重体现在规模上,几乎C++的所有新特性,都是为大规模编程服务的。如果说C语言编程是单兵小组作战的话,C++编程就是集团军运动。它是如此的复杂以至于你要花上几倍于学习C的时间来学习他。但由于它和C的历史渊源,所有支持C++的编译器都能支持C,因此他俩也就常被合称为C/C++语言(大部分的C代码可以很轻易的在C++中正确编译,但仍有少数差异,导致某些有效的C代码在C++中失效,或者在C++中有不同的行为)。 标准化历经`C++98->C++03->C++TR1->C++11->C++14`
18 |
19 | ### C/C++和其它语言的关系
20 |
21 | Java 只要用一句话就可以概括,它是一种简化了的跨平台的C++语言(因此也被称为C++--)。掌握了C++的人,学习Java几乎是轻而易举。Java舍弃了C++语言中容易引起错误的指针,改以引用取代,同时移除原C++与原来运算符重载,也移除多重继承特性,改用接口取代,增加垃圾回收器功能。不同于一般的编译语言和解释语言,Java首先将源代码编译成字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了「一次编译、到处执行」的跨平台特性。在早期JVM中,这在一定程度上降低了Java程序的运行效率。但在J2SE1.4.2发布后,Java的运行速度有了大幅提升(O(∩\_∩)O\~这当然也是相对的啦)。
22 |
23 | Perl, Python, Golang, C\# 还有其他诸如此类的语言,或者与C处于同一档次,或者与C++处于一个水平,学过C/C++之后,再去学习他们是很容易的事。其实在C之后很多语言都可以称之为C系语言。
24 |
25 | LISP, Scheme是和C的思维方式完全不同的一类,被称为函数式编程语言,在人工智能等领域有奇妙的应用,有兴趣的朋友可以去领略。
26 |
27 | ### 为什么要学习C/C++
28 |
29 | 考试的人不用讨论这个问题,他们没有选择。如果我们有选择,为什么我们学习C语言而不是别的。首先因为C本身是非常优秀的,它是世界上最伟大的编程语言之一。许多人认为C语言的产生标志着现代计算机语言时代的开始,它成功地综合处理了长期困扰早期语言的矛盾属性。C语言是功能强大、高效的结构化语言,简单易学,而且它还包括一个无形的方面——它是程序员自己的语言。它的设计、实现、开发由真正的从事编程工作的程序员来完成,反映了现实编程工作的方法。它的特性经由实际运用该语言的人们不断去提炼、测试、思考、再思考,使得C语言成为程序员们喜欢使用的语言。
30 |
31 | 在编程规模越来越大的今天,用C往往会遭遇协作型的问题,而C++在保持了C的高效的同时,实现了大规模协作的可能,因而成为了真正工业化的语言。C/C++的优秀,使得它是主流的,在20世纪70年代末和80年代初,C成为了主流的计算机编程语言,至今仍被广泛使用。今天几乎所有的操作系统、大部分的的应用软件,90%以上的大型游戏都是用C/C++编写的。在对运行速度和资源占用有严格要求的领域,比如游戏、即时控制、嵌入式系统,基本都是C语言内嵌汇编语言的天下。今天只有一种语言的性能比C强,那就是汇编,优化过的C程序的速度大约是汇编的95%-98%。但汇编基本不是常人用的,所以实际上C就是最快的语言。
32 |
33 | 主流的就意味着资料丰富。不论是编程时所需要的文档,还是学习的示例代码,甚至是平台提供的接口和库,C/C++语言版本都是最丰富的。任何一家硬件软件公司,当他开发一款能够编程的设备或是软件,必然会提供C/C++语言的接口函数,其他的语言,就不一定有这样的好处了。不论是计算机图形学、加密解密还是计算机编程的其他领域,C/C++简直就是编程界的普通话。根据 International Data Corporation 的统计,C/C++ 是全球开发者使用最多的编程语言。如果确实要投身编程界,不懂C/C++的话,根本就是Mission Impossible。
34 |
35 | 如果你还不明白,我只需举一个小例子。假设你现在有机会去学习一门外语,投入时间差不多,你会选择学习英语呢,还是斯瓦希里语呢?(斯瓦希里语流行于非洲东部,为肯尼亚坦桑尼亚等国的官方语种)。当然,并不是说其他语言不值得学习,存在即是合理,今天存在的各种语言,当然都有它存在的价值,多学一点没有坏处。没有人禁止你在学会英语的基础上再学习法语日语等等。况且为了找工作等现实原因,学习其他语言也是非常正常和必要的。无论过去、现在还是将来手,天底下不存在哪一门语言非学不可才能成为高手,思想最重要,「不会XXX语言不算真正的高手」之类的言论实在无聊之至。学C/C++,主要还是通过他学习编程思想,真正的武林高手,难道会局限于手里的那把宝刀吗?
36 |
37 | ## Python
38 |
39 | 虽然如上所述,C/C++语言有如此之多的好处,但它也不是完美无缺的,第一个致命弱点是复杂性。为了应付千奇百怪的需求,C++提供了很多奇妙的语法从而实现了各种现代编程特性,这就使得C++变得异常复杂。如果有一个程序员对你夸口说他已经彻底掌握了C++的话,你基本可以断定他接触C++还没超过半年。幸好C语言还没有复杂性的困扰。但是开发效率也是C/C++的致命伤,因为过于接近硬件底层,C/C++程序在运行时几乎可以调动一切资源,取得最高的性能。但与此同时,C/C++程序员必须小心维护程序的运行状态,稍有不慎,轻则文件丢失&内存泄露,重则死机甚至导致整个系统软硬件崩溃也是有可能的(大多数人C语言上机时恐怕或多或少都会遇到野指针的问题)。所谓高收益必与高风险相伴就是这个道理。这就使得开发时必须小心谨慎,开发效率也就提不上去。
40 |
41 | 对于性能要求极高的程序,比如要求大量高速3D计算的计算机游戏、密集科学计算的工程软件、同时应付巨量用户的网页和数据库服务器,使用C++是当仁不让的选择。但是对于很多应用来说,些许的延迟是可以忍受的。举例来说,在某个工程中想要得到圆周率的后十万位,如果此时我们不在乎0.25秒和1.25秒运算时间之间的差别的话,就可以选择开发效率极高,而计算速度相对较慢的其他语言来实现。在所有这些其他语言中,强烈推荐的是 Python语言。「人生苦短,我用Python」
42 |
43 | 由创始人Guido van Rossum在1989年圣诞节期间创造出来的Python语言,是一种面向对象、直译式计算机程序设计语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定。**Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。**这种语言具有非常简捷而清晰的语法特点,适合完成各种高层任务,几乎可以在所有的操作系统中运行。Python支持命令式编程、面向对象程序设计、函数式编程、面向切面编程、泛型编程多种编程范式。与Scheme、Ruby、Perl等动态语言一样,Python具备垃圾回收功能,能够自动管理内存使用。它经常被当作脚本语言用于处理系统管理任务和Web编程,然而它也非常适合完成各种高阶任务。
44 |
45 | Python语言有两大关键特点。首先它被称为是一门清晰的语言。因为它的作者在设计它的时候,总的指导思想是,**对于一个特定的问题,只要有一种最好的方法来解决就好了。**这在由Tim Peters写的Python格言(称为The Zen of Python)里面表述为:There should be one and preferably only one obvious way to do it。这正好和Perl语言(另一种功能类似的高级动态语言)的中心思想TMTOWTDI(There's More Than One Way To Do It)完全相反。Python语言是一种清晰的语言的另一个意思是,它的作者有意的设计**限制性很强的语法**,使得不好的编程习惯(例如if语句的下一行不向右缩进)都不能通过编译。这样有意的强制程序员养成良好的编程习惯。简单来说,几乎所有的Python程序看起来都是一个样子的,而相对的,人们说,到哪里去找一段随机字符,读一段Perl程序就行。
46 |
47 | 第二个特点是它被称为胶水语言。哦,这可不是说它会把你的手指给粘住。它的意思是它可以像胶水一样,把用其他语言制作的模块拼合起来。很多人是这样用Python语言制作大型程序的:他们先用Python做出一个可用的程序,再把其中最影响性能的部分用C/C++语言重新写成模块(在已经满足要求的时候,根本就无需替换)。不用担心配合的问题,Python的可扩充性完全可以胜任要求,可扩充性可以说是Python作为一种编程语言的特色。新的内置模块(module)可以用C/C++或其他语言写成,同时也可为现成的C/C++或其他语言模块加上Python的接口。这样一来,我们既能充分享受到Python快速开发带来的效率,又能够实现足够强大的性能。
48 |
49 | 再加上设计极为出色的三大内置数据类型:异构列表、元组、字典和从函数式语言学来的列表解析、对象自省、方法动态生成等突出特性,使得它的功能变得极为强大的同时程序又相当简洁。想想看,你能在C程序运行的同时,改变自身的代码让它再次以另一面貌运行么?Python就可以轻松地做到。同样的功能,用Python实现所需的语句可能仅仅是C的十分之一到二十分之一,而开发(包括调试)所需要的时间更可能只需要百分之一。
50 |
51 | Python语言是少有的一种可以称得上既简单又功能强大的编程语言。对于工程师会计师这类非职业程序员,在平时需要某种语言来编写程序解决一些小问题的时候(例如做个土方计算,分析某种投资的收益,批处理一些文件的改名压缩之类),Python是比C语言更好的选择。即使对职业程序员,Python也是称手的工具。总之,Python就是手边的语言。
52 |
53 | Python的应用很广,既可以当做脚本语言来使,又可用于Web开发,还可用于科学计算——[《Python科学计算》](http://book.douban.com/subject/7175280),可以用轻便的Python来替代昂贵的商业软件MATLAB噢~ 下图是Python在Big Data领域一些相关库的思维导图。其第三方库的丰富程度可见一斑。
54 |
55 | 
56 |
57 | 在MIT Fall 2008的[Introduction to Computer Science and Programming](http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-00-introduction-to-computer-science-and-programming-fall-2008)课程中有不少内容就是用Python实现的,MIT开放式课程官网有详细介绍,视频啥的也可以到VeryCD和一些校内BT站上下载。
58 |
59 | ## Java
60 |
61 | 在前边的小节[C/C++和其它语言的关系](#c-other)中已简要介绍过Java,作为主流的工业化语言之一,其主要面对企业级开发。优点么,就是有成熟的框架和社区,有不少大公司在用。另外,如果要为目前市场占有率第一的移动操作系统——Android写点安卓应用,不会 Java 还真不行... 所以说,从找工作的角度考虑,熟悉下Java还是有必要的。但是,从单兵作战的角度考虑,Java代码就显得太过冗余笨重,不像Python那般简明。
62 |
63 | ## Go
64 |
65 | 相对于以上几种编程语言,Go还显得太年轻,Go语言由Robert Griesemer, Rob Pike, and Ken Thompson 三剑客于2007年在Google开发,并于2009年11月正式宣布推出。
66 |
67 | 与Java向C++学习相反,Go继承的是C,为何不直接学习C++?——因为C++太复杂了... 另外还记得 Ken Thompson 么?他可是C语言他老爹啊!老爹不用亲儿子自然是说不过去。要想给Google这种庞然大物写服务端程序,并行和分布式是必须考虑的因素,而为了解决这一开发效率上的难题(C开发效率低,C++又太复杂),Go于是横空出世了。与其他主流编程语言需要使用第三方库或者自行开发实现并发不同,Go将并发在语言的层面上实现了,实乃分布式开发之大幸啊。其实在Go之前的Erlang也是以在语言层面支持并发而闻名的,但是Go的基因先天有较强优势,使得其发展迅速,已有不少从Erlang转到Go的开发者。关于Go的一些其他特性可参考[Go语言资料收集](https://github.com/wonderfo/wonderfogo/wiki)。
68 |
69 | ## Notes
70 |
71 | 1. 对各种编程语言的异同还有更浓厚兴趣的话可参考松本行弘的大作——[代码的未来 (豆瓣)](http://book.douban.com/subject/24536403/)。
72 |
--------------------------------------------------------------------------------
/chapter6-useful-tools/README.md:
--------------------------------------------------------------------------------
1 | # 第六章-编程方法论杂谈
2 |
3 | 不管是在学习计算机编程还是其他领域的知识,只学到课堂上的那点东西是远远不够的,现代社会的发展对人的终生学习提出了新的挑战,在快速发展的IT业,不会终身学习也就相当于是退休了。下文就我在计算机领域所接触到的一些好的方法和工具给大家集中推荐一下。方法么,在很多领域都是相通的,因此以下的这些文字说不定就对你有用咧~
4 |
5 |
--------------------------------------------------------------------------------
/chapter6-useful-tools/good-habits.md:
--------------------------------------------------------------------------------
1 | # 好习惯
2 |
3 | ### 编码风格
4 |
5 | 代码风格好不好就像字写得好不好看一样,如果一个公司招聘秘书,肯定不要字写得难看的,同理,代码风格糟糕的程序员肯定也是不称职的。虽然编译器不会挑剔难看的代码,照样能编译通过,但是和你一个Team的其他程序员肯定受不了,你自己也受不了,写完代码几天之后再来看,自己都不知道自己写的是什么。Thus, programs must be written for people to read, and only incidentally for machines to execute. 代码主要是为了写给人看的,而不是写给机器看的,只是顺便也能用机器执行而已,如果是为了写给机器看那直接写机器指令就好了,没必要用高级语言了。代码和语言文字一样是为了表达思想、记载信息,所以一定要写得清楚整洁才能有效地表达。正因为如此,在一个软件项目中,代码风格一般都用文档规定死了,所有参与项目的人不管他自己原来是什么风格,都要遵守统一的风格。[2]在编程初期就要养成好的习惯!!!
6 |
7 | ## 学习习惯与工具
8 |
9 | * 书籍:简单经典的入门或者概论类书籍,可以在豆瓣或者Amazon美国官网上对比
10 | * 经典论文:引用次数最多或是被收藏次数最多,使用Google Scholor即可
11 | * 搜索引擎前几十页:推荐Google
12 | * 行业专家观点或是博客:可使用RSS订阅
13 | * 与同行专业人士交流:参与社区交流——研讨会,网络论坛,邮件列表
14 | *
15 |
16 |
17 | ## 优质的问答网站
18 |
19 | [2] 本段大部分内容引自《Linux C编程一站式学习》-http://learn.akae.cn/media/ch09.html 如与GFDL许可证相冲突,请作者及时指出。
20 |
--------------------------------------------------------------------------------
/chapter6-useful-tools/ide-vs-terminal.md:
--------------------------------------------------------------------------------
1 | # 编程开发
2 |
3 | ## 编程工具链
4 |
5 | 工欲善其事,必先利其器。以下就编程工具链推荐一些效率型工具。
6 |
7 |
8 |
9 | ### IDE vs Terminal
10 |
11 | * * * * *
12 |
13 | 待整合完善
14 |
15 | 前边说了那么多编程的东西,那么怎么把自己的想法变为最终的结果呢?——当然是选择合适的编译器(或者类似的东西)啦,首推GCC\#,关于编译器在这就不多介绍了,前边已经做过初步解释,初学者无需在此浪费过多时间,知道它能把你的代码翻译为计算机可执行的文件就OK了。下边针对C/C++做些介绍,其它语言类似。
16 |
17 | 就国内的高校C语言教学来说,Windows下的VC6.0使用率还是比较广的,估计大部分都是用的盗版汉化软件,我大一一开始学的时候老师上课演示也是用VC6.0示范的,不得不在这里小小的抗议一下,初学编程完全无需VC6.0(在Win7下兼容性很成问题)甚至Visual Studio这样的庞然大物,光建工程配置文件就能打击一大批新手的自信心,而且莫名其妙的错误是经常会有的!对于初学者,个人觉得Linux + Terminal就非常不错,能配合《Linux C一站式编程》就更完美了。
18 |
19 | 如果你喜欢IDE,那也没关系,免费开源的[::Blocks Code::Blocks],自由小巧的[Dev-C++](http://zh.wikipedia.org/wiki/Dev-C%2B%2B)也不错,如果你平时使用多种语言开发,开源的Eclipse当仁不让。当然咯,如果你钟情于Windows,Visual Studio则比较适合你,初学时可以用免费的Express版,也可以使用微软授权给高校学生授权的Professional版本。
20 |
21 | 另外值得一提的就是软件调试,这本是一块很大的话题,《Linux C一站式编程》中有关gdb的使用已经很详细了,有兴趣的去看看,其它IDE或多或少也有类似的排错功能,使用方法见各软件帮助文档或网络上的教程。
22 |
23 | 除了IDE这种开发方式,你也可以使用前边提到过的Text Editor配合编译器使用,配置好的话熟练后非常方便,效率也较高。更多的介绍请参考Wikipedia或者社区wiki之[工具篇](如何用C/C++做工程 "wikilink")。
24 |
--------------------------------------------------------------------------------
/chapter6-useful-tools/improve-efficiency.md:
--------------------------------------------------------------------------------
1 | # 如何找到好书
2 |
3 | 这是个非常好的问题,也是我们最应该分享给读者的。**授之以鱼,不如授之以渔。**全世界每天都在出版各种不同的书,我们不可能有那么多时间一本一本去挑。一般来说,经典书籍肯定是要经得起大家的检验的。
4 |
5 | 在国内出版电子计算机方面教材比较多的出版社有人民邮电出版社、电子工业出版社、清华大学出版社以及机械工业出版社,这四家出版社出好书的可能性相对会大一些,但并不意味着出的都是好书。国外的Addison Wesley, Microsoft Press, McGraw Hill, Pearson & O'Reilly也是尽出猛书的地方,像Addison Wesley, Pearson, McGraw Hill这三家出的其它比如数理电子类教材经典的也比较多,图书馆到处都能看到这三家出版社的书。
6 |
7 | 以上是从大的范围去挑,书是人写的,书好不好在很大程度上是由编者水平决定的,所以说要去找某领域比较好的书籍可以先找找这个领域有哪些领军人物,再去看看他都写了什么书。
8 |
9 | 如今的网络十分发达,信息的获取也越来越容易,像国内的[豆瓣](http://www.douban.com)在书籍、电影评论这一块就做的非常不错,有很多很多圈子和小组供你查看,如果是比较好的书的话上面一般都会有较多评价,我们可以根据上边的评分以及评论进行抉择。
10 |
11 | 我一般着重参考的两大书评网站:
12 |
13 | 1. [豆瓣读书](http://book.douban.com/),豆瓣不仅是文艺青年的聚居地,也是很多理工男常去的地方,比如我...
14 | 2. [Amazon](http://www.amazon.com),是国外那个Amazon啊,可不是国内亚马逊,国内亚马逊上的书评可参考性不强。
15 |
16 | 除了对单本书的评价,豆瓣上还有一些整理比较好的豆列,豆列往往是针对一个主题建立的。
17 |
18 | ## 如何下载到书籍「样章」
19 |
20 | 虽然通过第三方评价来评判一本书籍是不是靠谱是比较稳妥的方法,但是有时也会遇到一些找不到可参考的第三方评价的书籍,这个时候就需要靠自己的火眼金睛啦!
21 |
22 | Amazon/亚马逊和 [Google Books](http://books.google.com/) 的书籍通常可以看到一些样章,通过样章我们就可以大致判断这本书的价值了。如果是学生党的话,学校图书馆是个不错的书库,实地去考察下吧,又不费内存。
23 |
24 | 我们经常会在图书馆遇到这种情况,书是一排接一排摆放着,但是其中能看的却不多。而在为数不多能看的好书中,大多都是被借走了,有些坏淫还经常借着不还。这个时候还想看中意的书的话一般可分为两种渠道——到电商那买和网上下载。对于穷学生党来说,我想大多数人会选择后者... 这也就是 Title 样章打上引号的原因啦 ,,Ծ‸Ծ,, 虽然以下提供了一些「歪门邪道」供大家能看到好的教材,但还是想呼吁大家尽可能支持原创作者的心血和版权,一本好的教材需要作者付出非常多的精力。
25 |
26 | 最近想要下载到有版权的书籍是越来越难了,各大国内网盘的公开分享纷纷叫停,形势是越来越严峻,但是漏网之鱼总还是有的。
27 |
28 | * 国内大家网论坛的[计算机专区](http://club.topsage.com/forum.php?gid=2)有不少经典教材的高清影印版。
29 | * [Library Genesis](http://libgen.org/),http://gen.lib.rus.ec, http://free-books.us.to, http://ebookfi.org, http://libgen.info, http://bookos.org/ 一些下载不到的英文原版教材这里可以下载到,缺点是速度很慢,用国外的VPS也许能好点。
30 | * [在线图书馆](http://english.tebyan.net/newindex.aspx?pid=31171&ParentID=1989&Language=3) - 部分经典外文书籍可以在线阅读。
31 | * [网盘搜索,盘搜一下](http://www.pansou.com/),整合了国内和国外诸多网盘的文件索引,简直是丧心病狂!
32 | * ~~[皮皮书屋](http://www.ppurl.com/)~~,有很多不错的电子书。**网站现已关闭。**
33 | * [mLook 精校电子书](http://mlook.mobi/),有豆瓣插件,里边有很多质量很高的各类电子书,很多都是对Kindle友好的mobi格式。不过现在已经封闭公开注册了。
34 | * 使用 Google 的站内搜索和指定文件后缀名功能,更快锁定目标。
35 |
36 |
--------------------------------------------------------------------------------
/chapter6-useful-tools/search-engine.md:
--------------------------------------------------------------------------------
1 | # 高效使用搜索引擎
2 |
3 | 这里以 Google 为例,其它搜索引擎较之实在是相差甚远,不提也罢。
4 |
5 | 为了提升搜索的效率,Goolge官方甚至专门安排了一系列课程教大家更好地使用他们家的搜索功能。[Search Education – Google](http://www.google.com/insidesearch/searcheducation/index.html),以下就比较常用的能提高搜索效率的方法逐一举例进行说明。
6 |
7 | ### Picking the right search terms
8 |
9 | #### What Matters in a Query?
10 |
11 | 1. Every word matters - 每一个关键词都重要
12 | 2. Order matters - 关键词顺序不同搜索结果也不一样
13 | 3. Capitalization does not matter - 字母大小写不影响
14 | 4. Punctuation does not matter - 标点符号不影响(特殊字符除外,如C++, C#)
15 | 5.
16 |
17 | 1. 找出独特的关键字
18 | 2.
19 |
20 |
21 | #### 站内搜索
22 |
23 | #### 指定文件后缀名
24 |
--------------------------------------------------------------------------------
/chapter6-useful-tools/text-editor.md:
--------------------------------------------------------------------------------
1 | # 文本编辑器
2 |
3 | 在节 [不会Coding如何破?](../chapter3-advanced-programming-part1/README.html#sec-coding)中提到:「一旦算法(伪代码)描述齐备,程序编写不过是打字校对的工作。」咱们平时学习工作都非常讲究效率,那么「打字校对」的工作是不是也可以也有一些比较好的办法来提高效率呢?答案是肯定的!一些聪明的程序员早已想好了各种办法来提高Coding的效率,其中之一便是选择一款适合自己的高效Text Editor(用来输入程序代码的玩意儿,称为文本编辑器)。
4 |
5 | Windows下大家最常见的恐怕就是记事本程序咯,够小巧,但我想应该没几个人愿意一直用这玩意儿吧?输几行代码进去它似乎什么反应也没有,代码高亮也没有。Linux 下最普通的便是 nano 了。不过比起下面即将出场的两位大神恐怕他们都得往一边站,OK,该轮到Vim和Emacs出场了。
6 |
7 | * Vim-the god of editors
8 | * Emacs-the god’s editor
9 |
10 | ## Vim-Vi IMproved
11 |
12 | Vim是从vi发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。开始学习的时候可能会进展缓慢,但是一旦掌握一些基本操作之后,能大幅度提高编辑效率。左耳朵耗子写的[Vim系列教程](http://coolshell.cn/tag/vim)十分不错。其中最适合入门的非[简明 Vim 练级攻略](http://coolshell.cn/articles/5426.html)莫属。下面放一张[给程序员的VIM速查卡](http://coolshell.cn/articles/5479.html#more-5479).
13 |
14 | 
15 |
16 | 最后再力荐下BeiYuu的[Git时代的VIM不完全使用教程](http://beiyuu.com/git-vim-tutorial/),使用Vundle管理Vim插件太惬意了。
17 |
18 | ## Emacs-Editor MACroS
19 |
20 | Emacs即Editor MACroS(宏编辑器),是一种文本编辑器,在程序员和其他以技术工作为主的计算机用户中广受欢迎。由于我不是Emacs用户,相关入门教程啥的还请Emacs党补充...
21 |
22 | ## Sublime Text
23 |
24 | 除了以上两款神器,最近几年还冒出了个新一代神器——[Sublime Text: The text editor you'll fall in love with](http://www.sublimetext.com/)。简洁美观,上手特别容易,第三方插件也是异常丰富!觉得 Vim 和 Emacs 学习曲线太抖的可以尝试下这款性感的编辑器,不过得小声地说一句这款编辑器是商业软件,虽然可以免费使用。
25 |
--------------------------------------------------------------------------------
/chapter6-useful-tools/version-control.md:
--------------------------------------------------------------------------------
1 | # 版本控制
2 |
3 | 文本编辑器很好地解决了码字的问题,于是另一个问题来了——在一个项目的开发过程中需要和很多人一起合作,而且随着时间的推进代码会产生多个不同的版本。比较直观的想法是用文件名重命名的方式管理,如`file0.c, file1.c...`, 稍微好点的会用`file-2014-10-05.c...` 这种版本管理方式对于稍微有点规模的项目来说就显得有点太naive了,再说自己改着也蛋疼乳酸是不是?聪明的程序员早已为你想好了解决办法——Version Control(版本控制)! 专业的事情就应该交给专业的工具去解决。于是另一个问题又来了——**版本控制工具那么多,到底哪家强?蓝翔貌似没有版本控制工具啊...** 随便一搜就能发现以下几种:
4 |
5 | 1. [Git](http://zh.wikipedia.org/wiki/Git)
6 | 2. [Subversion](http://zh.wikipedia.org/wiki/Subversion)
7 | 3. [Mercurial](http://zh.wikipedia.org/wiki/Mercurial)
8 |
9 | 整体来讲,版本控制可以分为两种,分布式的和非分布式的 ←\_← 非分布式的可以理解为集中式的,也就是说在使用时必须有一个集中式的服务器。就像军训训练时出队必须向排长报告,这个排长就相当于集中式版本控制工具中的服务器啦。你想啊,你做什么都需要向排长报告,自然是相当不爽对不对π\_π 其中的代表就是Subversion啦。
10 |
11 | 如果这个版本控制的服务器离你十万八千里,而这时恰好某位熊孩纸有事没事拔掉你的网线,摁下路由器的开关——总之就是不能让你不能愉快的连接国外的服务器就是了,那么这个时候团队合作自然是无法愉快地进行下去了。既然和集中式版本控制做不成朋友,那就让我们和土豪分布式版本控制工具做朋友吧!弃Subversion,保平安~
12 |
13 | 就连Subversion本身的开发也已于2014年愚人节转向使用git,噗哈哈哈,投票最后竟然通过了... [[svn1]](#ref-quit-sub) [[svn2]](#git-svn-diff) [[svn3]](#svn-april-fool)
14 |
15 | ## 分布式版本控制工具 - git
16 |
17 | 分布式的好处在于,它可以不像集中式版本控制工具那样依赖中心服务器,开发完全可以在本地进行,不依赖网络。其中的代表就是[Git](http://zh.wikipedia.org/wiki/Git)啦。Git是 Linus Torvalds 继 Linux 之后给全人类带来的另一大神器,骚年颤抖吧!先放一张git在分支和合并方面的大杀器特性给大家醒醒脑,强大伐?
18 |
19 | 
20 |
21 |
22 | ### 实用教程
23 |
24 | 1. [git - 简明指南](http://rogerdudler.github.io/git-guide/index.zh.html),目前见过的最简git指南,原来的英文版被翻译成了各种其他语言,漫画超友爱 ≖‿≖✧
25 | 2. [Git 简要教程](https://gist.github.com/bigeagle/3953973),b哥整理的教程,简洁实用。
26 | 3. [Git分支管理策略](http://www.ruanyifeng.com/blog/2012/07/git.html),阮一峰提供的针对Git分支管理策略。
27 | 4. [Git教程 - 廖雪峰](http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000) - 浅显易懂的git中文教程
28 | 5. [Git Magic](http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/zh_cn/),挺适合入门的教程,文字超友爱 ≖‿≖✧
29 | 6. [Pro Git](http://git-scm.com/book),官方教程,非常全面,简单入门的话先看前几章就够用了。
30 |
31 |
32 | ## Notes
33 |
34 | 1. [svn1] [为什么我们要放弃Subversion](http://www.infoq.com/cn/articles/thoughtworks-practice-partiv)
35 | 2. [svn2] [GIT和SVN之间的五个基本区别 | 外刊IT评论](http://www.vaikan.com/5-fundamental-differences-between-git-svn/)
36 | 3. [svn3] [[INFRA-7524] April Fools: migrate Apache Subversion project over to the git repo - ASF JIRA](https://issues.apache.org/jira/browse/INFRA-7524)
37 |
--------------------------------------------------------------------------------
/chapter7-textbooks/README.md:
--------------------------------------------------------------------------------
1 | # 第七章-教材推荐及其它
2 |
3 | 推荐好书或者在线课程当然是本书的重要任务之一,这次集中推荐一下。主要是C/C++, Python, Java,数据结构算法等教材。其它的大家一起来推荐吧。
4 |
5 | 这些主题中任意一个的教材都是汗牛充栋,读一辈子都读不完。不过很显然,大家都公认的经典,也只是那么寥寥数本而已,下面推荐的都是这样的著作(其实只能说是适合大部分人)。当然,我们推荐的书并不一定适合你,如果有更好的可以提issue或者发pull request。本书所推荐的教材或在线课程不一定都要去读的,可以根据你自己的兴趣和精力去选择。看书其实不是目的,根本还得在于自己去理解、去思考、去应用。
6 |
7 | ## 计算机编程导论类
8 |
9 | ### [Computer Science: An Overview - 计算机科学概论(第11版) (豆瓣)](http://book.douban.com/subject/6862061/)
10 |
11 | 计算机科学概论课程的经典入门教材,涵盖的话题十分广,适合对计算机科学了解不是很多的读者。英文版已经到第11版了,作者的用心程度可见一斑。
12 |
13 | ### [Computer Systems: A Programmer's Perspective - 深入理解计算机系统(原书第2版) (豆瓣)](http://book.douban.com/subject/5333562/)
14 |
15 | CMU的计算机学科类导论教材,作者讲解很细致。面向的对象是对计算机底层有一定了解的读者,以后想往专业程序员方向发展的可以看看。
16 |
17 | ### [Introduction to Computer Science and Programming Using Python | edX.org](https://www.edx.org/course/mitx/mitx-6-00-1x-introduction-computer-2841#.VDKKhXWSzH4)
18 |
19 | An introductory level course in MIT, 6.00.1x is an introduction to computer science as a tool to solve real-world analytical problems. A first course for 6.00.2x below.
20 |
21 | ### [Introduction to Computational Thinking and Data Science | edX.org](https://www.edx.org/course/mitx/mitx-6-00-2x-introduction-computational-2836#.VDKI23WSzH4)
22 |
23 | 6.00.2x is an introduction to using computation to understand real-world phenomena.
24 |
--------------------------------------------------------------------------------
/chapter7-textbooks/algo-data-struct.md:
--------------------------------------------------------------------------------
1 | # 数据结构与算法类
2 |
3 | ## 教材及MOOCs
4 |
5 | ### The Art of Computer Programming
6 |
7 | Author: Donald E. Knuth
8 |
9 | 中文书名:计算机程序设计艺术,简称 **TAOCP** ,号称是经典中的经典,每一个想要掌握算法精髓的人都必须看的书,算法书中的圣经。**镇楼专用,新手请勿当作入门书去读,会吐血的。**
10 |
11 | 说到这本书就忍不住想多介绍下高爷爷的生平。
12 |
13 | 1938年初,高德纳出生于美国威斯康辛州。毕业于加州理工学院的他,目前是美国著名的计算机科学家,并且是斯坦福大学计算机系荣誉退休教授。高德纳的英文全名为:Donald Ervin Knuth。他的中文名是1977年到中国来之前,姚储枫为他取的。Knuth从此用高德纳作为其在Unicode世界的名字。
14 |
15 | TAOCP这套关于算法分析的多卷论著已经长期被公认为经典计算机科学的定义性描述。迄今已出版的完整的三卷(第四卷已有部分出版)已经组成了程序设计理论和实践的惟一的珍贵资源,无数读者都赞扬Knuth的著作对个人的深远影响,科学家们为他的分析的美丽和优雅所惊叹,而从事实践的程序员已经成功地将他的「菜谱式」的解应用到日常问题上,所有人都由于Knuth在书中表现出的博学、清晰、精确和高度幽默而对他无比敬仰。
16 |
17 | 他因这些成就以及大量富于创造力和具有深远影响的著作(19部书,160篇论文)而誉满全球。这么说吧,目前你所能听说过或者还活着的那些计算机软件大牛,没有哪个不直接或间接的受过Knuth的教导。他强悍的程度只用一件小事就可以说明,在撰写这套《计算机程序设计艺术》的过程中,由于感到原有排版系统的不足,他特地重新制作了一套新的计算机排版系统,这套称为TEX的东西目前已经是出版界的标准系统。
18 |
19 | 1968年,刚刚进入Stanford的高德纳开始准备出版经典巨著《计算机程序设计艺术》,据说当时他一口气写了3000页,自此他计划写七卷(目前已经完成四卷)。这七卷分别为:基础算法、半数值算法、排序与查找、组合算法、造句算法、与上下文无关语言理论、编译器技术。1999年底,该书被美国科学家期刊列为20世纪最佳12部学术专著之一。
20 |
21 | 建议到豆瓣和Amazon上仔细看看评论或者看看印刷版,这一套书虽然很多人都极力推崇,但并不见得他们都看过,个人觉得中文翻译的看起来有点别扭,建议还是看英文原版的好了。**纸上得来终觉浅,绝知此事要躬行。**
22 |
23 | ### [Introduction to Algorithms - 算法导论 (豆瓣)](http://book.douban.com/subject/20432061/)
24 |
25 | 麻省理工学院计算机系的算法教材,已经成为世界范围内广泛使用的大学教材和专业人员的标准参考书。书很厚,适合当作工具书来使,看的时候可以结合MIT的课程讲义和视频。具体的讲义视频链接后再补充。
26 |
27 | 以上两本都是重量级的算法书,下面推荐一些轻量级的书。
28 |
29 | ### [Algorithms - 算法(第4版) (豆瓣)](http://book.douban.com/subject/19952400/)
30 |
31 | Robert Sedgewick在算法方面写了不少好书,这本是他最近在算法书方面的大作,也是他所有算法书中读者评价最好的一本了,使用Java实现,之前有写过用C/C++实现的算法书。Coursera上将该书的内容分为了两个部分,[Algorithms, Part I | Coursera](https://www.coursera.org/course/algs4partI) 和 [Algorithms, Part II | Coursera](https://www.coursera.org/course/algs4partII) ,书中内容极其详细,中文版的没看过,但是英文原版的排版超级赞!
32 |
33 | ### [Problem Solving with Algorithms and Data Structures using Python](http://interactivepython.org/courselib/static/pythonds/index.html)
34 |
35 | Python党的福利,作者免费在网上发布了电子版供大家阅读。用Python来写算法书的目前还不多,有其他好书推荐的可以发PR。
36 |
37 | 下面介绍一些用C/C++来写算法书的教材。
38 |
39 | ### [Algorithms in C++, Parts 1-4: Fundamentals, Data Structure, Sorting, Searching](http://www.amazon.com/Algorithms-Parts-1-4-Fundamentals-Structure/dp/0201350882/ref=sr_1_2?ie=UTF8&qid=1412603287&sr=8-2&keywords=Algorithms+Robert+Sedgewick)
40 | ### [算法I~IV(C++实现)――基础、数据结构、排序和搜索 (豆瓣)](http://book.douban.com/subject/1143801/)
41 |
42 | ### [Algorithms in C, Parts 1-4: Fundamentals, Data Structures, Sorting, Searching](http://www.amazon.com/Algorithms-Parts-1-4-Fundamentals-Structures/dp/0201314525/ref=sr_1_2?ie=UTF8&qid=1412603571&sr=8-2&keywords=Algorithms+in+C)
43 | ### [算法:C语言实现 (豆瓣)](http://book.douban.com/subject/4065258/)
44 |
45 | C和C++的算法实现是 Robert Sedgewick较为早期的大作,虽然名气不及Java实现的那本,但如果看C或C++实现的算法书的话这两本还是不错的。Robert Sedgewick 在Princeton教了蛮久的书了。
46 |
47 | ## OJ
48 |
49 | * [一些主流的编程竞赛网站 - 灵魂机器](http://cn.soulmachine.me/blog/20130322/) - 对各OJ进行了对比。
50 | * [USA Computing Olympiad](http://www.usaco.org/)
51 | * [qiwsir/algorithm](https://github.com/qiwsir/algorithm) - 老齐收集的一些算法题,大量使用Python
52 |
53 |
54 | **待完善**
55 |
56 | Online Judge系统(简称OJ)是一个在线的判题系统。用户可以在线提交程序多种程序(如C、C++、Pascal)源代码,系统对源代码进行编译和执行,并通过预先设计的测试数据来检验程序源代码的正确性。[2]
57 |
58 | OJ的题目大部分是关于算法的。题目的输入输出通常是命令行方式,而非图形界面。也就是说,要关注的不是平台的兼容性、文件的格式抑或窗口的布置这种无关紧要的细节,而是问题本身的逻辑实现。
59 |
60 | 一个用户提交的程序在Online Judge系统下执行时将受到比较严格的限制,包括运行时间限制,内存使用限制和安全限制等。用户程序执行的结果将被Online Judge系统捕捉并保存,然后再转交给一个裁判程序。该裁判程序或者比较用户程序的输出数据和标准输出样例的差别,或者检验用户程序的输出数据是否满足一定的逻辑条件。最后系统返回给用户一个状态:通过(Accepted, AC)、答案错误(Wrong Answer, WA)、超时(Time Limit Exceed, TLE)、超过输出限制(Output Limit Exceed, OLE)、超内存(Memory Limit Exceed, MLE)、运行时错误(Runtime Error, RE)、格式错误(Presentation Error, PE)、或是无法编译(Compile Error, CE),并返回程序使用的内存、运行时间等信息。
61 |
62 | Online Judge系统最初使用于ACM-ICPC国际大学生程序设计竞赛和OI信息学奥林匹克竞赛中的自动判题和排名。现广泛应用于世界各地高校学生程序设计的训练、参赛队员的训练和选拔、各种程序设计竞赛以及数据结构和算法的学习和作业的自动提交判断中。
63 |
64 | 以下几个OJ都很不错,请随意进入,也可以自行搜索,国内很多学校的OJ正在热火朝天的建设中,有的甚至直接作为了考试用系统。
65 |
66 | 搜搜百科上有一篇文章介绍得不错,[OJ](http://baike.soso.com/v708668.htm)
67 |
68 | 一个人孤单做题的滋味是很郁闷的,尤其是当你确实绞尽脑汁也搞不定的时候。幸好线上还是有很多同样在做题的朋友,他们通常会在论坛BBS或邮件列表之类的地方集中讨论解题心得,甚至有可用的答案。建议用OI (Olympiad in Informatics 信息学奥林匹克)[3]为关键字搜索。
69 |
70 | 哪里有代码示例可看?这个可以自己Google, 如果你已经能够做一些OJ的题了,那么可以考虑看一些开源软件的代码。http://sourceforge.net 上有很多开源软件,确定一个应用主题上去找就会有收获。不过说实话,从OJ到项目是有一定的跨越,所以要找到适合自己的项目来看是不容易的。可以尝试和他人合作做一些小型的项目[4],边学边用,或者是找一些知名的但又比较小规模的项目,然后找他的早期版本的代码,会比较清晰,比如 vim1.0/2.0 lua1.0 apache1.0这种。
71 |
72 |
--------------------------------------------------------------------------------
/chapter7-textbooks/android.md:
--------------------------------------------------------------------------------
1 | # Android开发
2 |
3 | * [How to Develop Android Apps Online Course - Udacity](https://www.udacity.com/course/ud853)
4 |
--------------------------------------------------------------------------------
/chapter7-textbooks/c-plusplus.md:
--------------------------------------------------------------------------------
1 | # C++编程
2 |
--------------------------------------------------------------------------------
/chapter7-textbooks/c-programming.md:
--------------------------------------------------------------------------------
1 | # C语言编程
2 |
3 | ## 初阶读物
4 |
5 | ### Linux C/C++编程一站式学习
6 |
7 | 作者:宋劲杉
8 |
9 | 个人很喜欢这本书,同时又是「一站式」学习,在Linux下结合此书学习C/C++高效,所以就放在第一本了。
10 |
11 | 此书内容涵盖极广:C的基本语法、简单的数据结构与算法、C与汇编的联系、计算机系统结构、操作系统、正则表达式、TCP/IP 以及 Linux 系统编程,无所不包。从该书网站最新的内容来看,作者正在添加C++及动态语的部分,赞!
12 |
13 | 如此一来似乎样样通而样样不精,其实不是这么回事。作者将内容穿插得非常好,用十分简明的方式把每个方面最重要的东西都阐明清楚了。所以,其实这是本入门书,当然也适合各个方面都有所了解之后用。
14 |
15 | 11年3月该作者又出版了《一站式学习C编程》(升级版),弱化了Linux和嵌入式的方向性,而且也变的更适合零基础读者阅读,在「它和前一版有什么不同」中作者有这么一段话:「虽然我在上一版中信誓旦旦地说这是一本面向完全零基础读者的书,但现实教育了我,要写出一本让任何零基础读者都看得懂的书是一门复杂的系统工程,我只能努力接近这个目标,而永远达不到这个目标。」很幸运的是这本编程导论小册子弥补了这一点O(∩\_∩)O哈哈~
16 |
17 | 作者在出国后在原来的《Linux C编程一站式学习》基础上更新,并以中英双语写作——[Learning Linux C/C++ Programming from Scratch](http://songjinshan.com/akabook/),英文版目前在写第四部分——[from C to C++](http://songjinshan.com/akabook/en/index.html)。完整的旧版本见 [Linux C编程一站式学习](http://akaedu.github.io/book/)。国内能有如此对自己作品负责的技术作者实在是不多见,力荐!
18 |
19 | ### C Programming: A Modern Approach
20 |
21 | Author: K. N. King
22 |
23 | 中文书名:[C语言程序设计:现代方法 (豆瓣)](http://book.douban.com/subject/4279678/)
24 |
25 | 书如其名——现代方法,讲解了一些适应现代大规模编程的方法。这本书的第一版有超过225所学校用过,比如MIT, Stanford, UC Berkeley, Caltech等等牛校。第二版新增了很多内容,当然,书也厚了很多,很多... 书中内容讲解清晰,译作质量也很好,适合自学用的教材。
26 |
27 | ### C Primer Plus
28 |
29 | Author: Stephen Prata
30 |
31 | 中文书名:无
32 |
33 | C语言的百科全书,既有深度又有广度,可以作为工具书使用。典型的国外教材,非常非常厚,厚到有点让你觉得罗嗦。
34 |
35 | 第6版已经在国外出版,包含了最新的C11标准的介绍。不过目前来看C99才是最普遍的呐。
36 |
37 | 本书第五版的中文翻译版**翻译质量超级烂**,如果你不慎买了这本书,送人会误人子弟,烧了会污染环境,就当废纸用好了。想办法去弄一本英文原版的吧,具体方法我才不会告诉你哩。
38 |
39 | ## 进阶读物
40 |
41 | 在没有读完初阶读物前最好不要来读此类书籍,否则身心将受到巨大的摧残。
42 |
43 | ### The C Programming Language 2nd edition
44 |
45 | Author: Brian W. Kernighan, Dennis M. Ritchie
46 |
47 | 中文书名:[C程序设计语言:第2版•新版 (豆瓣)](http://book.douban.com/subject/1139336/)
48 |
49 | 此书简称K&R,由C语言的创建者撰写,其品质毋庸置疑。写的十分精简,不过并不适合入门,对于那些已经对C有一定了解之后的人来说是一种享受。
50 |
51 | ### C Programming FAQs: Frequently Asked Questions 2nd edition
52 |
53 | Author: Steve Summit
54 |
55 | 中文书名:[你必须知道的495个C语言问题 (豆瓣)](http://book.douban.com/subject/3422332/)
56 |
57 | 本书是Summit以及C FAQ在线列表的许多参与者多年心血的结晶,是C语言界最为珍贵的财富之一。适合对C有一定了解和一定编程实践后再来看, 1995年出版了该书的英文第二版,中文版算是第一版吧,2009年出的,所以说与英文原版有较大改进。
58 |
59 | ### Expert C Programming
60 |
61 | Author: Peter van der Linden
62 |
63 | 中文书名:[C专家编程 (豆瓣)](http://book.douban.com/subject/2377310/),中文译者:徐波
64 |
65 | 书的内容虽然很有深度,涵盖范围也很广,但是作者语言幽默,读起来还是不那么枯燥的。
66 |
67 | ### Pointers on C
68 |
69 | Author: Kenneth Reek
70 |
71 | 中文书名:[C和指针 (豆瓣)](http://book.douban.com/subject/3012360/),中文译者:徐波
72 |
73 | 同上,中文译者仍为徐波,翻译过来的读起来偶尔会有点拗口,全书通过指针这根主线来组织,但内容其实大大超过了指针的范畴,涵盖了很多C语言的高级话题。
74 |
75 | ### C Traps and Pitfalls
76 |
77 | Author: Andrew Koenig
78 |
79 | 中文书名:[C陷阱与缺陷 (豆瓣)](http://book.douban.com/subject/2778632/)
80 |
81 | 书很薄,英文原版是1989年1月11日出版的,那时候ANSI标准都还没出来。可想而知,书中所提到的缺陷已经在C89 & C99中得到了相当的改善,所以看之前得对C89 & C99有所了解才能吸收最大的价值。书虽然很老了,但是其中的思想大家还是可以借鉴的。
82 |
83 | ### C: A Reference Manual
84 |
85 | Author: Samuel P. Harbison & Guy L. Steele
86 |
87 | 中文书名:[C语言参考手册 (豆瓣)](http://book.douban.com/subject/2132084/)
88 |
89 | 适合在写程序的时候作为参考,对每一条函数都有C89 & C99等详细使用区别。
90 |
91 | ### The Standard C Library
92 |
93 | Author: P.J. Plauger
94 |
95 | 中文书名:[C标准库 (豆瓣)](http://book.douban.com/subject/3775842/)
96 |
97 | 英文原版是1991年1月11日出版的,中文翻译版是2009年7月出版的。本书精辟地讲述了每一个库函数的使用方法和实现细节,同时还给出了实现和测试这些函数的完整源代码。
98 |
99 | ### Writing Solid Code
100 |
101 | Author: Steve Maguire
102 |
103 | 中文书名:[编程精粹 (豆瓣)](http://book.douban.com/subject/3406939/)
104 |
105 | 英文原版是1993年1月1日出版的,2009年人民邮电出了中文翻译版,1993年电子工业出版社出的基本没有了。
106 |
107 | 本书篇幅不长,主要讲的是微软团队在开发大型软件过程中所总结的经验。
108 |
109 | ### ISO/IEC 9899:1999, Programming languages — C 2nd edition
110 |
111 | 中文书名:ISO C99规范
112 |
113 | 一切关于C语言的疑问,只有一件东西最权威,那就是ISO的规范。但这不是正式出版物,是类似法律文本的技术说明,而且只有英文版。新手阅读,提防吐血而亡。而且即使有ISO 规范,也不见得各编译器都去实现。
114 |
115 | P.S. 前几年发布了C11标准,估计还得过很多年才能普及开来吧。
116 |
--------------------------------------------------------------------------------
/chapter7-textbooks/data-mining.md:
--------------------------------------------------------------------------------
1 | # 数据挖掘/分析
2 |
3 | * 果壳网上一个不错的讨论 - [如何通过自学,成为数据挖掘“高手”?](http://www.guokr.com/question/338135/)
4 | - [Data Scientist 炼成记录-欢迎参与【一亩三分地论坛数据科学版】 - Powered by Discuz!](http://www.1point3acres.com/bbs/thread-76429-1-1.html)
5 |
--------------------------------------------------------------------------------
/chapter7-textbooks/database.md:
--------------------------------------------------------------------------------
1 | # 数据库
2 |
3 | ## MySQL
4 |
5 | * [21分钟 MySQL 入门教程 - wid - 博客园](http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html)
6 | * [MySQL必知必会 (豆瓣)](http://book.douban.com/subject/3354490/)
7 |
8 |
9 | ## NoSQL
10 |
11 | ### MongoDB
12 |
13 | * MongoDB官网 - [MongoDB](http://www.mongodb.org/)
14 | * MongoDB的手册页 - [The MongoDB 2.6 Manual — MongoDB Manual 2.6.4](http://docs.mongodb.org/manual/)
15 | * Mongodb小书 - [karlseguin/the-little-mongodb-book](https://github.com/karlseguin/the-little-mongodb-book),有中文翻译版
16 | * Udacity上的一门视频交互课程 - [Data Wrangling with MongoDB Online Course - Udacity](https://www.udacity.com/course/ud032),注册课程时选择免费类型即可观看。
17 |
--------------------------------------------------------------------------------
/chapter7-textbooks/go.md:
--------------------------------------------------------------------------------
1 | # Golang
2 |
--------------------------------------------------------------------------------
/chapter7-textbooks/gui.md:
--------------------------------------------------------------------------------
1 | # GUI
2 |
--------------------------------------------------------------------------------
/chapter7-textbooks/java.md:
--------------------------------------------------------------------------------
1 | # Java
2 |
3 | ## 初阶读物
4 |
5 | ### [Intro to Java Programming, Comprehensive Version (10th Edition)](http://www.amazon.com/Intro-Java-Programming-Comprehensive-Version/dp/0133761312/ref=sr_1_1?ie=UTF8&qid=1451052402&sr=8-1&keywords=Introduction+to+Java+Programming)
6 |
7 | 中文书名:[Java语言程序设计](http://book.douban.com/subject/6952199/)
8 |
9 | 巨厚的一本书,讲解超详细,尤其是基础算法和排序一章,非常经典!
10 |
11 | ### Core Java™, Volume I–Fundamentals
12 |
13 | 中文书名:[Java核心技术·卷1:基础知识](http://book.douban.com/subject/25762168/)
14 |
15 | 非常非常基础。
16 |
17 | ## 进阶读物
18 |
19 | ### Thinking in Java 4th edition
20 |
21 | Author: Bruce Eckel
22 |
23 | 中文书名:[Java编程思想 (第4版)](http://book.douban.com/subject/2130190/)
24 |
25 | 书如其名——已经上升到了 Thinking 的层次了,适合对语言有一定了解或者有一定计算机编程功底的人看。这本书给我的感觉是讲解清晰,又不失深度。中文版翻译质量还行,纸张虽然薄了一点,不过好像比较耐翻,可以购买。
26 |
27 | ### Core Java™, Volume II–Advanced Features
28 |
29 | 中文书名:[Java核心技术(卷2):高级特性](http://book.douban.com/subject/25841326/)
30 |
31 | ### [Effective Java](http://book.douban.com/subject/3998727/)
32 |
33 | Effective系列的书籍,我就不多介绍了,**进阶用**。
34 |
35 | ### [深入理解Java虚拟机(第2版)](http://book.douban.com/subject/24722612/)
36 |
37 | JVM 解析的国人经典之作,不只是 JVM 文档的简单翻译,细节讲的非常好。
38 |
--------------------------------------------------------------------------------
/chapter7-textbooks/linux.md:
--------------------------------------------------------------------------------
1 | # Linux
2 |
3 | ## 入门书籍
4 |
5 | [鸟哥的Linux 私房菜](http://linux.vbird.org/) - 一边在线阅读,一边实际动手操作。
6 |
--------------------------------------------------------------------------------
/chapter7-textbooks/machine-learning.md:
--------------------------------------------------------------------------------
1 | # 机器学习
2 |
3 | * [Github上网友总结的机器学习和深度学习资料](https://github.com/ty4z2008/Qix/blob/master/dl.md)
4 | * [国外网友整理的机器学习资源大全 - josephmisiti/awesome-machine-learning](https://github.com/josephmisiti/awesome-machine-learning)
5 | * [上述资源的翻译版](http://blog.jobbole.com/73806/)
6 |
--------------------------------------------------------------------------------
/chapter7-textbooks/misc.md:
--------------------------------------------------------------------------------
1 | # 杂项
2 |
3 | ## 算法 & 面试
4 |
5 | - [各类题解 - Acm之家,专业的ACM学习网站](http://www.acmerblog.com/)
6 | - [有哪些学习算法的网站推荐? - 知乎](http://www.zhihu.com/question/20368410)
7 | - [九章算法 | 帮助更多的中国人找到好工作,美国硅谷一线工程师实时在线授课](http://www.ninechapter.com/)
8 | - [七月算法 - julyedu.com](http://julyedu.com/)
9 | - [Woodstock Blog](http://okckd.github.io/) - IT,算法及面试。有知识点及类型题总结
10 | - [leetcode题解 - C++实现](downloads/leetcode-cpp.pdf)
11 | - [LeetCode题解 - GitBook](https://www.gitbook.com/book/siddontang/leetcode-solution/details)
12 | - [结构之法 算法之道](http://blog.csdn.net/v_JULY_v)
13 | - [julycoding/The-Art-Of-Programming-By-July](https://github.com/julycoding/The-Art-Of-Programming-By-July)
14 | - [程序员面试、算法研究、编程艺术、红黑树、数据挖掘5大系列集锦](http://blog.csdn.net/v_july_v/article/details/6543438)
15 | - [POJ的部分题解 - Category: POJ | Beeder's Blog](http://beeder.me/categories/POJ/)
16 |
17 | ### 其它
18 |
19 |
20 | 待整合完善
21 |
22 | 本小节主要介绍相关学习资源及网站
23 |
24 | * [Beginner's Guide to Programming - guidetoprogramming.com](http://www.guidetoprogramming.com/joomla153/)
25 | * [如何学习一门新的编程语言](http://learnpythonthehardway.org/book/next.html#how-to-learn-any-programming-language)
26 | * [lambda算子简介1.a - 负暄琐话 - 博客频道 - CSDN.NET](http://blog.csdn.net/g9yuayon/article/details/759778)
27 | * [Learn by Doing - Code School](https://www.codeschool.com/) - 在线编程学习网站,Web开发和iOS方面的教程较多
28 | * [Learn to code | Codecademy](http://www.codecademy.com/) - 交互式的编程学习,和codeschool类似,但大多为免费,内容简单
29 | *
30 | * [免费的编程中文书籍索引](https://github.com/justjavac/free-programming-books-zh_CN)
31 | * …待完善
32 |
33 | ## Blog
34 |
35 | 技术博客及原创文章分享。
36 |
37 | - [IBM developerWorks 中国 : 文档库](http://www.ibm.com/developerworks/cn/views/global/libraryview.jsp) - 翔实易懂的技术文章,可以指定专区查看文档,还可以使用RSS订阅阅读新文章。
38 | - [Brave New Geek | Introspections of a software engineer](http://www.bravenewgeek.com/)
39 | - [酷壳](http://coolshell.cn) - 享受编程和技术带来的快乐
40 | - [老齐的技术资料](https://github.com/qiwsir/ITArticles) - 涵盖了程序开发的方方面面
41 | - [shell909090/slides-一些很不错的分享](https://github.com/shell909090/slides)
42 | - [Deep learning:四十三(用Hessian Free方法训练Deep Network) - tornadomeet - 博客园](http://www.cnblogs.com/tornadomeet/p/3267454.html) - 博主写了很多机器学习方面的博文,几乎都有参考链接,可读性比较好。
43 |
44 |
45 | ### Notes
46 |
--------------------------------------------------------------------------------
/chapter7-textbooks/network.md:
--------------------------------------------------------------------------------
1 | # Network(计算机网络)
2 |
3 | 本节主要参考陈硕的网络编程学习经验,特此鸣谢,后文附原文链接及文档。
4 |
5 | ## 初阶读物
6 |
7 | * 中文书名:[计算机网络:自顶向下方法](http://book.douban.com/subject/1391207/),从应用层着手介绍计算机网络,例子也比较生动,适合入门科普(想深入学习的建议直接从底下Stevens的书籍入手)。中文译作质量不错,Andrew S. Tanenbaum的 *Computer Networks* 则是自下而上介绍计算机网络的,两本书行文风格差异较大,个人推荐 James F.Kurose 的 *Computer Networking: A Top-Down Approach*。
8 | * [TCP/IP Illustrated Volumn 1](http://www.pcvr.nl/tcpip/) - Stevens 的经典技术书籍,是网络编程方面必读的入门经典。第三版有较大改动(此时Stevens已故),第三版中的TCP部分值得关注,其他章节阅读第二版即可,第二版部分章节的内容已经十分陈旧,不必阅读。
9 | * [TCP/IP Illustrated, Vol. 1: The Protocols](http://freecomputerbooks.com/TCP-IP-Illustrated-Vol-1-The-Protocols.html) - 上述书籍的附加资源链接。
10 |
11 | ## 进阶
12 |
13 | * [UNIX Network Programming, Volume 1](http://www.unixnetworkprogramming.com/) - 书籍网站。
14 | * [UNIX网络编程](http://book.douban.com/subject/1500149/) - 译作质量很高。
15 | * [Jon Snader's Home Page](http://home.netcom.com/~jsnader/) - 有 *Effective TCP/IP Programming* 一书的介绍及勘误。本书为专家经验总结类。
16 |
17 | ## 高阶
18 |
19 | * [Pattern-Oriented Software Architecture: Patterns for Concurrent and Networked Objects](http://www.dre.vanderbilt.edu/~schmidt/POSA/POSA2/) - 总结了开发并发网络服务程序的模式,对UNP是很好的补充。书中强调模块化,业务逻辑和网络通信解耦。代码仅供参考,主要看思想。
20 | * *TCP/IP Illustrated, Vol. 2: The Implementation* - 与现有的Linux相差较大,陈硕的网站上有对Linux下用户态的实现。主要看TCP部分的实现即可。
21 |
22 | ## 其它补充
23 |
24 | * [TCPIP网络编程之四书五经](../downloads/TCPIP网络编程之四书五经.pdf) - 2003年《程序员》杂志上孟岩写的一篇书评。
25 | * [谈一谈网络编程学习经验](../downloads/LearningNetworkProgramming.pdf) - 陈硕写的,原文链接可见 [谈一谈网络编程学习经验(06-08更新)](http://blog.csdn.net/solstice/article/details/6527585)。作者在网络编程方面还是比较有经验的,已有书籍 [Linux多线程服务端编程](http://book.douban.com/subject/20471211/) 出版,里面有不少干货。
26 |
--------------------------------------------------------------------------------
/chapter7-textbooks/operating_system.md:
--------------------------------------------------------------------------------
1 | # Operating System
2 |
3 | 1. [Operating System Concepts Essentials - Second Edition](http://codex.cs.yale.edu/avi/os-book/OSE2/) - OSC作为操作系统的入门书籍内容未免也太多了,作者最近主推Essential版本。电子书/Slides/Study Guide做的真心不错!
4 |
--------------------------------------------------------------------------------
/chapter7-textbooks/python.md:
--------------------------------------------------------------------------------
1 | # Python编程
2 |
3 | ## 初阶读物
4 |
5 | * [Learn Python: the Hard Way](http://learnpythonthehardway.org/book/) - 国外的一个程序员公开的免费Python学习教程,作者倡导从实践中学习,和传统的编程书籍风格迥异,非常适合作为Python入门教程。
6 | * [A Byte of Python](http://www.swaroopch.com/notes/python/) - 同上,也是一本非常适合入门的书,相比上一本书内容更有广度,作者是印度人,写作风格和传统的编书籍类似。
7 | * [零基础学Python](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/index.md) - 老齐写的Python入门教程,有网友整理放到了Gitbooks上,猛戳 [零基础学Python](http://looly.gitbooks.io/python-basic/)
8 | * [Learning Python](http://book.douban.com/subject/22139956/) - 相对于前几本书来说,这本书还是有一定深度的。从书的厚度上来看,作者一点也不Pythonic,1000+ 对于Python入门书籍来说实在是太厚太厚了!!其实作者在书中不只是简单地介绍了如何使用Python,同时也谈到了其背后的设计思想以及一些最佳实践,对于编程初学者来说这类经验等是非常适用的。
9 |
10 |
11 | ## 相关网站
12 |
13 | * [vinta/awesome-python](https://github.com/vinta/awesome-python) - 如果要从侧面说明Python的强大,看看这个就好了。
14 | * [Python For Beginners | Python.org](https://www.python.org/about/gettingstarted/) - 官网给初学者整理的资料,权威性毋庸置疑。
15 | * [Pythoner | 你像从前一样的Python学习笔记](http://www.pythoner.com/) - 一系列与Python有关的原创笔记。
16 | * [啄木鸟社区Wiki](http://wiki.woodpecker.org.cn/moin/) - 国内一个关于Python介绍及相关学习非常全面的一个网站。
17 | * [优秀Python学习资源收集汇总 - Alexia(minmin)](http://www.cnblogs.com/lanxuezaipiao/p/3543658.html)
18 | * [revolunet/PythonBooks](https://github.com/revolunet/PythonBooks) - Directory of free Python ebooks, 部分书籍有点老。
19 | * [Presentations by PyCon 2014 // Speaker Deck](https://speakerdeck.com/pycon2014) - Pycon 2014国外的一些分享。
20 | * [IPython Notebook: 交互计算新时代 | Mind on Mind](http://mindonmind.github.io/2013/02/08/ipython-notebook-interactive-computing-new-era/)
21 |
--------------------------------------------------------------------------------
/chapter7-textbooks/spark.md:
--------------------------------------------------------------------------------
1 | # Spark
2 |
3 | * [Hadoop Spark学习小结[2014版]](http://dongfeiwww.com/hadoop/2014/08/15/spark/)
4 | * [Spark Overview - Spark Documentation](https://spark.apache.org/docs/latest/) - Spark官方文档
5 | * [Spark Programming Guide - Spark Documentation](https://spark.apache.org/docs/latest/programming-guide.html) - 简短的手册
6 | * [Spark Training Resources – Databricks](http://databricks.com/spark-training-resources) - Spark相关资料汇总
7 | * [Learning Spark](https://www.safaribooksonline.com/library/view/learning-spark/9781449359034/) - 预览版
8 |
--------------------------------------------------------------------------------
/chapter7-textbooks/web-back-end.md:
--------------------------------------------------------------------------------
1 | # Web-后端
2 |
--------------------------------------------------------------------------------
/chapter7-textbooks/web-front-end.md:
--------------------------------------------------------------------------------
1 | # Web-前端
2 |
3 | ## 初阶读物
4 |
5 | ### Head First HTML and CSS
6 |
7 | Head First系列里口碑还不错的一本HTML 和 CSS方面的入门书,内容浅显易懂。书中有非常多的例子,可以一边看书一边在浏览器内看看效果。
8 |
9 | ## 前端框架
10 |
11 | * [yahoo/pure](https://github.com/yahoo/pure)
12 | * [twbs/bootstrap](https://github.com/twbs/bootstrap)
13 | * [Angular directives for Bootstrap](http://angular-ui.github.io/bootstrap/)
14 | * [Styleguide & Boilerplate Patterns](https://docs.google.com/spreadsheet/ccc?key=0AiN0QfBTPpOCdDFjWlM0eU1ra21XanZkekxGbjA2WWc#gid=0) - 各框架的细节对比
15 | * [8 Twitter Bootstrap Alternatives](http://modernweb.com/2014/02/17/8-bootstrap-alternatives/)
16 |
--------------------------------------------------------------------------------
/conf/qiniu_sync.json:
--------------------------------------------------------------------------------
1 | {
2 | "src": "/home/travis/upload",
3 | "dest": "qiniu:access_key=AccessKey&secret_key=SecretKey&bucket=docs4bill&key_prefix=doc/",
4 | "deletable": 0,
5 | "debug_level": 1
6 | }
7 |
--------------------------------------------------------------------------------
/downloads/.DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billryan/programming-notes/b9d54177d591a0898915e75e4b5dddb1e5b6878b/downloads/.DS_Store
--------------------------------------------------------------------------------
/downloads/Beginner 1- Picking the right search terms.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billryan/programming-notes/b9d54177d591a0898915e75e4b5dddb1e5b6878b/downloads/Beginner 1- Picking the right search terms.pdf
--------------------------------------------------------------------------------
/downloads/LearningNetworkProgramming.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billryan/programming-notes/b9d54177d591a0898915e75e4b5dddb1e5b6878b/downloads/LearningNetworkProgramming.pdf
--------------------------------------------------------------------------------
/downloads/TCPIP网络编程之四书五经.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billryan/programming-notes/b9d54177d591a0898915e75e4b5dddb1e5b6878b/downloads/TCPIP网络编程之四书五经.pdf
--------------------------------------------------------------------------------
/downloads/leetcode-cpp.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billryan/programming-notes/b9d54177d591a0898915e75e4b5dddb1e5b6878b/downloads/leetcode-cpp.pdf
--------------------------------------------------------------------------------
/images/.picasa.ini:
--------------------------------------------------------------------------------
1 | [suanpan.jpg]
2 | backuphash=49544
3 | crop=rect64(3d72aaaf74bd65b)
4 | filters=crop64=1,3d72aaaf74bd65b;
5 |
--------------------------------------------------------------------------------
/images/1280px-Blue-punch-card-front-horiz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billryan/programming-notes/b9d54177d591a0898915e75e4b5dddb1e5b6878b/images/1280px-Blue-punch-card-front-horiz.png
--------------------------------------------------------------------------------
/images/800px-FortranCardPROJ039.agr.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billryan/programming-notes/b9d54177d591a0898915e75e4b5dddb1e5b6878b/images/800px-FortranCardPROJ039.agr.jpg
--------------------------------------------------------------------------------
/images/eniac4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billryan/programming-notes/b9d54177d591a0898915e75e4b5dddb1e5b6878b/images/eniac4.jpg
--------------------------------------------------------------------------------
/images/git-branch-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billryan/programming-notes/b9d54177d591a0898915e75e4b5dddb1e5b6878b/images/git-branch-1.png
--------------------------------------------------------------------------------
/images/gitbook_editor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billryan/programming-notes/b9d54177d591a0898915e75e4b5dddb1e5b6878b/images/gitbook_editor.png
--------------------------------------------------------------------------------
/images/python-big-data.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billryan/programming-notes/b9d54177d591a0898915e75e4b5dddb1e5b6878b/images/python-big-data.png
--------------------------------------------------------------------------------
/images/questions4mind.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billryan/programming-notes/b9d54177d591a0898915e75e4b5dddb1e5b6878b/images/questions4mind.png
--------------------------------------------------------------------------------
/images/suanpan.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billryan/programming-notes/b9d54177d591a0898915e75e4b5dddb1e5b6878b/images/suanpan.jpg
--------------------------------------------------------------------------------
/images/vim_cheat_sheet_for_programmers_print.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/billryan/programming-notes/b9d54177d591a0898915e75e4b5dddb1e5b6878b/images/vim_cheat_sheet_for_programmers_print.png
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "book",
3 | "version": "0.0.0",
4 | "dependencies": {
5 | "gitbook-plugin-disqus": "*",
6 | "gitbook-plugin-ga": "*",
7 | "gitbook-plugin-yahei": "*",
8 | "gitbook-plugin-katex": "*",
9 | "gitbook-plugin-richquotes": "*"
10 | }
11 | }
--------------------------------------------------------------------------------
/part_i_introduction_to_programming/README.md:
--------------------------------------------------------------------------------
1 | # Part I - Introduction to Programming
2 |
3 | 本篇为整个「编程笔记」的第一部分,首先说说篇名吧——*Introduction To Programming*, 中文可以译为*计算机编程导论之 FAQ*,顾名思义,**本部分只准备讨论编程中最为底层最为基础的部分,让初学者能建立起一个自己的最小学习系统。**那么名字后面的 **FAQ** 又是怎么一回事呢?FAQ - Frequently Asked Questions,也就是常见问题解答。这玩意儿通常是一些所谓的高手、前辈和公司的 support 为了节省回答新手的大量简单重复问题所耗费的时间精力而采用的一种手法。一旦完成,对于问与被问双方都轻松省事,效率甚高,实在是居家旅行杀人越货之必备良药。
4 |
5 | 好了,废话少说,让我们进入正文。
6 |
--------------------------------------------------------------------------------