编程的四个步骤






3.76/5 (15投票s)
如何像程序员一样思考
引言
本文不会告诉你如何使用什么功能来解决什么问题,而是会回顾一个人在编写简洁而优雅的代码时应该经历的过程。在一个充斥着各种反面教材的世界里,那些真正懂得如何在做的人的需求是巨大的。
你可以这样想。随着廉价而强大的计算机的出现,每个三流的“想当导演的人”都在制作有着惊人特效、却演员糟糕、台词糟糕的电影。电影永远不是关于特效,而是关于它们讲述的故事。视频游戏也是如此:那些住在父母地下室里的人们正在制作拥有惊人画面、声音和其他特效的游戏,但玩这些游戏就像把头撞到墙上一样不愉快。优秀的游戏不是由画面有多惊人来决定的,而是由玩家在游戏中能够沉浸的深度来决定的。所有的特效只是在已有的东西上锦上添花。但如果没有扎实的游戏玩法,没有基础,那么它们最终只会损害体验。
同样,使用任何软件都不是关于它看起来有多悦目或花哨,而是关于它有多么容易使用,以及它能多高效地完成工作。程序是完成工作的工具,无论是让你沉浸在游戏的故事中,还是帮助你报税。就像任何工具一样,它只是用户的一种延伸。问题是,今天的工具用起来真让人头疼。
我们需要更好的工具制造者。
背景
在我学习计算机科学课程和编程经验的过程中,没有什么比学会像程序员一样思考更有用了。这是一种思维方式,能让我以务实而高效的方式解决问题。
下面是我在编写程序时所遵循的过程的总结。我希望它对他人能和我一样有用。
流程
0) 你有什么,你又有什么没有。
当你开始编写程序时,你会有一个所需功能的列表。这些功能可能来自你的老板、老师,或者你自己,也就是说,你希望程序能够做什么。如果你是为自己编写程序,那么你需要花时间来决定你的程序要做的所有事情。这对于避免日后的不必要麻烦至关重要。
暂时忽略所有美学方面或任何关于程序应该看起来有多漂亮、闪亮或色彩丰富的内容。我们稍后会处理。第一步是研究你有什么,你又有什么没有;你可以使用哪些代码,以及你不得不编写哪些代码。后一点对于任何公司员工来说尤其重要。很多时候,你会发现一个完美的代码片段可以为你做你需要的任何事情,但它可能属于别人,而你不能使用它。取而代之的是,你必须找到自己的方法来绕过这个障碍,而不会陷入法律诉讼。
通常情况下,作为一名学生,你可以逃避这个问题。只要你只将其用于你的学习,并且不从中获利,就没有人会生气。当然,这前提是你的老师没有告诉你一切都要自己完成,不要使用任何人的代码。
所以,一旦你找到了所有你需要并且确保你有权使用的代码,你就需要开始规划你将需要编写的所有代码。编写这些函数最重要的部分是,你绝不能凭感觉行事;你总是要花时间坐下来思考。
- 你要做的第一件事就是规划函数;它需要做什么,以及,如果你觉得需要的话,它不做什么或不需要做什么。我们经常会混淆,认为在这里我们需要做某事,而实际上我们已经在别的地方做过了,或者这样做只会让事情变得复杂。我的朋友,奥卡姆剃刀:最简单的解决方案通常是最好的。
我经常发现人们低估了仅仅写下代码的目的有多么有用。目的就是我们在编程时需要关注的,因为如果我们不注意它,我们怎么能实现它呢? - 用你日常的语言写下代码需要采取的步骤。除非你真的担心会忘记,否则不要费心包含代码示例。但如果你确实包含示例,它们应该仅仅是示例。它们不能取代你花时间写出完整的步骤。
- 现在我们进入了有趣的部分。回顾这些步骤,找出任何看起来非常复杂,或者你很难想象的部分,并画一个图表、图片,或者做一些可以让你可视化这个步骤中发生的事情的事情。
- 人们还低估了另一件事:保存你所有的笔记。你不得不写下的所有信息,你的研究,以及你所有的图片和图表,把它们收集起来放进文件夹或活页夹。把它们整理好:附上一个笔记,注明日期和你正在处理的项目。诸如此类的细节很重要,尤其是对于你不得不自己编写的代码。如果你是你自己想出来的,那么你或你的公司就拥有它的版权,这意味着你可以授权使用这段代码并从中获利。
另一方面,也许有人指控你侵犯版权。你的笔记将是你的辩护,表明你确实是自己想出来的。或者你认识的人遇到了类似的问题。你不仅可以给他们答案,而且还可以向他们展示你为了弄清楚这个问题而学到的所有信息。万一那个人是你的老板呢?
请保存好你的笔记。
1) 基本要素
现在是时候真正开始编程了。正如我之前所说,不要担心程序的外观。那是我们最后要做的事情。在这里,我们将一个接一个地让所有的函数工作起来。我建议在这个阶段只使用控制台应用程序。你所要做的就是编写代码,确保它能工作,确保它能处理错误,然后继续前进。在这个阶段,你不需要任何花哨的东西。
- 你要做的第一件事就是让所有已经写好的代码都能工作:所有在第一步中属于“你已经拥有的”类别的内容。这有几个原因:
- 很有可能你会在为你需要自己编写的某个函数或代码片段时用到它,所以最好已经写好了,这样你就不必担心另一个代码片段,而你已经有了它。
- 它允许你开始组织你的代码。保持代码的组织是专业程序员的标志。它让你更容易找到东西,让别人更容易找到东西,并给你一个比懒惰和粗心的程序员(他们有很多)的优势。
- 编写自己的代码可能是一次充满挑战的经历。在编写程序的过程中,你可能会经历人类几乎所有的情绪;愤怒、失望、悲伤、喜悦,仅举几例。如果你注意到,这四种情绪中有三种不是大多数人通常喜欢感受的。在花费数小时忍受那些看似毫无意义的废话之后,你还得完成编写更多程序。虽然更容易,但此时你可能不在乎了。所以,首先,先把所有简单的事情做好,然后再处理困难的事情。
- 现在该处理棘手的事情了。好代码的关键在于简洁:不要不必要地使它复杂化。这会拖慢程序的速度,占用比你需要的更多的内存,并让你看起来像个白痴。以下是编程时需要记住的几点:
- 与加法、减法和乘法不同,除法是一个复杂的过程。所以,与其将一个数除以2,不如乘以0.5。或者说,你有一个算法是通过一个常数来除。与其每次都用那个常数来除,不如用1来除一次来找到它的倒数,然后用倒数乘以而不是除。
- 平方根很有趣,在游戏、军事应用和其他各种程序中经常用到。但与除法一样,与乘法、加法相比,平方根算法需要很长时间……但人们很少注意到的一点是,当你在操作平方和平方根时,它们 tend to keep their relationship。例如,假设你需要找到A的平方根和B的平方根的乘积。与其分别取这两个数的平方根然后相乘,你只需要将A乘以B,然后取平方根,这样你就可以在节省时间的同时找到答案,而无需进行不必要的操作。
- 对象和类是组织信息和利用代码的绝佳方式。话虽如此,但它们被过度使用了。我见过人们在程序中使用对象,而他们可以用结构体或其他东西来代替,结果浪费了二三十兆字节的内存。在我们这个时代,这是懒惰的不可原谅的标志。即使有大量的内存和强大的处理器可供我们使用,我们也不能让自己变得粗心。
- 当你编写一段新代码时,你应该做的第一件事就是编写那段唯一能做你需要它做的事情的部分。我的意思是,不要担心错误处理,或者如果用户输入了这个而不是那个会发生什么。这会让你焦虑,因此更容易搞砸。目前假设你总是会收到完美的输入。创建一个常量作为示例可能会有帮助,并以此来工作。如果它看起来有效,那么你可以改变常量来确保它真的有效。请记住,你知道幕后发生的事情;你知道什么有效,什么无效。利用这一点,让它做你真正需要它做的事情。如果你的程序不能做到这一点,那它就是无用的。“做,或者不做。没有试试看。”
现在你已经让基本组件工作正常了,回去添加错误处理。通常最好在单独的函数中处理它,但根据你的程序有多复杂或多简单,你可能可以把它放在原始函数中。然而,当你第一次编写它时,你应该把它放在一个单独的函数中。在已有的代码中添加内容很容易迷失和混淆,所以一开始将它们分开,然后看看它们是否能很好地契合在一起。
- 可能是编写程序时最重要的一步:注释。永远,永远,永远为你代码添加注释。你的之前的笔记很可能可以直接使用,但你一定要确保你的注释描述的是你实际拥有的,而不是你计划拥有的。所以,当你继续进行时,为每个函数添加注释。如果你以某种特定方式组织了你的代码,留下一个注释来说明原因。如果你遇到了一个花了你很长时间才解决的特定问题,将解决方案的解释写在注释中。
注释让我们更容易在代码中找到方向,并记住我们当时在做什么以及为什么这样做。有没有发生过这种情况:你正全神贯注于你正在做的事情,然后到了该停下来的时间了。也许是时候下班、放学了,或者你有会议等等。第二天,或者任何时候你回来坐下,都记不起你当时在做什么。这会发生在每个人身上,而注释就是让我们能够回到那个状态,并在不花时间去回忆正在做什么,以及可能搞砸我们已经完成的事情的情况下完成程序。
2) 有组织且易于使用
到目前为止,你的程序应该已经具备了所有必需的函数。你应该能够运行一个控制台应用程序,演示你的程序将使用的所有函数。它看起来不会有多少,但你所拥有的就是你的最终产品的基础。没有这个基础,你的软件就会崩溃。
所以,现在是时候让你的程序易于使用了。这包括为你的程序创建一个GUI,这将使你能够组织你的代码需要执行的各种函数。这应该通过绘制图表和构建示例应用程序来完成。
与之前的步骤一样,你不应该关心程序有多花哨或多鲜艳。你在这里所做的就是将所有的菜单、文本框、按钮、滚动条等都就位。完成后,你的软件应该能正常工作,但看起来像一个Windows 2000应用程序。
这里要记住的重要一点是,以一种有组织但简洁的方式排列一切。使用菜单、下拉框、标签等来保持一切的组织性,使其易于利用你程序的所有功能,而又不难以导航和找到每个功能。
3) 漂亮,非常漂亮
现在我们到达了最后阶段;让你的软件看起来应该有的样子。我们之所以将这个阶段留到最后,是因为颜色并不能成就一个程序。不管它看起来有多漂亮或多花哨;如果它不能完成它需要做的事情,那就是无用的。
在美化你的软件时,你应该注意几点。
- 通过为你的程序添加所有的图形、颜色和特效,它自然会被运行如此多的额外功能所拖慢。然而,图形永远不应该牺牲软件的速度或大小,这意味着它们不占用比绝对需要更多的空间,并且你的程序不必持续加载、处理和显示你的图形,以至于你的程序无法使用。
- 关于人们的第一印象,无论是对彼此还是在使用物品时,已经做了大量的研究。所有这些研究的结果基本都说了同样的话。在最初的5秒内,人们会根据他们的感知形成判断,然后决定是继续呆在那里,还是离开。
这对程序员来说意味着,当一个人使用你的软件或登录你的网站的最初5秒内,他们看到和听到的将决定他们是否会留在你的网站,还是去另一个网站。
所以,当你在设计程序的界面时,确保你添加的所有图形、颜色和其他功能都能衬托你的程序。但最重要的是,要确保它们永远不会让你的程序看起来比实际更复杂;它们当然永远不应该让你的程序变得更复杂或更难使用。没有什么比要在一堆令人讨厌的闪烁程序中找出你需要的东西更能让人望而却步了。
需要记住的事情
- 过犹不及。
仅仅因为现代计算机拥有几千兆字节的内存和2吉赫的处理器,并不意味着程序员不必对客户负责提供一个好产品。始终尽量减少所需的内存量和程序需要运行的周期数。简化,简化,再简化。使用奥卡姆剃刀来剔除程序中的所有冗余。
- 漂亮不等于完美。
仅仅因为一个程序很漂亮,并不意味着它就能像应该的那样工作,或者能轻易地做到。事实上,在当今市场中,软件越漂亮,通常越是在试图弥补什么。程序的“漂亮”程度永远不应该超过它使用的简单性。或者,如果你想保持事情非常简单,就将程序保持为精简的GUI,而不要试图打磨它的外观。一些最广泛使用的程序不过是一个经典的Windows窗体应用程序。然而,在那种情况下,规则应该保持不变,保持简单,保持有条理。
历史
- 2010年10月18日:首次发布