侧边栏壁纸
博主头像
修恩的 Paradeisos博主等级

παράδεισος

  • 累计撰写 20 篇文章
  • 累计创建 4 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

初學程式的那些苦惱挫折

Ashun
2024-02-23 / 0 评论 / 0 点赞 / 41 阅读 / 4633 字

初學程式.png

近年程式教育的推動,讓更多人接觸到編程。無論是各科系的大學生或是國中小生,都至少在學校接觸過一點類似的課程。

除了我自身的學習經驗之外,亦擔任了青少年程式講師近 5 年,以及但任大學助教與研究助理一年半。教學對象從小三到大四,當然,我自己也依然同時繼續作為學習者持續學習。

過程中我得到一個結論: 大人與小孩初學程式,其實沒有太大的區別。 兩者會遇到的狀況與狀態,基本上可以說是大同小異。所以,今天讓我以分享的心態,來總結一下我多年來的觀察。

究竟? 程式難在哪裡? 初學者又會遇到什麼困難?

認知的衝擊

程式學習的第一個困難,就是它有別於日常生活的邏輯形式,這讓閱讀程式教材如同翻閱天書。最主要的差異在於 明確的定義極致的細節

畢竟電腦是01組成,沒有模糊的地帶,因此明確的定義就相當重要。一上來就開始講定義,這會讓很多人受不了。我舉個例子,程式教材第一堂課: 變數。整數 (Integer)、浮點數 (float)、字元 (char)、字串 (string)、布林值 (boolean),雖然這些並不困難,但就如同我第一次面對這些時的疑問: 特別定義這些要幹嘛??

生活上我們也會用到整數與小數,也會寫字,但我們幾乎不會去刻意去分別它們。同樣一個 3,可以是整數的 3,也可以是小數的 3.0,這在一般人眼裡完全相同,但在軟體工程師眼中,這些完全不一樣。甚至同樣是 3 ,整數型別的 3 與 字串型別的 3,在程式設計上必須嚴格區分。

另一個例子就是 等號 (=),程式中等號意味著的是賦予,而數學上相等的概念在程式中必須用 雙等號(==)。

再來就是細節的部份。無論是大人小孩,真正第一次被勸退的原因,大概都是因為無法接受程式碼對細節的極度敏感。很多人在課堂上很開心地跟著老師寫了一段程式碼,然後到執行的時候,發現有一堆 bug。檢查了半個小時依然找不出問題在哪裡,結果一問老師才知道,原來是某一行結尾少加了分號......。

這著實讓人腦火,反反覆覆折騰幾回,心態上離放棄就不遠了。

很多人不理解為何會這樣? 難道不能「差不多就好」嗎? 其實這跟上面明確的定義是一個原理。我們寫好的程式在執行的時候會先被 編譯器(compiler) 轉換成電腦看得懂的語言,也就是01,然後在執行。在這個轉換的過程中,由於最後01是死的,因此程式碼也必須是死的。

例如分號為何必須加? 因為分號在電腦看來是用來分行斷句的,你不加分號電腦就不知道斷句段在哪,自然會出問題。什麼? 你說可是 python 不用分號啊? 沒錯,python 是直接看你是否換行沒錯,但這樣不用符號斷句的機制在諸如 if, else, while 等需要區分內外的結構會出問題。因此 python 雖然不用加分號與括號,但他講求完美的縮排,四隔空格,一格都不能少,也不能多。

總之不管任何一種語言,總是會有一個逼瘋初學者的地方。

沒有明確的目標

以前當程式課助教的時候,每到學期末總是有好學的學弟妹跑來問: 助教,請問之後可以再去上什麼課程?

我通常建議直接找一個簡單的小專案去做。其實,大部分人都過於妄自菲薄! 僅僅是學會變數、判斷式與迴圈等基本概念,已經足夠完成一些簡單的專案。

代碼本身是一種工具,不是百科全書裡的知識。所以在學會工具的基本用法後,先上手嘗試才比較實在。這跟學外語是一個道理。200個英文單字也足以與外國人做最最基本的溝通。

所以說學弟妹們的這個問題總是讓我不知道怎麼回答,學完一學期的課無法用程式做出東西來,初學者們總以為是程度問題,但我覺得是觀念問題。

其實我很能理解他們的心情,因為我當年也是這個情況。以前在徬徨的時候,我向一位業界工程師請教過同樣的問題,他回答我: 你去找一個你想做的功能,然後想方設法搞出來就對了!

這時我遇到另一個問題,那就是我根本不知道我學的這些到底可以做出什麼。如果要知道有什麼可以做,那我需要更多開發的經驗; 而要有開發的經驗,就要先做再說。

如果你認為你東西做不出來是因為自己學的不夠,因而跑去學更多程式課程,卻從來不著手從頭開始完成一個專案,那這程式大概是學不起來了。程式沒有學完的一天。

所以說,Just do it 才是王道,不用管做不做得到,因為你完全可以做中學。

注意本段的標題: 錯誤的目標。一些人接觸了程式課程,學了各種語言各種知識,但到頭來還是一個功能都寫不出來。原因就是他們的目標錯了。

我們學程式只為了一個目的,那就是做出我們想要的功能,甚至是產品。 在反覆研究程式這個「工具」之前,請先上手用吧! 一把槌子在不斷使用之後,也才會知道怎麼握更舒適,什麼角度敲最省力,對吧!!

至於「不知道可以做什麼」這一點,真的只能透過越做越多,在看過別人寫的程式碼與專案之後,才會知道原來還可以怎麼做。

這是一個迭代的過程,只有當我們開始迭代,整個機制才會被運作起來。

開始放棄

當初學者們終於下定決心,要來嘗是製作一個新專案,此時,真正的挑戰才剛剛要開始。

打開 google 一查,各種專業術語、英文文檔,寫個兩行就一堆 Bug,都會不斷打擊信心。要學的東西實在太多了,真的太多了。這些反覆的過程持續的消耗著熱情,並且要投入大量的時間。

給不太懂程式的人一個比喻,又拿英文來舉例。這個階段就像你剛學完英文的各種單字文法,當你以為可以就此與外國人無限暢談的時候,發現說出來的英文讓對方滿臉疑惑。很顯然,你確實背了很多單字,也確實練習過文法,但這是完全不夠的。

此時你會發現,學會單字文法不過是基礎中的基礎,還要再學習母語人士麼說話的音調、慣用片語、說話節奏,甚至是他們的文化。

程式也是一樣,而且更加殘酷,語言可以只鑽研一種,但程式不行。只要開發一些稍微複雜的傳案,很多時候都會用到兩三種程式語言,除此之外你還要讓他們協作。

我大學讀的是電機系,程式不是我們必修的課程,但幾乎每個學期都有相關的課程。大多數同學在跨過初學階段之後,都會在這個階段放棄。這是一個讓你真正意識到巨大鴻溝的階段。

我是一個比較較真的人,即使到現在我常常也是程式寫一寫遇到困難,休息一下之後開始想: 林北就不信今天解決不掉你這鬼問題。

像我這種個性,又對程式有興趣的人,大概率就不會輕易放棄,最終在程式的世界殺出一條血路。我現在身邊的同事,也大多是這種性格,一種死刻到底的意志。

能夠在軟體工程上有一定建樹的人,很大概率不會是一個「正常人」。他們不但擁有抖M的變態癖好,還整天在生活上定義來定義去,邏輯思維也很不日常。

所以說如果你有親人或愛人是軟體工程師,請不要責怪他們邏輯很不日常。第一、若它們保有日常的邏輯,根本無法成為軟體工程師,第二。他們若要較真起來,在邏輯上你大概贏不了。

好啦! 我也承認這一行怪人確實挺多好不好! 媽的有些工程師真的是有夠難溝通 XD

回到標題,如果你正處在這個階段,那請盡你最大可能不要放棄,如果真的撐不下去了,那就放棄吧! 當人正常的人類不也挺好的嗎?

停留在代碼

在我大三時有次跟我指導教授聊天,聊到有些人寫代碼會寫到走火入魔。跟練功用力過猛一樣。

到了某一個階段,會發現自己已經可以透過官方文檔拼湊出自己想要的功能,可以讓東西動起來。這很讓人興奮,不是嗎?

但千萬不要在這裡太過留戀,能動是一回事,能夠使其良好運作又是另一回事。就像上上一段說的,作為工具我們要即時上手使用它,但當基礎功能學會之後,就要開始精進技巧了。

在中國有一個詞彙: 碼農。指的是那些會寫程式,卻也只會寫程式的代碼農夫。別人要什麼功能,他們能生出來,但就到此為止。

真正軟體工程師的工作,花在寫代碼上不是最多的。很多時間是在想架構、開會討論,或者做一些測試。有時候不是代碼寫得越多越好,你花一個星期寫好的功能,可能資深工程師半天就完成了,程式碼還比你簡潔。差別在哪裡? 在那些代碼以外的東西。

資料結構、軟體架構、設計模式...等,這些都是可以精進的部分。 別忘了,軟體工程相當講究效率,與其花時間堆程式碼,不如花時間設計良好的架構。溝通也是一個重要的技能,除了工作上協作之外,良好的溝通還可以促進相互學習。

其實英文也是一個點,我們非英文使用者在這方面有很大劣勢。不過時至今日對岸也有很大的中文開發社群,相較於以前,現在除了最前沿的論文或最新技術之外,大多可以在網路上用中文學到自己想學的東西。

這也是我架這個部落格的一個原因,在那些數不清的深夜,左邊看著各大神寫的部落格,右邊照教學敲著代碼。現在也是我加入討論與貢獻的時候了!

結尾

學不完阿! 真的學不完。但這正是我認為有趣的地方,在這裡永遠不會厭倦,每天總是有新的酷東西被全世界的創造家們上傳到 Github(一個代碼倉庫)。

這個技術更新的速度真得是快到以月來計算的,真正的日新月異。

現在我需要什麼功能,一般人可能要等人開發,但我可以著手自己搗鼓出來。這真的很好玩,你要我一輩子玩這些都沒問題,多到玩不完。

不知道依找我教授的說法,我這樣是否算是「著魔」了呢? 不知道。

如果你正在程式學習上遇到困難,然後你又很喜歡,那請繼續加油。我只能說......

你一定是個抖M,哈哈哈哈哈~之後肯定會越來越爽的。

评论区