├── .eslintrc.js ├── .gitignore ├── README.md ├── codewar.md ├── examples ├── README.md ├── week11 │ └── README.md ├── week12 │ └── README.md ├── week13 │ └── README.md ├── week14 │ └── README.md ├── week16 │ └── README.md ├── week17 │ └── README.md ├── week18 │ └── README.md ├── week19 │ └── README.md ├── week2 │ └── README.md ├── week21 │ └── README.md ├── week22 │ └── README.md ├── week23 │ └── README.md ├── week24 │ └── README.md ├── week3 │ └── README.md ├── week4 │ ├── README.md │ ├── hw3.js │ ├── package-lock.json │ ├── package.json │ └── twitch.js ├── week6 │ └── README.md ├── week7 │ ├── README.md │ └── hw1.html ├── week8 │ └── README.md └── week9 │ └── README.md ├── homeworks ├── week1 │ ├── README.md │ ├── hw1.md │ ├── hw3.md │ ├── hw4.md │ └── hw5.md ├── week10 │ ├── README.md │ └── hw1.md ├── week11 │ ├── README.md │ ├── hw1 │ │ └── index.html │ ├── hw2 │ │ └── index.html │ ├── hw3 │ │ └── index.html │ └── hw4.md ├── week12 │ ├── README.md │ ├── hw1 │ │ └── index.html │ ├── hw2 │ │ └── index.html │ └── hw3.md ├── week13 │ ├── README.md │ ├── hw1 │ │ └── index.html │ ├── hw2 │ │ └── index.html │ ├── hw3 │ │ └── index.html │ ├── hw4.md │ └── todo.png ├── week14 │ ├── README.md │ └── hw3.md ├── week15 │ ├── README.md │ └── hw1.md ├── week16 │ ├── README.md │ ├── hw1 │ │ └── index.html │ ├── hw2 │ │ └── index.html │ └── hw4.md ├── week17 │ ├── README.md │ ├── hw1.md │ ├── hw2.md │ ├── hw3.md │ ├── hw4.md │ └── hw5.md ├── week18 │ ├── README.md │ ├── hw1 │ │ └── index.html │ ├── hw2 │ │ └── index.html │ ├── hw3 │ │ └── index.html │ └── hw4.md ├── week19 │ ├── README.md │ ├── hw1 │ │ └── index.html │ ├── hw2 │ │ └── index.html │ └── hw3.md ├── week2 │ ├── README.md │ ├── hw1.js │ ├── hw2.js │ ├── hw3.js │ ├── hw4.js │ ├── hw5.js │ └── hw6.md ├── week20 │ ├── README.md │ └── hw1.md ├── week21 │ ├── be │ │ ├── README.md │ │ └── hw1 │ │ │ └── index.html │ └── fe │ │ ├── README.md │ │ ├── blog.png │ │ ├── hw1 │ │ └── index.html │ │ ├── hw2 │ │ └── index.html │ │ ├── hw3 │ │ └── index.html │ │ └── hw4.md ├── week22 │ ├── be │ │ ├── README.md │ │ ├── hw1 │ │ │ └── index.html │ │ ├── hw2 │ │ │ └── index.html │ │ └── hw3.md │ └── fe │ │ ├── README.md │ │ ├── hw1 │ │ └── index.html │ │ └── hw2.md ├── week23 │ ├── be │ │ ├── README.md │ │ ├── hw1 │ │ │ └── index.html │ │ └── hw2.md │ └── fe │ │ ├── README.md │ │ ├── hw1 │ │ └── index.html │ │ └── hw2.md ├── week24 │ ├── be │ │ ├── README.md │ │ └── hw2.md │ └── fe │ │ ├── README.md │ │ ├── hw1 │ │ └── index.html │ │ └── hw2.md ├── week3 │ ├── README.md │ ├── hw1.js │ ├── hw1.test.js │ ├── hw2.js │ ├── hw2.test.js │ ├── hw3.js │ ├── hw3.test.js │ ├── hw4.js │ ├── hw4.test.js │ ├── hw5.js │ ├── hw5.test.js │ └── hw6.md ├── week4 │ ├── README.md │ ├── hw1.js │ ├── hw2.js │ ├── hw3.js │ ├── hw4.js │ └── hw5.md ├── week5 │ ├── README.md │ └── hw1.md ├── week6 │ ├── README.md │ ├── example.png │ ├── example2.png │ ├── hw1 │ │ └── index.html │ ├── hw2 │ │ └── index.html │ └── hw5.md ├── week7 │ ├── README.md │ ├── acco.gif │ ├── calculator.png │ ├── carousel.gif │ ├── form.png │ ├── hw1 │ │ └── index.html │ ├── hw2 │ │ └── index.html │ ├── hw3 │ │ └── index.html │ ├── hw4.md │ ├── reaction.gif │ └── twitch.png ├── week8 │ ├── README.md │ ├── hw1 │ │ └── index.html │ ├── hw2 │ │ └── index.html │ ├── hw3 │ │ └── index.html │ ├── hw4.md │ ├── twitch.png │ └── twitch_amelie.png └── week9 │ ├── README.md │ ├── board.png │ ├── board2.png │ ├── board3.png │ ├── hw1.md │ ├── hw2 │ └── index.html │ └── hw4.md ├── package-lock.json └── package.json /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es6: true, 5 | node: true, 6 | jest: true 7 | }, 8 | extends: 'airbnb', 9 | globals: { 10 | Atomics: 'readonly', 11 | SharedArrayBuffer: 'readonly', 12 | }, 13 | parserOptions: { 14 | ecmaFeatures: { 15 | jsx: true, 16 | }, 17 | ecmaVersion: 2018, 18 | }, 19 | plugins: [ 20 | 'react', 21 | ], 22 | rules: { 23 | "no-console": "off" 24 | }, 25 | }; 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | conn.php 3 | .DS_STORE -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 程式導師實驗計畫第三期 2 | 3 | ## 這是什麼 4 | 5 | [程式導師實驗計畫第三期](https://medium.com/hulis-blog/mentor-program-3rd-47a2e85e33b3)是一個為期六個月的計畫,要求學生付出一定的時間(每週至少付出四十小時),希望能在結業時培養出合格的(意思就是找得到工作)的工程師,並且在就職後依舊能持續成長,成為好的工程師。 6 | 7 | ## 課程目標 8 | 9 | ### 核心能力 10 | 1. 具有找資料的能力,能夠知道如何找到相關資訊 11 | 2. 具有分析問題的能力,能夠快速定位問題 12 | 3. 知道如何解決問題,包括但不限於拆解問題、簡化問題、轉化問題 13 | 4. 解決問題後能夠重新歸納並整理 14 | 15 | ### 工具能力 16 | 17 | 1. 後端:知道後端原理,知道什麼是資料庫、Server,可以寫出簡單的網站並且自己部署 18 | 2. 前端:知道前端原理,HTML、CSS、JavaScript,知道 Ajax 以及如何與後端串接 19 | 3. 資安:基本資安概念,SQL Injection、XSS、CSRF 20 | 21 | ## 課程規則 22 | 23 | ### 1. 每日進度報告 24 | 25 | 為了更方便追蹤大家的進度,必須在禮拜一到五每一天簡短報告自己今天學了什麼和碰到什麼問題(已解決或未解決),除了作為淘汰制的參考以外,其實也是幫自己簡單複習一下所學過的東西。 26 | 27 | 進度報告你可以選擇早上 po 或是晚上 po,早上的話就是講昨天的事,晚上的話就是講今天的。 28 | 29 | ### 2. 每日心得(鼓勵但非強迫) 30 | 31 | 之前我有寫過一篇文章叫做[《每一篇心得都有價值——為什麼初學者才更應該要寫心得筆記》](https://medium.com/hulis-blog/why-blogging-ab77fd8c6ffa),裡面跟大家稍微講了一下寫心得的好處,在這課程中我也希望能把這個習慣帶給大家。 32 | 33 | 每天寫心得真的不是件容易的事,連我自己都做不太到,因此這一項是「鼓勵非強迫」,你沒有做到也沒關係,但我希望至少能夠每個禮拜寫個兩三篇,重點其實是在連續,這樣才有完整的紀錄可以看。 34 | 35 | 心得內容其實要寫什麼都行,沒有強迫,你簡單寫三個字:「我好累」或是「收穫多」也都可以,當日記在寫就好,我之前就先示範了[每日筆記](https://github.com/aszx87410/daily-notes/issues),記錄一些教學上的思考。 36 | 37 | 若是你不知道心得該如何下手,這邊推薦一個不錯的模板叫做 ORID 筆記,每天根據這四項來寫: 38 | 39 | #### Objective 客觀 40 | 41 | 關於今天的課程,你記得什麼? 42 | 完成了什麼? 43 | 44 | #### Reflective 感受 45 | 46 | 你要如何形容今天的情緒 47 | 今天的高峰是什麼? 48 | 今天的低點是什麼? 49 | 50 | #### Interpretive 解釋反思 51 | 52 | 我們今天學到了什麼? 53 | 今天一個重要的領悟是什麼? 54 | 55 | #### Decisional 決定行動 56 | 57 | 我們會如何用一句話形容今天的工作? 58 | 有哪些工作需要明天繼續努力? 59 | 60 | 有了基本架構之後會容易很多,你只要根據提供的問題模板去思考就行了。 61 | 62 | 細節可參考:[初探 ORID 焦點討論法](https://blog.niclin.tw/2016/08/09/%E5%88%9D%E6%8E%A2-orid-%E7%84%A6%E9%BB%9E%E8%A8%8E%E8%AB%96%E6%B3%95/)、[如何使用ORID总结学习,加快进步?](https://www.jianshu.com/p/56e5bf8ae9ee) 63 | 64 | ### 3. 交作業前先檢查 65 | 66 | 身為工程師,在交付產品以前自己有義務先做一些基本的測試,至少不要出現一打開就掛掉或者是 UI 差超級多這種狀況。交作業也是一樣的,如果你的作業連範例附的簡單 測試都跑不過,或者是基本功能都沒完成,那我也不知道我要改什麼。 67 | 68 | 所以,在交作業前請先自己檢查一下,如果品質太差的我會直接退件。 69 | 70 | ### 4. 簡答題規範 71 | 72 | 注意,簡答題不像你以前學生時期做報告那樣可以直接複製貼上,這是最沒有用的答題方法。我希望的是你找資料閱讀,吸收並理解以後再用自己的文字寫出來,這樣的理解程度會高很多,而不是複製貼上就了事。若是只會複製貼上,我保證一個月後我再問你同樣的問題,你也答不出來。 73 | 74 | 如果真的寫不出來,可以試著看著相關資料自己照著重打,這樣也會加深記憶。 75 | 76 | 有任何查到的相關資料都可以一併附上,第一是給別人一個 credit,可以讓作者知道他的文章對你有幫助,第二也是給自己留一個筆記,之後忘記可以再回來這邊找。 77 | 78 | ### 5. 程式碼規範 79 | 80 | 第三期首次導入 [eslint](https://eslint.org),幫整個專案都裝了 eslint,每一次 commit 都會自動檢查 JavaScript 的程式碼,有違反規則的話需要修正以後才能 commit。從第一週開始就強迫大家養成良好的程式碼撰寫習慣。 81 | 82 | ### 其他 83 | 84 | 1. 第十三週以前禁止使用 jQuery(除非你原生的 DOM API 真的很熟了) 85 | 86 | ## 課程進行方式 87 | 88 | 本期進行方式與前兩期差異頗大,這期「原則上完全沒有直播」,課程以線上影片為主,全部課程內容皆為預錄好的線上影片(無字幕)。 89 | 90 | 每一週都會有指定教材以及導讀影片,若有需要的話可以自行尋找其他資源學習。 91 | 92 | 還有一點請特別注意,沒教的內容也可能出現在作業裡,不要被當期的內容給迷惑了,以為一定要用當週教的東西來解題。 93 | 94 | ## 課程大綱 95 | 96 | 從 2019/04/15 至 2019/10/15 ,為期六個月的課程,一共約二十六週。每週的開始為禮拜一,結束為禮拜日。 97 | 98 | ### 第一週(04/15 ~ 04/21):暖身週 99 | 100 | 大致介紹整個計畫以及帶學生看過一次課程大綱,接著說明整體架構,介紹各種不同工程師職位所負責的工作內容並著重在網頁工程師的介紹,並說明課程進行方式。 101 | 102 | 除此之外,也會帶大家看一下學習的方法並推薦相關課程,為之後的課程做好準備。 103 | 104 | Mindset 建立: 105 | 106 | 1. 不要害怕問問題,每個問題都值得被提出來,你的問題可能也是其他人的問題 107 | 2. 問問題前應該要自己查詢資料(有些很難查的直接問也可以) 108 | 3. 你有老師讓你盡量問,反正問就對了,有錯的話我會提醒你 109 | 4. 重點是「目的」,而不是「手段」,持續問為什麼為什麼為什麼為什麼 110 | 5. 學程式需要換一個思維模式 111 | 112 | 建置基礎環境,例如說 Command Line Tool 與 Git,以及學會如何交作業。 113 | 114 | 指定教材: 115 | 116 | 1. [CMD101] Command Line 超新手入門:全部 117 | 2. [GIT101] Git 超新手入門:全部 118 | 3. [CS101] 初心者的計概與 coding 火球術:1-1 ~ 2-4、4-1、4-2、11 119 | 4. 程式導師實驗計畫第二期:Lesson 1-1(可以快轉忽略與第二期本身相關的部分) 120 | 121 | [HW1 作業連結](/homeworks/week1) 122 | 123 | #### 自我檢測 124 | 125 | - [ ] 你說得出程式如何執行 126 | - [ ] 你理解寫程式的本質只是一行行的指令 127 | - [ ] 你了解前端與後端的區別 128 | - [ ] 你能說出從發出一個 request 到接收 response 中間發生的事 129 | - [ ] 你了解不同載具的差異在哪(Desktop、Mobile、Web) 130 | - [ ] 你了解基本的 command line 指令 131 | - [ ] 你知道 Git 在做什麼,以及為何我們需要 Git 132 | - [ ] 你知道 add、commit、push、pull 等基本 Git 指令 133 | - [ ] 你知道怎麼使用 branch 並送出 Pull Request 134 | - [ ] 你熟悉 Git Workflow(其實就是交作業的流程) 135 | 136 | ### 第二週(04/22 ~ 04/28):程式基礎(上) 137 | 138 | 前四週其實是這個計畫最重要的一個月,希望能在這四週讓學生把基礎打得相對紮實,這樣比較好應付之後的課程。 139 | 140 | 這一週的學習目標是程式基礎,包括但不限於:變數、陣列、迴圈、判斷式以及函式(以 ES5 為例)。 141 | 142 | 必須要強迫自己轉換成寫程式的思考模式,否則這一週對你來說會是惡夢。對於從來沒有接觸過類似思考模式的人可能會需要點時間,但只要慢慢練習,就會越來越進入狀況。 143 | 144 | 還有一點請大家注意,程式是按照你寫的跑,不是按照你想的跑。當程式執行結果超出預期時,`console.log`是你的好朋友,可以把東西印出來看看是不是跟你想的一樣。 145 | 146 | 最後,在這週也會講到 eslint,我已經幫大家設置好了 eslint,這是一個能夠幫你自動做語法檢查的工具,在每次 commit 之前都會自動檢查程式碼的規範,不符合規範的話不會讓你 commit。 147 | 148 | 指定教材: 149 | 150 | 1. [JS101] 用 JavaScript 一步步打造程式基礎:開頭到綜合練習 Lv1 151 | 152 | 進階閱讀: 153 | 154 | 1. [CS101] 初心者的計概與 coding 火球術:7-1~7-4 155 | 156 | [HW2 作業連結](/homeworks/week2) 157 | 158 | #### 自我檢測: 159 | 160 | - [ ] 你能靈活運用變數、迴圈、判斷式等等基本概念來解題 161 | - [ ] 你能一行行的說出現在程式在做什麼 162 | - [ ] 你知道「回傳」跟「輸出」的差異 163 | - [ ] 你可以把用文字寫好的演算法轉成程式碼 164 | 165 | ### 第三週(04/29 ~ 05/05):程式基礎(下) 166 | 167 | 在程式基礎的部分一週是絕對不夠的,因此本週會繼續加強程式基礎。在這一週裡面我們會延伸上一週的內容,並且多講一些有關於 ES6 的語法。 168 | 169 | 像是介紹常用內建函式如 replace、indexOf、split、map、filter、join、parseInt 以及 Math 等等。 170 | 171 | 也會教大家寫簡單的 unit test,並且自己寫 test case 檢驗自己的函式。 172 | 173 | 本週的作業有自動批改系統,請傳到 [Lidemy OJ](https://lidemy-oj.netlify.com) 上,並且確認每一題都有答對之後再交作業,否則我會直接退件(hw5 除外,因為這題比較難,沒有通過依然可以先交作業)。 174 | 175 | [HW3 作業連結](/homeworks/week3) 176 | 177 | 指定教材: 178 | 179 | 1. [JS101] 用 JavaScript 一步步打造程式基礎:全部 180 | 2. [JS102] 升級你的 JavaScript 技能:ES6 + npm + Jest:全部 181 | 182 | 上一期相關部分: 183 | 184 | 1. 程式導師實驗計畫第二期:Week2 加強 JavaScript 185 | 2. 程式導師實驗計畫第二期:Week2 - ES6 186 | 187 | 寫完作業以後才能看: 188 | 189 | 1. 程式導師實驗計畫第二期:Week3 - 第二週作業檢討 190 | 191 | #### 自我檢測 192 | 193 | - [ ] 你理解常用內建函式如何使用 194 | - [ ] 你熟悉程式語法並知道如何解決基礎問題 195 | - [ ] 你知道為什麼我們需要 unit test 196 | - [ ] 你知道什麼是 unit test 197 | - [ ] 你知道如何寫 unit test 198 | - [ ] 你知道如何測試一個 function 199 | 200 | ### 第四週(05/06 ~ 05/12):網路基礎 201 | 202 | 無論是前端還是後端,身為一個網頁工程師,你必須很清楚整個網路運作的輪廓。細節你可以日後再研究,但一定要能掌握大方向以及重要概念,否則你未來的路絕對會走得很崎嶇。 203 | 204 | 在這週裡面我們會學到兩台電腦在網路上該怎麼溝通,從上層往下,再從底層往上,一步步建立起你對網路的世界觀。 205 | 206 | 當然,只有理解是不夠的,我們也會用 Node.js 讓你實作簡單的網路爬蟲以及串接基本的 API,帶你熟練與網路相關的知識。 207 | 208 | [HW4 作業連結](/homeworks/week4) 209 | 210 | 指定教材: 211 | 212 | 1. [NET101] 網路基礎概論(搭配 JS 實作練習):全部 213 | 2. [CS101] 初心者的計概與 coding 火球術:4-1 ~ 4-4 214 | 3. [從拉麵店的販賣機理解什麼是 API](https://medium.com/@hulitw/ramen-and-api-6238437dc544) 215 | 216 | #### 自我檢測 217 | 218 | - [ ] 你知道網路背後大概的運作模式 219 | - [ ] 你知道什麼是 Request 跟 Response 220 | - [ ] 你知道什麼是 DNS 以及運作原理 221 | - [ ] 你知道 HTTP 與 HTTPS 的差異 222 | - [ ] 你知道 localhost 跟 127.0.0.1 是什麼 223 | - [ ] 你知道 GET 與 POST 的差別 224 | - [ ] 你知道常用的 HTTP Header 225 | - [ ] 你知道什麼是 API 226 | - [ ] 你會使用 node.js 寫出串接 API 的程式 227 | - [ ] 你知道 HTTP method 有哪些 228 | - [ ] 你知道基本的 HTTP statud code,像是 200、301、400、404、500 229 | 230 | ### 第五週(05/13 ~ 05/19):複習週 231 | 232 | 經過前面四週的各種摧殘,終於迎來了第一次的複習週! 233 | 234 | 複習週顧名思義,就讓大家複習前面這四週的進度用的,這四週我們一共學了四項主要的技能: 235 | 236 | 1. Command line 的使用 237 | 2. Git 的基本操作 238 | 3. JavaScript 基本語法及程式思維 239 | 4. 網路基本概念 240 | 241 | 如果你之前因為趕時間亂寫而亂寫作業,現在是回去重新省視一遍的好時機;或者是之前有查到什麼有趣的延伸資料但沒時間看的,這一週你就有時間看了。 242 | 243 | 在複習週是沒有任何進度的,但是會有兩個小挑戰,讓你們檢驗自己前面學到的技能。 244 | 245 | #### HTTP Game 246 | 247 | 為了檢驗你對於 API 串接是否理解,我特地做了一個很有趣的小遊戲:[Lidemy HTTP Challenge](https://lidemy-http-challenge.herokuapp.com/start)。 248 | 249 | 建議使用之前教過的 node.js 搭配 [request](https://github.com/request/request) 這個 library 來解題,才能比較有效確認自己是否前面都有學進去。 250 | 251 | 我有藏了一些很無聊的梗在裡面,解題的時候可以順便找找。 252 | 253 | #### NPSC 題目練習 254 | 255 | NPSC 中文全名為[網際網路程式設計全國大賽](https://contest.cc.ntu.edu.tw/npsc2018/),是台大每年都會辦給國中生跟高中生參加的比賽。 256 | 257 | 裡面很多題目都很有趣,適合拿來給程式初學者練習,我特地找了一些比較簡單的題目,大家可以用來檢驗自己的程式基礎是否紮實:[Lidemy OJ](https://lidemy-oj.netlify.com/contests)。 258 | 259 | [HW5 作業連結](/homeworks/week5) 260 | 261 | ### 第六週(05/20 ~ 05/26):前端基礎(一) 262 | 263 | 本週將會正式進入到前端課程的領域,開始用 HTML 與 CSS 打造出基本的網頁,並且利用 media query 實現簡單的 RWD(Responsive Web Design)。 264 | 265 | HTML 的部分就簡單帶過幾個常見的 tag,帶到 head 的一些屬性跟設定,也會講到跟 SEO 有關的一些 tag(title, description, json ld...)。 266 | 267 | 主要會著重在 CSS 的部分,並且讓大家多多練習。 268 | 269 | 也可以先看一下這兩篇文章(很多地方你會看不懂,但沒關係)先培養一下對前端的感覺,等幾週過後當我們學得越來越多,再看一次會有完全不同的感受:[零基礎的小明要如何成為前端工程師?](https://medium.com/hulis-blog/frontend-engineer-guide-297821512f4e)、[跟著小明一起搞懂技術名詞:MVC、SPA 與 SSR](https://medium.com/@hulitw/introduction-mvc-spa-and-ssr-545c941669e9) 270 | 271 | 指定教材: 272 | 273 | 1. [FE101] 前端基礎:HTML 與 CSS:全部 274 | 2. 程式導師實驗計畫第二期:Week3-2 - CSS 275 | 3. [Chrome 網頁除錯功能大解密](https://www.udemy.com/chrome-devtools/) 276 | 277 | 寫完作業才能看: 278 | 279 | 1. 程式導師實驗計畫第二期:Week4-1 - 上週作業檢討 280 | 281 | [HW6 作業連結](/homeworks/week6) 282 | 283 | #### 自我檢測 284 | 285 | - [ ] 你知道 HTML 是在做什麼的 286 | - [ ] 你知道如何使用有語意的(semantic)標籤 287 | - [ ] 你知道基本 SEO 的概念 288 | - [ ] 你知道 CSS 是什麼 289 | - [ ] 你知道 inline、block 跟 inline-block 的區別 290 | - [ ] 你知道什麼是 box model 291 | - [ ] 你知道 position 的所有屬性及其差別 292 | - [ ] 你知道 :hover, :before, :after 293 | - [ ] 你知道 :nth-child 的各種用法 294 | - [ ] 你熟悉 CSS selector,可以輕鬆選到想選到的元素 295 | 296 | ### 第七週(05/27 ~ 06/02):前端基礎(二) 297 | 298 | 這一週將會進入到 JavaScript,讓網頁變得有互動性,並結合 `