你的开发为何如此低效?


版权声明


在开发中,编码我们有分层架构、设计模式做为套路来高效开发,但你也知道编码不是开发的全部,一个完全的开发流程用面向对象思想来概括,它分为OOA(面向对象分析)、OOD(面向对象设计)、OOP(面向对象编程)。一个好的代码结构是需要需求分析,架构设计做为辅助的,Stay尝试向你描述一个理想高效的工作流程,有了这个套路,不仅能让你缩短编码时间,还能得到团队的认可。

关于高效开发,大多数人的第一反应就是成熟的分层架构、设计模式以及第三方lib。这些给了我们设计准则还有便利的工具更快的去做需求实现。

高效开发还有另外一层含义,关于一个团队他要如何去提升团队的整体开发效率、缩短开发周期,能够一步一步去更快速的产品迭代,在这个过程中你要做好需求分析,架构上的设计。

今天的主题是撇开技术和大家聊聊高效开发的一些套路与实践。


如何提升个人开发效率

如何来提升开发效率?我们先来粗暴的对比一下,同样一个需求,不同的角色会如何来着手实现,然后我们再来看差距在哪里?

这个图我想大家应该都能看懂。

一个需求如何被处理,从初级开发工程师到中级再到高级、架构师他们处理的方式流程是不一样的。

例如你是一个新人,刚到了一家公司,被委派了一个任务,可能直接就去搜索了。因为分配给你的任务是拆分出来一个比较具体、比较小的功能,所以不需要去做什么架构上的分析,只需要去做具体的实现。对于一个实现者而言,他只需要去搜索或者去找以前自己写过代码,最笨的方式才是自己去手写。不过呢,不是所有实现都是可以面向Google编程的,单纯的复制粘贴会让你的代码增加隐患,而你也知道,这是相当危险的,而且也不会有技术沉淀。

当你工作一两年,对一些工作流程比较熟悉后,再拿到一个任务就会想应该如何去解决这个问题,当然这个时候你的任务也从小功能变成了一个模块。这个业务是什么样子的,应该如何去做分析,拆分成一个个小功能,然后有针对性的去搜索,虽然搜来的不能完全满足你的需求,但你只是要个解题思路,借鉴下稍微做下适配就可以实现啦。

而对于高级开发工程师或架构师来说,拿到的任务就是一个比较庞大的、成体系的一个模块或者一个系统。所以要考虑的事情要比初级或中级要多的多,这时候就得做需求分析,架构上的设计,并且在设计的时候,还得去考虑应该如何解耦,如何分离高层抽象和低层实现,因为具体的实现是要拆分出来交给team中其他人去做的。

不同的角色面对同一个任务时,他们的关注点是不一样的,也就使得工作方式不那么一样。


初级和高级的差距在哪里?

既然我们已经清楚了一个需求不同的人来实现它是不一样的,那么不一样到底在哪里,我们要挖掘那个具体的因素,这样才能知道应该如何做调整。

现在我们的问题就是找出初级与高级的差距到底在哪里,少了哪些环节?

Stay先把视角拉高一点,我们来看看面向对象(Object-Oriented),你可以把OO分为,OOA、OOD、OOP,也就是面向对象的分析(Analysis),面向对象的设计(Design),以及面向对象编程(Programming)

那初级与高级的差距到底在哪里呢?就差在这三部上。

高级开发工程师他会有一个具体的步骤:

  1. 通过OOA来分析业务流程输出模型
  2. 基于模型再做面向对象的设计OOD,借助UML来描述整体的一个业务需求的流程
  3. 以OOD归纳的用例图、时序图、类图做为蓝图来指导OOP
  4. 设计高层抽象,以伪代码的方式串联起整个业务流程
  5. 拆分出一些独立任务交给其他人实现

在面向对象编程的过程中,还可以套用经典的设计模式、设计原则来提升系统的稳定性,让代码变得可测试,可扩展。

对比下初中级呢,他们的关注点更多的放在OOP上,在具体代码实现上。这样就不太能全观整体业务的流转和边界,无法预见需求未来可能发生的变化,仅仅做些重复劳动力对提升开发效率是没有任何帮助的。


跳出`低层实现`这口井

但是啊,让初中级去像高级那样去做OOA、OOD也不现实啊,如果对业务不是很熟悉,一些流程上想得不够清楚,或者没有考虑如何去提升用户体验,没有站在产品角度考虑问题,那么设计出来的架构可能会比较死板,同时也漏洞百出。

这是不是很矛盾?没有经验沉淀,就无法像高级工程师那样思考,做不到那样就只能做低层实现,这样沉淀的太慢了,就像死循环啊,那么我们该如何break出这个loop呢?

那就先从更好的做OOP开始,其实想把一段代码写好,还是有点困难的,关键在于你想写出来的代码能打多少分,及格分是60分,它刚好处于可以跑的状态,偶尔会出点小bug;100分就是通过设计模式设计原则写出的良好代码,它能很好的去做测试、做扩展,那它的稳定性也很强。

如何才能得高分?有一句古话说的很好,读书破万卷,下笔如有神,你做的准备工作越多,底蕴越足,写代码就会越顺畅。

首先第一个是你要考虑的是,这个产品提出的需求有没有得到你的认可,你觉得什么的方式来实现会使得效益最大化。你可以给产品提些建议或者改进,因为你想做一个产品把它做好,你必须要参与进去,即使你做的是比较小的需求,功能,模块。

当你看到感兴趣或者有挑战的任务,得自己去争取这一块的整体的设计和实现,不要被动的去接受一个任务。因为接收来的任务都是别人咀嚼好的,给你定好了条条框框,你只用往里面填实现就可以的,那些都是没有技术含量的。

同时也不要急着去表达这个做不了,那个做不了,安卓做这个很难实现的等等。不要去逃避责任,至少要先做一些真实的调研和尝试,或者选取一些可变通的、折中的解决方案,给对方做选择题,而不是直接拒绝。

在确定了技术选型之后,那么接下来就是哪些人来领哪些任务。领任务的时候,大家不要总是去领那些自己擅长的,每个人都要变得多元化,不仅仅是只会一门手艺(以后只会安卓也不行了)擅长做UI的要去尝试处理复杂业务、能处理复杂业务的也要想想如何处理一些动画自定义UI。

Stay在做代码实现的时候,比较偏向于先实现业务,再去考虑UI上的实现。因为用户体验是一个没完没了的事,你可以把它设计得很好花哨也可以把它设计得很简单,这锅得产品经理去背。而对于业务来说,改动就不会那么频繁了,业务梳理清楚了,还愁不能响应UI的action嘛,并且还有另外一个好处就是业务是testable的,不需要View层也可以测试。假如你上手就画UI,十有八九你就把UI和业务耦合在一起,连剥离复用都很难做到,更别提写测试用例啦。

写代码不可能一天写满八小时,也不可能说一天就能把整体的业务全部写完。如何可持续地做开发,最最重要的是,得有一个蓝图、一个清晰的高层抽象结构,有了高层定义再一个一个往里面填具体实现就可以了。(可以参考下毛胚房装修的全过程)

如果实在是总结不出适合自己的套路,那就用‘书读百遍其义自现’这一招好了,但读是远远不够的,还得写代码,写完了还要想如何去改良。


重新理解开发流程

刚才Stay给大家描述的是一种抽象的实施方式。接下来给大家做个示范:

高效开发Stay觉得应该分为,OOA、OOD、OOP,跟我们刚才讲的那个是一样的。先得有需求分析,再做流程设计,最后才是代码实现。

本想写个完整的案例,奈何精力有限,后续有时间再补上:)


开发环节中的角色扮演

从OOA、OOD再到高层抽象架构和低层实现,不同角色的职责是不一样的。请看图说话:

很多工作两三年的同学都会焦虑,‘焦虑的是技术不能走的长久,30岁以后就走管理吧’。有这样的焦虑不是什么错,错的可能是你对管理没有一个非常明确的概念。你知道如何做一个合格的管理吗?他的职责是什么?他比起其他角色,突出在哪些能力?

就这一点,Stay想分享点自己的观点(仅局限于技术管理层面):

刚才Stay一直在强调OOA、OOD、OOP,是因为站在一个管理的层面,想要产品稳步迭代,需要让每个环节变得可控。

  • 想象下,如果需求分析不对,大量的业务代码要重写,这是潜在风险。
  • 想象下,如果业务设计不够明确,没有提前定好规则与约束,大量的代码都会是一次性的,也就导致了冗余和低效,这是技术债务,迟早要还的。
  • 想象下,如果代码不够解耦,未来修改会导致牵一发而动全身,使得重构困难,又无法满足产品快速迭代。

正因为要避免这些不可控的因素,才会有了职责的细分。有了项目经理、售前、架构师、技术负责人、开发人员。当然在小公司,职责没那么清晰,可能一个技术负责人就cover所有职责了,如果你做为开发人员经常加班,进度缓慢,可以反思下,你的leader是在哪些环节做的不够好而导致低效,你能否分担一些。

从职业发展的角度来说,大家都是自下而上从d1、d2、d3这样的小角色慢慢往上走的,除了技术需要不断深入,未来转管理还需要有抽象思维、业务能力、沟通协作,这些并不比写代码简单多少。

也不要觉得目前自己只是一个小角色,只能替大佬擦擦鞋。不要这么想,每个人都应该更好的表达自己,更好的去体现自己在一个团队的价值。如果你做不到这点的话,你就很有可能被替换掉。所以多做一些事情,不要怕犯错,多去和其他部门沟通交流,要把自己耦合到每一个部门中去。重构最怕强耦合,想要开掉你,团队还要有一个阵痛期呢,对不(奸笑)


来个收尾

虽然通篇没讲技术,但不代表我觉得技术没用哈,支撑产品的是技术,推动产品的也有技术的功劳,只是觉得这个角度很有趣,大家可以再深思下,为什么要有面向对象语言?是业务推动了技术,还是技术革新了业务?

单纯的讲方法论就和鸡汤一样,喝了都说好,第二天就忘记了。这不是方法论的锅,更多的还是自己无法结合整理出适合自己的方法论,同时也是因为眼界不够,过于关注眼前的细节。

那些入行两年就到处和人说自己迷茫,遇到瓶颈的同学,有没有想过是自己的眼界不够呢,是不是把技术开发单纯的理解为堆代码了呢?

时间: 2024-10-26 04:28:16

你的开发为何如此低效?的相关文章

CSDN日报20170428 ——《你的开发为何如此低效?》

[程序人生]你的开发为何如此低效? 作者:Stay 今天的主题是撇开技术和大家聊聊高效开发的一些套路与实践. 点击阅读全文 [深度学习]用 TensorFlow 创建自己的 Speech Recognizer 作者:Alice熹爱学习 语音识别无处不在,siri,google,讯飞输入法,讯飞语记,智能家居,车,etc. 每天都在用的,很好奇它是怎么实现的,今天来看看这么便利的东东到底是什么样子呢. 点击阅读全文 [Web 前端]2017 年前端面试题最新汇总 作者:郭小北 由于过了五一就是面试

OpenCL学习笔记(一):摩尔定律、异构计算与OpenCL初印象

关于摩尔定律: 摩尔定律1965年提出,晶体管密度是按照每年翻倍发展的,之后的趋势也是这样--每一代芯片的的时钟频率提高50%,而同时工艺节点减小了0.3,功耗密度翻倍(保持功耗相同的情况下,面积0.7*0.7=0.49,因此提高频率使得性能提升了):而在2000年中期之后,出现了物理尺寸更小的器件,意味着,我们没有办法保持功耗密度不变,而同时提高频率,结果我们看到自此之后,时钟频率并没有显著提高,需要通过并行来提高性能,所以多核CPU流行起来.即使是最基本的处理器,超标量和无序指令执行等高级体

50 篇 Android 干货文章

转载:https://zhuanlan.zhihu.com/p/27404523 目录 热门技术 View 代码封装 源码分析 精进之路 热门技术 Kotlin初探Kotlin成了Google的亲儿子,现在赶紧来学学跟着google学习mvp架构跟着google学习mvp架构(clean篇)给初学者的RxJava2.0教程(一) :基本工作原理给初学者的RxJava2.0教程(二) :强大的线程控制给初学者的RxJava2.0教程(三) :map和flatMap操作符给初学者的RxJava2.0

Flash 终于走向死亡!Flash 的兴衰之路你知多少

作为最大名鼎鼎的网络多媒体技术之一,Flash的名号可谓是无人不知无人不晓.然而,触手曾伸及形形色色网站的Flash,现在终于要退出历史的舞台.Adobe已经宣布,Flash将会在2020年停止开发和更新,这意味着Flash已经彻底走向淘汰.盛极一时的Flash,是如何被人抛弃的?明明是Flash先来的,玩小游戏也好,看视频也好,实现各种复杂的交互也好,但为什么Flash会被HTML5取而代之?今天,就一起来谈谈关于Flash的话题吧. Flash将在2020年被彻底淘汰 Flash:曾是互联网

Python参数类型以及常见的坑

导语 ??由于之前遇到过几次有关于参数类型的坑,以及经常容易把一些参数类型搞混淆,现在做一下有关参数类型的总结记录以及对之前踩坑经历的分析. 参数类型 首先我们列举一下有关于Python的参数类型,以及实际上的运用和原理. 位置参数(必选参数) 默认参数 可变参数 关键字参数 位置参数(必选参数) 首先是位置参数,同时也被称作必选参数,位置参数很好理解,只要记住这点: 在函数定义时直接给定的此参数名称,调用时按照参数的位置顺序,依次赋予参数值. 示例: def person_info(name,

开发人员如何提高工作效率一:找出低效的原因

[高效能系列]开发人员如何提高工作效率一:找出低效的原因 高效能工作系列开篇,就以这一篇开发人员如何提高工作效率作为第一篇内容,写这个高效能工作系列的目的很明显,寻找各种可行的方法来提高自己的工作效率,包括时间管理的方法,如何实现目标等 1.  今天这篇的内容是找出效率低下的原因,有低效的开发人员,反过来就是高效的开发人员,那么这两者的效率差体现在哪里呢,把自己的情况也放进去比较                      十二个可让你效率提高的方面 比较方面 熟练人员 一般的开发人员 我 (20

敏捷软件开发VS传统软件工程

敏捷软件开发:又称敏捷开发,是一种从1990年代开始逐渐引起广泛关注的一些新兴软件开发方法,是一种应对快速变化的需求的一种软件开发能力. 与传统软件工程相比,它们的具体名称.理念.过程.术语都不尽相同,相对于"非敏捷",更强调程序员团队与业务专家之间的紧密协作.面对面的沟通(认为比书面的文档更有效).频繁交付新的软件版本.紧凑而自我组织型的团队.能够很好地适应需求变化的代码编写和团队组织方法,也更注重软件开发中"人"的作用. 本文将介绍敏捷软件开发的历史背景与发展,

Python开发【第十篇】:RabbitMQ队列

简介 RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现. 安装 首先安装erlang环境. 官网:http://www.erlang.org/ Windows版下载地址:http://erlang.org/download/otp_win64_20.0.exe Linux版:yum安装 Windows安装步骤 第一步运行 第二步 第三步 第四步 第五步 Erlang安装完成. 然后安装RabbitMQ,首先下载Rabbit

聊聊移动端跨平台开发的各种技术

介绍 最近出现的 React Native 再次让跨平台移动端开发这个话题火起来了,曾经大家以为在手机上可以像桌面那样通过 Web 技术来实现跨平台开发,却大多因为性能或功能问题而放弃,不得不针对不同平台开发多个版本. 但这并没有阻止人们对跨平台开发技术的探索,毕竟谁不想降低开发成本,一次编写就处处运行呢?除了 React Native,这几年还出现过许多其它解决方案,本文我将会对这些方案进行技术分析,供感兴趣的读者参考. 为了方便讨论,我将它们分为了以下 4 大流派: Web 流:也被称为 H