How to be a Programmer

Table of Contents

https://braydie.gitbooks.io/how-to-be-a-programmer/content/zh

1. 如何保持活力

创建美丽,有用,聪明的东西的欲望能高度调动程序员的积极性。这是奇妙而令人惊奇的。这种欲望对程序员既不特殊也不普遍,但在程序员中,它是如此强烈而普遍以至于它把程序员与其他角色的人们分割开来。

这有一个现实而重要的推论。如果当程序员被要求做一些既不美丽,也没有用,也不漂亮的事情,他们会斗志低落。虽然可以通过做丑陋的,愚蠢的,无聊的东西赚很多的钱,但最后,乐趣才会为公司赚最多的钱。

很明显,有一些完全由动机技术组织起来的工业适用这里的情况。这些我可以识别的特定的编程中的事情有:(如果当自己burnout的时候,让自己接触一些新的东西,可以refresh up)

  1. 为工作使用最好的语言
  2. 寻找机会去使用新技术,新语言,新科技
  3. 尝试在每个工程里学习或教授一些东西,即使很小

最后,可能的话,估量个人激励的东西对你工作的影响。例如,修复 bug 时,数一数我完全不感兴趣的 bug 的数目,因为这和仍然存在的 bug 数目是独立的,并且这也是影响我对公司的顾客的增值的最小的可能方式。把每个 bug 和一个高兴的顾客关联起来,是对我个人的激励。

2. 如何学习新技能

学习新技能,尤其是非技术类,是最大的一种乐趣。大多数公司会更加有斗志如果它们明白这对程序员来说是多大的激励。

人类通过做来学。读书和上课是有用的。但你对一个从不写程序的程序员会有任何敬意吗?学习任何技能,你应该把自己放在一个可以练习技能的宽容的位置。学习一个新的编程语言时,在你必须做一个大工程前,试着用它做一个小的工程。学习管理软件项目时,先试着管理一个小的工程。

一个好的导师不是你做事情的替代品,而是比一本书更好的存在。你可以提供什么给一个潜在的导师,作为他的知识的交换?至少,你应该努力学习这样他们的时间才不会被浪费。

试着让你的 boss 给你正规的训练,但必须知道,这通常并不会比把相同量的时间花在用你想学的技能来简单玩耍要好上多少。然而,要求训练比在我们不完美世界里的玩耍时间要容易得多,尽管大量正规训练只是在课程上睡觉,等着晚餐聚会。(试着给自己一些训练任务可以让学习更加迅速,观察平时遇到过一些什么问题,拿出来看看是否可以和当前学习的东西结合)

如果你领导团队,需要知道他们是怎么学习的,并且通过给他们安排适量的和他们感兴趣的技能的工程来锻炼他们。不要忘记程序员最重要的技能不是技术。让你的团队成员有一个机会去玩,锻炼勇气,诚实,以及交流。

3. 如何直言异议以及如何避免

异议是一个做出好决定的绝佳机会,但这需要被谨慎处理。你可能会觉得你充分的表达了你的想法,并且在决定做出前,你的意见已经被听取。这种情况下,没有什么可以再说的,你应该决定你是否要支持这个决定,即使你不同意它。如果你可以在自己不同意的情况下,支持这个决定,就这样说实话。这展示了你是多么有价值,因为你是独立的,不是一个唯唯诺诺之人,同时是一个尊重决定的团队成员。

有时候一个你不同意的决定,会在决策者没有充分听取你的观点前做出。你应该在公司和集体的基础上评估是否应该提出这个话题。如果在你看来这只是一个小错误,这可能不值得重新考虑。如果在你看来这是一个大错,你当然必须提出异议。

通常,这不是一个问题。在一些充满压力的环境下,在一些个人因素下,这会导致事情个人化。例如,一些非常牛逼的程序员缺乏在有好的理由认为一件东西是错的情况下去挑战决议的信心。在最糟的情况下,决策者是不可靠的,并会把这变成一个对权威的挑战。最好记住,这种情况下,人们会用他们大脑中爬虫动物的部分来做出反应。你应该私下提出你的争议,然后尝试展示新的知识是如何改变决议做出的基础的。

不管决议是否被推翻,你必须记住你永远不能说出“我的话撂这了,我早就这样告诉你了”这样的话,因为这个决定已经得到了充分探讨。

4. 如何专业地成长

承担超过你的权力的责任。扮演你想要扮演的角色。对那些对更大组织的成功做出过贡献以及对你个人提供过帮助的人表示感谢与欣赏。

如果你想成为团队的领导,去激励与团结。如果你想成为一个经理,担起规划的责任。你通常可以在和领导或经理在一起时,舒服地完成这些事情,因为这使得他们可以抽空去承担更大的责任。如果这太多了以至于你不能尝试,一次只做一点点。

评估你自己。如果你想要变成一个好的程序员,询问一些你欣赏的人你怎样才能变成他们那样。你也可以问你的 boss,他可以告诉你的东西会少一些,但对你的事业会有更大的影响。

计划学习新技能的方式,包括琐碎的技术类型,比如学习一个新的软件系统,和困难的社交类型,像漂亮的写作,把它们集成到你的工作中。

5. 如何与非工程师交谈

与你的团队交谈时,你会不假思索地使用某种程度上的简略表达方式,一种简单的语言更有效率,因为你通常对技术或者特别是你的产品会有许多的共享经验。对于那些没有这些共享经验的人不使用简略表达方式是需要作出一些努力的,特别是你团队内部的人员也在场的时候。这些简略的词汇会让你与那些没有分享到相关经验的人之间构建出一道墙,甚至更糟的是,浪费着他们的时间。

与你的团队一起,基本的假设和目标不需要经常重申,大多数谈话集中于细节。与外人一起,就是另一回事了。他们可能不理解你认为理所当然的东西。由于你把这当做理所当然,并且没有重申它们,使得你们的谈话陷入这样一种情况:你可能认为你们相互理解,但事实上有一个巨大的误解。你应当假设你会有错误的交流,并且仔细观察去找出这样的误解。试着总结或将你说的东西分点,来确保他们能够理解。如果你有机会经常与他们见面,花一点时间询问你是否在有效地交流,以及你可以怎样把它做得更好。如果交流有问题,在对他们失望前,寻找方法去提高你自己的实践。

6. 如何获得晋升

想要被提升为某种角色,先做那个角色该做的事情。

为了提升到某个位置,找到那个位置期望做的事情,然后去做。

想要得到薪酬的提升,带着信息去协商。

如果你觉得你值得得到提升,与你的 boss 聊一聊。清楚地问他们你需要做什么才能获得提升,然后努力去做。这听起来很老套,但大多数时候你对你需要做的事情的追求与你 boss 的想法是不同的。这可能会让你的 boss 在某些程度上有些失落。

大多数程序员可能在某些形式上对他们的相对能力有夸张的感觉 — 毕竟,我们不可能都在前10%里!然而,我也见过一些非常不得志的人。人不能期望每个人的评价在什么时候都完美与现实相同,但我认为人们通常在一定程度上是公平的,有这样一个警告:如果别人看不到你的工作,你就得不到欣赏。有时候,因为偶然或个人习惯,有些人可能得不到太多关注。在家努力工作或者与你的团队和 boss 地理隔离的话,这会变得特别困难。

7. 如何处理无聊任务

有时候避免对公司或工程的成功至关重要却很无聊的任务是不可能的。这些任务可能真的会降低那些必须执行它们的人的斗志。最好的处理方法是使用或者发扬 Larry Wall 的程序员懒惰美德。试着找一些方法让计算机去做这个任务,或者帮助你的队友去做这个。用一个程序花一个星期去完成要手动去用一个星期完成的任务能让你懂得更多,并且有时候这是可重用的。

如果所有其他的途径都不能工作,为那些必须做这个无聊任务的人道歉,但无论什么情况,不要让他们去单独完成它。至少安排一个两人团队去做这个事情,并增强健康的团队协作来完成这个任务。

8. 如何处理管理神话

神话这个词有时候意味着虚构。但这有着更深层的内涵。它也意味着一些解释宇宙以及和人类和宇宙之间的关系的宗教故事。管理者倾向于忘记他们作为一个程序员时学到的东西,并且相信某种传说。试着让他们相信这种传说是错的,正如让一个虔诚的宗教信徒从他们的信仰中醒悟过来一样粗鲁而失败。因此,你应该认可这些信仰:

  1. 文档越多越好。(他们需要文档,但他们不会想要你在这些东西上花时间。)
  2. 程序员是平等的。(程序员可以按重要程度分类。)
  3. 分配更多资源给迟来的项目可以让它加速。(与新人的交流的代价大多数时候很繁重并且无用。)
  4. 程序员的效率可以用一些简单的标准尺度来度量,比如代码行数(如果简洁才是力量,那么代码行数是坏的,而非好的。)

如果有机会,你可以试着解释这些东西,但如果你没有成功,不要觉得悲伤,不要好斗地反对这些神话以致损害了你的声望。每个这样的神话增强了管理者关于他们有一些对正在进行的事情的实际控制的想法。真相是,如果管理者是好的,他们会帮助你,如果他们是坏的,他们会妨碍你。