20年前,最好的程序员是那些能够把整个程序装配进一个64Kb的.COM文件里的人。那些对Intel 80386掌握最多的人在编程中是偶像般的存在。
那是因为在20年前的计算机昂贵了而程序员廉价。那是黑客情怀的时代。那个时代已经过去了。那种情怀现在已经不被赞赏了,因为市场状况已经完全相反了。
现在,计算机变得便宜而程序员变得昂贵了。当下的时代是设计师情怀的时代,如今我们代码的可读性比代码的性能更为重要。
Hacker and designer mentality
视频地址:https://www.youtube.com/watch?v=qdqcayTLlLk
硬件价格 vs 工资
看这个图表。这是最近20年来(1994-2014)两者的对比趋势图。第一种曲线呈现下降的趋势并表明了计算机内存和硬盘储存器在近20年来变得很便宜。
第二种曲线趋势演示了在同一时期软件开发者工资上涨了多少。精确点来说,大概是第一种的三倍。我没有找到一个关于这两者对比的正式报告,但是可以肯定程序员的工资还会增长,这对任何人来说已经不是什么秘密了。对于高级开发者来说,年薪200,000美元不再只是个梦想。然而在20年前,在周围的人中,年薪60K美元已经是最好的报酬了。我发现一篇关于这个话题的非常有趣的文章。
基本上,这意味着在1994年为了开发一个PHP网站,我们不得不花费比现在(2014年)1000倍更多的资金在硬件方面和比现在(2014年)3倍更少的工资给开发者。然而我们还是在这讨论一样的堆栈技术。使用一样配有Apache Http服务器的Linux机器。
不同之处,在1994年,如果我们的应用因为硬件资源限制出现了性能问题,我们每次添加1G的额外内存需要支付35,000美元,而在2014年,我们只需要支付10美元.
在1994年,相对于购买新的硬件,去聘用更多的程序员并要求他们去优化代码或者重构代码的收益更大。在2014年,实际上情况恰恰相反。现在,花钱去把服务器的规模扩大两倍比花钱聘用程序员来优化软件更便宜。(特别是当服务器是虚拟云服务器时)
在1994年最好的工程师拥有“黑客情怀”,而在2014年“设计师情怀”更受欢迎。
黑客情怀
拥有黑客情怀的人会认为这个输出斐波那契数列的Java方法是一段“优雅的代码”(你吗?):
1
2
3
4
|
public
int
f(
int
n)
{
return
n>
2
?f(n-
1
)+f(n-
2
):
1
;
}
|
我列出了一个优秀黑客应有的品质:
- 能够使用一种语言中所有的别人知道(和不知道的)特性。
- 能辨别其他人是黑客还是新手还是黑客写手
- 对规则和标准会感到无聊和厌倦。
- 不写单元测试-资历少时会写
- 享受挑战–他能在那展现它的才华。
- 喜欢讨论多于写文档,因为他们觉得这样更有趣
- 讨厌别人修改他的代码。
- 喜欢马上投入一个项目里。
黑客是一个有才华的人。他想在他编写的软件里展现他的才华。他享受编程并且写代码主要是为了好玩。我可以这么说,他已经和他的代码结为伴侣了并且在与代码离婚后他无法想象以后的幸福生活。代码所有权是黑客所关心的东西–他知道他自己是代码的所有者。
当我问我任意的一个黑客朋友时,“其他人怎样才能理解这段代码的是干什么的?”。我几乎总是得到同样的答案-”他们要问我!”(通常是带着真诚的微笑自豪地说)
设计师情怀
拥有设计师情怀的人会重构上面的代码使它便于阅读。他会认为这个Java函数是一段“优雅的代码”(你觉得呢?):
1
2
3
4
5
6
7
8
9
|
public
int
fibo(
final
int
pos) {
final
int
num;
if
(pos >
2
) {
num = fibo(pos -
1
) + fibo(pos -
2
);
}
else
{
num =
1
;
}
return
num;
}
|
我认为这些品质是一个好的设计师所拥有的:
- 倾向于使用传统的编程技术
- 假定任何人都是新手并循规蹈矩地写代码
- 喜欢设定一些规则并遵循它们
- 喜欢写文档多于直接讨论并且喜欢文档自动生成多于手写
- 把更多的编码时间花费在单元测试上
- 讨厌挑战和加班工作
- 喜欢看到它的代码被修改和重构
- 同时进行比较少的项目工作
设计师是一个优秀的团队角色。他对团队的发展,标准,规则,教育和纪律的贡献跟他对源码的贡献一样多。他总是能确保一旦他离开项目他的代码和想法依然保留下来并运行。
对一个好的设计师来说,最满意的是能够看到它的代码拥有它自己的人生–被修改,被优化,被重构和最终退休。设计师把他自己看做是代码的父母-一旦它足够年大去走路和说话,它不得不去过自己的生活。
未来
如果你认为你自己是一个黑客,我相信这是做出改变的时候了。黑客的时代已经成为过去了。
在不久的将来,我们可能甚至不用考虑硬件问题并且在拥有无限大内存,CPU频率和存储空间的弹性计算平台上运行我们的应用程序。我们仅仅需要为资源使用和绝大多数性能问题付费,这仅仅是在我们每个月的账单里添加小额的额外费用。我们将不会关心任何的优化问题。
同时,优秀的工程师将会变得越来越昂贵,仅仅去检查下软件并诊断,一个小时要收费500多美元。这就像优秀的律师和牙医。
这就是为什么,当开发一个新软件产品时,那些付钱的客户更关心的是它的可维护性。项目赞助人明白他们获取利润的最好解决方案是需要一个可读性、维护性和自动化最高的项目。