如何像程式設計師一樣思考
如果你對程式設計感興趣,你可能已經見過這句話:
“這個國家的每個人,都應該學習程式設計,因為它教會了你思考。” — Steve Jobs
你也可能在尋思,啥叫像程式設計師一樣思考,我如何才能做到?
這篇文章,目的就是教你如何達到這個目標。
其實,核心是圍繞如何高效的解決問題。
高效解決問題的能力為啥如此重要 ?
解決問題是元技能。
每個人都會遇到問題,或大或小的。一般我們如何處理他們,好吧,處理方式很隨機。
除非,你有一套系統,依賴它來解決問題(我初學程式設計的時候就是這麼做的):
1、嘗試一個方案
2、如果失敗,嘗試另外一個
3、如果還是行不通,重複步驟 2,直到碰巧解決了問題。
看吧,憑藉好運氣,你能解決掉問題。但這是最 LOW 的解決問題方式。
而且,浪費了太多太多的時間。
最好的方式應該是
a) 有一個解決問題的框架
b) 練習它
“幾乎所有的僱主都更加看重解決問題的能力。解決問題的能力幾乎被一致的認為是招聘時判斷僱員是否合格的重要指標,優先順序甚至高於掌握特性的程式語言,debug 及系統設計能力。
計算機系統思維和能將大而複雜的問題分而治之的能力和一個職位要求的專業技術同等重要。
”
擁有一套框架
為了找到正確的框架,我遵循了 Tim Ferriss 的關於學習的書 \<\< The 4-Hour Chef >>。
它像我引薦了兩個印象深刻的人: C.Jordan Ball (是 Coderbyte 65000+ 使用者的第一二名),和 V.Anton Spraul ( \<\< Think Like a Programmer: An Introdution to Creative Problem Solving>> )。
我問了他們同樣的問題,他們的給出的答案驚人的相似。
容我下面慢慢道來。
旁註:
並不是說他們做任意事情方式都一樣。每個人都是獨特的,你也將是。讓我們先基於我們都認可的準則開始,你將會了解的更加深入。
“我見過,新手程式設計師們常犯的最大錯誤就是:他們太專注於學習語法而不是如何解決問題” - V.anton Spraul
所以,當你遇到一個新問題的時候,你應該怎麼做?
步驟:
1、理解
弄明白問題所在。最困難的問題之所以困難,往往是因為你沒有理解它們。( 這就是理解為什麼它是第一步 )
如何知道你已經理解了一個問題呢?那就是,當你能用直白易懂的話解釋的時候。
還記得當你在一個問題上卡住的時候嗎,你開始解釋它,然後你就忽然意識到了以前沒有意識到的邏輯漏洞?
大多數程式設計師都有類似的經歷。
這就是為什麼你應該寫下你的問題,畫個草圖,或者把問題講給別人聽(哦,還有一些人使用橡皮鴨 譯者注:)。
“如果你不能用簡單的方式解釋某件事,說明你還不(夠)理解它。” - Richard Feynman
2、計劃
別一頭扎進去開始解決問題(有時你期望問題可以迎刃而解),甚至沒有計劃。請制定解決問題的計劃。
如果你不寫下具體的步驟,上帝也幫補了你。
程式設計中,切記不要一條路走到天黑。給你的大腦時間去分析問題和處理資訊。
像下面這樣問自己,以便獲得一個好的計劃:
“已知輸入 X, 為了輸出 Y, 有哪些(必要的)步驟呢?”
旁註:程式設計師有很好的工具輔助他們 - 註釋
3、分解
集中注意力。這是最重要的部分。
別嘗試解決一個大的問題。你會哭著找媽媽的。
取而代之,你應該把它分解為小問題。這些小問題解決起來容易多了。
然後,從最簡單的那個開始(最簡單意味著你知道答案或接近於答案的答案),將分解後的小問題一個一個的解決。
再之後,“最簡單的問題”的定義是,解決該問題不是以其他的問題被解決作為前提條件的。
一旦你解決了所有的子問題,把它們串聯起來。
串聯起了所有的子問題,意味著你解決了從前那個大問題了,那麼恭喜你 !
這個技巧是解決問題的基石。(請牢記,如果有必要,回顧它。)
“如果要我教所有的新手程式設計師一個解決問題的技能,該技能將會是:分解問題的能力。
舉個例子,假設你是一個新手程式設計師,你被要求寫這樣一個程式:讀取 10 個數,返回其中第三大的數字。作為一個典型的新手,這可能是一個艱鉅的任務,雖然解決這個問題只要一點程式設計基礎語法(知識)。
如果你卡住了,你應該將問題分解成更容易解決的子問題。(比如)如果不是要求找出第三大的數字,而是最大的數字呢?還是很難嗎?(那麼)如何找到三個數字中的最大數字呢?或者,兩個數字中的最大數呢?
分解問題到你可以解決的層次。然後順著問題分解的步驟,反向的逐漸更改解決方案,直到解決分解之前的那個問題“ - V.Anton Spraul
4、卡住了?
目前為止,你可能正坐那思考“嘿,Richard … 一切看起來很酷,但是如果我甚至在解決小問題的時候卡主了呢??
淡定,深呼吸。這很常見。
別擔心,夥計。這種問題每個人都在不斷的遇到。
唯一不同是,優秀的程式設計師/問題解決大師更多的是對 bug 和錯誤很好奇,而不是害怕。
事實上,有個三件事可以嘗試,當你掉鏈子的時候。
- debug: 單步除錯,直到找出究竟哪裡出錯了。
“debug 的藝術關鍵在於你究竟讓軟體幹了些啥,而不是你以為你讓軟體幹了些啥。” - Andrew Singer
- 重新審視問題:切換到巨集觀視野。從另外的角度去審視問題。有什麼是可以被抽象成通則麼
“有時,我們迷失在細節裡了,如果我們使用通則也許能奏效。
一個經典的案例:連續整數求和問題,1+2+3 + … + n, 年少的高斯很快給出瞭解法:(n + 1) / 2, 避免了無聊的累加計算
” - C.Jordan Ball
旁註:另一種從新審視的方法是,從頭開始。刪除所有的實現,從新開始。有時,它是如此行之有效,讓你目瞪口呆。
搜尋:Goolge 一下,你就知道。不論你碰到什麼問題,也許被人解決過。找到它。事實上,即使,問題已經解決,你也應該常常這樣做。(你會收穫很多)
警告:不要 Google 你遇到的“大問題”,而是子問題。為什麼?如果你遭遇一點挫折,你不會學到任何東西,只是浪費時間而已。
練習
羅馬不是一天建成的,你也不可能一週就做的很棒。如果你想成為一個好的問題解決大師,你需要解決若干問題來練習達到。
練習。練習。練習。在你意識到“原來這個問題,這麼解就行了啊”的時刻之前,唯一需要的就是花時間練習。
如何練習?這裡一些方式供你參考:
象棋謎題,數學問題,數獨,圍棋, 大富翁(Monopoly), 視訊遊戲,鏈養貓(cryptokitties), 等等。
事實上,在一些成功人士的練習愛好之間,似乎有一些共通的規律。比如 Peter Thiel 下象棋,Elon Musk 打視訊遊戲。
“Byron Reeves 說過‘ 如果你想看看三五年的商業領導能力看起來是什麼樣子,去看看線上遊戲發生著什麼就可以了’
當今。Elon [Musk], Reid [Hoffman], Mark Zuckerberg 和很多其他人都說過遊戲是他們成功建立公司的基礎“ - Mary Meeker
這意味著你也應該玩遊戲麼,並不。
但是,視訊遊戲是什麼,沒錯,關於解決問題。
因此,你應該找一個練習的方式:它允許你解決什麼的小問題(如果,你還能享受這個過程就完美了。)
如我所說,所有的問題都有共同的模式。
結論
就是這樣了。
現在,你終於理解了什麼是”像程式設計師一樣的思考“。
你也知道了如何培養解決元問題的特殊技能。
這些還遠遠不夠,注意你仍然需要知道怎麼練習你解決問題的能力。
“請想象一下,你成功的搞定了一個難題,但是另一個又接踵而至。話說回來,是什麼讓生活如此多姿呢 …
生活就是一個不斷解決問題的過程。
每一次你都有所收穫。
每一次,你都將變得更加強大,富有遠見。
每一次,競爭一點點的消失。你剩下一個更好版本的你“ - Ryan Holiday
就是現在,去解決問題吧,騷年。祝你好運。
相關推薦
如何像程式設計師一樣思考
如果你對程式設計感興趣,你可能已經見過這句話: “這個國家的每個人,都應該學習程式設計,因為它教會了你思考。” — Steve Jobs 你也可能在尋思,啥叫像程式設計師一樣思考,我如何才能做到? 這篇文章,目的就是教你如何達到這個目標。 其實,核心是
像程式設計師一樣思考——提高解決問題的能力
在以前的文章中,曾經提過“技術人員的價值,不在於你能寫出多麼優美的程式碼,也不在於你能設計出一個多麼大而全的高屋建瓴的架構,而在於你實實在在的解決問題的能力,在於你使用技術手段服務於業務的能力”。 最近一段時間,因工作中遇到一些現象,讓我重又想起這句話,並且試圖思考如何來提高解決問題的能力,有沒有一種方法論
WeCode線上少兒程式設計|即使不做程式設計師,要學會像程式設計師一樣去思考
“學習計算機思維”是我們常常會聽到的口號,那麼下一句呢?或許應該是“學會像程式設計師一樣思考”——如果計算機思維是一個知識庫,瞭解它是時代對人類的要求,那麼程式設計師就是應用這個知識庫去解決世間疑難雜症的人,對於正在學習計算機語言,但並不一定打算以寫程式碼為生的群體來說,學會了像程式設計師一樣思考,
【像程序員一樣思考】 讀書筆記
尋找 讀書筆記 讀書 bsp 如果 重新 劃分 可能 抽象 通過梳理條件理清思路。 從最強約束條件入手。 如果沒有意識到所有可以采取的動作,很可能無法解決問題。列舉所有可能的操作,測試這些操作的每種組合,知道發現可行方案。 通過簡化問題尋找解決辦法。 通過抽象問題,與以往項
【像程序員一樣思考】讀書筆記4
concat 其中 同時 arr 產生 new con 例如 程序員 1.如果多個變量同時指向一個內存並且調用Delete刪除了其中任意一個變量,實際上就為所有的變量銷毀了這塊內存。如果沒有明確的把其他這些變量設置為NULL,他們此時就成為了野指針,對野指針調用delete
《像計算機科學家一樣思考Python》pdf
方法 padding add bbb 而且 文件 書籍 數據結構 引導 下載地址:網盤下載 內容簡介 · · · · · ·《像計算機科學家一樣思考python》按照培養讀者像計算機科學家一樣的思維方式的思路來教授python語言編程。全書貫穿的主體是如何思考、設計、開
如何像程序員一樣思考——解決問題的經驗
例子 最重要的 roc 現在 開始學習 事情 rod ~~ 更多 如何你對編程感興趣,你可能見過這句話: “Everyone in this country should learn to program a computer, because it teaches you
關於程式設計師加班思考
在it行業裡面,程式設計師為什麼經常加班,又該如何對待加班? 為什麼經常加班? 如何對待加班? 為什麼經常加班? 這裡說的是整個it行業,包括網際網路和傳統it。程式設計師經常性加班主要有以下原因: 需求量大,專案緊急。 需
像電腦科學家一樣思考Python (第2版)高清PDF電子版下載
本書以培養讀者以電腦科學家一樣的思維方式來理解Python語言程式設計。貫穿全書的主體是如何思考、設計、開發的方法,而具體的程式語言,只是提供了一個具體場景方便介紹的媒介。 全書共21章,詳細介紹Python語言程式設計的方方面面。本書從基本的程式設計概念開始講起,包括語言的語法和語義,而且每個程式設計概念
像架構師一樣思考
很多程式設計師經常陷入迷茫,技術發展日新月異,沒有充足的時間精力去學習新技術,每天都疲於產品經理、市場、領導的各種需求的編碼實現,沒有絲毫的成就感。 如果要想有成就感,就需要了解業務,清楚自己做的東西對使用者和公司的價值。馬雲在建立阿里巴巴的時候,就明確了
作為程式設計師的思考與反省
子曰:吾十有五而志於學,三十而立,四十而不惑,五十而知天命,六十而耳順,七十而從心所欲,不逾矩。人生又有幾個十年? 距離三十還有7年。7年看似很長但也很短。或許有人說我過早的杞人憂天。 三十歲對於一個程式設計師來說,是一個警鐘。雖然不少博文或者某些國外週刊說,有七八十歲的程式設計師,也有四五十歲的程式設計師,
程式設計師職業思考與規劃 —— Java程式設計師年度總結:淺談四點心得,也許路走得更遠
一、技術積累 (1)程式碼規範 1.1.1、通常的模組分佈: 一般如果你要實現一個web應用,你從後臺將資料展示到前端頁面,在一個比較大的公司,你少不了跟其他專案有交集(你呼叫他的介面,他依賴你的介面),這樣下來,整個公司有很多個模組,怎麼做到很好的聯絡。回到剛剛的
《像電腦科學家一樣思考Python》學習筆記
第11章 字典 字典方法dict.get(key,default)和dict.setdefault(key,default)區別: 如果key在字典裡: 如果key不在字典裡: dict.get(k
《像電腦科學家一樣思考Python》練習4-3
題目:畫出如下的圖形思路:isosceles函式:畫一個等腰三角形。具體步驟如下:主要程式碼如下:import turtle import math bob = turtle.Turtle() bob.delay = 0.001 def isosceles(t, r, ang
Think Julia:如何像電腦科學家一樣思考(第一節)
Think Julia:如何像電腦科學家一樣思考 Ben Lauwens [email protected] Allen Downey [email protected] 後記 版權所有©2018 Allen Downey,Ben
像電腦科學家一樣思考python
18 繼承(inheritance) 繼承 是面向物件程式設計 的一種語言特性; 它能 通過對現有的某個類稍作修改的方式 定義一個新的類。 現有的類 稱為 父類, 新的類 稱為子類。 之所以被稱為 繼承,是因為 子類 包含有 父類中的方法。 17
Ansible:像系統管理員一樣思考的自動化框架 | Linux 中國
直到我開始接觸 Ansible,我才覺得這才是系統管理員喜歡的東西。-- Shawn Power
產品思維——像產品經理一樣思考
話說:不想做產品經理的程式猿不是好廚師,這幾年隨著產品經理這個崗位的火熱,越來越多的程式猿、設計師、專案經理等專業人士轉型去做產品經理。 做專業技術出身的人,往往會養成一種思維習慣,看問題的角度也會形成慣性,我們把這種思維習慣叫做工程師思維。 產品思維是產品經理應該具備
像電腦科學家一樣思考Python pdf
《像電腦科學家一樣思考python》按照培養讀者像電腦科學家一樣的思維方式的思路來教授python語言程式設計。全書貫穿的主體是如何思考、設計、開發的方法,而具體的程式語言,只是提供一個具體場景方便介紹的媒介。《像電腦科學家一樣思考python》並不是一本介紹語言的書,而是一本介紹程式設計思想的書。和其他
像資料科學家一樣思考:12步指南(上)
介紹 目前,資料科學家正在受到很多關注,因此,有關資料科學的書籍正在激增。我看過很多關於資料科學的書籍,在我看來他們中的大多數