践行

践行

白板编程浅谈——Why, What, How

{%}

作者/ 巩朋

巩朋,Google工程师。本科毕业于大连理工大学,后进入了北京航空航天大学计算机系,师从张莉老师。毕业之后加入了Google Mountain View总部。个人博客:http://lucida.me/

这篇文章节选自我正在撰写的一本关于应届生面试求职的书籍,欢迎在评论或微博(@peng_gong*)上留言反馈。

面试很困难,技术面试更加困难——只用 45 ~ 60 分钟是很难考察出面试者的水平的。所以 刘未鹏 在他的 怎样花两年时间去面试一个人 一文中鼓励面试者创建 GitHub 账号,阅读技术书籍,建立技术影响力,从而提供给面试官真实,明确,可度量的经历。

这种方法对面试者效果很好,但对面试官效果就很一般——面试官要面对大量的面试者,这些面试者之中可能只有很少人拥有技术博客,但这并不代表他们的技术能力不够强(也许他们对写作不感兴趣);另一方面,一些人拥有技术博客,但这也不能说明他们的水平就一定会很牛(也许他们在嘴遁呢)。

总之,技术博客和 GitHub 账号是加分项,但技术面试仍然必不可少。所以,问题又回来了,如何进行高效的技术面试?或者说,如何在 45 ~ 60 分钟内尽可能准确的考察出面试者的技术水平?

回答这个问题之前,让我们先看下技术面试中的常见问题都有什么:

技术面试中的常见问题

技术面试中的问题大致可以分为 5 类:

1. 编码:考察面试者的编码能力,一般要求面试者在 20 ~ 30 分钟之内编写一段需求明确的小程序(例:编写一个函数划分一个整形数组,把负数放在左边,零放在中间,正数放在右边);

2. 设计:考察面试者的设计/表达能力,一般要求面试者在 30 分钟左右内给出一个系统的大致设计(例:设计一个类似微博的系统)

3. 项目:考察面试者的设计/表达能力以及其简历的真实度(例:描述你做过的 xxx 系统中的难点,以及你是如何克服这些难点)

4. 脑筋急转弯:考察面试者的『反应/智力』(例:如果你变成蚂蚁大小然后被扔进一个搅拌机里,你将如何脱身?)

5. 查漏:考察面试者对某种技术的熟练度(例:Java 的基本类型有几种?)

这 5 类问题中,脑筋急转弯在外企中早已绝迹(因为它无法判定面试者的真实能力),查漏类问题因为实际价值不大(毕竟我们可以用 Google)在外企中出现率也越来越低,剩下的 3 类问题里,项目类和设计类问题要求面试官拥有同类项目经验,只有编码类问题不需要任何前提,所以,几乎所有的技术面试中都包含编码类问题。

然而,最令面试者头痛的也是这些编码类问题——因为几乎所有的当面(On-site)技术面试均要求面试者在白板上写出代码,而不是在面试者熟悉的 IDE 或是编辑器中写出。在我的面试经历里,不止一个被面试者向我抱怨:『如果能在计算机上编程,我早就把它搞定了!』就连我自己在面试初期也曾怀疑白板代码的有效性:『为什么不让面试者在计算机上写代码呢?』

然而在经历了若干轮被面试与面试之后,我惊奇的发现白板编程竟然是一种相当有效的技术考察方式。这也是我写这篇文章的原因——我希望通过这篇文章来阐述为什么要进行白板编程(WHY),什么是合适的白板编程题目(WHAT),以及如何进行白板编程(HOW),从而既帮助面试者更好的准备面试,也帮助面试官更好的进行面试。

为什么要进行白板编程

很多面试者希望能够在 IDE 中(而不是白板上)编写代码,因为:

1. 主流 IDE 均带有智能提示,从而大大提升了编码速度

2. IDE 可以保证程序能够编译通过

3. 可以通过 IDE 运行/调试代码,找到程序的 Bug

我承认第 1 点,白板编程要比 IDE 编程慢很多,但这并不能做为否认白板编程的理由——因为白板编程往往是 API 无关(因此并不需要你去背诵 API)的一小段(一般不超过 30 行)代码,而且面试官也会允许面试者进行适当的缩写(比如把Iterable类型缩写为Iter),因此它并不能成为否认白板编程的理由。

至于第 2 点和第 3 点,它们更不能成为否认白板编程的借口——如果你使用 IDE 只是为了在其帮助下写出能过编译的代码,或是为了调试改 Bug,那么我不认为你是一名合格的程序员——我认为程序员可以被分为两种:

1. 先确认前条件/不变式/终止条件/边界条件,然后写出正确的代码

2. 先编写代码,然后通过各种用例/测试/调试对程序进行调整,最后得到似乎正确的代码

我个人保守估计前者开发效率至少是后者的10 倍,因为前者不需要浪费大量时间在 编码-调试-编码 这个极其耗时的循环上。通过白板编程,面试官可以有效的判定出面试者属于前者还是后者,从而招进合适的人才,并把老油条或是嘴遁者排除在外。

除了判定面试者的开发效率,白板编程还有助于展示面试者的编程思路,并便于面试者和面试官进行交流:

{%}

白板编程的目标并不是要求面试者一下子写出完美无缺的代码,而是:

  • 让面试者在解题的过程中将他/他的思维过程和编码习惯展现在面试官面前,以便面试官判定面试者是否具备清晰的逻辑思维和良好的编程素养

  • 如果面试者陷入困境或是陷阱,面试官也可以为其提供适当的辅助,以免面试陷入无人发言的尴尬境地

什么是合适的白板编程题目

正如前文所述,白板编程是一种很有效的技术面试方式,但这是建立在有效的编程题目的基础之上:如果编程题目过难,那么面试很可能会陷入『大眼瞪小眼』的境地;如果编程题目过于简单(或者面试者背过题目),那么面试者无需思考就可以给出正确答案。这两种情况都无法达到考察面试者思维过程的目的,从而使得面试官无法正确评估面试者的能力。

既然编程题目很重要,那么问题来了,什么才是合适(合理)的编程题目呢?

在回答这个问题之前,让我们先看看什么编程题目不合适:

什么不该问

被问滥的编程问题

我在求职时发现,技术面试的编程题目往往千篇一律——拿我自己来说,反转单链表被问了 5 次,数字转字符串被问了 4 次,随机化数组被问了 3 次,最可笑的是在面试某外企时三个面试官都问我如何反转单链表,以至于我得主动要求更换题目以免误会。

无独有偶,我在求职时同时发现很多面试者都随身带一个本子或是打印好的材料,上面写满了常见的面试题目,一些面试者甚至会祈祷能够被问到上面的题目。

就这个问题,我和我的同学以及后来的同事讨论过,答案是很多面试官在面试前并不会提前准备面试题,而是从网络上(例如 July 的算法博客)或 编程之美 之类的面试题集上随机挑一道题目询问。如果面试者做出来(或背出来)题目那么通过,如果面试者做不出来就挂掉。

这种面试方式的问题非常明显:如果面试者准备充分,那么这些题目根本没有区分度——面试者很可能会把答案直接背下来;如果面试者未做准备,他/她很可能被一些需要 aha! moment 的题目困住。总之,如果面试题不能评估面试者水平,那么问它还有什么意义呢?

下面是一些问滥的编程问题

涉及到库函数或 API 调用

白板编程的目标在于考察面试者的编程基本功,而不是考察面试者使用某种语言/类库的熟练度。所以白板编程题目应尽可能库函数无关——例如:编写一个 XML 读取程序就是不合格的题目,因为面试者没有必要把 XML 库中的函数名背下来(不然要 Intellisense 干甚);而原地消除字符串的重复空白(例:"ab c d e" => "ab c d e")则是一道合格的题目,因为即便不使用库函数,合格的面试者也能够在 20 分钟内完成这道题目。

过于直接(或简单)的算法问题

这类问题类似 被问滥的编程问题,它们的特点在于过于直接,以至于面试者不需要思考就可以给出答案,从而使得面试官无法考察面试者的思维过程。快速排序,深度优先搜索,以及二分搜索都属于这类题目。

需要注意的是,尽管过于直接的算法题目不适合面试,但是我们可以将其进行一点改动,从而使其变成合理的题目,例如稳定划分和二分搜索计数(给出有序数组中某个元素出现的次数)就不错,尽管它们实际是快速排序和二分搜索的变种。

过于复杂的题目

同过于直接的算法问题相反,过于复杂的题目属于另一个极端:这些题目往往要求面试者拥有极强的算法背景,尽管算法问题是否过于复杂因人而异(在一些 ACM 编程竞赛选手的眼里可能就没有复杂的题目 -_-),但我个人认为如果一道题满足了下面任何一点,那么它就太复杂,不适合面试(不过如果面试者是 ACM 编程竞赛选手,那么可以无视此规则):

  • 需要 aha! moment(参考 脑筋急转弯

  • 需要使用某些『非主流』数据结构/算法才能求解

  • 耗时过长(例如实现红黑树的插入/删除)

脑筋急转弯

什么是脑筋急转弯?

  • 不考察编程能力

  • 依赖于 aha! moment

  • All or nothin:或者做不出来,或者是最终答案

在一些书(例如 谁是谷歌想要的人才?:破解世界最顶尖公司的面试密码)和电影的渲染下,Google 和微软这些外企的面试被搞的无比神秘,以至于很多人以为外企真的会问诸如『井盖为什么是圆的』或是『货车能装多少高尔夫球』这样的奇诡问题。而实际上,这些题目由于无法考察面试者的技术能力而早已在外企中绝迹。反倒是一些国内公司开始使用脑筋急转弯作为面试题目 -_-#

应该问什么问题

所以,技术面试题目不应该太难,也不应太简单,不能是脑筋急转弯,也不能直接来自网络。

前三点并不难满足:我们可以去 算法导论编程珠玑,以及 计算机程序设计艺术 这些经典算法书籍中的课后题/练习题挑选合适的题目,也可以自己创造题目。然而,由于 careercup 这类网站的存在,没有什么题目可以做到绝对原创——毕竟没有人能阻止面试者把题目发到网上,所以任何编程题目都逃脱不了被公开的命运。

不过,尽管面试者会把编程题目发到网上,甚至会有一些『好心人』给出答案,但这并不代表面试官不能继续使用这道题:因为尽管题目被公开,但题目的考察点和延伸问题依然只有面试官才知道。这有点像 公钥加密,公钥(面试题)是公开的,但私钥(解法,考察点,以及延伸问题)只有面试官才知道。这样即便面试者知道面试题,也不会妨碍面试官考察面试者的技术能力。

接下来,让我们看看什么问题适合白板编程。

不止一种解法

良好的编程问题都会有不止一种解法。这样面试者可以在短时间内给出一个不那么聪明但可实现的『粗糙』算法,然后通过思考(或面试官提示)逐步得到更加优化的解法,面试官可以通过这个过程观察到面试者的思维方式,从而对面试者进行更客观的评估。

数组最大子序列和 为例,它有一个很显然的 O(n^3) 解法,将 O(n^3) 解法稍加改动可以得到 O(n^2) 解法,利用分治思想,可以得到 O(n*logn) 解法,除此之外它还有一个 o(n) 解法。(编程珠玑数据结构与算法分析 C语言描述 对这道题均有非常精彩的描述,有兴趣的朋友可以自行阅读)

考察点明确

良好的编程问题应拥有大量考察点,面试官应对这些考察点烂熟于心,从而给出更加客观量化的面试结果。这里可以参考我之前在 从武侠小说到程序员面试 提到的 to_upper

延伸问题

良好的编程问题应拥有延伸问题。延伸问题既可以应对面试者背题的情况,也可以渐进的(Incremental)考察面试者的编程能力,同时还保证了面试的延续性(Continuity)。

遍历二叉树 为例:面试官可以从非递归中序遍历二叉树开始提问,面试者有可能会很快的写(或是背)出一个使用栈的解法。这时面试官可以通过延伸问题来判别面试者是否在背题:使用常量空间中序遍历带有父节点指针的二叉树,或是找到二叉搜索树中第 n 小的元素。下面是中序遍历二叉树的一些延伸问题:

|--中序遍历二叉树
    |
    |--非递归中序遍历二叉树
        |
        |--常量空间,非递归遍历带父节点的二叉树
        |   |
        |   |--在带父节点的二叉搜索树寻找第 N 小的元素
        |       |
        |       |--可否进一步优化时间复杂度?
        |
        |--常量空间,非递归遍历不带父节点的二叉树

上面的问题不但可以被正向使用(逐步加强难度),也可以被逆向使用(逐步降低难度):同样从非递归中序二叉树遍历开始提问,如果面试者无法完成这个问题,那么面试官可以降低难度,要求面试者编写一个递归版本的中序遍历二叉树。

如何进行白板编程

{%}

面试官应该做什么

面试前

面试之前,面试官应至少得到以下信息:

1. 面试者的简历

2. 面试者的应聘职位

3. 面试者之前被问过哪些面试题

接下来,面试官应根据面试者的简历/职位确认对面试者的期望值,然后准备好编程题目(而不是面试时即兴选择题目)。面试官应至少准备 4 道题目(2 道简单题,2 道难题),以应对各种情况。

面试中

面试时,面试官应清楚的陈述题目,并通过若干组用例数据确认面试者真正的理解题目(以免面试者花很长时间去做不相关的题目,我在之前的面试就办过这种挫事 -_-#)

在面试者解题时,面试官应全程保持安静(或倾听的状态),如果面试者犯下特别严重的错误或是陷入苦思冥想,面试官应给出适当的提示,以帮助面试者走出困境完成题目,如果面试者还是不能完成题目,那么面试官应换一道略简单的题目,要知道面试的目的是发现面试者的长处,而非为难面试者。(一些国内企业似乎正好相反)

面试后

面试之后,面试官应拍照(或誊写)面试者写下的代码,然后把提问的问题发给 HR 和接下来的面试者(以确保问题不会重复)。接下来,面试官应根据面试者的代码以及其面试表现,尽快写出面试反馈(Interview Feedback)发给 HR,以便接下来的招聘流程。

面试者应该做什么

面试前

面试之前,面试者应至少做过以下准备:

1. 拥有扎实的数据结构/算法基础

2. 知道如何利用 前条件/不变式/后条件 这些工具编写正确的程序

3. 能够在白板(或纸上)实现基本的数据结构和算法(如果 1 和 2 做到这一步是水到渠成)

4. 在 leetcodecareercup 上面进行过练习,了解常见的技术面试题目(我个人不鼓励刷题,但在面试前建立起对面试题的『感觉』非常重要)

面试中

确定需求

面试者在白板编程时最重要的任务是理解题目,确认需求——确定输入/输出,确定数据范围,确定时间/空间要求,确定其它限制。以最常见的排序为例:

  • 输入:来自数组?链表?或是不同的机器?

  • 输出:是否有重复?是否要求稳定?

  • 数据范围:排序多少个元素?100 个? 100 万个? 1 亿个?这些元素是否在某个范围内?

  • 时间要求:1 分钟?1 刻钟?一小时?

  • 空间要求:是否常量空间?是否可以分配新的空间?如果可以,能分配多少空间?是否在内存中排序?

  • 其它限制:是否需要尽可能少的赋值?是否需要尽可能少的比较?

有时面试官不会把题目说的特别清楚,这时就需要面试者自己去确认这些需求,不要认为这是在浪费时间,不同的需求会导致截然不同的解法,此外确认需求会留给面试官良好的印象。

白板编程

理解题目确认需求之后,面试者就可以开始在白板上编写代码,下面是一些我自己的白板编程经验:

  • 先写出轮廓(大纲)

白板编程没法复制粘贴,所以后期调整代码结构非常困难。因此我们最好在开头写出程序的大致结构,从而保证之后不会有大改;

  • 确定前条件/不变式/后条件

我们可以通过注释的形式给出代码的前条件/不变式/后条件,以划分为例:

int* partition(int *begin, int *end, int pivot) {
    int *par =  begin;
    for ( ; begin < end; begin++) {
        if (*begin < pivot) {
            swap(begin, par++)
        }
    }
    return par;
}

就不如

int* partition(int *begin, int *end, int pivot) {
    // [begin, end) should be a valid range
    int *par =  begin;
    // Invariant: All [0, par) < pivot && All [par, begin) >= pivot
    for ( ; begin < end; begin++) {
        if (*begin < pivot) {
            swap(begin, par++)
        }
    }
    // Now All [0, par) < pivot && All [par, end) >= pivot
    return par;
}

  • 使用实例数据验证自己的程序

尽管不变式足以验证程序的正确性,但适当的使用实例数据会大大增强代码的可信性,以上面的划分程序为例:

Given range [2, 3, 4, 5, 1] and pivot 3

[ 2, 3, 4, 5, 1 ]
  ^             ^
 p,b            e

[ 2, 3, 4, 5, 1 ]
     ^          ^
    p,b         e

[ 2, 3, 4, 5, 1 ]
     ^  ^       ^
     p  b       e

[ 2, 3, 4, 5, 1 ]
     ^     ^    ^
     p     b    e

[ 2, 1, 4, 5, 3 ]
        ^     ^ ^
        p     b e

[ 2, 1, 4, 5, 3 ]
        ^       ^
        p      b,e

Now we have all [0, p) < 3 and all [p, e) >= 3

  • 使用缩写

白板编程并不需要面试者在白板上写出能够一次通过编译的代码。为了节省时间,面试者可以在和面试官沟通的基础上使用缩写。例如使用 Iter 替代 Iterable,使用 BQ 替代 BlockingQueue。(此法尤其适合于 Java -_-#)

  • 至少留一行半行宽

出于紧张或疏忽,一般面试者在白板编程时会犯下各种小错误,例如忘了某个判断条件或是漏了某条语句,空余的行宽可以帮助面试者快速修改代码,使得白板上的代码不至于一团糟。

这就延伸出了另一个问题,如果使用大行宽,那么白板写不下怎么办?一些面试者聪明的解决了这个问题:他们在面试时会自带一根细笔迹的水笔,专门用于白板编程。

不会做怎么办

相信大多数面试者都碰到过面试题不会做的情况,这里说说我自己的对策:

1. 至少先给出一个暴力(Brute force)解法

2. 寻找合适的数据结构(例如栈/队列/树/堆/图)和算法(例如分治/回溯/动态规划/贪婪)

3. 从小数据集开始尝试

4. 如果还是没有头绪,重新考虑题目的前条件,思考是否漏掉了条件(或是隐含的条件)

5. 如果 3 分钟过后还是没有任何思路,请求面试官提示,不要觉得不好意思——经过提示给出答案远强于没有答案

面试后

个人不建议面试者在面试之后把题目发到网上,很多公司在面试前都会和面试者打招呼,有的会签订 NDA(Non Disclosure Agreement)条款以确保面试者不会泄露面试题目。尽管他们很少真的去查,但如果被查到那绝对是得不偿失。

我自己在面试之后会把面试中的编程题目动手写一遍(除非题目过于简单不值得),这样既能够验证自己写的代码,也可以保证自己不会在同一个地方摔倒两次。

参考

书籍

  1. Elements of Programming Interviews: The Insiders' Guide

  2. 编程原本

  3. 程序员面试金典(第5版)

文章

  1. 怎样花两年时间去面试一个人

  2. 5 Whiteboard Coding Tips for Interviews

  3. Is “White-Board-Coding” inappropriate during interviews?

以上。

阅读图灵社区原文

程序员如何提高影响力

{%}

作者/ 黄峰达

毕业于西安文理学院(电子信息工程专业), 现就职于Thoughtworks(西安)有限公司。开发长期活跃于各类开源软件社区以及其他技术交流社区。目前专注于物联网和前端,是CSDN前端博客专家、InfoQ物联网周报编辑,著有电子书《一步步搭建物联网系统》

 

影响力,让梦想离你更近。

试想一下,有一天你开发了一个新的语言。它比现有的某某主流软件,运行效率将提高了50%,开发效率提高了100%。接着,你在github上release了0.1,但是由于出现某个开发难题,你需要别人的帮助。而这时,你找不到有效的途径去找到那些真正会用它的人。接着出现了一个新的语言可以达到一样的效果,而这个项目就死于腹中,我记得mruby刚刚只写了一个README.md的时候,就获得了上千个star。

如何提高影响力,为自己代言

{%}

每个人都可以是一个品牌,对于一个程序员来说,我们的ID就是我们的品牌。而构成品牌的有多个要素:

  • 博客

  • Github

  • Weibo(or Twitter)

  • StackOverflow(or SegmentFault, Zhihu)

等等。

搭建一个跨平台的平台

连接各个平台的核心是我们的ID。

第一个平台指的是不同的网站,如我们的博客、Github、知乎等等,第二个平台指的是我们的影响力。

So,在开始的时候我们需要有一个统一的ID,来标识我们的身份:我是谁,你在xx网站上看到的那个xx就是我。刚开始的时候,我在CSDN、Github上的ID(gmszone)和我的博客的域名(Phodal)是不一样的,因为当时的域名(gmszone.com)握在别人的手上,于是我便想办法将两个ID改了过来(ps: github提供迁移)。后来,Phodal就成了我的发声平台:

于是,这时就可以开始使用跨平台的平台了。

构建平台

小博客也会有成长的一天。

对于像我这样一个个默默无闻地人来说,用户可能会有下面几种不同的方法来知道我:

{%}

  • 用户 -> 搜索{谷歌,百度,必应} -> 博客 -> {Weibo,Github}

  • 用户 -> 微博 -> {Github, 博客}

  • 用户 —> Github -> 博客

  • 用户 -> {知乎, SegmentFault} -> {Weibo,Github,博客}

博客

刚开始在CSDN上写博客的时候,一开始的访问量很少,慢慢地就多了。有一天发现这样的博客不是自己想要的,于是建了自己的博客,一开始的流量是0。像CSDN这样的网站推荐一些文章到首页,如果能这样便是幸运的。在经历大半年的几乎零流量之后,开始慢慢增长了。到了今天,一共有470篇博客(有一些是出于测试SEO目的写成多篇文章)。一天的PageView大平均有五百左右,主要来源是搜索引擎,百度200左右,谷歌50左右,必应10左右。

#用户故事

对于一个程序员来说,必须在某种程度上熟悉怎么搜索自己想要的内容,即关键字。如我们想要知道如何在OpenWRT OS上用Python,那么我们会搜索OpenWRT Python。于是,这个时候我们博客的标题带有OpenWRT Python,那么我们可能就中奖了。

故事,告诉我们好的标题很重要重复这个主题也很重要,会有一个更好的排名。至于,如何更好地排到第一,就是SEO(搜索引擎优化)的话题了。

#笔记

一开始要写一个博客是比较难的,没有流量、没有评论。所以,一个好的切入点是: 笔记。最好是那种网上很少的内容的笔记,虽说很多人不愿意去做这个,但是这是一个很好的方向。

一个技术博客里面的内容应该是两种类型:

  • 技术

  • 理论

技术型可以带来流量,理论型的可以带来评论。理想的话,两者会相辅相成的,但是在我们刚处于学习期的时候。那么那些Note,可以给我们带来一些流量,也带来一些信心。如果,只是想着一开始我就只写一些长篇大论的话,那么只是就是拿了80%的时间做了20%的事。

以用户搜索的过程来说,用户是有目的的进行搜索。换句话说,在我们日常工作的时候,我们只关心和我们工作相关的内容。而在受众来,正常情况下,技术型的博文、笔记可以带来流量的主要原因是: 大部分人都是初学者

{%}

理论性的内容,更适合更高级别的开发者,这样的受众较少。

上头条

而在今天有其他的平台,可以借用来推销自己的:

  • 开发者头条

  • 极客头条

  • 掘金稀土

  • ...

网上的IT新闻、博客都是互相Copy,对于一些软文(如本文)来说。这也是期触及率高的原因,通常来说这样可以带来大量的流量。记得在原文中留个原文链接,附张图片(自己博客的图片)来保证:Google把原文指向你的博客,而不是免费为别人打工。

提升

除了是一个很好的展示平台,也是一个很好的测试平台。作为一个Web Developer,测试过

  • Nginx Log分析(~600M)

  • New Relic

  • SEO

  • AutoComplete

  • 重构网站

  • ...

Github

将自己尝试的不同技术栈的内容丢到Github上,加上适当地文档、博客,就变成了一个很好的Demo。然而,不止于此,越来越多地人开始在Github寻找人才,因为他们乐于付出,也乐于分离。曾经因为Github上的项目:

  • 申请WebStorm开源License

  • Review英文版书籍

  • ...(有些不方便透露)

而在Github上的项目其实不仅仅只有一些库:

  • 库和框架: 和jQuery

  • 系统: 如Linuxhhvmdocker

  • 配置集: 如dotfiles

  • 辅助工具: 如oh-my-zsh

  • 工具: 如HomewbrewBower

  • 资料收集: 如free programming booksYou-Dont-Know-JSFont-Awesome

  • 其他:简历如Resume博客

所以,可以尝试不同的切入点使用Github。

在某种程度上来说,一个人在Gihub上的粉丝数量会帮助他的项目在初期获取更多的人气。这样就有助于其下一步开展项目,当然也会在某种程度上更好看Blabla。

提升

之前写过一篇《如何通过github提升自己》中说到了一些细节,大致上还是那些东西,Github与Trello、Travis-CI、Coveralls、SauceLabs、Code Climate,配合得很好。已经可以接近于我们在一些项目上用到的功能,因此拿他们搭建一个好的开发环境完全不是问题。

  • Travis CI:支持Node.js、Python、Ruby、PHP等二十几种语言,也支持MySQL、PostgreSQL、MongoDB、Redis等数据库。

  • Coveralls:可以用来查看代码的测试覆盖率。

  • SauceLabs:可以用来跑Selenium功能测试等等

  • Code Climate:查看代码的坏味道。

在我们试着去保证测试覆盖率、代码质量等等的时候,我们就可以学到一些知识,如使用不同语言测试框架的Mock、Stub、FakeServer等等。

扩大影响力

上面的两部分属于打造平台部分,而如Weibo、知乎等则属于扩大影响力。

在某种时候,博客、Github都更像是个人的平台。如Weibo、知乎、SegmentFault、CSDN等等的开发者社区,也可以为自己的博客、Github带来流量,而这一些都是互相促进的。如果我们在其中的一个网站上表现得很好的话,那么在另外一个网站上我们也很容易聚集同样的粉丝。如,我最常用的一个作法是: 将自己写得相对比较好的一些博客复制到CSDN、SegemntFault、图灵社区等等,并适当地推到CSDN首页、开发者头条等等。

由于写作的开发人员是有限的,所以通常在某某头条上的推荐,会成为某博客园上的新闻,接着会有成群接队的小站开始Copy。同时,这些文章又会推到他们的微博上,接着还可能是微信平台。毕竟,对于大部分的网络来说,大部分的流量是流向他们的网站的,所以他们不太会在乎其中的外链等等。故而,通常来说: 不是某某东西突然火了,而是突然没有别的新闻了。通常来说一个好的作法是,试着将你的博客分享到微博上,然后@那些愿意帮你分享的平台。这样,你可以有更多的阅读、更多的粉丝,当然好的内容是前提。

其中还有若干其它的好处:

  • 更大的曝光率,会带来更多的机会

  • 更有机会参与一些未公开互联网产品的试用

  • 各种精美小礼物

  • 翻译、出版机会

TODO

只需要简单地几步就可以开始提高我们的影响力:

  • 在不同的网站上使用一个ID

  • 创建一个博客

  • 开始创作内容、提交代码、分享

  • 持续Impact

图灵社区原文