我拒绝当一名当平庸的程序员


(kikidai) #1

本文选自Medium的一篇文章,原作者为Dushyant Sabharwal。在Medium上本文获得了12200多个赞(这已经是非常的高的一个数字了)。希望这篇文章能够对你的职业发展有帮助,本文的原文链接你可以在文章底部找到。

写在开头:我自己绝非是什么顶尖程序员,但我会努力研究让那些最厉害的人脱颖而出的原因。本文总结了我认为顶尖程序员广泛拥有的一些特质,希望你在阅读的过程中能有所收获!

![](data:image/svg+xml;utf8,)

多写代码

经验告诉我们,任何事情要想做得好,你必须投入大量的时间。哪怕你读了再多的文章、看了再多遍别人的代码,如果自己不身体力行地去写,就绝不可能有所提高。设计的范式可能最初是很难掌握的,但随着你在不同情境下的不断应用,一切都会逐渐变得容易起来。

![](data:image/svg+xml;utf8,)

多做测试

我刚开始写测试代码的时候,发现自己很难跳出先前的思维模式,因此也很难写出好的测试代码来。写测试能促使你从完全不同的角度去思考,因为你得想方设法让自己代码的问题暴露出来。一般而言,为方便后续测试的编写,同一个函数或方法里最好不要装太多东西,因为同一个测试也没法实现太多的检测功能。我们可以选择把一个函数拆分成多个,分别实现不同的内容。

我们来举个具体的例子:

function postData(data) {
boolean valid = true;
// check if data is defined
if (data === undefined) {
valid = false;
}

// check if email is well formed
if (!regex(data[‘email’]) {
valid = false;
}

// check if password is atleast 8 chars.
if (data[‘password’].length < 8) {
valid = false;
}

if (valid) {
http
.post(`http://example.com/user/create`, data)
.then((response) => {
//append to the list
this.users.append(response.userid);
})
.catch((error) => {
// show errors.
});
} else {
showValidationError();
}
}

在上面这段代码中,postData就负责了多个功能,包括验证数据、将执行了resolve后的Promise参数添加至用户列表、处理错误等。这时候,如果要给postData专门写单元测试就会非常困难。因此,我们可以将其拆分成数个方法,然后分别对每一部分进行测试。拆分后的代码如下:

function postData(data) {
return http
.post(`http://example.com/user/create`, data);
}

function validate(data) {
// check if data is defined
if (data === undefined) {
return false;
}

// check if email is well formed
if (!regex(data[‘email’]) {
return false;
}

// check if password is atleast 8 chars.
if (data[‘password’].length >= 8) {
return false;
}

return true;
}

function appendUsers(userId) {
this.users.append(response.userid);
}

function main() {
if (validate(data)) {
postData(data)
.then(data => appendToList(data.userId))
.catch(error => handleError(error))
} else {
showValidationError();
}
}

通过以上的例子,我们就能够理解为何多做测试能帮我们写出更高质量的代码。要想方便测试,我们就得把冗长的方法拆分成更小的单元,从而使得每个单元都能更便捷地得到测试。

直面自己的不足

要想成为优秀的程序员,我们还得有自知之明。要知道自己的不足在哪里,并且大方地承认和面对这些不足。有的人害怕丢脸,于是假装自己对某个API的输入输出了如指掌,但往往却会因为自己存在知识漏洞而在和别人探讨时露出马脚。

利用好开源资源

通过开源的资源,我们能接触到许多自己工作以外的东西,从而大大拓宽自己的视野。你能了解到如何在一个分布式场景中运行一整个项目、学习到如何使用最新的开源工具,等等等等……对学习中的程序员来说,开源带来的好处是数不胜数的。对普罗大众则更不必说,开源早已直接或间接地改变了他们的生活。

![](data:image/svg+xml;utf8,)

积极帮助他人

要随时保持乐于助人的心态。这样下次你的同事遇到了同样的问题时,就会主动来找你求教,因为你在他们心里已经成了某个概念、某个API问题的专家了。这有助于你在团队中体现自我价值。即使别人向你请教的是你并不那么擅长的领域,你也能在研究的过程中涨涨知识。

做点个人的项目

私人项目与我们工作中接触到的项目往往是大不相同的,因此接私人项目是学习新框架、新技术的一个好方法。此外,接私人项目的时候,你是作为产品经理、作为整个项目的负责人去工作的,可想而知其中会涉及的决策量。有了私人项目的经验,你就可以在自己的岗位上提出更新的框架和工具,让自己进一步脱颖而出。

戒骄戒躁

不要因为有了一点成就就傲上矜下,也不要因为自己职位高了就洋洋自得。无论你的位置在哪里,都要以不断学习、不断提升自我为目标。要学会以开放的态度对待你自以为擅长的东西,因为厉害的程序员大有人在,他们随时可能拿出更高效的算法、更优越的功能设计来。

多问“为什么”

在刚接触到一个新框架、或新API的时候,不要急着应用,先问一句“为什么”:这个概念最初是为什么存在的呢?

var app = new Vue({
el: ‘#app’,
data: {
message: ‘Hello Vue!’
}
})

上面这段代码是你在vue.js 官方文档中见到的第一个例子。即使是面对这么基础的代码,我脑中想的是:

- 为什么要给创建组件定义一个新的关键词?为什么在生成对象时没有使用工厂模式?

- 这里的el 属性似乎是接收元素的id,但是为什么要用#这个符号呢?这是不是说明我可以添加其他的元素选择器,比如attr和class?

- data似乎是vue对象中使用非常广泛的一个属性,它究竟有代表什么呢?

当然,举这个例子不是说我们一定要对所有的概念都如此追根究底。但是如果你养成了这个问“为什么”的习惯,必然有助于你理解事物的本质,进而还能够加强你的理解能力。

别在细节上偷懒

在小细节上偷懒会让你显得很不专业。举例来说,如果你认为重构能提升性能,那么就应该直接动手去做。与此同时,要记得添加注释,方便其他程序员的理解。你在解释自己的编程内容上多花了时间,相当于是给其他程序员省下了理解你成果的时间。

正视编程中的“挑战”

正视编程中的“挑战”能逼着我们重新审视那些我们原以为理所当然的东西。这里所说的“挑战”呢,指的是我们编程的空间复杂度和时间复杂度。有些人认为要想彻底解决这些挑战是不现实的,因为它们太过抽象,况且大多数人都会直接选择用API。但是我个人要坚决反对这种观点!正视“挑战”,不仅能让我们更批判性地看待自己的代码,还能让我们逐渐积累起足够的自信,因为在批判思考下改进过的必然性能更优。当然,除此之外,正视“挑战”还能给我们带来更好的面试表现。

公开表达你的赞许

如果你很喜欢同事的commit,那么别害羞,可以给ta发个消息表达一下赞许。给Stack Overflow上帮到你的回答点个赞、为那些传递了知识的medium文章喝个彩、给github上有趣的项目打个星……赞许的行为能鼓励他人积极表达,同时也能激励自己变得更好。

别拿“层”当借口

有些程序员会抱有一种在我看来非常不正确的心态。比如,他们在使用API时,可能发现了一些会耗费自己大量精力的问题,但他们认为自己无法修正这些问题,原因是自己只不过是个“前端程序员”。许多基本原则对堆栈中的每一层都是适用的,比如当数据的分类要多次使用时要用缩写代替全程、以及DRY原则等。要把这些基本原则铭记于心,因为即使你碰上了一些看似与自己负责的那部分代码无关的问题,兴许也能靠着这些通用原则解决掉。

结语

写了这么多,相信这篇文章能帮助大家意识到许多自己的不足。但大家也要切记,要想弥补这些不足,就必须要足够努力、足够自律才行。