那就这样吧

http://localhost:4000/2018/10/25/test/

小标题3

小标题2

(づ●'◡'●)づ ❥内容区1
1
2
what??

1
alert('Hello World!s');
a.javaview raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package snippet;

public class Snippet {

public static void main(String[] args) {
String string = "省(区、市)委党校大学、省(区、市)委党校2大学";
// String replaceAll = string.replaceAll("([^)]*)","CHEMBO");
String[] split = string.split("");
boolean flag = false;
StringBuilder tmpStr = new StringBuilder();
for (int i = 0; i < split.length; i++) {
String string2 = split[i];
if(")".equals(string2)) {
flag = true;
}
if("(".equals(string2)) {
flag = false;
}
if(flag&&"、".equals(string2)) {
string2 = "@@@";
}
tmpStr.append(string2);
}
System.out.println(tmpStr);
System.out.println(tmpStr.toString().replace("@@@", "、"));

}
}

请添加个描述吧

阅读全文 »

我自己作为一个非科班的程序员,并且在工作中观察了“这两类”工程师的表现,我认为科班和非科班最大的区别在于:科班的同学知道去学什么,问题出现了他知道自己是哪里有知识漏洞;而非科班的,可能压根不知道自己不知道什么。

(解决方式:建立系统的知识体系、寻求老板、tech lead 的指点,快速补充基础并反复学习。)

因此这篇文章我想粗浅的聊聊成为一个工程师需要掌握的大致学习路线,更多的偏入门一些,不涉及具体的工作方向。欢迎大家在文末分享你的学习心得,正如柏拉图所说:

人只有通过和别人讨论,才能知道我们的经验是不是真实的。
如果把学习比作练功的话,我把我的学习内容分为:

修炼“外功”:偏应用
修炼“内功”:偏基础
两者配合,才能仗剑走天涯!

一、外功

  1. Linux 操作系统
    对于想做开发的同学,如果还是个小白,问我第一件事情该做什么,我会强烈推荐先学习 Linux 操作系统,因为互联网公司基本上大部分业务框架部署都是在 Linux 操作系统上进行的。

我认为学习 Linux 操作系统的重点就在于学习各种强大命令如何组合运用。

一是因为工作中我们经常需要用到,比如对各种日志文件进行分析,写脚本驱动机器帮助我们工作。

二是面试时经常会给出一个需求场景让你编写相关的组合命令,比如统计一段日志中各种 IP 地址出现的次数。

给大家推荐一本 Linux 界的“圣经”。

《鸟哥的 Linux 私房菜》

蝉联最受欢迎华语 Linux 书籍第一的位置,无人能撼动。

对于想走开发路线,或者互联网技术路线的同学,学习 Linux 绝对是必须的。

这是一本既能帮助你入门,又能随时备查的工具书。更特别的是鸟哥的写作风格,非常口语化,读起来感觉像是有人在跟你实时互动聊天。

建议想要学习的同学可以收藏一本电子版随时备查。第一次阅读的同学估计会被它的厚度吓到,但其实没有必要去一字一字的全部读完,快速的看完前面十章,你就会对 Linux 有一个初步的认识。以后需要用到哪些命令和知识随时再查就可以了。

  1. 学习一门语言和框架
    对 Linux 操作系统有了一定的了解之后,大家就可选择一门编程语言及其通用框架进行学习开发。

语言的学习和框架可以借助的资料就很多了,每个人的习惯都不一样。喜欢跟着视频学习的可以去慕课网、极客时间,上面有很多性价比很高的课程。另外推荐大家可以加入一些交流群,嗯,比如我的读者交流群,另外一些框架或者语言的官网里面都会有自己社区和交流群的联系方式,里面会有很多精华帖子和大牛进行分享。

说回我自己,当时入门语言是 C++,研究生课程要用,没基础也只能硬着头皮上了。

但其实很多 C++ 的课程或者书籍都是先讲 C 语言,比如《C++ Primer》前面几章都是讲的 C 语言,所以也还好。

后来刷题的时候觉得 C++ 刷题有些麻烦,听了朋友建议选择了 Java,真心感谢他的建议,在这里我也建议如果你不知道应该选什么语言,自己也没有特殊偏爱的话,那就无脑选 Java 吧。

因为 Java 市面上学习资料非常的多,无论是国内还是国外大厂 Java 的就业面都非常广,对于新人来说目前是个很稳妥的选择。

当然,如果你不放心,可以在任何一个招聘网站上面查一查各种语言给岗位需求,只要不是那种很窄门的语言,我觉得学习都是没有问题的。像 Go、Python、C++ 等等就业面还是广泛的。

现在看来,我认为这三门语言都是需要学习的:

Java 是综合能力很强的语言,很多互联网公司大型的框架或者开源项目都是基于 Java 的,因为它有非常完成的一套轮子,能够快速帮助企业解决业务问题;
C 语言偏底层,很多软件都是用 C 来写的或者和它有间接的关系,学习 C 能够帮你更好的理解计算机;
C++ 虽然有些复杂,但它在某些应用场景中有很强的不可替代性,很多公司还在用 C++ 开发核心架构,比如腾讯、百度、谷歌等。
如何学习呢?这里拿 Java 举例来说。

A. 基础部分
推荐 B 站尚学堂的这套免费课程,可以说包含了 Java 的全部内容了。

https://space.bilibili.com/392179313

我自己总结的关于 Java 集合的文章:

👉 Java 集合框架看这一篇就够了

另外如何写出高效的 Java 代码,再次拿出我喜欢的这本 Effective Java了,其实我觉得 Effective C++ 会更好些,不过 Java 这本有针对 Java 的内容,具体的介绍可以看我这个视频:

B. 实战部分
学习一门语言和框架我认为最好的方式就是做项目,做项目除了锻炼我们开发能力外,在找实习和找工作时候也是和面试官很好的切入点。

Java 的 Spring 框架是必须要用的,推荐《Spring 实战》这本书。

Spring IoC 和 AOP 是核心,如何理解,看我这篇文章:

👉 一分钟带你玩转 Spring IoC

你可以去 Github 上找一些感兴趣的项目入手,或者是跟着一些课程视频做项目。

比如我们习以为常的博客系统,你可以亲自动手实现感受一下做一个博客的全过程。

面试时候面试官常常会问:

你做这个项目有什么亮点?
你解决的最难问题是什么?
这些问题都是想考察你知识深度,所以做项目时候要思考一些有趣的点,或者就是别人的东西自己内化一下。

比如说,我使用了几种不同的缓存技术极大的降低了响应耗时,接下来再跟面试官去讲自己的实现思路和对缓存技术的深入理解,做到“年轻人有备而来”。

做开发的同学经常戏称自己的工作就是“增删查改”,那么增删查改自然离不开对数据库的使用,做项目的时候就要学习数据库的使用。

  1. 数据库
    虽然我是全栈程序员,但是工作中多数处理的还是后端问题,数据库真的非常非常常用。

在我转行成为“专业”的程序员之前,在金融公司里也常用数据库,毕竟交易系统的下游肯定是数据库,数据也是一切模型的前提。

初学者建议由浅入深,先学习怎么用。

推荐这本书《MySQL 必知必会》,是一本稍厚的小册子,书中没有讲太多数据库的底层原理,但是条理清晰、简明扼要的介绍了初学者应该掌握的基础知识。

一个晚上的时间坐下来静静的看,你会发现你对 SQL 语句如何编写会有一个很系统性认识。

面试时候面试官常常问一个需求场景,让你编写相关的 SQL 语句。

比如我面试时遇到的一个问题:写一个 SQL: table(Sno, Sname, classId, grade)查出每个班成绩前三名的同学?

但仅仅是掌握基本的 SQL 语句编写是远远不够的。

“增删查改”里面也有大学问,同样是增删查改,有些人就能把数据库性能玩转到极致。

想玩到极致自然离不开我们对底层原理的把握,这也是面试时候面试官最喜欢考察的内容,下面介绍两本和数据库底层原理相关的书籍。

《MySQL 技术内幕:InnoDB 存储引擎》由国内资深 MySQL 专家亲自执笔。本书的内容不是着眼于基本的语法教学,而是通过对数据库底层数据结构、工作机制的分析,告诉我们如何编写 SQL 语句才是高效的,告诉我们索引如何利用才能发挥最佳效果。

举几个面试常见的问题,联合索引为什么要最左匹配?数据库的隔离级别是怎么实现的?都可以在里面找到答案,数据库绝对是开发适合面试考察的重点。这本书是通过大量的例子和插图进行知识讲解,会给人留下很直观印象。

还有一本书和 Redis 相关的。

Redis 是世界上最受欢迎的非关系型数据库之一,常常用来当作缓存和 MySQL 配套使用。

Redis 本身的语法并不复杂,同学们可以找到很多这方面的语法教学资料。

面试时候常常会被问到,Redis 为什么会这么快?如果只是回答因为它是基于内存的数据库,那么面试就凉凉啦。真正的关键秘诀是在于 Redis 的设计与实现,阅读这本书你会发现,Redis 是通过一系列底层设计来保证它快速存取的性能。

二、内功

  1. 算法和数据结构
    我认为算法和数据结构是计算机最重要的东西,没有之一。

程序 = 数据结构 + 算法。

学习算法究竟有什么用呢?为什么大厂喜欢考察算法?可以看我这篇文章:

👉 刷题到底有什么用?你这么刷题还真没用

工作中需要分析复杂度,很多性能上的问题都依赖算法和数据结构来解决,并且带给你思维方式上的改变。有没有学过算法,决定了你能否想到最优的解决方案。

同时算法也是计算机的基础,任何一个你使用的软件或者框架中都一定有算法和数据结构。比如数据库索引使用了 B+ 树。

在此先推荐这本书:Algorithms + Data Structures = Programs

而功利一点来说,算法题的考察是进大厂必备的。

国外的不管大中小公司、国内呢像字节跳动,基本上每一轮面试官都会让你“手撕“代码,因为这是对我们写代码能力最直接的考察。

国外面试
对于国外面试的准备,大家可以看我之前写的自己的备考经历:

👉 从小白到 6 个 offer,我究竟是怎么刷题的?

同时推荐普利斯顿老爷爷的算法课,B 站也有搬运版:https://www.bilibili.com/video/av50599771/

喏,就是这本书的作者,斯坦福的 PhD。

国内面试
对国内的面试,我建议从《剑指 offer》这本书开始学习,然后陆续到牛客网或者 Leetcode 开始你的刷题之旅。

这本书的作者通过 50 多道算法题作为案例,像我们讲解了面试官考察的思路和一些基本数据结构算法的运用,读这本书我们会感觉是一个资深面试官在对我循循善诱,指出我们常见的错误和学习的方向。

刷完这本书之后,就可以在 Leetcode 上继续找各类型的题目进行学习,我个人感觉一般对于面试来说,如果能把两百道中等题目刷的比较熟练是足以找到一份不错的工作了。

各种算法和数据结构我也写过不少了,在我的 Github 上都有分类汇总,大家可以自行取用:

我的 Github:https://github.com/xiaoqi6666/NYCSDE

  1. 设计模式
    设计模式可以说是写出高质量代码的关键。

我在入职前快速学习了设计模式,入职后看代码就顺畅很多,很多设计如果你不知道这种模式就不能理解为什么要这样做。

我觉得学习设计模式的是一个培养自己“审美”能力的过程,和画作、音乐不同,计算机的世界审美标准比较统一,那么我们首先需要知道游戏规则,然后才能打怪升级。

推荐书籍《设计模式》:

看一遍是不够的,也不需要一遍追求完全看懂。

在这一年里,我反复读这本书,遇到不同的问题时去看,随着代码量的积累,对设计模式的理解也会不同。

同时因为 code review 时会有同事给出意见,这样更能促进我的进步。

所以对于还没有工作的同学,我不建议花大量时间在这上面,因为没有人给你反馈,可能效果有限,而且这项内功是需要我们终身修炼的,不必急于一时。

  1. 操作系统
    说到这里,我们已经学习了 Linux 操作系统,学习了一门语言和通用框架并且做了一个小项目,学习了一种常见的关系型数据库和非关系型数据库,算法和数据结构也过关了,拿 offer 应该没问题了。

那么后端开发还需要我们学习计算机哪些知识呢?

推荐大名鼎鼎的 CSAPP:Computer Systems: A Programmer’s Perspective

这本书我在很久之前的视频里就推荐过了,它把计算机底层原理讲解的非常透彻,同时 CMU 也有配套的课程:http://csapp.cs.cmu.edu/3e/courses.html ,重要性不言而喻。

当然了,书很厚,很难啃,小齐给你划重点章节:

1,2,3,6,7,8,9 章
读不下来?加入自习室,我们一起打卡!

那理解了计算机系统有什么用呢?

很难说具体有什么运用,但其实却是无处不在,比如工作中的性能优化。

如果把开发当作修炼一门功夫这些方面的内容就像是内功,只有内功修炼扎实了,最后开发才能更加稳固,做出来的项目才是可靠的。于我们个人而言,才能走得更远。

  1. 计算机网络
    面试还喜欢考察什么内容呢?

比如面试常常会问一道经典面试题:从输入一个 URL 到出现页面的过程发生了什么?如果你学过计算机网络就会对这个问题起码有一个大概的认识。

那么这个问题有什么用呢?比如当你的访问 web 页面出现了“白页“(web 页面一片空白)这种故障,你会怎么排查?如果你只是着眼于自己的代码和服务端,不清楚整个请求链路发生了什么,遇到一些稍微复杂的故障你就束手无策了。

无论是不是计算机科班学生,我都强烈建议把计算机网络学好。

当然,如果更加“功利“一点,我觉得直接去搜相关的”面经“来看,看看什么问题是最常问的,把相关板块的知识弄懂熟透,形成自己的回答条理,看看自己能不能清晰的回答。

TCP 三次握手说一下?
为什么要三次握手呢?两次、四次不行吗?
HTTP 协议哪一层?
说一下 URL 到出现页面的整个过程?
推荐书籍:《计算机网络:自顶向下》

推荐课程:斯坦福大学 CS 144 计算机网络

B 站链接:https://www.bilibili.com/video/av96841516/

  1. 计算机发展史
    最后一点呢,是我自己感兴趣的,顺便推荐给大家。

计算机是一门非常非常有意思的学科,很好玩的学科,从最早的图灵机、到如今的台式机、笔记本电脑,以及我最近玩的树莓派,都是非常非常有意思的。

学习这些东西是为了激发我的学习热情,保持自己的好奇心的一种方式。

推荐视频:Crash Course Computer Science - 翻译叫“计算机速成课”,但并非那种“速成”。

B 站中英文版本:https://www.bilibili.com/video/av21376839/

字幕组的 Github: https://github.com/1c7/Crash-Course-Computer-Science-Chinese

这门课我真是相见恨晚,每一集只有 10-12 分钟,一共 40 集,主讲人非常激情澎湃,你能够隔着屏幕感受到她对计算机科学的热情,对我影响很大。

三、踏入江湖
如果你能做一个相对不错的项目,对各类面经知识能回答的七八分,算法题做了 200 道,我建议可以开始面试了,那么就真正踏入了江湖。

踏入江湖之后,我们仍需不断反复修炼自己的“外功”和“内功”,不断提高自己的功力,哪怕是同一本书,在工作的不同阶段读,一定会有不同的体会。

当然了,以上这些还只是职场硬实力,而能在江湖混的风生水起,一定也离不开过人的软实力。

但是软实力一定是建立在硬实力之上的,没有雪中送炭的作用,只可以锦上添花。

当然了,如果硬实力强到一定程度,是不需要软实力的,但不适合 99% 的人。

路上阳光正好,愿每一位踏入江湖的少年都能潇潇洒洒,仗剑走天涯!

一、三大范式通俗解释:

(1)简单归纳:

  第一范式(1NF):字段不可分;
  第二范式(2NF):有主键,非主键字段依赖主键;
  第三范式(3NF):非主键字段不能相互依赖。

(2)解释:

  1NF:原子性。 字段不可再分,否则就不是关系数据库;;
  2NF:唯一性 。一个表只说明一个事物;
  3NF:每列都与主键有直接关系,不存在传递依赖。

二、例子说明

  (1)不符合第一字段的例子

                                                                         表:字段1, 字段2(字段2.1,字段2.2), 字段3

字段2可以拆分成字段2.1和字段2.2,不符合第一范式。

  (2)不符合第二范式的例子

                                                                        表:学号, 姓名, 年龄, 课程名称, 成绩, 学分 

这个表明显说明了两个事务:学生信息, 课程信息。

  1)存在以下问题:

                           a、数据冗余:每条记录都含有相同信息; 
                           b、删除异常:删除所有学生成绩,就把课程信息全删除了; 
                           c、插入异常:学生未选课,无法记录进数据库; 
                           d、更新异常:调整课程学分,所有行都调整。

  2)修正:
学生表:学号, 姓名, 年龄

                           课程表:课程名称,学分     

                           选课关系表:学号, 课程名称, 成绩

  (3)不符合第二范式的例子

                                                                     表:学号, 姓名, 年龄, 所在学院, 学院联系电话

其中关键字为单一关键字”学号”。存在依赖传递::(学号) → (所在学院) → (学院联系电话) 。

  1)存在问题::
      a、数据冗余:有重复值;
      b、更新异常:有重复的冗余信息,修改时需要同时修改多条记录,否则会出现数据不一致的情况
      c、删除异常
  2)修正:
学生表:学号, 姓名, 年龄, 所在学院;
学院表:学院, 电话

整理自:https://www.zhihu.com/question/24696366

程序员的工作和日常生活非常的枯燥,这里给大家推荐一些程序员经常使用的网站,也是我经常上的一些网站,我将会从多个角度、多个层面为你整理归纳这些网站和论坛

项目类
项目是一个面试官非常看重的点,也是拓展视野、挖掘轮子一个的地方,下面就为你推荐几个程序员都应该 mark 的项目类网站。

Github 代码托管 https://github.com
作为开源代码库以及版本控制系统,Github 拥有140多万开发者用户。随着越来越多的应用程序转移到了云上,Github 已经成为了管理软件开发以及发现已有代码的首选方法。代码托管必备。

Github 也有非常多好的项目可以推荐,还有其他非常多优秀的 Github ,比如 CS-notes、JavaGuide、mall 商城项目

码云代码托管平台 Gitee | Software Development and Collaboration Platform
码云托管平台是中国的,之所以国内自己开发了一个码云平台,是因为 github 涉及到 fq,你懂的,而且码云是开源中国的托管平台,会定期评选一些优秀的项目,你不可错过!

Gitlab https://about.gitlab.com/
对于有些人,提到GitHub就会自然的想到Gitlab,Gitlab支持无限的公有项目和私有项目。其首页截图如下

coding.net https://coding.net
谈到 coding.net,首先必须提的是速度快,功能与开源中国相似,同样一个账号最多可以创建 1000 个项目,也支持任务的创建等

博客类
博客园 http://www.cnblogs.com

博客园吸引了很多IT技术精英,把这里当作自己的网上家园,每天在这里分享着精彩的原创内容,也许他们看重的不是华丽的外表、诱人的虚名,而是纯净、专注、对技术人员的理解。

CSDN https://www.csdn.net/

中国专业IT社区CSDN (Chinese Software Developer Network) 创立于1999年,致力于为中国软件开发者提供知识传播、在线学习、职业发展等服务。中国最大、最具专业的博客平台,同时也是质量最高的博客平台

掘金 https://juejin.im/

掘金现在被字节跳动收购了,内容审核变得越来越严格,也涌现了很多大佬,他们写的文章非常帮,强烈推荐大家每天逛一逛,博客内容都是经过层层筛选的,非常值得一看

思否 https://segmentfault.com/

思否上面有很多大佬,不得不说思否的界面做的非常清新,舒服,这就让人很喜欢这个博客平台,目前看来还是比较小众,但是上面的开发者的互动很多,是一个很温馨的地方。

infoq https://www.infoq.cn/?utm_source=infoq&utm_medium=toutubiaoti

infoq 是最近兴起的一个技术社区,界面非常小清新,让人感觉很舒服,目前入驻的开发者倒不是很多,但是 infoq 依托极客邦的大流量和资源,做起来应该很快的,我入驻了 infoq ,感觉里面还是有很多大佬的,推荐大家经常浏览一波

GitChat https://gitbook.cn
GitChat 是一个付费学习网站,当然也支持免费模式,因为付费所以相对文章质量比较高,但是免费的文章同样也很不错,而且我就在 GitChat 上面写了很多免费文章,不应该是很多,应该是全部免费,我的 gitchat 主页如下 程序员cxuan 的 GitChat

V2EX https://www.v2ex.com

无论你是在大学进行人生最重要阶段的学习,或者是在中国的某座城市工作,或者是在外太空的某个天体如 Sputnik 1 上享受人生,在注册进入 V2EX 之后,你都可以为自己设置一个所在地,从而找到更多和你在同一区域的朋友。

OSCHINA https://www.oschina.net

这个网站和 CSDN 一样是国内最大程序员社区,各种教程、资源、工具、书籍都是可以找到的。在社区里,你可以尽情的写博客,发动态,激烈的讨论问题,只有在这种环境下才能激起你学习的热情。

简书 https://www.jianshu.com/

简书是一个不仅仅为程序员提供的创作分享社区,上面充满了各种各样精彩的博文,也有很多优秀的博主,但是相比较与 CSDN 个人认为在技术创作方面就略低一筹了。

dev https://dev.to/

dev 社区和国内的掘金社区很相似,技术分类也比较多,各种技术应有尽有,文章质量都很不错。

dreamincode https://www.dreamincode.net

dreamincode 是一个相对小众的技术博客,风格简约,但是内容却不简单。

bytes https://bytes.com

bytes 和 dreamcode 类似,简约但不简单。

hongkiat https://www.hongkiat.com/blog/design-dev

hongkiat是与技术、设计领域相关的站点之一,大家可以在这里分享技术文章。

IBM Developer https://developer.ibm.com

这里面都是一线工程师,技术性很强,每一篇文章都值得细细观看,认真学习。

问答类
知乎 https://www.zhihu.com/
有问题,上知乎。知乎,可信赖的问答社区,以让每个人高效获得可信赖的解答为使命。

本是一个分享各种人生杂谈,和一些鲜为人知以及各种大牛的免费和付费的知识型网站。由于流量逐步扩大,吸引了大批优秀的程序员在上面分享自己的技术创作,也是一个程序员常去的网站之一,不仅仅是为了学习技术。

思否问答 https://segmentfault.com
SegmentFault 思否是中国领先的新一代开发者社区和专业的技术媒体。我们为中文开发者提供纯粹、高质的技术交流平台以及最前沿的技术行业动态,帮助更多的开发者获得认知

StackOverFlow https://stackoverflow.com
这是一个由外国人创办的专为程序员提供的国际性问题解答交流社区,正如网站签名:Stack Overflow - Where Developers Learn, Share, & Build Careers。这个网站非常的纯粹,一般人还真不太习惯用这个,没有一手好英语还看不太懂全英文的技术交流与问答。

Reddit https://www.reddit.com
reddit是一个非常个性的社区,你可以在这里讨论编程问题,还可以学习学英语,reddit 还很幽默,有古怪的莫名笑点,评论接楼很有意思。

daniweb https://www.daniweb.com
daniweb也是一个质量比较高的问答平台,有一种像社交平台的感觉。

教程类
菜鸟教程 https://www.runoob.com
菜鸟教程提供了编程的基础技术教程, 介绍了 HTML、CSS、Javascript、Python、Java、Ruby、C、PHP、MySQL 等各种编程语言的基础知识,是个小白入门,学习语言的好地方。

w3schoool
在W3School,你可以找到你所需要的所有的网站建设教程。 从基础的 HTML 到 CSS,乃至进阶的 XML、SQL、JS、PHP 和 ASP.NET。 从左侧的菜单选择你需要的教程! 和菜鸟教程十分相似的网站。

易百教程 https://www.yiibai.com
易百网是一个内容全面的教程网站,专注于 VBScript, MATLAB, EJB, IPv6, IPv4, 电子商务, PostgreSQL, SQLite, SDLC, Assembly, 操作系统, JSON, iOS, 设计模式, VB.Net, 计算机基础知识。

Bilibili1 https://www.bilibili.com
期初这个网站是由游戏玩家视频火起来的,尤其LOL骨灰级玩家遍布其中。bilibili 是国内知名的视频弹幕网站,通过动漫打出了名声,最近两年发展势头迅猛,里面有不少有创意的 Up 主,不乏一些有趣的程序员。

中国大学MOOC网 icourse163.org
中国大学 MOOC(慕课) 是国内优质的中文 MOOC 学习平台,由爱课程网携手网易云课堂打造。平台拥有包括 985 高校在内提供的千余门课程。在这里,每一个有意愿提升自己的人都可以免费获得更优质的高等教育。

慕课网-程序员的梦工厂 https://www.imooc.com
慕课网(IMOOC)是IT技能学习平台。慕课网(IMOOC)提供了丰富的移动端开发、php开发、web前端、android开发以及 html5 等视频教程资源公开课。

网易云课堂 https://study.163.com
网易云课堂,是网易公司打造的在线实用技能学习平台,主要为学习者提供海量、优质的课程,用户可以根据自身的学习程度,自主安排学习进度。涵盖实用软件、IT与互联网、外语学习、生活家居、兴趣爱好、职场技能、金融管理、考试认证、中小学、亲子教育等十余大门类。

实验楼 https://www.lanqiao.cn/courses
实验楼这个网站我直接吹爆,无需配置繁琐的本地环境,随时在线使用。

tutorialspoint https://www.tutorialspoint.com/index.htm
这是一个在线学习的网站,并且免费,里面有各种技术、各个知识点的讲解和demo,灰常全面,这比查找API方便多了,遇到不明白的知识点直接根据索引找就是了,还有各种电子书。

codecademyhttps://www.codecademy.com
学习新语言,敲代码玩就在这里了。这个网站将简化编程学习的过程。比如说网站左边会讲解知识点,右边直接练习。如果出现错误,就会有错误提示,直接给你反馈。所以,使用它不用想太多,直接拼命硬干敲代码入门。

Livecoding.tv https://www.livecoding.tv/accounts/login/
Livecoding.tv 由一群欧美程序爱好者共同发起成立,旨在为全球程序员提供一个实时高效的互动平台。特色是使用了录屏直播技术,用户可以在线观看高手实时编程并且可以向对方提问互动,网站现在已经汇集了一大批程序精英。现在 Livecoding.TV 来到中国,希望更多的中国程序员加入进来一起切磋技术。

Dzone https://dzone.com
Dzone 是一个技术涵盖比较全面的网站,像云平台、数据库、物联网、开发运维、Java 语言等都有。

simpleprogrammer https://simpleprogrammer.com/
simpleprogrammer与其他技术类的社区不太一样,在这里并没有很多技术类的文章,更多的是指导建议性的文章,讲述了一些人生道理,职场规则,编程生涯的一些文章。

SitePoint https://www.sitepoint.com/web
通过 SitePoint 教程,课程和书籍学习 Web 设计和开发-HTML5,CSS3,JavaScript,PHP,移动应用,这是一个偏向前端方向的网站,在这里包含了各种高质量的前端方面的文章,电子书。

YouTobe https://www.youtube.com/
YouTobe 这个网站可算是经典,和国内的哔哩哔哩一样,各类视频汇聚于此,当然各国编程大神也在这啦。

算法类
LeetCode https://leetcode-cn.com
几乎每个算法大牛都知道的神奇网站,这个网站上面有:算法、数据库、Shell、多线程等多种类型供你学习。多数人在上面练习编程算法,尤其是给想进入一线互联网公司的技术人员,提供了一个免费又方便的题库。面试前都会在上面进行长期和充分的刷题,是你的不二选择。

LintCode https://www.lintcode.com
LintCode 领扣上有数量超过 1000 道的算法题目和人工智能题目,通过刷题熟练掌握数据结构和算法。完成各大名企的阶梯训练,为你斩获心仪的 offer 打下坚实的基础

洛谷 https://www.luogu.com.cn
洛谷创办于 2013 年,致力于为参加 noip、noi、acm 的选手提供清爽、快捷的编程体验。它拥有在线测题系统、强大的社区、在线学习功能,也是一个很好练习刷题的网站啦

Codeforces http://codeforces.com/
Codeforces 是一家为计算机编程爱好者提供的在线评测系统该网站由萨拉托夫国立大学的一个团体创立并负责运营。在编程挑战赛中,选手有 2 个小时的时间去解决 5 道题,通过得分排名,选手可以看到实时的排名,也可以选择查看好友的排名,还可以看到某题有多少人通过等信息。

Topcoder https://www.topcoder.com
Topcoder 据说是世界上规模最大的编程网站,这里面的题型,比赛形式跟 ACM/ICPC 极不相同。该网站把中国纳入其赛区,大家可以上去那里跟来自全世界的程序员(事实上大多数也是大学生)进行更直接的交流,可能也是ACM/ICPC 练兵的好地方吧。

接单类
程序员客栈 https://www.proginn.com
程序员客栈是领先的程序员自由远程工作平台,未来互联网企业用人方式。提供优秀程序员为您进行网站建设制作、测试运维服务、人工智能 AI、大数据区块链、软件开发等优质服务。

码市 https://codemart.com/developers
码市是互联网软件外包服务平台,意在连接需求方与广大开发者。让项目的需求方快速的找到合适的开发者,完成项目开发工作。

猿急送 https://www.yuanjisong.com/job
猿急送为您提供兼职程序员,兼职工程师信息,猿急送是一个高级技术共享平台,是优质的程序员兼职网站,这里汇聚 BAT 等知名互联网公司的技术开发、产品、设计大牛。

开源众包 https://zb.oschina.net
开源众包–专业的软件众包平台,350万+ 优质开发者为您提供网站、APP、微信/小程序、企业应用等软件开发服务,有效降低企业 IT 软件开发成本、解决技术资源不足等问题。

实现网 https://shixian.com
这个比较高级,是一些知名公司技术人员兼职的平台。我们可以在线约好去其他公司兼职坐班。实现网为企业提供BAT 等名企背景的、靠谱的开发设计兼职人才和自由职业者,满足企业项目外包、驻场开发、远程兼职、技术咨询等短期人力需求。

猪八戒 https://shenyang.zbj.com
猪八戒网企业外包服务,中国领先的灵活用工平台,其中服务品类涵盖LOGO设计、UI设计、营销推广、网站建设、装修设计、工业设计、文案策划、知识产权的服务。

码易众包平台 https://www.mayigeek.com
码易是智网易联旗下 IT 软件服务平台,集软件商城、企业应用、电商软件、crm 软件、商务服务平台于一体的一站式软件外包开发服务平台。

求职类
牛客网 https://www.nowcoder.com
求职之前,先上牛客,就业找工作一站解决。这个网站不像 csdn 和 OSChina 以技术博客论坛为主了。但是在你需要的时候,却是相当有价值,里面有面试技巧、各种知名的不知名的互联网公司的对应往年校招社招面试题库,刷到你手软,一般应届生用这个比较多。

拉勾网 https://www.lagou.com
拉勾招聘是专业的互联网求职招聘网站。致力于提供真实可靠的互联网岗位求职招聘找工作信息,拥有海量的互联网人才储备,互联网行业找工作就上拉勾招聘,值得信赖的求职。

Boss直聘 https://www.zhipin.com
BOSS直聘是权威领先的招聘网,开启人才网招聘求职新时代,让求职者与 Boss 直接开聊、加快面试、即时反馈,是一个致力于为招聘者和求职者搭建高效沟通、信息对等的平台

猎聘 https://www.liepin.com
猎聘,2018年香港上市。作为中国知名中高端人才求职招聘平台,汇聚56万+知名企业、16万+认证猎头,为5700万用户提供高薪工作岗位。总之,猎聘还是非常不错的。

Windows 上的快捷键

Windows 系统本身

  • Win-E:打开系统文件浏览器
  • Win-Tab:打开切换预览面板
  • Win-Left/Right:左右分屏
  • Win-Top/Bottom:窗口放大-缩小,顺序依次是 最小化 => 默认窗口 => 最大化

常见默认快捷键

  • Shift+滚轮:横向滚动
  • 空格+鼠标:拖动

奇怪的默认行为

  • C-空格:切换半角/全角标点符号
  • C-.:切换中英文标点符号(隐藏的很深。。。)
  • CS-F:简繁切换

文件操作

cp

cp命令用于将文件(或目录)拷贝到目的地。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 拷贝单个文件
$ cp source dest

# 拷贝多个文件
$ cp source1 source2 source3 dest

# -i 目的地有同名文件时会提示确认
$ cp -i file1 file2

# -r 递归拷贝,将dir1拷贝到dir2,完成后dir2生成一个子目录dir1
# dir2如果不存在,将被创建
# 拷贝目录时,该参数是必需的
$ cp -r dir1 dir2

# -u --update 只拷贝目的地没有的文件,或者比目的地同名文件更新的文件
$ cp -u *.html destination

其他参数

  • -a 拷贝时保留所有属性,包括所有者与权限
  • -v 显示拷贝的详细信息

mkdir

mkdir命令用于新建目录。

1
2
# 新建多个目录
$ mkdir dir1 dir2 dir3

mv

mv命令用于将源文件移动到目的地。

1
2
3
4
5
6
7
8
9
# 移动单个文件
$ mv item1 item2

# 移动多个文件
$ mv file1 file2 dir1

# 将dir1拷贝进入dir2,完成后dir2将多出一个子目录dir1
# 如果dir2不存在,将会被创建
$ mv dir1 dir2

参数

  • -i 覆盖已经存在的文件时,会提示确认
  • -u 只移动目的地不存在的文件,或比目的地更新的文件

rm

rm命令用于删除文件。

参数。

  • -i 文件存在时,会提示确认。
  • -r 递归删除一个子目录
  • -f 如果删除不存在的文件,不报错
  • -v 删除时展示详细信息

ln

ln命令用于建立链接文件。

1
2
3
4
5
# 新建硬链接
$ ln file link

# 新建软链接
$ ln -s item link

文件系统

pwd

pwd命令显示列出当前所在的目录。

1
$ pwd

cd

cd命令用来改变用户所在的目录。

1
2
3
4
5
6
7
8
# 进入用户的主目录
$ cd

# 进入前一个工作目录
$ cd -

# 进入指定用户的主目录
$ cd ~user_name

ls

ls目录可以显示指定目录的内容。不加参数时,显示当前目录的内容。

1
$ ls

上面命令显示当前目录的内容。

ls命令也可以显示指定文件是否存在。

1
2
$ ls foo.txt
foo.txt

-l参数可以显示文件的详细信息。

1
2
$ ls -l foo.txt
-rw-rw-r-- 1 me me 0 2016-03-06 14:52 foo.txt

上面命令输出结果的第一栏,是文件的类型和权限。

文件类型分为以下几种。

  • - 普通文件
  • d 目录
  • l 符号链接。注意,对于符号链接文件,剩余的文件属性总是”rwxrwxrwx”。
  • c 字符设备文件,指按照字节流处理数据的设备,比如调制解调器。
  • b 块设备文件,指按照数据块处理数据的设备,比如硬盘。

其他参数的用法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 显示多个目录的内容
$ ls ~ /usr

# -a --all 显示隐藏文件
$ ls -a

# -A 与-a类似,但是不显示当前目录和上一级目录两个点文件
$ ls -A

# -l 显示详细信息
$ ls -l

# -1 单列显示,每行只显示一个文件
$ ls -1

# -d 显示当前目录本身,而不是它的内容
# 通常与-l配合使用,列出一个目录本身的详细信息
$ ls -dl

# -F 目录名之后添加斜杠,可执行文件后面添加星号
$ ls -F

# -h 与-l配合使用,将文件大小显示为人类可读的格式

# -t 按文件修改时间排序,修改晚的排在前面
$ ls -t

# -s 按文件大小排序,

# --reverse 显示结果倒序排列
$ ls -lt --reverse

如果只显示一个目录里面的子目录,不显示文件,可以使用下面这些命令。

1
2
3
4
5
6
7
8
9
10
11
# 只显示常规目录
$ ls -d */
$ ls -F | grep /
$ ls -l | grep ^d
$ tree -dL 1

# 只显示隐藏目录
$ ls -d .*/

# 隐藏目录和非隐藏目录都显示
$ find -maxdepth 1 -type d

另一个简便方法是利用自动补全功能,先键入cd命令,然后连按两下tab键。

stat

stat命令是加强版的ls命令,可以显示一个文件的详细信息。

1
2
3
4
5
6
7
8
$ stat timestamp
File: 'timestamp'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 803h/2051d Inode: 14265061 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1001/ me) Gid: ( 1001/ me)
Access: 2008-10-08 15:15:39.000000000 -0400
Modify: 2008-10-08 15:15:39.000000000 -0400
Change: 2008-10-08 15:15:39.000000000 -0400

touch

touch用来设置或更新文件的访问,更改,和修改时间。然而,如果一个文件名参数是一个 不存在的文件,则会创建一个空文件。

1
$ touch timestamp

上面命令创建了一个名为timestamp空文件。如果该文件已经存在,就会把它的修改时间设置为当前时间。

1
2
$ mkdir -p playground/dir-{00{1..9},0{10..99},100}
$ touch playground/dir-{00{1..9},0{10..99},100}/file-{A..Z}

上面的命令创建了一个包含一百个子目录,每个子目录中包含了26个空文件。

file

file命令显示指定文件的类型。

1
2
$ file picture.jpg
picture.jpg: JPEG image data, JFIF standard 1.01

chmod

chmod命令用于更改文件的权限,是“change mode”的缩写。

1
$ chmod 600 foo.txt

上面命令将foo.txt的权限改成了600。

chmod还可以接受四个缩写,为不同的对象单独设置权限。

  • u 所有者“user”的简写
  • g 用户组“group”的缩写
  • o 其他所有人“others”的简写
  • a 所有人“all”的简写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 为所有者添加可执行权限
$ chmod u+x foo.txt

# 删除所有者的可执行权限
$ chmod u-x foo.txt

# 为所有人添加可执行权限,等价于 a+x
$ chmod +x foo.txt

# 删除其他人的读权限和写权限。
$ chmod o-rw foo.txt

# 设定用户组和其他人的权限是读权限和写权限
$ chmod go=rw foo.txt

# 为所有者添加执行权限,设定用户组和其他人为读权限和写权限,多种设定用逗号分隔
$ chmod u+x,go=rw foo.txt

添加权限。

  • +x 添加执行权限
  • +r 设置读权限
  • +w 设置写权限
  • +rwx 设置所有读、写和执行权限。

删除权限只需将+更改为-,就可以删除任何已设置的指定权限。可以使用-R(或--recursive)选项来递归地操作目录和文件。

设置精确权限,可以使用=代替+-来实现此操作。如果想为用户、组或其他用户设置不同的权限,可以使用逗号将不同表达式分开(例如ug=rwx,o=rx)。

由于一共有3种可能的权限。也可以使用八进制数代替符号来设置权限。通过这种方式设置的权限最多使用3个八进制数。第1个数定义用户权限,第2个数定义组权限,第3个数定义其他权限。这3个数中的每一个都通过添加想要的权限设置来构造:读 (4)、写 (2) 和执行 (1)。

  • rwx 7
  • rw- 6
  • r-x 5
  • r– 4
  • -wx 3
  • -w- 2
  • –x 1
  • — 0

umask

umask用来查看和设置权限掩码。

1
2
$ umask
0022

上面命令显示当前系统之中,默认的文件掩码是0022,转为二进制就是000 000 010 010

可以看到,这个掩码是一个12位的二进制数,后面的9位分别代表文件三种使用对象的三类权限。只要对应位置上是1,就表示关闭该项权限,所以010就表示关闭读权限。

新建文件时,通常不会带有执行权限,也就是说,新建文件的默认权限是rw-rw-rw-。如果文件掩码是0022,那么用户组和其他人的写权限也会被拿掉。

1
2
3
$ touch new.txt
$ ls -l new.txt
-rw-r--r-- 1 me me 0 2016-03-06 14:52 new.txt

上面代码中,new.txt的用户组和其他人的写权限就没了。

umask后面跟着参数,就表示设置权限掩码。

1
$ umask 0000

上面命令将权限掩码设为0000,实际上就是关闭了权限掩码。

umask命令设置的掩码值只能在当前Shell会话中生效,若当前Shell会话结束后,则必须重新设置。

du

du命令用于查看指定目录的大小。

1
$ du -hs /path/to/directory

显示第一层子目录的大小。

1
$ du -h --max-depth=1 /path/to/folder

参数的含义。

  • -h 表示人类可读的格式
  • -s 表示总结信息,否则会显示该目录内所有文件和子目录的信息。

tree命令也可以显示子目录大小。

1
$ tree --du -h /path/to/directory

md5sum

md5sum命令用来显示一个文件的md5校验码。

1
2
$ md5sum image.iso
34e354760f9bb7fbf85c96f6a3f94ece image.iso

locate

locate程序快速搜索本机的路径名数据库,并且输出每个与给定字符串相匹配的文件名。

1
2
3
4
5
6
7
$ locate bin/zip
/usr/bin/zip
/usr/bin/zipcloak
/usr/bin/zipgrep
/usr/bin/zipinfo
/usr/bin/zipnote
/usr/bin/zipsplit

locate数据库由另一个叫做updatedb的程序创建。大多数装有 locate 的系统会每隔一天运行一回 updatedb 程序。因为数据库不能被持续地更新,所以当使用 locate 时,你会发现 目前最新的文件不会出现。为了克服这个问题,可以手动运行 updatedb 程序, 更改为超级用户身份,在提示符下运行 updatedb 命令。

locate支持正则查找。--regexp参数支持基本的正则表达式,--regex参数支持扩展的正则表达式。

1
$ locate --regex 'bin/(bz|gz|zip)'

find

locate程序只能依据文件名来查找文件,而find程序能基于各种各样的属性,搜索一个给定目录(以及它的子目录),来查找文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 输出当前目录的所有子目录和文件(含子目录)
$ find
$ find .

# 显示当前目录的文件总数
$ find . | wc -l

# 当前目录的子目录总数
$ find . -type d | wc -l

# 当前目录的文件总数(不含子目录)
$ find . -type f | wc -l

# 当前目录的文件名匹配“*.JPG”且大于1M的文件总数
$ find . -type f -name "\*.JPG" -size +1M | wc -l

-type参数支持的文件类型。

  • b 块设备文件
  • c 字符设备文件
  • d 目录
  • f 普通文件
  • l 符号链接

-size参数支持的文件大小类型。

  • b 512 个字节块。如果没有指定单位,则这是默认值。
  • c 字节
  • w 两个字节的字
  • k 千字节
  • M 兆字节
  • G 千兆字节

find程序支持的查询参数。

  • -cmin n 匹配的文件和目录的内容或属性最后修改时间正好在 n 分钟之前。 指定少于 n 分钟之前,使用 -n,指定多于 n 分钟之前,使用 +n。
  • -cnewer file 匹配的文件和目录的内容或属性最后修改时间早于那些文件。
  • -ctime n 匹配的文件和目录的内容和属性最后修改时间在 n*24小时之前。
  • -empty 匹配空文件和目录。
  • -group name 匹配的文件和目录属于一个组。组可以用组名或组 ID 来表示。
  • -iname pattern 就像-name 测试条件,但是不区分大小写。
  • -inum n 匹配的文件的 inode 号是 n。这对于找到某个特殊 inode 的所有硬链接很有帮助。
  • -mmin n 匹配的文件或目录的内容被修改于 n 分钟之前。
  • -mtime n 匹配的文件或目录的内容被修改于 n*24小时之前。
  • -name pattern 用指定的通配符模式匹配的文件和目录。
  • -newer file 匹配的文件和目录的内容早于指定的文件。当编写 shell 脚本,做文件备份时,非常有帮助。 每次你制作一个备份,更新文件(比如说日志),然后使用 find 命令来决定自从上次更新,哪一个文件已经更改了。
  • -nouser 匹配的文件和目录不属于一个有效用户。这可以用来查找 属于删除帐户的文件或监测攻击行为。
  • -nogroup 匹配的文件和目录不属于一个有效的组。
  • -perm mode 匹配的文件和目录的权限已经设置为指定的 mode。mode 可以用 八进制或符号表示法。
  • -samefile name 相似于-inum 测试条件。匹配和文件 name 享有同样 inode 号的文件。
  • -size n 匹配的文件大小为 n。
  • -type c 匹配的文件类型是 c。
  • -user name 匹配的文件或目录属于某个用户。这个用户可以通过用户名或用户 ID 来表示。
  • -depth 指导 find 程序先处理目录中的文件,再处理目录自身。当指定-delete 行为时,会自动 应用这个选项。
  • -maxdepth levels 当执行测试条件和行为的时候,设置 find 程序陷入目录树的最大级别数
  • -mindepth levels 在应用测试条件和行为之前,设置 find 程序陷入目录数的最小级别数。
  • -mount 指导 find 程序不要搜索挂载到其它文件系统上的目录。
  • -regex 指定正则表达式
1
2
# 找出包括空格或其它不规范字符的文件名或路径名
$ find . -regex '.*[^-\_./0-9a-zA-Z].*'

find程序还支持逻辑操作符。

  • -and 如果操作符两边的测试条件都是真,则匹配。可以简写为 -a。 注意若没有使用操作符,则默认使用 -and。
  • -or 若操作符两边的任一个测试条件为真,则匹配。可以简写为 -o。
  • -not 若操作符后面的测试条件是真,则匹配。可以简写为一个感叹号(!)。
  • () 把测试条件和操作符组合起来形成更大的表达式。这用来控制逻辑计算的优先级。注意 因为圆括号字符对于 shell 来说有特殊含义,所以在命令行中使用它们的时候,它们必须 用引号引起来,才能作为实参传递给 find 命令。通常反斜杠字符被用来转义圆括号字符。
1
2
3
4
5
# 或关系
( expression 1 ) -or ( expression 2 )

# 找出不是600权限的文件,或者不是700权限的目录
$ find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)

find程序的逻辑表达式,具有“短路运算”的特点,即对于expr1 -operator expr2这个表达式,expr2不一定执行。这是为了提高运行速度。

  • expr1 为真,且操作符为-and,expr2 总是执行
  • expr1 为假,且操作符为-and,expr2 从不执行
  • expr1 为真,且操作符为-or,expr2 从不执行
  • expr1 为假,且操作符为-or,expr2 总是执行

为了方便执行一些常见操作,find程序定义了一些预定义操作。

  • -delete 删除当前匹配的文件。
  • -ls 对匹配的文件执行等同的 ls -dils 命令。并将结果发送到标准输出。
  • -print 把匹配文件的全路径名输送到标准输出。如果没有指定其它操作,这是 默认操作。
  • -quit 一旦找到一个匹配,退出。
1
2
3
4
5
6
7
# 找到匹配的文件,并显示在标准输出
# -print 是默认操作,可以省略
$ find . -print

# 删除后缀名为BAK的文件
# 执行 delete 操作前,最好先执行 print 操作,确认要删除哪些文件
$ find . -type f -name '*.BAK' -delete

预定义操作可以与逻辑表达式,结合使用。

1
$ find ~ -type f -and -name '*.BAK' -and -print

除了预定义操作以外,用户还可以使用-exec参数自定义操作。

1
-exec command {} ;

上面的命令中,command是一个命令行命令,{}用来指代当前路径,分号表示命令结束。

1
2
# 预定义的 -delete 操作,等同于下面的操作
-exec rm '{}' ';'

-exec使用时,每次找到一个匹配的文件,会启动一个新的指定命令的实例。

1
$ find ~ -type f -name 'foo*' -exec ls -l '{}' ';'

执行上面的命令,ls程序可能会被调用多次。

1
2
$ ls -l file1
$ ls -l file2

如果想改成ls程序只调用一次,要把find命令里面的分号,改成加号。

1
2
3
$ ls -l file1 file2
# 相当于
$ find ~ -type f -name 'foo*' -exec ls -l '{}' +

xargs

xargs命令从标准输入接受输入,并把输入转换为一个特定命令的参数列表。

1
$ find ~ -type f -name 'foo\*' -print | xargs ls -l