像專家一樣生活,事前準備篇#126

createyourownlives-lives-like-an-expert
最近持續在上Launch School的課程學習Ruby,在課程中我們定期都必須繳交作業給TA評鑑。不過有趣的是,coding這件事本身並沒有所謂的標準答案,重點是你是否能夠解決問題。而且也許我目前還算是在課程比較前期的部分,所以TA並不會對我的coding架構有太多的修正,只要跑得順、沒有太大的問題都可以。

 

但是也因為如此,我一直在思考一些事,像是「如果我現在就養成壞習慣,之後怎麼辦?」和「我沒有一個好的效仿對象,我怎麼知道自己的coding好不好?」等等。既然我們學習的目的,就是希望技能能為我們所用,並且最好還能夠用得有模有樣,那找出一個讓自己受益的學習方法和楷模的重要性自然不不言而喻。

有效的學習方法-實作

A Mind For Numbers: How to Excel at Math and Science這本書中,作者Babara Oakley提到了一個很有趣的觀點,她說:『接受測驗本身是個非常有效的學習方式。』
Testing is itself an extraordinary powerful, learning experience.If you compare how much you learn by spending one hour studying versus one hour taking a test on the same material, you will retain and learn far more as a result of the hour you spent talking a test.

 

一般來說測驗有效的原因就在於,他讓受測者試著整合過去所學習到的知識,“實際的“去解決生活中所遇到的問題,而不只是不停的學習或閱讀,但卻沒有實踐。最簡單的例子就是讀了一堆英文沒開口和平常天天開口的區別,當你真的實際使用你的所學,你才會知道過去的學習有哪裡不足。

什麼是像專家一樣生活?

而所謂的像專家一樣生活,其實跟接受測驗很類似,都是學習如何解決真實世界的問題。而跟接受測驗不同的是,像專家一樣生活是先藉由探索如何解決真實世界的問題,再一步一步回頭補足自己哪裡不足。也就是說,我們藉由事先了解專家做事的原則、要求自己的標準、如何解決問題等等,然後開始模仿他們的行為,讓自己有朝一日也能達到他們的水準。而不是事先花大量的時間慢慢的學習所有的知識,然後再開始實作。而在我先前的一篇文章“輸出倒逼輸入”也有提到不少像專家一樣生活帶來的好處。

 

這就像是說,如果我要成為一個programmer,我不見得要事先修普物、微積分和線性代數再開始學寫程式,而是直接從我要學習的語言開始(假如是Ruby),然後像那些工程師一樣直接用Ruby來解決我生活中遇到的問題。在這個過程中我必然會遇到很多困難,但是我可以迅速瞭解專家們如何做事,並且補足我所不足的知識,而不用過度花費時間練習基礎知識,但卻遲遲沒有實踐。

你需要事先了解的事

所以在我們像個專家一樣生活之前之前,我們有必要事先了解這個領域的一些基礎必要問題,讓自己可以快速進入狀況。這些問題像是(以學習Ruby為例)

 

1.Ruby是什麼?
2.Ruby可以解決什麼問題?
3.怎麼學習Ruby
4.Ruby的資源去哪裡找?
5.怎樣才是一個好的Rubyist
6.怎樣的code才算是好的code?

 

在瞭解了這個領域的基礎知識、相關知識還有專家的標準之後,你在學習的過程中就可以不斷的透過這些要點,來檢視自己的學習狀況,或是否真的了解這個領域。若是沒有則修正,有則繼續保持。

 

而為了了解到底怎樣的code才是好code,我在google輸入了以下的句子”How good programmer code”,結果我在stack overflow上找到了這個網頁,其中票選回答票數最高的答案是
  • Good code is well-organized. Data and operations in classes fit together. There aren’t extraneous dependencies between classes. It does not look like “spaghetti.” (良好的結構)
  • Good code comments explain why things are done not what is done. The code itself explains what is done. The need for comments should be minimal..(最好用code來表達,而不是靠註解。)
  • Good code uses meaningful naming conventions for all but the most transient of objects. the name of something is informative about when and how to use the object.(好的命名規則)
  • Good code is well-tested. Tests serve as an executable specification of the code and examples of its use.(經過反覆測試的考驗)
  • Good code is not “clever”. It does things in straightforward, obvious ways.(好的code易於瞭解、表達明確,而不一定要看起來好棒棒)
  • Good code is developed in small, easy to read units of computation. These units are reused throughout the code.(unit可重複性高、易於使用、不要太肥大)
所以在未來coding的時候我就必須知道,我要用以上的標準來要求自己,因為這些都是所謂“好的programer”會做的事情。

小結

在我們學習的過程中,若是有仿效的對象還有參考的標準,就能夠讓我們認清自己還有哪些地方需要加強。如果沒有學習對象,我們難免會像無頭蒼蠅一樣亂闖亂撞,耗費了大量的時間還有注意力。而像專家一樣生活可以幫助你提前活在未來,少走冤枉路。

 

所以,先花點時間研究你想要專研的領域,看看專家們都怎麼做事,然後用他們的生活方式生活、用他們的標準要求自己,這才是最有效的學習方法之一。

 

而其實,像專家一樣生活,還有另外一個巨大的好處,那就是-提前成為未來的你

如何運用類比了解Ruby#122

createyourownlives-writting-ruby-is-like-writting-story

在笑來老師的文章中複習到這樣的一段話

一般來說,類比是我們在說明或理解時所使用的思維輔助工具,它的使用過程大抵如下:『為了向對方解釋清楚未知的X …… (或者為了理解尚處於未知的X……) 去找一個與X 類似的、但是對方肯定已經理解的A 說清楚它們之間的關係:X ≈ A 把A (或A 與X 相似的地方) 解釋清楚…… 於是X 不言自明……』

可以用類比幫助了解Ruby嗎?

所以我就開始思考了,這個方法真的有效嗎?那如果我要知道他是否有效,最好的方法就是實際用生活中的例子來測試?於是我選擇了目前正在學習的Ruby語言來套用這個方法。而我到底能夠把Ruby類比成什麼?

在練習Ruby數十個小時之後,我越來越覺得寫Ruby其實就是在寫一段故事。而為了寫好故事必然要先釐清以下幾件事
1.你的故事要解決什麼問題?
2.把故事劃分成好幾個部分
3.把每個部分寫得更詳細一點
4.幫助提高了解程度

你的故事要解決什麼問題?

一段故事可長可短,一般來說我們通常可以用短短幾句話就講完一個長篇大論的故事。比如說,哈利波特七集的系列小說,基本上就是在說:『主角哈利波特在霍格華茲7年學習生活中的冒險故事。』,但是這樣的故事沒有人會滿意,因為它顯然沒有解決聽故事的人最大的問題,那就是:『滿足心中好奇的渴望。』,而基本上所有的故事都是為了解決這個問題而存在,並且不斷努力著。

把故事劃分好幾個部分

而為了要把一篇故事寫好,我們一定會有很多大綱或是時間軸,接著再針對各個點去把裡面的細節描寫清楚。就像是J·K·羅琳可能是把哈利波特的生活分成七年來看,先給予這七年都會發生哪些主要的大事件,接著再針對這些大事件一一描述。

把每個部分寫得更詳細一點

把故事分成七年之後我們必然要把故事,一一的詳細寫清楚,否則讀者們是不可能了解情節的發展。此外,有時候故事當中有太多的人物、地點、時空背景等等,作者可能沒辦法或不願意在故事中花太多篇幅的介紹,所以常見的方式是在書的一開始寫上前情提要、主角簡介、時空背景等等。

幫助提高了解程度

一般在寫文章的時候,非常忌諱的就是錯別字太多、邏輯不夠嚴謹、沒有結論。因為種種的這些因素,都有可能破壞讀者閱讀的節奏,最終導致這個故事可能沒有辦法『滿足讀者心中好奇的渴望』。

所以Ruby跟說故事的關係是?

Ruby的存在就是要解決作者或使用者所遇到的問題(可能是寫遊戲、解決繁瑣的問題等等都有可能),而當我們在寫Ruby的時候也必須先完整定義問題(假設我要寫個圈圈叉叉的遊戲)的存在,像是圈圈叉叉的遊戲敘述是長這樣的

%e8%9e%a2%e5%b9%95%e6%88%aa%e5%9c%96-2016-09-10-16-51-17

接著,我們要針對整個流程擬出大綱(像是先顯示板子,接著要玩家先下,顯示板子,3個連成一線就贏了等等)

%e8%9e%a2%e5%b9%95%e6%88%aa%e5%9c%96-2016-09-10-16-51-23

然後下一步,是要把每個流程寫得更加詳盡易懂(白棋可以下在哪?要怎麼避免下在已經有棋子的空格?遊戲可以在3個連成一線就中止嗎?),讓他能夠說出一個完整的故事。(詳細的內容)

%e8%9e%a2%e5%b9%95%e6%88%aa%e5%9c%96-2016-09-10-16-55-37

而為了避免故事太過冗長,或著重要的資訊一再說明或漏掉,一般Ruby或在開始之前,定義很多的Method、constant,讓看的人可以一目暸然,不用每次都花大量的時間看重複的訊息(書籍前面的前情提要、主角簡介、時空背景等等。)(各種Method和Constant)

%e8%9e%a2%e5%b9%95%e6%88%aa%e5%9c%96-2016-09-10-16-55-06

並且在撰寫的過程中,不斷的確認是否有錯別字、邏輯是否嚴謹、有沒有結論。因為這些小小的錯誤,都有可能造成電腦無法理解你的故事,進而無法產生你要的結果。(Error)

%e8%9e%a2%e5%b9%95%e6%88%aa%e5%9c%96-2016-09-10-16-58-11

總結

而既然我們可以把Ruby跟寫故事類比起來之後,對我們來說最方便的就是,透過模擬這樣的思維幫你解決問題。我們開始寫Ruby之前要先定義自己的故事是什麼,然後把每個流程大概分類,接著把內容變得更加詳盡。而在撰寫的過程中,把重複出現的資訊盡量簡化,放在前情提要的部分,避免浪費時間和精力。

如果能夠用這樣的思維思考,或許能夠讓初學Ruby或著操作的人有個大概的方向,減少入門的時間。

不知道這樣的類比有沒有實際幫助理解,如果有差的話可以留言跟我說一下XD