程序的本质在于逻辑

简介:
有时候,特定的场合下,你会发现写一个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排查将要耗费的时间。如果仅仅是想证明一下自己的能力,那么可以胡乱搞,怎么都行...然而事实是,对于软件工程,实验室的成果不算什么成绩,也不能体现你的能力,因此除非你是大学或者研究机构专业搞研究的,否则不要总是用实验室的结论来为自己抹金。

        程序的本质在于逻辑,其它的有的是浮云,有的是浮云下面的东西...



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1268971

相关文章
|
4月前
|
Android开发 iOS开发
Android项目架构设计问题之将隐式跳转的逻辑进行抽象和封装如何解决
Android项目架构设计问题之将隐式跳转的逻辑进行抽象和封装如何解决
53 0
|
人工智能 大数据 程序员
一文看懂开源图化框架中的循环设计逻辑!
相信大家在日常工作中,已经精通各种循环逻辑的实现。就拿我来说吧,多年的工作经验,已经让我可以熟练的使用 C++,Python,英语等多种语言,循环多次输出“hello word”。不过大家有没有想过一个这样的问题:如何在一个有向无环图(Directed Acyclic Graph,简称dag)中实现循环呢?
766 0
一文看懂开源图化框架中的循环设计逻辑!
一个 C#例子,代码简化的过程
一个 C#例子,代码简化的过程
70 0
|
安全 搜索推荐
如何避免写重复代码?两种常见的方法:抽象和组合
如何避免写重复代码?两种常见的方法:抽象和组合
265 0
|
安全 Java API
了解程序运行逻辑的必要性及应用和硬件的关系
了解程序运行逻辑的必要性及应用和硬件的关系
118 0
|
SQL 缓存 安全
如何避免写重复代码:善用抽象和组合
通过抽象和组合,我们可以编写出更加简洁、易于理解和稳定的代码;类似于金字塔的建筑过程,我们总是可以在一层抽象之上再叠加一层,从而达到自己的目标。但是在日常的开发工作中,我们如何进行实践呢?本文将以笔者在Akka项目中的一段社区贡献作为引子分享笔者的一点心得。
163 0
如何避免写重复代码:善用抽象和组合
|
Java 缓存 存储
程序设计的5个底层逻辑,决定你能走多快
阿里妹导读:肉眼看计算机是由CPU、内存、显示器这些硬件设备组成,但大部分人从事的是软件开发工作。计算机底层原理就是连通硬件和软件的桥梁,理解计算机底层原理才能在程序设计这条路上越走越快,越走越轻松。从操作系统层面去理解高级编程语言的执行过程,会发现好多软件设计都是同一种套路,很多语言特性都依赖于底层机制,今天董鹏为你一一揭秘。
7584 0
|
新零售
IT的本质是什么?
之前研究新零售,注意到银泰百货提出:零售的本质是商品。 商品 > 价格 > 其他服务。 而新零售就是:互联网+零售数据规模化放大零售本质的过程。 除了新零售、还有新制造、新金融、新XX …… 新XX=互联网+XX数据规模化放大XX本质的过程。
1584 0
|
人工智能 运维 数据处理
解密阿里云顶层设计和底层逻辑
几十个问题,万字长文,阿里云新任总裁行癫履新后首次深入讨论阿里云对云计算未来的判断,深度解读未来阿里云生态战略,揭秘阿里技术委员会和阿里中台思想的原生思考。
5540 0