写点什么

这是我迄今为止读过的最有价值的技术书,却一行代码都没有

发布于: 2020 年 08 月 02 日
这是我迄今为止读过的最有价值的技术书,却一行代码都没有

严重的就业压力,让我们时刻奔跑着, 我们怕失业, 怕裁员,我们感谢有一份工作可以让我们生活的还算体面。于是996成为默认的常态。毕竟所有人都在奔跑。纠缠于各种不同的需求中,疲于应付着一个接一个的任务,似乎所有的一切就是这样,这就是我们为了生存的宿命。



但是我陷入了很长的困惑期,为什么会是这样,经验告诉我当我迷茫或困惑时一定是因为我所面临的问题进入我的知识或经验盲区。直到有一天我在朋友圈看到一位资深程序员晒的这本书:《代码整洁之道:程序员的职业素养》。我的第一反应是,我一定不是一名合格的程序员, 我希望从中得到到底该怎样做才能成为一名合格的程序员。果然它没有让我失望,能一口气读完的技术书估计也就这一本了。它应该成为我的案头书,时不时翻出来看看。

下面是我从书中摘录的一段故事,这段故事是作者的朋友写下的, 作者对其进行了剖析, 如果这个故事多多少少引起你的共鸣,或许你可以考虑去看看这本书,也许我们摆脱不了加班的索命,但是至少可以让自己更开心的工作,也可能让自己更合理的规划自己的工作,毕竟所有能让生活变得更美好的努力都值得尝试。

以下是原文:



有可能写出好代码吗

十几岁时,你就立志要成为一名软件工程师。高中时,你开始学习如何按照面向对象原则来编写软件;高中毕业,上了大学,你开始把学到的各种原理应用到诸如人工智能、3D图形等领域。

当大学毕业进入专业圈子时,你更是孜孜不倦地开始探求如何写出具有商业品质、可维护并且经得起时间考验的“完美”代码。

商业品质。呵呵,这个说法有点意思。

我自认是个幸运儿。我酷爱设计模式。我喜欢研究和编写完美代码相关的理论。我可以毫不费劲地和我的XP伙伴站着讨论一个多小时,为了说明他选择了继承层次的设计是错误的,因为大多数情况下,选用“组合”比“继承”要好。但最近有件事令我十分困扰,

我在想: 在现代软件开发中,有可能写出好代码吗?



一个典型的招标项目

身为全职签约(和兼职)开发者,我白天(当然也包括晚上)一直为客户开发移动应用程序。多年的从业经验让我渐渐明白,是客户需求阻碍我写出自己想要的真正高品质的应用程序。

在开始之前,我想先说明,那不是因为努力不够的原因。我喜欢整洁代码这一提法。我也还没见过有谁像我一样疯狂追求完美的软件设计。但是那些业务经理总是令人捉摸不透,你会发现自己总是猜错。



下面我先来讲个故事

去年快年底的时候,一家相当知名的公司放出了一个应用开发标书那是一家大型零售商,为了匿名,我们姑且叫它“大猩猩卖场”吧,他们表示需要找人开发一个 hone应用,而且希望能够在“黑色星期五”1前发布应用。挑战在于当时已经是11月1日了!这意味只剩下四周不到的开发时间了。噢,而且苹果公司还需要两周时间去审批该应用(啊,真让人怀念过去的美好时光啊。)也就是说,等等,我的天。这个应用的开发时间只有两周?!?

没错,我们有两时间写这个应用。而且,不幸的是,我们已经竞标成功(商业上客户重要性不容小觑)也就是说,开发任务只能成功不能失败“不会有问题的,”猩猩卖场的经理甲说:“这个应用很简单。只要为用户显示我们产品目录上的一些产品,并让他们可以搜索到我们门店的地址就可以了。我们的网站上已经有这样功能我们还会提供图片给你或许你可以,唔,那个词怎么说来着,噢,对了---- 硬编码就行了。

猩猩卖场的经理乙插话进来:“我们只需要应用能够显示一些用户在收银台付款时可以出示的优惠券就可以,这只是个“应急”的试水应用。我们只要先推出就可以,在项目二期时,我们会从头做个更大更好的出来。

事情就这么开始了。尽管多年来我时常提醒自己客户所要的任何一项功能,一旦写起来,总是远比它开始时所说的要复杂许多,但最终你还是会接下这些活。我居然天真地相信自己真的能在两月内完成开发。是的!我们能搞定!这次与以往不同只是简单的图片展示,以及通过服务调用获取门店地址而已XML就行!不用费力。我们能搞定!我都摩拳擦掌跃跃欲试了!马上开工吧!

只过了一天时间,就再次领教到那被忽视的现实了。



我: 嗯,您能给我调用门店地址 web service所需的相关信息吗?

客户: 什么是web service?

我:........

事情真的就是那样。他们的“门店位置服务,虽然刚好可以在他们网站的右上角找到但却不是网页服务那是由Java代码生成的,里头用了一个AP,并且,这个AP是由猩猩卖场的战略伙伴提供的。

来说说这个邪恶的所谓“第三方”

从使用AP的客户端来看,“第三方”就好比是“性感女神”安吉丽娜·朱莉不错,有人会允诺,你能与她一边优雅进餐一边惬意交谈,甚至有可能此后把关系更进一步…抱歉,那是不可能的,幻想归幻想,你终归还得靠自己来打理业务。

在这个案子中,翻箱倒柜之后,我最终从猩猩卖场那儿拿到的唯一的东西,就是一个包含他们现有门店列表快照的 Excel文件至于门店位置的搜索代码,我不得不从头写起。祸不单行,那天晚些时候,麻烦又来了:他们希望能够在线发布产品和优惠券的数据,这样他们就可以做到每周更新了这可真得只好来硬编码了啊!原本两周要写个 iPhone应用程序的任务,现在已变成两周写一个 iPhone应用一个PHP后端,然后还要将它们整合在一起…什么?他们还要我处理QA?  

为了抵消这些额外任务的时耗影响,代码只能写得再快些了忘记那个什么“抽象工厂吧用长长的for循环代替“组合”吧,没时间了!已经不可能写出好代码了。



赶工的两周

告诉你吧,那两周相当痛苦。首先,与我下一个项目有关的全天会议占去了其中两天(留给猩猩卖场项目的时间越发短了)到最后,事实上我只有8天时间去完成项目。第一周我工作了74小时,第二周…噢,上帝!简直不堪回首!我都想不起来了,仿佛那段记忆已从我脑海里被抹去了。这或许倒算是件好事。

那8天,我使尽浑身解数,用尽所有可能的工具狂写代码:复制粘贴(你懂的,可复用代码)、魔法数字(要避免重复定义常量—呼哧呼哧!后面只好重打一遍),单元测试当然就免了!(都到这节骨眼儿了,谁还用得上那些红条条啊,那只能让我更加泄气!)

那代码真的相当糟糕,而我根本没时间重构。考虑到项目时间如此之短,这样的成果也算是相当不错了。再说了,那毕竟是“应急的代码嘛,对吧?这些话是不是听着有些耳熟?好吧,先等一下,事情有转机了。

就在我给这个应用程序加最后几笔时(最后几笔是完成服务器代码的编写),我开始浏览代码库并思考这一切是否值得。应用毕竟写完了。我躲过此劫。

“嗨,我们刚刚聘请了Bob,他很忙,还没法打电话过来,但他说我们应该要求客户在获取优惠券前先提供他们的电邮信息。他还没见过这个应用,但他觉得这是个好主意!我们还需要一个报告系统,方便我们从服务器上调取那些电邮。这种方法可谓物美价廉(等下,最后那句是英国六人喜剧团“蒙提·派森”式的)。说到优惠券,在我们规定日期的几天之后就应该过期。噢,还有…”

我们先退回去说点别的吧。我们理解的好代码应该是什么样的呢?好代码应该可扩展易于维护,应该易于修改,读起来应该有散文的韵味……不,我这写的算哪门子好代码。

还有,如果你要成为更好的开发人员,一定要时刻牢记客户点会把项目截止日期往后拖延,他们总是想要更多的功能,他们总是提出需求变更—— 而且常在最后关头这么做。

下面的公式可供参考:

(经理人数)的平方

+2×(新经理人数)

+Bob的孩子数

=最后时刻增加的天数



照我看,这些经理都是规矩体面的家伙。他们都要养家糊口(假设魔鬼撒旦都已经批准他们成立家庭的话),他们希望新应用能够成功(关乎晋升呢).关键问题是,他们都希望项目发布后自己能直接邀功,他们希望一切停当之后,自己可以指着某项功能或设计说那是自己的点子。

回到这个故事上来,我们的项目又往后多加了几天时间来添加电邮功能然后我就累垮了。



客户永远不会像你那么在乎

尽管客户一再声明交付日期很重要,尽管他们对此表现得似乎非常迫切,但他们永远不会像你那样在乎应用程序的按时交付,那天下午,我宣告应用程序开发完毕,把最终构建版本通过电邮发给所有相关人员,主管们(嘘)、经理们,一人等“搞定了!我给你们带来V1.0版啦!感谢上帝,我称颂您的美名。”我点了“发送”按钮,仰靠在椅子上,开始自鸣得意地笑着想象大家会如何把我抬到肩上,冠我以“史上最伟大的开发人员”的美名,列队走过第42大街…至少,我的形象将会出现在他们的各种广告上,对吧?

有意思的是,他们似乎对此不以为意。事实上,我有点捉摸不透他们在想些什么。我没听到任何反响。一丁点儿也没有。原来猩猩卖场的那些家伙已经热切地把精力转移到下一件事儿上了。

你觉得我在胡说?看看吧。我没填写详细描述就直接把应用推给苹果应用商店了。之前我曾问猩猩卖场要过,但他们一直没给我反馈,我已经没时间干等了。(原因在前段已经解释过。)我再次给他们发邮件。一次又一次。对自己的项目我当然得花心思管理。我收到两次反馈,两次他们都问我:“你又想要些什么?”我要应用的详细描述一周后,苹果开始测试我的应用。通常这是一个令人感觉相当愉快的过程,但相反,这次却可怕得要命。不出所料,当天晚些时候,应用就被拒回了。被拒理由是我所能想到的最可悲、最可怜的——“该应用缺少详细描述”。功能完备,但没有应用的详细描述。为此,猩猩卖场也没能在黑色星期五前成功发布他们的应用。我十分沮丧。为了这两周极速冲刺,我已经牺牲了个人时间,而猩猩卖场却没有一个人肯在足足一周里抽点时间来写个应用描述。就在应用程序被拒后一小时,他们才把应用描述给了我们---- 显然, 这是业务要开始启动的信号。

如果说此前我是沮丧,那么一周半之后,我简直是要气死了知道吗,他们仍然没给真实数据服务器上的产品和优惠券仍然完全是编造用于测试的假数据。想象一下,那些优惠券条码号仍然是1234567890.这简直是胡扯!(顺便说一下,在这语境里我想说的 baloney是“胡拉”,可不是指博洛尼亚香肠) 

就在那个不祥的上午,我查了下门户网站,竟然发现应用可以下载安装了!真要命!那些数据还是瞎编乱造的!我惨叫起来,马上给所能想到的每个人打电话:“我要数据!”电话那头的一个女人问我是要火警还是匪警,我气急败坏地挂掉“911紧急热线”随后我又打电话给猩猩卖场,大声嚷嚷着“我要数据”。得到的回答令我永远无法忘记“噢,你好啊John.我们新来了一位副总裁我们已经决定不再发布那个应用了。把它从苹果商店上撤下来,好吧?

最后,我们发现数据库里至少已有11人注册了电子邮箱,也就是说这11个人可能会带着用于测试的 iPhone优惠券走进猩猩卖场准备使用。我的天,那该有多尴尬一切尘埃落定后再想想,客户从始至终倒是说对了一件事:这个程序是“应急”的。只是,问题是它压根儿就没发布过!



结果如何?急于完成,却迟难面市

这个故事得出的教训是,你的利益干系人,不论是外部客户还是内部管理层,知道如何让开发人员快快写出代码。但是,是高效地写出代码吗?不见得。是快速地写出代码吗?是的,他们是这么办到的

  • 告诉开发人员这个应用很简单。这能误导整个开发团队进入一种错误的思维框架,还能让开发人员更快开工,这样他们便可......

  • 挑剔指责开发团队没能发现他们的需要,并借机添加各种功能。在这个案例中,从硬编码的内容变成了需要应用可以更新。我怎么会没意识到那点呢?我当然意识到了,但我之前已经收到一个不靠谱的承诺了,这才是原因所在啊。或者客户还会聘个“某某”新人,然后这个家伙觉察到此中有某些明显不足或许有一天客户还会说他们刚聘了史蒂夫·乔布斯,问我们能不能给应用添加点金术?于是他们就 …...

  • 一而再地推后项目截止日期。给到开发人员的截止期限往往只有几天,他们为此要飞速拼命地赶工。(顺便说一下,这也是开发人员最容易犯的错,但这已是家常便饭,谁又会在乎呢,对吧?)既然他们已经这么高效了为什么又跟他们说可以将日期延后呢?占便宜啊!就是这样,在你已加班20小时把一切差不多都弄好时,他们又多给了你几天时间,然后又再加一周时间,好提出新的需求就佛是驴和胡萝卜的关系,只是,你的待遇连驴子都还不如呢。

这是耍小聪明。他们居然以为这种方法行得通,但你能责怪他们吗?毕竟他们看不见那些糟糕透顶的代码。因此,这样的事一而再再而三地发生,尽管结果往往相当惨烈。

在经济全球化时代,企业唯利是图,为提升股价而采用裁员、员工过劳和外包等方法,我遇到的这种缩减开发成本的手段,已经消解了高质量程序的存在价值和时宜了。只要一不小心,我们这些开发人员就可能会被要求、被指示或是被欺骗去花一半的时间写出两倍数量的代码。











c

用户头像

废材姑娘 2018.01.24 加入

大家叫我双儿,梦想着成为韦小宝的老婆 欢迎关注我的个人公众号----废材姑娘,回复“双儿”加我微信,让我们一起探索多彩的世界。

评论

发布
暂无评论
这是我迄今为止读过的最有价值的技术书,却一行代码都没有