主頁 >  其他 > 像程式員一樣思考——提高解決問題的能力

像程式員一樣思考——提高解決問題的能力

2020-11-20 13:47:48 其他

在以前的文章中,曾經提過“技術人員的價值,不在于你能寫出多么優美的代碼,也不在于你能設計出一個多么大而全的高屋建瓴的架構,而在于你實實在在的解決問題的能力,在于你使用技術手段服務于業務的能力”,

最近一段時間,因作業中遇到一些現象,讓我重又想起這句話,并且試圖思考如何來提高解決問題的能力,有沒有一種方法論的手段或者技術性的框架來實踐?

先羅列一兩個遇到的現象:

  1. 某同事匯報,測驗提了一個Bug,當某個用戶系結的卡資訊超過50個的時候,后臺顯示資料就會出現混亂,問能不能限制系結的卡不超過50個,我問:資料顯示出現混亂是什么意思?答:不清楚;我再問:為什么超過50個就會混亂了,少于50個有沒有可能出現混亂,造成混亂的原因是什么?答:不知道,我說你先去搞清楚什么叫“混亂”,然后再搞清楚為什么會出現“混亂”再來說解決辦法,經過與測驗人員的一番溝通后,跟我反饋說不是顯示混亂,是顯示不全,自己通過查看實作是因為在服務端做了字串拼接,超過多少就被截斷了,

  2. 某同事在抱怨,這個問題很難復現,我不知道怎么解決,要不要把這塊整體優化下算了,我問他你優化的目的是什么,是優化目前實作的流程、結構?還是通過優化來解決這個難以復現的問題?答:來解決這個問題,我說你問題都沒定位到,怎么通過優化來解決,不怕老問題沒解決,優化出新的問題出來了?

你有沒有也曾經說過或聽過“這個問題太復雜了, 我解決不了”,“這個功能我沒辦法實作”,“我也不知道為什么會出現這個問題”之類的話語,

以上的現象與話語,可能都是一個人解決問題的能力或方式方法還不成熟的體現,那么如何來提高解決問題的能力,我想首先需要先從思維方式或思維習慣上尋求改變,在網上看到有這么一篇文章——《How to think like a programmer — lessons in problem solving》(文章地址見文末參考部分),介紹了通過5個步驟來幫忙人們建立高效解決問題的思維框架,本文以這5個步驟為基礎,結合自身的理解與體會進行介紹,

Jobs

“這個國家的每個人都應該學計算機編程,因為它會教你如何思考”

像程式員一樣思考

像程式員一樣思考,到底意味著什么,需要如何來做?

像程式員一樣思考本質上來說,是一種更為有效的解決問題的方法,

解決問題的能力是一項元技能

什么叫元技能?
類比于元資料——描述資料的資料叫元資料,我理解元技能就是提升技能的技能,就是說當你掌握了解決問題的能力,你就可以通過這種能力去提升其它各項專業技能,

解決問題的能力也是最重要的能力,比精通編程語言,除錯能力,以及系統設計能力都更為重要,

提高解決問題能力的方法

我們平時解決問題的方式可能是:

  1. 嘗試一種解決方案,
  2. 如果這種解決方案無效,再嘗試另一種方案,
  3. 如果還是沒有用,重復第二步直到你碰巧把問題解決了,

這種方法被作者 Richard Reis 定義為解決問題最糟糕的方式,因為它不但浪費時間,而且能不能達到目的還得看運氣,

經過對優秀程式員在編程時的思維框架的分析,作者總結出提高解決問題能力的最好方法包括:

  1. 有一個處理問題的框架
  2. 按照這個框架反復練習

那么,當你遇到一個新的問題時,該如何來解決?

第一步:理解

遇到問題時,我們應該先要弄明白問題本身,大部分情況下,問題之所以難解決只是因為你沒真正理解它們(很多時候是出于溝通的不充分),理解問題是解決問題的第一步,

如何確定自己是否真正理解一個問題?

最有效的方法是,嘗試用自己的語言來說出它,看有沒有邏輯漏洞,當你能講清楚一個問題時,說明你理解了它,優秀的程式員編程時,一般都會寫下自己遇到的問題,畫出流程或序列草圖,或同產品經理、其它開發人員、測驗人員等一起討論確認,這個程序,就是在確定自己對問題的理解有沒有偏差,

“如果你不能用簡單的語言來解釋一個事情,那意味著你根本就沒有理解它” —— Richard Feynman

面對一個新需求時,你應該了解這個需求產生的場景——什么人,在什么時候通過執行什么操作,來達到什么目的?這個場景及其中的行為邏輯是否合理,設計是否存在漏洞,然后帶著問題來與需求提出方討論確認,而不是斷章取義或不經任何思考直接編碼開干,不做代碼的搬運工,要做有思想的程式員,

同樣,面對一個 Bug 時,你應該首先了解這個 Bug 產生的場景——什么人,在什么場景,通過什么操作會產生這個問題?要追本溯源,定位問題的本源在哪里,
我認為定位問題的本源比解決問題更重要!因為你只有正確地找到了問題的癥結,才有可能去解決它,而解決辦法卻可能有多種,且從花費的時間來說,定位問題往往會占整個解決問題時間的一半以上,

如果沒有找到問題的本源,只是頭痛醫頭腳痛醫腳,那么可能不僅對解決問題無事無補,甚至還可能引進新的問題,常見的頭痛醫頭腳痛醫腳的處理方式包括,CPU占用高了,記憶體溢位了——升級服務器配置(可能過兩天又得升級了!);介面超時了——增大超時時間(可能導致用戶投訴或其它依賴的服務級聯超時),等等,

那么日常作業中,如何來定位問題的根源?對于一般問題來說,可能通過查看日志大致就能找到問題所在,對于比較棘手的問題,針對問題的性質一般可通過如下方法進行定位:

  • 對于易復現的問題: 常用的就是 Debug,通過 IDE 斷點來跟蹤資料的流轉與變更,一個個環節檢查資料輸入輸出是否正確來進行排查,可借助條件斷點、例外斷點等技巧來提高 Debug 效率,
  • 對于不易復現的問題:可通過對比法——對比其它地方的類似功能或實作,尋找兩者之間的差異,差異之處往往就是問題所在;分析法——走讀整體流程代碼,捋清各個環節的邏輯,分析定位問題;日志法——在各個關鍵環節添加日志,將場景鏡像下來,當下次復現的時候,通過分析日志定位問題,

第二步:計劃

理解了問題,接下來就是解決問題的方案,沒有明確的方案計劃時,不要輕易去著手解決問題,不要寄希望于碰運氣蒙混過關,許多開發人員習慣于快速掃一眼需求,就打開 IDE 開始壘代碼,壘完發現要么與需求不符,要么漏洞百出,

nobug

制定計劃,就是制定解決問題的戰略步驟,

不論面對需求還是 Bug,都應該好好計劃你的解決方案,設計好解決方案中的各個環節,如業務需求的資料表設計、介面設計、流程邏輯,Bug 修復的具體實施步驟,并給自己一點時間思考與預演,該解決方案可能存在的漏洞與影響有哪些,除了這樣處理,還有沒有另外更好的解決方案,

在沒有想清楚解決方案時,不要直接上來就擼代碼,暫停一下,給你的大腦一些分析問題和處理資訊的時間,

第三步:分解

這是思維框架中最重要的一步,

分解,就是化繁為簡,就是我們常說的分治思想,拆分法——將大問題拆分為若干個小問題,然后逐個擊破各個小問題,再合并總結,微服務架構,MapReduce 演算法,都是這一思維(或思想)的體現,

不要嘗試一次解決一個復雜的大問題,而應把復雜的大問題分解成若干個簡單的小問題(或子問題),從最簡單的子問題開始(最簡單意味著你知道怎么解決它或它更容易被解決,也或者這個子問題的解決不需要依賴于其它子問題),一個一個逐步解決,一旦你解決了所有的子問題,把它們串聯起來,一般就意味著你解決了之前的那個復雜的大問題,

分解問題的能力是解決問題的基石,這也是優秀的程式員在編程中最常用到的技能,對于他們來說,分解問題的能力,要比編程語言的熟練度、系統設計等技術更為重要,

第四步:卡殼了怎么辦?

當你理解了問題,做出了解決方案的計劃,將復雜問題分解為子問題后,在處理子問題時依然卡殼了怎么辦?

首先,淡定!然后告訴自己,這很正常,每個人都會遇到,

優秀程式員或解決問題的高手,與普通人之間的差別就在于,他們對問題更有求知欲,更有耐心,他們的注意力更多地是在如何解決問題上,而不是為此畝訓或甩鍋發牢騷,

當遇到卡殼的情況時,可以試試這幾種方法:

  1. Debug:與前面定位問題一樣,一步一步除錯,直到找出究竟哪里出錯了,
    “Debug 的藝術關鍵在于你究竟讓軟體干了些啥,而不是你以為你讓軟體干了些啥,”—— Andrew Singer

  2. 重新評估問題:退回去,從另一個角度重新審視問題,別讓自己迷失在細節里,有時候我們容易迷失在具體的細節中而忽略了更一般的原則,重新評估問題的另一種途徑是推倒重來,可以洗掉(回滾)所有已做的事,重新開始,有時這是非常行之有效的方式,

  3. 搜索解決方案:利用搜索引擎找到類似問題的解決辦法,向他們學習,使用搜索引擎需要學會提煉關鍵字,關鍵字越有代表性,越容易找到答案,對搜索結果應該抱著參考的態度,而不是照搬,要明白為什么如此這般處理就能解決問題,并在解決問題后能依次延伸了解其上下游或相關知識,比如SQL查詢慢,發現是索引未生效,則可以延伸了解都有哪些場景會導致索引失效;比如并發問題,則可以依此了解如何保證執行緒安全,同步機制,鎖機制等相關知識,事實上,即使問題已經解決,你也可以經常這么做,因為這樣你可以從其他人的解決方案中及上下游知識中學到更多,

  4. 尋求支援:當通過以上方法都無法獲得解決辦法時,向你的同事、上級或朋友求援,如果是開源專案,到開源社區、技術群,或 github 的 issue 串列中發帖求援,

  5. 記錄問題與解決方案:將你本次遇到的問題與最終的解決方案用(電子)筆記本記錄下來,便于后面回顧或參考,

第五步:練習

羅馬不是一天建成的,你也不可能期盼通過解決一兩個問題就能成為解決問題的高手,但是,如果你能以學習的態度來尋求問題的解決辦法,通過以上四個步驟來建立一套解決問題的思維框架,每一個問題的處理都是提高你能力的機會,那么距離成為一個解決問題的高手,就只差一步了,那就是:練習,練習,再練習,在問題中練習,訓練你的思維方式與習慣,

lixiaolong
“我不害怕一次練習1000個踢打動作的人,但我害怕將一個踢打動作練習1000次的人”

總結

其實,解決問題的能力,不論在IT技術領域,還是在其它各個領域,都是一種最基本的技能,當你在說出“這個問題我解決不了”,“這個問題我沒辦法定位”前,試試本文介紹的理解、計劃、分解、卡殼時怎么處理的建議方法,多一些耐心,一步步實踐,說不定慢慢就看到曙光了,按照這個處理模式或習慣,在榷訓月累的問題處理中,你可能已在不知不覺成為了解決問題的高手,

參考:

  1. https://www.freecodecamp.org/news/how-to-think-like-a-programmer-lessons-in-problem-solving-d1d8bf1de7d2/

原文地址:http://blog.jboost.cn/think-like-a-programmer.html


[轉載請注明出處]
作者:雨歌,可以關注作者公眾號:半路雨歌
qrcode

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/225483.html

標籤:其他

上一篇:Ubuntu16.04 LTS 安裝NVIDIA驅動的辛酸史!

下一篇:不想做科技第一的金融公司,不是好的養老去處

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more