天天看点

真正的程序员

真正的程序员

第1章

我很幸运能在电脑和电子游戏普及之前出生。我有幸与朋友和兄弟一起在户外玩耍,并发明了我们自己的游戏。

我们可以成为我们自己的英雄,使用一根会立即变成弓、枪、剑或望远镜的树枝。它可以是任何东西,除了可能是回旋镖,因为一旦你把棍子扔掉,你就必须去拿回来。

真正的程序员

在某个时候,我长大了,那样玩变得很尴尬。当其他孩子认为成年人很酷时,您不能将松果视为手榴弹并假装拥有神奇的力量。你只是不再适合了。你最终会受到成长的压力。不过,那是一个非常幸运的童年。

在某个时候,我有机会玩电子游戏和使用电脑。可能会有你一直想要的想象世界,在你面前实现。它正在消耗你,有那么一刻你过着不同的生活。

但大多数电子游戏都有一些特别之处:你不创造,你反应,你消费。我最终在十几岁的时候做了即兴戏剧。然后,再一次,可以和人们在一起,创造和假装无中生有。

真正的程序员

当然,魁北克的即兴剧院是不同的。那里有一个溜冰场——一切都是曲棍球。

当我从 2005 年到 2008 年进入职业学院学习多媒体时,我最终陷入了编程工作。我觉得太棒了!创造力又来了,它可以让我赚钱!然后我设计了我的第一款游戏的机制,这让我大吃一惊。

真正的程序员

有人告诉我,那不是真正的电子游戏。这只是一个 HTML 表单。您应该为文本和选项使用数组,这样会更好。代码需要清理。

我有点沮丧;这个游戏真的是关于我为它的“选择你的冒险”方面写的 11 页文字。但我意识到,如果我想做更多人认为好的东西,我必须学习很多东西。

我必须学习“真正的编程”。从 GUI 工具包中的 JScript 转移到更好的东西,比如 PHP。所以我学会了这一点,以及 Javascript。然后最终我被告知要重新学习如何进行真正的编程;PHP是可怕的。有人告诉我也许可以尝试 Python,然后我就学会了。

但是真正的程序员知道更高级的东西,而 python 的 lambdas 并没有解决它,面向对象的编程不是你想要的。有人告诉我,阅读 SICP 将是下一步,因为它就像计算机科学的圣经。

真正的程序员

这让我想到了Scheme。我得到了 K&R 书,因为现实世界中真正的程序员会 C,我在当地大学注册了兼职课程,同时兼顾他们的工作,因为真正的程序员知道数据结构和数学,我在一定程度上学到了这些。我开始阅读论文和书籍,因为真正的程序员保持最新并且知道花哨的算法。

不知何故,我拿起了 Erlang,并开始以此为生。我为此写了一本书。奇怪的是,没有人质疑我是真正的作家、真正的作家还是真正的插画家。见鬼,我在没有在生产系统中使用过 Erlang 的情况下找到了一份教 Erlang 的工作。

第2章

所以我过着环游世界的生活,告诉人们如何做我自己有时从未做过的事情,而每个人似乎都突然相信我是一个真正的程序员,因为我所做的事情大多与编程无关.

一天,我被困在一个会议结束回来的机场,在航站楼发狂地打字,这时一个奇怪而温和的声音问我:

如果你愿意,请给我设计一个系统!

什么?!

给我设计一个系统!

我从屏幕上抬起头,对这个请求感到惊讶。我环顾四周,看到这个立志成为开发人员并希望我称他为“printf”的孩子,我觉得这很愚蠢和噱头。他看起来有点像这样:

真正的程序员

我还不太了解计算机,但您似乎知道。我想写关于它们的程序和博客,让人们使用和阅读它们。请给我设计一个系统!

现在这是一个令人惊讶的要求,那时我已经醒了 20 个小时,不太确定我是否完全理解或感觉喜欢它。我告诉他系统很难。我不知道他想做什么,他希望它如何失败,它应该支持多少读者,他想在哪里托管它,因此我无法在信息如此之少的情况下设计一个合适的系统。

那没关系。给我设计一个系统。

于是我做了如下架构图:

真正的程序员

他看了看,说不行,这个系统不够好。给我另一个。

所以我做了:

真正的程序员

我向他简要介绍了它的工作原理。

我的新朋友礼貌地笑了笑。这不是我想要的,它太复杂了,而且做了很多我不需要的东西

考虑到冗余、监控、备份、缓存和其他减少负载的机制、用于法律保护的外部支付处理器、故障转移、易于部署等,我感到有点受辱。我本可以为此收取可观的钱作为咨询费!出于耐心,我只是画了这个:

真正的程序员

我补充说:这是你的设计。你想要的系统在黑匣子里,希望这个糟糕的答案能让他别管我。但我很惊讶地听到回音:

这正是我想要的方式!

这就是我结识小printf的方式。

第3章

我很快就知道了这个小家伙的投资组合。在他的存储库中只有小程序、带有表单的简单网页、琐碎的命令行实用程序。它们会不起眼,会出现,而且不会很快消失。

然后在某个时候,他开始研究一个更大的程序,该程序使用多个模块。它需要套接字、访问磁盘、与实际数据库通信。当它第一次构建并正常运行时,little printf 感到很惊讶。但该计划还不够。

它需要重构、更好的测试、文档、linting 和分析。该程序将运行一段时间,一天早上,它崩溃了。

它一次又一次地崩溃。

配置错误,日志不会旋转,磁盘速度不可预测,网络会出现故障,错误会出现,编码会混乱,数据库需要清理,事务会挂起,证书会过期,CVE 会不断出现,指标将保持沉默。

真正的程序员

它一直转向意大利面条。

他告诉我:事实是我什么都不知道!我应该根据我的需要来判断。我有编写一个花哨系统的狂妄自大,我花了很多时间来修复它,感觉就像它取消了它为我节省的时间。不过,我应该知道这是多么美妙的事情。

一天早上,他决定离开办公室。再见,他对一盏似乎已经烧坏的闪光灯说。他离开去看看除了他那凌乱的小服务器之外,软件世界还能提供什么。

日志会不断累积,直到硬盘驱动器不再填满。

第 4 章

真正的程序员

他去了一个工作区,寻找经验丰富的开发人员,从他们那里获得提示和帮助。

他遇到的第一个是一位非常自豪的高级工程师,他似乎觉得自己很优越。

真正的程序员

啊,来了一个学习者!欢迎来到我的领域,我是他所说的专家。

专家?小printf问道。这是否意味着你可以编程任何东西?

是的!专家回答。他补充说差不多;我只编写值得编程的程序。我不会在琐事上浪费时间。许多程序我从未编写过,但可以轻松编写。

啊,那你能帮我处理一下我的系统吗?小printf刚开始解释自己的业务,领域专家就打断了他:

对不起,但我真的不明白这样做的意义。

为什么不?

经验。我擅长编程我编程的东西,我编程我擅长的东西。通过在我已经擅长的这一系列相当有限的事情上做得更好,我确保我在这方面比以往任何时候都更有价值。称之为工作保障,称之为适者生存,但这就是我的工作方式。

为什么你不能帮助我?

好吧,你看,花时间帮助你意味着我将重要的自我投资转移到促进他人的进步上——这对我来说是一个失败的策略。对你来说最好的学习方式就是我自己的方式:努力奋斗,自己弄清楚。它有助于塑造性格。

这似乎不是很有效...

你可以去学校学习,也可以自学。它的真正作用是清除那些只想轻松自在的懒人,并迫使留在这里的每个人成为真正应得的人。当我们让moochers进来的那一刻,我制作的作品的价值就随之下降了。

你不认为合作或同事可以帮助你吗?

并不真地。我在一个人呆着并且不分心时工作得最好。每次我最终被迫与他人合作时,几乎不可能让我们的东西一起工作。出于恼怒,我拿起他们的作品,用理智的方式重写了大部分。然后它工作正常。

Little printf 很惊讶地遇到了一位似乎对帮助他人不感兴趣的专家,但又对他们缺乏技能感到非常恼火。有点难过,这个男人把自己的视野局限在自己知道的一个领域,到了除了给自己制造问题,什么都做不了的地步!

我明白了……好吧,我想我很高兴你不给我帮助,我的小朋友说

你是什么意思?任贤者问道,他的身价似乎一下子被降级了。你不觉得我做的工作很有趣吗?

哦,我愿意。似乎你会比其他任何事情都更将我视为障碍和烦恼,而我正在寻找的是帮助,而不是痛苦。

小 printf 迅速离开,让专家意识到他在更多方面让自己变得不可动摇,而不仅仅是他的工作保障。

第 5 章

真正的程序员

途中,小printf走到了一间办公室的门前,办公室里坐着一个男人,周围是厚厚的精装书,上面有巫师、龙、分形和数学图案等精美的图像。

好书,先生,printf 说

谢谢。我认为它们是程序员必不可少的材料。如果你没有它们,你就不是真正的专业人士

我想我不是专业人士,小printf说。哪一个是你的最爱?

哦,我还没有读过大部分。

那你不是一个好的程序员吗?

不我不是。开发者自豪地补充道:事实上,我是一个糟糕的程序员。

太可惜了,little printf 说,他继续说:我自己也在好转。

你听说过邓宁-克鲁格效应吗?,男人问。

不,那是什么?

这是认知偏见的事情。它基本上是说,能力较差的人往往会高估自己的资格,而有能力的人往往会系统地低估自己的资格。

所以如果我认为我正在变得更好,我可能不是很好

是的,正是。你可能很糟糕。另一方面,我公开说我是一个糟糕的程序员。但根据 Dunning-Kruger 的说法,我可能低估了自己,这让我成为了一名优秀的开发人员,你不明白吗?

我猜?

那是因为自我贬低是开发人员的重要工具。当你觉得自己很好时,你就会放松并停止进步。

这不是说当你对自己感觉良好的那一刻,你就在走向失败,然后你应该感觉很糟糕?

是的。但是解决这个问题的方法是说一切都很糟糕,即使你没有提供解决方案。这样你看起来很聪明,但没有太多贡献。

你是什么意思?

假设我上网查看了一个我不喜欢的项目。诀窍是指出所有错误的地方,不要提供更多信息。您可能可以巧妙地指出做这件事的人是白痴的方式并逃脱惩罚。

以及如何更好地做到这一点?

好吧,我喜欢认为他们最好知道自己走错了路,而我最好向他们展示这一点。这有点像烟雾和镜子。没有人知道他们在做什么,但看起来就像我一样。

当你被要求帮助却无能为力时会发生什么?

那是你回去说一切都很糟糕的时候。你有太多的牦牛剃须要做,改进其他事情,过于悲观。他们靠自己。

所以这都是装腔作势?你是在玩游戏吗?你是一个在他们知道的事情上装作无能的人,这让那些实际上一无所知的人感觉更糟改善那里也感觉不好。

无论如何,能力与它几乎没有关系。不过名声还是很重要的。人们雇用朋友,不喜欢和不重要的人首先被解雇;尝试更改系统,您会变得不喜欢。这都是一个非常社交的游戏。这就是它在行业中的运作方式,也许在学术界也是如此,虽然我不知道,现在我会吗?都是关于你认识谁,推销你自己,你认识你自己的个人品牌?这就是您在企业中获得工作的方式。

如果事情是这样的,你必须感觉不好,让别人感觉不好才能做好,也许我不想在这个行业工作,小printf说,然后离开。

第 6 章

真正的程序员

在本来应该是午休时间的时候,Printf 打断了一个似乎忘记吃午饭的人,一个三明治一分钟变冷,坐在他们的办公桌前,看着他们的屏幕。

那似乎是一个很忙的人,可能知道他们在做什么。Printf 问:

如果主数据库可能失败,那么从属数据库也会失败吗?

这位人士说,你所经营的一切都可能而且迟早会失败。

连告诉你事情的事情都失败了?

是的,即使是这些。所有大型系统在任何给定时间都处于某种局部故障状态。

那么,试图做出可靠的系统,有什么用呢?

那人不知道,因为那一刻,他们正试图回答一页天因为断云而落到他们头上的问题,想着同样的事情。

那么制作可靠的系统有什么用呢?再次按下小Printf

这个人正在处理生产问题,这孩子不放手,一个三明治要浪费了,这个人不耐烦地回了一句:

根本没用。无论如何,编程都是狗屎。

哦!,他喘着粗气。

然后是片刻的完全寂静。

真正的程序员

小家伙回应道,带着一丝怨恨:

我不相信你。程序是脆弱的,但程序员可以做出很好的努力,让事情变得更好、更有用。

没有回复回来。那时,这个人打开了文档,解释如何从头开始引导整个集群的新副本,事情似乎变得越来越糟。

而且您实际上相信良好可靠的程序-

不好了!那人说。不不不!我不相信好的或可靠的程序!不再!他们都很可怕!我刚刚告诉你我想到的第一件事,因为我现在正在处理这些糟糕的系统。你没看到我在努力让这些东西继续运行吗?这狗屎实际上是有后果的。

Printf 回过头来,表情震惊。

真的有后果吗?你说话就像一个“真正的程序员”。

他加了:

你把一切都混为一谈,混淆了一切。有数以百万计的程序,多年来,它们一直在运行,也同样失败。人们已经使用它们并且需要它们。而且我知道有些程序只能在一台笔记本电脑上运行,一个错误可能会破坏整个社区,甚至没有注意到。你认为这不重要吗?

那人保持沉默。

第七章

真正的程序员

我朋友访问的第四个工作区有一个人,他的电脑贴满了很多贴纸,没人知道它是什么品牌。

motor-mvc, quadrangular JS, GoQuery, cometeor, 一些日本声音,...

嗨,中断的 printf。你在做什么?

alchemist, bongodb, mochascript, walktime.js, portasql,

你在做什么?,他又问了一遍,这次声音更大了。

哦,我正在尝试新的框架、工具、数据库、语言。

哇,你的速度似乎很快,可能和 10 个程序员加起来一样快!

是的!好吧,这个行业发展得非常快!,他看了一眼手机,然后补充道!cardboard.io 框架提出了 3.5 版本,它破坏了与 3.4 的兼容性,这在社区中产生了 4 个分支!我必须尝试所有这些才能知道选择哪个!

你是怎么学习所有这些的?

我是早期采用者。如果您不及时了解最新信息,您就会陷入以编写 COBOL 或 MUMPS 为生的困境。你想找到下一件大事,乘风破浪!

它曾经奏效过吗?

哦是的!我在 Rails 变得大之前就发现了它,并且在 node.js 流行之前我就发现了它,而且我在 redis 和 mongodb 和 riak 的第一个 beta 副本上!我是第一个使用 vagrant 的人,然后我让我们切换到 docker,但当然现在都是关于 unikernels 的。

很酷,所有这些你都站在最前沿的事情,它是如何得到回报的?

哦,它没有;当rails变得巨大时,我已经转向下一件大事,所以我没有落伍。其他的也一样。不过,这里希望有 unikernels

我明白了,加了一点 printf,若有所思。你用所有这些框架解决了什么问题?

哦,我确保我们不会使用不会大的东西,这样这家公司就不会押注没有未来的技术。这是一项非常重要的工作,因为如果你不这样做,除了落后于时代的老灰胡须,你找不到任何人可以雇用,你需要有上进心的人,他们也是早期的采用者。,男人说。

这很有趣,我们的朋友说。

这很难!在创业的世界里,如果你想要一流的玩家,你需要好的技术来吸引他们!否则你会被僵硬的落后者困住。没有人愿意成为一个死板的落后者。

小printf插嘴道:不,我不是这个意思,然后他补充说,我的意思是工具是为我们解决问题的,但对你来说,工具本身已经成为问题。

就在那个人默默地站在那里(在他新的凉爽的跑步机桌子上)时,小printf跳出了房间。

第 8 章

真正的程序员

隔壁办公室里坐着一个疲惫的员工,手里拿着几十个空咖啡杯,正懒洋洋地趴着,愤怒地打字。

嗨,小 printf 说。

女人并没有停止她正在做的事情。她不停地拼命打字。

你好?他又问。

女人立刻停下来,从书桌抽屉里拿出一个烧瓶,喝了一口。

我的工作很糟糕,她说。我做开发。开始还好,我主要是开发,有时是调试东西,但随着时间的推移,情况变得越来越糟。我开始在我们的堆栈中灭火,然后更多的火灾不断发生。我摆脱了他们中的大多数,在这里和那里创造小奇迹,然后满足我也必须做的开发工作的最后期限

他们有雇人帮忙吗?

不,就是这样。小火不断地在这里和那里发生,由于我花了很多时间来扑灭它们,我不能像以前那样小心地处理开发人员的东西,所以我一直在制造更多的火。现在我整天整夜都在灭火,我讨厌我的工作

为什么你的雇主不做任何事情?

我擅长我的工作,并且我设法将事情控制得足够长,以至于每个人都习惯了。当你养成了小奇迹的习惯时,人们就会习惯它。然后你一直被困在创造奇迹,否则他们会认为你根本不会做你的工作。

听起来很悲伤

这是; 因为你是最熟悉这些火灾的人,所以你只能越来越多地处理它们,直到你的雇主雇佣其他人来代替你以前的工作,你所爱的人。如果你对自己的工作足够关心,去做别人讨厌的事情,你就会因为做越来越多你不喜欢的工作而得到感谢,直到你只做这些。然后你就没有什么可以享受的了。

那你就倒霉了,小printf说。

她的寻呼机又响了。

那个女人,小 printf 对自己说,当他继续他的旅程时,那个女人会被所有人蔑视:被资深专家,被摇滚明星开发者,被连续早期采用者。尽管如此,她是他们中唯一一个看起来很有帮助的人。或许是因为她在想着自己以外的事情。

第 9 章

真正的程序员

在大楼的拐角处,printf 找到了一间带大窗户的大办公室,可以看到该地区的壮丽景色。里面坐着一位老绅士,桌上放着一大堆文件。

啊,当 printf 站在门口时,一个开发人员惊呼了这个人。进来!

透过窗户,小 printf 发现上面写满了文字。在干擦笔的帮助下,外面的世界被大量的圆圈、箭头、圆柱体和云彩遮住了。虽然好奇这个人需要在户外可以看到真实云的地方画出云,但整个合奏更有趣。

这是什么?,我们的朋友指着窗户问。

哦这个?这是我们的生产系统!男人说,从来没有想过这个问题是关于外面的世界的。我是一名软件架构师。

什么是软件架构师?

大多数情况下,它是知道如何最好地构建和协调大型系统的组件的人,因此它们都可以很好地组合在一起。这是一个必须了解数据库、语言、框架、编辑器、序列化格式、协议以及诸如封装和关注点分离等概念的人。

这很有趣!小printf说,这里有人可以回答我所有的问题!他看了一眼架构图。你的系统令人印象深刻。它跑得很快吗?

我不能告诉你,建筑师说。不过应该

那么代码怎么样,好吗?

我不能告诉你

用户对此满意吗?

我也不能告诉你,我害怕

但你是一名软件架构师!

确切地!但我不是开发人员。不是架构师去编写模块和类,组合库。软件架构师太重要了,不能到处碰代码。但他与程序员和开发人员交谈,向他们提问,为他们提供指导。如果问题看起来足够有趣,建筑师就会接管规划。

为什么是这样?

因为我们更有经验。我们更多地了解系统以及什么有效或无效。然后,开发人员可以扩展我们的知识来生产出色的系统!

但是,如果不涉及代码,你怎么知道事情是否进展顺利呢?

我们信任开发商

所以你相信他们能正确地实现你的想法,但不足以提出他们自己的想法?

软件架构师明显被这个评论动摇了。我想我可能有点脱节了,他终于承认了。问题是,过了一段时间,你被要求处理太多想法,你没有一个好的方法来测试或验证它们……他凝视着,若有所思。有时软件架构师似乎既不做软件也不做架构。

Little printf 离开了房间,结束了他的访问,离开了大楼。

第 10 章

真正的程序员

小printf 一到外面,就遇到了一个为慈善募捐的人。

你好,男人说。今天帮助别人感觉如何?

这可能会让我感觉好些,小 printf 回复说。我整天都在这个办公室里,现在我比以往任何时候都更加困惑。

啊,我明白了。这些人都是开发人员。它们并没有真正的帮助,不是吗?他们喜欢说的是他们正在改变世界,事实上,他们在这方面几乎取得了成功。

那怎么感觉这么别扭呢?问小printf。

嗯,他们做的最好的往往是帮助一些人的工作变成了程序,或者让大家的闲暇更加悠闲。软件正在吞噬这个世界,这肯定会改变它的面貌……但在内心深处,它还是同一个旧世界,有着一张被毁坏的脸。感觉尴尬的原因是,以这种方式改变并不意味着事情会变得更好。我们有同样的缺陷和问题,我们内心深处也有同样的漏洞。

那么我怎样才能感觉更好呢?小普林特夫显然很焦虑。

男人想了想,提议 printf 来帮他帮助别人,因为这是这个男人感觉更好的方式。下午,printf 向这个人讲述了他的问题和他的冒险经历。沉默了许久,男人开口道:

人们玩的游戏,他们追逐和娱乐的角色和声誉,他们从解决错综复杂的问题中获得的转瞬即逝的快乐,都在一段时间内很有趣。但最终,如果你没有解决任何有价值的问题,如果你忘记了所涉及的人,那么它永远不会真正令人满意。

这可能很好,也可能不是,当你长大后,你可能会或可能不会从工作场所以外的其他地方得到它。工作可以是工作;可以是为了钱,也可以是为了好玩。没关系。只要您设法在生活中的某个地方获得这种满足感。

最后,只有当你用人的面孔解决问题时,你才能真正感到正确;重要的东西对计算机来说是不可见的。

正是你在系统上花费的时间才使它变得如此重要”,该男子补充道,“当你忘记了为什么花时间在系统上是有意义的,当它变成一种骄傲的游戏时,它会引起更多的悲伤比救济。

开发人员经常忘记这个事实;如果你忽略了事情,在你的系统上工作就会成为它自己的问题,最有效的解决方案是摆脱系统,因为它是问题所在。

只有当你用人脸解决问题时,你才能真正感觉到正确,对自己重复一点printf,这样他就会记住。

第11章

真正的程序员

现在坐在我面前的 Printf 正在回家的路上。与他交谈让我意识到,面对我喜欢的东西,我开始编程的目的,我所做的事情有多少是苍白的。Printf 遇到的每一个人都是我看到自己随着时间的推移而扮演的角色。他们鼓励我成为他们,并且可能鼓励人们也这样做。

在我试图成为一名真正的程序员的游戏中,Printf 没有。他说他可以不做一个真正的程序员,他更喜欢做一个有人情味的程序员。

今天我陷入了回首往事的境地,我必须弄清楚我是否也可以成为一个有人情味的程序员;或者如果我所做的一切都只是一份工作。两者之间似乎没有太多值得的东西。