├── .gitignore ├── Makefile ├── README.md ├── doc ├── abilities │ ├── ability_articles.md │ ├── ability_english.md │ └── ability_task_driven.md ├── habits │ ├── habit_checkstyle.md │ ├── habit_know_how.md │ └── habit_pc_management.md ├── knowledge │ ├── knowledge_compiler.md │ ├── knowledge_data_structure.md │ ├── knowledge_microprocessor.md │ ├── knowledge_network.md │ └── knowledge_operating_system.md ├── projects │ ├── project_blog.md │ └── project_opensource.md └── tools │ ├── tool_command.md │ ├── tool_git.md │ ├── tool_google.md │ └── tool_stackoverflow.md └── img ├── BitBucket_1.png ├── BitBucket_2.png ├── Jhipster_1.png ├── ScreenSplit.png ├── algorithms_1.png └── windows_terminal_1.png /.gitignore: -------------------------------------------------------------------------------- 1 | presentation.md 2 | .vscode 3 | 4 | # 在 macOS 上,文件系统会自动在文件里添加隐藏文件 .DS_Store 5 | # 此文件对 git 项目没有用,所以屏蔽 6 | .DS_Store 7 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # make commit ==> 自动提交所有更改 2 | .PHONY : commit 3 | commit : 4 | @echo "这是一个自动提交,当且仅当用来提交全部修改并推送时才使用" 5 | git add . 6 | git commit -m "added opensource article" 7 | 8 | # make push ==> 自动推动到 origin 远程库的 master 分支 9 | .PHONY : push 10 | push : 11 | git push origin master 12 | @echo "推送成功" 13 | 14 | # cp 代表 commit and push 15 | .PHONY : cp 16 | cp: 17 | make commit 18 | make push -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 程序员修炼宝典 2 | 3 | ![GitHub pull requests](https://img.shields.io/github/issues-pr/niudai/How-to-be-a-good-programmer) 4 | ![GitHub issues](https://img.shields.io/github/issues/niudai/How-to-be-a-good-programmer) 5 | 6 | ## 1. 电子书 7 | 8 | 该目录给出了某些电子书的下载链接,他们是**从互联网下载到的**计算机经典教材.。 9 | 10 | `P.S.` URL 里的中文版教材大多数是经典英文教材的**中译本**,由于是扫描版,所以体积较大。我们尽可能地将这些**原版/高清扫描版**添加**电子书签**,并进行 `OCR` 处理,方便学习。 11 | 12 | **如果有任何侵权行为,请及时联系我们的 contributor 进行处理**。 13 | 14 | 这里提供的教材都是入门教程,诸如高级计算机体系结构、高级网络调优、高级编译原理等类教材,暂不过多提供。 15 | 16 | ### 1.1 下载说明 📖 17 | 18 | 为避免版权问题,我们仅提供下载链接。 19 | 20 | 本库会尽量避免提供下载速度非常慢的**百度网盘**下载链接,目前速度非常好的是**天翼云**,所以给出的下载链接基本都是天翼云的**永久无密码链接**,需注册天翼账号并登录,然后直接点击下载。 21 | 22 | 如果遇到以下问题,请直接提 `Issue` 进行反馈。 23 | 24 | - 链接失效问题 25 | - 链接中的电子书与本描述文档不符问题 26 | - 链接中的电子书中有任何**标注**,如「高亮、批注、注释」等问题 27 | 28 | ### 1.2 电子书链接 🔗 29 | 30 | 单击以下超链接即可打开网页,然后点击下载即可。 31 | 32 | 本目录会逐渐完善充实,有需要其他书籍但找不到的朋友,可以提请求,让大家帮你找。 33 | 34 | > **重要提醒**:下面的链接及其简介中,标题中的超链接是该书的**原版链接**,翻译版将会在`该书中文版`字段中给出。 35 | 36 | #### 1.2.1 数学基础 37 | 38 | - [Discrete Mathematics and Its Applications](https://cloud.189.cn/t/7FVVBzyY7Zry) 【`英文原版` | `彩色版` | `带书签` | `English`】 39 | - **简介**:**离散数学**笼统地介绍了许多与计算机相关的数学领域,离散数学并不是「连续数学」即分析学的对立面,而是一个大杂烩,里面什么都有,排序、图论、自动机理论、编码、逻辑等等都被囊括其中。 40 | - **该书中文版**:[《离散数学及其应用》](https://cloud.189.cn/t/yUjaAjMNnqIf) 【`OCR` | `带书签` | `高清扫描`】 41 | 42 | - [Operations Research: Applications And Algorithms](https://cloud.189.cn/t/BR7FJvymEzIb) 【`英文原版` | `彩色版` | `带书签` | `English`】 43 | - **简介**:运筹学是一个涉及过程优化的学问,在数学里是一个大的分支,网络流问题是该领域的研究核心,因为诸如指派、线性规划、整数规划、零一规划、拓扑图问题等,都可以全部或者部分地归为网络流问题。这个领域的问题以及结论非常多,建议非此专业的新手,把这门课当作算法课的补充与延伸,不要过于深入。 44 | - **该书中文版**:**无中文版** 45 | 46 | - [Computational Complexity: A Modern Approach](https://cloud.189.cn/t/mY7RrqAf6RVf) 【`英文原版` | `无书签` | `English`】 47 | - **简介**:可计算理论、计算复杂性理论应该是现代计算机的核心思想,这是阿兰·图灵和丘奇的开创性理论及拓展,学习本门课需要比较强的数学基础,但是这门课不一定是入门者必学的课,但是学了这门课之后,你会对计算机的原理将有更深刻的认视,比如 CPU 为什么需要寄存器,为什么有些问题是不可计算的,为什么计算安全性也能用于实际。由于本门课一般是研究生课程,而且实际应用中的作用不明显,所以不把这门课放在数学基础篇的开头。这本书的作者是著名的计算科学专家阿罗拉。 48 | - **该书中文版**:[《计算复杂性:现代方法》](https://cloud.189.cn/t/FnYZBnmANN3m) 49 | 50 | #### 1.2.2 计算机基础 51 | 52 | - [Computer Systems: A Programmer's Perspective](https://cloud.189.cn/t/RfA3uaauEjim) 【`非英文原版` | `彩色版` | `带书签` | `English`】 53 | - **简介**: 这本书简称 `CSAPP`,是所有入行计算机的人必看的一本「**内功心法**」,也是名校卡耐基·梅隆大学的计算机专业本科生基础教程,常看常新,海内外享誉无数。这本英文彩色版有点问题,不是原版,建议看中文版,对照英文。 54 | - **该书中文版**:[《深入理解计算机系统》](https://cloud.189.cn/t/iEn2MfQZVvMv)【`OCR` | `带书签` | `高清扫描` | `彩色版`】 55 | 56 | - [Computer Networking: A Top-Down Approach](https://cloud.189.cn/t/ree6zaBnYje2) 【`英文扫描版` | `彩色版` | `带凌乱书签` | `English`】 57 | - **简介**:这是计算机网络经典教材,采用自顶向下方法写作,适合大多数人。由于这本书还没有开放授权,所以只能找到一个不太清楚的 PDF 英文版,不过该书的中文版很清楚,也有完美书签。另外,该书的[第六版](https://www.jianguoyun.com/p/DZDtkw0Qw8vpBxjd9b8C)已经开放下载,是英文原版,不介意的新手,可以参阅第六版英文版。 58 | - **该书中文版**:[《计算机网络:自顶向下方法》](https://cloud.189.cn/t/mIzY7rmiUnua) 【`OCR` | `带书签` | `高清扫描`】 59 | 60 | - [Computer Networks: A Systems Approach](https://cloud.189.cn/t/yaaMraEfMrYb) 【`英文原版` | `彩色版` | `带书签` | `English`】 61 | - **简介**:该书与《计算机网络:自顶向下方法》齐名,该书的顺序是自底向上,但是没有花费过多的笔墨介绍物理层。该书对于链路层、网络层、高级网络层、端到端(传输层)的介绍非常详细,可以有助于网络学习者快速建立全局观,而且可以避免沉迷在纷繁的应用层协议里无法自拔。推荐初学者先看这本书。 62 | - **该书中文版**:[《计算机网络:系统方法》](https://cloud.189.cn/t/QbAbainaE3Yb) 【`OCR` | `带书签` | `高清扫描`】 63 | 64 | - [Compilers: Principles, Techniques, and Tools](https://cloud.189.cn/t/nEFVzmR36fm2) 【`OCR` | `带书签` | `高清扫描` | `English`】 65 | - **简介**:这就是大名鼎鼎的编译原理「恐龙书」或「龙书」,另有「虎书」、「鲸书」,但是三本书中唯有龙书最牛 66 | - **该书中文版**:[《编译原理》](https://cloud.189.cn/t/MNBzmynaaiAb) 【`OCR` | `带书签` | `高清扫描`】 67 | 68 | - [Operating System Concepts](https://cloud.189.cn/t/muiuAfmMbq2i) 【`英文原版` | `彩色版` | `带书签` | `English`】 69 | - **简介**:操作系统有很多的经典教材,这本书是其中之一。但是这本书正如其名字所示,着重于概念,对于一些细节和举例,并不是很详细。 70 | - **该书中文版**:[《操作系统概念》](https://cloud.189.cn/t/ruqqArzUfqYb) 【`OCR` | `带书签` | `高清扫描`】 71 | 72 | - [Modern Operation Systems](https://cloud.189.cn/t/emIvMr3EBvaq) 【`英文原版` | `彩色版` | `带书签` | `English`】 73 | - **简介**:这本书的作者是著名的计算机科学家 Tanenbaum,作者名字一般译为**塔嫩鲍姆**,他也是著名的 MINIX 系统的作者。Linux 内核的作者 Linus Torvalds 在他的自传 Just for Fun 里面这样评价塔嫩鲍姆的另一本书:**每个人都会遇到一本改变自己一生的书吧......而安德鲁•坦尼鲍姆所著的书《操作系统:设计与实现》让我脱胎换骨,达到了一个全新的高度,改变了我的一生。** 这本《现代操作系统》更具现代意义,算是 Linus 高度赞誉的那本书的新时代版本。如果你能把这本书通读一遍,相信你肯定可以升华自己的境界。 74 | - **该书中文版**:[《现代操作系统》](https://cloud.189.cn/t/fi2MJjMnUZFb) 【`OCR` | `带书签` | `高清扫描`】 75 | 76 | #### 1.2.3 算法基础 77 | 78 | - [Algorithms](https://cloud.189.cn/t/uIbQRbniQNrm) 【`英文原版` | `彩色版` | `带书签` | `English`】 79 | - **简介**:这本就是大名鼎鼎的「**算法4**」,这本书比《算法导论》简单点,但是学起来更顺手。 80 | - **该书中文版**:[《算法》](https://cloud.189.cn/t/RBvIvurEFNZn) 【`OCR` | `带书签` | `高清扫描`】 81 | 82 | - [Introduction to Algorithms](https://cloud.189.cn/t/FbiuIfNZjMFr) 【`英文原版` | `彩色版` | `带书签` | `English`】 83 | - **简介**:算法导论是算法学习者必备的一本书,内容深度、广度都很大,是进阶选手、基础比较高的学习者所必看的一本算法书。该书给出的都是伪代码,因此比较适合理解原理。 84 | - **该书中文版**:[《算法导论》](https://cloud.189.cn/t/iuqm2aVvemem) 【`OCR` | `带书签` | `高清扫描`】 85 | 86 | - [Computer Organization and Design: The Hardware/Software Interface](https://cloud.189.cn/t/J3YR7nmaAzim) 【`英文原版` | `彩色版` | `带书签` | `English`】 87 | - **简介**:这本书是**计算机原理**界的大牛 Patterson, David A. 的著作,此人是计算机原理界的大佬,更是计算机体系结构(也就是 CPU 原理)的执牛耳者,著名的《计算机体系结构:量化研究方法》也是他的作品。 88 | - **该书中文版**:[《计算机组成与设计:硬件/软件接口》](https://cloud.189.cn/t/INrQ7vnQnaum) 【`OCR` | `带书签` | `高清扫描`】 89 | 90 | #### 1.2.4 UNIX & Linux 91 | 92 | - [Linux Kernel Development](https://cloud.189.cn/t/JvymayYjiE7n) 【`英文原版` | `彩色版` | `带书签` | `English`】 93 | - **简介**:内核开发比较硬,可以参阅。 94 | - **该书中文版**:[《Linux 内核设计与实现》](https://cloud.189.cn/t/y6jENruEbEzm) 【`OCR` | `带书签` | `次高清扫描`】 95 | 96 | - [Harley Hahn's Guide to Unix and Linux](https://cloud.189.cn/t/6jqErmBVvARr) 【`英文原版` | `彩色版` | `带书签` | `English`】 97 | - **简介**:这本书的作者哈雷·哈恩以幽默风趣的口吻讲述了 UNIX / Linux 的前世今生以及常用命令的由来、用法,这本书是入门 UNIX 世界的必读之书,假如你是一个对 UNIX 世界一无所知,只会用 Windows 的小白,那么这本书极其适合你。可惜的是,这本书的中文版绝版了;本书中文版被命名为 《Unix & Linux 大学教程》,实在让人摸不着头脑。 98 | - **该书中文版**:[《Unix & Linux 大学教程》](https://cloud.189.cn/t/MNZr6jB3QRBv) 【`OCR` | `带书签` | `次高清扫描`】 99 | 100 | - [Advanced Programming in the UNIX Environment](https://cloud.189.cn/t/veyiQfYVV7Rj) 【`英文原版` | `彩色版` | `带书签` | `English`】 101 | - **简介**:UNIX 环境是绝大多数计算机从业者绕不开的,如果说 Harley Hahn's Guide to Unix and Linux 是入门者的有趣教程,那么这本书就是深入了解 UNIX 的一本必备之书。这本书作为 UNIX 的先驱 Stevens 的代表作,其价值不可估量。 102 | - **该书中文版**:[《Unix 环境高级编程》](https://cloud.189.cn/t/j2uAFjRZnQny) 【`OCR` | `带书签` | `高清扫描`】 103 | 104 | #### 1.2.5 数据库 105 | 106 | - [Database_System_Concepts](https://cloud.189.cn/t/eAviaifuqqIf) 【`英文原版` | `彩色版`】 107 | - **简介**: 《数据库系统概念》是国外的经典数据库教材,里面关于并发,事务,锁等有细致系统的讲解。 108 | - **该书中文版** [《数据库系统概念》](https://cloud.189.cn/t/b6vUFvmmyi2u) 109 | 110 | ### 1.3 一键下载上述所有电子书 111 | 112 | 对于想收集起这些电子书以供日常翻阅的学习者,可单击此[链接](https://cloud.189.cn/t/mquiQvIZBRza)下载全部电子书。 113 | 114 | ## 2. 工具篇 115 | 116 | - 融入编程地球村:**[Github](doc/tools/tool_github.md)** 与 **[StackOverFlow](doc/tools/tool_stackoverflow.md)** 117 | 118 | ## 3. 个人项目篇 119 | 120 | - **[搭建自己的技术博客](doc/projects/project_blog.md)** 121 | - **[如何参与开源项目](doc/projects/project_opensource.md)** 122 | 123 | ## 4. 个人修养篇 124 | 125 | - **[如何学习英文, 融入英文世界](doc/abilities/ability_english.md)** 126 | - **[观念的转变: 学不如做, 实例驱动](doc/abilities/ability_task_driven.md)**. 127 | - **[学会输出知识, 尝试写文章](doc/abilities/ability_articles.md)** 128 | 129 | ## 5. 工具篇 130 | 131 | - [Git学习](doc/tools/tool_git.md) 132 | - [命令行/快捷键学习](doc/tools/tool_command.md) 133 | 134 | ## 6. 习惯篇 135 | 136 | - [电脑管理篇](https://www.zhihu.com/people/niu-dai-68-44/answers/by_votes) - 维护一个健康的电脑环境 137 | - [代码风格篇](doc/habits/habit_checkstyle.md) - 写出优雅代码 138 | - [视野篇](doc/habits/habit_know_how.md) - 获取更广视野 139 | -------------------------------------------------------------------------------- /doc/abilities/ability_articles.md: -------------------------------------------------------------------------------- 1 | ## 知识输入与输出 2 | 3 | 我不知道大家发现没, 当你学习一个东西的时候, 如果学完马上用语言讲给别人听, 你会学的更好, 而且会发现新问题. 4 | 5 | 很多学习理论都指出, 知识的学习, 输入固然重要, 输出更为重要. 6 | 7 | 输入就是学习别人的知识, 输出就是把自己学会的知识用文字, 语言的形式表达出来, 很多人的学习, 只有输入, 没有输出, 这样的学习肯定是不行的. 8 | 9 | 几乎所有优秀的程序员, 都有攥写技术文章的习惯, 很多时候, 并不是他们什么都懂, 而是他们刚学会了什么, 然后就围绕着这个刚学会的东西, 用自己的语言讲出来, 久而久之, 就会被别人觉得是大牛, 但是他和你的区别, 有可能仅仅是是否输出的区别. 10 | 11 | 那么我建议所有计算机学习者, 都要有写技术文章/读书笔记的习惯, 比如像我, 我一般就直接将自己的技术文章发表在知乎专栏上, 大家也可以发表在自己的个人主页, 其他平台上, 攥写技术文章也可以很好地增加面试官对你的好感. 12 | 13 | 写技术文章的时候, 最好用`MarkDown`哦, 程序员是不需要用`Word`这种东西的, 我们的内容是要方便发表在网站上, `Word`不能直接在网站里显示, 而`MarkDown`可以轻易地转换成`html`格式文件, 在浏览器中显示. 14 | 15 | 我平时写文章, 就在VScode里写Markdown, 然后导入到知乎专栏里, 大家也可以试试. -------------------------------------------------------------------------------- /doc/abilities/ability_english.md: -------------------------------------------------------------------------------- 1 | ## 学和用 - 英文修炼法 2 | 3 | --- 4 | 5 | 你从小学就开始学英语,一直学到大学,不管你的水平是怎么样,你一定思考过一个问题:“学英语到底有啥用?” 6 | 7 | 尤其是那些英语学的不太好的同学们,我曾听过很多论调,说中国人学啥英语,又不出国,也用不上,可是真正到用上英语的时候,他们又说他们看不懂。 8 | 9 | 这个编程世界的主流语言是英语,这个我们必须承认,最大的开源社区是英文,最大的编程问答社区是英文,超过95%的框架,技术文档默认语言是英语。 10 | 11 | 这篇文章面向的读者,主要是那些目前英语水平不好,读各种英文资料吃力,但是又深感英文重要的那些人。 12 | 13 | 在适应英文世界的初期,首先我们要在工具和社区上做出改变: 14 | 15 | - 搜索编程类问题时,放弃中文搜索引擎(尤其是百度),改用英文搜索引擎,国内有 bing 国际版,科学上网可行的话,用 Google。 16 | 17 | - 多进入英文编程社区活动,比如 Github,它本身是个英文社区,如果你经常逛的话,自然就熟了。 18 | 19 | - 学框架和技术的时候,养成上官网看文档和教程的习惯,文档就是 Doc,一般有两种,Reference Doc 和 API Doc,Reference Doc就是教你怎么用,而 API doc 就是一个详细的 API 文档,更加细致,类似于字典,供查阅。 20 | 21 | 接下来,我们要处理一个很现实的问题,在融入英语世界的前期,可能会出现啥也看不懂的局面,如何破解这一局面? 22 | 23 | 我推荐在前期,使用 Google 网页翻译,分屏操作。 24 | 25 | 什么是分屏? 26 | 27 | 分屏就是这样: 28 | 29 | ![Image](../../img/ScreenSplit.png) 30 | 31 | 左边英文,右边中文,对照的看,然后词汇量实在感人的话,可以把生词记一记,这样有中文辅助的看,相当于给你一个拐棍,等你英语好起来了,就可以不看右边的了。 32 | 33 | 分屏([Chrome 插件 Tab Resize](https://chrome.google.com/webstore/detail/tab-resize-split-screen-l/bkpenclhmiealbebdopglffmfdiilejc))快捷键之类的,自己去查吧。 34 | 35 | 即便你英语可能是一个不到四级的水平,但这样做的话,可能不到半年你就熟练了。 36 | 37 | 也可以用[Chrome 插件 彩云小译](https://chrome.google.com/webstore/detail/lingocloud-web-translatio/jmpepeebcbihafjjadogphmbgiffiajh) 每段英文后有中文对照。 38 | 39 | 40 | 后期推荐个[Chrome 插件 沙拉查词](https://chrome.google.com/webstore/detail/%E6%B2%99%E6%8B%89%E6%9F%A5%E8%AF%8D-%E8%81%9A%E5%90%88%E8%AF%8D%E5%85%B8%E5%88%92%E8%AF%8D%E7%BF%BB%E8%AF%91/cdonnmffkdaoajfknoeeecmchibpmkmg) 41 | 42 | 学英语最佳方法就是学以致用,现在学习编程的时候,正好可以用英语了,这不是正好吗? 43 | -------------------------------------------------------------------------------- /doc/abilities/ability_task_driven.md: -------------------------------------------------------------------------------- 1 | ## 实例驱动学习 2 | 3 | 在知识爆炸的年代, 想成为一个好的程序员, 要具备这样一个精神: 4 | 5 | **开发者精神** 6 | 7 | >开发者精神是指, 从学习编程第一天起, 你的目标, 你所做的事, 永远不是以`要学会XX`为目标, 而是以`开发出XX`为目标, 深刻意识到你学习的一切, 最终是为了你的开发而服务的。 8 | 9 | 而开发者精神的反面则是`学生气`: 10 | 11 | **学生气** 12 | 13 | >从学习编程的第一天起, 就把自己当学生, 上课听讲记笔记为第一位, 记忆知识点为第一位, 买教材读教材为第一位, 追求`学会XX`, 而不是`用它开发出XX`。 14 | 15 | 我们举个例子, 假如你要学习Java,`学生气`的学生行为模式: 16 | 17 | 读教材, 听课, 记笔记, 追求把这个语言的每个知识点都记得很清楚, 追求一种"内功"的修炼, 在这个过程中, 从来不想着用它去"创造"什么. 在学习的第一天起, 他给自己定下了一个目标: 18 | 19 | "我这个学期一定要把这个语言的基础打牢, 最后在考试中取得高分, 并且为以后的学习提供更坚实的基础." 20 | 21 | 那么具有`开发者精神`的人会这样做: 22 | 23 | 先大体了解一下Java语言在哪些领域比较强势, 做一个简单的调研, 得出了Java在Web领域很强势这一个信号, 于是在学习Java的第一天起, 他就给自己定下了一个目标: 24 | 25 | "我要在半年内通过学习Java, 运用Java做出一个中小型的, 基于Web的企业管理后台" 26 | 27 | 这两种人, 起点都一样, 都是`完全不会Java`, 但是最后的结果往往是, 后者无论是知识熟练度还是实用性都会超过前者, 而且整个学习过程会有源源不断地动力. 28 | 29 | `夯实基础`这个目标, 其实是空洞的, 什么叫做夯实? 什么叫做基础? 而且就算你真的夯实了基础, 你也极有可能陷入一种`虚无感`中, 因为你的所有知识, 都会遗忘. 30 | 31 | 这就是为什么很多计算机专业学生很爱问的一个问题: 32 | 33 | "学了这么多知识, 忘了怎么办?" 34 | 35 | 如果你具备`开发者精神`, 那么你根本不会理会这个问题, 因为, 你开发出的东西, 你做出的产品, 它就是永久存在在这个世界上的, 你的成就感来源于真实的, 具体的, 可持久延续的项目中, 而不是来源于"我学会了什么". 36 | 37 | 我们一定要明白: 38 | 39 | 一切不谈成就感, 不谈反馈的学习劝导, 都是在耍流氓 40 | 41 | 既然我们想获得反馈, 那么一个很现实的建议就是, 在Github上创建你的第一个开源代码仓库, 长期地, 稳定地commit, 当然, 至于这个仓库到底是干啥的, 这个因人而异, 有可能是你自己开发的一个VScode插件, 有可能是你自己写的读书笔记, 在这个不断地commit的过程中, 感受你的代码仓库不断增长不断完善的过程中, 你会获得一个比较持久的反馈和成就感, 一旦有了反馈和成就感, 那么你的学习动力就会一直保持, 也可以从学习中获得快乐. 42 | 43 | **记住, 你不是学生, 你是开发者.** 44 | 45 | -------------------------------------------------------------------------------- /doc/habits/habit_checkstyle.md: -------------------------------------------------------------------------------- 1 | # 代码风格篇 2 | 3 | ## CheckStyle工具 4 | 5 | 现在几乎所有主流语言都有相应的代码风格检查工具, 一般已IDE或Editor的插件或扩展形式给出, 比如, 我写Java, 那么一些大公司就有关于这个语言的一些风格规范, 我只需这样(以VSCode为例): 6 | 7 | 在插件市场搜索 `Checkstyle for Java`: 8 | 9 | ![Checkstyle](https://i.postimg.cc/0NvsL3qd/youtube.png) 10 | 11 | ## 设计模式 12 | 13 | 设计模式并不是针对任何一种语言, 而是一种用编程语言描述现实世界问题广泛采用的各种模式, 比如, 观察者模式, 工厂模式, 依赖注入模式等. 14 | 15 | 好的设计模式, 是好代码的保证, 只有先学会了设计模式, 才能在软件设计中游刃有余, 而且更现实的问题是, 现在很多框架, 比如Spring, Angular等, 都充斥了大量的设计模式, 比如`Factory Pattern`, `Dependency Injection Pattern`, 你必须理解这些设计模式, 你才能理解这个框架. 16 | 17 | 那么关于设计模式, 我这里推荐两个youtube教程, 这两个教程也是当年小岱学的时候, 靠这个入门的, 讲的很好, 分别是: 18 | 19 | [Derek Banas 设计模式视频教程](https://www.youtube.com/watch?v=vNHpsC5ng_E&list=PLF206E906175C7E07) 20 | 21 | [Christopher Okhravi 设计模式教程](https://www.youtube.com/channel/UCbF-4yQQAWw-UnuCd2Azfzg 22 | ) 23 | 24 | 个人认为设计模式没有必要买本教材, 结合视频和技术文章, 就足以理解和运用. 25 | 26 | ## 小习惯 27 | 28 | 1. 不要嫌变量名长, 最好可以直接通过变量名推测变量的作用. 29 | 2. 重复出现的代码, 封装成独立的类或函数. 30 | 3. 提前降低代码的耦合度, 不同作用, 不同类别的代码, 不要混在一起, 最好分成独立的文件 31 | 4. 将代码进行业务分层, 比如在Web开发中, 有数据层, 服务层, DTO层, Controller层, 渲染层等, 只有将层次分开了, 才能获得足够的可拓展性, 不然代码多了你就全乱了. 32 | 5. 用良好的设计模式去"设计"软件, 在执行一些算法的时候, 可以想一想它的时空复杂度, 想一想怎么可以让它执行地更快. 33 | -------------------------------------------------------------------------------- /doc/habits/habit_know_how.md: -------------------------------------------------------------------------------- 1 | # 如何提升视野 2 | 3 | ## 国内科技自媒体 4 | 5 | 量子位 6 | 7 | ## 国外科技自媒体 8 | 9 | ### Youtube 精选频道 10 | 11 | ### CodeOrg 12 | 13 | ![Image](https://i.postimg.cc/cJtgZ2Tc/youtube.png) 14 | 15 | 质量超高的科普视频, 讲解计算机运行原理, 尤其适合入门: 16 | 17 | ![Image](https://i.postimg.cc/GmxrDQt1/youtube.png) 18 | 19 | 讲解互联网的运行原理: 20 | 21 | ![Image](https://i.postimg.cc/KjtcHyG1/youtube.png) 22 | 23 | 而且讲解人都是**大牛**, 讲的超好懂! 24 | 25 | ### Computerphile 26 | 27 | ![Image](https://i.postimg.cc/L5XrWGjt/youtube.png) 28 | 29 | 提升视野利器: 30 | 31 | ![Image](https://i.postimg.cc/66vS8VY5/youtube.png) 32 | 33 | 擅长一些计算机概念讲解, 和一些技巧科普, 比如数据分析可视化技巧, SQL注入攻击等, 涉猎广泛, 且十分有趣。 34 | 35 | ### JAVA程序员学习站 36 | 37 | ![Image](https://i.postimg.cc/zBncc8LH/youtube.png) 38 | 39 | ![Image](https://i.postimg.cc/28PnVv9m/youtube.png) 40 | 41 | 从`Spring MVC`到`Spring Boot`, 再到设计模式, 一系列教程简直是Java程序员的福音! 42 | 43 | 而且讲的很形象, 很好懂, 但是不建议英语差的同学听, 因为他语速快, 发音不清楚, 可能初学者听不太懂他说话, 但是一旦听懂了就爽到飞起~ 44 | 45 | ### 编程语言知识百科 46 | 47 | [Derek Banas](https://www.youtube.com/user/derekbanas/videos) 48 | 49 | ![Image](https://i.postimg.cc/PqM6WK01/youtube-2.png) 50 | 51 | 从Java到C#, 再到游戏开发, 再到Javascript, 再到日语, 再到设计模式, 再到前端框架, 再到Java EE, 再到Matlab, 这兄弟目前为止在不下十门计算机语言领域制作了质量超高的教程, 在油管上也是被当作神一样的存在, 大家可以瞻仰一下他的播放列表, 看看有多么恐怖: 52 | 53 | ![Image](https://i.postimg.cc/L5s69CFD/youtube.png) 54 | 55 | ![Image](https://i.postimg.cc/Nfd2Hns1/youtube.png) 56 | -------------------------------------------------------------------------------- /doc/habits/habit_pc_management.md: -------------------------------------------------------------------------------- 1 | # 如何管理自己的电脑 2 | 3 | ## 包管理工具 4 | 5 | 为了更好的管理我们的各种应用包,最好使用包管理工具来进行各种包,软件的安装和使用, 方便进行卸载, 更新, 安装, 无需打开浏览器即可完成一系列操作. 6 | 7 | >linux : apt-get (ubuntu distro) 8 | 9 | >osx : brew 10 | 11 | >windows: Chocolatey 12 | 13 | 另外, windows平台上的包管理工具, 在国内的网络环境下经常慢的感人, 所以`Chocolatey`可能使用体验并不好. 14 | 15 | windows平台上的同学, 我推荐使用今年微软新发布的 `WSL2`, 这个东西不是那种传统的虚拟机, 有了它你可以像操作linux系统那样操作windows系统, 而且支持 `docker`, 甚至我推荐以后大家所有命令都可以在`WSL2`里执行. 16 | 17 | ## 容器 - Docker 18 | 19 | 为了更方便的进行开发环境配置,我推荐所有计算机学生尽早了解和使用Docker。 20 | 21 | Docker 就是为了解决复杂的环境配置问题而生的。 22 | 23 | 它将你的软件和软件所依赖的所有环境打包成一个镜像(Image), 该镜像可以在任何一台装有docker 的电脑上运行, 和操作系统无关, 也就是docker 把运行环境和你的操作系统隔离开来了,中间隔了一层docker engine 。 24 | 25 | 写过不少代码的你一定见过这种现象:你的代码在自己电脑上能运行,但是在别人电脑上就会报错,无法运行,原因很简单,任何软件的运行都需要环境。 26 | 27 | 比如,jar包的运行需要jre ,python脚本的运行需要python 解释器安装在电脑上,以后你可能还需要运行一些服务,比如数据库mysql server , redis , rabbitmq , 随着软件运行环境复杂度的增加, 你的软件运行条件也变得苛刻,如果你想把本地的应用部署到服务器上,那事更多,需要的环境得一个个地装到你的linux服务器上,如何彻底解决这个问题? 28 | 29 | 只需在你的电脑中安装docker , 你就可以毫无后顾之忧。 30 | 31 | 所有的环境,服务,软件都是以Image 的形式打包的,Image 中包含了运行你软件的所有东西,比如你的软件是个python 脚本, 并且使用了第三方库flask,那这个Image 中就包含了python ,也就是它的base image , 也同时包含了flask, 这样的话任何一个装有docker的电脑都可以运行你的image。 32 | 33 | -------------------------------------------------------------------------------- /doc/knowledge/knowledge_compiler.md: -------------------------------------------------------------------------------- 1 | ## 编译原理 2 | 3 | 教材推荐(见 CSTextbook 文件夹): 4 | 5 | [Compilers Principles Techniques and Tools (2nd Edition)] 6 | 7 | 网课推荐: 8 | 9 | [Youtube 上的斯坦福公开课](https://www.youtube.com/playlist?list=PLDcmCgguL9rxPoVn2ykUFc8TOpLyDU5gx) 10 | 11 | [课程pdf slides资源](https://bit.ly/2KIuDKe)s How-to-be-a-good-programmer 12 | 13 | Why Study Compilers? 14 | Everything that computers do is the result of some program, and all of the millions of programs in the world are written in one of the many thousands of programming languages that **have** been developed over the last 60 years. Designing and implementing a programming language turns out to be difficult; some of the best minds in computer science have thought about the problems involved and contributed beautiful and deep results. Learning something about compilers will show you the interplay of theory and practice in computer science, especially how powerful general ideas combined with engineering insight can lead to practical solutions to very hard problems. Knowing how a compiler works will also make you a better programmer and increase your ability to learn new programming languages quickly. -------------------------------------------------------------------------------- /doc/knowledge/knowledge_data_structure.md: -------------------------------------------------------------------------------- 1 | ## 算法与数据结构 2 | 3 | 重要性不多说, 不是说你要搞算法研究才需要学这个, 你就是平时一个应用的开发, 往往也离不开这些东西, 它们是软件开发的重要组成部分, 但是要怎么学呢? 4 | 5 | 原则一: 6 | 7 | **学习初期, 实践和理论交替进行, 不读太难的书** 8 | 9 | 我建议初中级的学习, 你需要`同时`做两件事: 10 | 11 | - 学习coursera上开源算法4课程, **[教材](https://algs4.cs.princeton.edu/home/)**,**视频教程[开源地址](https://www.coursera.org/learn/algorithms-part1/)** 12 | - 做leetcode的easy到medium难度的题目, 获得及时反馈, 在讨论中学习优秀解法, 体会算法与数据结构的用处. 13 | 14 | >完整算法4pdf教材在文件夹`CS textbooks`中, 自行查阅 15 | 16 | 后期再看算法导论之类的硬书, 而且说实话, 对于大多数非科研的, 偏工程的学生, 有上面的算法4和leetcode实践, 就完全够用了. 17 | 18 | ### 算法导论资源: 19 | 20 | [原书第三版](https://ms.sapientia.ro/~kasa/Algorithms_3rd.pdf) 21 | 22 | [习题解析](https://sites.math.rutgers.edu/~ajl213/CLRS/CLRS.html) -------------------------------------------------------------------------------- /doc/knowledge/knowledge_microprocessor.md: -------------------------------------------------------------------------------- 1 | ## 微机原理 2 | 3 | ### [Intel Microprocessor 8th editon](https://userpages.umbc.edu/~squire/intel_book.pdf) 4 | 5 | ### [Solution Manual](http://www.mediafire.com/file/0pt58z4h5x4ppzq/The_Intel_Microprocessors_solution_manual_8th_ed_by_Barry_B_Brey.pdf/file) -------------------------------------------------------------------------------- /doc/knowledge/knowledge_network.md: -------------------------------------------------------------------------------- 1 | # 计算机网络 2 | 3 | ## 《计算机网络 - 自顶向下》 (见教材文件夹) 4 | 5 | ## [习题解析](https://www.slideshare.net/seyutbt/solutions6theditioncomputerandnetworking2) 6 | 7 | ## 视频网课: 8 | 9 | [Youtube](https://www.youtube.com/user/NetworKingInc/playlists) 10 | 11 | -------------------------------------------------------------------------------- /doc/knowledge/knowledge_operating_system.md: -------------------------------------------------------------------------------- 1 | ## 操作系统 2 | 3 | 我收集的两本经典教材(位于 `CS textbooks` 文件夹中): 4 | 5 | - Operating System Concepts 6 | - Linux Kernel Development 7 | 8 | 推荐一个一万八千星的自我实践制作一个操作系统的Github项目: 9 | 10 | [How-to-Make-a-Computer-Operating-System](https://github.com/SamyPesse/How-to-Make-a-Computer-Operating-System) -------------------------------------------------------------------------------- /doc/projects/project_blog.md: -------------------------------------------------------------------------------- 1 | ## 搭建自己的技术博客 2 | 3 | ### 最简单方法: 4 | 5 | - 运用 **[Github Pages](https://pages.github.com/)** 完成个人博客搭建。(推荐) 6 | 7 | - 一些博客建站工具(不推荐) 比如: **[WordPress](https://wordpress.org/)** 8 | 9 | - 全栈应用生成工具(强烈推荐) **[Jhipster](https://www.jhipster.tech/)** 10 | 11 | ## Jhipster简介 12 | 13 | >Jhipster是一个**全栈应用代码生成器**,总的来说,他其实不是用来搭建博客的,它面向的是企业级的Web应用开发,而且经过我的摸索,我可以很负责人的告诉大家,**Jhipster**是最好的Web全栈学习资源,它生成的代码,值得你反复品读,它使用的工具,绝对是主流,正统的工具。 14 | 15 | 强烈推荐大家去了解, 我就是通过这个应用入门的全栈开发, 如果没有它, 我可能还是门外汉。 16 | 17 | ![Image](../../img/Jhipster_1.png) 18 | 19 | 如果你的兴趣方向也是Web开发,还在犹豫自己选取什么技术栈,完全可以以Jhipster所用的技术栈为指导,甚至可以说,它用什么技术栈,你就学什么技术栈,准没错。 20 | -------------------------------------------------------------------------------- /doc/projects/project_opensource.md: -------------------------------------------------------------------------------- 1 | # 如何参与开源 2 | 3 | 两种方式: 4 | 5 | ## 提issue 6 | 7 | 一个开源应用的使用过程中, 你会遇到一些bug, 或者希望这个应用实现哪些新功能, 这时你可以在这个开源应用下开一个issue, 和项目维护者一起讨论. 8 | 9 | ## 提交Pull Request 10 | 11 | 最好选择一个高星项目, 而且自己经常用的, 很感兴趣的项目, 然后长期跟进这个项目, 将代码克隆到本地, 慢慢试图读懂项目代码, 然后如果有必要, 可以在代码的基础上增加一些你的一些改进, 比如bug修复, 新功能实现等. -------------------------------------------------------------------------------- /doc/tools/tool_command.md: -------------------------------------------------------------------------------- 1 | ## 命令行 2 | 3 | 先让我向大家解释一下,程序员为何要学会使用命令行。 4 | 5 | - 这个世界并不像你想象的那样美好,所有的工具都要给你做一个图形界面出来,图形界面的制作,成本本来就很高 6 | - 当这个工具命令很多的时候,命令很杂的时候,即便做成图形界面,可能也会很复杂很难用,如果一个工具有一千个命令,那么如果要图形界面完全地包含这个一千个命令,那这个图形工具可能会变得充满这种菜单栏和按钮。(事实上,习惯用IDE的你一定经历过这样的事情,为了找一个设置,在IDE的纷繁复杂的菜单里找了半天才找到,那如果是用命令行,直接输入这个命令就可以了!) 7 | - 命令行处理的东西,可以写成命令行脚本,如linux的`.sh`, `.bash`文件, windows的`.batch`, `.cmd`文件, 然后自动化执行. 8 | - 在使用命令行的过程中, 你更容易对整个工程的build等流程有更好的把握, 你更加明白到底是哪些工具, 它们分别干了什么了. 9 | 10 | 11 | >大部分Windows用户同学, 推荐使用2019微软推出的`Windows Terminal`, 它是一个支持富文本, 多标签 12 | 13 | 一些重要的命令行学习资源: 14 | 15 | - **[Github六万星项目: the-art-of-command-line](https://github.com/jlevy/the-art-of-command-line)**(墙裂推荐) 16 | -------------------------------------------------------------------------------- /doc/tools/tool_git.md: -------------------------------------------------------------------------------- 1 | ## Git 版本控制与历史记录 2 | 3 | >我尝试过很多Git学习资源, 当然也读过官方文档, 但目前来说, 我发现了最好的一个学习资源, 在质量上, 易读性上, 它都为我见过的最佳。 4 | 5 | ## [BitBucket提供的系统Git教程](https://www.atlassian.com/git/tutorials) 6 | 7 | ![Image](../../img/BitBucket_1.png) 8 | 9 | 整个教程页, 图文说明很详细, 解释的也绝对到位: 10 | 11 | ![Image](../../img/BitBucket_2.png) 12 | 13 | 宁缺毋滥, 暂时就给大家安利这一个Git学习资源, 其他的我后续发现会加到这个文件里, 也欢饮大家分享你们的资源。 14 | -------------------------------------------------------------------------------- /doc/tools/tool_google.md: -------------------------------------------------------------------------------- 1 | ## 稳定科学上网, 连接世界 2 | 3 | ### 工具分享 4 | 5 | [Shadowsocks小飞机](https://github.com/shadowsocks/shadowsocks-android) -------------------------------------------------------------------------------- /doc/tools/tool_stackoverflow.md: -------------------------------------------------------------------------------- 1 | ## Stackoverflow - 世界最大的编程问答社区 2 | 3 | -------------------------------------------------------------------------------- /img/BitBucket_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niudai/How-to-be-a-good-programmer/e54c22dd3c412ab46c074c723bb70547ccd8887d/img/BitBucket_1.png -------------------------------------------------------------------------------- /img/BitBucket_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niudai/How-to-be-a-good-programmer/e54c22dd3c412ab46c074c723bb70547ccd8887d/img/BitBucket_2.png -------------------------------------------------------------------------------- /img/Jhipster_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niudai/How-to-be-a-good-programmer/e54c22dd3c412ab46c074c723bb70547ccd8887d/img/Jhipster_1.png -------------------------------------------------------------------------------- /img/ScreenSplit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niudai/How-to-be-a-good-programmer/e54c22dd3c412ab46c074c723bb70547ccd8887d/img/ScreenSplit.png -------------------------------------------------------------------------------- /img/algorithms_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niudai/How-to-be-a-good-programmer/e54c22dd3c412ab46c074c723bb70547ccd8887d/img/algorithms_1.png -------------------------------------------------------------------------------- /img/windows_terminal_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/niudai/How-to-be-a-good-programmer/e54c22dd3c412ab46c074c723bb70547ccd8887d/img/windows_terminal_1.png --------------------------------------------------------------------------------