找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2457|回复: 1
收起左侧

设计与程序设计

[复制链接]
ID:91350 发表于 2015-10-30 14:06 | 显示全部楼层 |阅读模式

我们的生活离不开设计,或者说,几乎所有的东西都是被设计出来的。今天我就写点东西谈一谈设计和程序设计

一、石板路,下图的设计恐怕大家都见过,这就是传说中的“一步娘炮,两步扯蛋”。

 

你说它好看吗?确实好看,草丛中的小路,总是让人觉得富有诗意。但只有走在上面才知道它设计的有多糟糕,更坑爹的还在于,有些石板路不是为了让你由AB,它偏偏让去一个你不想去的地方,然后你又原路返回。这也是为什么很多有石板路的草坪总是被人踩出另一条路来。所以说,好看的程序并不一定就使用。

这一点就像i++i=i+1,我们姑且不讨论二者之间的谁效率更高,也不说i++++i的区别。我们讨论,到底是写i++还是i=i+1呢?i++在书写效率上是快一些,也美观些,这是绝对的。比如下面这两段代码

  




我们更倾向于写前者,那么后者就一无是处吗?

当然不是,程序在调试的过程中,需要更改变量的增量(减量),有时候需要写成i=i+2i=i+3这种i=i+N的格式,因为需要这些测试。那么如果还是之前的i++结构,就不得不删除从写,所以说,实际调试中,i=i+1的写法更直观,更易于调试。

当然,如果你是出于习惯或者你的程序不需要这些调试,是没必要纠结这些的。这里只研究那种写法更适合调试,不讨论其他。

二、左撇子和右撇子问题

下图恐怕大家都遇到过,尽管现在少见了,因为网线插口都被设计到了左侧,与之类似的还有手机侧键,现在的手机侧键有些在左侧,有些在右侧。这里要说一下罗永浩锤子手机的双侧键。
 

首先我们先来看看网线插口设计,几年前我见过一些设计在右侧的笔记本。这无疑让右撇子很难受,那根网线会经常影响你的动作或者导致网线掉落。但现在少见了,大多数网线接口都设计在了左侧。好像是方便了,那么实际呢,对于左撇子呢?现在很多接口如VGAHDMI、网线接口都被设计到了左侧,这是不利于左撇子的设计。当然作为设计者本身会考虑到,左撇子的用户较少,只能为了满足大多数人。是的,这没错,不可能专门为左撇子也设计一款笔记本。更何况,绝大多数左撇子都会用右手,特别是在中国,受家庭的管教。我们左撇子几乎都用右手写字,用右手使用鼠标。我作为左撇子(操作上更多喜欢左手),就觉得很多设计非常不近人情,但也只能和其他左撇子一样,尽量去适应本来就是给右撇子的设计。

那么再看看手机,手机侧键有些在左侧(苹果),有些在右侧(诺基亚)。罗永浩的锤子手机是两侧都有的,声称是为了满足左撇子和有撇子的操作问题。我到很想知道,罗永浩先生本人是左撇子还是右撇子。如果是右撇子,他可能尝试过用左手操作左侧侧键的设计,这的确不方便(或者说不习惯),所以萌生双侧键的设计。但如果他本人就是左撇子,那么他应该会发现,即便是侧键在左侧,左撇子也可以像右撇子一样熟练的操作左侧侧键。正如前文所说,左撇子们在生活中早已习惯了那些给右撇子设计的东西。虽然我没玩过锤子手机,但我的确使用过左侧侧键和右侧侧键的手机,对于一个左撇子来说,我不觉得有左侧侧键和右侧侧键有多么不习惯。至于右撇子怎么想的,我不清楚,但我很多朋友和我一样用的是诺基亚lumia系列(侧键在右侧),他们都是右撇子,我看用起来也很顺畅,后来换为苹果后(侧键在左侧),也没抱怨过不方便。

所以个人认为,锤子手机的双侧按键有些鸡肋,此观点仅代表左撇子的个人观点,不喜勿喷。

在程序设计中,也有这种类似的鸡肋,我称之为“不需要纠结的人为错误”。比如ifi==1)和if1==i)。我是习惯性的写ifi==1),有次我的朋友看到后,对此嗤之以鼻(他的编程水平确实比我高),我问他为何不认同这种写法。他说,你写成这样,如果少打了一个“=”号,那边就变成了ifi=1),成了赋值语句,判断的条件就会永远为“真”,容易导致出错。但如果写成if1==i),即便是你少敲了一个“=”号,那么编译器在编译的时候会给你提示一个“leftside of asn-op not an lvalue”的Error(错误)。开始我听了觉得很有道理,恨不得把自己写过的所有程序都改为if1==i)格式。后来,随着阅历的增长,觉得这种写法完全是鸡肋,很多程序员看了新手的程序(比如我那朋友就是看我的程序才引发出这个问题的)不是先考虑怎么解决问题,而是先挑你的毛病,这里不对,那里不对。如果看到你写的是ifi==1)而不是if1==i)他会先批评你。

那么这种批评对吗?首先要确定的是,不管哪种写法,少敲一个=号的概率是完全一样的。所以说,没有在本质上解决出现这种问题的方法。那么在编译后呢?

keil4版本下,如果在写ifi==1)的时候真的少敲了一个“=”号,那么程序执行的结果肯定是会出错的,这个没疑问,那么这个错误就真的那么难以发觉吗?真实的情况是,当你把ifi==1)写成ifi=1)时,执行build后,keil会给出一个“constant  in condition  expression”的Warning(警告),双击这个Warning,会给自动指示到这个ifi=1)这个有问题的地方。

 

所以说,少打一个=号的情况是容易产生,但还不至于说不易于被发现(少敲一个符号的概率是一样的)。只能说,ErrorWarning比起来,前者更让程序员关注,也更容易找到错误。我不否认连我自己都懒得管Warning这种警告,但随着阅历的增加和责任心的成长,不管是Error还是Warning,我都会重视。一个合格的程序员,他不会忽略掉这种“constant  in condition  expression”的警告信息,因为它不是“uncalled segment….

再后来,我又知道,这是编译器本身的问题,就是所谓的“人为错误”。因为一个合理的编译器应该不允许你写出ifi=1)这种格式(虽然它给出了警告),但条件语句里面本来就应该是表达式而不是赋值语句,它给出一个Error(错误)到合理些。这是编译器本身的设计失误,而if1==i)这种写法又不能让你完全改掉少打一个=号的问题,何必去纠结这些“人为错误”呢,也因此我把这种情况称之为“不需要纠结的人为错误”。我没必要为前人的错误买单。

说到这,在单片机领域,程序员更多都是判断“真”或“假”。如果真的想避免输错符号带来的麻烦,写成ifi)这种格式好很多吧!我不觉得if1==i)比ifi)多高明,因为它本身就是解决一个本不应该有的错误。

 

三、各种插座






对于这些设计,估计大家和我一样,忍受很久了。但这不能把错误全部归咎于插座设计师上,有时候很多插头的设计本身就不合理。比如现在市面上各种外观的U盘,它本身就不方便插入,除了好看,还是好看。我欣赏好看的东西,但不能忽略实用,何况,那些设计的朴实无华的优盘,本身也具备美感。

至于为何会出现这种坑爹设计,我不知道。我们可以容忍一些设计的不足,但一个设计总不能让大多数人都觉得X蛋吧?!也许作为设计者本身,他是想做好事—一个插板可以插两种插头,结果事与愿违。

在编程中,就有人喜欢搞这种设计(不针对初学者),因为程序员本身很难具备包容心态,就好比一个是设计插板的,一个是设计插头的。假如这个情况发生在一个插头设计师身上,他肯定会说插板设计的不合理,可发生在插板设计师身上呢?他肯定会骂那个坑爹的插头设计者。这有点曹丕的“文人相轻”的意思。这里我好奇一下,同一家公司出的插座(插板)和插头,会不会出现不能插入的情况呢?因为我从没这样配置过插线板和插头。希望有知道的朋友告诉我一下。

这里我要说的是程序员的狭隘性(包括我自己也有),程序员本身很难面面俱到,TA的程序不见得就很好,但却很难坐下来去研究其他程序员的想法。我之前的两个例子恐怕就会引起一些程序员的误解。他们有自己的一套理论来解释i++i=i+i(有效率上的,有美观上的),只有少部分人清楚它们只是写法的不同,甚至有人看到这个,就会想到++i(尽管我没讨论++i)。总之,当你的代码(程序设计、观点)与别人相抵触时,你最先批判的是别人,而不是先认清本质,我不觉得我的观点全对,但和我讨论的,有多少是研究问题本身呢?程序语言不是达尔文的进化论,不能说“存在即有道理”,它是人设计的,编译器也是人设计的,这就难免出现设计错误,不是所有存在的东西都有道理,王垠甚至认为,自增自减(i++,i--)本身就是错误的设计。

同样的,作为插座和插板,他们都是人设计的,也一样会存在问题。如果说插板设计师的这种设计错误只是让你少用一个插头,那么程序员的这种类似失误就是一种灾难。

 

本文涉及到的程序仅限于keil4下的C51编译环境。本文内容纯属个人观点,难免有不足之处,希望高手予以指出,本人将不胜感激!

 



回复

使用道具 举报

ID:643751 发表于 2020-2-18 23:52 | 显示全部楼层
全部看完 写的有道理 不知道老哥你什么年龄 我在20200218 在你的所有主题里看了我感兴趣的贴子 价值很高的我都收藏了。感谢 今天很有收货。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表