我从作家那里学到的五个编程技巧
作家是一群有趣的人。他们把所有时间都倾注在文字上。他们沉迷于每一个细节,不断润色修改。EB·怀特曾写道:“英语写作……是一种消磨时光的方式。” 海明威确实如此。他只写一个句子,直到满意为止,这通常意味着他每天只写一个句子。
程序员也花了很多时间在文字上,令人惊讶的是,他们与写作的重叠部分比大多数人想象的要多。Donald Knuth 曾经说过:
“理想情况下,程序员应该是一位散文家,他运用传统的美学和文学形式以及数学概念,来传达算法的工作方式,并让读者相信结果是正确的。”——Donald Knuth
我拥有写作和计算机科学学位。我还与专业作家进行过研习,并出版过小说和非小说类作品。下面我将分享我从作家(和写作)那里学到的五件事,它们也帮助我写出了优秀的代码。
1. 编写代码可以帮助您更好地理解问题。
作家经常鼓励写作作为理解和发现的一种方式。
“写作就像在雾中夜间驾驶。你只能看到车灯照射到的地方,但你却可以完成整个旅程。”——EL 多克托罗
我从中得到的一个重要启示是,编写代码通常不是结果,而仅仅是过程。编写一些代码。然后将其丢弃,再用不同的方式重新编写。你的解决方案将会变得更加优雅。
我在写这篇文章的时候偶然发现了Mario Fusco的一条很棒的推文,它总结了这个想法:
2.省略不必要的代码。
如果我有更多时间,我会写一封更短的信。——马克·吐温
吐温这么说,其实是想说,写得少其实更难。如果你和编辑们相处过一段时间,你就会发现你的文章里有很多不必要的文字。斯蒂芬·金在《写作论》中提到,他提交给报纸编辑的第一批故事通常会被编辑的刀砍成两半。
作家们尊崇一本名为《风格的要素》的书,其中“省略不必要的词语”这句话其实就是其中的一条“规则”。它也是如何做到这一点的一个例子。
同样,较短的代码通常更清晰。如果你有一个 Car 类,其中包含一个用于驱动它的方法,请将该方法命名为drive()
not driveCar()
。否则,你最终会得到像这样的冗余语句car.driveCar()
。
如果你想做的事情,如果有库或函数结构存在,那就用它。不要循环遍历集合来计算总数。用流式传输它并求和。
不是:
int totalPages = 0;
for(Chapter c : chapters) {
totalPages += c.pageCount();
}
return totalPages;
但:
return chapters.stream().mapToInt(Chapter::pageCount).sum();
更短的代码更具表现力。
3.了解你的受众
作家们也会花时间确保自己是在针对特定的受众。老一辈的读者不会对“给他打电话”这样的话三思而后行。但现在电话已经没有拨号盘了,几乎没人会说这样的话了。即便如此,这句话或许仍然适合最新一期的《美国退休人员协会杂志》。
一切都与受众有关。你的代码的受众是谁?我认为主要是你团队里的其他程序员,无论是现在的还是未来的。Donald Knuth 对此有一个很好的想法:
让我们改变对程序构建的传统态度。与其想象我们的主要任务是指示计算机做什么,不如专注于向人类解释我们想让计算机做什么。——唐纳德·克努斯
就像写作一样,代码应该让读者感到熟悉。尽可能遵循已知的惯用语,避免使用小技巧。这样,你的队友就不需要费力费力就能理解它。如果你的代码不能清楚地表达它的作用,你还是一个优秀的程序员吗?改进代码的一个方法是,在编写代码时,要秉持这样的理念:用他们的语言编写代码,才能更好地让别人理解你的解决方案。
在命名类、方法和变量时,这一点至关重要。众所周知,命名是编程中最难的部分之一。一个著名的笑话提到了这一点:
“计算机科学中有两个尚未解决的问题:缓存失效、命名和偏差一错误。”——未知
如果每个人都对“广告”这个词有明确的理解,就用它。但如果存在歧义,就找更具体的说法。是印刷广告?电子邮件?还是短信?
虽然不太优雅,但使用形容词或修饰语来准确描述广告类型(EmailAdvertisement
)是一种解决方案。另一种方法是更深入或更广泛地思考用例,找到大多数人直观理解的词。也许代码真正模拟的是电子邮件营销活动。也许你公司的业务人员已经经常使用某个词来描述这种情况。如果每个人都称之为电子邮件营销活动,那么你的代码也应该如此。
我一直是领域驱动设计的粉丝,因为它具有无处不在的语言概念。
为了有效沟通,代码必须基于用于编写需求的相同语言——开发人员之间以及与领域专家之间交流的相同语言。——埃里克·埃文斯
使用您所在领域的通用语言编写代码,是确保内容具体、与受众有效沟通的一种可能方式。当然,还有很多其他方法。
4. 写你所知道的
“写你所知道的”是每个作家都听过的建议。然而,它常常被误解。你可能会想,如果我只写我所知道的,那我写的一定是回忆录吗?
梅丽莎·多诺万 (Melissa Donovan) 有一篇关于“写你所知道的”口头禅的精彩文章,她很好地总结了其含义:
“写你所了解的,并不意味着你只写你经历过的、遇到过的人或去过的地方。这意味着你要用你对生活、自然和人性的了解作为你故事的基础。”——梅丽莎·多诺万
这如何应用于代码?这意味着代码应该体现现实世界的一些东西。代码本身并不是一个独立的实体。它与你的业务环境并存,甚至可能存在于你的业务环境中。因此,作为一名软件工程师,这提醒你,你的大部分工作是理解用户及其任务。写你所了解的东西。
5.写!
但我从作家身上学到的最好的东西就是写!多写!大多数作家都会告诉你,如果你想成为一名伟大的作家,你绝对必须每天写作。经常写作是作家们给出的最重要的建议。
一直写作。我相信每天都要写作,每天至少写一千字。我们对写作有一种奇怪的观念:认为写作无需付出太多努力就能做到,而且写得很好。舞者每天都练习,音乐家每天都练习,即使他们正处于事业的巅峰——尤其是在巅峰时期。不知何故,我们并不把写作当回事。但写作——写得精彩——需要同样的投入。”——西奥多拉·戈斯
西奥多拉·高斯的这一观点也得到了雷·布拉德伯里、T·S·艾略特、奥森·斯科特·卡德等人的赞同。
所以,写代码吧。一直写代码,每天写代码。写代码需要奉献精神。考虑练习代码套路或完成欧拉计划。你的代码会展现你的奉献精神,你的程序员同事也会欣赏你的奉献精神。
结论
希望这些编程技巧对您有所帮助。如果您从作家或写作中学到更多,欢迎在下方留言。
快乐地编写代码!
鏂囩珷鏉ユ簮锛�https://dev.to/scottshipp/ Five-programming-tricks-i-learned-from-writers-2fkg