postgresql快速上手

快速安装

a. 通过图形界面安装(适合 windows, macOS);
b. 通过命令行包管理工具安装(适合 windows, macOS, linux);

快速配置

a. 端口配置,默认 5432;
b. 启动服务,图形界面或命令行启动服务;
c. 用户配置,默认当前系统用户以及一个默认的 postgre 用户,可自己新增用户;
d. 密码设置,密码需要专门设置;
f. 链接工具,可以设置系统变量添加工具,比如 psql 或者 pg_restore 之类的,也可直接使用可执行文件路径使用;
g. 数据库配置,有默认的数据库和用户数据库,可以删除和创建;

快速使用

a. 链接数据库,可指定用户,数据库,还有端口;
b. 使用数据库,链接上以后有个类似命令行的工具,支持 SQL 语句进行查询,同时也支持数据库管理命令,比如删除数据库,切换用户,导数备份等等;
c. 作为服务,链接程序配置端口、用户、密码、数据库连上之后通过orm 等链接库使用即可;

RSS 订阅功能上线了

最近两周在进行自我信息管理的优化,其中的一个内容就是要屏蔽推荐算法投喂的垃圾信息,也可以叫做噪音。

我们身处一个信息爆炸的时代,有的人来着不拒,有的人自我封闭,我自己就在这两个极端自己往复了很多年。

就拿微博来说吧,它在提供了很多自己专业视角及生活环境外的新鲜信息的同时,也提供了很多噪音,比如不需要的广告,一些低劣的创作内容,还有谣言。

以前我提到过屏蔽掉微博和朋友圈,然后通过几个信息大节点作为信息来源。其中一个节点就是连岳,后来连叔发生了奇妙的变化。

当然最大的问题倒不是这个,重要的是兼听则明。我们需要听不同的人对一个事件的不同看法,特别是那些有独立观点的人。

这就有一个问题,不同的人有不同的表达偏好,比如这个喜欢写博客,那个喜欢写微信公众号,另一个喜欢写微博问答,还有一些喜欢发推特。

为了看不同人的观点,打开不同的平台,那就是不同的推荐算法给你推荐噪音了。

解决办法就是主动订阅,跨平台的订阅。而 RSS 这个上古的东西就是解决这个问题的。

我自己的 RSS 订阅设置还在研究阶段,但是既然我有一个博客,那么我自己就需要考虑先从做为一个站点的角度去提供 RSS 订阅。

这就是为什么我升级了这个功能。

说句多余的话,公众号正是 博客 + RSS 私有化形式,不一样的是我们受到了平台的限制。

评论功能上线了

最近开始注意主动休息之后,冥想就成了一个日常习惯。

休息之外的一个好处是,很多原来没意识到的事情也变得清晰了起来。

其中一个就是对于我这样的只是单纯的写点文字表达想法的人来说,微信公众号其实是个限制。

一天只能群发一次,一定要有题图,还必须去调一下格式,甚至发文章还要登录扫码。

专业写手为了流量可以将就平台,但对于我们这类纯属爱好的人来说,让一件原本轻松随意的事情变得麻烦了起来。

可以说公众号平台限制了自由,当然我们也有跳出平台的自由。

回到自己的博客之后,在博客爱怎么写就怎么写,一天想写几篇就几篇,不用题图,再套上 markdown 的标准样式。free style,是自由的感觉。

而公众号,只用文字消息转发一下文章链接就好了。看的人自然会打开链接,不看的人给他看还浪费他的时间。

改成转发文字消息之后,公众号消息下面的评论也不开了,内容和评论分离是比较奇怪的事情。

但是,既然我公开表达想法,那么还是愿意听听别人的看法,所以时隔两年之后,终于把博客的评论完善了。

搭建博客用的是 hexo ,使用对应的 plugin 就可以了。评论的存储使用的也是 github , 和博客内容储存同源。

这样就能看文章的人就能评论,能评论的人就能看文章,一样的配方,一样的缘分。

这么一来,先是就把公众号里的水份读者过滤掉了,在之后 github 评论又把评论欲望不够充分的读者过滤掉了。

要是最后没有读者了呢?那就没有了嘛,毕竟我只是处于爱好写着完,顺道给人看看。

这样也能避免一个问题,那就是为了阅读量而写作,为谋生而写作。这类人不是在表达自己,也不是在科普观念,他们本质上只是在搞服务业。客户想看什么他们写什么,平台不让写什么就不写什么。

所以说,真正自由的人不应该把写作作为职业,顶多作为副业。除非,你有为自由饿死自己的觉悟。

ARTS第二周

Algorithm:2. Add Two Numbers

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
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
let addTwoNumbers = function(l1, l2) {
let result;
let currentNode;
let temp = 0;
do {
if (!result) result = currentNode = new ListNode(0);
else currentNode = currentNode.next = new ListNode(0);
temp = (l1?l1.val:0) + (l2?l2.val:0) + temp;
currentNode.val = temp % 10;
temp = (temp - temp % 10) / 10;
l1 = l1 && l1.next;
l2 = l2 && l2.next;
} while(l1 || l2 || temp);
return result;
};

Review:Simplify your JavaScript – Use .map(), .reduce(), and .filter()

作者讲解了.map(), filter(), .reduce(),以及同forEach做了一些使用上的对比。阅读这篇文章,可以对上面三个方法的使用场景有更清晰的认识。

Tip:这周参加了一个线上面试,一紧张用了for循环去做了字符串对比,哈哈。其实有更高级的接口可以实现,甚至用正则也可以。通过这件事情,体会到平时养成使用高级接口的重要性,遇到问题先结合使用环境考虑一下有没有什么高级接口可以使用,如果没有再去用低级接口自己实现。

Share:await探究
我在这篇文章里简单探讨了一下await的一些执行表现。

await探究

这周在js群里讨论了一道今日头条的面试题,这题考察的是对microtask(微任务)和micratask(宏任务)的理解。题目和输出如下:

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
32
33
34
35
36
async function async1() {
console.log('async1 start');
await async2();
console.log('async1 end');
}

async function async2() {
console.log('async2');
}

console.log('script start');

setTimeout(function() {
console.log('setTimeout');
}, 0);

async1();

new Promise(function(resolve) {
console.log('promise1');
resolve();
}).then(function() {
console.log('promise2');
});

console.log('script end');

// output:
// script start
// async1 start
// async2
// promise1
// script end
// async1 end
// promise2
// setTimeout

这里就不对微任务和宏任务进行深入探究了,这里我们来探讨一个有意思的小问题(假设你已经掌握了微任务和宏任务)。

很多人对于async1 end出现在script end之后,而不是出现在async2之后感到有所疑惑。

出现这个疑惑是因为对await的工作原理不够了解,下面我们来解释一下。

先说说为什么有的人会认为async1 end出现在script end之后。这是因为,在代码的书写上,由于使用了await关键字,所以可以使得我们用同步的代码去写异步的代码。

1
2
await async2();
console.log('async1 end');

很多人会觉得是js引擎在执行第一句的时候会暂停,等异步函数执行完了再去执行第二句,这就是误区所在。async/await的作用只是让我们像写同步代码一样写异步代码,而不是把异步代码变成同步代码。 这段代码还是异步的。

await只是promise的一个语法糖,我们对async1进行一个改写,你就能明白await的运行机制了。

1
2
3
4
5
6
7
8
9
10
11
12
async function async1() {
console.log('async1 start');
await async2();
console.log('async1 end');
}
// =>
function async1() {
console.log('async1 start');
Promise.resolve(async2()).then(() => {
console.log('async1 end');
});
}

试着运行改写后的整段代码,是不是发现运行结果是一样的?

我们在来假设一下async2会返回参数,那么代码改写前后的效果如下:

1
2
3
4
5
6
7
8
9
10
11
12
async function async1() {
console.log('async1 start');
let msg = await async2();
console.log(msg);
}
// =>
function async1() {
console.log('async1 start');
Promise.resolve(async2()).then(msg => {
console.log(msg);
});
}

我想看到这里你就能明白了吧,这也就解释了为什么通过

1
let msg = await async2();

这样的写法,我们拿到promise拿到的结果。其实,我们并不是拿到了结果,而是把结果传给了msg这个形参。这放映了一个有意思的问题,代码的执行很可能和我们感觉的非常不一样。

我们在来看看上面的改写,不知道你有没有发现什么问题?

你应该一经发现了,对于promise而言,居然没有catch。很遗憾,这个就是使用await带来的代价。为了应对处理,我们需要使用try…catch来额外的捕获异常。目前还没有更好的解决方案,如果有请你告诉我,博客下面有我的邮箱。

对错误的处理,从另一个角度也说明了在异步嵌套较少情况下(一两层)使用async/await未必是最理想的选择。当然,这还的看业务完整逻辑来判断,比如我们请求一个借口,在封装好的接口内如果已经对错误进行了统一的预处理,那么之后使用await则不用再考虑这个问题。

最后在说一个小小问题,当我们把最开始的代码块放在浏览器里运行的时候,在promise2之后,setTimeout之前会输出一个undefined。这是因为我们通过console输入了一段代码段,而这段代码段会成为当前javascript主线程的执行脚本,在这段脚本执行完后(微任务也执行完才算),会有一个输出值给到控制台,这个输出是脚本最后一条语句/表达式的值。我们这里最后一句是:

1
console.log('script end');

而它执行值正是undefined

如何快速搭建一个博客

昨天的文章发出后有朋友问我有没有搭建教程,我当时回答他说是跟着hexo官网搭出来的。事后想想,仅靠官网上的文档是不足以搭出像我这样一个博客的,虽然并不是很复杂,但我自己在使用hexo之前其实还做了些其他工作。昨天复盘了搭博客的经历,今天就来复盘一下搭博客的步骤吧。

我的博客最终使用的是 hexo + Github Pages 搭建的。前者提供一个搭建模板,用于生成博客的静态网页。后者用来部署同时提供了类似 Nginx、IIS 等 http 代理服务。

准备工作

  • 一台安装了 NodeJs 的个人电脑,用来进行文章编辑和发布用,同时也提供文章本地保存,也可以使用Github对项目及文章数据进行保存
  • 一个Github的账号,免费的就可以,需要给电脑和账号间配置好ssh,详见github官网。
  • 一个域名,由于目前主流浏览器对 http 协议都会进行安全提示,所以最好配个 ssl 证书,证书目前有收费的和免费的,免费的就可以

开始搭建

  1. 本地系统搭建,按照官网操作即可,命令如下:

    1
    2
    3
    4
    5
    npm install hexo-cli -g
    hexo init blog
    cd blog
    npm install
    hexo server

    运行完命令后,本地预览项目就跑起来了。可以通过浏览器打开 http://localhost:4000/ 预览效果。此时可以在项目文件夹内的source/_post下新建文章了,使用的是markdown格式,而且文章的开头需要按照示例的模板填写文章相关信息,详见官网。

  2. 在 Github上新建一个仓库,在项目的_config.yml中配置该项目的地址,以及指定推送的分支。之后会把 生成的静态博客页面发送到这个分支上,用来给 Github Pages 发布用。注意,免费账号只能通过 master 分支发布。

  3. 做完上述工作后,就可以在本地运行如下两行命令生成静态网页,并推送到我们先前指定的项目分支中了。

    1
    hexo clean && hexo deploy

    上述命令是重新生成我们的静态网页,希望增量更新可以使用下面的命令

    1
    hexo generate --deploy
  4. 发布到对应的分支后,在项目的 setting 中的 Github Pages 的下,设置一下 source 选项就可以了,选择你要之前配置的发布的那个分支,免费账户目前只能是master。配置好,就能看到 Github 给你分配的项目地址了,一般是 https://你的账户名.github.io/你的项目名/ 这样的形式,过一会就你打开了。之后,你每次添加完文章后,都需要执行第三步来提交网站更新。

  5. 补充一下,这里的项目只是用来发布的,如果需要进行项目管理的话,可以用其他分支来保存项目数据,比如edit。也可以另外起一个github项目来保存,我就是使用的这一种方式。

配置域名

到上面我们的完整就可以用了,但是作为个人网站,没有使用一点个人特色的域名总觉得少了些什么。所以接下来,我们配置一下域名。

  1. 首先在我们的域名提供商那将我们的域名指向前面 Github 提供的地址。域名指向有几种,我们用的是域名指向域名的方式。
  2. 在github的项目中的 setting 中的 Github Pages 的下,设置一下 Custom Domain 填上我们的域名。此时 Github 的项目中会自动生成一个CNAME文件,里面正是你刚刚填写的域名。
  3. 到这里我们的域名配置就完成了。但是,Github Pages 有个小bug。那就是我们每次提交更新的时候,项目里面的 CNAME 文件都会被冲掉,需要我们每次都重新填写域名,这非常低效。解决方法是,在你本地项目的 themes 里面的模板文件夹下的 source 文件夹里放入这个 CNAME 文件。也可以直接新建一个无扩展名文件,写入你的域名即可。这样之后,每次更新这个文件会自动部署到你的发布项目中。
  4. 最后就是 https 的问题了。若你的域名不支持 https 的话很多浏览器会有不安全提醒,这个时候去给你的域名申请一个ssl证书就好了。申请好了以后,在Github的项目中的 setting 中的 Github Pages 的下勾选 Enforce HTTPS 就可以了,Github会自动去证书提供商那里扫描证书,后面打开页面 https 就正常了。
  5. 值得注意的是,域名配置和申请证书都涉及到相应的运营商,不同的运营商处理的速度不一样,所以域名和证书生效的时间也不等,一般最长不超过一天。

持续写作

如果一切顺利我们的博客就搭完啦,但你会发现它空洞洞的没什么内容。想要博客丰富起来,只能靠你自己持续的写作了^0^。

我的博客终于正式上线啦!

搭建个人博客的想法最早出现在2017年初,那会还在学习ruby on rails,想着有空自己搭建一个个人博客网站出来。在此之前,都是在各个平台零零散散写东西,qq空间、校内网、新浪博客、网易loft、部落格、微信公众号。

可以看到,由于网龄较长感觉各大平台都淌了个遍。也见证了各个阶段发布平台随着时间的变迁,微信的出现qq空间没落了,微博的出现新浪博客和校内没落了,网易loft和部落格也是小众,现在也就还有微信公众号还在浪潮上,这也是我目前公开写作的主要地方。但,谁又说的清楚下一个浪潮何时再来呢?

一开始只是写着玩玩又或者宣泄情绪,更新频率也是变来变去。但时间久了以后,发现自己已经写了不少东西。17年初是写的最频繁的时候,那会天天写ORID,于是萌生了把所有文章统一汇总到一个地方的想法,考虑到平台变迁的规律,加之在学技术,自然而然萌生了搭建个人博客的想法。

万万没想到的是,这一搭就是两年多…

一开始想着学ror的话,就用它搭一个,搭出来丢到heroku上,网速慢的不行,就想着自己搞台服务器部署一下,好不容易部署了,就差域名和UI优化了,结果转去学js了…再然后,学express的时候,把服务器重置了…然后,想着既然学js,那就改用express + vue在搭一个吧。等一切准备就绪,服务器也续费了,域名也买了十年,工信部那边也备案了,就等部署的时候,js的学习进入了单页面应用阶段,于是开始重构博客项目,要写成前后分离的形式。这一步完成以后,就过年了…等过完年,我就开始找工作了,之后就开始了996的快乐生活。而搭建博客的事情也就没有在想过了。

终于,前段时间我结束了一年的996生活,搭建个人博客的事情再次提上了日程,然而尴尬的是我的阿里云服务器过期给注销了…在和阿里云沟通过后,考虑价格因素(双十一至少打对折)我决定等到今年双十一再买云服务器,博客的事情也就推到双十一以后了。

当然事情再一次没有按照我的预料发生,上周我报名参加了左耳朵陈皓的ARTS打卡活动,每周要写一篇技术文章,同时还有写一个汇总贴。考虑到我的微信公众号里90%以上的人没啥技术背景(其实他们也不怎么看…),总觉得在微信公众号上面长期更新技术类文章总是不太靠谱,于是乎又开始想着搭建个人博客了。鉴于之前的项目都没有做什么UI优化,就想先了解个博客模板系统来搭建,之后再买个服务器来部署。

先了解了几个朋友在用的模板,一了解发现服务器都可以省了,技术朋友们之前好像和我说过,但那会没有那么强烈的需求(需求果然是前进的动力啊!)也就没过脑子。于是上周末用小半天的时间,初步上线了(用第三方的东西就快啊)!这两天零零散散给配了域名和证书,还有就是把一部分的数据从之前的平台迁移过来,看起来算是有模有样了。后面有时间的话会把以前在各平台写过的文章都汇总过来,再看看情况考虑一下完善SE0、评论、RSS等功能,但这些都是次要的,发布功能才是最重要的。有一个自己的发布平台感觉还是不太一样的,哈哈哈!

虽然拖了很久,也还有很多不完善,但不管怎么说,

我的博客正式上线啦!

ARTS第一周

Algorithm:1. Two Sum

1
2
3
4
5
6
7
8
9
10
11
12
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let map = {}
for (i = 0; i < nums.length; i++) {
if (map[nums[i]] !== undefined) return [map[nums[i]], i];
map[target - nums[i]] = i;
}
};

Review:WebAssembly — Is It As Scary As It Sounds?

作者通过实作一个简单的项目介绍了WebAssembly,里面还应用了几个介绍资源,看完后能对WebAssembly有个大致的了解。

Tip:如何快速搭建一个博客
通过Hexo搭建个人博客非常方便,不到半天就能搭好。

Share:Typescript未来会如何?

typescript未来会如何?

日前,阮一峰老师公开发表了对typescript(后简称TS)未来的不看好的观点。

阮一峰老师的核心逻辑是这样的:1,未来任何语言都可以写前端;2,在此前提下,为了解决js类型问题的ts本身作为js的超集并不具备天生的类型优势;由此两条得出一个结论,既然能用诸如java等强类型语言来写,为何还要用ts呢?

那阮一峰老师的观点如何呢?我们来分析一下。

未来任何语言都能写前端?其实准备的说,是未来会有更多的语言至此WebAssembly(后简称WA)。浏览器目前的主流工作方式是,通过V8引擎将js代码进行编译,之后交由浏览器更底层的内核来执行。而WA,则是由多种语言转换成字节码交由WA虚拟机执行,而WA虚拟机则对接浏览器底层,其工作原理类似JAVA。从性能上,WA的执行比JS快很多。就像在服务端的JAVA的执行优于JS。

这么说来,好像JS会被淘汰一样。但事实是,就目前来说,WA还不能直接操作DOM。现有的方法都是通过间接调用JS实现,就使用和性能上说,还不如直接使用呢。WA与其看做是JS的颠覆者,倒不如看成是JS的补充者。在强计算的场景下,利用各语言的特长来对客户端的能力进行进一步的扩展。

这么看来,即使很多语言能参与到浏览器中来,但核心地位的JS短期还是不会变化的,而且就目前的实现方案来看。现阶段的.wasm文件还是需要通过JS引入执行就很好的说明了问题。

即便你通过JAVA写了WA,你还是得使用JS。而有JS的地方,自然也就还有TS。

从另一个角度讲,微软背书的TS未来是否也会成为支撑WA的语言呢?如果可以,那也不是一种选择?

另一方面,JAVA的类型系统更加全面,但也更加复杂。就类型而言,很多人认为JS是自由的,在写代码的时候,不用考虑那么多东西,专注在业务逻辑上,某种角度来说,动态弱类型反而是JS的优良特性。而TS的出现,可以认为正好在JAVA和JS的中间建立了一个桥梁。一方面我们可以用any类型享受到JS的自由,另一方面我们又可以通过明确的类型在编译阶段扫除掉弱类型带来的潜在问题。阮一峰老师认为TS的类型系统不如JAVA就不如写JAVA这一点显然是不对的,因为若如此JS就不会有今天的发展。

JAVA的发展和JS的发展源于他们在不同领域的特长发挥,脱离场景谈语言优劣是没意义的。

typescript未来会如何?

我觉得就类型系统和WA的发展来判断是不足以得出具体结论的。我更倾向于详细人类群体的惯性。我不认为未来会有很多后端会转职成前端,特别是使用它们现有的技术语言写前端。我更倾向于认为,未来写前端的还是前端。而要它们放弃现有的语言去学习新的语言来写前端也是不太可能的。所以,JS在前端领域依旧会是霸主,而WA的支持语言也并不会把JS、TS排除在外。而在前端项目复杂度越来越高的前提下,TS无疑是前端同学应对复杂工程最优的选择。

纸上得来终觉浅,绝知此事要躬行——半年工作总结,一年学习总结

转行工作差不多半年了,而学习js的时间,则是一年多。一年的时间里,真的学习了很多东西,在这里要感谢一下徐高阳老师和JavaScript社区的各位小伙伴。

学习知识的总结

2017.08-2018.03:脱产阶段学习
  1. 学习编程先导课-JavaScript编程入门(在花了超值的199买了入门课程后,开课前补看的)
  2. 学习JavaScript编程入门(认真的完成了每节课的作业,上完课后获赠了《Head First HTML5 programming》)
  3. JavaScript编程入门结课后按徐帅的推荐开始看犀牛书
  4. 参加了JavaScript社区的十月每日一学,连学三十天活动
  5. 学习编程幼儿园—快速攻破编程学习障碍课程
  6. 学习Web与网络基础先导课
  7. 学习JavaScript进阶先导课
  8. 学习Web与网络基础课
  9. 学习JavaScript进阶课
  10. 向徐帅请教找工作建议,徐帅建议从前端入手
  11. 学习HTML5和CSS3(以前学过一次html和css但没有学5部分还有3部分)
  12. 学习bootstrapUI框架
  13. 学习VUE课程
  14. 学习vue文档基础部分
  15. 准备简历,重点梳理自己学过的知识完成的作业及项目写到简历上
2018.03-2018.09:工作阶段学习
  1. 学习使用原生接口写页面交互,重点学习了DOM知识及相关API
  2. 学习小程序开发,结合徐帅在JavaScript社区里关于小程序的描述及vue的思想来学习小程序开发文档
  3. 学习Chrom插件开发,重点看了几篇网上的Chrome开发指南
  4. 学习用原生CSS写样式,边用边学,但一开始重点学习了CSS布局相关知识
  5. 学习使用Postman测试后端提供的接口
  6. 学习跨域相关知识
  7. 学习http请求相关知识、axois库及辅助库qs
  8. 学习使用chrome开发工具排查接口及样式问题
  9. 学习自适应布局,小程序中通过rpx
  10. 了解mpvue, wepy
  11. 学习使用图形界面给后端搭好的服务器放静态页面
  12. 学习jquery
  13. 学习vue文档router部分和vuex部分
  14. 学习给站点js嵌入广告
  15. 学习给站点检查sdk及排查木马植入
  16. 学习如何防御DDOS
  17. 学习如何防御http劫持攻击,了解IIS的配置方法
  18. 学习防盗链相关知识,顺道学习了NoSQL和了解redis
  19. 学习svn操作
  20. 学习小游戏开发文档,公司后来取消了开发需求
  21. 学习小程序打包编译及埋点原理
  22. 实践使用vue-cli起项目,并拆分可复用组件
  23. 学习elementUI
  24. 学习UEdit
  25. 学习Ramda
  26. 深入学习promise
  27. 实践封装API
  28. 学习eslint,后来开发任务重就一直没打开检测
  29. 学习async/await
  30. 学习webpack相关知识
  31. 了解微信第三方开发平台
  32. 了解grunt、gulp、npm等前端自动化手段
  33. 学习写windows的cmd自动化脚本
  34. 此外工作过程遇到的很多问题也在微信群还有JavaScript社区找到了答案。比如大师兄的模仿网易云音乐转碟的css文章;于鑫关于import/export的文章;大师姐的风格的要素等几篇文章;学习JavaScript社区家树的箭头函数的几篇文章;至于徐帅的就太多不列举了~有时间的话,每一篇都值得看^o^。

    学习心得

    先援引陆游的一句诗:“纸上得来终觉浅,绝知此事要躬行。”
在实战中进步

从去年开始就一起学习的同学应该可以看得出来,在工作阶段里我学习的很多东西其实在先前的课上很多是已经学习过的,比如postman,再比如vue组件抽离。

编程有其知识的属性,但更多的是技术。而技术是需要实践的,未经实践的技术很难说被我们真正掌握了。这里可以从两个角度来说,一个是未经过充分的实践,编程的知识并没有在大脑里形成足够鲜活的有效的记忆链接。另一个则是,没有形成肌肉记忆,不能形成一种条件反射式的应用直觉。所以,要想真正掌握一个东西就要把它用起来。

要用就需要给自己找需求,找那种需要技术去解决问题的需求。尽管跟着例子、跟着demo敲这个也是一种提高熟练度的方法,但这种方法对大多数人大多数时候并不能形成其应用技术的思维习惯。换言之,这不是最有效的技术应用场景。

在我看来,最有效的场景是工作!你永远不知道会有什么新需求新挑战在等着你。没有工作条件的朋友,最好能把尽快找到工作,并在工作中实践为目标。这里的工作不单只给别人打工,创业、解决社会一些问题也是。总之,就是能用技术解决问题的需求。

找不到这类需求的同学也不用急,没有新需求的话,我们找别人实现过的需求来自己做也是差不多的,只是这类需求可能少一些刺激与挑战,毕竟没有时限以及属于明确可以实现了的需求。

先举几个例子,比如为了练习vue全家桶(vue-cli,vue-router,vue-vux),可以使用cnode提供的接口,来自己模仿写一个cnode社区出来。比如为了练习小程序,可以使用豆瓣电影提供的接口,自己写一个小程序的电影资讯小程序出来。还比如,可以自己起一个express及mogodb,模拟豆瓣接口提供的数据,自己把数据拔到自己的接口上,在实现一样的接口逻辑。

值得一提的是,经过这种方式的学习,你最终收获的不仅仅是技能,还有简历上多出的项目也就是你的作品哦。

在路径上努力

路径通往目标,弄清楚自己的发展方向很重要。我并不认为什么都学一些不好,但人的时间确实是有限的,特别是当你有某个有期限的目标时。学习要有主次,而主次权重是和你的具体目标相关的。这就好比打牌,大家手里的牌数是一样的,但是出牌顺序的不同牌局的结果自然也不同,时间也是一样的。

举个转行的小例子吧,如果某个同学是想转行成为一名工程师,想在这条道路上取得一定成就。而且刚好认同我上面提到的在工作中积累是最快的(上面不是这么表达,但意思是一样的),那么他就会以尽快找到工作为目标,如果他想找前端他应该开始收集html、css、vue、elementUI等就业市场,或者说大多数用人公司希望能应聘者具备的技能,而不是将时间一半分给vue一半分给node。

诚然,熟悉后端的前端会有加分,但加分项就是加分项,总是在基本项之后考虑。当然,有少数公司比较看重综合性和成长性,但我们这里关注的是行业的一般状态或者说大多数招聘公司。如果不是对自己的运气特别自信,还是按大概率的事件来决策比较好。

同样的道理,对于工作中的同学也适用。结合自己的中期规划,学会逆向思考。从你想到达的地方,倒退出到当前自己的脚下的路径,一步一个脚印,踏踏实实往前走。边走边调整目标、方向、路径。路自然就越走越明朗。

在交流里学习

编程属于工程学科,所谓的工程学科意思是你不需要从零开始造汽车,大部分时候我们要做的只是组装工作。

老板给你提了一下需求,大多数时候是希望你尽快保质完成,而不是希望你独立完成每一个细节。这是市场竞争决定的,大多数创业公司考虑业务发展的第一要素还是在于又快又稳。这个时候,使用已有的技术实现方法就是优选,除非解决问题的技术方法还没出现需要你们去开拓。

那这种技术实现已经出现了没有?如果出现了已经出现了几种?在已知技术的前提下,我们看技术文档同时做一些适当测试当然是必不可少的,但问题在于你怎么知道有什么新技术呢?

最近看到了一个对“沟通能力”的解释,就是用信息换信息的能力。这个形容真的好,我们在解决工程问题的时候,很多时候并不是技术手段的问题,而是思路的问题。

萧伯纳说:“你有一个苹果,我有一个苹果,我们交换一下,一人还是一个苹果;你有一个思想,我有一个思想,我们交换一下,一人就有两个思想。”思路和思想也是一样的,虽然我们有github、有各大技术app,但他们和技术交流并不冲突。以前是你有一个解决技术问题的思路,我有一个解决技术问题的思路,我们交流一下我们等于每人具备了两个解决技术问题的思路。现在是你逛github、逛技术论坛、看技术app有100个解决技术问题的思路,我也做类似的事情也有100个解决技术问题的思路。如果假设我们关注的方向不同,那么我们一交流,就等于我们每人具备两百个解决技术问题的思路。如果,我们交流的人再多一点呢?

嚯嚯,很吓人对不对?

就我个人而言,这不是空谈。半年来,我有好多次工作遇到问题的时候,跑到群里、跑到JavaScript社区里找思路。JavaScript社区的好,谁用谁知道^o^

工作心得

软技能

在成为程序员前,我在前公司工作了近六年。离开时,有种悲壮的伤感,觉得过去十年的积累(因为做的是对口专业的工作)一朝尽弃。

后来在学认真学习js的过程,我发现自己大学所积累的东西并没有完全白费,很多知识是互通的。框架、模块化等等工程思想并没有局限在一门特定的学科中。

再后来在工作中进一步发现,过去工作中所积累的东西也并没有完全白费。一方面虽然继电保护、潮流计算这些专业知识凉凉了,但是故障分析与处理、负载均衡这些专业知识背后的软技能却是可移植的,姑且叫bug分析与处理、访问量负载均衡等等。可移植本质上是因为电力系统和计算机系统甚至互联网这个系统还是具备抽象上的可比性,所以自然也存在可借鉴的地方。

另一方便,处理业务上的软技能,比如项目管理、汇报工作、不同专业间沟通、了解客户需求这些则根本不存在所谓的移植一说,他们直接就是伴随一生的技能。

你可能不禁要问,这些和编程工作有关系嘛?

有啊!在敲代码之前,我们是不是要先通过沟通明确好需求?在明确好需求后我们是不是要设计好程序的流程及结构?

在我看来,代码只是用编程语言把我们要解决问题需求的思想方法表达给计算机去实现罢了。徐帅之前说的:“代码只是最后一步。”正是这个意思。

任何工作都分软技能,编程工作的软技能就是这些沟通和思想的东西。而硬技能则是写出让计算机能按预期工作的代码。

那么软技能如何培养比较好呢?自然是工作和交流,当然还有贯穿其后的不懈的学习与思考。

从这个角度而言,无论你是不是在从事编程工作,软技能的积累都已经开始了,无论何时认真对待自己的工作,总不会白费的^o^。

硬技能

硬技能也就是我们敲代码的能力了。

在提高代码能力的路上,我自己也才刚刚上路,需要学习提高的地方也还很多,这里就浅薄的谈谈近半年的一点小体会。

先说句废话:“电脑是没有脑子的”

计算机和互联网本质就是机器,再说一句废话,机器是”死”的,是不会变通的,所以我们的代码最终都必须遵守一些”死”的规范,这样”死”的机器才会去执行。在遵守这些”死”的规范之上,才会有我们发挥的空间。

小到编程语言的词法,中到api文档,大到各种协议。遵守他们是代码正常工作的前提,这些知识都需要掌握,掌握好他们能避免绝大多数bug的出现。

初学入门编程容易忽略这些最基本的东西,但是当工作后才发现,它们又非常重要。是整个工程的基础,而且掌握了他们其他的东西也自然不在话下。

在掌握好基础后,还需要掌握一些常用的数据处理方法及典型算法,以及对一些常用库的掌握,比如ramda、vaild、moment等。更甚至可以试着尝试函数式编程等等这些提高我们开发效率的高端技能。

提高开发效率对程序员是很重要的一件事情,因为它能让老板更开心,让自己更轻松或者更高产。而老板开心自己高产意味着收入的提高啊!!!

当然,也不能单纯的以开发效率来考虑代码质量。语义性、健壮性、可扩展性、易维护性等也很重要。

语义性,更多的是为未来的自己或者其他合作的同事节约时间,最差不要人家或者自己以后看不懂吧。。。

健壮性,则是保证生产环境的代码别动不动就当机,服务崩掉或者出现预期外结果。给别人打工就要对工作负责,给自己打工就要为客户负责啊。

可扩展性和已维护性要说的就多了,以目前个人浅薄的水平理解的话,就是在语义明确的基础上,合理设计架构,使得维护或者更新升级的时候,代码改动范围及影响范围限制在一定范围内。

这貌似的设计模式要考虑的问题,徐帅又说函数式编程秒杀一切设计模式。而我又还没看,就不继续妄议了,同学们感兴趣的话可以研究下。

写在最后

决定我们的不是我们怎么想,而是我们怎么做。

想学编程?

想换一份工作?

想过另一种人生?

选择只属于去选择的人。

写了好多,希望能对大家有所帮助。^o^

年近三十,非计算机专业,在体制内工作六年后转职程序员心得

三月份转职成为程序员,现在已经一个半月了,虽然转职的路上充满了很多的未知和不确定,但只要方向正确、路径合适,转职成功率还是很高的。回顾自己的转职历程,有些收获也有教训,在这里分享一下,希望对想转职的朋友有所帮助,希望能帮助想改变自己命运的朋友更快的达到目标。

个人基本情况

89年生人,大学本科,电气工程及其自动化专业,11年到17年期间在央企工作了六年。

学习过程

大学期间有学过c语言、汇编语言、网络应用基础等理工科的公共课。毕业后工作的六年里再无实质性接触过编程,直到2016年度底报名新大全栈营学习ruby on rails,在学习ror期间发现自己对编程的兴趣,于是产生了转职程序员的想法,加之先前的工作做得不是很开心于是萌生了脱产学习的想法,给自己一个空窗期用于学习和思考人生。最终于17年3月底开始脱产学习直到今年三月。脱产期间除了学编程外还认真学习了英语以及研读了一些社科类书籍。学英语是因为它是程序员的玻璃顶,由于打算将编程作为终生职业,所以想趁着间隔年一并解决。研读社科书籍是因为编程只是一项技术,它只有结合具体使用场景才能发挥作用,而使用场景更多时候是由技术以外的东西决定的。之所以要说这些,是想说明如果你只安排学编程的任务,转职根本不需要一年的时间。三月底离职后,我又学习了一段时间的ror,原计划半年后也就是9月份找工作的。结果在8月初的时候徐帅开js课了,抱着补充前端知识以及报了不吃亏报了不上当的199元,我报了徐帅的课程。在上了徐帅的课程后,我开始深入理解编程是怎么一回事,于是学习重点暂时由ror转向了js,并将找工作的日期推后一个月。可万万没想到,徐帅开完入门又准备开进阶课,于是自然而然的又想跟着上了。在这个过程中,一方面全栈营的同学给我反馈了ror在中国就业情况不理想,另一方面我也开始留意到js大发展的趋势,以及ruby衰败的态势。最明显的两个数据就是github去年10月份发出的程序语言排名,以及rails和express两个功能类似框架的star数。于是,徐帅十月份在JavaScript社区办一日一学活动的过程中,我逐渐确定了放弃ruby的路线,改走js路线。后来,自然而然跟着徐帅上进阶课,于是找工作的日期再次推迟。由于先前学习的ror偏后端,所以原计划在进阶课结束后去找nodejs的工作,如果不行再试着找前端或者ruby的工作。12月份的时候进阶课结束,我按计划打算开始找工作,但这时不太确定是先尝试nodejs是否稳妥,于是给徐帅发了条微信咨询,最后徐帅给我打了电话,给的建议是先从前端入手。于是,我就开始补之前略过的一些前端知识html5、css3、bootstrap3,决定补完它们去投简历。万万没想到,这时徐帅又要开vue课。那还能咋办?跟着学呗。于是,找工作的事情就安排到年后了。这期间,一方面跟着徐帅学vue,另一方面补充上面提到的几点知识。就这样到了今年三月份上面的知识我才大致过了一边,并且把简历准备好。

找工作情况

三月份中旬开始正式找工作,在主动投简历之前朋友介绍了一家,但不是自己要走的方向就没给简历,之后自己先后一共投了三份简历,一份说不合适,一份没回复,一份约面试然后面试当场就确定入职,后面也没再投过。找工作的平台是boss直聘。找到工作后,上面又有三家主动联系我,但因为现在的工作时间不长都没有去接触。

简历

张越张大大在群里说过,找工作最重要的是作品。这点我深表认同,尤其是在简历阶段。在和同期入职的程序员接触了才知道,找第一份编程工作时简历能三中一还是蛮难得的。当然,这是他们说的,究竟如何可能还有运气成分。但,我觉得要说自己简历的优势在哪里,那就是有作品。首先是两个我在学习ror时做好且部署好的网站。其次是和徐帅学习express时做好的博客雏形,虽然没部署,但完整代码在github上。再次,就是github上的commit数。虽然不算多,但近一年也有将近三百条。它们证明了我最近一年确确实实在敲着代码。最后,就是我在学习ror的时候写得一个记录博客。在学js的时候,想自己做出博客再写。。结果现在博客也没部署好,记录也很长时间没写了。。。简历还有一些其他东西,比如知识面,技能等等。这些基本来来去去都是那些,但有一点,如实填写你的掌握程度,或者适当抬高一点点,比如写个熟悉。有了这些,我觉得简历关基本是可以过去的。

面试

如果不算找工作前和朋友介绍的公司cto吃饭闲聊的话,我就只面试了现在的这家公司。面试过程除了自我介绍,就是问我简历上的东西。更具体的,就问了我vue和express抄(这里要感谢徐帅一下^o^)。vue的话,问我用来做过什么,我就说做过徐帅的那个抽奖及打卡,并且移植到了vue-cli。express就问了中间件和错误前置处理原则。由于两个问题答的比较流畅,他们也没多问,当场就叫hr来谈入职。这里要说一句,碰到这种情况千万不要急着入职,最好再多面两家挑一下。不过我也是因为编程工作零经验,主要目的是尽快拿经验,其它的一律以后在考虑。

心得

回看自己的转职历程,发现目标确实不够明确,没有分清轻重缓急。假设时间能倒流,或者我能给过去的自己提一些经验,我会和他说下面这些:

1、如果是想转职,那么应该先以成为工程师为目标,而不要一开始就拘泥于长期想发展的方向,转职是从0到1,转方向是从1到N。先把最重要的事情办了。

2、程序员重经验,所以越早积累好处越大,而转职效率最高的是转前端工程师。这不但是从入门难度低,而且就业需求也高。这一点可以打开招聘app看到,这也好理解。无论什么后端,什么公司,什么内容,最后总需要一个页面去呈现内容或者实现交互,无论是对用户还是对管理者。

3、html、css、js是基础,而js同时也是重点。html除了基本的外还要学一下dom,css的难点是布局,弄好布局其它的都是小问题。有了基础的前端知识以后,熟悉一下前端框架。从使用率和就业市场讲就是徐帅讲的vue还有他推荐的bootstrap。至于其它的比如,jquery,看过dom学起来就和玩似的。而express则是一个加分项,懂点后端的前端工作起来会顺畅很多,但这不是转职前端的必须项。

4、要有自己的作品,以及记录自己学习的证明,github就是最理想的平台。有事没事往上推,而且作品完整度越高越好。不过前端的话,有本地可呈现的页面也就可以了。作品会和需求挂钩,要给自己找需求,没有的话问问工程师朋友,他们都做过什么项目,有哪些简单的自己可以试着做做。

5、学好一门语言再去学其他的,js就是最理想的入门语言,而且日后发展方向多。从使用量和前后通杀的现状来看,必然还会活跃很长的时间,未来哪一天成为编程界的英语也保不准。

6、多在程序员的圈子浸泡,很多概念可能一开始没理解,很多别人讨论的问题可能也没听懂。但,这些概念的熟悉度会提高,这些问题未来的某天可能也会遇到,那时一个聊天搜索或者帖子搜索就能帮你剩下几个小时甚至几天寻找思路的时间。(时间点回到现在,js微信群和JavaScript社区就是很好的技术圈子,已经帮我解决了不少技术问题。)

写给想转职的朋友的其他的话

很多事情都是有风险的,包括转职这件事。但这件事的风险也并非不可控,它的风险并不在于你能不能学成编程这项技术,只要你够努力,方法对,学成只是时间早晚的问题。风险在于,如果你想把它当做一门职业,你能不能为市场提供它想要又价钱合理的东西?这涉及两个因素,一个你学的技术是不是市场需要的?另一个是,你是否能拿得出匹配你想要工资的能力?如果上面两者你都能回答是,那么年龄、专业、学历、经历通通不是问题。因为人家要的就是你有他买得起的又想要的能力。

对于这两个问题。

工资嘛,你可以开的低点。大不了中级水平去应聘初级岗,老板肯定高兴得当场想把你签下。

至于你的技术是不是市场需要的这个问题,我敢说你能来到JavaScript社区,这个未来几年已经不是问题了,前提是你够努力。至于几年之后会如何,那就要看JavaScript社区的小伙伴们的努力了。

当然,这里面自然也包括了你,加油哦^o^。

工作三周分享——做前端可能需要的一些知识

转行成为前端工程师三周了,有很多东西想分享给社区的小伙伴,但无奈现在每天都是枪林弹雨,周末和晚上都在狂补基础,时间实在有限,更多的东西等缓过来再分享,这里就先简单的分享下这段时间我觉得对转前端比较重要的东西,很多是徐帅在课上强调过的,还有一些我开始找工作的时候徐帅也给过建议,但是当时没有get到点,现在有了切身体会,所以供小伙伴们参考和补课。
1、DOM对象,这是链接HTML/CSS与JS的关键知识点,也是jQuery/Vue等库和框架的底层基础,少了它前端知识会有重大缺失。有的公司不一定用它,但这个知识对于理解前端框架非常重要。
2、原生CSS,虽然有很多框架,徐帅也说过用框架会有效率。但是,工作中不可避免会遇到一些框架解决不了的问题,这个时候使用原生的CSS就不可避免。然后,这里重点的是CSS布局。因为布局定好以后基本就是调样式的问题了。
3、jQuery,很多公司已经不用这个了,但是还可能有很多公司在用,我公司的一个管理页面就是用的它。所以,有时间的话最好学习一下,而且如果了解了上面提到的 DOM 对象,看jq其实非常快。
4、js基础,就像徐帅说的一切都是JS,无论是小程序还是各种框架甚至是google插件本质上都是JS写出来的。js基础越好就意味着你能做的事情越多,在具备基础的html/css知识后,本质上考验的就是你的js基础知识了。
5、VUE和小程序,小程序和VUE很像,但是还是有很多不一样的地方,如果要开发小程序,一定要认真看小程序开发文档,虽然有和徐帅学VUE理解会很快,但这不代表你可以直接上来就用。认真看文档是程序员最基本的素质。
6、把知识用起来。很多同学跟着学习了好长时间还不知道怎么用,这里反应了两个问题。第一个是没需求,第二个是没思路。
(1)工作与不工作对于学技术最大的区别不在于有没有工资,而在于有没有需求。当产品提需求的时候,为了工作我们自然而然要去把知识用起来。但是还没工作的同学就没有这个条件。那怎么办呢?自己找需求。方式很多,比如做老师布置的作业、做自己想做的东西、到freecodecamp上做题以及问问工作了的同学在做什么,只要你想给自己找需求自然找得到。
(2)有需求后很多同学做的时候会没思路,这个问题其实不单没工作的同学会遇到,工作了的也会遇到。除了多看基础多思考外,更高效的方法就是多看别人的Demo,demo就是别人写好的项目代码,最好看类似项目的开源代码。这个过程里不单可以直接把部分代码拿过来用,而且可以学习和借鉴别人的思路解决自己的问题,同时这也是运用基础知识的过程,通过这个过程你会发现自己的不足,就可以有针对性的去补基础了。
7、看demo的技巧
(1)有的demo往往很大,这个时候很难下手,这个时候可以试着庖丁解牛。就是需要用什么功能就重点看对应部分的代码。
(2)在想弄明白代码作用的时候,可以多用删除和撤销。这样就能很直观的理解很多代码的作用。
(3)编辑器搜索,当我们想了解一个变量或者函数的作用的时候,不妨在文件甚至项目里搜索它,看看它都用在什么地方,或者在那里定义,又或者从哪里引入。这对于理解变量和函数有着非常大的帮助。
(4)把开发文档、w3c和mdn当作字典来用。虽然google也可以很快查的你想要的东西,但直接使用开发文档或者w3c和mdn来查相关内容效率会高很多,看demo就像看英文文章一样,学过html/css/js就像基本知道了语法,剩下的标签、属性、借口无非就是单词。碰到不懂的查一查,看demo基本问题就不大了。
8、photoshop,如果是找做前端页面的工作(比如实习工作),会要求你根据PSD切图还原界面,这是传统的前端做法。psd就是ps设计稿,基本你需要做的就是切图还有写html,再通过css调样式,之后给页面绑接口。如果是找这类型的工作,建议简单学一下PS的基础技能,不算难,学几个具体的PS技能就可以办到了。

Javascript连学一月活动总结

一个月的时间,很快就过去啦。一个月来在老师的带领下学习和复习了很多的知识点。关于知识点的总结在问题里还有老师的总结里已经写得很详细,我就分享一下心得体会吧。
首先要检讨下自己,由于中间好友结婚去帮忙所以有几天的学习是后补的。好在学习这个事情永远都躺开大门,只要你想学,知识永远在等着你。
在上老师的JavaScript入门课之前,我实际上并没有真正接触过JS。虽然有着大学C的基础,以及先前学习过Ruby on Rails框架的基本套路,但我始终没有搞明白在底层的数据结构和上层的功能之间究竟发生了什么,也就是他们是如何打通的。
这个疑问我最终在老师的JS入门课上找到了答案。然而这个答案只是思想上的答案,它并不能使我立即懂得Ruby的基础,也不能使我立即拿起C的基础去实现高级的功能。它只给了我一个方向,至少要先把一门语言的知识从下到上真正打通。
这时我就面临了是往上学JS还是往下学Ruby的问题(直接抛弃C)。由于JS和HTML及CSS一起构成了前端三大件,在深入学习ROR过程中也早晚需要学习,加上在JS入门课时已经在看了部分犀牛书,因而选择优先深入学习JavaScript。
就在我慢慢啃犀牛书的时候,老师发起了这个一连三十天的活动。到今天为止,我也就啃到了7.6,更不用说一个月前。然而,这并不影响我参加老师的活动。闭包、索引、Promise、constructor、docker……这一票的概念我也是看到问题后才去翻书、去google的学习的。
这是看书学习的两种模式,在面对实际问题的时候往往第二种模式更有效率。第一种模式,类似于我们的对象遍历方法,它是在遍历书上的知识,并为他们在你的大脑里建立索引。而这么做的一个目的无非是为你将来在使用第二种模式解决问题的时候更有效率,能更快的找到你要的东西。
个人认为老师这一个月不单为了教给我们一些知识和工具,更重要的是尝试着带我们熟悉这种解决问题的模式。给你一个问题,去找一个知识点;给你一个库,去找它的用法;给你一个需求,去找它的实现。写到这里,不由得想起老师在js入门课第一节和最后一节上说过的话,大意是:我们不希望这门课只是教你们一些套路,我们更希望能教你们一些东西,能让你们去解决问题,能去做出真正的东西来。
问题就是我在JS入门课上找到的把编程语言从下到上打通的关键,经过这一个月我更加坚信这一点。在编程的世界里没有多余的东西,因为那会消耗多余的资源。数据类型也好、方法函数也好,它们一定解决了什么问题才得以在编程世界存在,而它们解决问题的方法又能组合起来解决更大更复杂的问题,以此类推直到我们能直观感受到的程序与应用,这就是这些基础知识存在的意义。
而打算迈入编程世界大门的我们需要掌握这些基础知识的意义在于,当我们遇到一个未知的问题并试图分析解决的时候,你会发现在这棵发散的问题树的末端,等着你的始终是基本的数值、文本、布尔值、数组、对象、方法、函数、库这些最基本的东西。只有你懂得并正确运用它们,才能将这棵发散的问题树反向收敛,并最终解决你想要解决的问题。
诚然,有一些问题不需要太多的知识,可能掌握一两个库就能轻松解决,但另一些问题则不是。掌握越多的知识意味着能解决的问题也就越多。而要掌握越来越多的知识,也即意味着不断的学习。
老师带领我们的这一个月,充其量不过是常规热热身而已。

Refactor & 效能提升第五章作业

由于商店网站中有订单时间这一项,而且出现在了用户及管理员两个订单页面,而且时间格式可能会更改。所以,针对读取时间且装换类型的语句进行了,helper封装。
由于网站中并未出现HTML 与Ruby 高度混杂、该段程式码有很多 if / else、该段程式码衣服穿很多层,所以并未使用helper来输出ruby代码。
最后,由于商店是个精简的系统,所以代码并未出现重复,且相关的功能已经实现partial,所以也不需要进一步的partial优化。

Refactor & 效能提升第三章作业

为什么后端效能大部分是慢在资料库?如何解决这个问题?

主要有两个原因,首先,是因为网页生成代码实际上近乎完成了,大体上只差相关数据而已,相对运行起来会比较快。而数据则需要去数据库里面去,这就涉及到读取和赋值,并最终生产网页。所以会慢一些。其次,是因为有时候数据库和后端代码并不在一个地方,所以本身传输又会占用一些时间。综上两点,读取的数据越多,这相应的时间则越多。而后端的code代码则是基本不变的。
解决这个问题本质上就是减少数据读取的时间,具体有4个方法:

1、减少数据请求次数

因为在读取数据前,还会进行数据请求,这个过程就会花时间,所以同样的数据量请求的次数越少则消耗的时间越少。

2、提高数据读取效率

在读取数据前需要找到数据,但数据量比较大时就会在搜寻数据上就会画更多的时间。所以,使用一些数据寻找技巧就非常重要,而最主要的就是建立索引index,它的本质就是对数据建立分类索引,因而能降低寻找范围进而提高效率。

3、使用更合理的数据结构来索引

由于不同的数据占用的存储资源不同,所以在使用索引的时候,如果使用占有存储资源小的数据结构来进行的话,也会减少一些时间。比如布尔值和数值就比时间值快很多。

4、减少数据运算时间

在请求数据是有时会对数据进行运算,比如counter运算。所以,相对的就可以事先进行相应的计算并把计算结果存入关联的counter_cache里,这样在请求数据的时候就不需要进行计算,而是直接读取。这样就把读取网页的时间减少了,而是把运行过程留给数据推送后的后端进行。

安装gem "bullet"

1、打开bullet的github官网网页,认真阅读README.MD文件

2、在gemfile文件里,gem rails 及数据库gem的后面加上

1
gem 'bullet', group: 'development'

3、在config/environments/development.rb里加入初始化命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
config.after_initialize do
Bullet.enable = true
Bullet.alert = true
Bullet.bullet_logger = true
Bullet.console = true
#Bullet.growl = true
#Bullet.xmpp = { :account => 'bullets_account@jabber.org',
# :password => 'bullets_password_for_jabber',
# :receiver => 'your_account@jabber.org',
# :show_online_status => true }
Bullet.rails_logger = true
#Bullet.honeybadger = true
#Bullet.bugsnag = true
#Bullet.airbrake = true
#Bullet.rollbar = true
Bullet.add_footer = true
#Bullet.stacktrace_includes = [ 'your_gem', 'your_middleware' ]
#Bullet.stacktrace_excludes = [ 'their_gem', 'their_middleware' ]
#Bullet.slack = { webhook_url: 'http://some.slack.url', channel: '#default', username: 'notifier' }
end

由于是本地开发使用的,因此不需要使用发信及关联其他软件,故将相关的选项屏蔽

4、打开localhost:3000,依次打开相关网页测试是否需要进行后端优化

5、针对对应的N + 1 Query、Table Scan、counter cache、index来进行优化。

Refactor & 效能提升第二章作业

1.为什么要将 CSS 放在最顶层,将 JavaScript 放在最底层?

首先,网页打开的时候会经历一个过程,这个过程中会加载html、还有下载相关文件、执行css和js。由于css是进行页面渲染的,所以通常需要一开始就执行。而如果将css和js文件放在一起,它的下载时间就会很久,这样就会出现画面很久才打开。又因为javascript是进行动作相应的,所以这一块实际上对现实页面的主题影响不大,因而把它放在后面。这样就可以实现页面的快速打开后,才加载js。这不但复合网页加载逻辑,而且也会使得用户在打开页面的时候会有很好的体验。

2.如何尽可能减少HTTP Requests?

减少http requestes的方法就是将文件打包下载,而不是多次请求。具体方法,就是将css文件以及js文件合并在一起,而不用分写在多个文件里,进而多次请求。然而,在使用ror的时候,实际上rails已经帮我们实现了这些功能。

3.CDN是什么?请用自己的话解释

CDN的英语是content delivery network,直译就是内容分发网络。通常我们读取文件都是之间链接到明确的一台服务器去取得,这样就是收到和这台服务器之间的网络链接所限制,而CDN就是解决这个问题的一个办法,具体的就是我们在取得资源的时候,不是直接连到源服务器。而是连接到这个内容分发网络,它是由分散的服务器组构成,它会缓存一些源文件在分散的服务器中,所以如果同过它取得资源时,如果该内容在他们服务器组中有储存,它就会自动的选择一台离我们最近的服务器给我们回传数据,如果内容在他们的服务器组中没有存储,它们会去源服务器读取文件并发送给我们,同时会进行一份缓存。

4.如何提升自己的网站加载速度?

提高自己的网站加载速度有以下方法:1、将css放在Html文件开头,而把javascript放在html文件末尾;2、使用CDN来分发网络资源;3、使用多节点访问网络资源;4、将css/js文件合并在一起;

Refactor & 效能提升第一章作业

打开一个网站的速度通常取决于三个因素:1、网页文件的大小(和网速决定下载需要的时间,通常一个页面100-200KB,网速通常不可控。);2、服务器所在位置;3、服务器生产页面所需要的时间(通常100-200ms)。网页打开的时间实际上是由这几个因素需要的时间的累加。
网页文件代码通常包含html、css、javescript三部分,他对打开网页的影响就体现在其对下载文件所需要的时间的影响上。后端代码通常包括ruby code以及数据库相关,其对打开网页所需要的时间的影响,体现在它运行代码从数据库拿出相关数据并生成相应的页面和文件需要的时间(也就是从收到quest请求,到routing、controller、model、view的时间)。服务器所在地就简单多了,主要看服务器离使用者的远近(对应相应的地理位置)以及服务器能够提供的带宽,它可以通过使用ping命令查看完成一次封包请求需要的时间来测试。
所以,针对这三点我们要提高一个网页的打开速度。其中,提高网页文件的大小属于前端调整。而提高服务器的位置以及服务器产生页面的时间属于后端调整。
然而,在进行代码优化的时候我们就不得不考虑一个问题,那就是从那块开始优化的时间投入产出比最高?也可以说,如果使得见效最快。
这就需要考虑两个问题,一个是优化需要的时间,还有一个是优化后的效果。
比较三者,可以发现调整网页文件的大小和服务器的位置效果最明显。而,调整后端命令,由于本身后端生成页面时所需要的时间量级已经小于两者,所以收效较低。举个例子如下:
调整前端架构或搬机器:从 10s 下降到 2s (1s = 1000ms)
调整后端代码或数据库架构:从 500ms 下降到 150ms
再来看看投入时间,由于服务器通常是成组的,而且调整服务器会涉及到很多问题,特别是跨大区域调整服务器是问题非常多。而修改网页代码以及后端程序生成代码则相对简单得多,只需要对代码进行调整就好。而其中,后端代码往往相互关联所以调整起来规模又会比调整相对独立的前端页面代码复杂的多。
所以,综上,优先调整前端代码的时间和效率是最划算的。特别是作为个体户程序员来讲,这个往这个方向思考会更有效率。

元学习课2017版学习心得

元学习课

元学习课是一门关于怎么学习的课程,它是重点针对类似于英语与编程这类技能类学习而设计的。全栈营的编程课程即是这么元学习课的践行版。所以,同其他课程一样,元学习课是需要践行的,如果学习了而不践行等于是浪费自己的时间与生命。

编程

编程最简单的描述就是输入一些东西,然后进行运算,最后输出一些东西。所以,本质上来说,它其实是很简单的一件事情。然而,一般人觉得他难的原因在于,大家并没有使用正确的学习方法。他就如同我们在生活中学习的其他技能一样,重点在于先模仿后理解,比如做菜、踩自行车、走路等等。如果一开始就纠结于原理,不但不能很好的上手,而且还会充满挫折感,导致从入门到放弃。

编程等技能的学习方法

元学习课的核心理论主要有三点:1、拼图理论;2、成就感;3、重复训练。

拼图理论

拼图理论是指,在学习过程中,将要学习的知识分散学习,而不需要强调从小到大,从前到后。也就是像拼图一样,一块知识一块知识的收集起来。而在收集到足够多的知识后,自然而然就会开始理解拼图之间的联系,这时候如果需要深入学习,再像登山学习一样,从头串到尾,从小概念联系到大概念。

成就感

在学习过程中保持持续的成就感很重要,因为一开始的激情很容易退却,如果没有后续的情绪激励则会放慢下来、或者产生厌学情绪,进而很容易放弃。

重复训练

由于我们是通过拼图式的方式学习,所以一定要通过多次训练将这些小知识巩固在我们的大脑里,进而形成“肌肉记忆”。正式这些基础的记忆为我们后面的深入学习奠定重要的基础。

游戏化学习

游戏化正式运用了上述三个理论点的学习模式,它通过将不同的知识点形成知识块的小关卡,同时以整合知识块形成稍大一些的知识块的模式,使我们一边获得升级成就感的同时,复习旧的知识,不断学习新的知识,让我们在游戏化的学习方式中不断进步。

认知心理学原理

游戏化学习的原理是源于人类的大脑认知模式,即左脑模式和右脑模式。左脑模式为分析模式,专注于细节间的解析,而右脑模式则专注于捕捉外界的大体框架。由于左脑模式的分析是基于已有的知识之间的联系,所以在新学一门技能的初始,脑内还没有建立很多相关的知识点,所以这个过程就会相当的“痛苦”,进而容易导致意志力薄弱的同学放弃,而右脑模式则更类似于拍照式的粗略记忆,所以并不会产生解析上的痛苦。因而,我们在学习新技能的初期,为了降低学习的难度于挫折感,可以试着关掉部分或全部的左脑分析功能,让其在学习过程中任期自发的解析,或者留到后期拥有足够的知识点后再从头来一遍理解式的学习。

践行

不管是否接受老师的这套理论,但是不妨先假设它是正确的,然后开始行动,行动之后,是否有效就自会明了。

初学者的错误认知

基于元学习理论的知识实际上真对应着初学者对于学习的错误认知,初学者通常认为技能学习必须要有天赋、必须看懂每一步、必须从基层原理学起、禁止使用捷径。它们实际上是错误的观念。真是由于使用了这些错误的观念,学习才变得枯燥和难受,进而需要我们咬牙坚持。实际上,取得技能和学会技能是两码事。取得技能即表示我们能够使用它,而学习技能不但表示我们能使用它,还能对它说出一二三四。比如语法、单词、腔调等等。每个人在学习母语的时候,都是先取得,再学会。但是在学习第二门语言和其他技能的时候,却常常想先学会,再取得。事实证明,大多数采用后者的学习都失败了,尤其是编程学习。一方面的原因,是大多数的编程人员,其实并不会教,他们只是想教,但是却没能get到教编程的技巧。在面对这个情况下,我们就需要发挥自学来摆正这个错误的认识了。比如,买一本实作型初学指南,做出小项目,重复做三遍(,之后再去补基础理论知识)。这三遍,可以先复制粘贴一遍、跟着打一遍,边尝试理解边跟着打一遍。这个过程中碰到错误要重点纪录,而且要连解法一起纪录。纪录错误的是因为,能加深印象。而正确的可以不用纪录,因为教材上面有。这样,在跳过一个又一个错误后,我们就可以不断的前进。

大脑运作原理

如前所述,根据认知心理学,学习的时候有两个要点:1、初速度要快,形成正循环;2、先利用右脑,形成肌肉记忆。而这是由大脑的运作原理所决定的。具体有以下几个方面:

1、大脑并不善于快速思考

大脑在进行快速思考的时候实际上依赖的是习惯,而并非是像慢速思考那样调取各种资源来解决问题。一个例子就是蜡烛、图钉和墙壁。

2、多数的思考,并不是真的思考,而是调用过去记忆所组成的结果

人的大脑记忆分为了个区间,一个是工作记忆,另一个是长期记忆。工作记忆区间就像电脑的内存,内容小、时间段、会丢失,但是存取速度够快。而长期记忆就像是外村依旧是硬盘,内容大、时间长、可重复调用,但是存取速度慢。简单的例子就是78的运算和70008000的运算。

3、人是利用已知的事物理解新的事物

理解一定程度实际上是记忆。一方面如果它不是记忆,那么我们理解完了以后就不可能记得下来,另一方面他又是在存在我们大脑中的知识点建立连接知识点。这一点和数据库的存储结构有点类似。git的使用指南,实际上就是一个很好的反例,它展示了我们在理解未知事物的过程中是多么费劲。对比的,人类在利用已知的事物理解新的事物时,就轻松很多。本质上,理解未知事物的过程也是在一点一点的把未知变成已知,然后在通过理解建立联系。

4、没有重复的练习,不可能精通任何脑力活

正如前面所说,我们进行快速思考的时候,实际上是调用已经形成的记忆。而这些快速调用的记忆又可以称之为“直觉”。他们是保存在大脑里的深刻的记忆,课程里的说法是深焊在肌肉里面的长期记忆。要达到这种程度的记忆,必须通过持续的、大量的、重复的练习,否则不会形成如此深刻的记忆。做不到这一点,对任何脑力活都不可能精通。

5、题海战术以及填鸭教育,有时是必须的

明白了大脑的工作原理,就可以明白,题海战术以及填鸭教育,有时是必须的。比如,我们最初的九九乘法表,以及最开始的古诗学习。他们都是通过先种下记忆点的方式,之后在逐步理解。而对于种下记忆点的方式,有两种强化的方法:一种是提取练习,另一种是迁移练习。
提取练习是通过靠记忆力将学到的知识回忆或者写下来,之后在于教材或者上一份知识比对的方法来强化相关记忆的。更进一步的,将写下的记忆教给别人,创造出一套属于自己的传播的学问模板。学习之后复习是很重要的一件事的,学习之后不复习,只不过是刷了个脑袋爽而已。而提取练习,就是很好的一种复习方式。
迁移练习是指我们在开始学习一个东西的开始,会进步非常快,这有两个原因,一个是因为初期的知识比较简单,另一个是教材设计者设计的比较好。但是当我们要具体使用这些东西去解决问题的时候就会发现适用不出来,这个就叫做新手运。解决这个问题的方法就是换个状况做迁移练习。在这个过程中要秉持取得技能的心态,所以快速取得成就感最重要,而且要明白的是,野路子不需要他人的认可。
最终,通过复盘与练习我们就可以将听与学的单条连结,通过教编程无数连结。

要点

首先,挑选高频小套路->练熟->提取->教别人->练习更多小套路。
其次,小套路兜出中套路->练熟->提取->教别人->迁移到兴趣主题

一万小时理论

通常是的从平凡到超凡需要经过一万小时的理论是怎么得来的,在业界成为专家通常需要五年,而这五年的时间并不代表说需要五年才能学会,实际上它是在学会以后经过一段积累起才成为了专家。便于编程也是如此,通常需要工作五年的时间才能从入门到成为编程专家。

德雷福斯模型

德雷福斯模型将成为专家的道路分成了五个阶段:新手、高级新手、胜任者、精通者、专家。

经验

通过执行这项技术,最后促成了思维与技能上的改变。有的人工作了十年,但是水平还是像一个新手一样,那是因为他的十年其实只是一年的有效经验重复了十年而已。

新手

新手无法独立完成某个事情,他们完成一个工作会遵循这么一个模式:Standard Operation Procedure。即当X时执行Y。

高级新手

能使用基本规则完成任务,能够独立解决问题。

胜任者

能把很多经验梳理成规则,属于团队核心。

精通者

能提炼出指导性的架构与方法。

专家

能创造出方法把所在领域往前推进。
人们常常认为业界人员分布在这五个阶段符合正态分布,即胜任者占大多数。然而事实上,是高级新手占多数,也就是说着不符合正态分布。实际比例是,高级新手>50%,精通者<10%,专家<1%。若以通常的职称来评定的话,通常的新手就是指初级工程师,高级新手就是工程师,胜任者就是资深工程师,精通者就是架构师,专家就是大神。而成为一个资深工程师往往需要3-5年。而成为高级新手,只需要400小时。
所以,成为高级新手的核心就是如果坚持400小时。一个一秒钟辨别大师&高级新手的方法是,问他们如何坚持学习。教你如何坚持做事的方法论的一般是高级新手,而回答白痴,我都不知道怎么坚持,才有可能是真正的专家。因为能成为专家的人必定是在兴趣之下投入大量的时间,光靠意志力是很难走这么远的。

坚持

坚持,是一种很低效的行为。它实际上表明你不喜欢现在正在做的事情,而大师们的坚持,其实是上瘾状态。看上去的坚持,其实只是一种习惯,一种由于上瘾而引发的习惯。
即便是之前提到的有效学习方法,即高频小套路->重复练习->烧到记忆里,如果没有感受到乐趣,也是很难持续执行的。

游戏化

游戏的核心就是建立习惯。所谓游戏,就是根据人类大脑原理,用来“引导建立习惯”的一套系统性公式。它形成习惯的原理是(Habit Loop)提醒行动->惯性行为->相关奖励。游戏的本质就是习惯+强烈的奖励。有一本书《Actionable Gamification》,就是游戏设计原理的。主要步骤如下:Discovery(发现这个游戏可以玩)->Onboarding(获得头几次胜利状态)->Scaffolding(达成多个胜利状态)->Endgame(没有胜利状态了,弃玩)。其中Onboarding阶段不能让人不知怎么玩,Scaffolding不能太单调/太难玩,到达这一阶段后,为了让用户不弃玩,会设置大小和时机都会变动的随机奖励,以上用户保持上瘾的状态。
所以,好的学习方法应该也能达到这一种,让用户上瘾的状态。然而,事实上很多人在教育之下是极度排斥上瘾的,理由也很简单,因为我们通常上瘾的东西,都是诸如游戏之类的影响生活的事物。然而,大多数的大神,其实也是瘾君子,他们其实并不排斥自己会上瘾的体质,但是会将他们用到合适的地方。这就是他们和普通人不同的地方,普通人无法控制自己的上瘾,所以后来变得拒绝上瘾。对于游戏,我们通常不要沉迷往往是有益处的,但是如果对于学习也如此,那么可能会在学习效果上大打折扣。虽然老师把这两个和平庸挂钩,但是我并不这么认为。事实上,还是有很多大神大师采用的是另一种非常自律的生活方式。当然,如果采用普通的方式没法学一个东西的话,不妨试试游戏化的学习。我个人学习英语就是试过了各种方法,最终尝试了游戏化进而走上正轨的。所以,比起逃离上瘾,不如将自己的瘾安放在合适的地方让他起作用。但是,则需要平时不要抵抗上瘾,而是将它合理利用与转化,这样才不会把你体内的上瘾机制给扼杀掉。
Xdite老师的方法是,比如她对一个游戏上瘾,她觉得不合适,就是跑去玩另一个更容易上瘾且生厌的游戏,而通过这个更容易上瘾的游戏,将之前一个游戏的瘾盖掉,进一步的通过这个游戏生厌后,她同时也就对游戏生厌了,这样就不会沉迷之前的那个游戏了。可以说这个方法因人而异,如果是对游戏比较执着的人,我想最后有一定可能还是会跑回去玩之前那个游戏的吧。

如何人工制造“成瘾”

游戏成瘾的本质其实是自我价值的他处实现,也就是说,实现自我价值才是成瘾的核心。比如健身族,迷恋自己的身材。学习族,享受性感的大脑。这都是通过这些东西实现了一定程度的自我价值。所以,依据这条理论,有一个方法可以创造学习的自我价值,那就是,将你学的东西拿去教别人。帮别人会收获到变动的意外奖励,进一步变得停不下来。

B = MAT

Behavior = Motive + Ability + Trigger
行为 = 动机 + 行动能力 + 触发点
降低行动的门槛->提高行动的动机->触发行为的发生

设计自己的成瘾行为

能实现的小套路->帮别人实现自我价值->得到变动奖励
辛苦学习->苦逼练习->变成大师,老师说大师没有一天是苦逼的,我不认同这个观点。因为像博尔特这类运动大师,觉得是经过苦逼的练习才有今天的身体素质的。只能说他们练习中通过办法减低难受度,自我价值加强坚持度,但是不能说它们是不苦逼的。心理学上的心流和肉体调整上的还是不一样。虽然,在跑步的某一过程中是会出现心流,但他也是平时训练加前半程苦逼换来的。所以,还要具体的东西具体看。有的苦逼过程还真的就跳不过。但是在学习入门这一点上,确是可以通过元学习理论获得可能的。

总结主题

第一周

1、学习是拼图
2、获得成就感
3、重复的训练

第二周

1、大脑是如何组织存取知识的
2、如何利用肌肉学习巩固知识
3、右脑与左脑搭配快速学习法
4、用高频小套路攻克一个领域

第三周

1、德雷福斯模型
2、游戏化 & 成瘾

20170621学习纪录

##Objective
###今天做了什么?

  1. 写ORID
  2. 全栈营

###关于今天的学习,你记得什么?
####新旧知识

  1. 全栈营的课程框架:懂得拆、懂得做、做得完、卖得动、卖得好
  2. 懂得拆(Computational Thinking,User story)
  3. 懂得做(Programming,architecture)
  4. 做得完(Project managing)
  5. 卖得动(Marketing research,Solving value problem)
  6. 卖得好(UX,growthhacking)
  7. Xdite写ORID的时候,是白天简单记笔记(关键词),然后洗澡的时候回忆下,接着第二天再写出来,这就比我们直接第二天动脑子回忆轻松很多。
  8. cd - change directory
  9. ls - list
  10. pwd - print work directory
  11. rake - ruby make
  12. db - database
  13. mkdir - make directory
  14. rm - remove
  15. rails g - rails generate
  16. rails s - rails server
  17. rails c - rails console
  18. 编程要做的事是:观察输入和输出是什么;把大问题拆成小问题;寻找资源;用电脑自动化解决问题;
  19. render大致是将数据提交给表单的意思,所以在controller和view里面本质是一样的,controller里面是直接给action表单,view里面是给partial表单。
  20. 当老师的情绪影响她做事的时候,她就去睡觉,她解释说因为她的血糖耐心已经用完了,注意力很重要,所以要去休息。
  21. “所有的人都是从镜像模仿开始,掌握基本的高频小套路,熟练之后,才复盘补充、学习基础理论,最后牢固的。”
  22. “Computational Thinking => Programming;在这里给各位总结一下,编程是什么?编程是:观察输入是什么,输出是什么(就是大问题的起始条件和最终结果);把大问题拆解成可以实作的小问题;在实作过程中找到资源;用电脑自动化解决问题;如此单纯而已。”
  23. rake = ruby make

####遗留问题

####涉及资源

  1. 网站:LOGDOWN;
  2. 网站:全栈营
  3. 网站:youtube - extra credits
  4. 视频:How to be a developer I 和 II
  5. atom package:atom-beautify和atom-block
  6. 工具:computational thinking
  7. 网站:textcompare.com(slack和论坛上面有)
  8. 视频:全栈营直播:1月3日 开学第一课
  9. 视频:全栈营直播:1月23日 编程英语

##Interpretive
###我们今天学到了什么?

  1. 程序员的核心技能是:逻辑思考能力;手机工具能力;不断学习能力;交流协作能力;
  2. developer的本质核心是解决问题,特别是解决还未解决的问题。
  3. ORID可以用一天的时间慢慢写完

###今天有什么重要的领悟?
####编程知识

  • 程序员的核心技能是:逻辑思考能力;手机工具能力;不断学习能力;交流协作能力;

##Reflective
###你要如何形容今天的情绪?

  1. 今天把ORID这个学英语和全栈营的心理负担降低难度了,使得其它学习量一下就上来了,但是感觉脑袋有点吃不消,可能要适应两天。
  2. 现在已经可以做到基本理解全栈营课程上面的每一个概念,感觉很费脑。

###今天的高峰是什么?

  • 对全栈营课程设计循环的理解上了一个高度。

###今天的低点是什么?

  • 容易疲劳,可能是最近没好好运动的原因。

##Decisional
###我们会如何用几句话形容今天?

  • 开始把之前在全栈学习的内容不断推向更深入的阶段。

###明天有什么计划?

  1. 写ORID
  2. 全栈营