📜 [專欄新文章] Uniswap v2 實作 : 從創建交易對到Ether 換 Dai 投入 Compound
✍️ 田少谷 Shao
📥 歡迎投稿: https://medium.com/taipei-ethereum-meetup #徵技術分享文 #使用心得 #教學文 #medium
Uniswap v2 實作 : 從創建交易對到Ether 換 Dai 投入 Compound
V̶y̶p̶e̶r̶ Solidity coding time!
Image source: https://uniswap.org/
Outline
一. 前言二. 程式碼結構 1. Wrapped Ether(WETH)? 2. Impermanent Loss三. 創建交易對 - 準備 Interfaces四. 注入資金 - 注意事項五. 兌換虛擬貨幣六. 取得報價作為預言機七. 自行兌換 WETH八. 結語
一. 前言
暨上一篇解釋了 Uniswap 的演算法後,由於個人有使用 Uniswap v2 的需求,因此整理後寫成本篇,希望能幫助到其他也需要用 Uniswap 的讀者!(不熟 Uniswap 的人也可以參考區塊勢 許明恩 Astro Hsu 寫的介紹文:點我)
Uniswap 解析:恆定乘積做市商模型 Constant Product Market Maker Model 的 Vyper 實作
本文希望透過實際操作 Uniswap 我個人會用到、我認為大家比較常會用到的功能,來讓不熟悉的讀者快速了解其程式架構(v2 相較 v1 繁複)、熟悉實作方法,無法顧及全部還請見諒。
以下實作的測試環境為 Rinkeby 測試網,由於只是要講解使用方法,因此選擇在 Remix 上操作。
而 Uniswap v2 跟 v1 的差異,個人沒有很認真研究,大致列舉以下幾點,本文只會就其中幾點在後方進行較詳細的解釋:
使用 Wrapped Ether, WETH (於 二. 程式碼結構 解釋),讓 ERC20 交易對不再需要透過 Ether ,降低 gas 的消耗,但還是可以用 Ether 支付
加入時間權重的預言機,降低被操縱價格的風險,於 六. 取得報價作為預言機 中舉例說明,有興趣者可以看看 白皮書 有詳細介紹
閃電貸
使用 Solidity 而非 Vyper,因為 Solidity 功能上較齊全,於 五. 兌換虛擬貨幣 中舉例說明原因
在開始之前,本文超長,播個背景音樂吧:
二. 程式碼結構
本段落簡單描述 Uniswap 程式碼各部分的功能。若讀者要自己實作,可以參考此處得知該去哪一份程式碼找相應的功能:
Factory / UniswapV2Factory.sol : 創建交易對、查詢交易對的地址與總數;查詢、指定交易對手續費的收款地址
Pair(ERC-20) / UniswapV2ERC20.sol : Uniswap 流動性代幣 ERC20 的部分
Pair / UniswapV2Pair.sol : Uniswap 流動性代幣的其他部分;查詢交易對資訊
Router / UniswapV2Router01.sol : 注入、取出流動性/資金;兌換虛擬貨幣。此合約看似最複雜,其實只是因為收付款的單位可以是 Ether 或是 ERC20,所以有很多重複的函式
ExampleOracleSimple.sol, ExampleSlidingWindowOracle.sol : 預言機的範例程式碼
Library / UniswapV2OracleLibrary.sol : 供預言機調用的函式
Library / UniswapV2Library.sol : 供內部調用的函式
除了描述程式碼結構,為了以下的實作我們還需要知道 Wrapped Ether 是什麼,順便了解其使用原因:
1. Wrapped Ether (WETH) ?
從字面上來解釋,Wrapped Ether 是被包起來的 Ether。那為什麼好好的 Ether 不用還要創造出另一版本,嫌這小小世界的術語不夠多嗎 (ETH, WETH, Dai, aDai, cDai, sDai…)?xD
wETH | ERC20 tradable version of ETH
主因有兩個:廣泛地說,Ether 是以太坊上的原生虛擬貨幣,但它與廣為使用的 ERC20 標準並不相容( ERC20 有 approve(), transfer() 等等功能);而針對 Uniswap 的場景來說,v1 的交易對都一定有 Ether,而使用 Ether 可能會造成 Impermanent Loss,於下方解釋。
因此,就以上兩點的解決方法個別是:
部署一 ERC20 <-> Ether 的兌換合約:使用者將 Ether 付給 Wrapped Ether (ERC20) 的智能合約,合約就會給使用者同等數目的 WETH;拿回 Ether 則有點不太一樣,方法是告訴 WETH 的合約使用者要 withdraw(),WETH 的合約就會把使用者 WETH 擁有的額度設回 0 (或減少) 並返還 Ether,於 五. 兌換虛擬貨幣 中舉例說明
v2 交易對的建立不再只能是 (Ether, ERC20),可以是 (ERC20, ERC20)
2. Impermanent Loss
Impermanent loss 在 DeFi 指的是像 Uniswap 這類用演算法的去中心化交易所,如果交易對是兩幣價不相干的虛擬貨幣,例如:穩定幣 (Dai, USDC, etc) 和 Ether,流動性提供者 liquidity provider 會因為幣價的相對波動而比起直接持有兩幣還損失了一筆。
容我舉個例解釋清楚點,可以搭配我上一篇所寫的 Uniswap 的演算法 來理解:假設一開始 1 Ether 幣價為 100 Dai,只有一流動性提供者 LP 投入了 1 Ether 及 100 Dai (1 * 100 = 100 = k,k值要維持不變),總價值為 200 Dai。當 Ether 的幣價來到 200 Dai,眼尖者會發現資金池中的 Ether 價格低、有利可圖,因此會進行套利,例如:拿 33 Dai 約可以換到 0.25 Ether (0.75 * 133 ≒ 100),比起市場上要用 50 Dai 才能換到 0.25 Ether,套利者賺到了。此時,流動性提供者若將自己的資金提出,0.75 Ether 和 133 Dai 此時的總價值是 283 Dai,看似比當初的 200 Dai 還多,但其實將兩幣放著不動 1 Ether + 100 Dai 在此時就已經是 300 Dai 的價值了。於是,impermanent loss 就變成了 permanent loss :(
三. 創建交易對
- 準備 Interfaces
在開始之前,由於使用到的合約不少,所以我將全部所需整理在此:點我。其中,UniswapImplementation.sol 是本文實作的檔案。
若讀者在自己調用 Interface 時遇到版本問題,就依照 compiler 提供的指示稍作修改即可。我所整理的合約都修正過版本的差異、以下的實作也測試了可行,因此可以安心使用。
進入正題
通常大家使用的 Uniswap 資金池都是已經存在的,而如果想要上架自己的虛擬貨幣就要自己創建一組新的交易對,有兩種方式:在 Uniswap 官網上執行或是透過呼叫 Uniswap 的合約來建立,本文使用合約的方式。
首先,我們需要決定資金池為哪兩種虛擬貨幣,那就很普通地選 ETH 和 Dai 吧。雖然選了 ETH,但如同上方所述實際上必須使用 WETH,於是記下其在 Rinkeby 上的位置 。Dai 就使用 Compound 部署在 Rinkeby 上的版本,位置在 0x5592EC0cfb4dbc12D3aB100b257153436a1f0FEa。
接著,打開 IUniswapVFactory.sol,依照官方文件的指示將此合約部署在 Rinkeby 上的 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f。以下會有許多由 Uniswap 文件得知的合約地址及其他資訊等等,就不再一一附上來源或畫面截圖!
如上圖黑框所示,輸入了地址後按下藍色按鍵就完成部署了。接著,如下圖將 Dai 的地址 及 WETH 的地址輸入 createPair():
由於這個交易對我已經部署過了,因此讀者若想嘗試就麻煩去找別的 Rinkeby 上的測試幣了、或自己發一個! 完成後可以用 getPair() 輸入兩幣地址來確認交易對被建立成功:
如果想要進一步核對,可以先呼叫下圖紅框中的 allPairsLength(),得知當前總共有幾組交易對,再將 (交易對數 - 1) 輸入 allPairs(),就能得到和上圖一樣的地址。需要減 1 是因為陣列的 index 從 0 開始。
allPairsLength 的值會因為其他人的使用而增加,故日後可能會和本圖產出的 9 不同
四. 注入資金
看到標題的讀者可能會想:為何要把注入資金/流動性和上方的創建交易對分開呢?因為注入流動性這個功能被放在了 UniswapV2Router01.sol 中,所以就分開解釋。
雖然上一節只需要複製貼上按按鍵,但接下來要探討的注入資金 addLiquidity() 及虛擬貨幣的交換 swap()比起創建交易對 createPair() 是較有可能被融入到其他 DeFi 服務的功能(應該不太會有人會一直需要創建新的交易對),因此打開 UniswapImplementation.sol、要開始 Solidity coding!
如果不熟悉為何別的 DeFi 會需要在自己的服務中使用 Uniswap,可以搜尋 DeFi Money Lego/ DeFi 樂高,顧名思義就是在一個 DeFi 服務上使用另一個 DeFi 服務。實際的例子有:Aave 的新功能是可以拿往 Uniswap 注入流動性後得到的流動性代幣再投入 Aave 來賺取利息,以及下一節兌換虛擬貨幣的功能可以在 Pelith 的輕鬆貸 EasyDai、一站式 DeFi 組合工具 Furucombo 等場景中看到他們如何將 Uniswap 銜接上其他的 DeFi 服務。
回歸正題
在開始之前,先簡單提及一下有哪些變數、instance 需要初始化:
我們要呼叫 Uniswap 合約的 instance 來進行互動: IUniswapV2Router01
不只需要 Dai 的 instance,也需要 Dai 和 WETH 的地址;DaiAmount 和 ETHAmount 是為了稍後注入流動性所設置的,本文假設第一筆流動性我們使用 200 Dai + 1 Ether
immutable 是版本 0.6.5 加入的,用途是讓變數只能被讀取 read-only,但不同於 constant 的是能夠在 constructor() 中賦值。之所以各 instance 的地址不一起加上 immutable ,是因為若加上了,這些地址就不能在 constructor() 中被使用
p.s. 由於 gist 沒有 Solidity 的 syntax highlighting,所以隨便用了 .js 請忽略
看完了初始設定後,由於我們目前鎖定的資金池是 Dai 及 ETH,因此使用如下的 addLiquidityETH() 此函式,可以直接匯入 ETH 及 Dai。
本處我使用長度為 3 的陣列 addLiquidityResult 來記錄注入資金後的返回值:注入 Ether 的數量、Dai 的數量及返回的 Uniswap 流動性代幣的數量。實際上應該要依照不同使用者記錄的他們執行 addLiquidity() 後各自的返還值
第五行中的 approve() 是為了讓 UniswapV2Router01 的合約能夠從我們部署的合約 UniswapImplementation 取得 200 Dai 的使用權
於第六行 addLiquidityETH() 後方的大括號 {value: ETHAmount},這是 Solidity 0.6.0 後版本如果要在呼叫 function 的同時送入 Ether 的標準寫法,以前的寫法 .value() 目前也還能用但 compiler 會給提示
addLiquidityETH() 的第三、四個參數為最少要成功注入的數量。使用者能夠成功注入的數量取決於資金池中兩虛擬貨幣當下的數量,而本處直接給 0 比較方便
這邊非常重要的是上述程式碼還欠缺了一個無法被寫在合約內的步驟:使用者要同意這個被部署的合約 UniswapImplementation 可以從自己的帳戶中轉出 200 Dai。因此,將 ERC20 (Dai) 部署在 Rinkeby 上的位置,也就是0x5592EC0cfb4dbc12D3aB100b257153436a1f0FEa,接著輸入被部署合約的地址以及 200 Dai = 200000000000000000000、按下 approve() 後準備作業完成,如下圖。
終於可以呼叫 addLiquidity() 了! 如下圖,在紅框中以 1 Ether 呼叫黑框中的 addLiquidity() 後,就能成功將資金注入到 liquidity pool 了! 由於本文寫在測試後,因此沒有留下第一次 addLiquidity() 的結果 :(
此處被部署的合約位置跟上方截圖不同,因為其中測試了一些東西所以重新部署qq
接著,可以拿出 IUniswapV2Pair.sol,將其部署在 三. 創建交易對 中成功部署的位置 0x03E6c12eF405AC3F642B9184eDed8E1322de1a9e,使用黑框中的 getReserves() 就可以看到資金池中確實有匯入的資金! (本處依然沒有第一次使用後的截圖,因此截圖只是為了讓讀者看到 getReserves() 的結果)
此圖黑框中的值代表:在資金池中,Dai的數量、Ether的數量及上一次匯入資金的時間戳記
- 注意事項
使用 addLiquidity() 時需要小心的地方是:除了第一筆注入的資金可以自行決定兩虛擬貨幣的數量,第二筆開始就會依照其演算法算出兩幣可以投入的各自數量,因此使用者放入的兩幣中可能會有部分的其中一幣被 Uniswap 返回。
上方的程式碼只是為了第一筆流動性所寫,如果不是第一筆的情況就需要用成功注入流動性後的返回值(例如筆者的作法是用一陣列 addLiquidityResult 來存結果)來把沒有成功注入的資金返回給使用者。
五. 兌換虛擬貨幣
本節使用的兌換功能依舊是來自 IUniswapV2Router01.sol。
由於兌換虛擬貨幣實際上只有五行不到的程式碼,那麼就來把兌換 Ether 而得到的 Dai… 投到 Compound 來賺取放款利息吧! (雖然只是在測試網) 如果覺得這個場景似曾相識,沒錯,這就是上面提到的 輕鬆貸 EasyDai 的不專業版本!
首先將 Ether 和 Dai 互換的邏輯完成:
Ether 換 Dai : 使用 swapExactETHForTokens(),給某數量的 Ether 能換多少 Dai 是多少
Dai 換 Ether : 使用 swapExactTokensForETH(),作法只差在要把 Dai 轉到當前合約,再同意 UniswapV2Router01 可以從當前合約把 Dai 轉走
兩個做法的第二個參數都是可以自行指定兌換的路徑,此處就直接給 WETH 和 Dai 的地址即可(順序有差)。需要注意的是這個路徑要是動態陣列 dynamic array,而這就是 Vyper 所不支援的功能! 動態陣列跟靜態陣列宣告方式的差別我有註解在程式碼中
此處就先來試試 Dai 換 Ether 吧!和上方一樣,在使用時也要先 approve() 當前合約,當前合約才能轉走使用者的 Dai。
由上方的截圖可以很清楚的看到 Dai 換 Ether 這個動作牽涉到的資金轉移路徑:
Dai: 我的帳戶→當前合約→交易對所在合約
WETH: 交易對所在合約→UniswapV2Router01
Ether: WETH 合約→UniswapV2Router01→我的帳戶
以上的路徑有些人稍微思考後可能會納悶:為什麼上方沒有一筆 WETH 從 UniswapV2Router01 再轉到 WETH 合約的動作呢? 這就是在 Wrapped Ether (WETH) ? 中提到的案例。原因是:把 WETH 還回 WETH 的合約時實際上使用的函示是 withdraw() 而非 transfer(),而在 WETH 合約中發生的只是把使用者 WETH 擁有的額度歸零或減少而已。
接下來就是把 Dai 轉到 Compound 的部分。由於 Compound 不是本文重點,此處只求功能正常,因此比起真正的實作方法當然是簡化許多。
一如往常初始化 Compound 合約的 instance
ETH 換 Dai 後放入 Compound : 將用 ETH 換得的 Dai 的數量,也就是 swapExactETHForTokens() 返回的第二個值,approve() Compound 的合約後就可以用 mint() 匯入了! 要注意的是,ETH 換成 Dai 後的收款地址(第四個參數)是當前合約,才能從此合約轉 Dai 到 Compound
還款給使用者: 用 redeem() 取出 Dai,一如往常同意 UniswapV2Router01 使用 Dai 的權力
之所以說這個程式碼不能真的拿來用是因為:cDai 轉給使用者、讓使用者自己持有是比較安全的作法;即使選擇把 cDai 留在當前合約,以上程式碼檢查 cDai 數量是用當前合約 address(this) 去檢查,實際上應該要去記錄每個使用者所擁有的 cDai 數量
最後附上截圖,可以看一下資金的轉移路徑:
ETH -> WETH -> Dai -> cDai (Compound)
cDai -> Dai -> WETH -> ETH
六. 取得報價作為預言機
若使用 Uniswap v1的報價作為預言機,攻擊者可以利用其演算法造成的滑點來操控價格。為此,Uniswap v2 提供了兩個加入時間權重的合約範例:
ExampleOracleSimple.sol : 簡單版
ExampleSlidingWindowOracle.sol : 複雜版;Sliding Window 在此場景是指透過改變擷取資料(歷史價格)的片段,用該特定期間的價格來做成時間權重,讓使用上更靈活!
本處以簡單版為例。打開 ExampleOracleSimple.sol,由於一些匯入檔案的問題我將 UniswapV2OracleLibrary 也放在這份檔案中。
做法非常簡單:將 UniswapV2Factory、Dai 及 WETH 所在的地址作為部署合約 ExampleOracleSimple 時的輸入值就完成了。部署成功後會有個 24 小時的鎖 Time lock,因為這個預言機是有時間權重的,所以並不是一部署完就能立刻使用。若要體驗更新價格此功能可以使用我部署的兩個,其位置我寫在註解中。
將 WETH 或是 Dai 的地址和要查詢的數量輸入 consult() 就能查到兩虛擬貨幣的價格:
1 ETH 價格約為 97 Dai
1 Dai 價格約為 0.01 ETH
然而,在測試網上我們沒辦法拿著預言機查到的價格套入演算法來核對,因為測試網上的 Uniswap 沒有啟用收費機制,而 k 值要在收費機制啟動時才能被計算,欲知詳情者就麻煩去看官方文件了!
七. 自行兌換 WETH
上方雖然有提到 WETH 在 Uniswap 中的使用原因及場合,但或許有人想試著自己動手將 Ether 換成 WETH、把 WETH 換回 Ether。方法非常簡單,將 WETH.sol 部署到 0xc778417E063141139Fce010982780140Aa0cD5Ab 就能使用,如下圖:
按下綠框中的 At Address 後,使用下方黑框中的 deposit 搭配在中間的黑框輸入所要兌換 Ether 的量,就能成功換到 WETH。同理,圖中未顯示的 withdraw 功能就是讓人輸入 WETH 來換回等量的 Ether。
稍微提一下,如果是第一次兌換,將 WETH 所在的地址輸入 Metamask 就能在錢包中看到自己擁有的 WETH 的數量,如下兩圖:
Voila!
八. 結語
呼,雖然上述操作及程式碼的撰寫其實還蠻簡單的,但畢竟 Uniswap 的功能不少、我個人也希望能將小細節解釋清楚些,因此長度遠超過預期...有看到結尾處的讀者,辛苦了xD 希望大家現在對於 Uniswap v2 的內容跟實作方法都很清楚了!
最後,如果本文有任何錯誤,請不吝提出,我會盡快做修正;而如果我的文章有幫助到你,可以看看我的其他文章,歡迎一起交流 :)
田少谷 Shao - Medium
Uniswap v2 實作 : 從創建交易對到Ether 換 Dai 投入 Compound was originally published in Taipei Ethereum Meetup on Medium, where people are continuing the conversation by highlighting and responding to this story.
👏 歡迎轉載分享鼓掌
同時也有10000部Youtube影片,追蹤數超過2,910的網紅コバにゃんチャンネル,也在其Youtube影片中提到,...
「js function寫法」的推薦目錄:
- 關於js function寫法 在 Taipei Ethereum Meetup Facebook 的最讚貼文
- 關於js function寫法 在 小吃貨的英國生活日記 Facebook 的精選貼文
- 關於js function寫法 在 小吃貨的英國生活日記 Facebook 的最讚貼文
- 關於js function寫法 在 コバにゃんチャンネル Youtube 的最讚貼文
- 關於js function寫法 在 大象中醫 Youtube 的最佳解答
- 關於js function寫法 在 大象中醫 Youtube 的精選貼文
- 關於js function寫法 在 [學習之路] TypeScript 的基礎 - 洛奇的邪惡組織手札 的評價
js function寫法 在 小吃貨的英國生活日記 Facebook 的精選貼文
#關於成為工程師這件事 #文長慎入
如果有follow 我之前寫的種種文章,大概就知道我的一些經歷。但這邊還是來快速回顧一下。
大學的時候唸了歷史系,雖說跟分數也有關係,但一部分也是因為我對歷史很有興趣,小時候當所有人都想當老師,或醫生護士這種職業的時候,我總是想說要當那種什麼考古學家~探險家之類的,當然歷史學家跟發明家也是在考量的項目中,長大以後才發現,這好像有點不是現實中可以很容易實現的職業。
很多科目,像是歷史,或者其他社會科學相關的,在台灣畢業以後都非常難找工作,即使你認真向學,決定一路念到博士,也不見得畢業後可以找到教職或博後。即使是商學院畢業出來,在台灣可以做的也很有限,尤其當你是什麼管理學院相關的出來,也不太有機會直接躍升管理職。
台灣的產業其實比很多國家來的少,可以做的工作也有限,大部分都是科技相關,這也造就了台灣過去二三十年的榮光,到現在也一直是科技業為主流。當然科技業變成世界主流已經不是這一兩年的事情,全世界越來越多人想要擠進科技業,因為科技進步導致很多傳統產業面臨倒閉或者被迫改變。
說起來一開始除了自己想要試試看自己到底學不學得會寫程式這件情,再來就是因為不想一輩子領著低薪過著普通OL的日子,加上一直對國外有的憧憬,很想去國外看看外面的世界,體驗國外的生活,尤其是對歐美國家有著美好的想像。
要說當時為什麼做了這種倉促決定,其實大概就只是一個不甘心吧!因為在台灣沒有辦法念研究所,被各大學拒絕以後,就心想乾脆嘗試國外的大學,看有沒有人要我。其實大概就是個背水一戰的概念。
一直以來我都有點,盲目的亂衝。就是想到什麼就決定做什麼,當然有時候我也會變得很膽小,就會想太多,然後不敢前進。可是時常又覺得,應該要強迫自己前進,因為知道自己是個懶惰的人,所以不想辦法把自己帶到那個不得不的情況,自己就會一直怠惰下去。
說起來,一開始我也不是很認真的想要當工程師,也就是半推半就,覺得試試看的心態,身邊也沒有什麼人把這件事情當一回事,這都是到英國念研究所以後,才開始覺得自己可以做些什麼事情。但最近我也在反省,覺得自已以前在研究所也是很混,覺得自己第一年工作真的完全不知道在幹嘛。
最近到了新公司工作以後,發現公司很多人都是轉職的人,有人在媒體業待了十年,有人在金融業,有人從醫療產業,有人從產品經理轉職,大家都非常的認真,比我還要認真許多。
雖然我一直覺得,自己跟其他本科系畢業的人比起來,年紀很大,甚至會覺得自己轉行轉得太晚,有時候也會想說,為什麼自己國高中的時候不自己上網學寫程式,為什麼不好好念數學,這樣可以考個工程相關的科系。
可是在新公司遇到了很多他們以Graduate身份進來的轉職者,真的讓我覺得,其實自己轉的好像也不太晚。當然他們比我有毅力很多,很多人都是Bootscamp出來的,有的人甚至快要40歲了才以一個畢業生的身份進來。
我覺得在英國很好的一點是,這邊有很多公司可能願意收這種,想要轉職工程師的人。這些人有的可能甚至沒有唸過大學。
公司一個跟我一起onboard的資深工程師,他告訴我他沒有唸大學,全是靠自己學的,但網路上有很多開源專案他都是主要貢獻者。我覺得很厲害。
來英國以後我一直在反省自己,覺得有時候就是,自己會過得太安逸,就不太想努力生活,又或者覺得努力的生活好累,我幹嘛要這麼累,甚至會有一種,反正我只要表現得比其他人好就好。
因為一直以來在台灣的生活成長環境,我覺得自己的價值是被社會被周遭的人定義出來的。例如你的學歷,你的工作職稱,你的薪水,你的資產。
有時候我會覺得自己可能是個悲觀的人,又或者是其他人喜歡隱藏自已過得不好的部分?每次我看別人的部落格,或者別人敘述自己的職涯時,總是覺得別人的職涯好像都過得很順遂。
一直以來我都覺得,自己的職涯好像不是很順遂,其實跟很多人比起來好像已經不錯,畢竟有個工程師的工作,還是在國外的工作。可是實際上我都覺得,自己好像是個很差勁的工程師,為什麼自己好像寫出來的code都很爛,為什麼自己好像什麼都不會,為什麼自己好像學東西學得很慢,還有自己就是一個,很怠惰的人。我沒辦法像很多人是,可以一直去摸不同的東西,例如看到個新的東西出來,就馬上想要打開電腦去碰,我也不是那種,遇到一個解不出來的問題就想要一直去解開的人。更不是那種可以一直帶著我愛的電腦,去世界各地旅行,沒事就打開來寫code的人。
所以一直以來,我也時常在懷疑自己,自己是否適合當一個工程師。
這幾年在英國認識了一些朋友,我也一直覺得其他人都很優秀,尤其是當我一個很好的朋友說,他喜歡選擇困難的事情來做的時候,我真的覺得很愧疚,因為一直以來我都在嘗試避免困難的事情,大概也是因為這樣我開始覺得,自己是不是根本不適合當一個工程師,因為我根本不想要做有挑戰性的工作。
可是回顧自己以前在DHL做個海運OP的工作的時候,又覺得自己在那種環境下,很容易疲乏,就是那種,我該學的都已經學玩,然後每天接電話打電話發Email, 遇到的問題也都是用類似的方式去處以就可以解決。我也覺得自己沒辦法就這樣做個十年二十年。
當然那樣的生活還是有好處的,至少你不工作的時候可以全心全意的放空,也不用每天回家還要擔心deadline, 擔心code寫不出來,或者去想到底要怎麼寫,也不用整天擔心新的東西出來,沒辦法跟舊的東西相容,或者是不學新的東西,自己會很快被淘汰掉。
有時候自己也在想,乾脆逃去其他國家寫程式會不會比較好?我們公司因為是全球性的,所以可以調派到其他國家,但是公司說,假設我們去了其他國家可能是senior level, 不代表我們在英國可能一樣是senior, 因為不同國家的科技和技術能力是不同的。這代表說,工程師即使在某個國家做到一定的程度,去其他地方也不代表一樣厲害,所以自己還是要不斷的學習最新的世界趨勢,學習新的科技,不眠不休。這也是為什麼工程師很容易過勞死吧!
以前在台灣一直加班我覺得是身體勞累,但現在我覺得自己比較是心靈上的勞累。我甚至覺得自己應該要早早退休,然後開一個小店之類的,來賣便當。
不過如果現在要我轉去做其他的職業我也不知道要幹嘛。即使都是工程師,都是科技業,也分得很細,尤其在英國都喜歡分門別類。工作到現在快三年,若你要問我我的強項是什麼,其實我也說不太出來,大概就是web 相關的東西吧!所以關於職涯規劃這件事情我也一直在思考。
我認為自己應該至少要有個什麼Machine Learning 的相關知識,然後一些系統設計,或者DevOps的能力跟知識要有。當然,大部分的人可能會問到,在英國如果當工程師,當到一定的歲數會需要轉管離職嗎?其實好像不一定,很多公司的管理職跟技術職都是分開的,也就是說你走管理也不一定會領比較多錢,反正有兩條路讓你選。有的人可能做到退休都是工程師。
在英國工作到現在,其實我還是常常會覺得很不順遂,不管是技術,文化還是語言,應該說也不是不順遂,就是不自然,當然很多可能還是跟我英文不夠好有關係,我雖然可能可以理解90%的內容,可是剩下的10%如果不懂還是讓人感覺煩躁。
當然現在的情況是比剛開始工作好很多了,至少很多技術的東西已經有經驗了。我覺得剛開始轉職並且在英國工作的時候,真的讓人覺得很心累,雖然說也可能是因為我的Team剛好都是英國人,不知道為何,即使是現在的公司,公司很多元化,我被分到的Team也幾乎都是英國人QQ
反正大概就是會有一個時期,或者偶爾在聊天的時候,你覺得別人在講的某個東西,你完全不知道是什麼。你可能就跟著笑這樣。。。或者在講一些專有技術的名詞時,別人可能知道,你卻不知道,就會有一種恐慌。
我自己是覺得這方面有逐漸改善一點點,希望我在現在的公司可以做得比之前好,至少我現在比較聽得懂大家的北方口音。
至於寫程式方面,還是一樣很心累,就有一種,無底洞的感覺,不管你怎麼學都學不夠,學不完。像是跑馬拉松但是永遠到達不了終點的感覺。從我一開始學寫程式到現在還是這樣。
但如果說可以回到以前剛開始學的時候,我想我應該會希望自己看到任何不會的東西都不要跳過。我知道那樣可能會變成學得很慢,可是很多時候,像是我們想要建立一個網站,可能我們會Google,然後就會看到很多建議,例如用WP, 或者推薦你用什麼vue, react, angular, 可是問題來了,即使你會一些基本的JS, 你可以用這些框架或library建一個SPA(一個網站), 你還是不知道它實際上是怎麼運作的。他底層是怎麼跑的。這樣會有什麼問題呢?
當你自己在家裡按照教學做都可以做得很開心,可是當你要改東西,或者在工作的時候,發生了問題,你就不知道該怎麼辦,因為你不知道到底發生了什麼事情,為什麼會報錯。
另一種學習路線是,好,我要學寫程式,然後你就開始去看學習物件導向,學Java, 初學者都是,學寫一個Class, 學習那些型別,然後寫個hello world, 按下那個play 鍵,他就自己開始跑一些東西,然後build好了,你就看到下面的視窗打出hello world, 接著教學就會說,那我們來簡單的寫一些function, 然後你就會寫出一些基本的加法function, 給他int a, int b, 就會跑出a+b的結果。
更進階一點可能會有一些題目是,印星星,或印九九乘法表,或者用Apache web server, 架一個簡單的網站。學一點html, 一點CSS, 一點JS, 讓他看起來漂亮一點。
這個時候你個課程就差不多結束,你也有一個作品。
如果你想要找工作,可能會發現,工作很多考的內容你還是不會,或者你開始工作以後,發現很多東西還是不會。因為前面你做的那些事情都只是,根據指示做,就像你去IKEA買了家具按照那個指示來做,可是傢俱本身都已經切好了,零件也都配給你。今天如果要你自己去工廠買那些材料才切割才做,設計一個櫃子,你也做不出來。
所以問題來了,到底要怎麼樣學寫程式?我覺得大概就是,在做那些教學的時候,去思考,我現在做的每一步,是為什麼,如果不知道,就去Google, 不要貿然的進行。然後做完教學以後,看看自己能不能做出一個跟教學類似但不一樣的網站,最好是可以不要一直看著教學。
可以拿白板或紙,來畫一些圖,想想自己要做什麼,例如我要做一個,賣衣服的網站,我需要什麼東西,或者我要設計一款小遊戲,我要創造幾個角色,要有哪些怪獸,要有哪些關卡。
我自己是沒有去過BootsCamp, 但感覺BootsCamp的訓練都滿扎實的。英國有滿多免費的(雖然大部分是Women in Tech)的,所以想轉職的男生們可能要找付費的。
很多BootsCamp也是保證找到工作的,找不到可能會退錢。或者可以嘗試那種網路上免錢的。
當你開始工作以後,你可能要開始思考,你寫的code乾不乾淨,你有沒有寫測試,甚至你可以嘗試練習TDD(測試驅動開發),思考怎麼樣可以寫出好的程式碼,什麼叫做好的程式碼,越簡單越好,簡單易懂,白話程式碼,如果今天一個不會寫程式的人,可以經過你的解說,看得懂你的code, 那你真的就大成功了。
為什麼說要簡單易懂,因為通常工作以後你寫的code不是只有你自己要看,還有別人要看,甚至一年後的自己要看,之後你是不是還看得懂,例如命名,例如空行,例如有沒有重複的?
像是在工作以後,很多同事會用一些詞彙,例如DRY(don't repeat yourself), 或者網路上也可以找到很多文章,寫說要怎麼樣寫出乾淨的程式碼。除了乾淨以外,還要思考延展性,就像DIY的傢俱,或者書櫃,你一開始可能買了一個兩層櫃,你會希望你如果要變成三層可以加上去。或者是床,沙發,你會希望他們是可以我不佔空間,好收納,或者可以延伸。寫程式你也希望你寫的一些東西是這樣子。例如共用的程式碼,你可以寫一個可以把'2019/12/03' 轉換成 ’兩千零九年十二月三日‘ 的function, 你會希望這個function, 可以被廣為使用,可以是'20191203', '2019,12,03', 進來都會被轉換成文字的寫法這樣,那你要怎麼做?可以先去思考以要做的事情,然後寫出測試
像是在JS很多的測試是非常口語化的
describe('dateConvert', ()=>{
it('should return date using word format', ()=>{
expect(dataConvert('2019/12/03')).toEqual('兩千零
九年十二月三日');
})
})
如果有錯誤請各位糾正
反正工作以後,寫測試變成一件很重要的事情,還有要怎麼寫,因為當其他同事在看你的code的時候,如果你有寫完整的測試,同事也會比較好看得懂你的程式在做什麼
當然,沒有一個開發方法是完美的,也沒有什麼完美的code, 即使寫完了以後,也要檢查看看自己能不能把它變得更好,像是使用 TDD就可以一直加上新的測試,然後去想能不能把它變得更好,去重構。
各位如果有興趣的話也可以買一些書來看,雖然很多書已經出版很久,可是程式設計,跟軟體工程這塊,經典還是經典,可以幫助你了解,為什麼現在我們都用C語言而不是A語言,B語言,為什麼我們大眾使用物件導向來寫程式,不是使用Functional programming.
當你工作越久以後,可能會越容易遇到,你要去選擇你要用的程式語言,你要用的框架,你要用的工具。
有一天我問我的同事,到底要怎麼貢獻開源,他說不要為了貢獻而貢獻,一般都是,你因為自己在用這個開源軟體,遇到了一些問題,所以你去把它改善,或者說你需要一個工具,可是你Google很久發現都沒有,於是決定自己做一個。
雖然我覺得以目前的我來說,還很難達到這種程度,但希望我有一天可以。就像Vue.js的創辦人因為覺得Angular.js不夠好,於是決定把好的部分留下,再加上自己覺得可以讓他變得更好的部分,創造了Vue.js
其實我自己也很害怕去討論這些非常技術的東西,我很怕自己講錯誤導大家哈哈
成為工程師真的需要很強的心臟,因為需要接受很多批評,很多反饋,才可以進步。當然有時候我也很玻璃心,常常因為被其他工程師點出自己的錯誤就心情不好,可是如果都沒有人批評自己,自己大概也不會進步。我想這大概是跟其他工作最大的不同吧!
以前在做海運出口的時候,即使可能做錯也不會一直被講,除非你真的是做了很嚴重的事情,不會你每接一通點話,每寫一封信都有人來看,有人來糾正,有人來說,你Email要怎麼怎麼改,你這樣寫不行。
可是寫程式,你寫出來的每一行code都可能被品頭論足,每一行code都要確保它的質量,當然我知道不是每個公司都有code review, 可因為我一直以來都有這個東西,也導致我覺得壓力滿大的哈哈
不知道分享這些會不會讓大家也覺得壓力大
js function寫法 在 小吃貨的英國生活日記 Facebook 的最讚貼文
#關於成為工程師這件事 #文長慎入
如果有follow 我之前寫的種種文章,大概就知道我的一些經歷。但這邊還是來快速回顧一下。
大學的時候唸了歷史系,雖說跟分數也有關係,但一部分也是因為我對歷史很有興趣,小時候當所有人都想當老師,或醫生護士這種職業的時候,我總是想說要當那種什麼考古學家~探險家之類的,當然歷史學家跟發明家也是在考量的項目中,長大以後才發現,這好像有點不是現實中可以很容易實現的職業。
很多科目,像是歷史,或者其他社會科學相關的,在台灣畢業以後都非常難找工作,即使你認真向學,決定一路念到博士,也不見得畢業後可以找到教職或博後。即使是商學院畢業出來,在台灣可以做的也很有限,尤其當你是什麼管理學院相關的出來,也不太有機會直接躍升管理職。
台灣的產業其實比很多國家來的少,可以做的工作也有限,大部分都是科技相關,這也造就了台灣過去二三十年的榮光,到現在也一直是科技業為主流。當然科技業變成世界主流已經不是這一兩年的事情,全世界越來越多人想要擠進科技業,因為科技進步導致很多傳統產業面臨倒閉或者被迫改變。
說起來一開始除了自己想要試試看自己到底學不學得會寫程式這件情,再來就是因為不想一輩子領著低薪過著普通OL的日子,加上一直對國外有的憧憬,很想去國外看看外面的世界,體驗國外的生活,尤其是對歐美國家有著美好的想像。
要說當時為什麼做了這種倉促決定,其實大概就只是一個不甘心吧!因為在台灣沒有辦法念研究所,被各大學拒絕以後,就心想乾脆嘗試國外的大學,看有沒有人要我。其實大概就是個背水一戰的概念。
一直以來我都有點,盲目的亂衝。就是想到什麼就決定做什麼,當然有時候我也會變得很膽小,就會想太多,然後不敢前進。可是時常又覺得,應該要強迫自己前進,因為知道自己是個懶惰的人,所以不想辦法把自己帶到那個不得不的情況,自己就會一直怠惰下去。
說起來,一開始我也不是很認真的想要當工程師,也就是半推半就,覺得試試看的心態,身邊也沒有什麼人把這件事情當一回事,這都是到英國念研究所以後,才開始覺得自己可以做些什麼事情。但最近我也在反省,覺得自已以前在研究所也是很混,覺得自己第一年工作真的完全不知道在幹嘛。
最近到了新公司工作以後,發現公司很多人都是轉職的人,有人在媒體業待了十年,有人在金融業,有人從醫療產業,有人從產品經理轉職,大家都非常的認真,比我還要認真許多。
雖然我一直覺得,自己跟其他本科系畢業的人比起來,年紀很大,甚至會覺得自己轉行轉得太晚,有時候也會想說,為什麼自己國高中的時候不自己上網學寫程式,為什麼不好好念數學,這樣可以考個工程相關的科系。
可是在新公司遇到了很多他們以Graduate身份進來的轉職者,真的讓我覺得,其實自己轉的好像也不太晚。當然他們比我有毅力很多,很多人都是Bootscamp出來的,有的人甚至快要40歲了才以一個畢業生的身份進來。
我覺得在英國很好的一點是,這邊有很多公司可能願意收這種,想要轉職工程師的人。這些人有的可能甚至沒有唸過大學。
公司一個跟我一起onboard的資深工程師,他告訴我他沒有唸大學,全是靠自己學的,但網路上有很多開源專案他都是主要貢獻者。我覺得很厲害。
來英國以後我一直在反省自己,覺得有時候就是,自己會過得太安逸,就不太想努力生活,又或者覺得努力的生活好累,我幹嘛要這麼累,甚至會有一種,反正我只要表現得比其他人好就好。
因為一直以來在台灣的生活成長環境,我覺得自己的價值是被社會被周遭的人定義出來的。例如你的學歷,你的工作職稱,你的薪水,你的資產。
有時候我會覺得自己可能是個悲觀的人,又或者是其他人喜歡隱藏自已過得不好的部分?每次我看別人的部落格,或者別人敘述自己的職涯時,總是覺得別人的職涯好像都過得很順遂。
一直以來我都覺得,自己的職涯好像不是很順遂,其實跟很多人比起來好像已經不錯,畢竟有個工程師的工作,還是在國外的工作。可是實際上我都覺得,自己好像是個很差勁的工程師,為什麼自己好像寫出來的code都很爛,為什麼自己好像什麼都不會,為什麼自己好像學東西學得很慢,還有自己就是一個,很怠惰的人。我沒辦法像很多人是,可以一直去摸不同的東西,例如看到個新的東西出來,就馬上想要打開電腦去碰,我也不是那種,遇到一個解不出來的問題就想要一直去解開的人。更不是那種可以一直帶著我愛的電腦,去世界各地旅行,沒事就打開來寫code的人。
所以一直以來,我也時常在懷疑自己,自己是否適合當一個工程師。
這幾年在英國認識了一些朋友,我也一直覺得其他人都很優秀,尤其是當我一個很好的朋友說,他喜歡選擇困難的事情來做的時候,我真的覺得很愧疚,因為一直以來我都在嘗試避免困難的事情,大概也是因為這樣我開始覺得,自己是不是根本不適合當一個工程師,因為我根本不想要做有挑戰性的工作。
可是回顧自己以前在DHL做個海運OP的工作的時候,又覺得自己在那種環境下,很容易疲乏,就是那種,我該學的都已經學玩,然後每天接電話打電話發Email, 遇到的問題也都是用類似的方式去處以就可以解決。我也覺得自己沒辦法就這樣做個十年二十年。
當然那樣的生活還是有好處的,至少你不工作的時候可以全心全意的放空,也不用每天回家還要擔心deadline, 擔心code寫不出來,或者去想到底要怎麼寫,也不用整天擔心新的東西出來,沒辦法跟舊的東西相容,或者是不學新的東西,自己會很快被淘汰掉。
有時候自己也在想,乾脆逃去其他國家寫程式會不會比較好?我們公司因為是全球性的,所以可以調派到其他國家,但是公司說,假設我們去了其他國家可能是senior level, 不代表我們在英國可能一樣是senior, 因為不同國家的科技和技術能力是不同的。這代表說,工程師即使在某個國家做到一定的程度,去其他地方也不代表一樣厲害,所以自己還是要不斷的學習最新的世界趨勢,學習新的科技,不眠不休。這也是為什麼工程師很容易過勞死吧!
以前在台灣一直加班我覺得是身體勞累,但現在我覺得自己比較是心靈上的勞累。我甚至覺得自己應該要早早退休,然後開一個小店之類的,來賣便當。
不過如果現在要我轉去做其他的職業我也不知道要幹嘛。即使都是工程師,都是科技業,也分得很細,尤其在英國都喜歡分門別類。工作到現在快三年,若你要問我我的強項是什麼,其實我也說不太出來,大概就是web 相關的東西吧!所以關於職涯規劃這件事情我也一直在思考。
我認為自己應該至少要有個什麼Machine Learning 的相關知識,然後一些系統設計,或者DevOps的能力跟知識要有。當然,大部分的人可能會問到,在英國如果當工程師,當到一定的歲數會需要轉管離職嗎?其實好像不一定,很多公司的管理職跟技術職都是分開的,也就是說你走管理也不一定會領比較多錢,反正有兩條路讓你選。有的人可能做到退休都是工程師。
在英國工作到現在,其實我還是常常會覺得很不順遂,不管是技術,文化還是語言,應該說也不是不順遂,就是不自然,當然很多可能還是跟我英文不夠好有關係,我雖然可能可以理解90%的內容,可是剩下的10%如果不懂還是讓人感覺煩躁。
當然現在的情況是比剛開始工作好很多了,至少很多技術的東西已經有經驗了。我覺得剛開始轉職並且在英國工作的時候,真的讓人覺得很心累,雖然說也可能是因為我的Team剛好都是英國人,不知道為何,即使是現在的公司,公司很多元化,我被分到的Team也幾乎都是英國人QQ
反正大概就是會有一個時期,或者偶爾在聊天的時候,你覺得別人在講的某個東西,你完全不知道是什麼。你可能就跟著笑這樣。。。或者在講一些專有技術的名詞時,別人可能知道,你卻不知道,就會有一種恐慌。
我自己是覺得這方面有逐漸改善一點點,希望我在現在的公司可以做得比之前好,至少我現在比較聽得懂大家的北方口音。
至於寫程式方面,還是一樣很心累,就有一種,無底洞的感覺,不管你怎麼學都學不夠,學不完。像是跑馬拉松但是永遠到達不了終點的感覺。從我一開始學寫程式到現在還是這樣。
但如果說可以回到以前剛開始學的時候,我想我應該會希望自己看到任何不會的東西都不要跳過。我知道那樣可能會變成學得很慢,可是很多時候,像是我們想要建立一個網站,可能我們會Google,然後就會看到很多建議,例如用WP, 或者推薦你用什麼vue, react, angular, 可是問題來了,即使你會一些基本的JS, 你可以用這些框架或library建一個SPA(一個網站), 你還是不知道它實際上是怎麼運作的。他底層是怎麼跑的。這樣會有什麼問題呢?
當你自己在家裡按照教學做都可以做得很開心,可是當你要改東西,或者在工作的時候,發生了問題,你就不知道該怎麼辦,因為你不知道到底發生了什麼事情,為什麼會報錯。
另一種學習路線是,好,我要學寫程式,然後你就開始去看學習物件導向,學Java, 初學者都是,學寫一個Class, 學習那些型別,然後寫個hello world, 按下那個play 鍵,他就自己開始跑一些東西,然後build好了,你就看到下面的視窗打出hello world, 接著教學就會說,那我們來簡單的寫一些function, 然後你就會寫出一些基本的加法function, 給他int a, int b, 就會跑出a+b的結果。
更進階一點可能會有一些題目是,印星星,或印九九乘法表,或者用Apache web server, 架一個簡單的網站。學一點html, 一點CSS, 一點JS, 讓他看起來漂亮一點。
這個時候你個課程就差不多結束,你也有一個作品。
如果你想要找工作,可能會發現,工作很多考的內容你還是不會,或者你開始工作以後,發現很多東西還是不會。因為前面你做的那些事情都只是,根據指示做,就像你去IKEA買了家具按照那個指示來做,可是傢俱本身都已經切好了,零件也都配給你。今天如果要你自己去工廠買那些材料才切割才做,設計一個櫃子,你也做不出來。
所以問題來了,到底要怎麼樣學寫程式?我覺得大概就是,在做那些教學的時候,去思考,我現在做的每一步,是為什麼,如果不知道,就去Google, 不要貿然的進行。然後做完教學以後,看看自己能不能做出一個跟教學類似但不一樣的網站,最好是可以不要一直看著教學。
可以拿白板或紙,來畫一些圖,想想自己要做什麼,例如我要做一個,賣衣服的網站,我需要什麼東西,或者我要設計一款小遊戲,我要創造幾個角色,要有哪些怪獸,要有哪些關卡。
我自己是沒有去過BootsCamp, 但感覺BootsCamp的訓練都滿扎實的。英國有滿多免費的(雖然大部分是Women in Tech)的,所以想轉職的男生們可能要找付費的。
很多BootsCamp也是保證找到工作的,找不到可能會退錢。或者可以嘗試那種網路上免錢的。
當你開始工作以後,你可能要開始思考,你寫的code乾不乾淨,你有沒有寫測試,甚至你可以嘗試練習TDD(測試驅動開發),思考怎麼樣可以寫出好的程式碼,什麼叫做好的程式碼,越簡單越好,簡單易懂,白話程式碼,如果今天一個不會寫程式的人,可以經過你的解說,看得懂你的code, 那你真的就大成功了。
為什麼說要簡單易懂,因為通常工作以後你寫的code不是只有你自己要看,還有別人要看,甚至一年後的自己要看,之後你是不是還看得懂,例如命名,例如空行,例如有沒有重複的?
像是在工作以後,很多同事會用一些詞彙,例如DRY(don't repeat yourself), 或者網路上也可以找到很多文章,寫說要怎麼樣寫出乾淨的程式碼。除了乾淨以外,還要思考延展性,就像DIY的傢俱,或者書櫃,你一開始可能買了一個兩層櫃,你會希望你如果要變成三層可以加上去。或者是床,沙發,你會希望他們是可以我不佔空間,好收納,或者可以延伸。寫程式你也希望你寫的一些東西是這樣子。例如共用的程式碼,你可以寫一個可以把'2019/12/03' 轉換成 ’兩千零九年十二月三日‘ 的function, 你會希望這個function, 可以被廣為使用,可以是'20191203', '2019,12,03', 進來都會被轉換成文字的寫法這樣,那你要怎麼做?可以先去思考以要做的事情,然後寫出測試
像是在JS很多的測試是非常口語化的
describe('dateConvert', ()=>{
it('should return date using word format', ()=>{
expect(dataConvert('2019/12/03')).toEqual('兩千零
九年十二月三日');
})
})
如果有錯誤請各位糾正
反正工作以後,寫測試變成一件很重要的事情,還有要怎麼寫,因為當其他同事在看你的code的時候,如果你有寫完整的測試,同事也會比較好看得懂你的程式在做什麼
當然,沒有一個開發方法是完美的,也沒有什麼完美的code, 即使寫完了以後,也要檢查看看自己能不能把它變得更好,像是使用 TDD就可以一直加上新的測試,然後去想能不能把它變得更好,去重構。
各位如果有興趣的話也可以買一些書來看,雖然很多書已經出版很久,可是程式設計,跟軟體工程這塊,經典還是經典,可以幫助你了解,為什麼現在我們都用C語言而不是A語言,B語言,為什麼我們大眾使用物件導向來寫程式,不是使用Functional programming.
當你工作越久以後,可能會越容易遇到,你要去選擇你要用的程式語言,你要用的框架,你要用的工具。
有一天我問我的同事,到底要怎麼貢獻開源,他說不要為了貢獻而貢獻,一般都是,你因為自己在用這個開源軟體,遇到了一些問題,所以你去把它改善,或者說你需要一個工具,可是你Google很久發現都沒有,於是決定自己做一個。
雖然我覺得以目前的我來說,還很難達到這種程度,但希望我有一天可以。就像Vue.js的創辦人因為覺得Angular.js不夠好,於是決定把好的部分留下,再加上自己覺得可以讓他變得更好的部分,創造了Vue.js
其實我自己也很害怕去討論這些非常技術的東西,我很怕自己講錯誤導大家哈哈
成為工程師真的需要很強的心臟,因為需要接受很多批評,很多反饋,才可以進步。當然有時候我也很玻璃心,常常因為被其他工程師點出自己的錯誤就心情不好,可是如果都沒有人批評自己,自己大概也不會進步。我想這大概是跟其他工作最大的不同吧!
以前在做海運出口的時候,即使可能做錯也不會一直被講,除非你真的是做了很嚴重的事情,不會你每接一通點話,每寫一封信都有人來看,有人來糾正,有人來說,你Email要怎麼怎麼改,你這樣寫不行。
可是寫程式,你寫出來的每一行code都可能被品頭論足,每一行code都要確保它的質量,當然我知道不是每個公司都有code review, 可因為我一直以來都有這個東西,也導致我覺得壓力滿大的哈哈
不知道分享這些會不會讓大家也覺得壓力大
js function寫法 在 [學習之路] TypeScript 的基礎 - 洛奇的邪惡組織手札 的推薦與評價
布林值可以指定類型為 boolean ,另一種寫法為 Boolean 代表的是JS 原生的建構式勿搞混。 ... function both(arg: number | string): string { ... <看更多>