解决问题的能力 10倍程序员

大家好,我是Z哥。

今天我们聊的话题对大多数人来说应该都算是一个“痛点”,就是怎么提高自己解决问题的能力。

我们的工作中,每天会遇到大大小小的很多问题。其中有些是之前从未遇到过的问题,这对很多人来说就会很棘手,不知道该怎么解决,可能吭呲吭呲折腾好几天都不一定能搞定。

但是身边往往也一定会存在这么一小部分人,好像无论什么问题,到他们那就能够顺利地解决。

难道他们真的只是“看得多,懂得更多”而已吗?

我根据我身边所接触的人群来看,还真不是。

根本原因我认为是他们有自己的一套成体系的思考策略。表现出来的“懂得更多”而是基于这些策略经过时间的打磨后产生的结果,而不是原因。

之前看过一个淘宝技术团队里的故事。

当时某个小组遇到一个问题,组内的几位成员搞了好几天没搞定。没办法,不得不跨部门去请教多隆大神,多隆5分钟后回复了一个解决方案,他们试了下果真把问题解决了。

所以你看,解决问题的能力高低可以差距那么大,远远超过所谓的10倍程序员的概念。而这其中能不能掌握正确的思路至关重要,但是我们很多人往往是“脚踩西瓜皮”,滑到哪算哪。

很多人平时遇到问题,最习以为常的就是四连招,「打开百度,复制,黏贴,点击搜索」。

然后就扫一眼标题去点开觉得靠谱的网页去看。

这样解决问题的方式从形态上大致是下面的这样子。

这其实是一种最理想的状态,从「问题」直接对应到「解决方案」。但现实是,建立这个对应关系其实没那么容易。就像找对象,你想在忙忙人海中找到你命中注定的另一半,还不想刻意去找,TA就出现在你眼前的概率有多少?

我们的人性深处就是喜欢「低投入高收益」的事情。希望正好有人和我遇到一样的问题,并且还解决了,同时还花时间整理成文发布在了网上。然后,自己可以顺手摘下这个果实,解决眼前的问题。

但现实往往是,

  • 没人和我遇到一样的问题哎。

  • 这个问题和我的有点像,但是又不完全一样,没法用。

  • 这个人和我遇到了一样的问题哎,但是下面没人回复怎么解决的,扎心……

要摆脱这种状态,就得培养自己解决问题的思路体系。

我们可以这样来考虑。

把解决问题的过程想象成是一个“漏斗”,逐渐收敛,最终定位到某几个具体的解决方案

这个“漏斗”分为几个阶段,场景分析、定义问题、建立假设、验证。

每个人大脑中所沉淀下来的「经验」,其实就是将经过这个漏斗走过一遍的路线图保存在了你的大脑里,然后才达到了“开箱即用”的状态。

/01 场景分析 when where/

大家都知道,很多问题其实背后的本质是一样的,只是换了一个外壳出现在你的面前。

比如,当你看到一个程序内存占用持续上升,和从系统日志中看到这个程序有内存溢出的错误日志,你很容易得到它们背后的原因都是一样的,某些对象使用完后没有释放资源。

但是,当你在实际解决一个问题的时候,还是不能把问题所在的场景给忽略了。因为这里面埋藏着导致这个问题的“变量”。

  • 这个问题是在一个什么场景下发生的?

  • 这个场景的完整过程是怎样的?

只有搞清楚了所处场景,你才能顺藤摸瓜找到问题的根源。否则你的系统化思维也培养不起来,而且系统化思维对于做接下去的第二点也很重要。

/02 定义问题 what/

当你通过百度搜索一个问题的时候,输入的内容越多,得到的结果越精确,对你价值越大,但是结果的数量却越少。与之相反的是,输入的内容越少,得到的结果越泛,但是数量越多。

当第一种方式不管用的情况下,想要得到更多有价值的信息,前提条件就是要我们提炼出合理的关键字。

因此,能否把一个问题定义的够清楚,触达问题的本质显得格外重要。

其实世上本无“问题”,“问题”源于现状与期望之间的「差距」

当你觉得现状符合你的预期的时候,哪还有什么问题啊。比如,我们做程序员的小伙伴预期是什么?永远没有bug!那么只要出现了bug,就不符合预期,这就是“问题”:D。

回到这个「差距」上,要搞清楚每个问题的「差距」,你就得对这个问题的相关信息有充分的认识,而不是以偏概全。

比如,当你看到一个程序cpu跑得很高,不能简单将其定性为cpu资源分配太小,加大就行了。而要分析看看,对比上周、上月的同期情况如何?如果对比下来差异很大,那么至少这个「cpu需要加大到XX」这个期望就是错误的。

期望错了,问题的定义也就错了。自然后面去解决它的道路也是错的

所以,这第二个环节就是「搞清楚这到底是一件什么事?」

/03 建立假设 why/

这是一个人「解决」问题能力高低的关键。「想得到」才谈得上「去解决」。

很多人在解决问题的时候容易停留在表面,这会导致解决问题的方式指标不治本,后续还会再反复出现。

比如,某个程序发起的请求出现超时,发现超时时间的配置是5秒。首当其冲进入大脑的解决方案是,改长啊,改成10秒。

上面提到的「程序cpu跑得很高」的例子也是这样。

这就是典型的还没找到原因,就去解决问题的例子。虽然短期内,从表象上看着问题是解决了,但是根本原因并没有找到,反而是被掩盖掉了。

在不久的将来必定会重蹈覆辙,再次暴露问题。

怎么办呢?建立假设。

这个方法本质上也是易经中的「象、数、理」概念的体现。

任何「现象」的背后一定会存在「数据」的变化,而之所以产生这个变化一定有它的「道理」

其实简单来说就是不断地追问why?why?why?将当前场景中导致这个问题的“变量”尽可能多的挖掘出来。这些变量最终会是一个「树形」的结构,因为你顺带将它们分解好了。

/04 验证 how/

Ok,通过第三步将影响这个问题的众多变量给提炼出来了,那么可以开始逐步验证了。如果这个变量……(这样),会……(怎么样)。

验证假设的时候,需要我们带着批判性思维来质疑自己刚才提出的假设。当然这个有点难,需要练习。

有时候也可以选择动手实践,比如像我们做程序员的,可以实际去改一下代码试试看。只是这会比较费时间一些。

好了,思路捋清楚了,那么具体我们可以怎么做呢?

/01  把思考的过程写下来,画出来/

这其实在倒逼自己转换成“漏斗思维”,而不是想寻求一步到位的结果。

比如,在纸上将前面提到的第一点「场景分析」通过流程图的形式画出来,这样你对整个过程能有更直观的认识,也能更准确的定义问题。(字丑,请见谅……)

像第三点的建立假设也可以在纸上画出来。比如,画个鱼骨图。

/02  帮助解决之后要追问/

很多人找人帮忙解决掉一个问题之后恍然大悟,哦原来是这样子啊。然后就高高兴兴的回去按照对方说的去改了。

只是这样的话,下次遇到类似的问题还是不会。对方身上解决问题的能力一丁点都没学到。

我建议是,当别人告诉你解决方法后,不要停留在结果上。简单多问问,

  • 你是如何想到这里的?

  • 你是如何搜索到解决方法的?

  • 你是根据问题什么输入做出判断的?

这种发问相当重要,通过这种发问其实你是在问别人解决问题的思考方式。别人的思考方式再和你自己的一印证,再问问自己我当时为什么没有想到那个点上呢?我下次再遇到类似问题我应该多考虑点什么呢?

长期以往,你的解决问题的能力会显著超过其他人,并且会大大加强「建立假设」的能力,因为你不是一个人在“战斗”,知识的广度和深度积累更快。

/03  了解上下游/

关于上下游的了解,不用多,只要上一级和下一级就够了。比如,遇到一个数据库的问题,可以了解一下,存储或者操作系统相关的知识。遇到某个模块B的问题,可以了解一下它的上游模块A是做什么的?对这个业务是怎么处理的?下游模块C是做什么的?对这个业务是怎么处理的?

这间接也是在为强化漏斗第三环的能力。

/04  关键字也需要迭代/

其实想用好搜索引擎,对我们大部分人来说,你不用去研究搜索引擎的原理,提炼好关键字就够了。

关键字的选择一定要屏蔽个性化的内容,比如源代码行数,你自己的方法命名等等。

其次找最有价值的关键字,比如异常的类型、某个系统原生方法或者系统内置变量等等。

关键字上再配合你出现问题的软硬件环境,如java环境、版本号等等。

在搜索过程中许多网页虽然没有明确提供解决答案,但是会提供有价值的补充关键字。所以,你可以借此来迭代你搜索时键入的关键字,以此找到更深或者更广的内容。

其实我们平时所面对的「问题」,存在两种类型。一种是现实中的“异常”,也就是「我知道应该怎么样,但实际不是这样」;另一种是现实中的“痛点”,「我知道这里不好,但是不知道该怎么变得更好」。前者面向当下,后者面向未来,我们这里聊的主要是第一种。

好了,我们总结一下。

这篇呢,Z哥先和你强调了解决问题的能力在不同的人之间可以拉开很大的差距,所以我们要重视培养自己解决问题的能力。

其次,列举了一些我们解决问题能力还不强时会普遍出现的情况,让你判断自己当前所处的阶段做参考。

然后,我建议你通过“四层漏斗模型”「场景分析、定义问题、建立假设、验证」来作为解决问题的思路

最后分享了4个实践技巧,后面有想到再补充。也欢迎大家在留言区分享你的技巧。

希望本文对你有所启发。愿大家都能成为10倍高效的问题解决者:D

推荐阅读:

  • 程序员与「中台」的爱恨交错

  • 认知的高度 = 人生的高度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core 3.1正式发布,还不赶快升级!

点击蓝字关注我们 .NET Core 3.1于2019年12月3日正式发布,这是一个长期支持(LTS)版本,并且将支持三年,这个版本对.NET Core的许多方面进行了改进,建议您尽快升级。 .NET Core 3.1 的变更日志很小。唯一新增…

.NET Core Blazor 1-Blazor项目文件分析

简介Blazor是一个使用.NET技术用于代替JavaScript/typescript的前端WEB框架。在前端开发中使用.NET语言进行书写逻辑有利于我们的性能、可靠性和安全性。并且对于使用.NET开发人员而言,全栈的成本更低。截止文章发布时,.NET Core已经发布了3.1版本&#…

除了HTML、CSS与JS,现在WASM也是标准Web语言

大家应该知道,万维网联盟 W3C 认证的 Web 语言有 HTML、CSS 与 JavaScript,而近日联盟正式宣布 WebAssembly 核心规范(WebAssembly Core Specification)成为官方 Web 标准,这意味着 WebAssembly 成为了第 4 种 Web 语言…

DDD实战与进阶 - 值对象

概述作为领域驱动设计战术模式中最为核心的一个部分-值对象。一直是被大多数愿意尝试或者正在使用DDD的开发者提及最多的概念之一。但是在学习过程中,大家会因为受到传统开发模式的影响,往往很难去运用值对象这一概念,以及在对值对象进行持久…

C# Lazy Loading

前言按需加载对象延迟加载实际是推迟进行创建对象,直到对其调用后才进行创建初始化,延迟(懒加载)的好处是提高系统性能,避免不必要的计算以及不必要的资源浪费。常规有这些情况:对象创建成本高且程序可能不…

将 WinForms 应用从 .NET Core 3.0 升级到 3.1

点击上方蓝字关注“汪宇杰博客”导语我作为社区里的“拖控件之王”,拖控件贼心不死,有时候会维护一些老项目,其中包括一个2004年的WinForms 软件。9月份的时候我曾经将它迁移到了 .NET Core 3.0,因为代码实现完全没动,…

戴明博士:管理的十四项原则

爱德华兹戴明博士(Dr. W. Edwards Deming)于1982年首版发行的《走出危机》(Out of The Crisis)一书中,提出了组织管理的14条基本原则。书中戴明博士认为:当时的美国企业多致力于追求短期利润,缺乏不断推出新产品及完善…

在Windows系统中构建还原ASP.NET Core 源码

大家好,这几天试着从Github上拉取AspNetCore的源码,尝试着通过Visual Studio 打开,但是并不尽人意。我们需要去构建我们拉去的源代码,这样才可以通过VisualStudio可还原的项目。毕竟AspNetCore是一个巨型的项目集。先决条件在Wind…

蓝桥杯 平面切分(欧拉定理)

问题描述 平面上有 N条直线,其中第 i条直线是 y Ai*x B。 请计算这些直线将平面分成了几个部分。 输入格式 第一行包含一个整数N。 以下N行,每行包含两个整数 Ai, Bi。 输出格式 一个整数代表答案。 样例输入 3 1 1 2 2 3 3样例输出 6基本思路 …

用HttpReports快速搭建API分析平台

HttpReports简单介绍HttpReports 是 .Net Core下的一个Web组件,适用于 WebAPI 项目和 API 网关项目,通过中间件的形式集成到您的项目中, 通过HttpReports,可以让开发人员快速的搭建出一个 API 性能分析的基础报表网站。主要包含 HttpReports …

PAT(乙级) 1001 害死人不偿命的(3n+1)猜想 C++

卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n1。卡拉兹在 1950 年的世界数学家大会上公布了…

他,TypeScript GitHub Star 上海第一,全国第四!GitHub 总标星超两万!

前两天和老同学羡辙(Apache Echarts 核心开发、百度最美工程师)聊天。她分享了一个 GitHub 排名的网站给我。http://git-awards.com/users?typecity&languagetypescript&cityShanghai我看了下 TypeScript star 数量的排名。哇噻!厉害…

PAT(乙级) 1002 写出这个数 (20point(s)) Python

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。 AC代码 i input() count 0 for j in i:count count int(j) d {"0":"ling","1":"yi","2":"er","3"…

[原]排错实战——拯救加载调试符号失败的IDA

本文之前发表的时候有些问题,作为强迫症患者的我又重新编辑后再次发表。如果您已经看过,请忽略。望见谅。缘起 最近想借助IDA逆向一个函数。在windows下,调试器(比如vs, windbg)可以通过调试符号(PDB&#…

数据结构 旅游规划(Dijkstra+Dfs)

题目: 有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路…

如何运用DDD - 实体

概述本文将介绍领域驱动设计(DDD)战术模式中另一个常见且非常重要的概念 - 实体。相对战术模式中其他的一些概念(例如 值对象、领域服务等)来说,实体应该比较容易让人理解和运用。但是我们如何去发现所在领域中的实体呢…

数据结构 最大堆和最小堆

前言: 关于最大堆和最小堆的题目,我做过了很多次,但是好像没有一个是完全独立AC的。2021春季PAT考试的前一天,天梯赛校内赛还专门考了最小堆,我复习了一下,结果第二天PAT考了最大堆,又是没做出来…

Natasha v2.5.4 版与运行时实战

文章转载授权级别:BNatasha 是一个十分便捷的动态构建库,支持.NET Standard2.0 / Core3.0 ; 比起繁杂的 IL 指令和 Expression 的众多 API , Natasha 的构建方式更加友好简洁, 基于 Natasha 可以让动态工作变得傻瓜,简单&#xf…

数据结构 堆中的路径(最小堆)

题目: 将一系列给定数字插入一个初始为空的小顶堆H[ ]。随后对任意给定的下标i,打印从H[i]到根结点的路径。 输入格式: 每组测试第1行包含2个正整数N和M(≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 100…

.Net Core3.1下使用Swagger搭建web api项目

前言:微软于前天发布.net core 3.1正式版,并将长期支持3.1。所以我听到这个消息后就急忙下载.net core 3.1的SDK和Runtime,应该是公司最先用3.1的攻城狮了????。OK!废话少说,今天的目的是基于.net core 3.1建一个web api的项目先下载.net…