有时候,特定的场合下,你会发现写一个bash脚本都会带来这样那样的问题,有些地方没有考虑到,而有些则过于冗余。即使你熟悉N中高级语言,同时精通底层汇编语言,又精通网络协议,配置各类网络设备已经到了炉火纯青的地步,即使如此,如果你是一个毫无逻辑的人,或者一时半会儿没有彻底理解需求导致逻辑不清晰,你都无法正确的编写出代码,哪怕是一段很短的bash脚本-如果不是冗长的C代码的话。 因此程序的本质在于逻辑。语言只是一种实现逻辑的工具而已,不管什么语言,其基本特征都一样,无非就是那些if-then-else,while,for-each,AND/OR/XOR之类的,区别只是在于某些针对某类程序写起来以及理解起来较其它的更方便些。然而如今大多数的人痴迷于语言本身,学了且精通那么多种语言,却写不好一个程序,这也难免,正如如今很多人学了英语,又学日语,法语,德语,阿拉伯语...然而很少有人哪怕能用其母语创造出一段-如果不是一篇的话-美妙的文字,这也是为何外语学习中听说读写远远比精通语法来的重要的原因,毕竟自然语言是诉诸耳口笔的。计算机语言是诉诸逻辑的,因此要想写出美妙的代码,理清逻辑要比精通语言重要的多。 我一直以来都不把程序界面-UI-看得很重要,然而事实证明我错了。实际上一个可用的程序,其逻辑往往体现在界面上,因此如何去设计界面是一个很考验人逻辑思维的事情,要点在于你如何能设计一个界面,让用户无论怎么操作都能保证底层逻辑执行的正确性,该设计应该是封闭的,假设用户毫无逻辑概念,然而你的程序不能因为用户的过错而出现错误结果或者不可预知的结果,在这一点上,Apple的设计尤其好。 在界面设计中,尤其复杂的是一个操作会带来什么连锁反应,其下面是一个复杂的状态机,如果能事先把该状态机画出来,事情就会好办的多,然而画状态机要比画流程图复杂的多,状态机涉及到复杂的基于状态转换的联动效应,而流程图仅仅是一个if-then-else-then的序列。我从不设计界面,这种事实应该改变了,我自认为写出的程序无误,然而仅仅是自己用或者试验罢了,毕竟我当然知道自己程序的雷区在哪里,一旦把我的程序和其它程序结合,上面铺盖一层便于傻瓜式操作的UI,我的麻烦就来了,没完没了地查漏补缺...实际上,我真的很精通底层语言以及网络协议栈,包括原理和实现我都很精通,然而却不能利用它堆建一座高楼大厦。 一个例子如下:我在设计一个网关产品,有30个节点之间要互相两两通信,其中某些节点之间的通信需要受控,而某些节点之间的通信不需要受控,我该如何设计它的UI?实际上这是一个典型的例子,其UI下面是一个二维矩阵,类似公交车上贴的那种里程-票价表,整个节点间互访规则如下图所示:底层逻辑就是上图所示,然而界面要如何设计,我不得而知,不是说没有一点办法,大不了就把这个矩阵放到界面上也OK,然而用户能方便的操作吗?因此集逻辑合理性,纠错,操作方便于一体的UI其实真的很难设计的。上例中体现的是一个多对多的复杂关系,如果仅仅是初始配置也还简单,但是如果加上增删改查操作,那真的可够老子喝一壶的了。碰到过这种问题的应该都知道,如果你在某个地方增加了一个信息,那么你必然要想到在哪个地方删除这个信息,而这是最容易引发bug的地方。 实际上,如果想实现完成某个操作之后的动作,对于一个有半年工作经验的程序员来讲不是什么难事,关键的难点不在这里,而是你的设计如何应对用户操作的连续性,比如如果用户增加或者删除或者修改了一个节点,其它节点的配置如何与之联动,如果设计不好,就会牵一发而动全身,当然这是最丑陋的做法,修改一个配置,所有其它配置就都要更新。如何实现一个对用户而言最少影响程序的设计是至关重要的。UI设计追求的是完美,而底层的程序设计追求的是健壮,二者原则是不同的。 如果是做一个产品,那么首先要考虑的就是底层程序的健壮以及UI的完美。当然如果只是为了试验一下可行性或者仅仅为了玩一玩,怎么搞都可以,哪怕手工写死一段代码都无所谓,可是这种程序是千万不要用于产品代码中的,否则日后的维护将会陷入泥潭。总而言之,逻辑最重要,而UI设计中逻辑及其重要,你不光要考虑你自己的程序,还要考虑用户操作的方便性以及你的程序如何应对用户的胡乱操作,还要考虑可维护性...画一个状态图吧,虽然很麻烦但是却省去了日后的bug排查将要耗费的时间。如果仅仅是想证明一下自己的能力,那么可以胡乱搞,怎么都行...然而事实是,对于软件工程,实验室的成果不算什么成绩,也不能体现你的能力,因此除非你是大学或者研究机构专业搞研究的,否则不要总是用实验室的结论来为自己抹金。 程序的本质在于逻辑,其它的有的是浮云,有的是浮云下面的东西...