`
xitong
  • 浏览: 6193927 次
文章分类
社区版块
存档分类
最新评论

程序的本质在于逻辑

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


分享到:
评论

相关推荐

    JSP/Servlet Java面试逻辑题

    1、说一说Servlet的生命周期?★★★★★ 答: servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。...这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域。

    Java高级程序设计实战教程第一章-Java编码规范.pptx

    1.2.1 文件后缀名 表1-1 Java程序使用的文件后缀名 文件类别 文件后缀名 Java源文件 .java Java字节码文件 .class 其中两者最本质的区别在于,.Java文件是供虚拟机运行时执行的文件, 而.class文件可以让你在任何一...

    C语言程序设计标准教程

    在赋值表达式中给变量赋值,如: a=567 在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。 这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能...

    数据结构习题考研系列

    抽象数据类型的定义仅取决于它的逻辑特性,而与其在计算机内部如何表示和实现无关。无论其内部结构如何变化,只要它的数学特性不变就不影响它的外部使用。抽象数据类型和数据类型实质上是一个概念。此外,抽象数据...

    通讯z中断分析数据抓取

    通讯中断分析CP通信丢包原因总结丢包:如果通信中发现缺少数据或者丢包,那么可能在于程序发送的过程或者接收的过程出现问题,或者传输线路出现干扰 ----- 1.提高缓冲区能力 2. 处理recv、 send。比如在取数据之前...

    java面试题自己总结的ssh较多

    Jsp在本质上就是servlet,但是两者的创建方式不一样,servlet完全是java程序代码构成更擅长流程控制和事务处理。 Jsp有html和jsp标签构成,可以方便地编写动态网页,因此在实际的应用中采用servlet来控制业务流程,...

    电子计算器的设计.doc

    3 2.4 梯形图 4 2.5程序运行 6 第3章 电子计算器PLC监控系统设计 7 结论与体会 8 参考文献 9 附 录 10 第1章 电子计算器控制工艺分析 1.1 PLC简介 PLC英文全称为Programmable Logical Controller即:可编程逻辑控...

    电子计算器的设计(1).doc

    3 梯形图 4 程序运行 6 第3章 电子计算器PLC监控系统设计 7 结论与体会 8 参考文献 9 附 录 10 第1章 电子计算器控制工艺分析 PLC简介 PLC英文全称为Programmable Logical Controller即:可编程逻辑控控制器,...

    软件设计规范

    1)是逻辑的过程,总体的过程和子过程的观察和校验程序。2)软件的量层次上,软件的规模、运行强度和稳定性指标的自测试程序。 第二阶段 一定要有一个标准。软件如衣服,软件的交付文档应当显示出衣服是如何编织...

    cpu模型机课程设计.zip

    微指令格式确定后,微程序的横向设计在于正确地选择数据通路,纵向设计在于确定后继微指令地址.事实上,微程序设计的关键在于纵向设计,即如何确定下一条微指令的地址。通常的做法是先确定微程序分支处的微地址,...

    软件工程-理论与实践(许家珆)习题答案

    答: ● 软件是一种逻辑产品,具有无形性;  ● 软件产品的生产主要是研制;  ● 软件不存在磨损和老化问题,但存在退化问题;  ● 软件产品的生产主要是脑力劳动;  ● 软件产品的成本非常昂贵,其开发...

    网络安全外文翻译.doc

    防火墙实质上是一个独立的进程或一组紧密结合的进程,运行在路由器或服务器上以 控制经过防火墙的网络应用程序的信息流。一般来说,防火墙置于公共网络(如Intern et)入口处。它们可以看做是交通警察。防火墙的...

    论文研究-国防工程震害风险分析体系的ISM研究.pdf

    遵循解释结构模型的本质思想和工作程序,在确定国防工程震害风险分析体系逻辑关系的基础上,给出国防工程震害风险解释结构模型组件方案,研制基于窗体界面线程设计的国防工程震害风险分析解释结构模型算法组件,求解...

    为什么ChatGPT是生产力革命(2023).pdf

    智人和动物核心的区别在于语言,在于能够描述虚拟事物的语言 语言到底是个什么东西,人类自己都没有研究清楚 图灵测试的本质就是对话测试,有人类的对话能力就意味着有人类的智能人工智能攻克图像识别之后再攻克语义...

    IDA反编译软件-windows版本的

    十年前诞生时,IDA还是一个基于控制台的MS-DOS应用程序,这一点很重要,因为它有助于我们理解IDA用户界面的本质。除其他内容外,IDA的非Windows和非GUI版本仍然继续采用源于最初DOS版本的控制台形式的界面。 就其...

    AssortedMkvTools:一个简单的C#应用​​程序脚本,它将MKV文件中的所有FLAC音轨转码为AAC编码的音轨

    逻辑的本质在于mkvMerge语句的构造。你为什么要制作这个剧本Popcorn MKV音频转换器(或更确切地说是eac3to)无法处理损坏的FLAC块(它发生的频率比您想象的要高),我真的不喜欢FLAC,因为我认为它占用了无用的空间...

    ado[1].net中文手册 学习 ado.net的重要资料

    面对该问题,软件设计者可以选择将服务器的业务逻辑处理和用户界面处理划分到单独计算机上的单独层上。实际上,应用程序服务器层将替换为两层,缓解了系统资源缺乏。 该问题并不是要设计三层应用程序。相反,它是要...

    逆向神器IDA 6.8绿色完整版

    十年前诞生时,IDA还是一个基于控制台的MS-DOS应用程序,这一点很重要,因为它有助于我们理解IDA用户界面的本质。除其他内容外,IDA的非Windows和非GUI版本仍然继续采用源于最初DOS版本的控制台形式的界面。 就其...

    JAVA程序员面试题

    这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域 3.Request对象的主要方法: setAttribute(String name,Object):设置名字为name的request的参数值 getAttribute(String name):返回...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    3.1.4 逻辑运算符和表达式 109 3.1.5 条件运算符 112 3.1.6 switch语句 113 3.1.7 无条件转移 116 3.2 重复执行语句块 117 3.2.1 循环的概念 117 3.2.2 for循环的变体 119 3.2.3 while循环 126 3.2.4 do-...

Global site tag (gtag.js) - Google Analytics