平均法则

介绍了什么是平均法则, 以及如何用它指导我们的日常做事

所谓 平均法则(The Law of Averages), 假如你是一个推销员, 今天你打算向 100 个顾客推销, 根据平均法则, 有 80 位根本不会考虑买你的东西, 甚至连交谈的机会也不会给你; 然后有 10 位左右是愿意与你交谈的, 但你想跟他们达成交易还是比较困难的; 最后有 10 位呢, 则是很容易成交的那种顾客, 也即是你根本不需要有多么厉害的推销技巧, 也不需要你巧舌如簧, 哪怕你就是一个新手, 你也能很顺利地与他们达成交易.

这样的一种顾客的分布情况, 也即 80% 是困难的, 10% 是一般的, 还有 10% 是容易的, 就是所谓的平均法则.

当然, 这个比例也许更极端一点, 比如 95% 是困难的, 4% 是一般的, 只有 1% 是容易的.

但不管是哪种比例, 理想一些的还是极端一点的, 都暗含了这样一个意思: 当你不停地遭到拒绝, 其实你就越来越接近于成交!

这样一个法则, 它有两层含义:

继续阅读

利用 String format 方法及占位符优雅拼接字符串

介绍了 Java 语言里如何使用 String.format 去优雅地拼接字符串

不论是哪个编程语言, 拼接字符串都是一个频繁的操作, 很多的语言都支持通过重载"+"号运算符来拼接字符串, 这也是最常见快捷及直观的方式.

除了用"+"号拼接外, 有的语言还支持更先进的拼接方式, 比比较新版本的 javascript 语言还支持比较优雅的利用 ${XXX} 的方式去传递变量值, 这就已经基本接近了很多模板技术的写法了, 比如这样:

let name = '小明';
let age = 20;
console.log(`他的名字叫${name}, 他今年${age}岁.`); // 注意字符串用键盘左上角的撇号(`)括起来而不是引号

继续阅读

专注于你能控制的东西

为什么要专注于你能控制的东西?

做事情有一个误区, 就是容易陷入对那些自己不能控制的事情的纠结当中, 而不是专注于自己能够控制的事情当中.

举例来说, 我们说要成为一个更有钱的程序员, 那有的人可能就会想, 那我是不是天天就琢磨怎么找老板谈加薪呀? 说实在的, 最终能不能加薪或者能加多少这个其实你自己不好控制的.

当然不是说你不要去找老板谈这个, 但更重要的, 你应该首先关注那些你能控制的事情, 然后把它们做好先.

比如说, 一段时间来, 经常上班都要迟到那么一会, 总要差个十几分钟, 那么, 能不能先做到上班不要迟到呢?

这个事情就是我们能够控制的.

继续阅读

一起读书, 成为更有钱的程序员

独学而无友, 则孤陋而寡闻

欢迎加入程序员一起读书活动, 成为更有钱的程序员!

为什么要一起读书? 因为子曾经曰过: 独学而无友, 则孤陋而寡闻.

为什么要成为更有钱的程序员? 不是应该成为更好的程序员吗? 原因在于前者更好衡量.

这里有个所谓的 SMART 原则, 具体见这篇的介绍: 成为更好还是更有钱的程序员?

继续阅读

利用 IDEA IDE 的轻量编辑模式快速查看和编辑工程外的文本文件

介绍了 Intellij IDEA 的轻量编辑模式, 可以用其取代诸如记事本或 Notepad++ 之类的轻量级编辑器.

作为程序员, 我们都知道 IDE 的很好用的, 它的文本编辑器功能也非常的强大, 用起来非常便捷. 在长年累月的使用中, 我们也变得对其非常熟悉, 以致于使用起其它简单地轻量级的文本编辑器来, 比如什么记事本, Notepad++, UltraEdit 等等呀, 觉得既不方便又不熟悉.

关键是很多的操作习惯或者快捷键之类的也不尽相同, 比如什么导航定位呀, 查找替换呀, 等等往往都是各有各的一套.

但有时我们又不得不用这些轻量级的编辑器, 因为有时我们仅仅是想简单查看一下一些文本文件的内容, IDE 的功能虽然强大, 但常常也是要你打开整个工程, 或者说对于工程以外的文本文件的查看或编辑就不支持了.

这种情况随着 Intellij IDEA 新版本的发布, 已经有所改变了, 这就是一个新的特性, 所谓的轻量编辑模式(lightEdit mode), 有了它, 基本可以告别其它的轻量级文本编辑器, 而全程使用 IDE 的编辑器了.

继续阅读

数学上的闭包概念及与编程的关系

简要介绍了数学上闭包的概念及其性质在编程领域的应用.

首先, 需要强调一点, 这里谈论的 闭包(closure) 概念是指数学上的, 不是我们编程界一般谈论的那个闭包.

在编程实践中, 闭包另有定义, 是一种为表示带有自由变量的过程而用的实现技术.

但另一方面, 这个数学上的闭包概念在编程实践中依然是有体现, 虽然不同于编程界一般谈论的那个闭包, 后面会举一些例子加以说明.

闭包到底是什么?

闭包在数学上是一个比较抽象的概念, 来自于抽象代数, 因此这里不打算直接给出它的定义, 否则大家看了估计还是一头雾水, 为便于理解, 还是先从具体的例子出发, 最后才给出它的定义.

继续阅读

使用 tail 结合 grep 查找日志关键字并高亮及显示所在行上下文

介绍了如何使用 tail 结合 grep 查找日志关键字并高亮及显示所在行上下文, 最后还附带介绍了如何使用脚本文件对整个过程进行抽象化.

对于一个开发或运维人员而言, 当系统出现故障时, 第一步常常就是查看日志. 查看日志经常碰到的一个需求就是按关键字去搜索, 在日常开发机子上的 IDE 上, 都集成了强大的搜索功能, 但因为系统通常部署在 Linux 系统上, 一般只有命令行界面, 在其上应该怎么去搜索呢? 恐怕有些同学就不是那么清楚了.

有些人会用 ftp 之类的把日志下载下来本地再搜索, 如果是小一点的文件还好, 但日志文件往往都比较大, 因此这样的方式无疑是极为低效的.

下面就介绍一种相对快捷的方式, 也不需要用到特别高级的命令, 仅需要 tail 和 grep 两个命令结合起来即可, 能达到这样一个效果:

  1. 能按关键字搜索;
  2. 在显示关键字所在行时还能高亮关键字;
  3. 能把关键字所在行的上下文, 比如上下 10 行的内容也一起显示出来.

下面是一个效果示意图:

tail grep log

在这里, 我用我云主机的 nginx access log 做了个示范, 我搜索一篇文章 url 的关键字 "a-port", 然后显示出搜索的结果及上下文, 可以看到关键字被标红显示, 上下文也有显示, 多个搜索结果间以蓝色的短横间隔开来.

下面具体说说怎么实现这样的搜索, 先具体讲讲各个命令及参数, 再说说怎么结合起来, 最后还给出一个脚本化的高级用法.

继续阅读

用番茄工作法对付拖延症

介绍了如何通过"番茄工作法(pomodoro)"去解决拖延症(procrastination)的问题.

现代人似乎饱受 拖延症(procrastination) 的困扰, 自然, 你我大概都不例外.

我之前就曾经写过一篇关于拖延症的悖论的文章里就曾提到一个笑话:

几个月前,在书店看了一本关于战胜拖延症的书,觉得挺好的就买下了,到现在还没怎么看......

那么怎么去对付它呢? 有一种方式你也许也听过了, 叫所谓的"番茄工作法(Pomodoro)".

这个方式叫 Pomodoro, 为啥不是 Tomato 呢? 因为这是一个意大利人 Francesco Cirillo(弗朗切斯科 西里洛)在 1980 年代发明的, pomodoro 在意大利语(Italian)中就是番茄的意思.

番茄工作法 pomodoro

所谓的 Pomodoro, 就是一个简单的倒计时器, 你定一个 XX 分钟的倒计时, 然后它就滴答作响, 到了设定的时间, 它就响铃提示你时间到了, 就这么一个玩意.

继续阅读

理解 http 反向代理

介绍了什么是反向代理, 并与直接访问及(正向)代理进行了对比, 为便于理解, 还举了现实中购物的例子作为比喻

要理解什么是 反向代理(reverse proxy) , 自然你得先知道什么是 正向代理(forward proxy).

另外需要说的是, 一般提到反向代理, 通常是指 http 反向代理, 但反向代理的范围可以更大, 比如 tcp 反向代理, 在这里, 不打算讨论 tcp 之类的反向代理, 当文中说到反向代理时, 指的就是 http 反向代理.

正向代理通常直接称为 代理(proxy), 无需强调它是正向的, 在 http 协议中, 代理即指正向代理.

继续阅读

成为更好还是成为更有钱的程序员?

为什么你要选择成为更有钱的程序员?

如果你觉得这个题目有点标题党的味道, 那我也承认确实如此. 本来我打算取的名字是"如何成为一名更好的程序员", 但认真想一想, 怎样才算更好呢? 这个标准很模糊呀!

关于目标设定上有一个所谓的 SMART 原则,

来源于管理大师彼得·德鲁克(Peter Drucker)的《管理的实践(The Practice of Management》

其中, S 代表 Specific, 也即目标必须是 具体的.

显然, "更有钱" 比 "更好" 更为具体.

M 代表 Measurable, 也即目标是 可以衡量的.

显然, "更有钱" 又比 "更好" 更加好衡量.

继续阅读

理解 MD5 消息摘要算法

介绍了 md5 算法及其特性, 重点介绍了其在密码存储方面的应用

MD5 算法相信很多开发人员都听说过, 一个最常见的使用到它的地方就是密码的存储.

当然, 很多人会说, 这个算法已经不太安全了, 确实如果你想更安全的保存密码, 则应该考虑其它更安全的算法, 不过这不属于此次讨论的主题.

什么是 MD5

MD5 是一种算法, MD5 中的 MD 代表 Message Digest, 也即信息摘要.

至于数字 5, 则因它是从更早的 MD4 算法改进而来, 因此得名 MD5.

所以 MD5 即是信息摘要算法第五版.

继续阅读

使用 lombok @Slf4j 注解简化日志功能的引入

介绍了如何使用 lombok @Slf4j 注解简化日志功能的引入, 兼谈了重复性管理的问题.

在开发过程中, 打印必要的日志是必不可少的一环, 而要打印日志, 在相关的类中就要引入日志相关属性, 在传统上, 一般是通过LoggerFactory.getLogger去实现的:

package net.xiaogd.demo.mybatis.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LogDemoController {

    // 自行声明
    private static final Logger log = LoggerFactory.getLogger((LogDemoController.class));

    //...
}

尽管这已经很简洁, 但如果有大量的类要做类似的操作, 还是略显重复, 从 重复性管理 的角度, 我们怎么才能尽量减少这些重复的样板代码呢?

答案就是利用 lombok 的 @Slf4j 注解.

继续阅读

使用 .editorconfig 文件来统一编程风格

介绍了 .editorconfig 文件及如何使用它来统一项目的编程风格, 兼谈了一些项目管理的心得.

做过长期开发的程序员都知道保持编程风格统一的重要性, 统一的风格能够降低各种成本.

有一句名言是咋说的来着? 代码主要是给人看的, 其次才是给电脑去运行.

但另一方面, 大家又普遍是偷懒的, 对于这些长期会受益, 但短期收益不明显甚至带来麻烦的事, 许多团队中的成员不能说抵制吧, 但至少是积极性不高的.

此时, 假如你是一个团队的领导者, 怎么才能有效地保持项目中编程风格的统一呢? 下面介绍的这个 .editorconfig 文件的方式将能有效地帮助我们.

继续阅读

深入理解什么是端口(port)

深入谈了谈什么是端口, 并在此过程中谈到间接层, naming service 等概念, IoC, 依赖倒置等原则以及 TCP 协议的一些重点知识, 还有端口层的设计思想所带给我们的一些启示.

每当看到有人的简历上写着熟悉 tcp/ip, http 等协议时, 我就忍不住问问他们: 你给我说说, 端口是啥吧! 可惜, 很少有人能说得让人满意... 所以这次就来谈谈端口(port), 这个熟悉的陌生人.

在此过程中, 还会谈谈间接层, naming service 等概念, IoC, 依赖倒置等原则以及 TCP 协议的一些重点知识.

继续阅读

引入 lombok 简化代码及相关 IDE 设置

简要介绍了 lombok 的特性, 以及如何在 maven 引入和 IDE 中的设置(包括Eclipse 及 Intellij IDEA)

使用 lombok 可以简化一些样板代码的编写, 下面说说如何启用它, 包括了 maven 及 IDE 中的设置(Eclipse 及 Intellij IDEA)

具体例子

开发中经常会遇到一些纯粹作为记录的类, 如 VO, DTO 之类的, 在以往, 需要给它们一一生成所谓的 getter 和setter. 虽然有 IDE 可以辅助快速生成这样方法, 可大量的这种简单的 get 和 set 方法的存在也是挺碍眼的, 可否简化呢?

答案是可以的, 方式就是借助 lombok 这个代理工具.

继续阅读