程序员成长指北

Results 39 issues of 程序员成长指北

​ 又是七月面试季节,又一波大学生进入社会,面临着各种面试问题,网上有很多面经,但更多的是在讲面试的经历或者面试被问到的技术相关的。这里我给大家分享一些无关乎技术,但在面试中需要注意的一些事项。 > 友情提示:去面试的时候,千万别空着手去啊! 不要误会,不是让你给面试官送礼,毕竟我们都是金光闪闪的程序员,靠技术说话,不吃这一套。 ## 带上个人简历 面试的时候:一定要带简历!带简历!带简历!重要的事情说三遍。我在面试其他人的时候,都会先看对方的简历,然后才开始面试。从你的简历中能够看出非常多的信息,甚至看到你的简历就能初步确定你是不是我们要找的人(因为约面试一般是hr处理的,技术面你时不一定看过你的简历)。 你能体会到在面试官满怀期待的眼神中,你一句“没带”的无奈吗?交给面试官的简历不需要做的很花哨,但是也要保持干净整洁,千万不要从你的混合零钱钥匙的裤兜里掏出你叠了几次的简历。 ## 面试官是个怎样的人 很多人可能觉得,面试的时候自己都比紧张,很容易忽视细节,更没有心情去关心面试官是一个什么样的人。但其实这是很重要的一个点,因为如果你入职了,面试官就会成为你的同事甚至上级,作为开发人员,队友和上级这两个角色都挺重要的呀! 那么怎么样来观察面试官是一个什么样的人呢?下面3个点,你要**注意**了: - 在面试问答环节,当面试官问到你回答不上来的问题时,看面试官是咄咄逼人的感觉还是以交流的态度引导你来认识这个问题,如果是前者,你可能要考虑一下要不要选择加入这个团队,因为这也是选择未来共事的人 - 看看面试官的精神面貌,可能有的人觉得程序员还有什么精神面貌可看的,其实这里是想让你看看面试官是不是非常疲劳的样子,因为有的公司长期加班,很多开发者都处于疲劳状态;而这个状态以后也可能是你的工作常态 ## 你有什么想问的? 在面试中,基本上在面试快要结束的时候,面试官都会问,“你有没有什么想了解我们公司的”或者“你有什么想问的问题”,有很多人都容易忽略这个问题,直接回答“没有了”。这真的是一个很失败的回答,因为对于面试官来讲,你没有想要了解公司的欲望,或者说不太感兴趣;对于你自身来说,错失了你最有机会了解公司招聘你这个岗位的动机。 这个环节一般可以提问两三个问题,不宜太多。我觉得以下几个问题可以根据你的情况提问: 1. 问:如果我被录用了,接下来我要做什么?这个问题挺重要的,涉及到了你后面在团队中要干的活,也是你了解可能参与项目的业务以及开发会使用到哪些技术栈,这样你心理大概有一个谱,和你会的技术栈是否相符等,帮助你考虑要不要加入他们 2. 可以问问开发团队规模,这个问题可以知道你进入团队遇到难题有没有人一起讨论解决,如果你期望找到有人可以带带你的公司,这个问题就很有必要 剩下可以问问有没有技术分享会或者其他分享会议, 如果聊的好,也可以问问在面试时遇到的自己不会的问题或者技术点,但不是在网上立马就能找到答案的或者说固有答案的,也可以问问面试官,或者说一起探讨 上面说了几个要问点, 下面也提一下有些此时问题不适合问的: **直接问薪资是不可取的**,在技术面试进行面试时,千万别问薪资,人家会觉得你很不专业,并且心思都放在了钱上,而且谈薪资也不是技术要和你详细谈的事。...

## 什么是stream ### 定义 流的英文`stream`,流(Stream)是一个抽象的数据接口,`Node.js`中很多对象都实现了流,流是`EventEmitter`对象的一个实例,总之它是会冒数据(以 `Buffer` 为单位),或者能够吸收数据的东西,它的本质就是让数据流动起来。 可能看一张图会更直观: ![水桶管道流转图](https://user-gold-cdn.xitu.io/2019/7/10/16bdbb113be0341a?w=305&h=290&f=png&s=6680) 注意:`stream`不是node.js独有的概念,而是一个操作系统最基本的操作方式,只不过node.js有API支持这种操作方式。linux命令的|就是`stream`。 ## 为什么要学习stream ### 视频播放例子 小伙伴们肯定都在线看过电影,对比定义中的图-`水桶管道流转图`,`source`就是服务器端的视频,`dest`就是你自己的播放器(或者浏览器中的flash和h5 video)。大家想一下,看电影的方式就如同上面的图管道换水一样,一点点从服务端将视频流动到本地播放器,一边流动一边播放,最后流动完了也就播放完了。 说明:视频播放的这个例子,如果我们不使用管道和流动的方式,直接先从服务端加载完视频文件,然后再播放。会造成很多问题 1. 因内存占有太多而导致系统卡顿或者崩溃 2. 因为我们的网速 内存 cpu运算速度都是有限的,而且还要有多个程序共享使用,一个视频文件加载完可能有几个g那么大。 ### 读取大文件data的例子 **有一个这样的需求,想要读取大文件data的例子** 使用文件读取 ``` javascript const...

![](https://user-gold-cdn.xitu.io/2019/6/10/16b3d0be9ade6f69?w=800&h=444&f=png&s=13345) ## 前言 先上两段代码: java中定义类: ```java public class Person{ private String name; private int age; public Person(String name,int age){ this.name=name; this.age=age; } public void getInfo(){ System.out.println(name+age); } } ``` Es6中定义一个类:...

## 本文涵盖 - 面试题的引入 - 笔者对事件循环面试题执行顺序的一些疑问 - 通过面试题对微任务、事件循环、定时器等对深入理解 - 结论总计 ## 面试题 面试题如下,大家可以先试着写一下输出结果,然后再看我下面的详细讲解,看看会不会有什么出入,如果把整个顺序弄清楚node.js的执行顺序应该就没问题了。 ```JavaScript async function async1(){ console.log('async1 start') await async2() console.log('async1 end') } async function async2(){ console.log('async2') } console.log('script...

![](https://user-gold-cdn.xitu.io/2019/7/14/16bee9d2688bb8d8?w=900&h=383&f=jpeg&s=67107) ## 提出问题? 1. 服务器数据库异常重启了会造成什么样的影响? 2. 不小心删除了数据库怎么办,或者不小心删除了数据库表中数据怎么办? 3. 一条更新语句在数据库系统内部执行时与数据库日志系统有什么联系? 4. 数据库备份,是每天一备比较好,还是每周一备比较好? 接下来在讲解日志系统的同时,回答上面的几个问题。 ## 日志系统详解: ### redo日志(重做日志) `redo`是引擎层的日志,而且是InnoDB特有的。InnoDB的`redo log`是有固定大小的,比如可以配置为 一组4个文件(logfile-1,logfile-2,logfile-3,logfile-4),每个文件的大小是1GB,那么它总共可以记录4GB的操作。一个环状循环结构,从头开始写,写到末尾又回到开始循环写。 #### redo中的环状结构 结构图: ![](https://user-gold-cdn.xitu.io/2019/6/27/16b963d8c091335f?w=500&h=500&f=png&s=25379) `write pos`是当前记录的位置,一边写一边后移,环状结构,写到3号文件末尾就会回到0号文件开头。checkpoint是当前擦除的位置,也是往后推移并且循环的。注意擦除记录前要把记录更新到数据文件(这里可以联想 粉板 老板正式记账本的例子) #### redo日志作用(**回答提出问题1**) 1....

>之前写了一篇关于vue面试总结的文章, 有不少网友提出组件之间通信方式还有很多, 这篇文章便是专门总结组件之间通信的 vue是数据驱动视图更新的框架, 所以对于vue来说组件间的数据通信非常重要,那么组件之间如何进行数据通信的呢? 首先我们需要知道在vue中组件之间存在什么样的关系, 才更容易理解他们的通信方式, 就好像过年回家,坐着一屋子的陌生人,相互之间怎么称呼,这时就需要先知道自己和他们之间是什么样的关系。 vue组件中关系说明: ![image](https://user-gold-cdn.xitu.io/2019/7/11/16bde5b613aac4ee?w=462&h=402&f=png&s=58442) 如上图所示, A与B、A与C、B与D、C与E组件之间是父子关系; B与C之间是兄弟关系;A与D、A与E之间是隔代关系; D与E是堂兄关系(非直系亲属) 针对以上关系我们归类为: - 父子组件之间通信 - 非父子组件之间通信(兄弟组件、隔代关系组件等) 本文会介绍组件间通信的8种方式如下图目录所示:并介绍在不同的场景下如何选择有效方式实现的组件间通信方式,希望可以帮助小伙伴们更好理解组件间的通信。 ![](https://user-gold-cdn.xitu.io/2019/7/11/16bde5b613802d6b?w=499&h=566&f=png&s=133668) ### 一、`props` / `$emit` 父组件通过`props`的方式向子组件传递数据,而通过`$emit` 子组件可以向父组件通信。 #### 1. 父组件向子组件传值...

如果你是一个已经在学习前端开发的初学者亦或者是一名在代码界纵横多年的程序员,那你一定知道现在最火的前端框架之一Vue.js。它相比于React与Angular上手更加容易,或许这也是很多初学者选择vue的原因之一。 ![在这里插入图片描述](https://user-gold-cdn.xitu.io/2019/6/3/16b1b78ef5b28fe0?w=714&h=890&f=jpeg&s=64322) 我们看到很多招聘上都写着掌握vue开发项目,那么面试都会问什么呢?别急,下面是我给大家整理了一份比较全面的Vue面试高频考题解析小册。 ![在这里插入图片描述](https://user-gold-cdn.xitu.io/2019/6/3/16b1b79c60741c24?w=505&h=548&f=jpeg&s=69329) ## 对于MVVM的理解 **MVVM** 是 Model-View-ViewModel 的缩写 **Model**: 代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑。我们可以把Model称为数据层,因为它仅仅关注数据本身,不关心任何行为 **View**: 用户操作界面。当ViewModel对Model进行更新的时候,会通过数据绑定更新到View **ViewModel**: 业务逻辑层,View需要什么数据,ViewModel要提供这个数据;View有某些操作,ViewModel就要响应这些操作,所以可以说它是Model for View. 总结: MVVM模式简化了界面与业务的依赖,解决了数据频繁更新。MVVM 在使用当中,利用双向绑定技术,使得 Model 变化时,ViewModel 会自动更新,而 ViewModel 变化时,View 也会自动变化。 ## 开发中常用的指令有哪些 -...

![](https://user-gold-cdn.xitu.io/2019/7/14/16bec4b8fdb8d01f?w=900&h=383&f=png&s=37962) ## 前言 之前在做`webpack`配置时候多次用到路径相关内容,最近在写项目的时候,有一个文件需要上传到阿里云oss的功能,同时本地服务器也需要保留一个文件备份。多次用到了文件路径相关内容以及Node核心API的`path`模块,所以系统的学习了一下,整理了这篇文章。 ## node中的路径分类 node中的路径大致分5类,`dirname`,`filename`,`process.cwd()`,`./`,`../`,其中`dirname`,`filename`,`process.cwd()`绝对路径 通过代码对每个分类进行说明: 文件目录结构如下: ``` 代码pra/ - node核心API/ - fs.js - path.js ``` path.js中的代码 ```javascript const path = require('path'); console.log(__dirname); console.log(__filename); console.log(process.cwd()); console.log(path.resolve('./')); ``` 在代码pra目录下运行命令...

![](https://user-gold-cdn.xitu.io/2019/7/14/16bec49c24c50bf1?w=550&h=348&f=jpeg&s=25984) ## 前言 为什么写拷贝这篇文章?同事有一天提到了拷贝,他说赋值就是一种浅拷贝方式,另一个同事说赋值和浅拷贝并不相同。 我也有些疑惑,于是我去MDN搜一下拷贝相关内容,发现并没有关于拷贝的实质概念,没有办法只能通过实践了,同时去看一些前辈们的文章总结了这篇关于拷贝的内容,本文也属于公众号【程序员成长指北】学习路线中【JS必知必会】内容。 ## 数据类型与堆栈的关系 ### 基本类型与引用类型 - 基本类型:undefined,null,Boolean,String,Number,Symbol - 引用类型:Object,Array,Date,Function,RegExp等 ### 存储方式 - 基本类型:基本类型值在内存中占据固定大小,保存在`栈内存`中(不包含`闭包`中的变量) ![](https://user-gold-cdn.xitu.io/2019/7/8/16bd2282836bad2c?w=370&h=346&f=jpeg&s=17652) - 引用类型:引用类型的值是对象,保存在`堆内存`中。而栈内存存储的是对象的变量标识符以及对象在堆内存中的存储地址(引用),引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。 ![](https://user-gold-cdn.xitu.io/2019/7/8/16bd228c2ad68a18?w=758&h=256&f=jpeg&s=24273) **注意:** 1. `闭包`中的变量并不保存在栈内存中,而是保存在堆内存中。这一点比较好想,如果`闭包`中的变量保存在了`栈内存`中,随着外层中的函数从调用栈中销毁,变量肯定也会被销毁,但是如果保存在了堆内存中,内存函数仍能访问外层已销毁函数中的变量。看一段对应代码理解下: ```javascript function A() { let a...

![](https://user-gold-cdn.xitu.io/2019/7/14/16bec3fc59d12ae5?w=940&h=400&f=jpeg&s=124779) ## 前言 一道经典面试题: ```javascript //JS实现一个无限累加的add函数 add(1) //1 add(1)(2) //3 add(1)(2)(3) //6 ``` 当大家看到这个面试题的时候,能否在第一时间想到使用**高阶函数**实现?想到在实际项目开发过程中,用到哪些高级函数?有没有想过自己创造一个高阶函数呢?开始本篇文章的学习 ## 高阶函数定义 `高阶函数`英文叫 `Higher-order function`。高阶函数是对其他函数进行操作的函数,操作可以是将它们作为参数,或者返回它们。简单总结为高阶函数是`一个接收函数作为参数`或者将`函数作为返回输出`的函数。 ## 函数作为参数情况 `Array.prototype.map`,`Array.prototype.filter`,`Array.prototype.reduce`和`Array.prototype.sort`是JavaScript中内置的高阶函数。它们接受一个函数作为参数,并应用这个函数到列表的每一个元素。下面是一些内置高阶函数的具体说明讲解,以及和不使用高阶函数情况下的对比 ## Array.prototype.map `map()`(映射)方法最后生成一个新数组,不改变原始数组的值。其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。 ```JavaScript array.map(callback,[ thisObject]); ``` callback(回调函数)...