轉職的職涯規劃:你只是 entry level 別想太多

看到標題別生氣,絕對沒有 diss 的意思,也不是說「多想」顯得自己蠢,更像個心路歷程的紀錄。
這篇文章紀錄成為工程師的第四個月前與三位前輩 Alaster、KK、 老莫 小聚的心得,首先會先說明從入職後出現的煩惱、為什麼會出現這樣的煩惱、這三位講者分享的內容是如何解決我內心的惶恐以及接下來的規劃。

不是只有少年才有煩惱

在該成家立業的年紀做了一個很叛逆的決定,轉職成為軟體工程師,也因為轉職,一切歸零也讓一切很沒安全感。
不確定是不是也有轉職者有和我面對相同的困擾:覺得過去的時間已經不復返,所以戰戰兢兢選擇每一步,想知道要怎麼成為 senior 、然後又急得想追上『別人』的進度
我想自己的「擔心」「焦慮」應該都算正常,畢竟不熟悉這個領域嘛,
但因為覺得自己的困擾更像是無頭蒼蠅的擔憂,所以又在分析一下自己的問題是:要如何降低這樣的內心壓力,不至於讓自己 burn out ,更 enjoy Happy Coding 過程,以及享受重新選擇的 career path 的機會

帶著心中的問題,我參加了三場小聚,每場小聚的主軸是工程師的職涯規劃與經驗分享,不過三位分享者的背景經歷都不同,所以切角不同,但想表達的核心概念應該差不多:別怕就去試吧!

Al 你要走哪一條路:其實每一條路徑都有一些具體的指標

軟體工程師的價值是「解決問題、創造價值」
轉職者的第一份工作,得來不易。要怎麼選擇第一份轉職工作,每個人的優先考量重點都不相同,但是入職後的想法跟作為就顯得更重要了。

  • 融入開發流程
  • 下班與週末進修(實作專案)
  • 工程師本質?如何創造工程師價值
  1. 工程能力
  2. 影響力
    Dropbox Engineering Career Framework
    Mozilla Engineering Career Track

內化成為行為準則的推薦書單:
A Philosophy of Software Design
Clean Code

額外補充完整分享會內容

KK 你只是 Entry level : 先勇敢嘗試

因為在 ExplainThis 的會後小聚,有機會認識到 KK ,與 KK 聊到關於入職後的擔心,他分享到一個很重要的觀念,你只是 Entry level 先勇敢嘗試,找到自己的價值後再去擔心接下來的問題。
這句話提醒了我,我的焦慮不是重點,而是應該要好好把握還可以嘗試的機會。

老莫台中充電聚:邊探索邊玩,你會發現多了一些抉擇機會

老莫技能範疇很廣,前端、後端、Infra ……
他對於職涯目標很明確,帶給我的更多的啟發是在於踏出嘗試的那一步,因為想要成為 tech lead 所以努力補足自己欠缺的部分,像是擴展自己硬實力,努力加強軟實力。說是熱情,我更覺得像是執著,一種對自己的要求,這樣的態度有時候覺得很需要大家聚在一起,一起鼓勵、一起成長:)

最後

內化三位分享者的內容,加上自己的感想,心目中已經有稍微清晰想要成為的樣子,雖然還是會緊張,但不至於焦慮。
那因為今天是剛好滿三個月的試用期,這裡接下的三個月我朝向全端工程師,除了在熟悉現有的框架與技術,想要帶著一些玩樂性質探索新工具,與熟練基本的技術能力。寫出 Clean Code 是個很美的事,雖然我不能馬上達到,但會以這個為目標。

半年後在一篇半年心得吧:)

Set up MSSQL in Node.js

install Docker

Docker docs

use docker to install SQL Server(for mac intel chip)

1
$ sudo docker pull mcr.microsoft.com/mssql/server:2023-latest

Note : You can change the version you want by change the year of latest version

launch SQL Server image in docker

1
$ docker run -d --name sql_server_test -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=password' -p 1433:1433 mcr.microsoft.com/mssql/server:2022-latest

Note :

  • Docker command Line - Cli

install mssql cli

1
$ npm i -g sql-cli

Note : mssql-cli

use mssql-cli to test whether MSSQL install success

1
$ mssql -u sa -p password

download GUI for MSSQL - Azure Data Studio

download Azure Data Studio

MSSQL connection in Node.js

Github an example of MSSQL connection

Note : Make sure server is running in Docker containers

跳痛 - 轉職工程師不容易

我成功轉職,每一場面試都是獨一無二的,因此這個只是個參考經驗,不代表一定會成功,僅供參考!每個人看對於推薦信、個人履歷都有不同標準或是想法。假如請五個前輩或是同學過目,那就有五種意見,哪些意見要參考或依照什麼標準,請斟酌服用,不然求職焦慮的蔓延,不是好克服的心理狀態。

文章主要會先從個人經歷、中間的過程與最後的求職準備,

經歷

先說說我的經歷吧,大學唸公共行政,上課的期間對於台灣歷史與政治產生興趣,因此研究所念政治系
畢業以後同時經營網拍準備國考。經過一些時間後,身心俱疲。調整心態後,因為網拍的經驗,所以選擇上數位行銷的課程。課程後進入數位廣告公司,擔任數位廣告業務,就此展開媒體旅程。

媒體的產業有辛酸、有趣,在這個產業待一段時間,從不同角度體驗產業的觀點,產生新的視角高度後,也開始思索未來的發展性與自己的人生規劃。回歸,究竟哪一種生活狀態更符合自己的個性,成為轉職的萌芽。但這個階段我其實還沒有接觸『 程式 』,更精確地來說,我沒有自己寫過程式。

師父領入門修行在個人

在開始上課前我有稍微聽過朋友分享,主要分享程式人生的優勢與需要思考的問題,好的部分可以參考網路資料,各種推坑的優勢,但需要特別思考的部分是:沒有止境的學習,沒有止境沒有在開玩笑。評估自己的耐心、毅力、學習力。這三個無法排序,每一種能力都很重要,而且是一種磨練。

面試要件

上玩各種課程後,以為自己懂了,摩拳擦掌的準備接下來的面試。整理了一下我認為的面試有幾個要件:求職目標設定、投遞履歷前的準備、自我推薦信與履歷、面試前準備、運氣、心態。其中『自我推薦信與履歷』、『面試前準備』是可控因素,可以投資把握的。

求職目標

每個人的目標不同,有些是全職的求職者,有些還有工作(在職)。對全職求職者來說,求職目標也會有差別,可能有些人想先準備個人專案、再提升專業知識等等。需要花點時間釐清自己的求職目標是什麼,以我來說設定很簡單,作品集的部分依照現有專案添加新功能,在兩個月內求職成功。要達成這個目標我需要的準備是:篩選與整理作品集、每天規定自己需要投遞履歷的間數。有了簡單的方向,接下來的準備都是隨機調整。

投遞履歷前準備

投遞履歷前的準備:重點在作品集同時查看職缺,

  1. 查看職缺:這個部分很主觀,但是可以條列出自己的方向(公司規模、產品、文化、薪資福利等),投遞或面試的過程可能對於公司會有不同看法。
  2. 作品集:為什麼工程師面試需要有作品集?這個問題有兩派,但我個人的想法是:自己是轉職者,在技術能力上肯定是需要資料佐證,因此作品集是加快面試官可以知道能力程度最快的方法。另外有些人認為作品集不可以包含線上課程的作業,有些人直接把作業放在履歷上也找到工作,我自己的做法是折衷,以現有的作品再增加新功能。這一段準備期間也花了兩週多的時間。

自我推薦信與履歷

自我推薦信好像很簡單,先說我是誰,剛好看到有職缺,因此來投遞履歷,最後說希望有面試機會。看似段落沒有什麼問題,所以重點會在內容。身為轉職者,除了過往的專案的經驗,就沒有其他內容。因此我將重點放在:

  1. 說明我是誰
  2. 過去的工作經驗
  3. 為什麼樣的因緣轉職
  4. 轉職期間會哪些技術能力

自我推薦信完成後,記得請工程師的朋友或是前輩們過目,看看是否有需要修改或調整的地方。依照目前的求職經驗,可以先投一些公司(大概 10~15 家)測測自我推薦信的效果,假如沒有收到回覆再次調整。

履歷的修改,以簡單扼要為主,當然排版不能太凌亂,可以參考 cakeresume 中的範例。完成後同樣要請別人幫忙看一下。

不用覺得害羞或是不好意思,請別人幫忙的主要原因是:怕自我感覺良好而錯失機會! 有些時候會因為我覺得很棒啊,但是自我推薦信沒有符合公司需求而被刷掉,或是履歷沒有提到相關經驗等等。因此請別人幫忙看自我推薦信、履歷可以幫助找到盲點,針對盲點修改後再重複以上步驟。

面試前準備

面試前準備是最緊張的部分,因為不知道公司會問什麼。有些公司會有些前測的題目,問題都是可以在網路上找到相關的解題方向,不外乎是 Leetcode 或是說明原理概念。面試問題就考驗臨場反應,知之為知之,不知為不知。千萬不要硬要回答,而隨便塞了理論或概念,若是不確定概念也可以詢問面試官,參與討論有時候也是了解公司與團隊的方式。準備方向也是可以參考網路上資源,JavaScript 基本概念、網路概念。專案熟悉度:為什麼使用這個套件、說明套件原理等等

運氣

『運氣』這件事就詭譎了,別人覺得你很幸運,但也許在你眼中只是剛好。這個『剛好』是因為有先前的準備,因此也不是從天掉下來的幸運。老套的一句話『機會是留給準備好的人』,這句話應證了每個得來不易的機會都是難得的,因此前置的準備需要花很多心力。

心態

沒有事情是一帆風順的,至少在我身上沒有發生過。海投 80 + 以上的公司,真正到有面試大概是 1/10 的機會,拿到 offer 又是另外一個機率。回想過去的行銷漏斗,一層一層真正成為漏斗下方接住的客戶,很少。因此一定要有個心理準備,沒有準備好的時候,只有不斷迭代調整才能往前。履歷投下去就對了,有面試機會,先去了再說!

今天先到這裡,面試其實還有很多細節,但是講個大概,剩下的先把履歷丟出去,發現問題再回頭調整,問問有經驗的人,幫助會很大。
希望大家都可以找到理想中的工作與狀態,接下來的挑戰,是上工了!

LeetCode - Running Sum Of 1d Array

題目

  • inputs nums 是一個陣列
  • outputs 的結果是 runningSum[i] = sum(nums[0]…nums[i])

example

Input: nums = [1,2,3,4]
Output: [1,3,6,10]
Explanation: Running sum is obtained as follows: [1, 1+2, 1+2+3, 1+2+3+4].

思考

  • iteration, 不可以超過 nums length
  • 儲存加起來的值
  • -> index[0] 不動 -> index[1] = index[0] + index[1]
  • -> index[1] 不動 -> index[2] = index[1] + index[2]
  • index[i + 1] = index[i] + index [i+1]
1
2
3
4
5
6
7
8
9
function sum(nums) {
for (let i = 0; i < nums.length - 1; i++) {
let temp = nums[i] + nums[i + 1]
nums[i + 1] = temp
}
return nums
}
let nums = [1, 2, 3, 4]
console.log(sum(nums))

Vim, 隨時補充

2022-11-07

install vim

用部落格來練練 vim

網路上有許多入門資源,我直接參考 learn-vim

先 install 吧

有兩個資源可以參考:

  1. vim-web-side
  2. vim-github

我覺得 GitHub 比較清楚,依照電腦系統不同,有不一樣的安裝方式,以下是 Mac intel 晶片的安裝方式

  1. 安裝 brew

  2. brew install vim

  3. 安裝結束:安裝的時間滿久的,不確定是我電腦跑得比較慢,還是本身安裝時間就長

簡單指令介紹

  • 開啟檔案 : vim fileName
  • 退出: :q
  • 存檔: :w

兩個指令可以同時使用,:wq -> 存檔並退出

Leetcode 隨時更新

判斷身分證字號是否有效

編號規則

  1. 首碼 -> 戶籍地
  2. 有效碼公式
    假設身分證字號為A123456789
    • A 轉換為數值是 10,
    • 每一碼拆開後分別編號
    • 每一個數字依序乘上 1、9、8、7、6、5、4、3、2、1、1
    • 最後再相加
    • 然後再除以 10
    • 整除就是有效之身分證號碼
順序 n1 n2 n3 n4 n5 n6 n7 n8 n9 n10 n11
號碼 1 0 1 2 3 4 5 6 7 8 9
1 9 8 7 6 5 4 3 2 1 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
function isValidTWId(str) {
if (str.length !== 10) return false
// 首碼->戶籍碼
const n = alphaToNumber(str[0])
// 十位數拆開
const firstNumber = Math.floor(n / 10)
const secondNumber = n % 10

// 每一個數字依序乘上1、9、8、7、6、5、4、3、2、1、1,最後再相加
let sum = firstNumber * 1 + secondNumber * 9
for (let i = 1; i < str.length - 1; i++) {
sum += str[i] * (9 - i)
}
sum += Number(str[9])
return sum % 10 === 0
}
function alphaToNumber(alpha) {
const mapping = {
A: 10,
B: 11,
C: 12,
D: 13,
E: 14,
F: 15,
G: 16,
H: 17,
I: 34,
J: 18,
K: 19,
L: 20,
M: 21,
N: 22,
O: 35,
P: 23,
Q: 24,
R: 25,
S: 26,
T: 27,
U: 28,
V: 29,
W: 32,
X: 30,
Y: 31,
Z: 33,
}
return mapping[alpha]
}
console.log(isValidTWId('A123456789'))
console.log(isValidTWId('A234567890'))

Open Source

先說為什麼會踏入 Open Source 的世界?自從轉換跑道後,時常聽到開源專案,但總是沒有時間好好研究到底什麼是開源
這次可以有機會參加踏入開源的活動(雖然說”這次”…但也其實發文時間與活動時間中間間隔有點久)。不管怎樣,感謝我的爸爸媽媽,當然也是要謝謝 Alpha Camp 特別舉辦講座。

我的母校 Alpha Camp 每次辦的講座與活動,通常我只要看到『欸這什麼』都會立馬報名聽聽看。當然有時候也會想說,聽不懂怎麼辦,別擔心,我記得活動報名前就有個貼心小提醒

本次活動的技術成份較重,無法完全理解內容也不用氣餒,「多聽、多問、多筆記」,未來碰到時再深入研究即可。

總之,很幸運的獲得參加講座的機會,也讓我對於開源社群有更多的認識。

圖片來源:Alpha Camp

來吧講重點了

活動有三位講者,Singing、Ninja、Davy。三位都有個共通點:熱情,但他們表現的方式不太一樣。

Singing 對於開源社群的社情:

Singing 從組織架構的角度介紹台灣開源的社群,宣導一個觀念社群要能不斷運行,需要大家的合作,而參與活動或是參與開源專案,都是可以讓台灣開源社群不斷運作。

對我而言是另外一個世界。因為之前對於程式相關社群認識停留在 AC 社群。假如有問題在學習平台詢問助教、Discord 詢問同學。沒有特別想到畢業後也可以有社群可以詢問技術與套件的問題。

目前有鎖定幾個想要瞭解與參與的開源社群,待工作確認未來發展的技能樹輪廓,再決定是不是可以先從翻譯文件開始?順便挑戰一下自己的英文能力,可以同步增加自己對於工具的認識,以及參與社群活動累積人脈。

Nijia 對於開源的熱情在於技術分享:

Nijia 下班後會固定安排讀書時間,參與開源專案或獨技術文件,非常值得效法,透過熟悉專案可以讓自己更熟悉工具的應用,在會後的 Q & A 剛好分進 Nijia 的組別,很幸運可以問問前輩究竟該如何開始第一個開源專案。Nijia 大大認為開始參與開源專案並不難,甚至可以從最小的 README 之類的文件開始。因此我想重點還是在於研究的耐心,畢竟要找到文件上的錯誤也是需要功力的。

Davy 對於開源的熱情在於喜歡那項技術:

Davy 分享參與開源專案最重要的是不要有壓力,而是帶著好玩、有趣的心態參與,不要因為參加而參加。我想這個 mindset 也很重要,因為只有在腦子放鬆的時候才會比較容易看到問題。

以上三位講者用不同角度帶我進如開源世界,我想可能沒辦法馬上有立即的產值,但每天一點一滴累積,不論是技術實力、或是參與社群活動都可以慢慢累積經驗。
另外,在工具的應用面向上,我也開始從單純使用工具,到用不同的角度去觀察、瞭解與研究工具,進而發現問題。這樣心態上的調整,也是我覺得很有收穫的地方。

期待我進入開源世界後的第二個分享文啦

#Hacktoberfest一起踏入開源的世界
參與更多相關活動立即加入【 Developers Hub 開發者學習社群 】👉 https://lihi2.cc/hvaBf

問題回顧(JavaScript)

Q: primitive type & object

最後一行程式碼的輸出結果是什麼?請解釋這個結果是怎麼來的?

1
2
3
4
var a = [ 1, 2, 3 ];
var b = a;
a.push(5);
console.log(b)

A

  1. 最後一行程式碼的輸出結果

[1, 2, 3, 5]

  1. 請解釋這個結果是怎麼來的?
    主要是基本型別(primitive type)和物件(object)保存資料方式不同(記憶體的儲存方式不同),

基本型別
保存資料的方式是:pass by value

1
2
3
let a = 'hi'
let b = a
a = 'Hello, World'

第一行程式碼,hi assign 給變數 a ,就像一個叫做 a 的盒子,裡面放 ‘hi’ 的值。
a 再 assign 給 b ,就像另外新增了 b 的盒子裡面裝著 a 的值。
當重新賦值給 a 時不會改變 b 盒子內的值。
物件
保存資料的方式是:pass by Reference

1
2
3
4
var a = [ 1, 2, 3 ];
var b = a;
a.push(5);
console.log(b)

當 a 把物件 assign 給 b ,指派的是參照位置(reference),也就是 [1, 2, 3] 在記憶體的位置。
a 與 b 目前指向是同一個地方。
因此當 a 改變,b 也會隨著改變。

Q: Scope & setTimeout

在以下程式碼中,console.log(i) 輸出結果是?請解釋這個輸出結果是怎麼來的。

1
2
3
4
5
for(var i = 0; i < 5; i++){
setTimeout(function(){
console.log(i);
},1000);
}

另外,如果想確保輸出結果如下圖,請問要如何修改程式?為什麼?

0
1
2
3
4

A

  1. console.log(i) 輸出結果是?
1
2
3
4
5
5
5
5
5
5

造成這個結果原因主要是:

var
非同步 setTimeout

變數看宣告的位置不同會有不同的作用範圍:全域、區域,而 var 不受限制。就算在區域中(block)中宣告,仍然會改變區塊外的變數,造成全域變數污染的狀況。
以題目來說非同步執行的特性,每一次的 setTimeout 都會將裡面的程式放進任務序列,要在 for 迴圈執行完畢後才執行 console.log(i),此時的 var 已經執行到 5 ,因此在執行 setTimeout 的 callback 時在 console 顯示的值是 5。

  1. 如果想確保輸出結果如下圖,請問要如何修改程式?為什麼?
    兩個方式,但比較建議使用第二種,將 var 改成 let
    第一種,將 setTimeout 拿掉,直接執行 for 迴圈印出 console 內容。
1
2
3
for(var i = 0; i < 5; i++){
console.log(i)
}

第二種,將宣告變數的 var ,改成 let ,以避免變數污染。

1
2
3
4
5
for(let i = 0; i < 5; i++){
setTimeout(function(){
console.log(i);
},1000);
}

Q

請問下方三行程式碼各自在做什麼?

function Person(){}
var person = Person()
var person = new Person()

A

function Person() { },宣告叫 Person 的 function
var person = Person(),宣告 person 的變數,將 Person() 執行後的結果指派給 person
var person = new Person(),宣告 person 的變數,將 new Person() 建立的物件實體指派給 person

Q: this

下列程式碼會在 console 輸出什麼?為什麼?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const myObject = {
foo: 'bar',
func: function () {
const self = this
console.log('outer func: this.foo = ', this.foo)
console.log('outer func: self.foo = ', self.foo);
(function () {
console.log('inner func: this.foo = ', this.foo)
console.log('inner func: self.foo = ', self.foo)
}())
}
}

myObject.func()

A

  1. 輸出結果
1
2
3
4
outer func: this.foo =  bar
outer func: self.foo = bar
inner func: this.foo = undefined
inner func: self.foo = bar
  1. 為什麼
    this 代表『誰呼叫這個函式』,
    而這個『誰』是怎麼來的?依照不同的綁定(binding)的方式,
    outer func: this.foo = bar
    依題目為隱式綁定(implicit binding),this 所指的是 myObject 的物件,因此可以看成 myObject.foo = bar
    outer func: self.foo = bar
    依題目, this 指派給 self 變數,因此 self 也指向 myObject ,可以看成myObject.foo = bar
    inner func: this.foo = undefined
    依題目為預設綁定,與前兩個情況不同的地方在於,this 都可以清楚的指到 myObject 物件,但依題目的情況, this 無法指到物件,因此 JavaScript 會直接綁定在 window 上成為全域物件。
    而 window 沒有 foo 的變數,因此出現 undefined
    inner func: self.foo = bar
    第二個 function 中沒有 self 的變數,就會往外找。
    在第一個 function 中找到 self 的變數,const self = this, this = myObject ,因此可以看成 myObject.foo = bar

問題回顧(HTML/CSS)

Q

要在 HTML 檔案中使用<script> 標籤載入 JavaScript 檔案時,一個常見的作法是「把 <script> 標籤放在 <body> 的最底部 (也就是 </body> 前)」。請問:

  1. 這樣做的話,在瀏覽器渲染流程中,會在什麼時機點載入到 JavaScript 程式碼?為什麼需要這樣做?
  2. 如果我們想要「在 DOM 生成的同時,一併載入 JavaScript」,針對 script 標籤還有什麼其他的處理作法?

A

  1. 瀏覽器渲染流程中,會在什麼時機點載入到 JavaScript 程式碼?
    JavaScript 無法直接操作 HTML 。
    瀏覽器渲染(render)畫面,會由上到下解析 HTML 轉成 JavaScript 可以操作的物件模型 DOM
    JavaScript 透過 DOM API 的方式完整操作 HTML 的內容
    <script> 放置在 <body> 最底部的主要原因是:確保 HTML DOM 已經完全被解析。
    若沒有放是在<body>最底部,當瀏覽器碰到 <script> 會暫停解析 DOM ,先下載與執行 <script> ,造成:
    等待下載 <script> 的時間,網頁繪製暫停,會造成頁面空白,影響使用者體驗
    DOM 沒有解析完成,卻已經執行 script 中需要操作的 HTML 元素

  2. 「在 DOM 生成的同時,一併載入 JavaScript」,針對 script 標籤還有什麼其他的處理作法?
    defer
    async
    與傳統 <script> 放置在 </body> 不同的的是:
    兩種做法都是在 HTML 解析成 DOM 的過程中進行下載,不會造成網頁繪製過程暫停
    defer 與 async 不同的是在多個 script 檔案的順序:

不論下載進度如何,defer 可以確保執行順序,例如

1
<script src="app1.js" defer></script>
1
<script src="app2.js" defer></script>

執行順序由上至下,app1.js > app2.js
async 則是依照下載速度,先下載完的 script 先執行。
使用情境上:defer 適用於 script 兼有相依性,async 則相反。

回顧 - 原來已經走了那麼遠了

road trip

雖然說結業,但我不敢說畢業了,因為總是有還不瞭解的技術、不熟悉的領域,更多需要學的技能。相信不論在哪個產業或領域,都會有一樣的焦慮。
謝謝一路上批改作業與提供指點的老師們,尤其是學期三 Sean 老師,讓我可以再回頭檢視自己的觀念是否正確,跟重新思考問題的本質。謝謝老師們:)

這篇文章主要會記錄為什麼選擇踏上不同的道路,在這條道路上學習到哪些事,以及下一步的規劃。

為什麼要轉換跑道

知道在行銷領域中的人才的迭代性很高,所以想成為不容易被取代的角色。為什麼不在原本的產業?當然也是一條路,留在原本的產業,在一定的基礎與經驗下,也是可以站穩腳步,繼續往下前進。但有些產業會受限工作地點,某些地方的工作機會比較多,這樣的區域限制成為我想要轉換跑道的主因。

為什麼選擇軟體工程師?

隔行如隔山,跨領域是個嘗試。嘗試的起心動念是因為待在媒體產業,看到新技術的推進,知道沒有一個厚實的技術底,很可能再十年,就不會有我的位置。所以程式設計成為我的技能目標。

這條路上所見所學

程式設計入門

  • JavaScript : 從程式語言的基礎開始,什麼是變數?資料型別?運算子?程式的控制流程?運算思維?
  • HTML : 架構網頁
  • CSS : 美化網頁外觀

網頁開發

  • AJAX 串接第三方 API
  • 使用 Node.js 製作完整產品
  • 資料設計與資料庫:使用 NoSQL 與 MongoDB
  • web app 操作原理,包括 HTTP、網域、RESTful API、MVC 設計核心概念。
  • git 版控

軟體工程師

  • 登入系統
  • JavaScript Promise 與 async/await
  • SQL 與資料庫設計
  • Express.js + MySQL 專案
  • 多人協作 (Tweets 專案)

結業了,然後呢?

雖然結業了,但刀沒有上油容易生鏽,理論學再多也是空談(什麼老派比喻),就直接實作吧, Get hands dirty!