45

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

 5 years ago
source link: http://www.10tiao.com/html/612/201807/2651330284/1.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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


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

 

 

多写代码


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



多做测试


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

 

我们来举个具体的例子:


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(`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(`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的输入输出了如指掌,但往往却会因为自己存在知识漏洞而在和别人探讨时露出马脚。

 

利用好开源资源


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


 

积极帮助他人


要随时保持乐于助人的心态。这样下次你的同事遇到了同样的问题时,就会主动来找你求教,因为你在他们心里已经成了某个概念、某个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原则等。要把这些基本原则铭记于心,因为即使你碰上了一些看似与自己负责的那部分代码无关的问题,兴许也能靠着这些通用原则解决掉。


结语


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


广告时间:王牌明星教师冯沁原老师主讲的CS501算法面试冲刺课8月5日正式开课!点击阅读原文查看详情,免费参与试听!

原文链接:

https://hackernoon.com/how-not-to-be-a-mediocre-developer-c59a49f97fc5


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK