一天中午走在路上,顺道去看了学校新媒体艺术与设计系的学生优秀作品展。看到一个logo设计时引发了我很大的兴趣,觉得设计的非常清新活泼,不过并没有拍下来,在这里不能贴图。但是logo设计大家应该都有所概念,也没必要解释。
出来的路上我在想为什么这个logo设计可以如此吸引我,让我觉得设计得很赞。我想,所谓的logo设计就是利用尽量少的元素组合出尽量多的内涵。当我们惊叹于一个logo是如此简约,但是却能给我们视觉或者思维上深刻的印象冲击时,这种少与多的对比就体现出来了。
这里,我倒是还能拿我自己给自己设计的姓名logo做个小例子,也希望感兴趣者不吝赐教。(画工拙劣,请无视)
这就是我的个人logo,有时候写信就是画个这个表示落款,含义大致如下:
首先,从我的名字着手,“钱”这个字通过那个人民币符号(¥)表现出来,另外整个图片的那个大半圆包着¥,代表的是一个聚宝盆的样子。“宇”字就是这整个图片大致上有一个宇字的轮廓,星星是那一点,然后是宝盖头,下面是一个类似“于”字的东西。“祥”字通过选取半边——即“羊”字,和人民币符号相融合,同时,利用宝盖头上的那颗星星符号预示着个人的美好愿景——做一个宇宙中吉祥的人成为一颗闪亮的星。
同时,因为我是91年出生,属相是羊,在构造¥时,将两个角进行了改动,表现出羊的特征。
于是,我们可以看出来,logo设计就是如何用尽量少的元素进行复用组合,却能涵盖表达出尽量多的含义。而且,解说的过程或许会有点枯燥零散,但是,当你直观地去看这个logo时,同时体会它所传达出的丰富的含义,又会觉得很有意思。人脑就是这么神奇。
但是,这种以少见多并不只是设计中会体现,我在《编程之美》上看到的一道题,其中一个解法让我感受到01字符是如何创造出无限的可能的。
题目在书的第13页——1.2中国象棋将帅问题:大意就是只用一个变量,要你计算出,当棋盘上只有将和帅两个棋子时,哪些位置这两个棋子可以共存(注:中国象棋中将帅在同一条纵向直线上不能共存)
关于这道题,我开始想到的是利用位运算的方式来处理,虽然如果真的要我写具体代码我觉得还是很困难的。我只是觉得只用一个变量解决这个问题,那么这个变量必须能够承载较多的信息才能解决问题,那么充分利用一个字节中每个比特位的话,这似乎还是可行的,每四个比特位代表一个棋子,01组合就可以把将帅的位置都充分表示出来了。
然后,就是那个让我觉得很牛逼的解法了,他是这样解决的:
BYTE i = 81;
while(i--){
if(i/9%3 == i%9%3)continue;
printf("A = %d, B = %d\n", i/9+1, i%9+1);
}
这个答案,可以看出只用了一个变量i,其初始值是81。然后通过除运算和取模运算的组合就得出了结果。我分析这个解法时感觉这个解法应该是来自于笛卡尔集。其实,这就在一个集合中取一个合理的子集的问题。全集U是:{(0,0),(0,1),。。。,(8,8)}两个分量分别代表了两个棋子在各自的那九个格子中的位置,于是,这个集合可以根据第一个分量分成9组,然后,每一组中再找出合适的元素,显然,这个集合中元素个数的总数是9*9=81个。
i/9是表示了分组,因为0~8除以9都是0,代表了第一个元素为0的那个组,后面的%3是因为我们考虑的是纵向直线,这三条纵向直线上的数字也是有关系的,还是加个图表示下直观吧:
于是,等号左边代表分组,等号右边代表了组内另一个棋子的位置,然后通过对3取模运算,就可以知道是不是在一个纵向直线上了。我为这个解题的思路所吸引在于它的跨学科思考,这算是我们所学的集合的一种运用吧,当时更让我坚定了程序员学好数学是一件多么棒的事,也许它不能给你实际的编程技能上的帮助,但是你看问题的角度和思路是别人所不能企及的,还有就是如何对一个简简单的数字——81,去思考这个数字所能传达的更多的内涵来。
这里我还想多插一句,虽然我知道我已经说了太多的题外话了,其实这道题,如果不对变量数目进行限制的话,我想最直观的解题思路就是两个for循环,遍历所有的可能吧,其实,这个i=81的解法看上去就是这个最原始基本的解法经过更加深入的思考之后所得出的解法。这让我想起过去看动画片《中华小当家》时,里面有一句箴言是这样说的:当你不知道从何入手时,就回到原点。这道题目,她的思考原点就是用两个for循环遍历,我想理解这道题背后解题的思维方式和过程远比惊叹于“这样也行!”要更加有价值吧。而且,书中最后那道题的解法是让我觉得投机取巧的,将一个byte拆成两个,还说自己只用了一个变量,这实在有点。。。。。。但是,我必须要承认这种解法对于数据结构的认识比我要深刻太多了。
对不起,我知道我已经说了太多的题外话,而这道题在我眼里就和之前说的logo设计一样。把那句话——尽量少的元素组合出尽量多的内涵——放到这里,添加一点编程的特点得到的改装版就是——用尽可能少的输入获取尽可能多的输出。而这种少与多背后的支撑点就在于你思考的多少与深浅。
所以,我觉得我们可以很好理解在那个内存寸土寸金的年代为什么有那么多将编程上升到了一种技艺甚至一种艺术的编程大神产生。他们受制于有限的内存,却希望创造无限的可能,这时,思维的火花所迸发出的光芒实在是太绚烂了。如今,对我们来说,我们写程序除了在特定的情况下,完全不需要关心内存问题,我们被提供了无限的空间——我们被卸下了镣铐,但是我们的舞姿变得并没有那么美丽甚至炫目了。当然,我明白,现在我们更多的精力转移到了业务与需求上了,我们势必需要在编程技艺上做出一定牺牲,况且不重复造车轮指导着我们能复用的就不要自己做。所以请别对我有偏激言论说现在依然是有编程的神人存在的云云。我的重点我认为你是懂的。
于是,我还想把这个带着镣铐起舞的概念再延伸一下,我记得以前看莎士比亚十四行诗时,对于莎翁有一个评论是古典十四行诗极其严格的韵律限制使得他为日后驾驭语言提供了很好的训练。我们又可以发现,因为韵律限制,我们又想在这种限制中寻找一种表达的自由时,给我们带来的那种收获。
我想,带着镣铐起舞所带来的是创意与灵感,而不是桎梏与僵化。当然,这里我们必须能够充分发挥作为人的主动性,企图在带着镣铐的情况下跳出绚丽的舞姿,才会真的有效果。
既然我已经跑火车跑了这么远了,我不妨以人生这个巨大的伪命题来结束我的火车之旅。我们都听说过这样一个比喻,人生就是一幅画卷,我们生下来的目的就是在这幅画卷上画出自己的人生来。那么我想说,我们确实没有必要去抱怨我们的人生有太多的限制有太多的不容易,我们手中的画笔和颜料都有限这样的话也没什么意义了。因为,我们发现,如果人生真的提供了一切的原材料,将你身上所有的镣铐卸下,这种无所约束的人生带来的恐怕只会是你对人生无比的迷茫与无所适从。
有限的生命才能带来无限的精彩。