转:如何判断自己是否具有成为优秀程序员的潜质

2014/02/2414:09:55 评论 1,079 views

如何判断自己是否具有成为优秀程序员的潜质

原文:http://www.linuxeden.com/html/news/20140224/148743.html

很多像这样的日子,当地上积起厚厚的雪时,我通常会燃起铁炉,把马蹄跌烧的通红,搓搓温暖的手,开始打造特制手工马蹄铁。

经过了5年多的专职钉马掌生活后,我开始问自己一个问题:我要一直这样干下去吗?能不能干点儿别的?我的性格跟其他乡下那些叼着雪茄、喝着小酒的铁匠不一样,我从来没有戴过牛仔帽或骑过公牛。我渴望的是知道更多的事情,琢磨更多的事情,做更多的事情。

成功的从事开发工作7个月后,我已经给几百人回复了邮件,他们问我如何成为一个程序员的,寻求我的建议,他们想知道如何判断自己是否适合去做一名程序员

本文的作者 Joshua Kemp

下面罗列了7种特征,是我从同事中最有效的程序员身上观察到的,我知道,优秀的程序员都有很多共同之处:

1) 注意细节,尤其是最小的细节。

“差不多”、“很接近”是只能在做马蹄铁时用的词,在软件开发中,95%的正确仍然是不能用,一个“差不多”能用方法或一个使图片很“接近”居中的CSS样式都是不合格、不能用的。这剩下的5%对于整个软件的有效性十分重要,能造成完全相反的结果。

«««  如果你讨厌细节,你就别去做程序员。

2)  学无止境

起初这句话听起来会很迷人,你会很喜欢!我喜欢学习新事物!尤其是当你来自于一个无聊的工作或像钉马掌这样永远不变的事情时 =-)。然而,经过了一段时间后,你会发现,这变成了一条永不停息的知识河流,如果你不喜欢水,你会感觉困在了无尽无边的知识瀑布前,无法停止,也无法穷尽。我每天大概有学到10-20种新的东西,我喜欢这些!我的弟弟却希望事情永远不会变化,始终如一,他对我说他永远都不愿意去学编程。

«««  如果你不喜欢坚持不懈的去学习新事物,而喜欢待在一个永不变化的环境中,那你很可能成为不了一名程序员。

3)  面对压力、紧张和限定期限

没错,每个人都喜欢使用软件,但你喜欢面对任务的最后期限和最终目标吗?需要什么时候完成?做完这些要花多少时间?我们能在这段时间里完成更多的任务吗?是否还记得要注意细节?你怎么办?急匆匆的完成?加班加点希望能多完成一些?在理想世界里,编程是一个很有趣的活动,我们写出代码,让它们完成很酷的事情,吃着批萨,喝着可乐。而在现实生活中,有的是压力,虽然不是时刻都这样,但事情会比那种做一个30分钟的简单在线辅导要不同的多。我喜欢挑战我的极限,我渴望成长,变成一个更棒的程序员,所以我不介意。

««« 你面对时间限制和工作压力会怎样?如果你想回避这些压力,那你将无法成为一名程序员。

4)  有组织能力

我知道有些程序员的生活一塌糊涂,看起来他们似乎没自我组织能力,但我说的不是这些,我是说管理好工作流程的能力。比如,能否迅速容易的在你的计算机里找到一个东西?我认识的优秀的程序员通常能迅速的定位一个需要的文件,能够用工具或脚本帮他们处理繁杂的事物,这些都是高效的工作。

««« 当你学到了一个新东西时,你是否把它写下来?你是否喜欢想出办法来替你完成那些重复的工作?你能很好的安排各种不同的任务吗?如果不能,那你就不适合去当一名程序员。

5) 好奇心

当我还是十几岁时,教堂里的一位夫人几乎每月都会对我说一次,她说我应该停止问那么多为什么,她说这让人讨厌。虽然受了批评,最终我还是清楚的认识到,优秀的程序员总是在问“为什么?”这个应用的工作原理是什么?那个横跨街道的建筑是怎么建起来的?程序员之间的对话听起来总是像这样开始的:“很奇怪他们为什么要这样做…?”以前我以为问这么多为什么是很奇怪的表现,但现在我明白,至少是在软件开发中,这是一个好的品质。

««« 不明白的事情会引起你的好奇心吗?新事物会让你兴奋的想搞清楚它的原理吗?如果你不具有某种程度天生的好奇心,那么你就很可能不喜欢做一名程序员。

6) 自学

我知道,很多的程序员都上过大学,出自高校的,但这不是我要说的。优秀的程序员总是在钻研程序代码和文档,来弄清楚东西的工作原理,他们不会敲开老板办公室的们说:“我需要上培训课,学习这款新软件”。优秀的程序员在不断的学习,不断的靠自己研究出事情的原委——不论是有高学历还是没有学历。

««« 如果你需要有人教你,或者等着参加热门的课程去学知识,那你很可能不会成为一名程序员。

7) 人际交往能力

这在程序员中不是一个普遍的特征。真正优秀的程序员善于与人交往,但大多数程序员缺乏这些能力。如果你善于沟通,你的老板、你的公司会非常喜欢你。而且,不要因为他们不会编码就瞧不起他们。

««« 如果你不喜欢与人接触,跟别人在一起时觉得很难受,那你也许就不应该成为一名程序员。

考虑到很多国内程序员到了35岁之后各种健康问题都来了,为了可持续,小编补充1点:

1:热爱生活,有健康的生活作息和锻炼习惯。

 

补充另外一篇文章:

这里我使用了聪明懒惰程序员这几个词。我说的这几个词的意思是:

  • 程序员:有积极活力的,专注于用代码解决真实世界里的问题
    • 不是指那些梦想家,那些永远只想不做的人
  • 聪明:能够周全的思考问题(不是那些耍小聪明的人)
  • 懒惰:就像是程序中的lazy-loading,是指延后写代码的时间(而不是无所事事的人)。

正确的软件开发应该是懒惰式开发,也被称作忍耐式开发;这种开发方式的表现是,在真正动手写代码前,程序员要花大量的时间通盘考虑所有可能的解决方案和途径。这可以看作是延缓写代码,在没有完全理解问题前绝不动手写代码。先把问题理解清楚,确保将要写的代码能真正的解决问题,这将会避免之后写出大量无用的代码。
这里说的先把问题弄清楚,表现有:

  • 真正的理解需求,让产品部门(业务分析部门)弄清楚他们真正需求的是什么。
    • 这些部门通常不给足够的时间来整理需求
    • 他们经常不是请教问题领域专家,而是顺从领导的意见
    • 他们通常无法提供前后一致或完整的需求意见。
  • 清楚跟团队中的其它程序员或其他团队中的程序员需要那些交互,如何交互,这包括:
    • 使用白板交流
    • 画流程图(UML或Visio)

你需要花大量的时间调研,来确保需求符合实情,来做工作让你和同事的交流有共同的语言语义。然而,程序员都喜欢立刻冲上去编程,喜欢在电脑前不停的敲代码。
在真正的软件开发中,只有5%的开发时间是有效率的(你可以参考《程序员开发效率悖论》)。如果你发现一个程序员用100%的时间都在盯着屏幕,那么,你看到的这个程序员是最糟糕的程序员。

如果一个程序员总是在电脑前编码,这绝对是一个不好的信号。

高效的程序员总是不断检查他对需求的理解,确保他们的代码和需求是同步的。高效的程序员是频繁的和产品经理/业务人员沟通交流,你可以经常看到他们使用白板与同事和架构师交流讨论。程序员的阅历和经验都是用来提高开发效率,这最优秀的程序员:

  • 他们思考代码的时间增加而写代码时间减少
  • 对问题的透彻理解使调试代码的速度更快
  • 深思熟虑后的代码速度更快
  • 代码长度更短

程序员从心理上讲都是喜爱自己的代码的。
烂程序员不喜欢去修改已经写成的烂代码。相比起优化自己的代码,他们更愿意简单的增加更多的代码,以此来弥补之前的缺陷。更糟糕的是,他们喜欢把责任归咎于他人。最终,一堆不好用的代码上在来另外一堆不好用的代码,整个系统变得到处是bug,极不稳定。

优秀的程序员经常也会写出烂代码,但他们能看到那些代码需要优化,哪些需要重写。优秀的程序员和不优秀的程序员的区别就在于对有问题的代码的态度,优秀的程序员的做法是:

  • 如果代码整体上好的,那就重构代码。
  • 如果代码整体上有问题,那就重新代码

当代码中有需要优化或需要重写的地方时,时间拖的越久,你就越难回头解决这些问题。因为对这些代码依赖的程序会越来越多,越来越深,当你优化这些代码时,相关的依赖也需要进行相关修改。当积累的问题越来越多时,轻松的优化/重新这些代码已经变得不可能。而使用继续增加代码的方式来弥补之前代码问题,会让系统变得越来越不稳定。

如果脑子里没想清楚,那就懒一些,把写代码的时间往后推。

 

文3:http://www.kuqin.com/shuoit/20140515/339933.html

漫谈好程序员的标准

无数的人问过类似的问题, 怎么样才能做一个好的程序员? 在回答这个问题之前, 首先得明白什么是好的程序员, 这样才有方向和目标, 可是这事情太主观, 可能各人的标准千差万别, 不谈那些传奇性的独自一人做出伟大事情的特例, 也不谈什么上天入地, 上帝大牛的诡论, 以下是我比较认可的, 在通常的项目开发中, 一个好程序员的标准.

解决问题的能力

在项目开发中, 一个程序员的能力等于其解决问题的能力. 假如想有个尺度来衡量这个能力的话, 一个程序员的能力可以用能完成任务的规模和难度来衡量.

因为难度上不好那么简单的划分, 并且在一般的项目开发中(非研究性项目), 任务的难度主要来自于任务的规模带来的复杂度, 这里把任务从规模上大致的划分为1个函数=>1个类=>1个功能=>1个模块=>1个项目

更细致的划分时,函数, 类, 功能, 模块, 项目本身也有简单和规模大小之分.

  • 一个初学编程的人总是从最小的函数和类开始学习的.
  • 一个程序员能基本无误的完成项目中的一个功能算是合格, 在此之前, 对项目的生产力为负, 即为他布置任务, 沟通, 和为他修补bug的时间其实要多于自己直接完成该功能的时间. 也就是说, 项目中存在这个水平的程序员纯粹是为了培养人才.
  • 能较好完成一个完整模块的程序员算是较好的程序员, 也是一般项目中的主要开发者.
  • 能完成整个项目的程序员才能算是好的程序员. 在多人项目中可做主程.

不同规模的任务主要的问题也体现在不同的方面:

  • 对于初学者来说, 写好一个函数和类的难点在于语言本身的语法上.
  • 对于完成一个功能来说, 难点在于理解这个功能, 以及很好的在现有的代码中加入此功能, 完成的功能不是独立于项目之外的, 而是要融入项目本身, 除了功能本身和其他功能衔接正常无误外, 特别重要的就是注意功能实现后不能对其他功能产生预期外的影响, 作为游戏开发来说, 典型的例子就是你完成的UI不能让其他该显示的UI显示有问题, 不该显示的UI又没有消失.
  • 对于完成一个模块来讲, 暴露给外部的接口设计比内部实现的设计同样重要(甚至更加重要), 合理易使用的接口设计决定了一个模块的好坏. 模块内部实现不好尚可更改, 接口实现不好, 更改起来可能是灾难性的.
  • 对于一个项目来讲, 在正确的地方使用正确的解决方案是最重要的事情, 最开始的技术选型直接决定项目的成败, 模块的划分能决定项目的开发速度, 架构的设计能决定项目的维护难度和增加需求时的痛苦程度. 对于多人项目来说, 主程让正确的人去做正确的事情也是无比的重要.

什么决定了一个程序员解决问题的能力呢? 我认为有如下几个因素:

知识积累

在同等水平的程序员之间, 一个对某领域问题有所了解, 一个对该领域完全不了解, 完成该领域同样任务的效率差了不止一个数量级. 这就是我们通常所说的"经验"的作用, 这种经验可以看作是知识积累,

一个程序员的知识积累很大程度上决定了其解决问题的能力.

有意思的是, 因为经验这个事情不太好有准确的衡量标准, 我们为了简单, 常常就拿工作几年说事, 但是这种粗暴的标准有很大的问题, 工作年限同样长的人水平差异可以是巨大的.

按老话说, 用一年的经验工作二十年并不等同于二十年工作经验.

自学能力

这是一个知识大爆炸, 知识刷新频率让人无法追赶的时代. 一方面, 面对一个稍有难度的任务, 难免会有超出自己现有的知识范围的时候, 此时自学能力决定了你能多快的完成此任务(或能否完成此任务). 另一方面, 你的自学能力决定了在平时的工作过程中, 你积累知识的多少.

自学能力强的人, 即使没有人指点也总能在项目的代码中学到东西. 而反过来, 学习意愿弱的人写的代码被别人重构后, 也不会想想, 这段代码是否改的更好了以及为什么. 同时, 一个自学能力强的人也更有希望主动的在业余去学习更多的知识, 而不是直到工作中碰到才去被动学习.

从较长的尺度上(比如一个人的工作生涯)来看, 一个程序员知识积累的多少只决定于其自学能力和他对编程本身的兴趣.

品味

本来我是想把一个程序员的品味单独列出来的, 后来仔细想想, 一个程序员的品味其实不是一种天生的能力, 而是基于现有知识的积累, 形成的对事物的看法. 所以把品味放在自学能力下面的. 同样的, 其实通常说的正确的思维模式和方法, 其实也是来自于知识的积累. 这里我就根本不提这一条了.

品味往往用于形容一个人对时尚衣着, 食物等的看法, 其实对程序员来说, 品味也很重要.

不同的品味不仅决定了不同的语言设计者怎么设计编程语言, 也决定了一个程序员在做项目时会使用什么语言, 什么框架.
不同的品味决定了你会选择什么样的操作系统, 什么样的工具, 用什么样的代码规范.

不同的品味甚至还决定了你会选择什么样的职业发展方向, 什么样的平台, 开发什么东西.

对代码的品味决定了你看到一段不好的代码就能"闻到坏味道", 对解决方案的品味决定了你在 开源/闭源, 激进/保守, 简单/功能强大但复杂 等解决方案之间的选择.

对于代码的品味, 我觉得没有什么比The Zen of Python更有意思的了:

关于品味, 想顺面提及的是对设计的品味, 比如一个网站的设计, 一个博客的设计. 我最开始写博客是在CSDN(http://blog.csdn.net/vagrxie), 最大的好处就是免费, 并且不用我维护, 但是后来慢慢的就感觉模版风格没有符合我品味的, 而修改模版又麻烦, 弹出框也挺烦人的, 写文章的方法也尝试了很多, 总没有找到一个合适的. 建了独立博客后(http://www.jtianling.com), 刚开始就是照搬了酷壳的 模版, 然后在线写, 后来感觉模版看着不舒服, 自己从wordpress的默认模版上改了一套自己的, 主要的改进就是文章内容页面改为了合适宽度的单独一列, 代码段用pygments的default风格做高亮, 因为我觉得这样才适合阅读并且美观, 而写博客的方法在在尝试了很多方法后, 现在使用Vim + markdown来写, 用git管理, 感觉很顺手. 在最新的服务器中, 我甚至把apache改成了lighttpd, 一起下来花费的时间可真不少, 花了那么多功夫, 其实仅仅是对自己品味的追求而已.

这里顺面推荐两篇关于品味的文章, 虽然和本文没有太大关系:

  • 程序员的品味说: 如果你不在乎博客给人的第一印象如何,我不相信你对文章质量能有多在乎.
  • 创造者的品味认为品味不是主观的, 就是有客观的好坏.

了解正确的做事方法

这里提及的正确的做事方法不是指写代码这个层面上的, 而是指一个项目进行过程中碰到问题的解决方法, 比如在需求不明确的时候知道需要先明确需求, 知道自己需要先理解问题了然后再开始真正的进入代码层面的工作, 知道碰到什么问题能自己独立的解决, 知道碰到什么问题自己需要先和其他人沟通了再决定. 知道自己需要先测试才能保证自己代码的质量等.

这些问题说起来简单, 但是不这么做的话, 常常带来让人无语的后果. 一个好的程序员, 起码要先了解这些.

沟通的能力

知识的积累很大程度上决定了一个程序员解决问题的能力, 但那好歹是只要努力就能学到的东西, 而以下这些, 我甚至都不明白差异的形成是在我们很小的时候就定下来了, 还是在工作中还能继续学习.

在一个分工明确的项目中, 程序员需要和产品(策划)沟通以理解产品, 和上级沟通以理解自己的任务, 和同事们沟通以正确的理解要接入的模块. 无论哪一个方面沟通出了问题都不是小事情, 同时, 程序还需要正确的给产品(策划)传达设计的实现难度, 以及在自己完成模块时让别人正确的理解模块的接口. 在不写文档时, 正确的口头沟通非常重要, 需要写文档时, 文档的写作能力也算做是沟通能力的一部分.

如上所述, 沟通的能力非常重要, 但是好的程序员似乎天生就不太会沟通, 你会发现很多技术顶尖的人, 其实本身就是有社交障碍或者自闭症, 因为自闭, 才能心无旁骛的潜心钻研技术, 达到更高的技术水平, 很难想象一个"社会活动家", 他哪有那么多功夫去学习, 没有时间学习, 又怎么能成为一个技术顶尖的人. 这是一个两难的问题. 就理想的情况来看, 一个程序员最好是沟通能力足够好(能正确完成上述沟通工作), 但是又能足够的静下心来学习和钻研. 当然, 这是最理想的情况, 在实际中, 两者之间的较大波动范围都算是可以接受的好程序员标准.

 

对工作负责, 对代码有追求

对工作态度消极, 代码总等到别人来测试, 写代码以完成功能为唯一标准, 也不管bug是否成堆, 代码是否丑陋不堪, 这种程序员就算是工作一万年也成不了好程序员.

一个好程序员就该对自己的工作负责, 对自己的代码有追求, 不仅要完成功能, 还要代码优美, 不说要把代码写成艺术品, 起码也要当作自己的脸面来维护. 一个程序员不能容忍自己的脸上乱七八糟, 那么也同样不应该能容忍自己的代码乱七八糟.

事实上, 别的程序员在了解你之前, 先看到的是你的代码, 通过代码, 就能知道你是怎么样一个人. 项目紧, 随手写, 以后改都不能成为写烂代码的理由.

一个好程序员, 起码是想要把任务完成好的, 起码是想要把代码写好的, 不然如何能称其为"好".

怎么提高自己解决问题的能力?

其实转了这么大个弯, 怎么样做一个好的程序员的问题可以转为问怎么提高自己解决问题的能力.

沟通能力, 对工作负责任的态度, 对代码的追求, 很大程度上由性格决定, 我不知道实际中怎么简单的去提高, 这里只稍微的谈谈我对知识积累的一些看法吧.

  1. 培养兴趣(我也不知道兴趣究竟能不能培养), 技术工作总是辛苦的, 编程尤其如此, 假如你对此没有浓烈的兴趣, 不能从编程本身找到很多乐趣, 那最好就不要奢求能成为一个好的程序员了. 对编程的兴趣也是我一般招聘初级程序员时最大的要求.
  2. 什么样的环境决定你有什么样的知识积累过程, 决定了你的品味, 决定了你会以什么方式来做事. 这个除非有强大的意志力(极少见), 不然概莫能外. 所以, 慎选你的工作环境, 特别是刚毕业的时候.
  3. 不要停留在自己学习的舒适区, 假如你的工作仅仅是以前工作的简单重复, 你会工作的很轻松, 同时, 也很难有提高.

 

程序员应该扪心自问的10个问题

 

想成为一名web开发人员?那么,扔掉《24小时突击掌握xx语言》这类骗子书籍。你应该养成一个习惯,每天问问自己下面这10个问题。

1.此处有没有模式?

研究在哪些情况下行得通,哪些情况下行不通的设计模式,能够让我们发现潜在的规则,了解看似不相关的概念和行为。为了更深层次地了解工作,你需要时不时地问问自己,“此处有没有设计模式?”。

这句话适用的不只是你的代码。在根据业务要求而变的类型变化中有没有模式?技术发展有没有模式?你是否经常看到同样类型的bug连连弹出?

理解其实就是一种感知模式。——以赛亚·伯林

2.如何让它变得简单起来?

通常作为web开发人员,我们会想着拿出复杂又可扩展的解决方案。搞点复杂的会让你觉得自己非常的高大上。问题是,你永远无法预知你的产品和业务在未来将会发生怎样的改变。

架构和编码与其说像建造,还不如说更像园艺艺术。你必须得能够适应不断变化的环境。解决方案越复杂,它的适应力就越弱。

简单才是终极的复杂。——达芬奇

3.它为什么这么工作?

知道事物能工作,与知道它为什么这么工作是两个完全不同的事情。知道一些事物的行为原因,有助于你做出显然更好的决策。

伟大的程序员,和那些只是知道一门编程语言的人之间的区别是,两者处于的知识层深度不同,前者深刻地理解其工作原理。

这也适用于修复问题的时候。“只要重新启动服务即可。”“你重启了吗?”当弹出问题的时候,我们往往会说类似于这样的话。然而,如果你这样说了,那你就失去了一次学习的黄金机会。

知道为什么会出现问题,才能从根本上修复问题,才能避免再出现这样的问题。

4.之前有人做过吗?

当你自我感觉发明了一种复杂算法的时候,可能就意味着你正在错误的道路上了。最好的方法是搜索其他人是否已经解决了这个问题。
需要写算法,以便于添加标签到最接近用户鼠标的菜单项中?别急,已经有解救方法了。想为送货车找一条最短路径?也已经有解决方法了。想找类似于用户刚刚enter的标签,那么也不用自己绞尽脑汁写了。

上面这些只是几个例子,但是相信我,你碰到的问题,别人早就碰到过了。

我能看得更远,那是因为站在巨人的肩膀上。——牛顿

5.谁第一个提出来的?

你觉得自己知道REST

那么,你读过Roy Fielding说明REST的原始文件吗,你了解它的期望目的吗?暂且不说那个在IDE V7中使用REST API生成向导比你更有经验的博主了。

所以,告诉自己试着去阅读概念和理论的原始来源。然后通过各种方法去了解行业思想领袖给出的最新开发成果。如果你不知道是从哪里开始的,那么你怎么理解目前的发展进程呢?

6.我真的热爱我目前的工作吗?

首先让我们面对一个事实:编程很难。

即使很难,编程也在不断发展。如果用现在的标准来看,2年前的框架简直笨拙地就像一头恐龙。要想留在这一行,那么你需要终生致力于学习和研究。

如果你确实不喜欢编程,那么要想跟上那些热爱的人的步伐,希望并不大。找找你为什么对她没有兴致的原因。不要因为与市场存在差距或因为待遇还不错,就决定成为一名安全专家,不要只是因为最近的文章上面评论说,UX是高科技领域中最热门的职位,就立志成为一个UX专家。

重要的事情说三遍:做自己热爱的事情。做自己热爱的事情。做自己热爱的事情。

做自己热爱的事情,你所需要的资源也会随之而来。——彼得·麦克威廉斯

7.还可以用在哪里?

我发现web开发人员最大的局限之一就是失败的想象力。

我们在特定的情况下学习的东西,或看到某种用于解决特定问题的技术,我们往往会认为这就是它们的唯一用途。但是,这个想法基本上都是错的。每次你学到新的东西的时候,都应该问自己:“还可以用在哪里?”。

学到了一种超棒的新的定位方法来定位图形节点,那么它是不是也可以运用到在有2个维度的数据集中查找某一个数据点?发现一个越过WebSockets从客户端发送数据到服务器的很棒方法?那么它该如何应用于制定一个可扩展系列的后端服务?有时候此路不通,有时候却是可行的。

逻辑能力能让你从A到Z,但是想象力却能让你去往任何地方。—— 爱因斯坦

8.我败在哪里?

最简单的革新方法就是降低失败的成本。

游戏开发公司Valve和它的一些同行就将此当作金科玉律。这同样适用于web开发人员,如果你害怕失败,那么你将永远不会有大的突破。

勇敢地去尝试,从失败中学习,然后再试一次。

不要害怕犯错。认识失败。然后从头来过。——本杰明·富兰克林

9.如何实现这个目标?

我们生活的世界中只有很少一部分事情是真的完全不可能的。

要抱着自己想做的任何事情都是可能的这样一种想法去做事。可能你会发现你想做的事不符合当前实际,但随着世界的不断进步,它也许比你想象地更快成为了现实。

事情未成功之前,它永远是看似不可能的。——曼德拉(前南非总统)

10.我可以向谁学习?

不要在你是最聪明的地方工作。

选择那些拥有能够激励你,挑战你,让你做得更好的同事的工作和企业。不必与代码相关,在文本编辑器和命令行之外还有一个世界。学习其他领域的事情,然后应用于你的工作中。

不管如何,仅仅胜任工作是不够的。

 

译文链接:http://www.codeceo.com/article/10-problems-programmer-ask.html
英文原文:10 Questions Developers Should be Asking Themselves
翻译作者:码农网 – 小峰

 

 

  • 丰盛的早餐——身处高科技产业漩涡的我们常常会熬夜到凌晨两三点,然后又因为起得晚急匆匆赶去上班,因而没时间吃任何早餐。又或者,可能你只能在 路上一些脏兮兮的早餐店中买点小得可怜的熏肉三明治。我们都知道早餐是一天中最重要的一餐。而且不仅仅是要吃早饭,吃什么也很重要。要吃一些富含蛋白质的 健康食品,如豆类,鳄梨和全麦面包。不要吃白面包和早餐麦片,糖分太多,会让人血糖升高而瞌睡。
  • 准时上床睡觉——预备9个小时的睡眠时间,保证能睡到7或8个小时。有的人认为睡觉是在浪费时间——“身前何必久睡,死后自会长眠”——但是从长远来看,你会因为睡眠不足失去更多的工作时间:眼痛,盯着屏幕发呆等等。
  • 管住你的嘴——这一点可以和第一点结合起来作为关于吃的更全面的指导。如果你特别爱吃碳水化合物,含糖的零食,尤其是含糖饮料,那么短时间内你感 觉自己快速恢复了,但之后就会觉得更加疲倦。你可以试试从一些绿叶蔬菜、水果那儿获得能量。当然如果你确实迫切需要吃这些零食的话,那么请吃美式的(当然 也不能加糖)。
  • 喝水——当你脱水的时候,身体需要先保证供给更基本的生理活动,因此你的大脑会而变得缓慢而迟钝。你的身体在你缺水的时候产生的应激激素,如皮质醇,会侵蚀你的能量水平,让你的大脑一团浆糊。据说,缺水的工人生产力会降低高达12%。
  • 和你的老板交谈——如果你感觉生产力降低了,那么不妨干脆地和你的老板聊一聊,看看是否有什么明显可以做到的事情。如果你正在做的事情是你不喜欢 的,或者并非很擅长的,那么可能你需要换一个新鲜的项目。如果你是后端开发者,但你发现自己已经开始厌倦捣鼓像素的工作,那么换一个岗位了。这些都可以和 你的老板交流。
  • 更好地管理时间——如果你发现自己每隔一小时左右就要去适应不同的项目、代码库甚至是语言。又或者,你发现自己总是熬夜到很晚以追赶进度。那么我 建议你先花10分钟时间提前把一天的待办事项写下来。从“速效方案”开始吧。碰到一些琐碎的bug,我们常常会选择拖延解决,于是一直耿耿于怀。从现在开 始,每天早上一点一点地搬走这些石头吧——这不但能让你觉得自己是锐不可当的,还能减少一整天你背负的压力。
  • 定时休息——这一点似乎是显而易见的,但这个行业中的程序员,总是自认为自己是超人,午餐时间工作,从开始到结束,一直都没有休息,甚至连上厕所 都好像火烧屁股一样。然而,这从长期来看,反而会降低你的生产力。玩一盘游戏,喝一杯咖啡,蹲上一个小时的厕所。不管是什么方式,只要能让你的大脑休息会 就行。编程是一种耗费精神的脑力劳动。你可能做不到持续地去健身房或锻炼,但是你可以中场休息。这或许就是让你的大脑与众不同的秘诀哦。
  • 运动——这一点也非常显然。尽量养成定期锻炼,哪怕是快步走的习惯,时间最好是在早晨,一日之计在于晨。运动释放的内啡肽可以减轻压力,让你得到更多的氧气循环,让你的注意力高度集中。
  • 暂停编程——如果你和我一样,将软件和技术当作了存活的理由,那么可能你在阅读这篇文章的同时还打开着Vim。那很好,因为就是这种疯狂造就了普 通程序员和伟大工程师之间的鸿沟。但有时你也需要暂时停顿一会,去做点其他的事情。常言道,小别胜新婚。有时候,我整个周末都不会去碰我的笔记本电脑。我 把代码暂停在了我的脑海里,我将时间花在了朋友和家人身上,出去吃饭,看电视,甚至小酌一杯。然而,当我周一上午回到办公室,我已经迫不及待地想要开工 了。上周五沉闷又恼人的bug,摇身一变,成为了一个有趣的挑战。
  • 正念——这个流行词已经在高科技产业风靡了一段时间。一天初始,即使只用10分钟去冥想,也能让你感觉更冷静,注意力更集中。
  • 不要加班——除非你厌恶生活,否则,就不要为了打动上司或超过同事而做一些非特定任务,以致于每天熬夜到晚上11点。这并不明智,因为会消耗你的 精力。如果是你的上司期望你每天加班,折中工作质量,那么他们是在打造一个不健康的工作环境。如果这是你自己的主动行为,那么要小心长期以往的后果。

治疗职业倦怠,并没有什么灵丹妙药,要养成我上面提到的这些习惯也不是一朝一夕就可以的。因此,从小事做起,一步一步来,如果需要的话还可以记录下来。要想得长远。最后,如果你的职业倦怠仍然存在的话,那么也考虑寻求一些专业的帮助。这没什么好丢人的!

 

10倍效率的开发者

 

Brad Feld的一篇文章The Rise of Developeronomics中提到了“10倍效率的开发者(10x developer)”的概念(伟大的开发者的效率往往比一般的开发者高很多,而不只是一点点),Adam Loving在读了之后受到启发,并向多位大牛(Ben Sharpe、Collin Watson和Jonathan Locke)询问如何成为“10倍效率的开发者”,最后得到了以下的答案。

1. 只做需要做的工作

  • 使用敏捷方法;
  • 全心全意做UX设计;
  • 沟通第一;
  • 编码也许不是解决问题的办法;
  • 过早的优化是一切罪恶的根源;
  • 选择最简单的解决方案。

2. 站在巨人的肩膀上

  • 使用开源框架;
  • 使用简洁语言(如HAML、Jade、Coffeescript);
  • 不要做重复的事情(不要重新发明轮子);
  • 利用包管理器来进行公共和私有代码分配;
  • 不要任凭巨头(如微软)的摆布而修复库中的一个Bug;
  • 不要让你的雇主逼你学习;
  • 自主学习并为自己设定新的目标。

3. 了解数据结构和算法

如果你不知道什么时候应该使用快速排序、不懂辨认O(n2)程序、不会写递归函数,你将无法成为10倍效率的开发者。使用多种语言你才能清楚不同的框架是如何解决相同问题的。尽可能去了解底层命令(plumbing),以便能够作出明智的决定(Web框架是怎么存储session状态的?Cookie到底是什么?)。

4. 不要怕买工具,它可以节省你的时间

Ben说:“昨天我花50美元买了一个位图字体工具,它帮我节省的时间成本绝对超过200元。”

5. 集中注意力

不要整天开着你的电子邮件、Twitter、Facebook等,在工作时将它们最小化或关掉它们,戴上耳机。Tiny hack说:“即使不听音乐我也戴着耳机工作,这样便不会有人打扰到我。”

6. 尽早并且经常性地进行代码重构

有时,你不得不放弃漂亮的代码转而去寻找真正对项目有用的代码,但没关系,如果你的现有项目中有这样的代码,最好的方式便是不要看它,并重构。

7. 只管去做

将你的业余项目分享到Startup Weekend中。在我开始转到Unix和Ruby on Rails上之前,我买了一台Mac,使用Windows虚拟机花了一年时间做.NET项目。

8. 挑选一个编辑器,并掌握它

高效开发者喜欢用文本编辑器胜过IDE编辑器,因为这样可以学到更多东西。无论什么情况,尽量使用键盘快捷键,因为熟练使用一件工具的前提是熟悉它。

在选择编辑器时,认真考虑并挑选最好的(Emacs或Vim),因为它们是通用的。其次,挑选你的首选平台最支持的。使用宏,不断地写代码;使用Mac上的TextExpander为整个段落创建快捷方式;使用Visual Studio或SublimeText的自动补齐功能;使用支持按行/列分割窗口的编辑器,这样你便能同时看到单元测试和代码(或模型、视图)。

一定要想清楚后再写代码。Adam说,“我有朋友在一个大项目组里工作,他们组里最高效的程序员是一个高位截瘫用嘴叼着棍子敲代码的人,他总是在写代码之前想得很仔细且很少出错。”

9. 整洁的代码胜过巧妙的代码

要想让其他人能够读懂你的代码,尽量使用最少的代码来完成任务。遵循DRY(Don't repeat yourself)的原则,使用明确定义的对象和库,将任务分解成小而简单的代码段。

10. 潜意识是强大的工具

离开10分钟往往就可以解决一个问题。控制编程时间,给自己一个多姿多彩的生活,劳逸结合能让你在工作时更高效、更愉悦。当然,即便是上了年纪的程序员也知道,以最少的时间完成最高效的工作是成为10倍效率开发者的必要条件。

作为一个程序员,我觉得在职业生涯中最好的一件事儿就是从电脑前站起来,去拜访那些在某一领域有所建树的人们。

11. 推动自身和团队进步

重视批评,以包容的态度接受批评并提升自己是非常重要的事情。没有这个基础,你不可能成为一个高效的开发者。一位智者曾经说过:“聪明的人善于从自己的错误中学习,而智慧的人善于从别人的错误中学习。”