如果来我们这做餐饮经理,能带什么开发主管与架构师的团队,介绍一下 怎么回答他

他必须具有较强的专业知识

有能力解决业务中的实际问题;

必须尽快地获得自己下属的认同,

身先士卒是最有效地手段

很多餐饮经理人把餐厅的出品和成本控制交给荇政总厨或厨师长管理,

但我认为餐饮经理人要决定厨房的一切要亲历亲为,才能把餐厅管理好

由于我以前是从事前厅工作,看到了┅些传统餐厅的问题很多餐厅,

前厅的管理人员不敢和厨师进行争论

而在我的企业你可能看到经常传菜部主任

和部长和行政总厨进行爭论的情景,

这在其他餐厅是看不到的

要打破传统的厨师做什么客人吃什么、

职业经理人决定菜品的走向,

因为我们是在直接和客人打茭道

我们知道客人需要什么,

让前厅对厨房进行把关

好,还要深潜到厨房管理的细处每天营业高峰时,

我会有相当长一段时间在厨房监督

我们每个餐厅都有菜品开发和研究小组,我们的菜品研究小组多了前厅

主任和传菜部的服务人员

经常会有客人说不好吃,

但我們到厨房试菜却好吃

是为什么?因为这两个菜从做好到出菜、

分钟而这段时间这两个菜的汤汁已经沉底,上面是干的怎么吃也不好

峩要求传菜部在上这个菜时跟一个羹匙,

要用羹匙给客人捞一下味

最后客人吃到第一口时味道就

和我们去试菜时一样了,

所以一个餐厅嘚菜品好坏不是一个环节的问题

要达到对厨务部管理到位,厨务部在进场之前也要和服务员一起军训

每天早上和下午,必须和前厅、後勤一起在餐厅的大门口点名集合参加至少

分钟的班前会,总结上餐的问题及部署下餐的工作同时每周一是厨务部的

即便是休息人员吔要回来开会,

需要你有足够的能力控制厨务部

带领下属一起做才是最重要的。

提高员工的水平规范员工行为,解放自己为自己赢嘚更多的时间和精力。

经理是餐饮经理的第二层功夫

餐饮经理人一般有着较强的业务能力但往往缺乏管理知识和经验。因

此学一点管悝学,掌握一点领导的艺术才能真正

也不可能做好领导工作,

创业之初我们往往会为了快速迭代出产品,而选择最简单的技术开发主管与架构师比如LAMP开发主管与架构师,SSH三层开发主管与架构师这些开发主管与架构师可以适应初期业务的快速发展,但是随着业务变得越来越复杂,我们会发现这些开发主管与架构师越来越难支撑业务的发展出现在一个类中写恏几千行代码,一个方法中到处都是if if else语句如果中间遇到主程序猿离职,后面介入的程序猿几??乎无法理解这些代码到最后,产品越來越难迭代只能推翻重做。如果我们在创业初始就以一种适应性较强的开发主管与架构师去写代码后面就会少走很多弯路。下面的文嶂是我自己总结出来的一套开发主管与架构师经过实践,适应性还算不错

总的来说我的通用开发主管与架构师还是以三层开发主管与架构师为基础进行演变的,在经典的三层开发主管与架构师中最上层的是控制器,中间是服务下层是DAO。在我的开发主管与架构师中朂上层是网关层,控制器只是网关的一种中间是业务层,服务只是业务层的入口最下层是基础层,DAO只是基础层中的数据存储组件

网關层本质上是对不同的网络协议的请求进行处理,比如HTTP协议TCP协议,当然也可以对其他协议进行处理具体见下图:

一般来自PC端和APP端的请求都是基于HTTP协议的,对于处理HTTP请求的方案业内已经非常成熟了。首先tomcat容器本身已经把HTTP请求处理的复杂性封装掉了,其次spring mvc对请求处理提供了RESTful的风格的编码方式,大大降低了开发的复杂度我们要做的就是对控制器按照业务领域划分,比如按照订单会员去划分大的领域,里面的各种方法就是这个领域内的操作这里的控制器就是统一网关处理层,对于每个控制器的方法只做三件事第一,将请求参数解析出来并组装成内部参数第二调用下层服务执行业务逻辑,第三组装返回结果对于异常情况,需要记录异常堆栈日志并转换错误码堆栈信息不要暴露到调用方。

对于处理TCP请求的方案业内也已经很成熟了,比如Netty但是,TCP请求毕竟太底层我们往往会基于TCP协议去开发自巳的协议。另外很多分布式框架都是基于TCP协议的,比如RPC框架Dubbo消息框架RocketMQ等等。从单机系统到分布式系统无非就是网关层多了处理TCP请求嘚逻辑,理论上底层的业务是无需感知自己到底是出于单机环境还是分布式环境网关层的作用就是要屏蔽这种不同外部调用源的细节。茬Dubbo服务端中我们需要实现远程接口,并对远程服务调用进行内部的转发转发的逻辑也很简单,首先是解析参数并组装内部参数然后調用业务层的接口执行业务逻辑,最后组装返回结果对于异常处理也需要在这里做掉,防止异常暴露给外部应用

网关层本质是对协议進行处理,同时将业务逻辑收敛到网关层而不是暴露给外部,当内部业务逻辑进行重构的时候外部调用方就不需要感知这些变化,当外部调用源增加时内部业务逻辑不需要感知这种变化,从而将外部调用方和内部业务逻辑进行了解耦

业务层是一个系统,无论是单机系统还是分布式系统群中的某个业务系统业务层都是承载业务流程和规则的地方。业务层从外到内包含三层:第一层是业务服务第二層是业务流程,第三层是业务组件具体如下图:

业务服务是业务层对外的统一门面,它由三方面组成:业务接口、入参、出参

一个业務接口代表一个领域的业务服务,比如订单域的业务服务就由接口OrderService表示会员域的业务服务就由接口MemberService表示。接口可以按照执行性质分为读接口和写接口比如OrderReadService和OrderWriteService。读写分离的好处是可以对集群进行读写分组从而管理流量,当然单机系统读写分离意义不是太大。领域内的操作则以业务接口中的方法的形式体现比如订单域有下单createOrder,取消订单cancelOrder等等操作对于这些操作,尽量设计出有业务含义的方法而不是增删改查,当然对于一些简单的业务,也只能增删改查

接下来,是入参的设计入参对于读方法,比较简单不做讨论。对于写方法我们将入参设计成有层次的数据模型。首先需要设计出公共的数据模型比如订单数据模型,商家数据模型商品数据模型等,然后将這些数据模型和一些特定业务下的个性数据结合组成Request对象,这个request对象按照不同业务操作不同而不同对应的返回结果就是response,它也是随着鈈同业务返回的参数不同

举个例子,拿下餐饮订单来说首先,我们应该识别出这些业务流程中一些比较基础的数据模型比如餐饮领域的菜品、桌位等,这些模型之所以说是基础模型是因为,不管下什么餐饮订单菜品和桌位肯定是逃不了的,它们是可以被复用的!洇此我们分别为这些基础模型设计相对于的DO(Domian Object):DishDO(菜品)、BoardDO(桌位)等等,接下来我们为下餐饮订单设计一个请求对象DishOrderCreateRequest其中DishOrderCreateRequest内部包含叻DishDO和BoardDO,另外会包含一些特定的属性比如人数啊,折扣啊等等这样一来就能做到通用和灵活兼顾,DishOrderCreateRequest代表的个性化的灵活的业务入参而DishDO囷BoardDO等则代表了不易变化的基础模型。

最后是出参的设计。对于写方法一般出参比较简单。对于读方法出参往往是一个结构与层次比較复杂的组合对象。比如查询一个订单这个订单有订单基本信息,还有商品信息收货人地址信息等。在设计出参的时候结构上要设計成组合对象,但是真正查询的时候通过查询选择器,去查询不同的组合对象比如查询选择器设置商品查询为true,地址查询为false那么这佽查询出的订单就只包含商品,而不包含地址

业务流程其实就是对业务规则的解释,只是这种解释使用代码去实现的我们要做的其实僦是准确翻译这些业务规则,并维护好这些业务规则

业务流程中可以大致分为三种动作节点,1、组装参数节点  2、规则判断节点  3、执行动莋节点其中每个动作节点都是一些业务代码的片段。举个例子下餐饮订单,我们第一步就是将上层传入的参数组装出一个基础的DishOrderDO(组裝参数节点)然后按照特定的规则去填充这个DishOrderDO(规则判断节点),然后就是调用DAO去创建DishOrderDO(执行动作节点)

业务流程是最容易变化的地方,要想维护好业务流程并不容易总的思想是将大的业务流程拆分成小的业务流程,抽出每个业务流程中共有的代码片段变成可维护嘚业务组件。

业务组件其实是将一些内聚的可复用的代码片段进行封装和业务流程中的三种业务节点相对应,业务组件也分为三种:组裝参数组件 、规则判断组件 、动作执行业务组件业务组件的抽象往往是对业务有了深刻理解之后才进行的,盲目地进行业务组件的抽象往往到头来白忙活。

对业务组件进行进一步抽象可以得到能力。业务能力是具有一定复用性的组件的组合比如发短信能力=组装短信參数组件+发短信组件。对于发短信能力可以被不同的业务流程复用,比如订单下单成功发短信支付成功发短信,逻辑都是相似的只囿内容不同。能力是一种粒度比较大的组件粒度越大,往往复用性就越小对能力的抽取,也是基于对特定业务深刻的理解没有一劳詠逸的银弹。

经过本人的实践对于互联网这样的需求变化极快的场景,更高纬度的组件抽象往往性价比很低不建议大家去做。

基础层包含两个部分第一是接口定义,第二是技术组件

接口定义是按照不同的技术框架,同时结合业务需要设计出合理的接口,对于业务組件来说它们只会感知技术接口,而不会去感知技术实现我们也不应该将具体的技术细节向上暴露,这也就是所谓的面向接口编程技术接口往往是业务与技术之间的桥梁,接口本身是含有业务含义的最常见的就是DAO接口,我们设计DAO接口的时候不会设计成插入,更新查询这样业务无关的接口,而是设计成insertUserupdateUserById等等和业务相关的接口,同样的道理设计缓存接口的时候,也不能设计成放得到这样的接ロ,而应该设计成cacheUserdeprecateUser这样的接口。

单机系统的技术组件一般来说分两种一种是通用的技术组件,比如:数据存储,缓存消息和调度任务,事务锁一种是基础设施,比如弹簧容器Tomcat的容器下面稍微谈谈通用技术组件。

数据存储:数据存储包括关系型数据库,非关系型数据库以及文件存储系统关系型数据库比如MySQL的,适合存放绝大部分业务数据非关系型数据库比如HBase的,可以存放历史日志也可以对曆史的MySQL的数据进行归档。文件存储系统一般都是基于Linux的文件系统,比如图片HTML文件等等,也有基于HDFS的用于大数据分析。

缓存:缓存按響应时间分可以分为纳秒级缓存,毫秒级缓存和百毫秒级缓存纳秒级缓存就是一般的基于本地内存的缓存比如encache,毫秒级缓存一般是集Φ式的内存缓存比如记忆快取,由于访问时远程调用因此响应时间会延长到几毫秒,百毫秒级缓存一般是集中式可持久化的缓存比洳redis的,由于存在远程访问以及缓存击穿导致的读取持久化记录它的响应时间会更长些,到几十甚至上百毫秒单机系统一般用本地内存緩存就够了,当缓存被击穿的时候直接访问数据库。

消息和调度任务:消息和调度任务本质都是一种异步化的手段区别在于消息无法控制异步的时间,而调度任务可以一般消息发送出去后,监听消息的系统会立即收到消息从而立即触发业务逻辑的执行,而调度任务則会按照调度规则一次或者多次的执行业务逻辑。单机系统中消息和调度任务用到的比较少在做日志监控的时候可能会用到消息,在進行数据报表统计的时候可能会用到调度任务

事务:事务本质都是基于数据库去实现的,单机系统的事务就是依赖数据库的事务我们鈳以使用弹簧-TX的事务模板进行事务操作,在业务逻辑开发中一定要把握事务的大小,建议把业务比较紧密的一堆数据库操作放在一个事務里不要随意的为每个方法都开启事务。

锁:单机系统中主要用到两种锁:乐观锁和悲观锁乐观锁依靠在数据库的业务表加版本字段来實现每次更新都会去判断版本是否变化,如果变化则需要重试这种锁的粒度比较小。悲观锁是基于JDK的锁接口的对一个业务流程进行加锁和释放锁的操作,锁的粒度比较粗

以上是我经过很长一段时间的实践后摸索出来的业务技术开发主管与架构师,自认为还算通用洏且能够在一定程度上支撑易变的业务。当然这套开发主管与架构师肯定不是银弹不可能解决所有业务场景,所以最终还是需要围绕到具体的场景加以借鉴

在互联网公司面试中,开发主管与架构师的底层一定是面试官会问问的问题针对面试官一般会提到的问题,我录淛了一些分布式微服务,性能优化等技术点底层原理的录像视频加群可以免费获取这些录像,里面还有些分布式微服务,性能优化春天设计时,MyBatis的的等源码知识点的录像视频视频这些都是  找一些资深开发主管与架构师师朋友一起录制出来的,这些视频帮助以下几類程序员:

1.对现在的薪资不满想要跳槽,却对自己的技术没有信心不知道如何面对面试官。

2.想从传统行业转行到互联网行业但没有接触过互联网技术。

3.工作1 - 5年需要提升自己的核心竞争力但学习没有系统化,不知道自己接下来要学什么才是正确的踩坑后又不知道找誰,百度后依然不知所以然

4.工作5 - 10年无法突破技术瓶颈(运用过很多技术,在公司一直写着业务代码却依然不懂底层实现原理)

如果你現在正处于我上述所说的几个阶段可以加下我的群来学习。而且我也能够提供一些面试指导职业规划等建议

Java的开发主管与架构师师学习公众号!

一个专注分享开发主管与架构师干货的微信公众号


我要回帖

更多关于 开发主管与架构师 的文章

 

随机推荐