跳到主要內容

Alpha Camp 學期3 - 期末回顧

這學期最有代表性的題目大概就是『老爸私房錢』系列題了,幾乎是繞著它在學習、熟練這學期的各種技術,也因此,可以說在它身上發現最多問題,也從跟它的相處學到最多教案外的額外資訊。

關卡1:單一頁面多Modal視窗

A17開始,因為我想要的輸入和編輯頁面是可以用modal呈現的,不想只照著教案render不同的頁面,所以就開始興致高昂地用bootstrapmodal程式碼。

結果測試的時候發現居然只有createmodaleditmodal怎麼按都是只有一層overlay的感覺,沒有欄位可填。

因此我嘗試先註解掉沒問題的create modal程式碼,發現editmodal就正常的出現了,感覺問題應該是出在同一份文件有多段modal程式碼,於是開始google,關鍵字大概就是中英文的『multiple modal』、『多modal』。

果然就有很多不同解法,有人是設定不同的id,但我想了一下,如果今天專案不再那麼單純,而我都想用modal怎麼辦?這樣不就要設一堆id嗎?於是就看了其他解法,果然馬上就看到了一個相對簡單的,在各個modal外面再包一個 .update-modal,不用管id是哪個元件對哪個元件,就解決了!兩個modal以上也可行~

關卡2:月份選擇

接著做 A18挑戰題,要做出月份和類別的結合篩選,因為不想雞肋地讓時間篩選只限定在特定時間區段內,例如只有2019年,所以首先想找有沒有方式可以輸入時間範圍,google時不外乎把『用到的tech stack』和『date range』這個關鍵詞做結合去搜尋,以免找到的解決方案太過發散。

結果就看到了各種datetime picker套件,選了一些下載量比較大的套件官方文件來瀏覽一下,但考量:

1.     曾在聽畢業學長姐口試時,聽到Jack老師提醒,不要養成一味地追求套件的習慣,維護性要考量進去。
2.   看了AC職涯社群的某篇文章裡面提到,的確不要重複造輪子,但不代表我就可以沒有造輪子的能力,現在的我是在練習,就來造造看輪子嗎?
3.   這學期已經學了一堆套件的語法,再學新的我要頂不住了...
4.   看完文件當下實在想不到要怎麼串接後續的月份選擇

所以放棄學用新套件,秉持著"一定有解,只是還沒找到"的信念,換個關鍵字找,不找date range了,直接找month!結果就看到MDN上寫著input type="month"....

而在度過了這個傳說中的魔王作業後,以為從此跟他說再見了,沒想到這週會在期末考遇見它...但既然重逢了,我不想只是完成從mongoose換成sequelize語法的工作,至少要多做一個功能出來,所以給自己兩個目標:

1.     先把原本mongoDB的版本,完全轉換成MySQL版本。
2.   限制支出日期不能是未來日期。

關卡3:日期格式

首先就是在日期格式處理上遇到問題,一開始把日期定義為Date型別,但在建Date實例時,就是拿不到想要的格式,查了一下SequelizeData type,發現有DATEONLY,格式就是我想要的,反正也用不到後面的小時、分鐘和秒,就來加一個migration吧!但教案內只有教addColumnremoveColumn,變更欄位不知道要用什麼方法?

以之前查資料的經驗,這種介紹性的資訊,通常會把操作主體(ex. column)的功能彙整在一起介紹,所以就直接用教案內的兩個方法為關鍵字下去搜尋,果然馬上就找到語法說明了。

接著在做filter時,又遇到query語法和mongoose不同,但因為官方文件寫得挺詳細的,約莫摸索個20分鐘,就搞定了!(其實沒有…)

就在測試極端數據(潤、平年的2月、大小月的第一天和最後一天)時,又發現怎麼明明篩選條件設為11月,怎麼12/1的也跑出來?!但我試了一下12/2就正常,那應該不是邏輯錯,應該還是日期區間的問題。

於是進行一連串的測試和console.log,果然會有日期類似溢位的現象,而日期又是個物件,篩選條件是個字串,應該是要想辦法把複雜的物件變成簡單的字串來比對就好。

變成字串最直覺的想法就是toString(),結果console.log出來的結果居然還出現英文月份只好再查日期轉換成字串的方法有哪些,看了一下格式發現toISOString()蠻符合我裁減字串的需求。

接著就是思考怎麼解決日期溢位狀況造成篩選不準的問題了。因為是藉由query string傳進來的月份來建日期實例,而月份天數的差異也就4種,就直接採窮舉法建立實例了,接著再去比較日期實例轉換成字串並裁切成YYYY-MM格式後,當月一號切出來的結果和當月最後一天窮舉後切出來的結果是否一樣。

例如:先比對假設最後一天是29號,如果切出來第一天的結果和最後一天的結果不一樣,代表當月份實際天數其實只有28天,所以造成1天的溢位,就變成下個月的1號了,因此我可以把篩選條件就設成between 1and 28號了,依此類推,就解決這個問題了。

關卡4:標籤setAttribute

最後就剩限制不得為未來日期了,想到的方法就是在新增時不給使用者選,而input標籤很容易可以做到設定日期的最大值,超過最大值的日期便無法選取,只是需要知道取得頁面當下是什麼日期。

因此將想要控制的元件都先加上同樣的class名,並另外寫一支前台的js,先用之前沒用過的querySelectorAll方法選取所有同class名的元件,再產生日期實例,日期經過字串組合後,設定為元件的max屬性。結果馬上發現querySelectorAll只是選取了元件形成集合,後續的動作要用迴圈才能把每個元件的屬性都設定好。

心得

綜合這一系列的卡關/解決迴圈,如果要我明確描述每一個解決方案背後的原理,目前可能還無法做到,但還是讓我覺得獲益良多,因為網路上大家的專案架構、程式碼撰寫方式、撰寫風格都不同,光是要理解解決方案怎麼實行其實就已經是種學習了。

回顧這種學習方式,我覺得有點像在學整個學期三教案的感覺,雖然很多都只知其然,但看久了還是會在心中默默歸納出一些描述方式,比較能具體幫助自己理解怎麼施作的方式,也許不是真正原理上的正確答案,也不見得是最佳解,但絕對有助於熟練新技能和拓展認知邊界。


而這種學習方式其實包含了試誤和演繹,我自己的感覺是兩者呈負相關,當天腦袋越清楚,演繹得越有條理,試誤的時程就越縮短 ; 而當發現試誤時程拉得太長了,就該提醒自己可能是理解得不夠多、不夠深,就應該先暫停試誤,再找找資料來釐清一下問題所在。

除了呼應之前Wells助教說的,有時候卡住的時候就去睡覺、追劇,保持自己的良好身心狀態外,隨時找機會學習類似async章節這種偏原理面的內容,真的是對提升演繹能力有很大的幫助!

後記

交完期末考題後,MiaYang老師有回饋日期格式的補充資料,看完只覺得...我為什麼沒有查到這些東西呢?!就不用寫得那麼累了...XD

留言

這個網誌中的熱門文章

Alpha Camp學期二期末心得

“每週都在體驗腦袋扭傷的八週,顛覆既有價值觀” 要我用一句話來表達這學期的心得的話,真的就是這麼震撼! 比較具體的收穫當然包含不同領域背景知識的奠基、技能習得和人脈拓展等。 可能過去是生物醫學背景,產品無論是開發或操作都牽扯醫療法規問題,給我的感覺一直算是開發時程較長,也比較嚴肅的領域。 而這學期開始學習網路開發,不論透過教案作業或職涯訪談作業,都讓我感受到這領域的發展有多迅速、多蓬勃,發展面向有多廣,有人做遊戲平台,也有人做致病基因調控分析工具。 這對我來說其實是一種鼓舞,似乎多學了這個技能,讓我未來不管應用目標是針對人的生理還是心理,做嚴肅的應用也罷,做舒壓的應用也罷,都更有機會為其他人做出更具體的貢獻! 過去因為試劑、耗材成本問題,總是被灌輸、教導「在實作前,必須先盡可能地review文獻,找出最平衡、最佳的流程」觀念,實驗參數和流程也不是那麼樂於在群體間分享。 然而,這些觀念在軟體工程領域似乎剛好相反!先求有,再求好,反正改寫code不用錢。 當然例如像wireframe或流程邏輯等,還是要有一些基本的設計,但以我的案例來說,更重要的反而是"不要怕動手嘗試"這習慣的建立。 這點差異在我剛開始寫作業時其實造成一些學習上的困擾,總是最後才敢動手做,生怕寫錯噴error玻璃心碎一地,但畢竟就是個菜鳥,怎麼可能在腦內就先構思完全呢? 兩個月過去,我可能會想跟兩個月前的我說,千里之行始於足下,即便要構思wireframe,也先動筆畫出container吧!不要想一次在腦內就把所有元件和流程定義完!XD 另外讓我比較訝異的,還有“開源專案”這概念,居然有人非親非故的會去幫別人做補強,或倒過來開放給世界各地的人用! 這在wet lab內幾乎不可能發生,除了已經握有具credit的journal paper或patent會開放付費閱讀或授權使用外,好像沒聽過有論壇會分享實驗參數和流程的。這更加深了我想成為工程師的信念! 當然現在還離可以獨立打造產品很遠,但這學期強烈感受到AC教材設計的用心、助教不厭其煩地叮嚀和問題回覆、同學們鬼神般的作業觀摩等資源,在在都讓我更有信心在這樣的學習環境和步調下,逐步往目標邁進! 最後還是想謝謝AC助教群們辛苦地引導和指導,真的受益良多,也相當期待學期3的到來,雖然被恐嚇過會...

Alpha Camp 學期4 - Simple Twitter專案反思

經過這拋妻棄子、夙夜匪懈的兩週,雖然身體很疲累,但心裡卻很充實! 一開始大家還互不熟識,約個線上會議都尷尬到不行,第一次會議其實只簡單地平分了路由就各自開工了,各自也都沒有工程師的實務經驗,一開始開會真的不知道要討論什麼重點,以至於剛開始就很理想地想依自動化測試規格來建功能,想當然爾是失敗收場,所幸在slack即時地討論、回報狀況後,隔天晚上大家都排除萬難地再度開會,並迅速決議先以建立功能為目標,基本功能完成再來解自動化測試。 然而隨著實作的深入、時程的壓力等因素,slack群組不再只是一個進度回報的地方,而是可以抒發情緒、分享資料、互相支持並給予鼓勵的小天地,這向心力當然歸功於我們都相當拼命的工作態度,當半夜兩三點還看到夥伴們都還醒著、奮戰著,自己當然不能拖累大家! 這個團隊不吵架的原因我覺得很簡單也很困難,就是大家都不會推工作,只差沒搶著做!XD 這是在職場中很難看到的現象,畢竟公司團隊中只要有一兩個人心態不夠積極就會影響其他人的工作態度,所以這次合作的過程中,我真的忍不住跟他們說:「和你們合作真的比和公司工程師合作開心!」。 Wendy不愧是我從學期二加入AC就持續在觀摩學習的標竿對象,無論是效率或作業成果,真的都比未合作前想像的更有過之而無不及,每每都能在我卡關時給出關鍵建議,雖然她都自謙她只有想法,無法實作出來,但這種能敏銳察覺、串連各種可能解法的能力,真的很令人驚嘆~另外,能透過這次合作聊聊心路歷程,加深對彼此的認識,真的是學期四最大的收穫了! 我也很訝異於宗翰自學居然有辦法達到這種能力,實作進度完全超前預定進度,而且即便第二週生病了,還是堅持一起討論挑戰題解法、查找資料到凌晨四點才睡,這種工作態度,很難相信是個剛當完兵的人,當完兵不是應該先去玩嗎?!居然跑來AC討皮痛,佩服佩服! 當然也必須給自己一點掌聲和肯定,在這次專案中,除了完成分配好的基本功能規格,也盡最大努力完成了websocket聊天室server-side和client-side、hashtag前端部分,以及heroku設定和部署,當然在時間壓力下,很多功能肯定都還不夠完善,但能從無到有,像個工程師一樣和夥伴們一起完成這些任務,真的非常有成就感!另外,由於在公司是PM,不管是工具使用、進度規劃、會議安排、議程引導或文件準備,心中大概都有個底,所以在專案開始初期,基於...