练习 1:流程

原文:Exercise 1: On Process

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

软件开发世界中有两种类型的流程。首先是团队流程,这是 Scrum,敏捷或者极限编程。这些流程旨在帮助一群人合作开发大型代码库,而不会相互干扰。团队流程指的是,每个人如何协调,代码行为标准,报告和管理监督。通常这些团队流程归结为:

  • 制作待办事项的列表
  • 执行列表上的事情
  • 确认正确完成了它们

许多团队流程的错误就是,他们试图控制对个人更好的个人流程。极限编程(XP)流程在这方面可能是最糟糕的,甚至指出,每个程序员都有另一个程序员观察他们的工作,并在文本编辑器显示一些错误的时候向他们喊叫。我强烈反对不在某些教育背景下,将个人流程元素强加于人的流程。它侮辱了我们的专业精神,创造一个独断专行的环境,不会促进创造力或质量。在教育环境中,规定学生使用特定的个人流程方法是必要的,但在工作环境中不是。例如,只有他们是一个初级或新手程序员,需要学习,我才强制某些人结对编程。团队流程应该是这样,每个人都能够工作,但他们需要在所需的质量水平完成工作。

另一种类型的流程是个人流程,我从画家,作家和音乐家那里得到这个想法。作为一个专注质量的创意人士,我正在开发一个流程,帮助你以一致的方式进行工作。事实上,一个业余画家,音乐家或作家的标志,代表了这些人不解它们的流程。通常声称没有创意的这些人实际上相反;他们只是不知道这件事,因此不断把它弄错。大多数其他创意学科都制定策略,帮助他们从概念中创造完成的作品,而不会半途而废。对于画家来说,这是一种方法,将绘画的问题分解为逻辑步骤,来确保更有可能成功。对音乐家来说,这是一个类似的流程,结合了平衡做法,保持他们所选的音乐风格的结构。对于作家,他们的流程是构建自己的作品的一种方式,使其自然流动并且没有漏洞和逻辑不一致性(大多数电视编剧似乎完全没有做到)。

对于软件,你的个人流程需要是某种东西,能够完成以下任务:

  • 确定可行的想法。
  • 让你开始了解这些想法,看看他们是否会工作,并迅速改变它们。
  • 在许多工作会话上逐渐优化你的想法,来避免问题或使你能够轻易恢复。
  • 确保你的想法的实现的质量,以便你以后不会被 bug 阻碍。
  • 确保你可以与他人合作(如果你愿意)。

请注意,我如何说,你不必与他人合作。自从开源以来,创建软件的概念就包括了对社区的过高要求。如果你不想与别人分享或合作,那么你侮辱了它们的存在,并且被认为是一个反社会的家伙。问题是很少有创意活动是在小组中开始的,通常在小组中开始的创意活动最终都没有创意。这种创意火花通常是,一个或两个人有了一个想法,然后从无到有实现了它。制造一个最终产品,如书籍,电影和专辑,可能需要一个庞大的团队。许多其他的创作活动可以独立完成,如绘画或大多数视觉艺术。

你永远不会找到一个艺术学校,它要求画家只能在团队中创作一幅画。软件不像绘画和写作一样,不是独立的创作流程,没有任何理由是这样。软件是一个模块化的学科,这意味着你可以自己创造一切,而其他人仍然可以使用它,即使他们永远不会和你谈话,永远不会写程序。你可以是一个十足的混蛋,人们仍然可以使用你的软件。写作和绘画都是一样的。有很多品行不端的作家,画家和音乐家,他们仍然受到数以百万计的人的崇拜。

如果你按照个人流程开始工作,有人试图告诉你需要分享,或者你是一个反社会的混蛋,那么他们就是在骂你。人们有权保持隐私,独自一人做自己的事情。要求你为较大项目做出贡献的人,似乎只有那些启动这些较大项目的人,似乎都在赚钱。在这一点上相信我,我已经为软件世界贡献了巨额资金,我还去参加会议,但人们说我不是一个贡献者,因为我没有为他们的项目编写代码(尽管他们从来没有帮我做过一件事情)。

在这本书中,当我说“流程”的时候,我的意思是个人流程。我很少涵盖直接关于与他人合作的任何事情,因为有一堆书已经涵盖了你应该如何与他人合作。有很少的书籍可以帮助你按照自己的个人流程工作,并为你定义处理什么,以及为什么。对于你想要专注的事情,自我为中心、贪婪、反社会或者暴虐都没有任何错误,所以你可以在你所爱的东西上做得更好。

挑战练习

练习实际上是写下你的想法,以及你似乎有什么问题。在这个阶段你可能不知道你的工作方式,因为你不是很有经验。为了帮助你,我编写了一个问题列表:

  • 长时间处理项目时有问题吗?
  • 你是否倾向于编写有缺陷的代码,而不知道为什么?
  • 你热衷于编程语言,但从来没有实现过任何东西?
  • 你不记得 API 吗?我也是啊
  • 你是否感到自卑或像会被抓住的骗子?
  • 你担心自己是否是一个“真正的程序员”?
  • 你不知道如何选取一个想法,将其从零开始变成代码?
  • 你有入门的问题吗?
  • 你在混乱的环境中工作吗?
  • 你是否完成了你的项目的第一个实现,不知道如何更进一步呢?
  • 你是否在代码的顶部继续插入代码,直到产生了巨大的混乱呢?

想想这些问题,然后尝试写下你在处理项目中所做的事情。如果你没有工作经验,请写下你认为应该在项目中做什么。

研究性学习

  • 再写一些这样的问题,然后回答他们。
  • 问其他你可能知道的程序员,他们的流程是什么。你会发现他们可能不知道。

深入学习

要记住的是,人们说他们的流程是什么,和他们实际做什么,可能是截然不同的。我们人类倾向于使用一种比现实更积极,更合乎逻辑的方式记住事情。在这本书中,你将打破这种习惯,并使用外部记录的指标(可能是屏幕录像)来确定你做什么。这不是你应该永远做的事情,但是当你提高编码技能时,这是一个很大的帮助。但是,当你询问一些其他更成功的程序员,它们的流程是什么,要记住,他们没有这样做,很可能他们告诉你的不是他们做的事情。如果你能找到一个更有经验的程序员,愿意在工作时记录他们的屏幕,那么比起询问他们做什么,这可能更有启发意义。我建议去观看其他程序员的屏幕录像,只是看看他们如何处理问题并记录笔记。