Blog Cover Image

Inspire you to have New thinking, Walk out your unique Road.

有的時候,你無意間遇到的一些故事,會激發你的靈感,改變你的想法,接下來你會用與之前全然不同的觀念去創造屬於你獨特的故事。

Sign @MinaYu.

[後端小菜鳥] 程式沒有這麼難-學會拆解問題

Posted on

程式語言就只是工具

初學程式的新人們,不太能理解這段話,無法想像那些將程式語言學到精通的前輩們,卻告訴我們程式語言僅僅只是個工具。

其實寫程式是為了解決問題,將問題做拆解,並寫程式讓電腦分步驟自動執行,才是我們為何要學習程式語言的理由。


在發文前,我在思考這篇文章該如何琢磨下筆

原先,這是我在接受前輩引導做學習的時候,寫下類似日記的學習筆記

我一直在來回思考,每篇後端小菜鳥都像是我每日的學習筆記

隨著文章陸續發表,我知道這樣日記式的寫作方法,較無法被接受

這樣混雜且龐大的學習知識,我該怎麼做分類,我要讓我的文章定位為何?

要如何撰寫才能夠像是分享/指引有相同疑問的朋友,又能夠保留我原先想記錄為日記式學習


在尚未接觸同事前,我在研究所時期,以及剛進公司的兩個月,我都利用粗糙的方式來寫程式

當接到一個新的案子跟任務時,先是腦袋中一片混亂,我感受到各種想法在我腦中飛奔來飛奔去,接著僅僅是打開記事本將幾個要點記錄下來,尚未整理就直接打開我的程式碼埋頭苦幹,邊寫邊設計,邊寫程式邊寫出未來要修改的Bug

寫到一半也許卡住了就很茫然,在這之前我一直以為這是我經驗不足,剛寫程式,還有技術能力不足所導致,我從未檢討過我的做事邏輯有錯誤

如開頭所說,寫程式是為了解決問題

當接到一個新的任務時,我常常是腦袋一片混亂,東想西想,然後就馬上開始撰寫程式

邊撰寫邊Debug, 想到什麼就加什麼,往往寫了很亂及一堆很難整理的程式

在同事的引導一下,我有了一些進步

當一個任務下來,我比較不會茫然慌亂

也能一步一步寫出好讀的程式

我們將接到的任務按照下列的步驟做分析

  • 接到任務

  • 將任務的功能貼至一個新地方,並分隔為細小功能

  • 將每個任務功能轉為對應可執行的程式,僅需要初步直白的寫出可能會使用到的函式即代表的程式碼

  • 最後根據寫出的程式判定需不需要抽出成為共用模組,以及哪些項目模糊待釐清

  • 實行步驟

這樣將原本一個任務分割成一小部分,再設計程式

先設計邏輯與框架,再去執行撰寫程式,比我一開始什麼都沒做就開工,實在好太多啦!

程式沒有這麼難

在接觸到寫程式的前輩們後

紛紛有兩位前輩,分享了拆解問題的方法

當遇到問題時,先將問題做拆解

遇到問題時,拿下紙筆(或者開空的文書檔案),將你想怎麼做步驟寫下來
接著依據步驟將每個步驟應該會使用到的程式碼與函式先初步寫下來,並註解他們
有了每個步驟的函式跟程式碼後,再依據慢慢細寫應該要有的內容, 額外的步驟或者例外處理

像是這樣

我想要一個功能會上傳資料庫,並將資料庫的內容用Pandas, DataFrame帶出,接著寫入CSV

<strong>那麼步驟就是</strong>
1. 我想要一個功能會上傳資料庫
2. 並將資料庫的內容用Pandas, DataFrame帶出
3. 接著寫入CSV

將步驟的函式寫出

def upload_data():
    # 使用什麼方法上傳資料庫

def read_data():
    # 讀取資料用pd/df
    df = pd.read_sql(<span class="hljs-string">"..."</span>)

def write_csv():
    # 寫入CSV

那麼差不多的功能都有了接著可能就是慢慢寫細節

還需要稍微處理一下若讀進來的DataFrame想要對他做什麼處理,這部分需要寫在哪呢?

以及做例外的判斷

雖然只是很簡單的例子做示範,但希望分享出來

在起初剛學習程式語言時,往往是一片混亂,初學程式的初期總是好玩又有趣

常常會看到初學程式的朋友寫出一大長串的程式碼,不易讀也難除錯

經過同事的引導後,我學會將新任務/問題做拆解

逐條寫成函式並加註解,這樣讓程式可讀性變高,也容易除錯

最重要的是,當新同事或者下個人來接手程式碼時,比較好理解唷!

分享就到這囉,感謝觀看~


畢竟本文章第一版還是日記式學習,這邊就紀錄一下當時的狀況囉!

11/14, 11/15




學習寫Unit Test
    看單元測試的藝術 二版
    實作Test Case 撰寫
學習重構
    看重構--改善既有代碼的設計

平淡及瑣碎的重構步驟再搭配完整的測試配套(測試之於重構極其重要),才是「不帶來破壞,不引入臭蟲」的最佳保障

以往在碩班,由於趕專案加上新手,完全沒有寫程式的流程,也沒有所謂先設計後撰寫程式,以及搭配以上所提之技術,寫出的程式碼除了雜亂不彰外,後人也很難改寫及維護

我相信在提升這些方法與概念後,能夠在撰寫程式與軟體開發的領域中有所提升


最後!!我再度看到了我在研究所念的paper教科書上,敏捷方法的其中一個方法了Q0Q!!

想到這些我以後會學習並實用,我就覺得很興奮!!

Extreme programming (XP)


紀錄一下今日學習小指令

Linux

# find
find /home/username/ -name "*.err"




# rm -r file using yes to all question
yes | rm -r trunk




# Install R
# Install RStudio




# Import unittest
python package: <a href="https://docs.python.org/3/library/unittest.html">unittest</a>




# open a new project
$ mkdir [project_name]
$ cd [project_name]
$ python -m venv .venv
$ source .venv/bin/activate
$ pip install -r requirement (or install python package)
# .. open first .py file




# using .gitignore file to ignore what file don't git
.gitignore




<span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd
df = pd.read_csv(<span class="hljs-string">"data/example.csv"</span>)




# !/usr/bin/python

import os
for root, dirs, files in os.walk(".", topdown=False):
   for name in files:
      print(os.path.join(root, name))
   for name in dirs:
      print(os.path.join(root, name))