教學實驗計畫
====
# 計劃簡介
藉由團體內的互助合作以及助教的帶領,照著計劃自主學習,試圖營造出一個適合學習的環境,大家互相切磋,互相成長。
之前跟一個也在做免費教學的前輩交換了一下心得,有句話我覺得他說得很對,免費教學這種事不可能永遠只靠你一個人,因為你總有一天會累,會有自己的事要做。
所以我們要做的,應該是營造出一個環境,營造出一個能夠培養出可以解決問題的工程師的環境,只要這個環境養起來了,之後的事情就不用擔心了。
這次不太會有我一個人對所有人講課的情況,我跟其他學員一樣,都只是這個團體的一份子,我希望這邊能夠變成一個很好的環境,一個可以自由發問,自由切磋技術的環境。
# 最終目標
如果你有這四種能力,我覺得你不管做什麼職業都可以。
1. 找資料能力,能夠知道如何找到相關資訊
2. 分析問題的能力,能夠定位問題
3. 能夠知道如何解決問題
4. 解決問題後能夠重新歸納並整理
# 從做中學
為了要能夠培養出上面那些能力,藉由且戰且走的方式邊學習特定主題邊培養相關能力,我覺得初學者可以學的主題有這些:
1. 網頁後端相關(Session, Database, Server)
2. 網頁前端相關(HTML, JavaScript, CSS, jQuery)
3. 程式解題相關(帶大家做一些 ACM 一二星題或是基本演算法資料結構)
4. 資訊安全相關(SQL Injection, CSRF, XSS)
以下我直接給大家一些方向,可以按照自己的步調去學習。當然,程式的領域超級廣,一定有一大堆主題沒有涵蓋到,但是下面技能你都掌握之後,你應該就是個合格的工程師了,剩下的你一定知道怎麼去找資源,怎麼繼續精進。
# 網頁後端能力培養
其實這一塊要培養的東西很簡單,就是知道後端到底在幹嘛,以及後端到底能做哪些事情。所以你必須對後端的環境很熟悉,你要知道怎麼架 Server,怎麼部署新的程式碼。
除此之外,你還必須懂得資料庫的操作與使用,以及後端跟前端的溝通。
### #1 在自己的電腦上成功運行 php
最簡單的就是用 XAMPP 把整個環境建好,然後隨便寫一個 hello world
### #2 實作簡單登入系統
帳號跟密碼你可以寫死在程式碼裡面沒關係,這個部分的重點是你要知道 Session 的機制為何,以及跟 Cookie 的關係是什麼。這是面試常考題。
### #3 串資料庫
後端最重要的事情之一就是跟資料庫溝通,你要知道怎麼下 SQL 語法從資料庫裡面存取資料。這邊你可以直接對資料庫下指令,或是用 PHP 去操作也行。
### #4 實作簡單留言板
就只要一個表單可以發文,有標題跟內文就行了,然後有頁面會顯示出來現在有哪些留言。留言要存到 DB 裡面去。
### #5 幫留言板加上會員系統
必須要先註冊會員並且登入才能發表留言。這邊可以跟下面資安那一塊的 SQL Injection 跟 XSS 一起學,因為滿相關的。
### #6 加上管理系統
自己的留言可以刪除,有一個頁面可以看到自己有哪些留言,以及其他人有哪些留言。
### #7 實作部落格系統
把你覺得部落格最主要的功能實現出來就好,例如說登入、發表文章、編輯文章跟刪除文章
### #8 加強部落格系統
例如說新增留言系統,或者是讓文章可以加上圖片等等的,把你覺得還不錯的功能加進去。
### #9 實作論壇系統
其實你只要能完成一個部落格系統,我覺得後端的基本能力應該都還 OK,如果你還想繼續挑戰,可以挑戰更複雜一點的論壇系統。
### #10 學習框架
挑一個 PHP 框架來學,我個人推薦 Laravel,並且比你之前自己寫的專案都改成用 Laravel 實作。
先手寫再學框架,你才知道框架幫你做掉哪些事情。
### #11 改用 nginx 當 Server
以前可能都用 Apache,現在可以試試看 nginx
### #12 熟悉 Sever 環境與部署
去 Digital Ocean, Linode 或是 AWS 上面租一個最便宜的主機,試著把 code 丟到上面並且跑起來。
你要會用 ssh 遠端連線主機,並且下 command line 操作。
除此之外,你應該還要學會買 Domain 以及設定 DNS,把 Domain 指到你的主機去。
# 網頁前端能力培養
雖然說前端框架有很多,但我認為身為一個後端工程師,只要會基本的 HTML/CSS/JavaScript 頂多再加個 jQuery 就差不多了。
### #1 HTML 與 CSS
基本上大概會用就好了,這個我相信大家一定 OK
### #2 JavaScript
可以先學習原生 JavaScript,不依靠任何 Library,知道如何透過 JS 去操控 DOM 物件
### #3 jQuery
知道怎麼使用 jQuery 做一些簡單的效果
### #4 Bootstrap
其實在工作的時候,可能比較多時候都會直接透過現有框架去刻網頁,所以多少要知道知道一下 Bootstrap 在幹嘛
### #5 手刻 RWD
如果你想要跟精進 CSS 的話,就不能依靠框架了,試著自己寫出自適應的網頁吧!
[這一份 Check List](https://www.ptt.cc/bbs/Soft_Job/M.1481277610.A.AFE.html) 我覺得還不錯,可以檢視一下自己有哪些還不會的,就去那邊補足。
### #6 Ajax
知道如何跟 Server 交換資料。
如果你能夠把上面的都做到,那身為後端絕對沒問題。雖然說是後端,但其實在比較小的公司裡,絕對都會接觸到前端的部分,只是前端沒有那麼要求就是了。
如果你想更精進前端或是往前端工程師走,可以參考下面的。
### #7 整合上面的能力
可以直接參考我之前的:[從新手到中手:前端工程加強班
](https://github.com/aszx87410/frontend-intermediate-course)
### #8 挑一個順眼的框架學
走到這一步,終於可以來學一下框架了,熱門的 React, Vue, Angular 可以自己挑一個喜歡的來學
### #9 做出作品
你可以模仿現有的網站,例如說 Twitter, Twitch, Gmail 等等你日常生活中在使用的網站,試著寫出差不多的版型跟實作差不多的功能。
身為一個 Junior 的前端工程師,我覺得到這邊就很足夠了。等你進到業界工作之後,你會發現還有一大堆東西要學,但那是之後的事了。
# 資訊安全能力培養
資安其實是很重要的一塊,你如果網站出現那種最基本的漏洞,可以說是犯了大錯。不過在框架盛行的年代,其實框架都幫你把那些東西修掉了,不要亂用的話應該是不會出事。
但儘管如此,你還是必須理解那些攻擊手法的原理。
針對一些經典的安全問題,你應該要回答得出來以下問題(以 XSS 來舉例):
1. 什麼是 XSS?
2. 原理是什麼?請舉出一個 XSS 攻擊的案例
3. 如何防禦?
### #1 十大安全問題
可以參考:[Top issues on OWASP](http://blog.techbridge.cc/2017/05/07/owasp/)
### #2 SQL Injection
請自己寫出一個可以被 SQL Injection 的程式,並且自己攻擊自己試試看。
### #3 XSS
同上,請自己試著模擬 XSS,另外要注意的是 XSS 有幾個不同的形式,你可以每一種都試試看
### #4 CSRF
可以參考:[讓我們來談談 CSRF
](http://blog.techbridge.cc/2017/02/25/csrf-introduction/)
### #5 儲存密碼
請去了解正確的儲存密碼方式為何,以及為什麼要這樣存。總之絕對不會是存明碼就對了。
一個正常的網站,是不會知道使用者的密碼是什麼的。
### #6 其他
其實我覺得上面那幾點了解的話,跟 Web 有關的安全知識其實就 ok 了,但畢竟學海無涯,如果你還想知道更多的話,可以自己 Google 更多的相關議題。這方面我也只知道皮毛,所以沒辦法給予更多幫助。
###
# 程式解題能力培養
這個分類就是在訓練你如何把腦中的想法轉換成程式碼,有一點像是在解數學問題,但又不太一樣。在練習的時候有一個重點,那就是:「絕對不要先查答案」。因為解題最寶貴的就是你思考的那段時光,一看了解答,你就不會思考了。
你一定要自己先想破頭,想了一兩天發現還是想不出來之後才去求救,你可以在 slack 裡面發問,指出你現在卡住的地方,如果真的還是不行,再去看解答。
還有一個很重要的點:先求有,再求好。你可以先寫一個超級慢的版本,再慢慢把它變快,至少你知道你可以解出這個問題,只是效率不夠高而已。
在這個部分,我建議大家去 [ZeroJudge](https://zerojudge.tw/),他是一個滿適合初學者的解題系統,可以註冊帳號並且研究一下怎麼使用。如果你慣用的程式語言他不支援,那你就挑一個它支援的語言去學吧!
### #1 完成 Hello World
其實就讓大家熟悉這個環境,熟悉一下要怎麼輸出結果以及整個解題過程到底是怎麼運作的。
### #2 完成簡易加法
可以熟悉如何讀取輸入並且輸出解答,這題通過之後基本的架構應該差不多
### #3 把基礎題庫都寫一寫
如果碰到不會的可以跳過先寫下一題,不一定要執著按照順序解,或是也可以先挑通過率比較高的題目開始培養手感。
### #4 開始寫 ACM 一星題
ACM 的正式名稱是 UVa,他們有自己的解題系統,但方便起見,很多題目你在 ZeroJudge 上面也找得到。
[這邊](http://luckycat.kshs.kh.edu.tw/)有中文翻譯,你可以選擇難度一的題目開始練習,把題號拿去 ZeroJudge 上面搜尋應該就找得到同樣的題目。
其實我覺得以日常寫程式來說,你把一星題跟上面那些寫一寫,其實就差不多了。但如果你想更進一步的話,可以繼續往下做
### #5 開始寫其他 ACM 題目
例如說二星三星之類的,但難度我記得比一星高上挺多的
### #6 寫一些高中資訊競賽的題目
讓你們看看高中生比賽的時候都比些什麼,也可以從國中組的開始寫起,難度會簡單很多。或是校內賽也會簡單一些。
如果你可以撐到這個時候,代表你可能也寫出興趣來了。
### #7 開始學習資料結構與演算法
這邊就是真的資工系在念的東西了,有兩份我非常推薦的資源:
1. [演算法筆記](http://www.csie.ntnu.edu.tw/~u91029/)
2. [初學者寫給初學者的演算法教學](http://alrightchiu.github.io/SecondRound/)
如果你需要書籍,有幾本書應該還不錯:
1. [打下好基礎:程式設計與演算法競賽入門經典
](http://www.books.com.tw/products/0010650143)
2. [培養與鍛鍊程式設計的邏輯腦:程式設計大賽的解題策略基礎入門](http://www.books.com.tw/products/0010705139)
3. [培養與鍛鍊程式設計的邏輯腦:世界級程式設計大賽的知識、心得與解題分享](http://www.books.com.tw/products/0010616945?loc=P_asv_001)
4. [啊哈!圖解演算法必學基礎](http://www.books.com.tw/products/0010656544?loc=P_asv_002)
### #8 去修任何一門大學的演算法課程
Coursera 上面一大堆,台灣也有相關的開放式課程,如果你真的想要把這塊基礎打得很紮實,就去選一門課認真修完吧!
如果你能把上面全部都做好做滿,一般的面試應該是不會碰到什麼問題了,若是你還想繼續往下深造,其實到這個地步,你應該就會知道下一步應該怎麼走了,就不需要我了。
# 總結
上面大概列了一些方向跟資源,如果我有想到其他的我會再補上。如果有任何錯誤也麻煩跟我講一下,感謝大家。
總之大家就按照上面給的點自己學習吧,有問題都可以在 slack 裡面提問,你要從四個分類哪一個開始都可以,也可以同時進行,祝大家學習愉快!