看代码的愤怒

刚才花时间看了些代码,怒了。

程序员是思考的人,象画家和作家一样,不是码农,不是通过体力完成功能的人,绝不是!看代码和看书一样,是能感觉到写代码的人的思想。看一篇优美的散文和诗歌,跟看报纸上干巴的公关稿,感觉就是不一样,跟看帐本更不一样。

我刚才看到大量的hardcode的东西,没有逻辑,没有层次,多次拷贝粘贴而成的东西,怒!虽然完成了功能,但根本就是垃圾的代码,是没有灵魂的代码,写这样的东西,真的只能叫码农,不能叫程序员。

代码是有灵气的东西。它是对与世界的抽象。之所以需要有灵气,是因为在复杂的需求和优美的实现中间有一个巨大的矛盾,这个矛盾的解决之道是程序员的能力。

千万不要抱怨现实的复杂。现实必然复杂!画人像的画家从来不应该抱怨模特的脸为什么不长成严格的正方体,好让自己画阴影的时候容易点。试图用正方体去画人像必然失败,会被骂。在现实的复杂和纸面上的优雅之间的巨大冲突,需要由画家的技巧来弥补。

不是复杂的世界一定会导致恶心的代码。精致的代码不见得出来的就是简化得现实。但两者兼得的确来之不易,需要能力!

怎么做到用精致得代码构造复杂的现实呢?

  1. 分层。
  2. 抽象。
  3. 迭代

首先是分层。

举个做菜的例子。中国菜馆的菜单动辄几十种,若是没有合适的分层,连原料存储都成了问题:总不能厨房里面放着几十个格子,每个格子里面放着一样菜的所有原料吧。分层,或许可以分为“配菜层”,“制作层”,“调料层”。

  1. “配菜层”又分成“肉”和“菜”并列的两类。肉里面有牛肉,羊肉,鸡肉等,菜里面几种蔬菜。
  2. “制作层”其实就只有炒,烧,蒸,爆,煮等有限的几种;
  3. “调料层”是放油,盐,辣椒,香菜等等。

分了层,几十种菜就变成可以掌控的几组选择的组合。不管什么菜的肉都放在冷冻箱里,不管什么菜都用有限的几种锅子就做得出来,不管什么菜都是一样的几种辣椒。分了层,就把复杂的东西简化了。好的厨师不是宣布我为了简化只做三种菜,也不会因为几十种菜而需要1000平米的厨房来存货,而是通过分层化繁为简,再由简至繁。

别跟我说复杂,说恶心。线团不缠在线轴上当然复杂,像猫一样在乱麻里面搅和当然很复杂。

第二就是抽象。

数据结构就那几种经典的,设计模式也这么多年没有发现新的了,控制逻辑更是几乎从代码生成到现在无外乎一只手数得过来的。如何在纷繁的世界里面看到后面的逻辑,从Listing页面看到后面可以抽象成collection,复杂的关系抽象出“图”,把相互关联抽象成“边”,把看似毫不相关的东西抽象成一样,把看起来几乎一模一样的东西看透必须是不同的类来表示,这些都是抽象能力。

不努力去抽象,就会平庸的大段拷贝粘贴代码,就只会顺序执行,再加一点 if { } else { },只会字符串拼接而形成HTML,只会无休止的写代码,就只能自己干体力活。不会写循环的程序员小明才会熬夜写:

print(“1”);

print(“2”);

print(“3”);

 print(“100”);

一行一行的写,写呀。。写呀。。写呀。。。写呀。。。写呀。。。!!!一边写还在抱怨:“为什么活儿真他妈的多,我真他妈的苦。”写出来的东西还老多的bug,修bug的时候还不服气:“要不是有这些bug拦着我,我早就写到1000了。。。” 实在是不动脑子加嘴硬的典型代表。

但想想,会了循环和用函数封装,你就比小明高级很多了吗?

最后是迭代。

文章是一点点改出来的,不是写一遍再重写一遍的,不要期待啥时候一个来一个新架构,新框架就能解决问题。前后端分离不是专门的工作,是一种思想,需要立刻操练起来,从自己的每一行新代码开始。

推倒重建在任何领域都不是好主意。因为推倒重建是一种习惯。如果解决问题的办法是大规模重建,在三个月后建成必然会有更多的理由再次推倒建成的,因为这是一种习惯。

也不要等待。程序员不能等待,因为程序是分层的,是可改动的,是可以在一层很乱的情况下封装好把上层做好,之后再更改下层的。工程中的脚手架在代码世界可以用得天衣无缝。必须学会在垃圾堆里建设一个茅屋,在茅屋堆里建大楼。因为除此以外的情形,是不现实的,是追求不到的。

程序会呼吸的。会变化的,会一点点的变好的。看看佛罗伦萨的那些古建筑,450年来,一些建筑里面从泥巴已经变成了不锈钢了,或者表面已经加了防氧化膜了,那个建筑已经不是那个建筑了,却依然美丽。你推倒重建一个大教堂就牛了吗?保持表面不变换结构,或者保持里面不变换外观,土木工程师在现实世界都能做得出来,代码这种思想的东西难道做不出来?

分层,抽象,迭代,就是这些。

希望大家好好看看程序,在自己能心平气和的写出自己觉得漂亮的程序之前别跟别人说自己是程序员了。

《看代码的愤怒》上的一个想法

发表回复

您的电子邮箱地址不会被公开。