作者 | Fred Hebert
译者 | 弯月
责编 | 伍杏玲
出品 | 极客宝宝(geek_baby)
我很幸运在我出生的年代里,这个世界还没有被计算机和电子游戏淹没。我有幸能够与朋友和小伙伴们在外面玩耍,玩我们自己发明的游戏。
在我们心里我们都是大英雄,我们会拿一根树枝当弓箭、枪、剑或当望远镜,知识不能当成回旋镖,因为一旦你扔掉树枝,就必须自己去捡。
后来我长大了,就告别了这些幼稚的游戏。孩子都觉得大人很酷,所以你作为大人就不能把松果当作手榴弹,或假装自己有魔法。最终我们都会慢慢长大,长成大人应该有大人的样子。
不过,我依然觉得我有一个非常幸福的童年。
后来我开始玩电子游戏,有时还会玩电脑。曾经我们都想生活在游戏的梦想世界里,然而梦想虽然美丽,现实却很残酷。每当关掉游戏回到现实生活时,我们都会感到些许沮丧。
其实大多数视频和游戏都有一个弊端:你不需要创造力,只需要单方面地回应。十几岁的时候,我开始接触即兴剧。演即兴剧的时候你可以和其他人沟通,你可以去创造,还可以假装外界不存在。
当然,魁北克的即兴剧院略有不同,附近有一个溜冰场,人人都喜欢打冰球。
2005年-2008年,我考入大学开始学习多媒体,最终有机会接触编程的工作。我觉得编程很神奇!编程富有创造力,而且我还可以通过编程赚钱!
我设计了第一个自己的游戏,也因此备受打击。
有人告诉我:“这算不上一个真正的电子游戏。这只是一个HTML表单。你应该使用数组处理文本和选项,那样会更好,你的代码需要整理下。”
我有点沮丧,为这个游戏编写了11个文本页面,让玩家“选择你的冒险”。但我意识到如果我想创造大家心目中的好游戏,那么就必须学习。
我必须学习“真正的编程”。我不再使用图形界面工具包中的JScript外,开始学习更好的技术,比如PHP。所以,我学习了PHP,还学习了Javascript。
在学习真正的编程技术时,有人告诉我PHP很糟糕,他们建议我试试看Python。于是,我学会了Python。
真正的程序员需要掌握更高级的编程技术,而Python的Lambda远远不够,对面向对象的编程的支持也不理想。后来有人告诉我下一步读一读《计算机程序的构造和解释》(Structure and Interpretation of Computer Programs,简称SICP),因为它是计算机科学的圣经。
于是,我成功地入坑。
现实世界中真正的程序员都会C,所以我开始看K&R的《C程序设计语言》。我在本地大学报了一个培训班,一边上班一边学习。
真正的程序员需要了解数据结构和数学,所以我也学了一些,程序员需要不断学习还需要掌握流行的算法,所以我也开始阅读相关论文和书籍。
后来,不知什么时候我开始接触Erlang,并开始了这方面的职业生涯。我还写了一本书。奇怪的是,没有人质疑我是一名真正的作家、撰稿人,还是真正的插画家。我甚至还找到了一份教Erlang的工作,尽管我从未在生产系统中使用过Erlang。
天知道是怎么回事。
因为工作的需要,我需要满世界飞,教授别人我从未做过的事情,每个人突然开始相信我是一名真正的程序员,但其实我的工作与编程并没有太大关系。
有一天,参加完一个会议后,我在机场等飞机时一边疯狂地打字。突然,一个奇怪而又温柔的声音传入了我的耳中:
“请您帮我设计一个系统!”
“什么?”
“帮我设计一个系统!”
我惊讶地抬起了头。环顾四周,我看到一个孩子一脸渴望成为开发的样子,他说我可以叫他“printf”,我觉得这个昵称很傻很搞笑。这个小屁孩的样子就像下面这样:
“我不懂计算机,但是好像你很懂。我想写程序给别人用,写编程的博客给别人看。请帮我设计一个系统!”
这真是一个奇怪的请求,当时我已经有20个小时没睡觉了,我怀疑自己的理解或感受可能有问题。我告诉他设计一个系统非常难。
我不知道他想做什么,如何处理错误,应该支持多少读者,他想把服务器托管在什么地方,我获得的信息太少,所以我无法设计一个系统。
“没关系。你随便设计一个就好了。”
于是,我画了一个下面这样的架构图:
他看了看,然后说:“这个系统不够好,重新设计一个。”
于是,我又画了一个:
然后,我给他大概解释了一下这个系统的运行原理。
我的这位新朋友礼貌地笑了笑,然后说:“这跟我想要的不太一样,这个太复杂了,有很多我不需要的东西。”
我感到有点不快,我的这个系统设计考虑到了冗余、监控、备份、缓存以及其他减少负载的机制,还有法律保护的外部支付处理器、故障转移、易于部署等等。我本来可以收取相当可观的咨询费!我没有耐心了,于是就画了一个这个:
然后说:“这就是你的设计。你想要的系统都在这个黑盒子里面。”希望这个糊弄的答案能让他走开。但我很惊讶地听到他说:
“这就是我想要的!”
就这样,我结识了这个名叫printf的小家伙。
很快我就了解了这个小家伙的作品。他的代码库中只有一些小程序、简单的表单页面、简单的命令行工具。这些作品没有什么特别之处,而且来得快去得也快。
后来,他开始研究一个用到了多个模块的大程序,其中需要套接字、访问磁盘、与真正的数据库通信。第一次构建成功并正确运行后,小printf高兴的不得了。但这个程序还不够好。
它需要重构、更好的测试、文档和分析。在运行了一段时间后,某天早上这个程序突然崩溃了。
后来又接二连三的崩溃。
配置错误,日志没有实行轮转,磁盘速度不可控,网络断断续续,出现Bug,编码混乱,数据库需要整理,事务会被挂起,证书会过期,CVE漏洞也会显现,各项指标都会出问题。
这个程序一塌糊涂。
小家伙跟我说:“其实我什么都不懂!我应该根据自己的需要来做的,我以为编写一个华丽的系统会很骄傲,花了大量时间来修复,这个程序有点得不偿失。不过,我知道这是个了不起的作品。”
一天早上,他决定离开办公室。他在晨曦的照耀下,眯着眼睛说:“再见。”他放下了一团糟的小服务器,想去看看外面的软件世界。
小服务器的日志不断积累,直到硬盘被填满。
他去了一家公司,寻找经验丰富的开发人员,希望能够获得一些提示和帮助。
他遇到的第一个人是一位非常自豪的高级工程师,他似乎充满了优越感。
他说:“你是来学习的?欢迎来我们公司,我是一位专家。”
“专家?”小printf问道,“那是不是说你可以编写任何东西?”
“没错!” 专家答道,“几乎什么都可以。但我只编写有价值的程序。我不会在琐事上浪费时间。有很多程序我从未写过,但我可以很轻松地写出世界上所有的程序。”
“那你能帮我改进我的系统吗?”小printf刚开始描述他的服务器,就被这位专家打断了:
“不好意思,我看不出这样的意义。”
“为什么?”
“经验。我擅长编写我编写的东西,而且我喜欢编写我擅长编写的东西。通过努力在我擅长的领域提高我的水平,我就可以变得越来越有价值。无论你称之为就业保障,还是适者生存,这就是我的努力方式。”
“那么为什么你不愿意帮助我?”
“我花时间帮助你意味着我需要花费精力去帮助他人进步,对我来说这是一个失败的策略。最佳的学习方式是学习我的方法:努力奋斗,自力更生。这有助于塑造你的品格。”
“但是这种方法看起来效率并不高……”
“你可以去学校上学,或者也可以自学。这种做法为的是让懒惰的人趁早退出,并让那些真正肯努力的人留下。如果我们容忍浑水摸鱼的人,那么我创造的工作价值也会贬值。”
“你觉得你的同事对你没有帮助吗?”
“没有太大帮助。我一个人干会干得更好,而且也不会分心。每当我被迫与他人合作时,我们做出来的东西就无法正常工作。每次我都很愤怒地接过他们的工作,然后用更理智的方式重写一遍大多数的代码,然后就可以正常工作了。”
小printf很惊讶自己遇到了这样的一位专家,似乎他对帮助别人非常不感兴趣,而且对他人的技术力不足感到非常恼火。有点伤感的是,这个人将自己的视野缩小到了他非常熟悉的一个领域,他的所作所为只不过是自己给自己制造困难!
“我明白了……我想我很高兴你不愿帮助我。”小printf说。
“你什么意思?”这位精英人士问道,似乎他的价值观遭到了鄙视,“难道你不觉得我的工作很有意思吗?”
“是很有意思。只不过你把我当成了累赘和烦恼,我只是想让你帮助我,而不想让你痛苦。”
说完这话,小printf起身迅速离开了。这位专家意识到自己的所作所为似乎已经超出了就业安全,甚至有点拒人千里之外了。
小printf继续他的旅程,这天他走进了一间办公室,里面坐着一个男人,周围堆满了精装书籍,封面上画着巫师、龙、分形几何和数学图形等奇特的图片。
小printf说,“先生,你的这些书好棒啊。”
“谢谢。这些都是程序员必读的书。没了它们,你就算不上一位真正的专业人士。”
“这么说来,我不算专业人士了,”小printf说,“你最喜欢哪本?”
“哦,大部分书我还没读过。”
“这么说,你也不是一位优秀的程序员?”
“我不是。”这位开发人员自豪地说:“事实上,我是一名糟糕的程序员。”
“好可惜,”小printf说,“会变得越来越好。”
“你听说过达克效应吗?”对方问道。
“没有,什么意思?”
“这是一种认知偏见。意思是说能力欠缺的人有一种自我优越感,错误地认为自己比真实情况更加优秀;而真正有能力的人则往往会低估自己的能力。”
“所以,也就是说如果我觉得自己变得越来越好,那么实际上我可能一点也不优秀。”
“是的。确切地说。你可能很差劲。而我说我是一名糟糕的程序员,根据达克效应,可能是因为我低估了自己,这证明我是一名优秀的开发。你明白吗?”
“也许吧?”
“这是因为自我否定是开发人员的优秀品格。在自我感觉良好的那一刻,你会放松自己,停止提升自己。”
“这是不是意味着自我感觉良好的那一刻,就是你走向失败的征兆,你应该感觉不好才对?”
“对。但是,为此你需要说所有的东西都很差劲,即使你不知道怎么解决。这样可以显得你更聪明,但是没有太多贡献。”
“什么意思?”
“假如我在网上看到一个我不喜欢的项目,那么秘诀就是指出所有的错误,但不提供任何详细信息。你可以巧妙地指出做这个项目的人是白痴,但不要惹上麻烦。”
“这对大家有什么好处?”
“这些人知道自己走错了路,对他们来说就是好处,而我还帮他们指了出来。虽然这种方法有点欺骗性行为,但是没人知道他们在做什么,而这只是我的做事方法。”
“如果有人请你帮助,但你无能为力的时候,该怎么办?”
“这时候,你可以说一切都很糟糕,你有很多工作要做,还需要改进其他的东西,要尽量保持悲观,让他们自力更生。”
“这么说来,你只需要装腔作势就行了?你就是这样应付困难的吗?你就是那种假装自己不称职的人,让那些什么都不懂的人感觉一无是处;你就是那种在不胜任的工作上假装无所不知的人,让那些努力提升自己的人倍感挫败。”
“无论如何,这跟能力没有太大关系。声誉才是最重要的。人们喜欢雇用朋友,而不喜欢的和不重要的人会被优先解雇;你要是想改变系统,就会成为不受欢迎的人。
这一切只是一场社交游戏。
整个行业就是这样,或许学术界也一样,尽管我不清楚,但那有什么关系呢?这一切都完全取决于你认识谁,你怎样推销自己,怎样打造自己的个人品牌,不是吗?这就是你得到工作机会的方式。”
“如果必须自我感觉很糟糕,还要让别人感觉也很糟糕,才能做好工作的话,那我就不想在这个行业工作了。“小printf说着,走了出去。
午饭时间,小printf打断了一个人,他一直盯着屏幕,似乎忘记了吃午饭,旁边的三明治早就凉了。
这个人似乎非常忙碌,也许他知道自己在做什么。小printf问:
“如果主数据库失败,那么从数据库也会失败吗?”
那个人说:“你运行的一切早晚都会失败。”
“即使那些向你汇报失败的系统也会失败吗?”
“对,即使那些系统也一样。所有大型系统,在任何时候都处于部分失败的状态。”
“那为什么我们还要建立可靠的系统?”
这个人不知道,因为在那一刻,云服务挂了,那个无法显示的页面也想知道这个问题的答案。
小printf又问了一遍,“那为什么我们还要建立可靠的系统?”
而那个人一直在忙着处理生产环境的问题,这个孩子的纠缠和吃不到嘴里的三明治让他非常恼火,于是他不耐烦地说:
“根本没用。反正编程都是垃圾。”
“哦!”他叹了口气。
随后便是静寂的沉默。
小家伙带着一丝不满说:
“我不相信。程序很脆弱,但程序员可以让它变得更好、更有用。”
那个人没有回答。此时,他已经打开了文档,想了解如何从头开始创建整个集群的新副本,情况似乎越来越糟了。
“你真的相信可靠的系……”
“不相信!”那个人说,“不相信不相信!我根本不相信可靠的程序!不会再相信了!所有程序都是垃圾!我脑子里只有这些,因为我现在处理的系统就是个垃圾。我费了九牛二虎之力让它运行,你看见了吗?这个垃圾就是努力的后果。”
小printf愣了一下,十分震惊地看着对方。
“这就是努力的后果?你说话的方式很像一个‘真正的程序员’”。
小printf又说:
“你把这一切都搞混了。世界上有成千上万的程序,多年来它们一直在不停地运行、失败,一直都没有变过。
而人们也一直使用它们,需要它们。而且我知道,一些程序只会在一台笔记本电脑上运行,而有时一个很小的错误会在不知不觉间毁掉整个社区。你认为这些都不重要吗?”
那个人没再说话。
小printf访问第四个公司时,遇到了一个人,他的电脑屏幕上贴满了便签条,甚至都看不出电脑是什么牌子。
“motor-mvc,quadrangular JS,GoQuery,goteor,一些听上去像日文的东西……”
“嗨,”小printf打断了他,“你在做什么?”
“alchemist,bongodb,mochascript,walktime.js,portasql……”那个人继续。
“你在做什么?”小printf再次问道,这次声音更响亮了。
“哦,我正在尝试新的框架、工具、数据库和语言。”
“哇,你的工作速度好像很快,也许比10名程序员加起来还快!”
“是的!其实这个行业变化得非常快!”他看了一眼手机,继续说,“看!cardboard.io框架刚刚发布了3.5版本,破坏了与3.4的兼容性,结果社区中产生了4个分叉!我必须尝试所有分叉才能知道选择哪个!”
“那你学到了什么呢?”
“我喜欢尝试新东西。如果不随时了解新东西,我这辈子就得写COBOL或MUMPS了。你要做的是赶上下一波浪潮,走向浪潮之巅!”
“这有用吗?”
“当然!我在Rails壮大之前就发现了它,在node.js流行之前就开始使用它,而且我还用过redis、mongodb和riak的第一个beta版!我还是第一个使用vagrant的人,后来还带头切换到了docker上,当然,现在我们都在用unikernel了……”
“哇,这一切都是最先进的技术,这样做有什么好处吗?”
“并没有。Rails壮大时我已经开始尝试下一个了,这样才能不被时代落下。其他的也差不多。现在我开始准备放弃unikernel了。”
“我明白了,”小printf说,陷入了沉思。“这些框架帮你解决了什么问题?”
“哦,我确保我们不会使用无法发展壮大的东西,这样公司就不会在没有未来的技术上投资。这个工作非常重要,因为如果不这样做,就无法雇佣到合适的人,除了那些落后于时代的老家伙,而你真正需要的是那些充满干劲的人,那些喜欢新事物的人。”
“真有意思!”小printf说。
“其实很困难!在创业领域,想要招人就得用很好的技术来吸引他们!否则你就会陷入落后状态。没有人想落伍。”
小printf插了一句:“不,我不是这个意思”,然后他继续说,“我说的有意思指的是,本来工具是为我们解决问题的,但对你而言,工具本身已经成为一个问题了。”
那个男人默默地站在跑步机办公桌前,而小printf则离开了房间。
小printf的下一站遇到了一个疲惫的员工,她正在愤怒地敲键盘,面前有几十个东倒西歪的空咖啡杯。
“嗨,”小printf说。
她并没有停下来,而是继续疯狂地打字。
“你好?”小printf再次问道。
她停了下来,从桌子上的抽屉里拿出一瓶液体喝了一口。
她说:“我的工作非常糟糕。我是开发运营。刚开始一切都好,我的大部分工作是开发,偶尔需要调试东西,但随着时间一天天过去,这份工作变得越来越糟。我开始到处救火,然而灾难不断发生。虽然我解决了大部分问题,到处创造小奇迹,还保证他们赶上了最后期限。”
“有人帮你吗?”
“没有,问题就在这儿。到处都会出现小麻烦,由于我要不停地解决这些麻烦,没办法专心做开发,所以导致了更多的麻烦。现在我整天都在救火,我讨厌我的工作。”
“为什么你的老板不想办法?”
“因为我很擅长自己的工作,而且长时间以来我一直能设法让事情得到控制,所以每个人都习惯了。当你经常创造小奇迹,人们就会习惯。然后你就要不停地创造奇迹,否则他们会认为你根本不胜任你的工作。”
“听起来很伤感。”
“因为你是最熟悉这些麻烦的人,你只能承担越来越多的工作,直到你的老板雇用别人来做你心爱的工作。如果你不愿意让别人做你的工作,那么你得到的回报就是做越来越多你不喜欢的工作,直到你的所有时间被占据。这时你的工作已经毫无乐趣可言了。”
“你很不幸,”小printf说。
她的寻呼机再次响起。
小printf在路上对自己说,“她会被其他所有人嘲笑,被资深专家、被最好的开发、被喜欢新鲜事物的人嘲笑。然而,她是他们当中唯一一个似乎能帮助别人的人。也许,那是因为她考虑的不是自己,而是别人。”
在大楼的一角,小printf找到了一个带大窗户的大办公室,从办公室可以欣赏到本地的美景。办公室里坐着一位老绅士,桌上摆着大量的文件。
当小printf站在门口时,老人惊呼道:“来了一位开发人员!快进来!”
小printf注意到窗玻璃上写满了很多字。在白板笔的帮助下,外面的世界被大量圆圈、箭头、圆柱和云形符号遮住了。虽然不明白为什么他需要画云彩,因为窗外就有真正的云彩,但整个图看上去很有意思。
“这是什么?”小printf指着窗户问道。
“哦,这个?这是我们的生产系统!”老人说,他根本没有注意到小printf问的是窗外的世界。“我是一名软件架构师。”
“什么是软件架构师?”
“软件架构师大概就是知道怎样才能最好地构建和协调大型系统的组件,让它们能很好地融合在一起的人。这个人必须了解数据库、语言、框架、编辑器、序列化格式、协议,还有封装和关注点分离等概念。”
“这真有意思!”小printf说,“我终于找到了能回答我所有问题的人!”他瞥了一眼架构图,问:“你的系统给我留下了深刻的印象。它的运行速度快吗?”
架构师说:“我也不知道。不过应该很快吧。”
“那么代码怎么样,写得好吗?”
“我不知道。”
“用户满意吗?”
“我恐怕也不知道。”
“但你是软件架构师呀!”
“没错!但我不是开发。我的工作不是编写模块和类,也不是组合各种库。软件架构师太重要了,不能把时间都浪费在代码上。但他会与程序员和开发交谈,问他们问题,为他们提供指导。如果出现了大问题,架构师就会介入。”
“为什么呢?”
“因为我们更有经验。我们对系统以及什么好用、什么不好用的了解得更多。然后,开发人员可以成为我们知识的延伸,生产出色的系统!”
“但是,如果不参与代码,你怎么知道事情进展顺利呢?”
“我们相信开发人员。”
“所以你相信他们能够正确地实现你的想法,但还不足以提出他们自己的想法?”
这句话明显触动了软件架构师。“我猜我可能漏了点东西,”他终于承认了。“问题在于,虽然你要求他们实现一个想法,但并没有好的办法去测试或验证这个想法……”他沉思着,低下了头。“有时候,似乎软件架构师的工作既不是软件,也不是架构。”
小printf离开了房间,离开了大楼。
小printf到在外面遇到了一个人在为慈善机构募捐。
“嗨,”那个人说。“你想不想帮帮别人?”
“帮助别人可能会让我感觉好一点,”小printf回答说,“我一整天都呆在办公室里,结果现在比以前更困惑了。”
“啊,我明白了。这些人都是开发者。他们并没有什么用,是吧?他们喜欢说他们正在改变这个世界,事实上他们的说词很成功呢。”
“那为什么感觉这么别扭呢?”小printf问。
“他们最出色的工作往往是将一些人的工作变成程序,或者让每个人更悠闲的休息。软件正在蚕食这个世界,也在改变世界的面貌……但在深处却是同样的旧世界,扭曲的世界。你感到别扭的原因是,以这种方式改变并不意味着事情会变得更好。我们依然有同样的缺陷和问题,同样根深蒂固的漏洞。”
“那我怎样才能感觉好一些?”小printf显然很焦虑。
那个人想了一会儿,然后让小printf和他一起帮助别人,因为他觉得这样能让小printf的感觉好起来。那个下午,小printf把他的问题和冒险经历告诉了那个人。经过长时间的沉默后,那个人说:
“人们的那些游戏,人们追逐并沉醉其中的角色和荣誉,人们从解决错综复杂的问题中获得的短暂愉悦,那些都是短暂的快乐。但最终,如果你没有解决任何有价值的问题,如果你忘记了共同奋斗的人们,那么永远也不会有真正的满足感。”
“也许这并不是什么问题,也可能是个问题,而且等你长大以后,也可能没办法从你的工作中找到这种满足感。你可以为了工作而工作,可以为了钱,也可以为了快乐而工作。这都没关系。只要你能在生活的其他地方获得满足感就好。”
“但最后,只有当你以人类的身份解决问题时,你才能感觉到自己是对的;重要的是,这与计算机无关。”
“你在系统上花费的时间才是最重要的。”他继续说道,“如果你忘记了为什么在上面花时间,如果它变成了一场自尊的游戏,那它带来的悲伤要远远多于快乐。”
“开发人员经常忘记这个事实,如果你忘记了初心,那么在系统上工作本身就会成为问题,而最有效的解决办法就是干掉系统。”
“只有当你以人类的身份解决问题时,你才能感觉到自己是对的。”小printf在心里反复默念。
此刻,小printf就坐在我面前,他正在回家的路上。与他的交谈让我不禁反思:在我做过的事情中,有多少是我真正喜欢的,而我编程的初心又是什么。小printf遇到的每个人,都是我在某个时间的缩影。我曾努力成为他们,也在鼓励别人成为他们。
尽管我陷入了努力成为一名真正的程序员的泥沼中,但小printf没有。他说他不在乎自己不是一名真正的程序员,他更希望自己成为一名有人情味的程序员。
当我回顾过去,我努力想搞清楚自己想成为一名有人情味的程序员,还是说我所做的一切都只是一份工作。而这两者之间似乎没有中间地带。
不管怎样,小printf觉得自己不需要成为一名真正的程序员,而我现在也有同样的感觉。
原文:https://ferd.ca/the-little-printf.html
声明:本文为 CSDN 极客宝宝翻译,如需转载,请注明来源出处。作者独立观点,不代表 本公号立场。
热 文 推 荐
☞没有新芯片,没有大核弹,黄教主这次给大家带来了个PRADA
System.out.println("点个在看吧!");
console.log("点个在看吧!");
print("点个在看吧!");
printf("点个在看吧!\n");
cout << "点个在看吧!" << endl;
Console.WriteLine("点个在看吧!");
Response.Write("点个在看吧!");
alert("点个在看吧!")
echo "点个在看吧!"