iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 12
1
Modern Web

《透過認知心理學認識 JavaScript》貓咪也能輕鬆學習的 JavaScript系列 第 12

【建立模型】2-5 流程與計算:敘述句(statement)上集

解決問題的流程

cover picture sponsor: gleammming.art

在 Maier(1931)的兩繩問題研究當中,受試者被要求在一密閉房間中同時抓住兩條由天花板上垂下的繩子,而房間內只有一把鐵鎚、其他的小工具以及,且兩條繩子垂下的距離很長,使你無法抓著其中一條繩子同時摸到另外一條繩子。

思考一下要是你是受試者,你會怎麼解決兩繩問題?


開放與封閉

Wakefield(1992)藉由 開放封閉 定義了關於問題與回答的分類。

其中的開放意思即為結構不定的,沒有明確的指示,想做什麼都可以,而封閉意思即為結構清晰且有明確的指示,受限一定的條件以內的事件。藉由這個分類,我們可以將其分為四個象限來表示:

比如上方中的兩繩問題便是屬於開放性問題與封閉性解答,該實驗原先定義是要讓受試者 頓悟(insight) 到可以將鐵鎚綁在繩子上,並透過 鐘擺的原理 來解決問題。

而這四個象限當中,開放性問題(well-defined problem)封閉性問題(ill-defined problem) 擁有明顯的差距,其最大的差異點在於封閉性問題可藉由類似 步驟(step) 的概念慢慢解開問題,比如在圈叉遊戲中,由於步驟是有限的,因此我們可以透過回推步驟,歸類出後手必輸的幾種下法;開放性問題由於沒有明確的起點與終點,需要依靠自己定義其中的策略與過程,並透過重新建構問題的本質,轉化問題表徵才能夠藉由 已知的部分 推論下去,例如我們在 1-3 章中的食物問題中,前提是意識到「錢夠不夠結帳付款」這個最大的限制,接下來才能由此來開始推論其他部分如「有沒有餓」或甚至是「有沒有時間排隊」等等問題。

問題空間

對於軟體開發而言, JavaScript 程式碼的實作過程也近乎是屬於開放性的問答題,有些人可能因為不擅長沒有步驟的解決方式,因此時常在開發當中遇到困難點,要解決這個困難點我們必須先定義出該「問題」是什麼,接著才能執行我們的策略,而大部分的問題從開始到解決大致上都包含了以下幾點元素:

  • 起始狀態:最初原始的狀態,也就是什麼都還沒做的時候。
  • 目標狀態:我們理想中最終要達成的目標,比如要實作一個廣告曝光率的功能。
  • 解決策略:能夠使我們從起始狀態達到目標狀態的策略。

定義好問題的狀態後,這時我們可以依靠以下幾種解決策略,來幫助我們解決問題:

  • 目標分析策略
  • 前向運作策略
  • 反向運作策略

目標分析策略

目標分析策略主要是透過逐漸洞察到的問題的來分析解決的焦點,藉此縮短「最初要解決的部分與最後要達成的目標」的距離。

就如同我們 具象化流程圖 的行為,其實就是縮短我們邏輯與程式之間實作的問題。我們可以藉由繪製完的流程,輕易地指出哪裡有邏輯上的問題,並依照最後調整好的邏輯流程轉化為實際的程式碼,使「開發」這件事情在邏輯流程上能夠先有個初步的概念,接著便可考量到 如何轉化為程式碼 等問題。

若要採用此策略的人,需要擅長使用轉化、同構問題等技巧,將問題解析成另一種相對來說好解決的問題;另一個較大的議題則是要考量到設備與時間的限制,而解決辦法之一是透過概念驗證(Proof of Concept)來驗證可行性。

有關於轉化問題的實際案例是一名參與第 29 屆國際數學奧林匹克競賽的選手 Emanouil Atanassov,他透過了韋達定理(Vieta's theorem)以及無窮遞降法(method of infinite descent)概念所衍生出的韋達跳躍(Vieta jumping),間接且簡潔的證明了號稱該競賽以來最困難的「傳奇第六題」。

前向分析策略

前向分析策略是則是試圖從「問題的源頭」開始解決,接著發散各種思考與方法來試圖達到欲解決的目標。

以我自身的經歷舉例,在當時我的目標是想成為一名網頁開發工程師,就像是一開始我在自學程式之前,我不清楚「自學程式」的概念,因此我是先學習如何「自學程式」,接著經由許多前人分享的經驗,才開始得知「發問的藝術」、「問題搜尋的技術」及「社群」等等方法與途徑,近而幫助我對於成為一名「網頁開發工程師」更多的體會與大模樣的方向。

而若要採取此策略的人,需要相較擅長於「自學」與「自行解決」模式的人,另外這種模式你會相較需要一個導師(Mentor)的角色來協助你定義你所進行的方向,避免你的方向偏離了你的目標。而這位導師並不一定是個「人」,它可能會是書籍,也有可能是網站上的文章等等如 1-6 章中我所分享的部分。

若你有看過近期的某科幻電影的話,裡頭某個橋段就是採用了逆行的前向分析以獲得情報。(避免暴雷就不多說了)

後向分析策略

後向分析策略顧名思義是試圖從「問題的目標」開始反推解決,也就是說先定義出你問題的目標部分,依序回推各個部分要怎麼達成。

例如兩繩問題當中若採後向分析策略則是先想像同時抓著兩隻繩子的模樣,接著前一步必定為鬆開繩子因此繩子會開始擺盪,然而擺盪的幅度越來越小,最後回到初始靜止的狀態;接著你就會意識到繩子的擺盪幅度要越來越大,最後大到你可以同時抓著兩隻繩子,進而分析出你需要透過綁物品在繩子上來增加擺盪幅度,來達成同時抓住兩個繩子的目標。

這套策略某種程度上可將原先較為開放性問答縮減成相對封閉性的問題。我也曾輔導過一名自學者,比起在實作開發中採用前向分析策略來思考實作問題,他採用後向分析的策略能夠更快速地分析出解決步驟,原因是過程其實相對來說要具體的多。

在下一篇文章中,我們將要透過這些解決問題的策略來瞭解 JavaScript 中有關於敘述句的議題。


上一篇
【建立模型】2-4 流程與計算:運算式(Expression)與運算子(Operators)下集
下一篇
【建立模型】2-5 流程與計算:敘述句(statement)下集
系列文
《透過認知心理學認識 JavaScript》貓咪也能輕鬆學習的 JavaScript33

尚未有邦友留言

立即登入留言