【文|风万里】
我们在软件开发的过程中每天都要面对一个又一个的问题。大到项目的需求,小到一个bug的解决。从小的简单的问题到大的复杂的问题,或者从小的复杂的问题到大的简单的问题,问题几乎无处不在。
项目上线后,突发状况会经常出现,有的问题对线上用户影响非常严重,需要在短时间内快速解决。这就需要程序员有快速排查和解决问题的能力。
解决问题的能力是一项基础能力。无论在软件开发中还是在生活中,都必须具备的元能力。
初级程序员常见问题
1.沟通不足
项目中大部分问题都是由于沟通不畅,产品、研发、测试等互相之间对需求的理解不一致,各自为政,断章取义引发的问题。
初手对这个问题犯的较多。经验浅害怕别人反驳自己的观点。新加入一个团队不愿意和其他人产生争执。导致要么按照自己的理解开发需求,解决问题。要么被动的按照老大的想法实现需求,解决问题。
如果老大是一个经验丰富,懂技术,明事理的人,还可以控制风险,不然一定会bug频出,需求做的一塌糊涂。
初手一定要说出自己的观点和想法,适时沟通。
2.经验不足
有些问题需要系统底层知识,有些问题需要了解操作系统原理,有些问题需要懂得架构,有些问题需要前端后端多人协助。面对这些问题,初手经常束手无策。解决一两天无果,白白耗费了时间,耽误了项目进度,也失去了老大的信任。
初手最大的困惑是不知道哪里出了问题,无从下手,空有一身力气。就像你进了迷宫,无论怎么走,都走找不到出口。
这类问题怎么搞定呢?
首先,搜集原有知识和经验,无果后,求助搜索引擎。仍然无法定位后,找老大获取思路和线索。根据老大的指点,设置一个时间点。一旦到了指定时间点仍然未解决问题,再次和老大沟通。解决问题优先第一,合理求助外部资源,控制好时间节点。
3.重视程度不够
有些问题并不是不好解决,也不是很难的问题,只是对待它的重视程度不够。
代码要有规范,关键复杂逻辑要有注释,开发完成一定要自测,英文字母大小写,文案里的中英文标点要注意,这些开发信条在某些人眼里只是个屁,就导致简单的问题频繁出现,问题出现以后很难察觉。给解决问题带来很大难度,最后查出来一个影响系统造成损失很大的问题,原来只是一个标点符号引起的。
细节决定成败,记不住就在桌子上放一个checklist。鲁迅不也在桌子上刻了一个“早”吗?
解决问题需要具备两个心态
1.绿灯思维—打破习惯性防卫
网络里流行这么一个段子:“当你对一个程序员说,你的代码有bug。他的第一反应是:你的环境有问题吧。傻逼你会用吗?这不可能啊?”他的第一反应不是我的代码有问题,换句话说,不是我有问题,而是你有问题。
为什么会这样呢?成甲的《好好学习》这本书里解释了这一现象,叫做习惯性防卫。这是一种常见的心理学现象。当我们的观点和尊严可能会受到挑战时,我们的第一反应是保护自己,而不是思考对方说的是否合理。
初学怕对方怀疑自己的能力,对自己代码的过于自信。导致问题出现后,不是第一时间去分析和解决问题,而是维护所谓的自尊,丢掉了解决问题的最好时机。
在乔布斯遗失的的访谈录中,乔布斯说过这样一句话:“A级人才的自尊心,不需要你呵护。”
自尊心不是用来抵抗质疑,而是用来不断地修正自己。
2.刨根问题拦不住
空指针问题是一个系统最常见的问题,也是出现问题次数最多的问题。产生的原因多种多样,传递数据的“对象”为空,系统进程被清理后遗留问题。时间紧,任务重,一会要发版等各种原因的驱使下,初手一个if语句判空就给解决了,事后再说。如果此问题是异常情况下产生,不容易再次出现,初手就算完成了任务。这势必产生隐患,问题会再次发生。
要有刨根问题拦不住的精神,面对问题只有 揪出“真凶”才能更好的解决问题,避免隐患发生。
如何快速搞定bug
在软件开发的过程中,要有意识的输出log日志,使用debug功能。
问题出现后,第一时间和测试人员找出问题重现方法。如果无法重现问题,就需要使用推演能力。
逐步的排除可能出现问题的地方,使用debug功能,查看输入输出是否合理。要避免侥幸心理,如果未找出真正原因,问题的隐患仍然没有排除,不要靠巧合编程,寄希望于改动一处,系统就会没问题。
配合日志输出,问题再现是解决问题的必经之路。
通用问题解决能力
解决问题的思路是通用的,无论是在生活中,还是在软件开发的过程中,每天都会遇到问题。一个通用的问题解决方案,不管我们遇到任何问题都可以迎刃而解。
1.问题表征
“问题表征”这个概念出自《问题解决心里学》,问题产生的环境和背景,根据问题上下文建立表征,定义问题。
举个例子:
1+1 = ? 这不是一个问题,你可以从记忆中直接提取答案,它不需要解题的中介步骤。
237 * 38 = ? 这个问题有点棘手。你有一个目标,但是你已经知道怎样去解决这样的问题。这个也不算一个问题,你可以用你已有的知识去解决。
再举个例子:
写一本任何人看了之后都能写出一本长篇小说的教科书。
我们需要先定义清楚问题,通过怎样的行动,达到目标。
有些问题等你解决之后才知道目标是什么,比如走出迷宫。
清晰定义问题,了解当前问题是使用已有知识可以解决还是通过学习新知识来解决。
2.举一反三,迁移能力
MVC架构和设计模式的架构设计就是举一反三能力的一种诠释。
M:(Model) 模型 : 应用程序的核心功能,管理这个模块中用的数据和值;
V(View )视图: 视图提供模型的展示,管理模型如何显示给用户,它是应用程序的外观;
C(Controller)控制器: 对用户的输入做出反应,管理用户和视图的交互,是连接模型和视图的枢纽。
对程序进行反复思考,提取抽象类似的问题,设计出通用解决方案。
各种编程语言对文件的处理方式和数据库处理方式都抽象出统一解决方案,处理好其中一种语言的问题,其他语言的问题也可以解决。
文:风万里(点击关注)三十五岁程序员、兼职HR,一个正能量大叔。分享职场那些事、如何成为高级程序员。愿你我都可以成为更好的自己。