周刊第12期:每周轮子计划、程序员应该如何写博客

本周轮子

以前看过一个小册子 《一天学习一个 npm 轮子,十天后变成轮子哥 》,觉得这种「首先实现一个最 Low 的解决方案,然后慢慢优化,进而推导出最终的源码」的学习思路非常不错,所以我也决定从现在开始,每周都学习造一个 npm 轮子。

当然前期只要专注于那些日常使用、相对简单的 npm 包,毕竟能力有限,太复杂的包就很难可以讲透。

这是本周的轮子:《每周轮子之 only-allow:统一规范团队包管理器》

本周见闻

程序员应该怎么写博客?

这是在 V2EX 上看到的一个帖子,OP 是之前周刊有提到过的 胡涂说 的博主,在这个帖子中,我收获不少有用的建议,也意外地发现到几个不错的博客。我也想借此机会聊一聊关于这个话题的一些想法,也算是当作我个人写作的总结与反思。

回顾本站的第一篇文章《锐捷无线AP学习笔记 - 入门篇》,写于 2018 年,到现在也就第 4 个年头,相比有些人动不动建站十几年,自然算得上年轻,但我认为我在写博客这件事上有过不少的挣扎与坚持,总结起来一共经历了以下几个阶段,但其实以下阶段并不是层层递进式的,它们有可能会同时进行:

  1. 记录学习笔记,这个阶段的产出主要是一些较为基础的学习笔记,原创度也较低,属于网上一搜一大把那种,对他人的帮助接近于无,还记得当时把一篇文章分享到技术社区上,被某些暴躁的老哥说我误人子弟,更有甚者直接开怼让我干脆把整本书都抄过来,当时有点气馁,但也承认自己的确是很菜,也曾自我怀疑过是否应该继续往中文社区「倒垃圾」,但最后还是坚持下来了。据我了解很多程序员刚开始写博客都是写这类学习笔记,也有很多人仅仅停留在这个阶段,甚至放弃,实在是太可惜了。
  2. 资源分享类,写技术文章很难写,有深度的技术文更是难上加上,所以曾有一段时间我特别喜欢写「资源分享」类的文章,譬如《分享一些好用的网站》《分享一些好用的 Chrome 扩展》,这类文章写起来压根不费多少时间和经历,你只需要把平时经常使用的网站、工具分享一一罗列出来,,就能在社区上收获不少的点赞收藏,这也是为什么 GitHub 上简体中文项目的 Markdown 项目如此之多的原因,但是我后来意识到,写这类文章对我个人能力的提升并没有多大帮助,如果你知道一些非常有用的工具,你确实应该将它分享出去给更多人,这是非常有价值的,但我的建议是千万不要满足于只写这类文章。
  3. 较有深度的技术文章,随着工作时间的增长,在技术上有了一些的积累,我开始尝试写一些较有深度的技术文章,包括一些经典面试题讲解、源码阅读、某个知识点深入剖析、一些工具类库的踩坑记录等,写这类文章是最痛苦的,因为你会发现在写的过程突然在某个地方你自己也无法讲清楚,说明你并没有理解透彻,于是只能逼迫自己一边查阅文档、一边根据自己的理解用自己的话把它讲透,这过程中的收获自然也是非常大,对其他人的帮助也不小。
  4. 与技术无关的,人都是有感情的动物,除了技术以来,总需要聊点其他的东西,有可能是生活上的一些感悟,也有可能是你针对某个事情的看法,这类文章,它既有可能会引起读者的共鸣,也有可能会因为与读者的看法不同而遭到反感,且很多时候,自己也不确定这些看法到底是不是正确的,所以会害怕被别人看到自己不成熟的一面,我也曾有过这方面的顾虑,不敢在博客上公开谈论太多与技术无关的事情,但后来发现是我多虑了,因为这类文章,往往最终的读者只有你自己,因为读者看你的文章,他也只会关心对他有帮助的地方,而且即便你当时所记录下来的自己可能是不成熟的,这也是你成长的印记,比如我常常会在迷茫的时候翻看起之前刚踏入职场时写下的《我为什么会成为一名程序员》,告诉自己不要忘了为什么会走上技术这条路,所以不要害怕写技术以外的东西,这些稚嫩的文字很有可能会在多年以后一直激励着你。

可能还有些同学会认为自己文笔不好、词穷,写不了这么多文字,其实也是多虑了,我坦白我的文笔其实很差,不能像别人那样出口成章、行云流水,但其实你只要把意思表达清楚、并且注入你的感情即可,总之多写、坚持写。

一些 tips

QOTD 协议

QOTD 的全程是 Quote of the Day,翻译过来就是「每日报价」,在 RFC 865 中定义,监听的端口是 17,这是一个非常少用到的协议,目前仅剩的公共 QOTD 服务器只有几个:

服务器地址 TCP 端口 UDP 端口
djxmmx.net 17 17
alpha.mike-r.com 17 17
cygnus-x.net 17 17

可以用它做什么呢?

比如这里就有一个在 GitHub Action 上利用该协议定时获取 djxmmx.net 服务器上的名人名言,将它更新到 Github Profile 中。

分享文章

Bash Pitfalls: 编程易犯的错误

本文是《Bash Pitfalls》的中文翻译版,介绍了40多条日常 Bash 编程中,老手和新手都容易忽略的错误编程习惯。作者会在每条给出错误的范例上,详细分析与解释错误的原因,同时给出正确的改写建议。

Docker 镜像构建的一些技巧

本文分享几个 Docker 镜像构建的一些技巧,可以帮助你提高 Docker 镜像构建的效率,对于老手来说已经是非常基本的事情了,但是对于新手还是很有帮助的。

原文一共举例了 4 个技巧,在此我只详细讲解第一个技巧,其余的麻烦移步原文查看。

  1. 删除缓存

使用 apt、pip 等包管理器下载包时一般都会产生缓存,以便后续下载时使用,但是在 Docker Image 中,我们不需要这些缓存,所以一般都会在下载后,手动清除缓存:

1
2
3
4
RUN dnf install -y --setopt=tsflags=nodocs \
httpd vim && \
systemctl enable httpd && \
dnf clean all

要切记千万不要像这样分开写,因为 Dockerfile 里面的每一个 RUN 都会创建一层新的 layer,这样其实是创建了 3 层 layer,前 2 层带来了缓存,第三层删除了缓存:

1
2
3
4
FROM fedora
RUN dnf install -y mariadb
RUN dnf install -y wordpress
RUN dnf clean all

但其实 Docker 在 v1.13 中引入了 –squash 参数,可以在完成构建后将所有的 layers 压缩成一个 layer,也就是说,最终构建出来的 Docker image 只有一层,所以,如上在多个 RUN 中写 clean 命令,其实也可以。

1
docker build --squash
  1. 改动不频繁的内容往前放
  2. 构建和运行 Image 分离
  3. 检查构建产物

JavaScript 函数式组合:有什么大不了的?

这是我看到过所有写 JavaScript 函数式组合里面最通俗易懂的一篇文章,作者从头开始一步步地实现 compose、pipe、flow 等方法,并且让对函数式组合了解不多的同学知道,函数式组合的好处在哪?

举个例子,假如我们使用 Array 的方法是这样写的:

1
2
3
4
5
6
const comments = commentStrs
.filter(noNazi)
.slice(0, 10)
.map(emphasize)
.map(itemize)
.join('\n');

而改用函数式组合的方式,则是这样:

1
2
3
4
5
6
7
const comments = pipe(commentStrs,
filter(noNazi),
take(10),
map(emphasize),
map(itemize),
join('\n'),
);

这样写的好处在哪呢?

首先,我们可以增加任何 Array 原型上没有的自定义方法:

1
2
3
4
5
6
7
8
const comments = pipe(commentStrs,
filter(noNazi),
take(10),
map(emphasize),
map(itemize),
join('\n'),
+ chaoticListify,
);

另外,我们可以自由地实现像 map 这些方法,比如用生成器的方式改成它,而无需改变调用它们的方式:

1
2
3
4
5
const map = f => function*(iterable) {
for (let x of iterable) yield f(x);
};

const join = s => iterable => [...iterable].join(s);

综上所述,使用函数式组合的方式编写代码可以让我们写出更加简洁、优雅的代码,更重要的是它给我们提供了另一种思考的方式。

中国黑客关系图

本文是新书《沸腾信安志》的一篇预热文章,主要讲述了中国上个世纪末到本世纪初的传奇黑客们的故事,想要了解有哪些著名的黑客,以及他们今何在的同学可以看看。

网络安全行业和武侠江湖是很像的,有门派组织,有江湖名号,有武林大会,有绝计和宝物,而且都是大侠少而恶盗多,甚至连朝廷的管制方式都很相似。

这种氛围里,竟然出了这样一群奇人。

他们在最艰苦的岁月里,只要把道德底线稍微降低一点,就可以衣食无忧,然而他们没有;

他们掌握着最高超的技术,却拿着流量行业一半甚至更低的薪水,只要稍微做点灰产,就能摆脱困境,然而他们没有;

他们忍受着社会的质疑,承担着行业流氓带来的负面,却仍然坚持着自己热爱的技术创新。

直到现在,他们终于等到了自己的时代。

有趣的链接

  • Similarweb:查看并分析任何网站流量,站长必备工具
  • Codeit:手机连接 Git 查看代码的神器 APP
  • Queue:使用 Notion 发布 Twitter 的工具

作者 : 4Ark
来源 : https://4ark.me
著作权归作者所有,转载请联系作者获得授权。

🥳 加载 Disqus 评论