Git Product home page Git Product logo

ironman2020's Introduction

ironman2020

鐵人賽2020

ironman2020's People

Contributors

mike1026915 avatar

Watchers

James Cloos avatar  avatar

ironman2020's Issues

Title

不前不後,不上不下,一個曾經交大資工書卷的軟體工程師成長之路

青澀歲月:為什麼我會唸資工系呢?

我國小開始接觸電腦
除了用電腦打電動以外 還滿喜歡怎麼用電腦的
那時候最喜歡的書是快快樂樂學Windows95 還有快快樂樂學Office
跟著書去操作就可以感覺到快樂滿足 那是個多麼單純美好的年代啊 (現在已經被污染了)
但也不算上是有在寫程式
要知道 用電腦 跟念資工是兩回事
頂多就是國中國小電腦課 會去寫寫烘培雞 套用一些神祕的特效等等

我覺得會開始想接觸寫程式或許還是因為想自己做遊戲吧
所以在升高中的暑假 就跟國中的電腦老師請教
那時候他就給我Visual Basic 6的書籍
我就開始第一次正式接觸寫程式
我到現在還是覺得VB6很直覺
對新手也可以個簡單的的小程式
拉一個button出來 按兩下 寫幾行就可以跑了
然後對每個元件都可以設定他的attributes
但不知道為什麼後來接觸Windows .NET C# 好像就沒有當年那種直覺 這是題外話了
所以升高中之後
我選擇參加了資訊社 雖然只是個幽靈社員 但還是從學長身上學了一點東西
也是真的有稍微寫了一點程式
所以那時心中就有點決定想念資工了
所以在選類組的時候
我選了二類電腦組
高二也有電腦課

記得高一上電腦課在做了一次烘培機(again!)
高一下老師教了VB6 我還算滿駕輕就熟的
那時候很多人還卡在=的概念呢

高二上學了C語言
不過跟大學學的比起來 真的學不會...
指標不懂 區域變數的概念沒有 全域變數滿天飛 呵呵
老師當時為什麼會選C呢Orz
另外那時候也種下的對遞迴懼怕的種子......
我記得我努力的想去理解河內塔
下課後也跟老師討論了很久
但是最後還是霧颯颯 Orz
所以大學學到遞迴的時候 我整個戰戰兢兢的

高二下則是用PHP 配上 MySQL來寫動態網頁
我到現在我還記得我當時寫了幫助背英文單字的網頁
算是很有成就感了

可惜 現實殘酷
假建中人如我
課業都應付不來了
實在無法像我同學一樣還可以鑽研其他東西
享受所謂的高中生活...
高中三年 還是整個都花在課業上就是Orz
(現在想想 真的挺可惜的 入寶山但空手而回......)

但是 我到現在印象還很深
我那時候會半夜補習班趕電腦課專題
然後 心想 以後要是能多點時間來研究這東西就好了
恩 現在回想 的確是成真了 但卻是另一場惡夢的開始 :p
這算是我為什麼選資工的主因吧

另一方面
我不想碰硬體任何有關電子電路之類的
也是拜高中所賜
那時候碰麵包板碰到崩潰
我就決定不念電子電機相關

我那時候也思考過唸化學相關科系
因為化學是我理工科中成績最好的
實驗課也很有趣 雖然我總是笨手笨腳實驗做不好就是Orz

所以刪到最後 二類組科系也沒剩下多少了
比較讓我猶豫的就是選資管或是資工了
但我現在真的是忘記當時是怎麼去比較這兩個的
就選了資工

總之 指考結束之後
我五科 - 化物數甲國英 - 共 387 分
填志願的時候
我就從必上的交大資工開始填(所以其他都填心安的)
在填了台清成政的資工資管與數學 最後填了化學系 在填了心理系(對 其實我對這領域也很有興趣)
最後當然就如果預期的去風城唸書啦

持續爆肝: 資工大三課程

正規語言概論
這門大概是純數學的課之中
跟機率並列兩門我最喜歡的數學課
Introduction to the Theory of Computation (2nd Edition), Michael Sipser, Thomson Course Technology
image

一開始又是複習集合等概念(後面不會再出現啦)
然後重點開始
開始定義 Finite state machine 以及他能計算的regular set & regular expression
接著帶出 FSM 不能算的東西
於是把FSM加上一個stack memory之後 發明了 pushdown automata
讓他可以計算的種類延伸到context-free grammar
然後又帶出了pushdown automata沒辦法算的東西
所以不用stack的memory
而是變成一個可以random access的memory之後
就產生的Turing machine
這也就是電腦的數學理論模型了
發明者Alan Turing也被稱為電腦科學之父
Turing在密碼學跟人工智慧貢獻也很大
可以去看看 模仿遊戲 這部電影喔

之後基於 Turing machine 之上
我們可以來探討怎樣的問題是不能解的(比如說電腦能不能自己寫出一個程式來)
或是計算的效率 P & NP 問題

我認為Turing machine產生的是 imperative programming 的程式設計模式
另一個跟Turing machine等價的數學模型是lamda calculation
這算是functional programming的理論吧
但後者我就不是很清楚了

雖然很理論
但是finite state machine的模型以及regular expression都是很強大的工具
context-free grammar也是很重要的

其實我覺得系上把這門課從必修拿掉有點可惜...

密碼學
戲稱ㄇㄇ學
算是數學課喔
D.R. Stinson, "Cryptography: theory and practice", 3rd Ed, CRC Press, 2005
image
從簡單的密碼分析 古典加密
HASH function(SHA)
兩大類加密法(encryption)

  1. 對稱式加密(或是 私鑰加密): DES AES
  2. 非對稱式加密(或是 公鑰加密): RSA

注意 hash跟encryption不一樣喔
hash是一個單向的function
output的結果是不可逆的
而且使用上相同的input是不會有collision的(雖然理論上會有)
但encryption是可逆的
只要有key output是可以轉回到input

所以hash function通常是用來產生辨別各個不同的物件的ID
而encryption function就是用來保護content
這講得很粗略就是

對稱跟非對稱主要就是差在你是一把還是兩把KEY
前者運算很快後者很慢
所以通常用後者來保護前者的KEY
非對稱加密也可以用在數位簽章上面
如果要加密就是
用公鑰來加密 接收者可以用它的私鑰解密
如果要做簽章驗證的話
就用私鑰來簽名 用公鑰來驗證

以上大概是最實用的部分XD

在來還介紹了
橢圓曲線密碼學
share secret (當大家想要確保沒有一個人可以獨享那份寶藏 所以把key分成多份給大家 一定要大家都到齊 才能解)
等等
其實這領域超大的
要踏入這領域的話 數學很重要喔

作業系統概論
Operating System Concepts, by Abraham Silberschatz, Greg Gagne, Peter Baer Galvin
這本書就著名的恐龍本
因為封面都是恐龍XD
image

OS就是在負責分配硬體資源
所以裡面很多的議題都是在講如何分配讓各種資源使用效益最大化
基本上是很理論的課(不過還是要看作業怎麼出就是)

那是鳩竟是那些資源要被分配呢?

  1. CPU
    多個process/thread怎麼去分配CPU的計算能力 (scheduling algorithm)
    也會讓你練習multi-process跟multi-thread的程式
    會提到concurrent programming所需要注意的事情
    像是race condition, synchronization, starvation, deadlock, lock等等議題
  2. Memory
    介紹memory management system, page, virtual memory (當記憶體不夠的時候)
  3. Hard disk
    介紹 storage and file system

不過曾聽一個大大說過
與其聽這些理論
不如直接去trace Linux source code
而我認識有trace過Linux source code的人
也都是大大沒錯
供大家參考大大們的學習方式

或是多去觀察各項參數等等

計算機組織概論
戲稱 祭祖
David A. Patterson and John L. Hennessy, Computer Organization & Design-- The Hardware/Software Interface, 4th edition, 2009
著名的白算盤書
基本上就是告訴你電腦怎麼運作的
image
image
電腦分成五個部分

  1. Input
    就像是鍵盤 滑鼠 麥克風的資訊輸入等等
  2. output
    就是你輸出的東西
  3. memory
    儲存資料跟instruction set的地方
  4. datapath
  5. control
    這兩個合在一起 就是所謂的CPU
    datapath負責運算執行指令的部分
    control就是控制資料流 指揮動作

再來就是跟你講怎麼設計解析指令集
然後就是要設計一個電路來解析指令集
共分成五個階段

  1. instruction fetch
  2. instruction decode
  3. execution
  4. memory access
  5. write back

可以一個指令佔據這五個階段
也可以採用pipeline的方式
當其他指令在某個階段的時候
其他指令就可以利用其他的階段
這就是pipeline的概念

雖然我後來不是做硬體設計的
但這概念也還是可以用在軟體設計上喔

作業基本上就是用verilog實作這樣的CPU出來
從single phase到pipleine這樣

但pipeline是我大學四年唯一沒有做出來的作業(倒地)

不過我是滿喜歡這門課的
整個理論架構的建立非常清楚
這本書真的寫得很好
即使不是走硬體的人也很直得去看看

編譯器設計概論
這門課也是很CS專門的課
我覺得也是一個滿重要的課
畢竟他是一個把理論工程化並且實作出來的一門課
到現在編譯器還是很重要的
C.N. Fischer, R.K. Cytron, and R.J. LeBlanc, Jr., Crafting a Compiler, Addison-Wesley, 2010.
我們用這本書
不是有名的屠龍書就是

image

基本上就是用 finite state machine
先去做lexical analysis分析出每個token
然後介紹各種parser的演算法來做 syntactic analysis
建立abstract syntax tree
之後就用這棵樹來產生object code
很可惜的是沒有講到optimzation的部分就是

我很喜歡這門課的專案
因為我們真的實作了一個compiler出來
給定一個小的語言
我們用lex做scanner
yacc做parser
最後我用這個產生出了assembler可以執行的 intel x86 assembly code
基本上就是整個compiler的過程
超有成就感的啦

人工智慧概論
Artificial Intelligence A Modern Approach (2nd Edition), Stuart Russell and Peter Norving, Second edition, Prentice Hall.
這本也是聖經本
涵蓋的範圍很完整
可以讓你很了解AI發展的脈絡
我覺得寫得還算不錯的一本課本
不過當時沒有好好的讀
有點可惜
後來論文有用到一部份
再回去看看 才發現真的是一本寶藏啊

image

第一部分可是希望電腦也能自己解決問題
基本上的概念就是暴力解去找出所有的可能
找到是答案的那一個
當然這樣很慢
所以有很多很多改進的方法
就誕生了許多新的演算法

當然一堆if也有它的極限
所以後來開始有了用邏輯推理的方式來建立的專家系統
有點像是你建立了一堆邏輯推論的句子到他的database去
今天碰到一個新的問題
他就可以利用邏輯推演來推理出答案
logical programming就是這樣來的

下一part講的是不確定情況的問題
這邊就會用到大量的機率模型了
馬可夫模型就是很有名的代表例子

當然現代的AI這領域的走向
隨著雲端計算能力儲存容量的演進
利用大量的資料分析 讓 機器學習 類神經網路 深度學習 已經成為這領域的顯學了
(滿滿的buzz word)

這門課就暫時沒提到
這後面都是各自一門課了

作業很有趣 也滿難的
用Python去做Pacman的演算法
http://ai.berkeley.edu/project_overview.html
有興趣可以去看看

計算機網路管理
Network Administration (NA)
就是教你網管相關的知識
也是系上的招牌操課
可以參考以下課綱
https://people.cs.nctu.edu.tw/~liuyh/course/netadm/content.php
會先教Perl來做script
然後複習基本的TCP/IP
然後就是
NAT, DHCP, FTP, Firewall, Mail system(Postfix), DNS, News, SNMP等各式各樣的應用服務
很操
但也是對架設系統的訓練就是

網路安全
William Stallings, Cryptography and Network Security, Principles and Practices, Prentice Hall, 2003
image
大概就是介紹TCP/IP各層的安全
印象中也包含一些邏輯上的推導去證明是安全的
不過雖然這門課是研究所課程
但其實講的都很基本就是了...

反正網路安全基本上記得三大點CIA

  1. C (Confidentiality) 保密性
    你傳輸的東西不能給不該看得人看到
    解法就是加密囉
    所以一大部分的問題就在怎樣交換key這個議題
  2. I(Integrity) 完整性
    你傳輸的東西 不能被竄改
    解法利用hash function產生特徵值 讓接收者去比對
  3. A(Availability) 可用性
    就是你的服務是要是可用的 而不會連不上
    像是DDOS可能就會癱瘓你的服務了
    防禦方法大概就是防火牆吧

RFID資訊系統
image
這也是研究所的課
介紹RFID這技術到相關的protocol
到相關的應用以及商務系統等

遍佈式計算
Pervasive Computing
這是一種很大很廣概念
就是任何東西都可以運算
所以像是冰箱 電視 眼鏡等等等
那時候智慧型手機還沒出來
手機出來之後 手機跟平板就變成一個很重要的終端設備就是
也可以說這是現在智慧家庭 智慧城市 IOT的前身吧XD
這領域包含得很廣
前面 跟user互動的介面設計 偵測收集資訊的sensor等嵌入式系統
中間的通訊系統 行動網路
一直到後面處理大量資料的server/middleware 雲端運算
都是探討的課題之一
反正累積了滿滿的buzz words
就變成滿滿做project的好題材
這門課最後就變成有點像創業競賽提案就是

微算機系統實驗
坦討8051的軟硬體
但我真的不記得在做什麼了.......
天阿

我到底在幹嘛 : 資工大四課程

統計學
Montgomery, D. C., Runger, G. C., and Hubele, N. F., Engineering Statistics. Wiley.

  1. Illustrative Examples
  2. Data Presentation
  3. Basic Probability
  4. Decision Making for One Sample
  5. Decision Making for Two or More Samples
  6. Introduction to Linear Regression
  7. Introduction to Experimental Design
  8. Introduction to Statistical Quality Control

這是選修就是
但我也是覺得滿重要的
大概前1/3還是在複習機率
到第四張才開始進入統計
講了像是假設檢定 信賴區間 線性回歸法等等

那統計跟機率差在哪邊呢?
印象中
機率是在知道probability distribution的情況下去研究各種情狀的機率
而統計則是在一堆資料之中去建立probability distribution

網路程式設計
交大資工的招牌課
基本上可以說是 UNIX 上的 TCP/IP programming
image
會介紹FD的概念
IPC的各種方法(pipe, named pipe, shared memory, signal, socket等等)
然後介紹socket programming的各種pattern
還有怎樣實做HTTP CGI等
以及一些網路的服務怎麼實做
到最後的RPC

老師講課非常清楚
作業也十分紮實
實做一個shell出來但最後變成一個apache server
成就感很高
也會讓對unix系統 網路協定有更進一步的了解

無線網路概論
image
Introduction to wireless and mobile systems by Dharma Prakash Agrawal and Qing-An Zeng
這邊的無線網路包含了行動網路跟wireless LAN等
從講了一些無線通訊實體層開始
展頻(Spread Spectrum):把原本的資料轉成資料量比較大的資料(FHSS, DSSS)
調變(modulation): 把資料放到載波(carrier)去傳送(AM, FM)
FDM/TDM/CDM/OFDM等 都是 multiplexing的技術 把當一的carrier的通道變成多條去傳(但對外面來說來是只有一條)
這邊是指在調變的過程

channel建立好之後
開始到第二層的link layer
怎麼讓要傳輸的多個裝置 共用channel
有conflict free的
FDMA/TDMA(GSM)/CDMA(2.5G, 3G) 則是讓多個傳送者去分配同一條channel的方法

也有contention-based的
ALOHA, SLOTTED, CSMA-CA for Wifi (Ethernet是CSMA-CS)

然後會介紹一下cellular network/行動網路的系統的概念已經各種問題(hand-off, roaming等等)
以及802.11系列的WIFI protocol
大概是這樣吧

大致上網路議題的研究
其實都是在如何分配有限的資源達到更好的throughput
我的心得啦

資料探勘
Introduction to Data Mining, Pang-Ning Tan, Michael Steinbach and Vipin Kumar
image
就是從一堆資料裡面去mining出有意義的知識(knowledge)出來
其實跟機器學習很像
也是分成Classification跟clustering的問題
但我的認知上細微的差別是
data mining比較從演算法的方式去下手
而 machine learning 比較從機率統計模型的方式下手
但也不是那麼絕對就是

兩領域還是很多重疊的部份的

網路安全實務-攻擊與防禦
image
介紹網路攻擊與防範的手法
但我現在只記得TCP SYN flood了...

個人通訊
Wireless and Mobile All-IP Networks
一些3G網路的架構吧
但除了老師上課講故事之外
記不住什麼.....

平行環境與程式設計
一開始講了一些概念之後
之後練習寫了map/reduce
還有CUDA的程式

軟體工程概論
Software Engineering, 9th edition, Ian Sommerville

我只能說 這種東西還是到業界學吧

雲端運算
這門典型的BUZZ WORD課程... 真的不提了


寫完這整理
才覺得我大四的課
都是滿......的
一方面也都太專門
而後面沒用到的話
其實也就會忘了

奉勸學弟妹
選課的時候
還是選些基本的課程吧
像我對我沒有修圖學 影像那方面的課程
感到有點遺憾就是

我希望別人怎麼對待我,我就怎麼對待別人:積功德

我希望別人怎麼對待我,我就怎麼對待別人

這是我自己在當mentor的時候的準則
講起來很簡單
但做起來其實還是有點難
尤其當你本身的業務就忙不過來的時候

但我覺得可以做到幾點

1. 給他所有的big picture
我覺得第一部最重要的是把所有big picture講一遍

從使用者觀點 從系統觀點 從架構觀點 從程式碼觀點都要
除了這產品層面
一開始包含公司高層方針 組織的組成與職責 有哪些routine的事情 哪些會議
開發流程 flow等
基本上我知道的我都會講
最後閒聊的話 我還會講一點公司福利就是XD
即使我知道也些有部分已經不是我的範疇了
至少我希望營造一個我是願意分享
你有問題我也都願意回答的印象
希望新人不要害怕
不用一次講完 也不用指望他可以馬上吸收 也不要給他壓力逼迫他要馬上吸收就是XD
但至少可以先讓他知道 “喔 有這些東西 有這些技術”
然後再讓他邊玩邊體驗邊摸索邊消化
坦白說
這對你自己也很有幫助就是
若你自己沒有對整個系統整個產品整個公司甚至是生活有一定熟悉度的話

2. Schedule and checklist
正因為有很多東西要講
所以為這些東西準備個schedule and checklist
一方面能給新人有個方向有安心感
也會讓人感覺這公司是有在考慮怎麼帶新人的
而不是放置新人不管

3. 準備些學習資源
如果是新鮮人的話
可以問他會那些技能
告訴他還缺哪些技能
給他些方向或是公司獨有的學習資源去讀(大公司的話)
尤其有些事情是學校不會教的(像是軟體開發流程 畢竟牽涉到團隊有自己獨特性就是)

4. 準備些小型task
一開始有幾個方向的task很適合給新人
a. 產品測試
新人畢竟一開始是局外人
所以對產品沒有我們這些老人的既定印象了
所以有時候可以給出不一樣的建議與想法出來
b. 文件更新
可以請他們做一份新手上手的文件
記錄他們的學習過程
或是安裝環境碰到的問題
這對團隊永續經營很重要
c. bug/小feature/unit test
上手之後
可以開始給這類的小任務
讓他有個方向開始去trace code

再來就是正式給他們任務
帶他們走過一遍軟體開發流程之後
大概就沒問題了吧

這中間身為mentor還有一個很重要的任務就是
判斷這新人適不適任
畢竟面試不一定準
有這三個月的適用期就是要讓不合的早點分手
對雙方都是好事
但就要再多檢討
如何再多幫幫下一個新進來的人

不管怎樣
記得適時的關心也很重要就是
特別尤其是新鮮人的話
還有就是通常大家都不一定會準時走(不一定是加班)
所以這時候新人通常不敢下班
第一天就勇敢趕新人下班吧

BTW
對新人而言
如果進公司第一天
前輩教的都是些偷雞摸狗的方法
那就是個警訊了
(我覺得比什麼都不教還可怕就是...)

總之
把好的文化傳下去 不好的文化去改善
說穿了
只是同理心而已

面對現實:找工作 Part 2 問題大集合

以下摘自我以前的紀錄
所以是十年前的面試經驗
以及我被問過的問題吧
基本上 只有兩類問題

  1. 技術問題
  2. 非技術問題
    (我知道是廢話XDDDDD)

一定要準備的

  1. 自我介紹(甚至包含英文的)
    通常開始都會請你自我介紹
    所以這部分一定要準備
    有好的開始 穩定軍心 才是成功的一半

  2. 對這公司的疑問
    這也一定要準備的
    展現你想進這公司的決心以及如何問問題的技巧...

技術問題

C語言

  1. pointer(int*), double pointer(int**)
  2. Call by value, call by reference
  3. extern, static, volatile variable
  4. 指標與陣列的差別
    5 #define

C++

  1. virtual function, pure virtual function
  2. public protected private
  3. const int* <=> int* const p
  4. struct

Java

  1. 繼承 與 多型
  2. multi-thread output

資料結構與演算法

  1. 字串比較
  2. Search in binary search tree
  3. Array vs List
  4. Radix sort
  5. BFS & DFS and their related data structures
  6. Reverse linked list
  7. Merge sort
  8. 字串長度計算
  9. 時間複雜度
  10. Hash table
  11. Heap
  12. string copy
  13. string to int, int to string
  14. 印聖誕樹啦

雜項

  1. IPC的各種方法
  2. 什麼是virtual machine
  3. Pipeline的精神是什麼
  4. packet switch & circuit switch
  5. 什麼是QoS
  6. 何謂RAID
  7. 實作singleton
  8. process and thread
  9. 什麼是deadlock
  10. 什麼是inner join, outer join
  11. 為什麼要做index
    12 Regular expression
  12. Protocol to TCP/IP layer
  13. Common Unix command
  14. 解釋 process的 stack & heap
  15. mutex and semaphore
  16. 什麼是 sql injection
  17. 什麼是XSS attack
  18. 你在網址列打下www.google.com到看到網頁 中間經歷過哪些事

非技術問題

  1. 你怎麼挑選公司的
  2. 為什麼要選我們公司
  3. 你做過的最大的專案
  4. 你如何驗證你寫的程式是對的
  5. 你覺得你的專業能帶給公司什麼
  6. 你的優點是什麼
  7. 你的缺點是什麼
  8. 工作上碰到難以相處的同事上司該怎麼辦?
  9. 能形容你的三個詞彙
  10. 你平常休閒時候會做什麼呢
  11. 你上次看到跟資訊相關的新技術是什麼?你覺得他有什麼用?為什麼你會關注他
  12. 你如何看待別人對你的批評
  13. 你如何看到自己的失敗
  14. 你希望有怎樣的上司?你自己想成為怎樣的上司
  15. 跟同事意見不同的時候 你會怎麼辦
  16. 你為什麼離職
  17. 你覺得你想要怎樣的工作環境
  18. 你覺得你三/五年後想做什麼?會是什麼?
  19. 介紹一個你做過的專案 怎麼開始 怎麼設計 怎麼分工 你扮演怎樣的角色 碰到什麼問題 可能的效能瓶頸有哪些
  20. 跟人合作的經驗
  21. 你是個有創意的人嗎

英文
我那時候面試滿多公司(尤其在竹科)都需要上機考英文的
包含了英文聽力跟閱讀
難度大概就跟TOEIC差不多
不知道現在是不是也一樣

我的未來不是夢...嗎:往前看

前幾天看到一個討論串有網友留言說

台灣資訊圈現在有個風氣
刷題-> 進 FANNG(還要國外的喔) -> happy ending

這不就是科舉制度 八股考試取才嗎
我身邊也不乏這種人
連帶腦波弱的我 也開始有這種思維
對 我的確也把目標放在四大上
即使沒想過離開台灣的我
也覺得好像要出國才是人生勝利組...
就好像 高中時大家那種都非台大不念的
上台大才是光宗耀祖 現在這圈子變成上Google就是光宗耀祖
但我也知道上了之後不代表什麼啊...(我現在能力也還不夠) 那也絕對不是我最後一份工作
與其花力氣再刷題 不是應該去精進我其他工作上會用到的技能嗎
所以 我到底想要什麼呢?


現在的工作很開心 有施展空間 同事長官也都很好
可說是 天時 地利 人合
不會有一份工作是都沒有痛苦之處的
所以平常也還是有很多頭痛狗屁的問題
但大致上來說 我過得很開心
比以前還開心 各種層面上

但還是覺得心理有關卡過不去
好像有個結卡在那邊
讓我總是悶悶的
放假的時候 如果不做點什麼有助於工作成長的事
就很焦慮 然後開始空轉
沒辦法好好休息
尤其是有那種想去四大證明自己的能力的慾望
慾望是基本的驅動力
但該做的事情如果不是興趣
那只是徒增痛苦
年紀大了 才知道
開心是最重要的
這樣做的事情才會持久
但這樣的人生好矛盾啊

有個前輩跟我說過
心中一直出現的聲音就是我想要的東西 不管背後的動機
所以我真的想要去那些從面試過程就讓我不喜歡的公司嗎?
我的目的到底是什麼?
只是想發文炫耀? 想受人注目? 想證明自己? 想讓履歷好看? 不想被人看扁?
這些的確都是我的動機 但真的會讓我開心嗎?

我知道不太會永遠待在目前位置
這時代有什麼工作是可以永遠的呢?
一定都會換工作的
只是有時候
的確是還滿看機緣跟當下一股衝勁的
有一個前輩說過
考慮下一份工作的時候 可以從你下下份工作想做什麼來思考
雖然的確是可以幫助你去想想下一步
不過這問題就跟三年後想做什麼一樣困難XDDD
我到底要怎麼知道我下下份想做什麼XD

我有時候覺得我這個結
是來自於我對金錢的不安
尤其當你身邊都是高薪工程師的時候
其實除了不安 更多的是 自我責備
覺得自己就是大廢物啊 怎麼落到這地步
那這樣我是不是要考慮建立所謂的被動收入呢?
被動與多元的收入是不是才能減輕我的不安呢?
我又是能不能當一輩子的工程師呢?
大家都說35歲是個大限
的確我身邊35歲以上的工程師也不多
但眼看我也快到這門檻了
我怎麼能不焦慮
除了焦慮 還是焦慮
我如果不做工程師的話還能做什麼?
大家都在寫blogger拍Youtube錄podcast錄線上課程賺錢
但我就真的沒有興趣怎麼辦?

回到職涯上
我想往manager的道路上走
想去幫忙後輩成長
帶領一個團隊同心協力完成事情?
但我又該怎麼做呢?
又一個前輩跟我說過
時間到了 機會就會來的 有時候可能也來不及準備
但到底什麼時候機會會來?
我又該怎麼準備呢?

其實我對未來都沒有答案
也因為如此
求神問卜的職業才會永遠存在
也很感謝一路上很多前輩總是給我很多建議與指引
所以我也希望我能成為別人口中的這樣的好前輩
不知道能不能在這邊認識更多前輩分享更多建議呢?

我也還在試著去處理我心中的結
或許不是解他 而是跟它和平共處
讓自己不要再為他困擾而空轉

期望有天我能找到一個屬於我的答案
到時候一定再來分享
Someday or One Day

這是鐵人賽最後一天了
沒想到我也能撐完三十天的嘴砲
謝謝一路以來支持的朋友

預告一下
我還會有一篇喔 只是不知道啥時寫
會是我認為最最最重要的觀念
如果我也能聽聽錄音帶回到過去
我會想告訴當時的自己這件事

是什麼呢?
我們下次見

小菜鳥第一課:軟體開發流程

進到公司
第一課就是學軟體開發流程

Agile

基本上現在應該都是跑Agile(敏捷)開發吧?
但我覺得要談敏捷開發以前
要先來談談瀑布式開發(waterfall model)
我沒有在工作上真的經歷過waterfall
所以我只能講我的認知

根據維基百科
Waterfall 就是把軟體開發分成以下幾個步驟

  1. 需求定義(Requirements)
  2. 設計(Design)
  3. 實作(Implementation)
  4. 整合與測試(Verification)
  5. 移交與維護(Maintenance)
    每個步驟都要好好的規劃且完成之後才能到下個階段
    所以最大的詬病就是當你一個產品完成之後
    早就不符合市場的需求了

於是乎
就誕生了 敏捷式開發
最常聽到的敏捷方法應該就是 Scrum
可能還有Extreme Programing (縮寫是XP)

什麼是敏捷

我想以我的個人經驗與理解來介紹敏捷 (或者說是 Scrum, 以下兩者會混用)
而不是從什麼高大上的角度來介紹有怎樣的會議 怎樣的角色
上了許多堂Scrum的課之後
我覺得如果太執著於到底什麼是Scrum的話
就會變成流於形式的四不像
以至於有scrum就是在開會的這種怨聲載道

如前所述
因為waterfall的流程太冗了
沒辦法即時反映市場需求
那還不簡單 就不要那麼長的開發時間啊(
所以有這個詞 迭代開發(Iterative development)
不是像瀑布那樣一次流到終點不回頭
而是分很多次的小回圈來進行(稱作一個sprint)
所以每個回合可以動態的去調整這個sprint要做的task
其實我覺得這才是核心概念 其他都是因應這個出來的招數與概念(基本教義派不要打我)

Q:那這樣是不用規劃的意思嗎?不用寫文件的意思嗎
A:都不對,
對backlog裡面的每個Task你還是要規劃怎麼實作 怎麼測試
不是說就不用規劃的去蠻幹
當然前置規劃與後續維護的文件也都要
測試要寫 要做
反正工程師的自尊是自己要維護的
迭代開發不是標準工程規範偷懶的藉口

對requirement的也是由PO去規劃以因應市場的變化
backlog也是會變動
而且理想上 客戶要進來參與就是

而且理論上每個sprint的產生必須都是deliverable的
不是給個半成品 為了達到這件事
為了幫助順利每個sprint的release
所以有了CI/CD, pari programming, TDD/BDD, Kanban, code review等等這些工程上的方法論來幫助順利開發

Q:那跟隕石開發法有什麼不同?
A:靠北工程師最愛抱怨的內容
原則上在sprint內決定好的task是不能變的
所以你隕石要砸下來 你也要給我等到這sprint結束
我下個sprint在排進去
當然一定有例外 比如說客戶的緊急issue, production server突然爆炸之類的 (這是很直得另外探討的議題)
不過 我是不覺得我有被隕石砸過就是(上述狀況例外)
不知道有沒有大大分享被隕石砸的經驗

Q:ScrumMaster在幹嘛?
A:ScrumMaster 就是要負責讓這個scrum順利進行而存在的角色 站在第三方的角度去看流程的問題在哪
我認為 ScrumMaster 的目標就是要讓自己消失
讓團隊自己即使沒有 ScrumMaster 也可以自己去發現問題之後在自己解決問題

Q:但我們團隊開發還是一團亂
A:我覺得那不是什麼開發流程的問題了......
一個成功團隊的要點應該是要能檢討出問題並改進就是
所以要有retrospective meeting 但meeting不是重點
而是整個團隊願不願去面對問題並改善問題
這是文化問題 而文化有時候不是一蹴可幾的就是....

其實我說不完
這牽涉的範圍太大 甚至包含團隊的組成(也就是招募)與管理了

但我始終相信
方法論是死的,團隊與人是活的
方法論是死的,團隊與人是活的
方法論是死的,團隊與人是活的
有時候不是方法論與技術的問題就是
有辦法能解決問題就是我們的價值
共勉之

面對現實:找工作 Part 3 人蔘啊...

對 還有part 3
找工作真的是博大精深阿

這次要來講我出社會之後
準備換工作的心路歷程


先講講動機
最主要的動機是現實阿堵物的考量
很哀傷的一個現實就是
通常跳槽的成長幅度通常還是比原本條新的幅度快很多...
隨著這個過程中
我開始意識到我的技能好像很不合市場
如前所述
我做的一個核心module
總是我在我這領域我很專精
我有我的domain knowledge
但是市場上沒有人需要這經驗
我的在系統程式的開發經驗也很不合市場上最常見的網頁前後端或是mobile工程師
而在我解 Leetcode 的能力也不夠強的情況下
知名外商第一關就被刷了
其實能拿到的面試機會不多(或是說我想去的公司不要我)
意識到這點的我十分的焦慮
我意識到要改變 但我不知道怎麼做...
最後應該算是順著命運去做吧
大致上有這三點方向
如果你覺得你的職涯也卡住的話

人際連結

要有機會 首先就是去增加被看到機會
雖然對稍微有點社交障礙的我有點困難
但還是多去參加點社群的活動
看看點科技展
參加conference
多認識點新朋友(記住是雙向的)
也聯絡一下老朋友
就算沒認識人 也可以多認識些不同的公司 了解市場有什麼樣的公司 什麼樣的缺

當然能參加conference talk
參加open source project的話
經營個blog youtube等等去累積名氣
都不錯
這三點我也是我現在想去嘗試的
懇求有沒有大大可以帶一起飛呢QQ

內部機會

最快的方法就是去找找目前的公司有沒有你想做的其他位置
有沒有機會可以讓你去做其他想做的事
累積你要的經驗往你的想要有的方向去做
所以我那時候就從QA轉developer
或者即使在同個位置
也可以去跟老闆談談想想如何爭取多點表現
或是善用現有資源去幫助累積你想在的經驗

外部機會

我那時候也開始接觸Head Hunter
應該說 不排斥任何機會就是
但那時候還不知道怎麼選Head hunter就是
中間發生了些風風雨雨
我建議
如果真要找HH
找那些願意花時間約妳出來 並且會去嘗試了解你的過往以及你的問題的HH
而不是只是打打電話的就是
用心程度是可以感受的

如果有HR直接聯絡的話
當然也不要拒絕機會
保持好關係也是很重要的

最好的管道
還是朋友推薦的位置就是
這只能看你的人脈有多廣了
人脈真的很重要
不要忽略任何一個連結
廣結善緣啊......


最後講講心態
總之就是想辦法突破舒適圈
去看看外面的機會也好
去擴展自己的職務範圍也好
多認識朋友 多參加活動也好

說是這樣說
但真的很難
尤其當內部的推力不大的時候
自己又是重感情的人
不然是對我做的產品或是對我的夥伴們
所以那時候讓我跳出去的最大動力
是一個朋友轉介過來的缺 給了很高的offer
在經濟壓力下
我就還是跳槽了
雖然後來這位置不是一個適合我的位置
所以我又開始積極的找下一個位置
但要不是當初離開了舒適圈
也不會找到現在我覺得一個更棒的機會就是

所以學著跳出舒適圈
碰到困難記得求助
廣結善緣
不敢說一定有用
但總比坐在那邊空轉來的好就是


有個問題讓我印象挺深的
某個CTO曾經問我:「你希望能成為一個單打獨鬥的人嗎」
我那時後回答說:「我希望能有單打獨鬥的能力,但有這能力之後能去帶著團隊一起做事並帶後輩一起成長」
我滿喜歡我的回答,也是我真心所想的
但我最後沒拿到Offer ,也不知道跟這回答有沒有關係就是

然後真的找工作直覺很重要
一旦感覺不太對 那應該就是真的不適合你
總之 因緣際會之下 認識的朋友的公司有再找人
也不在意我沒有相關經驗而願意去看我底子
就轉職成了個Full stack engineer

黑暗的渾沌:Backend 後端

後端的話 其實就是排除掉前面畫面以外的東西
現在跟前端分開的話
通常就是提供API介面來新增修改新增讀取更新刪除資料,CRUD(Create, Read, Update, Delete)
通常都是透過HTTP走REST的方式
如果需要主動push的話 可能就要透過Web Socket了
所以最大的挑戰就是要如何有效率的去處理大量的request
事情往往不是單純的CRUD而已
資料通常還是要運算的 也就是你的business logic
所以運算的performance非常重要
如何有效率的implement core business logic就是日常的工作了
除了演算法與資料結構以外
取資料的時候對DB的讀取 如果有效率的下SQL
也是關鍵之一
在從大一點角度來看就是如何設計Salable的Service並且動態的分配並運用資源
這有時候會牽涉到DevOps就是

最常見的後端語言通常是兩大陣營
Java (Java EE) 或是 .NET (C#) 居多
這兩者也各自形成很強大的生態系就是
近幾年Go的缺也開始變多的感覺 但還不確定到底如何
通常為了加速的話
關鍵的部分也都還會用C/C++來做就是
最近Rust也有紅起來的趨勢 但我很不熟就是
PHP也是另一大宗

還有兩種需求也算常見
一個就是Python 另一個則是 Node.JS (JavaScript)(或是最近很新的Deno不知道有沒有開始用了)
都有各自的framework
Python最有名的就是Django了吧
想要輕量點的話也有像是Flask這種超輕量
或是Twisted這種event loop的架構

而提到event loop更是要提到NodeJS啦
讓NodeJS其實也滿適合非CPU intensive的task就是
配上Express.js這種也很輕量的框架
也是滿容易就可以寫出簡單的後端API了

通常都拿來快速建prototype
但其實應付一般的流量我覺得也夠了就是
關鍵的部分都可以額外用C/C++來加速
也很容易整合

實作上 memory, disk, network的資源分配議題也都是要考慮的(畢竟server資源有限)
SQL又是一個很多眉眉角角的領域
還有NoSQL要來湊一腳
以及像是message queue等等
還有如何幫助debug的log訊息等等

效能之外
關於RESTful API的設計 如何善用HTTP Method, API的命名
設計出語意可讀可用性又高的API也都是很大的議題呢

當然對背後的infra以及deployment也需要了解就是
這時候就要跟DevOps合作了

不分不分:Full Stack Engineer 全端工程師

鐵人賽標題中的不上不下
我想我一路過來的文章應該都感覺得出來(應該吧?)
不前不後 就是我現在的工作啦 不是前端也不是後端

我現在是 Full Stack Engineer
前端採用React/Redux 後端採用Node.js/Expres.js MySQL/PostgreSQL/Redis等
跟同事分工合作開發 會在前後端兩者輪流作
這sprint作前端 下sprint作後端等等
也會跟 PM 與 UI/UX designer 合作開發好用有用的新功能
跟 QA 合作確保產品的品質
跟 DevOps 合作負責 deployment and monitor

我一直覺得full-stack是一個合理的發展方向
前端只是在JS開始蓬勃發展 SPA出來之後才慢慢開始出現的
畢竟一個產品本來就不是單一個面相能完成的
一個好的軟體工程師要解決問題
本來就不應該分哪一端
但我們在看問題的時候 應該有更大的picture去想
今天這個問題從UI下手好解好用 那就去改前端
或是應該從後端下手才有效率需要簡單的deploy 那就從後端去解
不用侷限自己
當然最後可能都還是需要專精在某一塊
但是我覺得一開始廣泛的學習和經驗的累積都是很重要的
從設計到前端到後端到部屬等等
會對整個web開發有更全面的了解
慢慢感覺在兩方面進步
進而有更全面的思維
某種時候也是一種調劑身心的感覺
畢竟寫前後端的心得與感覺是完全不同的XD
這我後面再提

參考 良葛格老師 這篇 全端開發者神話
以及內文所提到的What is a Full Stack developer?
我覺得如我前面所述 心態上的Full Stack 是很重要的
是不是能從UI/UX, network/OS/platform, data model and DB, Business Logic, Frontend & API 甚至是整個更大的商業需求思考
進而應用工程上的discipline去實現一套完整的solution才是一個general software engineer的價值
不然就只是跟著新技術學技術學好玩的而已

但有時候我跟別人說到我是個 Full Stack Engineer 全端工程師
有些人總是會帶著一抹拍拍的微笑說聲辛苦了
我是不太能理解就是
也可能是我看過的公司太少
但覺得就像上面文章良老師所說
如果某間公司的心態只是想要壓榨人力的話
那什麼位置都一樣的

有讀者也是全端工程師嗎?
歡迎交流交流心得喔~ :)

研究生禮貌**:資工碩二課程

隨機程序
我最後修的一堂課
還是回歸到基本的數學
Henry Stark and John W. Woods, Probability and Random Processes with Applications to Signal Processing (3rd Edition),
image
random process 就是從一個random variable演算到一推 random variable(a family of random variables by wiki)
不過一開始還是又再從基本的機率與統計開始複習就是了
當然 現實中的問題絕對都不可能只有一個變數
所以這們數學的應用當然很廣

但細節還是忘了
只能說趁畢業前培養點基本的數學能力吧

機器學習
碩二下要專心在論文上
所以只有去旁聽這門感覺未來會很紅的課(事實證明也是)
課本是這本聖經本
Pattern Recognition and Machine Learning
by Christopher M. Bishop, Springer, 2007.

老師講得很仔細
包含一些數學基礎
然後會去推導各個演算法的原理
包含了線性回歸
Kernel method
SVM(Support vector machine)
Neural network等
雖然我現在只記得SVM而已
不過當時的確收穫挺多的


做論文心得
前陣子論文的主題超夯
論文真的很難生耶
你要先從你做的專案或是有興趣的東西開始先找出問題來
然後再去蒐集大量資料論文看有沒有相關的研究
從前人的研究慢慢去調整問題
最後才能變到正確的問題(或者是說教授認可的問題XD)
問到問題之後
怎麼去model這問題(畢竟還是學術論文)
又是一大堆的資料要survey
然後再來驗證你的solution對不對
當然這兩步驟會一直循環
甚至最後搞不好要回到定義問題的步驟也說不定Orz

但我覺得跟實際工作很不一樣的地方是
這過程是孤獨一個人面對
不像工作"通常"是一個團隊去解決一個問題
這也是我最大的感觸
(但我相信這不是絕對如此 只是我的個人的經驗而已)

Anyway, 我覺得我的碩士學習歷程不是個好的體驗就是...

決策理論
我那時候套的理論就是決策理論的模型配上機率論
我找了很久
但最後其實發現AI課本上其實有提過了阿阿阿
image

簡單的說
就是對每個結果給個偏好的函數(稱之為效用utility)
然後當然每個結果也有它發生的機率
而演算法的結果就是要去求他的最大期望效用(Maximum expected utility)
概念上很簡單
要怎麼用上去就到是個很麻煩的問題
每一句話都是花很多心思弄出來的
字字血淚阿 嗚嗚嗚

強大的後盾:DevOps 與 成長不設限

DevOps也是近年來出現的詞彙
Development 跟 Operation 的結合
我個人認為是要強調後續上線營運跟開發的結合的一種概念
所以有些人強調這只是個概念 而不是個職缺
我個人的看法還是在C/CD等上面打轉
甚至是之後的服務的stability, maintenance and performance
也有人稱之為SRE(Site Reliability Engineering)
(一種說法SRE才是正確的職缺名稱)

但至少在我現在的看到的DevOps是就是負責deploy, release, monitor and auto scale
所以個人覺得程式能力要有 對雲端的平台的知識也需要 還有對整體系統的了解
如何分辨出系統的bottleneck的分析能力
除了developer概念要跨過去到operation operation也要跨過去到develop
所以除了將這一切的自動化
也包含所謂的infrastructure as a code 引入版控等等軟體開發軟體工程的基本概念融合進去

要讓developer擁有Operation的概念 反之亦同(甚至包含測試)
這就是DevOps的精神

其實都有點玄了(小聲

其實我覺得就跟full stack一樣
知識學的越廣 了解的越多
才能有更多的想法去解決問題並創造新的系統
所以身為一個software engineer不應該侷限自己
不只要前後端都了解
上線之後的production operation也要了解
為了軟體品質也要去了解QA的角色以及方法論
甚至在往前去了解客戶需求 去面對客戶問題 進而設計出好的UI/UX
我個人覺得T型人才是很基本的要求的
除了作好自己的角色該作的之外
每個人不設限的去了解軟體開發各個面相
了解他人的工作內容方向
對彼此的包容了解
才能發揮軟體開發團隊的最大效用!
(套個專有名詞 也就是要 減少組織之間的穀倉效應((Silo Effect))

至於現在常提的 π 型人才
我自己會覺得另一長項則是要配上軟實力就是
也就是溝通協調領導的能力
配上上面那一頂融合好的大知識帽
才會讓你的能力更妥善的發輝出來

這也是我想走的方向

共勉之

資工總論:到底資工系在學什麼?

這邊會講一個我自己對這個系的心得
資工是資訊工程的簡稱 英文去對照國外的話 通常會是對應到 Computer Science or Computer Engineering
(這直接去翻譯感覺會是information engineering
但根據維基百科的定義 是不太一樣的東西)
所以資工的課程有科學的部分也有工程的部分
科學的部分像是定義何謂計算,怎樣計算比較快 什麼問題是算不出來的等等
工程的部分像是如何建構大型的電腦系統 軟體系統等等
前者算是數學延伸出來的後者部分算是電機那方面延伸出來的
所以我覺得其實資工系有點像是理工科的文學院
每個科系都需要用語言來解決他們的問題
但只有語言相關學系會去研究語言本身 (=> 我只是個理工宅宅 有錯請指教)
你不一定要唸文學才寫得出偉大的文學作品
同理 你也不一定要唸資工系才寫得出偉大的程式就是...
(所以這領域一直被跨進來 嗚嗚嗚

在理工科裡面 其實每個科系都會利用電腦去幫忙解決他們各自的領域
對他們來說 就跟語言一樣 是個工具
而資工系
就是來研究電腦這個工具本身的運作原理以及如何利用電腦來解決問題
在經過一年的計概訓練 學到Imperative programming和 object programming 這些之後 (或許可以算是兩種文體,當然還有很多種文體)
再來就是資料結構,學習如何去有效率的使用安排數位的資料(就像是教你怎麼安排你的文章結構 起承轉合之類的)
接著 更重要的是 演算法,教你如何去思考解決各種演算問題的基本方法(或許可以類比說怎麼培養靈感吧)
這幾個科目 就包含了基本寫作的能力 只是打底

硬體的話 包含了基本的電子學教你兜出一個And gate之後
數位電路再去組合成更複雜的元件
最後計算機組織組合成一顆CPU 配合其他元件等等
(我對這塊很不熟 容我之後細項再說)

有硬體之後
就要有個作業系統以及來幫你分配硬體資源
而硬體能讀的懂得都是0與1的訊號而已
所以之後就有組合語言的出現 讓人類比較好讀
再來就有高階語言 使程式設計這件事能更加抽象化
當然這些都要歸功於組譯器跟編譯器還有眾多系統程式的發展

一台電腦能力不夠 那你有試過兩台嗎?
電腦之間需要彼此溝通合作解決問題
那就需要網路啦
TCP/IP的五層架構 也幫助我們抽象化了許多的底層問題
除了Physical layer可能涵蓋比較少之外 其他層都是資工的研究範圍喔
當然更不用說最夯的行動網路了

在來電腦有他圖片 聲音 影像的輸出
這就是多媒體處理這塊的領域

理工科的話 數學也很重要的
何況CS算是數學分支出來的

最基本的就是離散數學 非連續的東西都被包含在這門課裡面(雖然帶到的沒那麼廣)
線性代數是處理多維度問題的重要工具
機率統計是在處理不確定情況的時候的重要工具
計算理論就是CS的核心了 也就是在研究什麼是計算 什麼可以被計算 什麼計算得很快 什麼計算得很慢等等議題

我修過的各個課程會在後面的文章更細談我的心得
以及一些參考資料

最後附上這篇經典文章
其實資工系是在教你生死學

初試啼聲:打工與實習

實習的必要性

我一直感到很可惜的一點是我沒有早點去找實習工作機會
那時候總覺得要去一個真的公司工作感覺怕怕的
總覺得自己好像不夠格
我一個學生這樣真的可以嗎
事實上只是對自己沒有自信而已
如果能再重來一次的話
我應該升大三就會開始去找實習了

一來多少補貼點生活費
二來看看到底現實中非學術界中
那些公司到底找工程師做什麼

last but not least, 可以寫到你的履歷當中!
這點超重要的 比你的成績還重要就是(但也沒說成績不重要就是)
這是我個人找工作的感覺
成績好固然是個亮點 但很難在面試中聊下去
但如果你有自己做過什麼專案(作業通常不太算 除非是大專案或是一系列的project)或是在哪裡打過工做過什麼專案
這些事情都是在面試過程中 面試官很好發問的點
而且如果你有準備的話 應該也是很好發揮回答的題目
尤其當你的專案還是可以直接demo的話就更好了
面試自我介紹是個很好的開場

但回過頭到現實面
這也跟你去哪間公司實習工作有關就是
不同的環境看到的東西學到的東西當然不一樣
但我覺得很重要的是 也是一堆人犯的問題
不要用一間公司來打翻整個產業界
這間公司制度很好 你很喜歡
那就好 學起來 這是帶著走能分享的
這間公司你不喜歡
那也好 去思考為什麼不喜歡 是哪邊不好
但也不要就因此整個產業就是如此爛(我還滿常聽過這樣的抱怨 但只是第一份工作或是實習而已啊... 講得好像多熟悉)

去思考哪裡好哪裡不好適不適合自己
其實也是面試可能會常碰到的問題
有想過這類的問題到時候才會知道怎樣給出一個具體的回答

我的經驗

我的年代剛好在智慧型手機app剛要蓬勃爆發的時候(嗚嗚嗚 這樣聽起來好老)
而我那時候剛好也寫過一點Android 2.3
因緣際會下就到了當時的公司寫Mobile APP
印象中我是在某個學校的公告欄看到廣告的說
我想現在資訊更多 有機會的話 記得多留意看看

當時是真的找到一份很不錯的機會
工作時間很彈性 前輩也願意帶人 教了我許多基本的discipline
然後可以看到怎樣帶團隊建立並管理一個專案到上架這樣

我一開始的專案是利用 CoronaSDK (似乎工作室已經關閉 現在剩下開源專案且已經改名成 Solar2D)
這是一個可以寫出跨平台的library 使用的是Lua這語言
對我來說都是個很棒的學習機會
要快速上手一個語言以及框架
然後學習到android以及iOS上測試
要怎麼跟美術人員溝通
也很榮幸我那時候有被分配到帶領一個小團隊
所以也可以練習可以切分工作 怎麼溝通協調的
最後兩個月就做出來一個互動式電子書的成就感超級高的

後來也實際開發了native的iOS app還有Android app
這一年半的時間對我來說都是很好的成長
也對履歷面試加分不少(我覺得啦)
那時候還加入了他們的讀書會團隊 大家一起讀書學習
某種程度在我心中建立了我喜歡怎樣的團隊的雛形吧

後來找工作的時候曾經想走App工程師的
但最後有如願嗎
預知後續 請聽下回分解...

世界村:跨國與在家工作

隨著網路的發達(好古板的開頭)
跨國合作在現代的企業超常見的
也是個很好見識世界的磨練機會

在家工作(以下簡稱WFH, work from home)
隨著疫情的發展也暫時變成一種潮流

會把這兩個議題合再一起
是因為其實都跟網路的進步有關
其實感覺能跨國合作的純軟公司
可能在家工作應該也都是可行的

今天講講我關於對這兩件事的想法


要跟人合作
我覺得最重要的是溝通,要能敢溝通(很多不敢,或是說懶的溝通,這最糟糕)之外
有效率的溝通也是很重要
除了事先確認討論的重點,偏離主題時拉回主軸,整理結論等等基本原則之外
我自己很在意基本的禮貌以及根據觀察對方的表情與回應讓整場對話是舒服的

但有時候這問題在跨國的時候
隨著語言與文化的不同 加上看不到面
更是難了許多
語言上 可能是非母語者的關係
我自己常常覺得英文本身相較於中文感覺少了點那麼點情感
少了一些語助詞可以緩和太直接的句子
有時候也會覺得對方太直接而有種不禮貌感
只能靠時間之後知道那也只是語言差異的問題
就會慢慢的習慣了
在來就是善用表情符號
一個笑臉可以改善很多事情呢

如果用說的話 可以用語氣來緩和就是
但這時候就怕聽不懂了
可以說一句 "Sorry, I didn't catch that." 請對方再說一次
試著去抓抓對方講的幾個keyword
或是更需要事先準備好討論內容
已讓自己又容易去抓到context

有時候不要以為講中文就會比較好
不同的地方即使都是講中文的人
有時候用字與腔調也都不太一樣
這也是需要習慣的

不過對我那時後還是個怕生的新人來說
最怕的就是要去找不認識的錢被問問題
如果回到當時
我會給自己建議說
整理好自己想問的問題
想好怎麼講比較清楚
不要害怕 保持禮貌
多一點自信與勇氣
一切都會沒問題的


所以理論上不用在同一個辦公室也都可以工作的話
那當然WFH也應該不是問題阿
這就是有些我不太懂的地方就是
雖然面對面討論的確有它的不可取代性就是了

我自己不是很喜歡總是WFH 幾天的話還可以
但如果好多天都WFH的話會感覺很悶
比較喜歡團隊夥伴一起工作的氣氛就是
大家一起打鬧互相幫忙的感覺就是

美麗與邏輯:UI/UX

塞這主題是為了完整性
但我其實沒什麼資格來介紹這兩大topic就是
所以只會從工程師的觀點來講
連假偷懶一點吧

UI是 user interface
所以通常是與客戶接觸的部分
也是產品上看到的任何部分
所以最主要的任務就是整個版面的設計
通常也牽涉到graphic的部分
像是圖片 icon 等等通常也都是UI負責
也就是美術設計的部分吧
我碰過強大的UI甚至會把CSS直接寫好給我使用(拜

UX是user experience
著重在使用者與產品互動的經驗
簡單說就是在設計怎樣讓產品好用
怎樣去指引使用者上手我們的產品
不會讓使用者錯誤的使用產品
甚至會透過像是使用者訪談或是資料分析等方式
去找出使用者的pain point在哪裡
進而去設計改善產品的使用流程

所以通常有GUI的產品通常都會要UI/UX的介入
他們會去設計產品功能的互動以及畫面
算是定出一種SPEC出來就是

在我的環境沒有問題啊:軟體測試與QA

因緣際會之下
我剛開始工作的前兩年做的是QA(或是有些公司會稱作 Software Engineer in Test)
這個我覺得很常被誤會的位置
所以今天我想來介紹一下QA這角色還有軟體測試

QA是Quality Assurance的意思
顧名思義 就是要確保軟體的品質, BUT
軟體的品質是整個開發團隊的責任
QA不是拿來怪罪的

QA的責任是要站在客戶甚至是所謂的super user的立場去確認這個系統合不合客戶的需求
注意 是 客戶的需求不是PM的需求
不只是要驗證do thing right 還要思考的是 do right thing for the user (基本上應該是每個團隊的成員都要有這個sense就是)
而Developer通常會陷入技術導向的盲點當中而忽略了需求
這時候QA可以扮演一個中間人的角色
所以QA一樣要從需求分析討論開始
確保需求面是對的
並且參與developer的design review
看看實作設計層面有沒有問題
同時間他也要針對requirement, spec, design甚至是code本身來開test case(有各種方法論來開test case,甚至像是探索性測試)
並且讓大家review test case
在developer開發的同時
QA要準備好測試的環境以及測試的資料
尤其很多時候要去模擬客戶的環境 架設環境也是挺麻煩的
然後開始執行test case
並且自動化每個case以便之後做regression

所以可以看到有手動測試也有自動測試的部分
有些公司會特別去找自動測試的工程師

但在不分的情況下
以前我們都是自己來
包含自動deploy 各種script 自動化測試框架 report產生等等
某方面來說彈性很大 表現機會也很多

而且在QA的訓練下
大部分會從黑箱的角度看系統
這對如何了解一個陌生的系統也是種訓練
而我那時候也可以會去看程式碼找問題
進一步可以做到白箱測試
曾經耳聞有些公司不讓QA看程式碼
我是真心不懂這心態是什麼......

QA的自動化會都是整合測試
RD除了確保功能要對之外
則要負責單元測試
確保程式最小組成單位是對的
QA可以往下cover到中間元件的整合
developer也可以往上cover到這方面的測試就是
但最上層的測試通常還是QA為主

我那時候QA還會負責deployment跟release
其實我覺得也包含了像是現在DevOps的角色的責任

總之 一個好的團隊
我覺得QA的存在是必要的
可以給團隊從不同的角度看事情
developer跟QA的合作氣氛也可以看出這團隊的文化如何

而我為什麼最後又從QA轉到developer
這又是另一個故事了......

新的開始:碩一課程

無線多媒體網路
image
這門課其實是在介紹QoS(Quality of Service)
基本上就是真的不同的服務或是不同entity
給不同的網路品質
所以在多媒體領域上最是重要了
介紹了在TCP/IP上多個layer做QoS的方式
或是以及各種提高傳輸效率的方法
最後我自己的專案則是提出了利用data mining的方式
去看如何利用使用者行為去改善網路速度

高等JAVA程式設計
基本上就是Java上的網路程式以及各種design pattern
好吧 我承認我也忘記了


碩一我的課很少了
所以我後來也去旁聽了會計 日文等等的課
也利用這時間去學了開車
當然還是要顧研究室的進度啦...

更重要的是開始做有跟業界接觸
打工做案子
這個容我後面再提

慧眼能識英雄嗎:當面試官心得談

招募與培育新血是很重要的一環
也是我還滿有興趣的的一個主題
我也還滿幸運的
做了一年之後
當時的老闆就問我有沒有意願當mentor並且參與面試
我當然二話不說就答應了

今天來分享我當面試官的一些心得以及我個人的看法

看履歷

第一個當然是看條件吻不吻合
再來我覺得是看誠意與合理性
我一直想強調誠意
除非你真的是強到不行
但有些履歷真的感覺有點敷衍就是
而有些就可以感覺到是有用心在履歷上
這用心也不是說什麼是很官僚形式
但至少感覺出來有用心
我覺得至少這樣代表我們在同一個頻率上就是

面試

怎麼問問題真的是個藝術
像我那時候老闆說的
面試跟測試系統一樣

怎麼在有限的時間去判斷這個人/系統O不OK
通常都是請對方先自我介紹之後
再針對他回答的內容以及履歷上的描述去追問細節
之後可能會再去問些技術問題與非技術問題就是
有時候很有趣的是跟別team一起面試的時候
往往總是可以從別人身上學到原來還可以問這題

除了看內容回答的深度與廣度之外
其實通常也是看表達的態度與方法以及一些細微的小動作
還有就是看他準備的內容
雖然這也很八股 不過通常有準備好筆記的人
我的確第一印象有加分
還有最後問問題
除了事先準備好的問題之外
以及當我們介紹完我們產品以及工作內容的時候
對方會怎麼追問細節
最後這一趴真的也很重要
但感覺也是很多人都會忽略....

通常聊起來越自在自然的 頻率就越對
所以我通常建議盡量(雖然很難)保持平常心就是
誠實並適當地展現自己 不管好的或壞的一面
畢竟工作佔了你生活大半的時間
如果合不來的話 對兩方都是痛苦

選擇

前面講了那麼多
我其實很強調頻率 也就是直覺啦
但最後要不要入取這個人我自己覺得沒有什麼科學方法就是(還請相關專業分享)
所以我覺得我那時候有個做法很不錯就是(雖然好像不是每個人都會採用)
會找其他team member一起來面試
一個人的直覺不準 就看多人啦
而且畢竟是要cowork的人
我總覺得這是最好的做法
但不知道為什麼不是很多人這樣做就是

所以其實有時候面試找工作看得是緣分 強求不來的

大大來了:訪談問題

今天請了一個強者我朋友來分享非本科的學習經驗
先拜再說m(_ _)m
以下是問題

Q:你大學跟研究所的主修是什麼呢?
A:台灣大學生物環境系統工程學系,通常出來的方向會是水利工程師,土木工程師,環境工程師,農業工程等等

Q:第一次接觸寫程式是什麼時候?
A:高中學過一點點C++,真的就一點點。大學的程式設計課我也都翹掉了。覺得系上教的都太簡單,學期末只講到一堂指標。

Q:當初為什麼想轉到軟體工程師這角色?
A:就薪水比本業高啊,而且因緣際會剛好遇到有職缺

Q:那當初怎麼找到第一份軟體工作?
A:那是一間新創公司,朋友剛轉介紹缺工程師,然後也願意培訓我從0開始訓練做網站,我就加入惹。

Q:你怎麼開始學習當一個軟體工程師的?
A:看 w3school,framework document, stack overflow, try and error。撞牆久勒就會了。那時候是前端用Angular 2,後端用Node.js & Firebase

Q:那時候有碰到什麼問題嗎?
A:天天都碰到問題呀,印象最深刻就 code review 被 reject 超過 10 次。還有 hard deadline 爆掉,delay 兩個禮拜。不過不知道該高興還是該哭,也沒有用這服務,所以deadline報了就沒差,後來就檢討說之後不會再犯,預估時間再拉長這樣。

Q:那第一份工作的心得是?
A:知道什麼是爛到爆炸的code,獲得了一些不錯的人脈也是後來很珍貴的資源。

Q:你覺得你後來換工作面試有碰到什麼問題嗎?
A:對資料結構演算法的不熟悉,Leetcode沒有刷夠,所以就被電爆了。後來把書嗑完,又刷了大概130題之後,才勉強可以通過一些面試。然後英文不好也是一大問題。面試機會也不多,可能因為我用制式履歷的關係或是資歷也不夠吧。畢竟工作才一兩年而已。

Q:你現在的工作內容是什麼呢?
A:寫前端跟後端,Node.JS and React

Q:回到大學填志願的話 你會選什麼科系?
A:一樣吧。這科系有趣的人比較多XD

Q:你會給要進這行的人什麼建議?
A:歡迎入坑。進這行就要不斷學,經驗沒辦法代表一切。然後要有準備採坑踩好踩滿。

Q:怎麼說經驗沒辦法代表一切?
A:現在到一間比較有軟體工程紀律的公司之後,我覺得我之前在小公司的經驗完全派不上用場。感覺還是從0開始,目前還努力的在追上前輩的標準

Q:那你會怎麼去增強自己?
A:巴著其他大大的腿不放一直問問題,從他們身上學習。然後多讀文件,多讀code,多被檢討,應該會進步吧

徵得她同意
如果有人想請教強者我朋友的話
可以直接聯絡他喔

前言:邁入三十後的男軟體工程師獨白

今天是我踏入社會以來的第七年
距離我第一次寫hello world以來大概16年左右了

我一直很想做些給不知道自己未來想做什麼但已經或是準備要踏進這行業的人一些建議
算是一種想回饋社會的心態吧 一方面我很喜歡 分享經驗 這種事情
不過自己到底是有多少斤兩能夠給人建議呢?
於是乎我想說透過分享自己一直以來的學習心得與成長歷程
或許在茫茫人海之中 總會對誰有點啟發吧(自以為)
所以這整個系列會是個人的回憶獨白囉
(當然會局限於資訊領域相關的經驗 你想聽別的話... 我們私下聊 XD)

會包含三大章節
1. 那些年 我們學的鬼東西
這部分會包含我在學時的學習經驗上過的課以及我對資工(或是 computer science)的一些看法或是總結
還有在學時到踏入社會前的準備
算是給學生的參考
或是給想了解資工系在幹嘛的人一些參考

題目會包含大學到碩班的課程以及我當時實習打工還有找工作的經驗

2.別想了 沒有人會三顧茅廬的
這部分會包含我剛出社會
第一次進到一家軟體公司上班
第一次接觸到正式的軟體專案開發流程
試著用現在老鳥的經驗 回去檢視自己菜鳥的時候學到的東西

會有像是 開發流程 大型系統等課題

3. 長江後來推前浪 那前浪呢?
會講我換到目前工作之後心得經驗分享
在不同公司看到不同的事情會不會背後其實都一樣呢?
經驗是不是可以累積的呢?
另外
這份工作也是第一次開始接觸 web 開發
所以也會在這邊簡單介紹一下web前後端做為參考

也會介紹web產品開發流程中其他的角色及所需技能
還有對未來的想法吧

4. 說好的只有三章呢 番外篇
既然叫做番外篇
就可以開始講些543了
或許會介紹對新鮮人很重要但跟資訊沒什麼關係的事XD
目前暫定有

  1. 理財
    2.健康保養
  2. 非本科的學習經驗分享(請到強者我朋友們來分享)

關於鐵人賽的標題
老了之後只會開始吹噓以前的事情
還只有這種事情可以吹噓 更是可憐
但我大學研究所的確都是交大的
交大資訊工程學系 資訊工程組 (已經不見了...
交大 網路工程研究所
大學拿了七次的書卷
就讓我這樣任性的下標題吧
大學最後成績
image
碩班最後成績
image

媒體總是愛報說第一名有多慘 有多糟糕
我想我可以做個很好的代表吧
跟我的同學們比起來
我算是很失敗的一個了......

也因為如此
我想希望能找像我一樣只知道唸書
但不知道要做什麼的人
一起共同勉勵吧

有問題歡迎寄信到
image
或是臉書

美好的幻覺:Frontend 前端

不知道大家有沒有看過類似的工程師梗圖呢?

前端就是給客戶看到的主要畫面
所以不管後面的開發流程怎樣的混亂
程式碼是如何的髒阿
後端是滿滿的workaround
DB一團資料黏在一起等等
客戶看到的都是漂漂亮亮的畫面就是
做出這畫面去和使用者互動就是前端工程師在做的

前端的工作會需要跟UI/UX去討論說這些介面的設計好不好看且好不好用
最主要的技術就是JavaScript, HTML(HTML5), CSS(CSS3)啦
早期的話其實都算是用server side render的方式
全部都由server根據狀態及input去資料庫撈資料之後
直接產生出必要的HTML CSS JavaScript等等
後端的framework配合上一些template的幫忙
這是一種比較早期的做法
但隨著Ajax, HTML5和瀏覽器的發展
SPA(Single Page Application)變成了新的潮流
server只會回傳基本的html js css之後
剩下就全部都靠JavaScript了

在這情形之下
加上JavaScript演進之賜
就衍生出了許多強大framework
現在的三大主流就是

  1. React
  2. Vue
  3. Angular

曾聽過前輩說
如果沒有熟悉個兩三套以上的話是不能自稱前端工程師的(我: 只會React......QQ)
但不管哪一個
基本的JavaScript, HTML, CSS都是必須要熟悉逃不到的
HTML 是最基本的骨架
CSS 則是永遠學不完(我總是戲稱拉窗簾)
但是基本的display, position, box model的概念要有
JavaScript的標準也一直再進化 到現在都到ECMAScript 2020
甚至還可以看看TypeScript這個強型別的JavaScript
這些都有概念之後
再去看選擇一種framework
了解怎麼樣元件化 開發一個元件
以及元件的狀態與生命週期等等(這邊都以React的概念)
然後再去找找那個生態系提供的App狀態管理的工具
我覺得這是前端開發還蠻需要注意的地方
接下來就是各種前端的design pattern學習
學習正確的best practice

前端現在也需要compile(把新的語法轉成瀏覽器可以接受的語法)並產生release build
所以各種像是Babel, Gulp, Webpack等工具也是必須要知道的

再來你的平台都是瀏覽器
對瀏覽器的深入了解 我覺得也是有必要的
還有performance tuning的各種技巧
跟對應必要的profiling, debug, dev tool這些工具
這也都是不可或缺的

我自己對以上的東西其實也未必那麼有自信就是
我提到的可能都還只是冰山一角
加上前端的每個部分都進展得太快了
很可能明年就什麼技術都進化
或是有更好用的工具新推出
真的是個很難捉摸的領域
在變化那麼快的情塊下
只能說基本分析問題、評估技術、溝通協調的能力可能都是更重要的


前端這也可以衍生到mobile上面去
所以就有React-Native這framework出來
不過根據我做mobile的朋友說
大都還是需要寫原生的APP就是
很少拿這種誇平台的framework做production產品就是
有沒有大大可以分享使用這些跨mobile的framework的實戰經驗呢?

資安就是國安:資安產業在做什麼呢

小弟之前待在資安產業
今天來簡單介紹我認知的資安產業好了
每次講到這產業
大家都會說
“吃不飽但也餓不死”
我想其實滿貼切的

基本上 資訊系統 可以主要都是由三個entity組成

Client side <--- Network ---> Server side

每個entity都有各自可被攻擊的點
所以大家會針對這三個點研發產品
有時候solution是一整條的就是
會去偵測 紀錄 通知 直接作出回應 或是 讓IT部門管裡等等

client side就包含一般個人電腦
可能是家用或是企業中每個員工的電腦
通常都是最容易被入侵的端點
網路釣魚 社交攻擊等
一不小心 一個後門就會種進去了

網路 就是中間通訊的管道
這邊通常會去監聽並分析中間的封包
就是防火牆控管吧

Server side 因為包含重要的資料
所以也是一個重要的攻擊點
或是透過被compromised的client直接攻擊這樣

而手法大致是可以分成兩類
靜態與動態
靜態通常是針對檔案或是就是給個pattern 然後去做特徵比對
動態則是去監測整個目標的行為 然後再去判斷這行為是否有惡意

可想而知
除了常見的前端 後端 桌面應用程式 等做面對客戶的產品的工程師之外
這就會需要很多開發許多特別的module/library等
並且通常會牽涉到作業系統的層級了
通常都是我認知比較底層的範疇
我自己會歸類成系統程式工程師
學到的東西其實是很獨特的domain knowledge

你覺得學到很獨特的domain knowledge是好是壞呢?

各種比試煉:工具雜談

鄙視鏈 好像是這個圈子有時候會出現的現象
常常會去戰誰哪個語言比較好啊,那個IDE比較好,哪個框架比較好等等
有時候總會傳達出你不會這個就是不應該的感覺
或是不會把一個工具用到極致也不應該
甚至會開始檢討教育啊等等的
這現象看久了
我總覺得哪裡怪怪的
不會git 不會vim 或不會什麼
用到再去學就好了啊
然後也沒什麼特別必要把這些工具學到像在表演秀一樣就是
增進生產力固然很重要
但我覺得這不是個重點就是
框架語言也是如此
選擇用適當的工具解決問題才是重點

那我自己用些什麼呢
我用過notepad++
後來用sublime text開發Python (附上我當時的套件列表)
現在則是換到VSCode
vim就只是有特定平台會用他

OS的話 自己用Win10
工作用MacOS
開發則都是在Linux平台上 也沒偏好哪個版本
前端我也只會React
接觸過的語言C/C++, Java, Python, Perl, Assembly, Lua, Python, JavaScript, C#, Bash等 也沒特別偏好
雖然的確有不太想碰的
不過現在會是錢途考量就是

好吧
今天有種騙稿的感覺XD
其實我只是想講討厭這種比試煉文化
還有什麼一定要怎樣的觀念

今晚我想來點...:大公司還是小公司呢

今天來講點我對大公司和小公司的看法
只是我的看法 大小也只是相對而已

但我覺得或許有點代表性可以參考吧

大公司

公司很大 團隊很多
所以分工通常很明確
流程通常也很完整
但不同的團隊文化可能差異很大
有時候在跟別team聊天的時候總覺得似乎是不同公司
所以也未必就一定如此
常常會需要跟你的上游(你整合的人)或下游(整合你的人)一起合作
所以溝通的能力十分的重要
對外的溝通 多認識朋友
才會讓對內的發展機會更多

想要往上爬的話 向上溝通更是特別重要
不然你做再多事情都不會被發現
尤其是階層越多
上面更是看不到你在做什麼
資源有限的情況下
不管是位置還是薪水
一旦你沒被注意到
你想要的東西或是你應得的報酬就沒了

可能零零總總的福利很多
然後有得沒得的活動很多
社團也很多
如果你是活動咖的話
應該會很喜歡

官場鬥爭文化可能也會有
但身為小小螺絲釘可能無感
如果會有感覺被鬥爭到的話
那勸你離職吧

還有學習資源很多
這更是在大公司需要把握的
不要入寶山而空手而回
有時候是會請外部內部講師開課或是線上課程
亦或者強者同事很多也是你要好好去挖掘的

另外 人多必有_ _
所以碰到稍微比較不好的人的機率也會比較高就是

小公司

小公司就沒有上面的問題嗎?
不! 一樣都有XD
溝通依然重要 甚至可能要溝通的人更多
資源依然有限 甚至更少
因為人少 可能你要跨的角色更多
也可能比較不容易找到可以請教的對象 你必須要自己挺身而出做許多事

但最大的差別呢?
我覺得在階層比較少
所以你做的事情相對起來是容易被看見許多
被看見就容易得到你想要的資源
而且相對流程稍微有彈性些
施展拳腳的空間可能比較大

但大公司也可能有新的team
在這種team多多少少有稍微扁平的架構
也可能有比較大的彈性的空間就是

所以大小只是種相對的概念


其實我覺得不管大公司小公司都不是重點
產業別 除非你有特別的興趣 我個人也通常看不出什麼產業比較有前途
但職業別技能樹的點法倒是挺重要的 但這也未必是決定性的關鍵就是
我覺得最重要的是老闆就是 你的直屬長官
他未必要能力超強 但要能指引你方向
提供你資源與表演機會
協助你解決問題並且培養獨自解決問題的能力
進而發揮自己專長
然後會定時的 1 on 1 跟你檢討你的表現 設定目標 如何達到目標等
並且適當地傳達公司的方向給你知道
第一線主管是很辛苦的
好老闆通常會決定這工作是不是好工作
尤其是對菜鳥而言 特別重要

我還滿幸運的
一路上碰到的老闆們人都很好
都帶給我很多幫助
所以也讓我下定決心
希望以後我也能成為這樣的幫助別人的角色

風城新鮮人:資工大一課程

微積分
理工科大一必修當然是微積分囉
雖然現在大概還是只記得基本的微分與積分吧
但我覺得最重要的還是記得其微分與積分背後的意義就是(或許吧XD)
這是要修一年的
其實他是大學數學很多課程的基礎 是很重要的
你覺得不重要也是沒碰到用途而已
比如說 對之後的機率 或是 機器學習 等等
微積分都算是基本吧
一開始也是可以靠高中的知識混過去XD

普通物理
交大資工的規定是可以在普物普化普生三者選一個修
不過好像大部分的人都還是修普物 我也是
基本上就是高中物理的延伸
我承認我都是靠高中的底子撐過去
也是不知道到底在幹嘛Orz 還要修一年 很痛苦
但你說物理沒有用嗎? 如果你是走圖學方面的話 這可是還滿重要的...
雖然我是幾乎沒用過QQ

線性代數
這是一開始大家超級排斥的一門課
其實念資工的(我當年)很多人都會在說數學無用
雖然我不知道現在的人是不是還是這樣覺得
雖然我承認我現在工作的確沒用到
但其實在許多工程領域 線性代數是很基本必須的
像是影像處理 圖學 現在正夯的機器學習 等等 都有相關
甚至你在model一個問題的時候
如何多變量去思考問題 我想都有些影響
像我大學專題所實做的一個演算法
最後就是把它的問題利用矩陣表示成一個簡單的線性方程式
最後去找到其eigen value
我的認知他就是處理多變量的一種重要工具
所以處理的不只是純量(scalar)或是向量vector

以下是我當年的課綱
Steven J. Leon, Linear algebra with applications, Pearson International Edition, 7th Edition, 2006

本課程探討矩陣(matrix)之觀念(包括幾何解釋)、性質與定理、運算及其應用等四部份。
(1) 矩陣應用可分兩大方向:線性方程式(linear equations)及線性轉換(linear transformations)。線性方程式可透過矩陣的三角化(triangular form)、reduced row echelon form、LU分解等運算分析其解的存在與個數。
(2) 矩陣可視為一種row vector space或column vector space。Vector space 的元素可表示為一個多維空間(multi-dimensional space)的向量(vector)。向量之間存在有垂直性、相依性等關係。一群不相依的向量可組成vector space的basis。Vector space 有包含性(較小者稱為vector subspace)及垂直互補性(二個vector subspaces可以組出更大的vector space)。
(3) 一群向量可以透過Gram-Schmidt process 或QR分解(Factorization)找出其中相互垂直的成分向量,構成一個vector space 的orthogonal basis。線性方程式可化為向量等式表示法,其解的存在與向量等式中所列出的向量群之間的垂直性,相依性有關。
(4) 線性轉換(linear transformation)是將一個空間的向量轉換到另一個空間的向量,可以以表示為矩陣關係。新空間的向量可視為舊空間向量的線性組合(linear combination or linear sum)。如此一來,線性轉換變為探討不同空間之轉換。若轉換符合可逆性,則可將逆向轉換表示為另一個矩陣,此矩陣為原矩陣的inverse。
(5) 線性轉換若視為新舊向量之轉換,則多次的線性轉換代表一原始向量的演變。此種長期性演變是否收斂,則可透過矩陣的eigenvectors 及eigenvalues來探討。eigenvalues可表示為一個含eigenvalues 變數的行列式等式(一多項式)的根。eigenvectors則為矩陣相關式(A-λiI)的column vector space的垂直互補空間的向量。
(6) 並非所有矩陣都存在有eigenvalues及eigenvectors。存在者的matrix可以轉換為diagonal matrix。對稱的square matrix一定可以對角化(diagonalization),對角化後的向量之間相依性消失。Non-square matrix 不能對角化,但它可以做singular value decomposition(SVD)。SVD可以用來求線性方程式的最近似解。

我印象中 前兩章都還是在高中數學範疇
介紹向量跟矩陣的運算
到第三章之後 開始抽象化 並帶入vector space的概念之後
就會讓你有到了大學數學的感覺了XD

離散數學
離散數學 基本上就是 非連續的數學的一個分支
而電腦能表達東西機本來就是非連續的
所以他可以說是CS必修的數學基礎阿
邏輯 集合 證明 數論 數列 函數 排列組合 演算法等等 都歸在這個底下

以下是我當年的課綱
Kenneth H. Rosen, Discrete Mathematics and Its Applications, 6th ed., McGraw-Hill Inc.
Chap 1: Logic and Proofs
Chap 2: Sets, Functions, Sequences, and Sums
Chap 3: Algorithms and the Integers
Chap 4: Induction and Recursion
Chap 5: Counting
Chap 7: Advanced Counting Techniques  
Chap 8: Relations
Chap 9 Graphs
Chap 10: Trees

資料結構演算法(你看還有圖跟樹)也包含在裡面
BigO這東西只少大二前每年都會聽到XD
雖然後我們都還有專門的一門課在教就是
(所以這些東西基本上我們只少聽了三次)
排列組合基本上也是高中的 但也是為後面的機率打了基礎
邏輯、集合、證明方法這些也都是基本的東西 但我想高中其實都教過了
後面在修計算理論的時候也會複習一次
數論的話 密碼學算是會用到吧
計算理論其實也包含在這門課中 只是我們跳過了 畢竟後面都還是有必修
關係這東西也是滿有趣的 算是關聯式資料庫的基礎
不過我到現在還是很難把兩者結合在一起來看
然後 基本的代數 群環體 有些課本也是會包含進來的
但好像大部分資工的離散數學課程都不會教 (雖然AES也是會用到)

總之這門課的許多內容
後面許多課程都會再提到的
可見他的重要性

根據維基百科
甚至連決策理論都在這範疇呢

計算機概論與程式設計
進到資工相關的課程了
我們教的是C語言
用的課本是大名鼎鼎的K&R The C Programming Language, by Brian W. Kernighan and Dennis M. Ritchie;
我還滿喜歡這本課本的
跟一般的入門課本不同
第一章它就先把C語言大部分的feature go through一遍
之後再開始講細節
不像大部分的課本都直接進到什麼是變數什麼是判斷什麼是迴圈等等
我那時候的教授是交大資工非常有名的教授 - 蔡神
但其實我忘記我怎麼老師怎麼教的
印象中他有跟著哪本書的原則
提了很多的問題 像是巴斯卡三角形 99乘法表 身份證字號驗證 幾a幾b等等
然後帶我們看各種問題程式怎麼寫
就跟那本書一樣(或許也就跟學習自然語言的原則一樣)
先沉浸在之中 習慣了之後
在去了解細節吧

這是當時的課綱

  1. Programming Concepts and simple I/O processing  
  2. Data types, constant, variable, array, pointer  
  3. Control structures  
  4. Loop vs. Recursion  
  5. Function and parameter passing  
  6. Global, Local, and static local variable, static function  
  7. Using library, I/O manipulation, C++ I/O stream  
  8. Some funny examples, application of random numbers  
  9. Struct (also discuss Class briefly)  
  10. Class and constructor/destructor in C++ program  
  11. Object Oriented Programming concept  
  12. Function name overloading and operator overloading  
  13. Access control in class  
  14. Virtual function and Polymorphism  
  15. Multiple inheritance problem  
  16. Exception handling

物件導向程式設計
一下我主要學的是C++
由於某些問題 唉 課程並未連結
所以老師必須要重教上學期教過的部分
這老師幾乎是程式語言大師
所以可以把C++教得鉅細靡遺
在現在C++越來越複雜的時候
真是希望能聽到老師怎麼解釋現在的C++......

同時我也在旁聽Java
相較於Java的多彩多姿 (還有講到socket programming, GUI programming等等)
C++ 的每個細節都是博大精深 記憶體處理也複雜到爆炸
真的是一趟語言學之旅呢
image
雖然我覺得我只會皮毛就是
現在都不敢說自己會C++了 嗚嗚嗚

計算機科學概論
這是最廢的課
就是上一本叫做的書 把我們之後都會修到的課都蜻蜓點水的帶過
Computer Science an Overview,” 9th edition, J. Glenn Brookshear, Addison-Wesley, ISBN 0-321-38701-5
我真的不知道有什麼意義
理論上都可以在 計算機概論與程式設計 這門課帶過啊
我們的上一屆還沒有這門課
不知道到底是哪根筋不對 從這屆開始加了這門課到必修....
幸好現在的學弟妹已經不用上了

還是附上課綱
image

課綱皆可以在 國立交通大學 課程時間表 查到

爆肝風城 - 資工大二課程

微分方程
坦白講
也是都忘光了 Orz
基本上我的認知就是用微積分加線性代數去描述問題
然後解出來就是

C. H. Edwards, Jr. and D. E. Penney, "Elementary Differential Equations with Boundary Value Problems," 6-th edition, 2008, Prentice Hall.

image

機率
我覺得很重要一個基礎
當時的課程網頁
畢竟每個問題通常都是不確定的XD
會先從集合的概念該使 counting(複習 again)
帶到古典機率 這邊都還是高中的範圍
再帶到現代數學的機率公理之後
之後就開始變成天書啦

我是統計學再念了一遍
然後隨機過程又念了一遍
碩論有用到機率 所以又讀了一遍
不過還是覺得很難掌握
但念了那麼多遍也代表了真的很重要吧

資料結構
Fundamentals of Data Structures in C++, E. Horowitz, S. Sahni and D. Mehta, Computer Science Press.
重要 重要 重要 很重要所以要說三遍
基本上就是告訴你資料怎麼存最有效率
教你Big(O)分析之後
就開始介紹以下各種data structure啦
image

從線性的array到 hashing 到 tree 到 graph
這大概是唯一會了解輪子怎麼造的時候吧

那時候作業也都很有趣
認真的去思考怎麼造樹
去利用hashing解決問題
想各種加速方法
其實是真的很有趣的阿

但你出社會之後
會反覆一念在念這科的
不是因為他很重要 你工作會一直用到(還是用得上的 我沒說用不到)
而是人生.................

演算法概論
在資料該怎麼擺放之後
接下來 回到更基本的問題
怎麼用程式解決問題
演算法基本上就是一連串具體解決問題的步驟
然後要有

  1. 輸入(參數 問題input 也可能沒有)
  2. 輸出(答案啦)
  3. 明確性(每個步驟要很清楚 結果是可以確定的)
  4. 有限性(總要限時內做的完吧)
  5. 有效性(是要做得出來的)

以上都是教科書定義

總之 就是回到CS根本 如何用電腦解決問題(計算問題)
課本就是這本經典的楓葉本
Introduction to Algorithms, 2nd Ed, the MIT Press, by Cormen, Leiserson, Rivest and Stein.
基本上就是三部曲

  1. divide and conquer (分而治之法)
    把大問題化小 變簡單 變好解之後再把答案組合起來
  2. dynamic programming (動態規劃)
    很多子問題有重複的結果 那就cache起來 (Top-down break)
    或是當問題的局部最佳解就是整體最佳解的時候 就從小case開始思考 (bottom-up build up)
    其實跟divide and conquer差不多
  3. greedy (貪婪)
    就每步都一直選最佳解去做就是了(但不一定真的得到真的最佳解)

大概就這樣
不過其實商管科系的 作業研究 這門課其實也涵蓋了很多這類的方法

這門課的重點是上面三大項了
一樣一開始還是在教一次Big(O)
然後帶到那三項
再來又會帶到些Tree and Graph的演算法
最後簡單提一下P NP
但不會太深
因為後面還有計算理論會提

大概如此
總之我想這也是一門你出社會後會一讀再讀的好課......

然後我想說 即使你上完了這門課
但還是不會寫leetcode
應該很正常吧

資料庫系統概論
Fundamentals of Database Systems by Elmasri and Navathe, 5th edition, 2006, Addison Wesley
image
聽起來是教你怎麼用MySQL嗎? 錯
教你怎麼實作MySQL嗎? 錯

其實是講很general的東西
從你要怎麼分析你的程式的ER-Model
到怎麼設計Table schema正規化
還有一些基本DB的概念就這樣

怎麼用特定的Database(像是MySQL還是PostgreSQL)
還是要自己學的 甚至連網頁怎麼寫也是
我記得這門課的專題就是寫個旅遊部落格
從PHP到架DB 架 Server 寫網頁都是自己學
典型的一門資工課

計算機網路概論
顧名思義就是介紹計算機網路 TCP/IP 5層架構
包含 Link layer, Network layer, Transport layer, 到Application layer (資工不太會探討Physical layer)
會介紹各層做什麼 有什麼protocol等等
課本是
J. F. Kurose and K. W. Ross, Computer Networking: A Top Down Approach Featuring the Internet, 4th Edition, Addison-Wesley.
這本我覺得寫得不錯就是
也是我後來會拿出來翻翻的課本 只會上到第五章就是了
後面三章都有專門的一門課
剛好我也都有修過
之後再介紹

  1. Computer Networks and the Internet.
  2. Application Layer.
  3. Transport Layer.
  4. Network Layer and Routing.
    5 Link Layer and Local Area Networks.
  5. Multimedia Networking.
  6. Security in Computer Networks.
  7. Network Management.

其實我覺得TCP/IP的設計階層式架構
最能反應在工程上抽象化定義好每一層的功能,定好API
就是這樣乾淨的架構所帶來的威力 (但我也是修了很多們網路的課 才稍微體悟到這道理的...)
才能讓網路的概念變得那麼簡單
我只要考慮好我目前所在的這層與下面這層之間德關係就好
不會說我寫的HTTP還要考慮這個bit的資料要怎麼傳到下一個hop這樣
我一直覺得這是個很漂亮的設計
也或許如此我那時候才想走網路相關的研究吧

組合語言與系統程式
這其實是兩門課合在一起的 所以有兩本課本 算是都滿底層的東西 現在也都從必修拿掉了...

  1. 組合語言
    課本是Kip Irvine, "Assembly Language for Intel-Based Computers, 5th Edition," Prentice-Hall , ISBN-10: 0-13-238310-1,
    主要是教Intel CPU的組合語言 也就是Intel CPU真正讀得懂的語言
    我還滿喜歡這門課的
    可以去了解看這種CISC(Complex Instruction Set Computing)這種CPU指令集是怎麼設計
    有怎樣的功能 然後有哪些register
    當然我們也有練習寫了一點組語的程式
    配上Visual Studio的幫忙
    寫起來很是開心 反正記憶體隨你控制 Register隨你安排XD
    會這個對你要最佳化某段程式或是去讀反組譯的程式都很有幫助
  2. 系統程式
    Leland L. Beck, “System Software: An introduction to Systems Programming, 3rd edition,” AddisonWesley Longman, 1997. ISBN-10: 0201423006
    課本是很有名的貝殼書
    系統程式就是像是任何跟系統相關的程式(廢話)
    廣一點或許可以說跟用來控制硬體相關的程式或是控制這些程式的程式吧
    在剩下半學期會介紹
    Assembler 介紹如果把你前半堂課寫的組語再轉成給CPU能讀懂的010101的程式(object files)
    Linker 把這些產生出來的obj files跟外部library連結起來產生真的能執行的檔案 executable files
    Loader 把這些執行檔再入到記憶體中 然後去調整裡面的offset
    總之就是很基本的東西蜻蜓點水
    有興趣的話 可以再去翻翻 <程式設計師的自我修養> 這本書

BTW 這門課是我第一個拿到的100分XD
image

程式語言
Concepts of Programming Languages, Eigth Edition, Robert W. Sebesta, Addison Wesley, 2008.
這本課不是要教特定的語言
比較像是一種語言學概論
image
看課綱就感覺得出來
每一個都是很特定的主題
Data Type, Expression等等
很理論 也不知道有沒有用
但國家考試有這科喔
所以你買得到參考書XD

比較特別的是最後教了functional programming & logical programming
練習寫了 common list & prolog
算是比較特別的體驗
不過純functional我到現在還是沒辦法參悟啊

計算機系統管理
System Administration 我們都簡稱SA
基本上就是教你如何管理操作設定UNIX系統
選擇的是FreeBSD(因為跟交大資工很有淵源)
是我們系上很有名的操課
也是我大學生涯中 唯一一次讓我為了趕期末專案而看日出的課

"UNIX System Administration Handbook," 3rd ed.
By Evi Nemeth, Garth Snyder, Scott Seebass, Trent R. Hein,
Prentice Hall Press, 2000.

image

坦白說
修這門課是個熱血
就是大家都說 “走啦 一起修 一起爆肝” 的這種熱血而修的
所以我其實真的很多都聽不懂
每次做作業都要重新google一次(雖然事後才知道 這樣才是正常的)
然後那時候我對UNIX系統的操作也止於 ls cd
可想而知 很痛苦
但現在想想 是一個很好的磨練
裝系統架系統其實也是一個軟體工作很重要的訓練就是(這是我在工作之後的體悟就是)
也讓我開始熟悉UNIX系統
知道如何架設各種單機服務
shell script的練習
到現在對我都還是很重要(因為我大致都在Linux系統上開發)

這其中還包含文化的問題
比如說就應該要把電腦裝成FreeBSD啊 用什麼VM(我當時就是用VM)
為什麼一定要裝FreeBSD才是對的...
一些工程師間的鄙視垃圾話文化
其實也是你對在這行要面對課題就是

獲益良多呢...

接下來三門都是硬體課
我承認我不熟
電路電子學
這也是我們這屆第一次開的課
希望給我們資工組的人基本電子學與電路學的概念
所以像是資電組的人就要單獨修分開修

那教授希望給我們什麼概念呢
(1) Introduction to signals, systems and elctrical circuits,
(2) Introduction to basic analog electronic circuits and operational amplifiers,
(3) Introduction to basic digital electronic circuits and CMOS logic gates.
看這簡介
一是訊號與系統 二是電路學 三是電子學
其實包含EE的很多基礎課了
所以當然只能蜻蜓點水囉
附上當時講義XD
http://mapl.nctu.edu.tw/course/Electronics_07/files/Lecture%201&2%20Signals%20and%20Systems.pdf

不過那時從那些電子元件兜成了一個AND gate之後
好像有一種豁然開朗的感覺

(不過也沒啥用就是 攤手)

數位電路設計
M. Morris Mano & Charles R. Kime, Logic and Computer Design Fundamentals, 3rd Edition
好啦
前面把gate做出來之後
接下來就是用這些邏輯閘做出更複雜的數位電路
這門課會從布林代數開始教
然後教你用Karnaugh Map去簡化電路
之後抱歉 我真的全忘記了
對不起老師...........

數位電路實驗
我也很討厭的一門課
所以我不走硬體吧XD
只能說幸好也從必修拿掉了
基本上就是用Verilog去實作數位電路設計裡面學到的電路
that's it 夢靨一場 不想多提QQ


看看大二的課程多麽的扎實啊
這還不包含外文與通識呢

面對現實:找工作 Part 1

由於我那時候就篤定要找研發替代役(單純不想當兵而已)
所以基本上是碩一上就要開始找工作
現在這時代應該大部分的人都不會找研替了吧(我是老人了 還請小鮮肉們指教)
我就不分享研替有什麼不同了

今天會先來分享準備面試的前期工作
下一篇來分享我問過的問題

開始之前

我說的是我當時的心態
所以不一定很正確(但其實也沒所謂的正確心態吧)

我本身是個對自己沒什麼自信的人
我只會唸書 但不知道要做什麼
所以一直對未來很迷惘
雖然打工的經驗有給我一點自信
但真的要找工作了 還是很害怕
而且是要綁三年的研發替代役
我沒有背景 父母沒受什麼教育 也沒法給我什麼建議
個性交友上又比較自閉
打聽不到太多學長姐的資訊

然後要有點耐心
一開始面試一定很容易沮喪
也可能等很久才有回應 也可能是無聲卡
這都很正常
慢慢調整自己的心態就好
不要隨之起舞

總之 時間到了就要去找工作的(或是想想你的下一步啦)

這邊呼籲一下
有需要的人
可以多去利用學校的諮商中心資源
諮商是個很好調整自己心態的管道喔
出社會之後你想找諮商服務才知道超級貴啊

總之
勇敢去面對問題就對了!
怎麼開始呢?
從寫履歷開始

踏出去 踏出去 踏出去: 履歷

我第一版的履歷
其實很傳統 附上一堆有得沒得的資料
以我現在的角度來看有點失敗
建議要寫的人去google一下 resume
就有很多範例

或是現在有很多現成的服務(CakeResume, Himelight等等)
但我其實用那些服務產生之後
建議還是自己在調整一下比較好
自己看過幾份履歷 有沒有用心是真的很明顯的
實力當然很重要
但履歷是第一關 跟第一印象一樣
這也是很多 "工程師" 會忽略的
但我那時候爛爛的履歷還是有得到一些面試邀約
多少跟校名有關吧 我想
學校是在這時候派上用場的(也只有第一次有用)

要記住你要吸引的是一個一天要看上百封履歷的人
所以怎麼在短時間讓他快速了解你很重要
要把履歷重點濃縮在一兩面

找職缺 投履歷

這部分只能真的只能多打聽
我是多上網搜集些資料吧
雖然那時候也只知道看104 1111等等
我是不知道新鮮人現在會不會用獵頭的服務
但我那時候我是不知道的

除了自己投履歷之外
當你PO上104之後
也是會有人主動聯絡就是
對HR基本的禮貌應對都要注意喔

基本上我對那時候我想投的公司分成幾類(這只是我的看法 還請各位前輩指教)

  1. 台積電等半導體製造廠: 對資工而言 大概只能做IT或是做資安工程師(?)
  2. 聯發科等 IC design house:, 其實我覺得這類公司主要的缺都還是偏硬體就是,現在可能不太一樣
  3. 系統廠: 像是網通設備等等 有產出硬體產品的
  4. 軟體產業: 像是趨勢科技 KKBOX Yahoo 等等 這些純軟體服務業

由上而下 可以說從越來越軟 薪水從高到低 爆肝度也是從高到低
(我要強調 不是絕對!! 只是我的觀察啦)

準備方向

拿到面試入場券門票之後
就是要準備面試了
可以找幾本書來讀讀
然後上網google一下有沒有人有面世經驗分享
如果你不是要面試知名大外商的話
leetcode刷到easy到medium(我覺得都沒必要就是... 個人想法)就夠了吧
但是刷之前最好還是念一下資料結構跟演算法
Big(O)怎麼分析 常見演算法的複雜度(Google的HR問過我這種一翻兩瞪眼的題目)
然後OS(thread, multi-process, mutex, semaphore)等
還有網路TCP/IP的概念
你使用的程式語言的基本概念(建議C/C++, Java, Python, JavaScript這幾種常見語言)
基本的SQL語法
常見的design pattern
我甚至也聽過有考數學的也有
(以上全部都可以google到面試考題)

還有就是針對你的面試的職缺的準備
不過通常對新鮮人的話
我覺得是不會太要求的你有特定的專業技能
除非你寫在履歷上
所以最重要的是
你要確保你對你寫在履歷上的每一點都有信心可以回答出來是在做什麼的

沒特別專長也是可以
考試終究還是要看你的底子
但到底何謂底子
我覺得其實就是你平常的累積了
因為每個人認為該有的底子都不一樣
誰知道呢?
有些人覺得要那個 有些人覺得要這個

養兵千日用在一時
平常唸書的時候要練習思考問題背後的原因 去思考為什麼這樣?
能不能融會貫通的把一件事背後的原理說出來**(再次強調 尤其是你寫在履歷上的東西)**
我想能做到這點就很棒了

剩下就看緣分吧

隕石來襲:客戶問題處理

我覺得工作到現在
我遇到的最大的隕石
都是客戶回報關於已經上線的系統的問題
通常都會規定不同等級的 issue 有不同的時限
P0/P1 是會炸得遍體鱗傷的
不過被炸過就會長大了
上面那句是玩笑話
但也是一個血淚事實
我曾經專做這樣的工作做了半年多
而且上任沒多久就碰到P0/P1
幸好有很多很罩的同事幫助
我才有存活下來
但我覺得那陣子
真的是被三雷轟頂 醍醐灌頂

不管是分析問題
(學習觀察客戶描述問題的文字找出蛛絲馬跡,按時間線去整理所有的線索,憑空腦補遺漏的部分)
分析log
(各種linux 方便看log收集log的command 像是zgrep, scp,寫了一堆分析log的script, 善用IDE幫忙看log)
重現手法
(會對系統更加了解)
debug方法與工具(GDB)等方面的能力都大幅進步之後
慢慢的習得通靈之術
之後甚至能用通靈之術的能力
去幫助在開發新功能的時候
能設想去如何預防問題
或是當發生問題的時候該收集怎樣的資訊

另一方面
如何跟support溝通
怎麼樣先幫客戶先排解問題
請他們幫助我們搜集更多客戶環境的資訊
或是跟他們解釋目前的問題在哪
甚至指引他們去找到正確的苦主
甚至如何安撫客戶等等
可以是說一種太極之奧義吧

通靈加上太極
大概就是處理客戶問題的方法了
但這兩招豈是這樣說說就能學得會呢...

這就帶到另一個我覺得很難的問題了
前面提到這兩招其實也是要一定的時間培養的
但說實話 對大部分的工程師而言 是未必想點太多這方面的技能的
一方面是技能變得很局限 技能樹會點的有點歪就是
另一方面是若沒大事發生 上面未必注意到你的表現
而平常都是說些擦屁股的事 其實很容易一肚子火的...
但不會因為不做就沒有這些問題產生
客戶就是會有問題進來
但大家又不想做這種差事
到底該怎麼辦呢?

所以一個方法是有專門的team或人去做這樣的事情
但我總覺得這種人不好找(甚至有人來問我 我自己也都不會推薦這樣的位置) 甚至這種位置通常做不久
另一個方法是輪流 值日生制
但有時候很容易因為人力調動等因素就會一拖再拖
最後就導致悲劇了......

不知道大家的公司都怎樣安排人力處理這種問題呢?

我該學什麼程式語言呢:English

該學什麼程式語言

這是PTT soft_job版上常看到的問題
下面推文通常都會有人回:英文

我是舉雙手贊成的
小朋友與其學程式語言 不如把時間多學英文
把英文聽說讀寫學得跟母語一樣強的話
這也是我覺得我很後悔小時候沒有學的東西
回到在科技業上
英文好的話 學習第一手的技術也直接
有機會對要用英文presentation的話
八成人都不敢 你就很容易有機會
甚至現在很多外商機會
英文不好的話 即使能力再強但表達不出來不能溝通也沒用阿
再者英文是各個領域都用得到的
所以投資這個準沒錯

我很感謝前公司讓我有很多機會可以練英文上英文課
我真的覺得我的英文到出社會後才練起來(在聽說寫的部分 也只是堪用)
高中真的只有單字與文法而已...(雖然我覺得也很重要)
所以我推薦如果有辦法的話
出社會後
可以去上會話班 讓自己有多說多聽的機會
還有商業英文寫作 練習用英文寫書信
這樣就差不多了

多益我今年自己有拿到金色證書(炫耀)
究竟對找工作有沒有幫助呢?
我就還不知道了


回到正題 如果新手真的要學程式語言的話
對沒有目的只是想學程式設計是什麼
學一個可能比較通用語言的人
有需要做資料分析 科學運算
或是做系統管理的人等等
我會建議 Python

但如果是想做網頁開發的話(尤其是前端
沒得說
就只有JavaScript

對資訊科系新鮮人的話
我覺得C是一定要的
練習去刻底層的東西 記憶體操作
之後再從struct去延伸到C++的class去學物件導向
還有STL這樣

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.