摒弃面向UI编程

为何喷起此次话题,因为前不久和我们首席架构师沟通,谈起程序设计问题,一不小心把UI扯进来,更把那些按照UI来编程的后台工程师也扯了进来。今天特意百度了一下(其实程序员应该去google一下,奈何需要FQ),确实没有面向UI编程这个概念在市面上流传,大家可以当我是首创吧。需要声明一点,这里喷的是服务器开发人员哦!!

我是一个极具打抱不平的人,浪迹编程十几年,见过太多的程序员因为UI改了,而跟着改程序。当年菜菜一不小心踏入歧途的时候,每天看着《七天入门xxx》乐此不疲,猛烈的消化着书中“极具文化”的内容。然后看着“该死”的产品经理发过来的原型图,费劲脑汁把数据库设计的特别符合原型图,然后开心的干起CUAD,你看,编程就是如此简单!! 而且当年觉得自己不可一世,可以进阶架构师了

原来初生牛犊真的可以不怕虎,是因为虎厉害吗?不,是因为牛犊还太傻X

无论是产经经理,还是前端开发人员,更或者是后端开发人员或者DBA,一切的工作都是围绕业务开展的,产品经理首先是第一个消化并理解业务的人,有的产品经理自己还未消化业务就做出原型图,概念图脑图等等,这些产品经理其实才是该死的。当产品把业务正确的用UI表达出来之后,业务便传到了客户端人员,至于服务端代码编写人员如果按照UI来理解业务,甚至设计数据库表,那多半是掉坑里了

无论是客户端人员还是服务端人员,写代码之前首先第一要做的,而且也是最重要的就是消化业务内容,把业务消化了写起代码来,有时候会对那些将来有扩展性的地方情不自禁留出扩展点。业务有时候就是要做一件事的过程,数据的流向而已,整体把握了才能设计出可以掌控的系统。

面向业务编程

其实上面说了这么多,都比较“抽象”,别人会说你写的什么JB玩意,骂归骂,但是不能侮辱我对技术的热爱~~~

喷了那么多看一个原型,话说这个产品画的还是不错的

一个简单的发帖动态内容的展示,如此简单的需求,你的系统该如何设计呢?

错误1

根据UI的设计,很多人第一步就开始设计数据库对应UI

字段 介绍
Id 动态id
PublishUserId 发布人id
PublishUserName 发布人姓名
PublisherUserImg 发布人头像
..... ....

很多人会这样设计,其中不乏有些高级程序员,我自认为这样是错误的,说说我的想法,欢迎你们来喷。这是一个简单的动态展示,仔细分析你会发现这个业务其实包含一些子业务:动态的发布人业务,动态内容业务,动态内容产生的外围业务(点赞,留言,收藏等),如果硬是对应到表设计,也应该包含这三部分内容。

任何数据库设计都不应该一一对应UI,UI只是你设计的参考而已,只是很多情况下业务模型正好和UI对应而已

错误2

很多人把发布人的姓名,头像保存在了动态表,我认为这个还要看这个动态的定义,如果动态的发布人明确了不会随着发布人信息的修改而变动,这个确实应该一次性保存,如果反之,只存一个用户Id足以,这样还可以避免因为发布人修改信息而带来的同步数据问题,要知道数据一致性这块其实是很烦人的。

不要让UI的显示内容,影响你的业务设计

错误3

动态的内容后续产生的数据(点赞,收藏,评论)这些业务在动态中都有量化,那这个具体的数据量化值很多人选择在动态表中添加对应的字段(点赞总量,收藏总量等等)。其实我不建议这样做,原因如下:

  1. 如果新建了这些字段来保存,动态的每一次产生结果都需要更新对应的字段,同时还要保证这个值和详细列表的数据一致性,不能产生100条评论,但是评论列表只有99条的情况发生。
  2. 如果将来又新加了一条新的业务,比如分享的数量,那是不是还要在加一个分享量的数据表字段呢?
  3. 如果你读过菜菜以前的文章,应该知道菜菜一贯的尿性,这种动态的东西最适合做缓存,无论你愿意与否。至于这些点赞总数等这些类似业务,仔细分析只不过是属于动态内容的后续业务,应该包含在整体业务之中,如果非要撸一行代码:
public class Topic
{
public int Id;
public string Content;
...
public int ThumbUpNumber: //点赞数量
public int CommentNumber; //评论数量
...
}

需要注意一点:我以上代码代表的是业务对象,可不是对应的DB中的表哦,这个业务对象也是我们要缓存的对象,当新加一条评论或点赞的时候,只不过是缓存数据的+1操作而已,至于这个数据值的初始化,完全可以由详情表来提供,在真实的业务中,点赞或者评论的数据量很少到达万级别,所以对于select count(0)这个操作来说都不是问题,一旦初始化完成做了缓存,后续的增加数量完全在内存中完成。

这里我想喷:任何业务数据库都不是架构设计的中心

写在最后

一个业务的成败在于产品设计,一个系统设计的好坏,成败在于程序员,在业务正确的情况下,请先消化掉业务再开始设计系统,UI只是你消化业务的参考,UI只是你业务的具体可视化体现。

程序员过关斩将-- 喷一喷坑爹的面向UI编程的更多相关文章

  1. 程序员过关斩将--redis做消息队列,香吗?

    Redis消息队列 在程序员这个圈子打拼了太多年,见过太多的程序员使用redis,其中一部分喜欢把redis做缓存(cache)使用,其中最典型的当属存储用户session,除此之外,把redis作为 ...

  2. 极客时间-左耳听风-程序员攻略-异步I/O模型和Lock-Free编程

    异步 I/O 模型 异步 I/O 模型其中的设计模式或是解决方法可以借鉴到分布式架构上来. 史蒂文斯(Stevens)在<UNIX 网络编程>一书 6.2 I/O Models 中介绍了五 ...

  3. 程序员过关斩将--面试官再问你Http请求过程,怼回去!

    菜菜哥,X总在产品部瞎指挥,作为程序媛的我都快撑不住了 不光你撑不住了,大家都要撑不住了,外行人指导内行人,呵呵 前天我偷偷的去面试了,结果挂了 出去转转其实是好事,面试官问你什么了? 他让我描述一个 ...

  4. 程序员过关斩将--cookie和session的关系其实很简单

    月高风下,下班路上.... 菜菜哥,告诉你一个秘密,但是不允许告诉任何人 这么秘密,你有男票了?~ 不是,昨天我偷偷去面试了,结果挂了 这不是好事吗,上天让公司留住你..... 好吧,不过还是要请教你 ...

  5. 程序员过关斩将--更加优雅的Token认证方式JWT

    菜菜,上次你讲的cookie和session认证方式,我这次面试果然遇到了 结果怎么样? 结果面试官问我还有没有更好的方式? 看来你又挂了 别说了,伤心呀.到底还有没有更好的方式呢? 你猜? 基于To ...

  6. 简明python教程 --C++程序员的视角(五):面向对象的编程

    面向对象的编程 在大多数时候你可以使用过程性编程,但是有些时候当你想要编写大型程序或是寻求一个更加合适的解决方案的时候,你就得使用面向对象的编程技术. 对象可以使用普通的属于对象的变量存储数据.属于一 ...

  7. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  8. 【转载、推荐】不要自称是程序员,我十多年的 IT 职场总结

    注评:一气读完后,有些和我的观点类似.这篇文章显然是外国老写的,但是不妨碍我们的跨国交流. 如果我可以给每个工程教育增加一门课,它不会涉及编译器.门电路或是时间复杂度,而是一门介绍行业现实的入门课,因 ...

  9. <转载> 优秀程序员必备的23条好习惯

    转自 优秀程序员必备的23条好习惯 编程是一项聪明人玩的游戏,它既是对智力的考验,也是对习惯的考验,智力的好坏取决于父母的基因,人们无从左右,但习惯的好坏却是可以不断培养.一项由美国芝加哥大学国家研究 ...

随机推荐

  1. EmguCV从位图(Bitmap)加载Image<Gray,byte>速度慢的问题

    先说背景.最近在用C#+EmguCV(其实就是用P/Invoke封闭了OpecCV,与OpenCVDotNet差不多) 做一个视频的东西.视频是由摄像头采集回来的1f/s,2048X1000大小,其实 ...

  2. python 入门手册

    python 入门手册 Introduction 这个手册是为了让学习者好好的重塑对于编程的认识,我们要来认识到怎么来在陌生的领域学习,学习的技巧开始,通过官方文档来学习 开端 利用IDE输出&quo ...

  3. python数据类型:列表List和Set

    python数据类型:列表List, Set集合 序列是Python中最基本的数据结构 序列中每个元素都分配一个数字,表示索引 列表的数据项不需要具有相同的类型        列表中的值可以重复并且有 ...

  4. Inventor 卸载工具,完美彻底卸载清除干净Inventor各种残留注册表和文件

    一些同学安装Inventor出错了,也有时候想重新安装Inventor的时候会出现这种本电脑windows系统已安装Inventor,你要是不留意直接安装,只会安装Inventor的附件,Invent ...

  5. 浅谈URL重定向

    转载:https://blog.csdn.net/kiyoometal/article/details/90698761 重定向原理 HTTP 协议的重定向响应的状态码为 3xx .浏览器在接收到重定 ...

  6. id0-rsa WP合集

    忙里偷闲做做题wwwwwwwwwwwww Intro to Hashing Intro to PGP Hello PGP Hello OpenSSL Intro to RSA Caesar Hello ...

  7. 机器学习入门-逻辑(Logistic)回归(1)

    原文地址:http://www.bugingcode.com/machine_learning/ex3.html 关于机器学习的教程确实是太多了,处于这种变革的时代,出去不说点机器学习的东西,都觉得自 ...

  8. 探究 "dependencies" vs "devDependencies"

    在之前学习发布npm库的时候,感觉才真正弄懂了--save-dev和-save之前的区别. –save 当我们开发一个npm模块的时候,如果使用--save 大专栏  探究 "depende ...

  9. Vue Zero · 啟

    其实,一开始我应聘的是Spark,Hadoop这样的,然后后面呢,发现只有Java的业务给我写了,再后面我发现,公司招不到前端,所以前端要由后端来写,刺激!!! 数据驱动 首先要明白一个概念,那就是D ...

  10. Vue的fetch的概述和使用

    Fetch基本概念 (前端小白,刚学习vue,写的不好或是不对,请各位大佬多多指正!感激不尽!) Fetch 是一个现代的概念, 等同于 XMLHttpRequest.它提供了许多与XMLHttpRe ...