15610455225_f60e927f88_z

工程師的缺德行為:叫朋友去學C/C++

常常看到非資訊背景的朋友問工程師:我最近想學寫程式!該怎麼入門?

通常他們會得到很多糟糕的答案:「先了解演算法」、「先弄懂資料結構」、「先認識物件導向」。

這些答案都夠糟糕了,但最糟糕的答案莫過於「從C/C++開始入門」。

(我看過最扯的建議是「去找C++ Primer Plus來看」。這本磚頭書絕對不適合一般人自學)

照著以上建議去做的朋友,大概會在兩週之內就得到滿滿的挫折感,然後認為自己「果然不適合寫程式」,也不好意思再去跟工程師講自己的狀況,最終再也不想踏入programming領域。

這些建議真是害人不淺。

資訊相關科系,是因為要接續到之後的資料結構、作業系統,所以大一從C/C++開始入門會比較連貫、才能完整學一次電腦的基本知識。

而這些想學coding的朋友,大部分只是這兩種情況:

A. 最近覺得寫網站好酷,想試試看自己能否寫個blog、或是個人網頁
B. 對工作上某些人工流程不滿意,想試試看自己能否學寫程式、用電腦解決問題

他們的願望僅此而已,並沒有打算成為電腦專家、駭客,實在沒有必要從C/C++入門。

就像點火一樣,先從零星的火苗開始、小心保護不要讓它熄滅,接著慢慢加東西進去、讓火焰慢慢成為大火。學習,除了知識/技能之外,培養成就感與熱情也是很重要的。而從C/C++入門,會讓正要萌芽的小火苗直接消滅殆盡。

我對程式設計入門的建議很簡單。
如果你是狀況A,去學PHP&MySQL,先弄一個醜醜網頁出來就可以了。
如果你是狀況B,去學Python,先弄一個能執行、能顯示幾個文字的程式就可以了。

一般人想到程式通常只想到「圖形化介面」,如果能寫出一個有介面的小玩意會非常有成就感。
那樣的話,學PHP來寫個網站、直接就是介面,絕對有趣;學Python很快就能把玩內建的tkinter函式庫、做出按鈕做出選單,樂趣無窮。

話雖如此,你到市面上找PHP或是Python的書,大概還是會落得「滿滿的挫折感然後正式放棄」的下場。

別擔心,這不是你的錯,是那些書寫得不夠好。沒有一本是真正的程式設計入門書。
那些書只想著給你知識/技能,沒有想到要培養你的成就感、保護你的熱情。

要找書的話,我只建議兩本。

狀況A,去找歐萊禮的「深入淺出 PHP 與 MySQL」(Head First PHP & MySQL)。
狀況B,去找歐萊禮的「深入淺出程式設計」(Head First Programming)。

已經出社會了嗎?去台灣大學資訊系統訓練班逛逛吧,看看時間跟課程費用能否負擔(我有經濟系背景的朋友去上過幾堂課程,學得滿開心)。

政府也有推動青年就業讚的課程,滿足某些條件還能申請補助(不過,我有朋友上過其中一堂PHP課程,印象很糟糕、覺得是業者要賺政府補助款隨便開設的課程。但畢竟是單一經驗,我還是列出來給各位參考。)

國外的線上開放課程也可以考慮。

Coursera的

人人都懂的編程課(Python)

學習編程:基礎

麻省理工的

Introduction to Computer Science and Programming

A Gentle Introduction to Programming Using Python

全部都是用Python入門。

我對程式設計入門的建議就只有這樣。你不需要知道什麼演算法、資料結構、物件導向。
什麼狗屁名詞都不需要知道。那大多只是工程師下意識地想讓你覺得他們很厲害而已。

你只要想辦法寫出一個會動的程式就可以了。所有偉大的東西都是這樣開始的。


Q1: 但是狀況A還要面對HTML/CSS耶.. 好像很難?
每個技能深入下去沒有不難的。但是HTML/CSS要入門實在不怎麼難。
就從隨便寫幾個表單或按鈕、弄個醜醜的靜態網頁出來開始吧。

Q2: 我是工程師,我能怎麼幫助朋友?
幫他們搞定環境設定吧!幫他們把最基礎卻又最給新手挫折感的環境給設定好!讓他們能用記事本跟幾個小工具就開始寫code!給他們成就感!

Q3: 那寫手機app呢?你怎麼沒提到?
我覺得手機app還滿難入門的,實在給不出有建設性的建議。不知道。不過,上面的連結也許有一些手機相關課程,不妨試試?

(Photo via Sano Rin, CC licensed.)

  • http://yang.turn.tw/ Jhen Yang Chen

    現在對我來說最喜歡的是解決問題的成就感

    • 尤川豪

      good job

    • http://www.allenj.net/ Allen J

      沒錯,我寫了六、七年,現在遇到問題,分析、思考、解決,所產生的成就感,真的很爽

  • Herry

    有些非資工系的科系會從flash 的actionscript開始玩
    其實也不錯

    • Argos

      當真!?
      要玩actionscript還不如直接玩javascript阿…
      flash已經快失勢了

      • sh

        你是外行人吧 我已經用actionscript寫了 兩個在app store上架的軟體
        一個企業級的,2015還有大型的開發團隊加入actionscript Mxml開發

        • 周昱安

          任何工具都有其利用的價值與擅長的領域 as也不例外
          但它必定走向歷史是事實 HTML5無疑的最終會在大部分地方取代它

          • sh

            不爭辯!目前個人app獲利高於瀏覽器,自身過的富足有餘即可

        • Argos

          我的確外行
          但這篇文主要的對象不就是外行?
          你當真會推薦一個程式新手學AS?
          就因為你用AS寫的APP很賺錢嗎?

          • sh

            抱歉我失言了~為我的無理道歉
            AS 結構較嚴謹,以我個人專業
            的確是推薦新手入門 學了AS 也等於學了OOPS 跨足PHP 也不是問題

      • Herry

        呵呵 你說的也是啦
        上次碰as3已經是五年前了
        不過以入門來講 AS3比較扎實

        • 神修

          我是學flash as3的國二生www

    • args

      正統科班出身的都知道,
      沒有任何語言走入歷史,
      大都經過一次大挫折然後不停變種。
      會這樣說應該是太執著瀏覽器或是只會HTML
      而不會繪圖的設計人員。
      js太混亂,而HTML又太廉價,真的很難吸引高手投入,不如投入python實在多了

      • Herry

        想不到Actionscript大家這麼推
        可惜我到現在還是覺得他快被淘汰了
        不然其實AS3.0還滿有架構
        跟C#,java幾乎要一模一樣 (疑?

        • toppy368

          因為C#與JAVA都是從C/C++為概念改良而成的語言,所以風格類似

      • sh

        青菜蘿蔔各有喜好,別爭了,作者在推廣基礎資訊,怎麼失焦了
        話說 還好actionscript 在去年 蘋果發佈限制64位元 後 沒兩週內就支援ios64
        讓我們團隊大歡呼。
        Args 你在哪做 要來我們這嗎 ,做軟體的,去年小獲利10~15%

        • args

          不了。我這裡也不錯,不寫瀏覽器用的網頁程式以後過的比較輕鬆,也不常加班爆肝

          • voto0909 voto0909

            請問你有LINE或微信嗎

        • voto0909 voto0909

          _請問你有LINE或微信嗎

  • Bob

    C沒很難啊,感覺作者在賣書

    • Argos

      易學難精阿
      要寫Hello world和九九乘法表當然不難阿 XD

  • Development Tu

    我是台大電機畢業的學生
    目前從事電路設計的研究
    我從大學開始就超怕software的
    理由完全是你講的這樣

    大部分人coding的需求根本與計算機原理無關
    所以不是每一個人都需要從計算機原理切入
    我現在常常在工作上要接觸一些code
    但是僅止於模擬電路行為的需要
    根本不用懂到那些計算機程式一開始要教你
    (重點還講不清楚)的概念
    我接觸的資訊領域教授或書籍也太喜歡講一些行話讓人無所適從

    這個概念應該要好好推廣

    • args

      yes

    • Ss J

      電機電路方面的CODING 偏向嵌入式系統方面吧?

  • Joe

    我的情況應該屬於B
    當年NOKIA的Symbian還流行的時候有個Python for S60的平台
    當時會接觸coding就是因為某支程式有bug,找不到任何解法只好自己嘗試debug
    不過當時覺得學程式很難(當時雖然看得懂,但要自己寫卻只會Hello World),所以後來沒有繼續走….

    結果四年後的現在,被電機系三電一工洗禮之後,我還是乖乖的用C來解決畢業的需求了….

  • tzuchin

    分享青贊:
    青年就業贊其實還不錯,
    只是就我所上過的課來說,
    他是政府補助由電腦補習業者(聯X、巨X等等..)去申請排課,
    師資的好壞只能說運氣,
    至少我遇過的LINUX & PHP 課程的老師都不錯噢~

  • Mickey Chuang

    我去年招了一個小徒弟, 就是從完全沒接觸任何程式就開始學 C, 還是嵌入式 C, 他上個月已經獨力完成了一個用來鎖軟體的 USB Key Lock 專案, 而且還順便學會了簡單的單晶片電路設計, 這年頭會 C 的人越來越少, 可 C 還是 C, 它沒有變得比較難, 我昨天在跟人介紹 Scratch 的時候, 還有人說怕太難, 可見是人越來越不想學習, 不是 C 越來越難

    • Ss J

      拜託不要把寫系統跟寫遊戲或網頁混為一談….
      現代很多年輕人想學的是做遊戲… 從C開始的話真心覺得比較浪費時間… 純C的用途跟具有影音娛樂用途的語言是不同的…. C有C的專門領域… 不要只用一個角度看世界

    • voto0909 voto0909

      請問你有LINE或微信嗎?

      • Mickey Chuang

        那你你有LINE嗎?

  • Chuck Lin

    推薦一下哈佛的課程
    https://cs50.harvard.edu/
    使用程式語言前,我想更重要的是了解電腦以及程式如何運作的。

  • Roy Cheung

    工程師too

    工程師的學習歷程永遠伴隨著演算法和資料結構, 而出來工作的程式員都會認同這是必須要懂的, 建議學這些是因為這是真正的基礎 (對於 A 來說或許起步時還可以, 但要寫個稍微可以互動的網頁都要用到吧.. B 應該一開始就要知道了. 或許不知道叫作演算法/資料結構, 但其實也要用到, 知道了就更能靈活高效)

    工程師不少由 C/C++ 學起, (近年可能不學 C/C++ 而以 Java 為基礎), 或者學起來是辛苦的 (我們都這樣走過來, 我們明白), 但一路上會學到(電腦)世界的真理, 是成神之路 (笑). 其他語言都難以做到. (雖然如此, 但推薦朋友由 C/C++ 入門確實有欠考慮..)

    個人推薦學 javascript, 用 chrome 就可以 run 了, 而且未來將沒有 javascript 做不到的事! :P (#node.js)
    PHP 和 Python 都很好. 不過個人喜歡 java

    發牢騷一句, 告訴那些名詞也是好的 (你也知道. 那幾個名詞真是起步的錨點) 至少知道要找什麼, 比如想學物理, 知道有牛頓力學、相對論、量子力學、弦理論這些名詞總會幫得上忙吧, 如果學 javascript, 必要知道的一個名詞叫 closure, 不然會死得很慘, 對吧..

    • args

      如果要打基礎 我認同JAVA 也是可以的
      javascript有地雷,ㄧ定要資工基礎,
      ,如果沒資工基礎學入門用套件是很快
      ,後面痛苦程度很高

    • toppy368

      幫原作者補充,他提到APP…
      APP若以Android來說
      他的表面UI是XML
      然後跟隔壁棚微軟C#一樣物件導向概念(比喻)
      按鈕按下去背後的程式碼是JAVA

      若以APP來學程式語言,我覺得不好入手
      不過我覺得至少比eclipse好(JAVA IDE之一),能看到外觀長怎樣

  • Cooky Cooky

    我以爲澆滅小火苗是行善的說(誤

  • Angus

    從excel開始吧

  • mingderwang
  • 鄭衞

    在下只學過一點C++(還有一點C)提出一點點小意見
    其實不是缺德0.0是我們太習慣學東西先弄通原理的教條
    但我還是覺得原理很重要,因為寫程式本身就是解決問題
    有一些基本功,就像進實驗室前要有些常識
    才不會爆炸或燒起來XDDD
    但是基本功的練法不是像考大學一樣苦讀苦背
    是自己去試(把程式改改看會出現甚麼)
    “資工”是”工程”,是非常實用的
    不是熟讀語法或是物件導向的教條就可以寫程式
    是需要手腦並用
    一邊自原理思考,一邊動手try
    在degug的無限循環中慢慢增強功力
    我覺得太講求理論(比方說執意用布林代數或數學詮釋一切)
    或是為太求編寫方便(像採用大量的編譯器巨集做包裝,或是不宣告變數型態)
    都會有反效果

    程式語言越來越懶人包(套一句生科的話,一堆kit)
    只要懂得操作API就行(物件導向氾濫的結果0.0)
    實為應用方面的一大福音(所謂站在巨人的肩膀上XD連一個簡單的hallo world後面都都有無數AT&T先賢的血汗XDDD)
    但是也離當初電腦的基本設計越來越遠….
    大量重複相似API包裹….(很像日益肥大的政府官僚系統….)
    (有興趣可以追一追C語言printf的原始碼,你會發現在真正用system call輸出前就有一堆巨集包裝和複雜的檢查….輸出的system call其實又是Linux核心將硬體介面抽象化的一部份…..)
    很好奇量子電腦真正邁入實用時
    韌體和軟體架構的重構
    代工王國有沒有份XDDD(光只是用API是不行的XDDD)

    這不是都市人的黑箱症候群嗎XD

  • JoJo

    又寫得幾好喎,不過我學左一年C++ 另加一年OpenGL其實都唔係好識用姐, 不過要訓練邏輯,C++都可以的吧

  • 林佑昕

    scratch?

  • wilson

    如果是作教學用途, 那你應該學Pascal。可是你問工程師他們不是教師, 他跟你推薦c/c++是因為他明白真正強的programmer是要懂得今天所有編程語言的概念, 比如oop或是記憶體管理方式。換句話說希望你能學一種比較低階的語言, 完全了解機器的抽象世界, 那以後再學其他高層語言(說穿了就有很多現成的罐頭可用)就很靈活了。若然一個人學了python或vb那類語言時間長了, 進步會有困難, 甚至許多人以後就不會進步了。這就是所謂學壞手, 與今天很多人只追求做到一個70分, 能用就好的產物就算的心態一樣道理。在一個行業的角度是這是有害的, 甚至對於一有志投身編程行業的人也有害–那段不上不下的痛苦時間不比你所謂c/c++所帶來的打擊少, 所虚耗的光暗也許更長。再者要學基本概念Pascal還快, syntax也相對簡單。如果你覺得python和php快有成功感那是未學行先學走, 摔下來會更痛。因此我覺得以c/c++來做基礎毫無不妥, 只是若果你只求70分, 那php/python的確更適合。

  • Tang Heidi

    我是因為想做作品網站,一開始只是用簡單的html+css後來找了jquery套件加上去,然後有去上課學javascript跟jquery不過覺得很難,而且不知道如何應用,可能很多書都在教作表單的東西,我只想學網頁特效,然後就只好改找到現成的code,網站已經重寫3次以上了,目前在看國外教程學bootstrp…希望有天能學好jsp,看了這個文章,覺得挫折感沒這麼強了…

  • Ss J

    講到我的心聲了~ 很多經驗者或老師常說甚麼要從基礎開始之類的….
    但我覺得錯不在 C/C++ 而是在於參考書裡面講些甚麼或參考資料有哪些內容和示範的內容~ 很多基礎書沒教你怎麼寫 “功能” 或 “事件”…
    問題不在語言~ 而是教的人的觀念以及教你甚麼…. 希望標題和內文可以稍微改一下…. 畢竟C++也是可以寫視窗 寫遊戲…
    我覺得寫程式不需要蓋樓理論…. 基於效率~ 我們需要的是實務的投入~ 那些寫程式的基礎面根本不用花那麼多章節和時間去吸收~
    一堆書教了那麼多演算法和資料處理方法我還是不知道怎麼寫出 “有畫面的功能” 阿…. 這時代誰還用DOS軟體?

    不過這也難怪會有寫遊戲的專門書推出了~ 我看過內容~
    完全不需要事先接觸基礎的程式設計直接看專門書就好~

  • 禾佳

    幾個月前因為某些因素需要學語言,從0開始
    (以前只會EXCEL VBA拿人範例剪剪貼貼弄個框架勾勾的)
    一路擺擺蕩蕩三個月,找了國內外一堆聖人名書影片,三個月學沒半樣會

    最後朋友丟一個台灣C語言的基礎教學課程,連一個;也教你為什麼
    接著一個月過去學得差不多,練習題全都能寫出來還能寫出2~3種變化。然後嘗試套上以前EXCEL弄的一些風險管理系統後,開始接觸到R語言。

    現在覺得最重要的還是基礎功,不管什麼語言~在好的書或老師,如果無法以初學者的真正立場去做教學,那學生依舊只是瞎子摸象知其一不懂為什麼?然後遇到變化就不知所云了!

    預料不到不想從傳說中最可怕的C入門,最後還是回過頭先摸會C,才開始看懂其他語言在寫什麼……而且是GO、R、RUST、SWIFT都能看懂並跟著試試看結果,目前感覺差在要另外學這裡面差異用法和強處。

    然後現在C是在學怎樣連接RS232~因為工程上要用到,R語言暫時是私人興趣要用的東西。

  • Ss J

    我認為要實做作品的話不用先接觸那些基礎… 先弄雛形再搞底層

  • Ss J

    現代很多一般人想學的是做遊戲或APP或網頁… 從C開始的話真心覺得比較浪費時間…
    純C的用途跟影音娛樂用途要下的功夫或用的工具甚至用的語言是不同的….
    C有C的專門領域… 光是 C和 C++ 的應用範圍就有差別~

  • toppy368

    看了整串討論帖,該不會是這樣 ?

    樓主的基礎>進階派:
    先在任何程式語言上實做出Helloworld或四則運算,暫時不去研究計算機理論知識

    資訊相關科系及部分留言的理論優先派:
    計算機知識+程式必須同時學,避免錯誤的觀念造成效能差、可讀性差、後人難維護等狀況發生

    這樣的理解沒錯嗎 ?

  • UU TTK

    寫程式為了就是應用…有目的的學習才是動力來源..不管是邪惡或是正就全人類..或是把妹

  • jason chen

    我好缺德