前言,这个翻译系列有点让我欲罢不能的感觉,本来打算翻译软件漏洞呢,但是发现这篇文章更有趣,于是就决定先翻译这一篇。
原文: https://www.simplethread.com/10-more-things-i-still-love-about-programming/
这篇文章是我仍然喜欢编程的十件事的续篇。
11. 学习新工具
软件工程在许多方面仍然是不成熟的。这意味着我们的工具会不断的发展。对于旧有的问题人们不断给出新的方法去解决。在加上来自于程序员喜欢的懒惰驱动式创新,你就会有各种各样的实用工具和开源解决方案去几乎解决任何问题。我在DIY(Do it yourself 自己动手做)领域有过类似的感触。比如,在木工领域,你可以使用电锯手工控制角度,只要你有足够的毅力和耐心就能做的很好。然后你的木匠朋友带着它的斜切锯来了,哦,天呐(原词为 oh,man,译者认为这里表赞叹,所以未采取直译),这些角度就变得如此容易切割,那么光滑,看起来那么漂亮。如果你和我类似,那应该也理解,那是一种非常让人满足的体验。如果你认真思考,编程也可以给你很多机会找到适合当前任务的工具。
12. Helping people 帮助别人
我以前写进入软件工程领域是因为对视频游戏感兴趣,并且驱动我去理解视频游戏背后发生了什么。虽然这是真的,让我持续对技术保持兴趣的另一部分原因是完全的掌控感。。这是周围大多数人都不理解的东西,而我可以帮助他们理解它。是的,这意味着有的时候要为朋友或家人做IT支持。是的。当人们的期望不一致可能就会感到厌烦。这适用于大多数技术专业,我相信医生、机械师、建筑师、律师也会有一样的感觉,每个人必须设定界限。归根接地,我很开心有一项技能可以帮助别人。即使我偶尔不得不把手举起来说: “抱歉,我不知道你的打印机出了什么问题,但是你否试过重启”
13. Practicing magic 修习魔法
我年轻的时候阅读过大量奇幻书籍。直到现在我仍然幻想成为一名巫师,拥有说出正确咒语或执行正确的步骤就能改变周围世界的能力。我想伟大的作品可以做到这点,但是我从来没写过任何被我认为是魔法的东西。最接近感觉自己像是施展魔法的时刻是构建软件,特别是在DevOps方面,如果你编写了正确的Ansible 脚本或 Terraform 计划,突然之间一整个协调的服务器队列都在按照你的意愿运作。如果你天天做DevOps,就会让你丧失兴奋感。但对于我来说,这是非常少有的让我看到一切井井有条,就像施展魔法般让人愉快,令人陶醉。
14. Turning ideas into reality 将想法变成现实。
咨询业最酷的事情是有机会帮助很多人建立他们单独建立不了的产品-远远超出他们原有愿景的产品。他们可能有一个产品的想法,或者他们对问题有充分的了解和信心,认为一定有更好的方式(方法)。不管怎么样,我们有能力让他们发生,把抽象的想法变成现实世界中的人能够从中受益的东西。我永远不会厌倦指导客户完成这个过程,即发现他们真正想要实现的目标,然后帮助他们将这些想法变成一个真正的、有效的系统。
15. Diagnosing ridiculous Heisenbugs 修复一些匪夷所思的bug
Heisenbug是一个关于bug的术语,当你试图去找原因并且复现时无法复现。它也是随机出现并且没有明显错误的bug 的通用缩写。大多数软件中的bug都是直接的,比如没有考虑过的情况,没有考虑的下游效应等。但是有些时候,你碰到这样一个问题,一直找原因,但是根据代码推断根本就不可能有这样的行为。但是在你放弃之前,老天啊,你意味地重现了它。这时你就知道你要学点好东西了,虽然它可能并不令人愉快。他可能是一个谋杀案,而你就是凶手。这个bug会填补你的知识空白,提高你的专业知识水平。例如,通常情况下,如果磁盘有空间并且进程有权限就可以向磁盘写入文件,除非它是一个旧的FAT32(文件系统)的磁盘,你正在向里面写入一个65k大小的文件,因为清理过程,写入会偶尔失败。这对我个人来说是一个特别痛苦的教训。
16. Solving impossible problems 解决一些不可能的问题
在软件工程领域,如果有充足的时间和精力,几乎任何问题都是可以被解决。这既让人兴奋也让人疲倦。有时人们会要求你去做不可能做的事情,有时答案是不行,技术还不存在。但更多时候,答案是,这依赖于你进行头脑风暴和研究,和同事进行白板会议。你常常就能相处一个以前你觉得不可能被解决的解决方案。提示: 不可能的解决方案通常是通过找出如何将问题重新定义为可解决的问题。然后,你再解决这个问题。一个常见的例子是,如果实际上不能让一个操作变得更快,但也许我们能让用户感觉更快。我也曾涉足其他领域,但没有什么能与编程相提并论,因为我经常面对那些感觉不可能解决的问题,但最终还是找到了解决办法。
17. SQL
我非常高兴NoSQL运动稍稍消退,称为另一个版本的正确工具。我研究过很多备选的数据库,他们在特定情况下表现出色。例如我喜欢的Redis和Elasticsearch。但是,我仍然认为关系型数据库是很棒的通用数据存储--它们是鲨鱼而不是恐龙。(译者著: 鲨鱼和恐龙是同一个时代的物种,这里译者认为是在暗喻关系型数据库在不断进步,适应时代。)我喜欢 PostgreSQL和其他关系型数据的一个很大原因是SQL,是的,它由一些奇怪的不一致之处,并不完美,但是一旦你掌握了基础知识,SQL就是一种查询和处理数据集的美丽直观方式。
在不同的键上连接多个数据集,做聚合、分组等,为缺失的值提供默认值。当然,你可以在Ruby、Python、C#中做所有这些事情,并且效果也不错。但是在SQL中更加纯净,或根据数据集的值来更新一个数据集的属性?是的,我将保持我的SQL技能敏锐,非常感谢。
18. Psychic debugging 通灵调试
系统存在着一个奇怪的问题?是DNS的问题吗?不是?你确定?好吧,是字符编码的问题? 你确定你没有从Word中粘贴一些智能引号? 也许是缓存没有正确。在这个领域已经有一些念头了,一个有趣的事情就是某些有趣的事情就是某些问题会不断出现。我已经数不清有多少次同时描述了一个问题。我在对于代码一无所知的情况下就能准去地诊断出这个bug。这绝对让人觉得是某种神秘的、通灵的力量,但其实只是我犯了很多错误,看到了很多奇怪的东西。
顺便说一句,在那时,问题永远都在DNS上,即使是你已经完全排除了DNS。
19. Refactoring 重构
重构指的是改进软件的内部结构,同时保留它的可观察行为。但更一般地说,它是指在一般不改变功能的情况下,清理代码。
一些开发人员认为这很乏味并且浪费时间。但这个观点是错的,抱歉,我认为重构是编程中最大的乐趣之一,特别是在长时间工作在一个系统下的时候。在生活中,你有多少的机会修正过去的错误?你有多少机会重新审视过去的决策并更新它们以适应不断变化的环境。对我来说,并不是很多,并且能够进入混乱的代码部分,设想如何更清晰地组织它,然后有条不紊地进行分解和去模糊化时,你会感到无比的满足。当你完成重构后,测试仍然通过,一切工作都和以前一样,但它不再是代码库中人们害怕修改的部分。
20. Being cool under pressure 在压力下保持冷静
最后一点这并不是编程独有的,但这是我经常体验到的情况。在我职业生涯的早期,我和一些高级开发人员一起工作,他们在压力下保持平静。
你会从一个重要的客户那里收到一份奇怪的生产错误报告。数据消失了?这到底是怎么回事?你会开始研究这个问题,并且胃里有会有一种沉甸甸的感觉.....哦,事情非常不对劲,肾上腺素开始跳动。一切都非常糟糕,你拉进领导开发人员开始紧张地讲述你所做的一切。他们让你说完,然后平静地回到开头,也许走到白板前。“好吧,让我们从列出我们知道的东西开始,然后我们可以列出.....”等等。你从惊慌失措到感觉一切都会好起来。有这样人在你的团队真是一种解脱。不知何故,尽管困难重重,我想我已经成功地在很多软件工程背景下成为这样的人。我可以吸收团队中人的压力,并散发回一种平静的感觉。这并不是说我有什么特殊的能力;我只是看到了足够多的软件问题,并设法找到了合理的解决放那。所以我相信不管这个新的危机是什么,我们都能渡过。能够为我们团队中的人提供平静的来源非常让我开心。