###### tags: `Interview` # 面試準備 [面試參考心得 - 內有resource](https://yutangshi.gitbooks.io/algorithm/content/mian-shi-can-kao-xin-de.html) [發哥面試](https://hackmd.io/@g9tdU4gDSTiEZrerd0g7-w/SyCXEfsSE?type=view) [趨勢科技](https://hackmd.io/@1eft0ver/HJH4ebBmN?type=view) [C++](https://openhome.cc/Gossip/CppGossip/) [Docker 入門](https://glints.com/tw/blog/docker-basic-tutorial/) [AWS 雲端運算 Devops Container DataLake](https://aws.amazon.com/tw/what-is-aws/?nc1=f_cc) [群暉/聯發科 面試心得](https://www.ptt.cc/man/Tech_Job/DB04/D730/DC87/M.1473387128.A.07A.html) [Void Pointer](https://www.scaler.com/topics/void-pointer/) [C常見考題](https://medium.com/@earth875/c-c-%E5%B8%B8%E8%A6%8B%E8%A9%A6%E9%A1%8C-961619b14f88) # Problems ( C & C++ ) ## static v.s. extern( global) ``` Static 會被限制於宣告此變數的scope中, extern( global )則是整個程式皆可access。 ``` ## Memory Leak ``` 記憶體流失的意思 主要是記憶體管理失當 像是C跟C++如果使用malloc()取的記憶體空間, 就必須在不須使用後 利用free()適當,如果沒有釋放,則會產生memory leakage。 ``` ## Smart pointer ``` 它可以讓 C++ 的程式自行管理記憶體的配置與回收,避免Memory Leak等問題。 ``` ## const && constexpr ```cpp= Const : 可以在宣告變數時使用 const 關鍵字來限定, 如果程式中有其他程式碼試圖改變這個變數, 編譯器會檢查出這個錯誤,例如: const double PI = 3.14159; PI = 3.14; error: assignment of read-only variable 'PI' Constexpr : 可以使用 constexpr 請編譯器驗證常數初始時是在編譯時期決定, 例如: constexpr int A = 10; // OK constexpr int D = rand(); // error: call to non-'constexpr' function 'int rand()' rand 傳回隨機亂數, 因此 D 的實際值要在執行時期才能決定,而非編譯時期, 因此發生錯誤;constexpr 的價值在於, 在重重的運算式或函式呼叫下, 編譯時期常數有時很難一眼看出, 這時加上 constexpr 請編譯器來進行檢驗就方便多了。 ``` ## i++ vs ++i ```cpp= num = ++i; // 相當於i = i + 1; num = i; num = i++; // 相當於num = i; i = i + 1; ``` ## Vector vs List ![](https://i.imgur.com/epPX8gn.png) # Problems ( OS & CA ) ## Cache Coherance ``` Cache Coherence(快取一致性)是指在多處理器系統中, 多個處理器的快取中存儲的資料必須保持一致。 當多個處理器同時access同一個共享資源時, 每個處理器的快取中都可能有一份該資源的副本, 這樣就可能導致資源的不一致性。 Cache Coherence協議通常由Cache controller和Bus controller實現。 當一個處理器修改了一個共享資源的值時, Cache controller會發送一個通知消息給其他處理器, 告知它們需要更新它們的快取中的該值。 Bus controller則負責協調多個處理器之間的通信, 確保資料的一致性。 ``` ## Spinlock, Mutex, Semaphore ``` Spinlock : Spinlock是Busy Waiting的一種,他的形式是一個while迴圈, 來控制你是否能進入critical section,而while裡面的條件式, 可以用Flag及Turn來判斷, 或是利用Test_And_Set這個atomic operation來判斷現在是否Lock。 用Test_And_Set舉個例來說, 第一個搶到進入Test_And_Set的process,他會離開這個迴圈, 並將Lock設做1,讓其他process無法通過他們的loop。 Mutex : 他是用來解決同步問題的一種Data Type, 會有兩個Atomic operation, 分別是Acquire()及Release(), 裡面的實作方法是利用一個共享的boolean變數控制。 Semaphore : 而相較之下,Semaphore也是用來解決同步問題的一種Data Type, 也有兩個Atomic operation, 分別是Wait()跟Signal, 裡面的方法是利用一個共享的integer變數控制, 所以他可以一次讓多個thread進入critical section。 ``` ## Process and Thread ``` Program: 一個占用Disk space的程式集合 用來解決特定問題 (Passive entity) Process: 一個正在執行的program (Active entity) 為OS分配資源的基本單位 會在memory中有自己的Code/Data/PC/Reg/Stack/Heap 會建立出自己的PCB紀錄 PID/PC/State/Registers... Thread: Light weight process OS 分配CPU time 的基本單位 fast create 不用context swtich 共享資源 -> 要解決同步問題 ------------MinHua Ver.-------------- Process 是 OS 分配 resource 的單位, 相對的 Thread 是 OS 分配 CPU-time 的單位。 Process: 他就是一個正在執行的program。 Thread : 在同一個Process底下,有許多自己的分身,就是Thread。 有了Thread之後,就可以同時做多件事,但他們是共享這個process的global variable。 所以我們必須透過Synchronization來避免race condition的發生。 ``` ## Macro vs Function ``` preprocessing -> compile -> assemble -> link/load Macro在preprocessing階段已置換完成 且#include 是巨集(Macro) 前置處理器指令(Preprocessor directive) (詳情之後會介紹), 它告訴編譯器(Compiler) 這個程式必須使用到 iostream 這個表頭檔(Header file)中的函式 (Function)與類別(Class)定義。 Function是在runtime丟到Stack上 ``` ## (Pipeline) Hazard ``` Structural Hazard: 硬體資源不夠讓多個指令同時用 解法: 增加硬體資源 Data Hazard: 前面的指令要寫入後面的指令要用到的register 但還來不及寫入,下個指令已經在運算了 解法: 塞NOP IF/ID read same as ID/EX write (3 NOP) IF/ID read same as EX/MEM write (2 NOP) IF/ID read same as EX/MEM write (1 NOP) 透過Forwarding把來不及寫入的值傳給要用到的指令 Instruction Reordering Control Hazard: 發生在會修改 Program Counter 的指令(Jump/Branch/else) 然後後面不該被執行的指令會進到pipeline,導致資料錯誤。 (a) stall + NOP (b) predict (c) delayed branch : 在branch instruction之後執行安全的指令, 因為這些安全指令不會因為有沒有jump而影響他的結果。 ``` ## Pipeline 5 stage ``` IF: Instruction Fetch 從program counter指向的memory位址抓指令進來 ID: Instruction Decode 把Instruction的資訊分割成 operand、source resgister、destination register、或address等等 EX: Execute 根據operand做運算 MEM : Memory 看需不需要store or load WB : Write Back 運算完的結果寫回暫存器 ``` ## Interrupt 的種類 ``` (External) Interrupt(外部中斷) : Ex : (I/O Complete Interrupt, I/O Device error) (Internal & Software) Trap : Ex : (Debug、Divide-by-zero、overflow) 使用者程式在執行時,若需要OS 提供服務時, 會藉由System Call 來呼叫OS 執行對應的service routine,完成服務請求後, 再將結果傳回給使用者程式。 ``` ## Deadlock ``` 要死結必須要滿足以下四個條件 1. Mutual exclusion: 一個資源一次只能被一個process所使用 2. Hold and Wait: process取得一個資源之後等待其他的資源 3. No preemption: 資源只能由process自己釋放,不能由其他方式釋放 4. Circular wait: 每個process都握有另一個process請求的資源,導致每一個process都在等待另一個process釋放資源 針對提到的死結必須滿足的條件去做預防 Mutual exclusion: 對不可共用的資源類型而言,互斥一定成立,而可共用的資源類型,因為可以同時讀取相同檔案,所以一定不會產生。 Hold and Wait: process必須保證一個行程在要求一項資源時,不可以佔用任何其它的資源。 No preemption: 只要某個處理元要不到所要求的資源時,便把它已經擁有的資源釋放,然後再重新要求所要資源。 Circular Wait: 確保循環式等候的條件不成立,我們對所有的資源型式強迫安排一個線性的順序。 ``` ## System Call ``` System call 是 user program執行時與OS之間的溝通介面 當user program需要OS提供服務時, 藉由呼叫system call通知OS OS可依據system call ID查表 啟動service routine執行 得到結果,再傳回給user program,完成服務請求 種類 : - Process Control - File Management - Device Management - Information Maintenance - Communication ``` ## Malloc用delete會發生啥? New用free會發生啥? https://www.cnblogs.com/jiayouwyhit/p/3242124.html case1 : new跟malloc配置記憶體空間時會配到不同的heap上,導致malloc用delete,New用free會造成跟A借還給B的情況導致嚴重memory leakage case2 : new 是一個operator,會去contruct一個new object在heap上,必須用delete這個destructor來歸還memory空間,用free的話會清不乾淨導致memory leak ## Process 溝通方式 reference: https://hackmd.io/@YiZjennnnn/OS_Note/https%3A%2F%2Fhackmd.io%2F%40YiZjennnnn%2Fipc_interprocess_communication?type=book ``` Shared Memory: Producer Comsumer Problem (Synchronization problem) Message Passing: 需要一個 message system,必須包含: 溝通方式 (send / receive 的 function call) 溝通管道(communication link) ex: http, Internet, 網路線 passing 會有兩個最基本的 function call:send 和 reveive,各自都還有自己的 buffer 拿來裝 message Sockets: Remote Procedure Calls (RPC) ``` ## Paging ``` Paging是指一種記憶體管理技術, 它將主記憶體分割成大小相等的部分,稱為頁面(page), 同時將虛擬記憶體也分割成相同大小的部分,稱為頁框(page frame)。 當程式需要存取某個虛擬記憶體頁面時, Paging技術將該頁面從磁碟上讀取到主記憶體的空閒頁框中, 並將其映射到該頁框的地址空間中, 以便程式可以直接存取該頁面。 Paging技術可以增加主記憶體的利用率, 並允許更多的程式同時運行。 此外,它還提供了一種保護機制, 以防止程式存取未分配的記憶體區域或其他程式的記憶體。 ``` # Problems ( Network ) ## TCP/IP UDP ``` TCP : 是一種Transport layer協定 透過Flow control,timer,ACK等等來達成可靠的傳輸 他傳輸的資料會確保完整性跟順序性。 適合 : 電子郵件(需要完整性跟順序性) UDP : 是一種Transport layer協定 沒有Flow control,timer,ACK,是一種較不可靠的傳輸協定, 並沒有確保資料的完整性及順序性,但是傳輸速度比TCP快。 適合 : 視訊、多媒體( 少一個frame影響不大 ) IP : IP地址指的是網際網路協定(Internet Protocol)地址。 每個連接網際網路的裝置都會拿到一個,而且都是獨一無二的。 IP地址被用來識別網際網路上的不同裝置。 ``` ## Flow Control v.s Congestion Control https://blog.csdn.net/JMW1407/article/details/107548201 ``` flow control: 作用 : 當接收方來不及處理發送方的數據, 能提示發送方降低發送的速率,防止包丟失。 控制方法 : 接收方在一個視窗都滿了以後才會發送ACK確認並要求發送下一個視窗。 流量控制是由接收方控制的,發送方始終是被迫調整至與接收方同步。 congestion control: 作用 : 防止過多的數據注入網路中,這樣可以使網路中的路由器或鏈路不致過載。 1.擁塞控制所作的都有一個前提,就是網路能夠承受現有的網路負荷。 2.擁塞控制是一個全域性的過程,涉及到所有的主機、所有的路由器 控制方法 : 1.慢開始 ( slow start ) 2.擁塞避免 : AIMD: Additive Increase Multiplicative Decrease // 3.快重傳 // 4.快恢復 ``` ![](https://i.imgur.com/LiRjyKi.png) ## OSI模型 ``` 7.(Application Layer) 提供為應用軟體而設的介面,以設定與另一應用軟體之間的通訊。 例如:HTTP,HTTPS,FTP,SSH,SMTP等。 6.(Presentation Layer) 把資料轉換為能與接收者的系統格式相容並適合傳輸的格式。 5.(Session Layer) 負責在資料傳輸中設定和維護電腦網路中兩台電腦之間的通訊連接。 4.(Transport Layer) 把Transport Header加至資料以形成資料包。 Transport Header包含了所使用的協定等傳送資訊。 例如:TCP、UDP。 3.(Network Layer) 決定資料的路徑選擇和轉寄,將網路表頭(NH)加至資料包, 以形成封包。網路表頭包含了網路資料。 例如:網際網路協定(IP)等。 2.(Data Link Layer) 負責網路尋址、錯誤偵測和改錯。 例如 乙太網、無線區域網路(Wi-Fi)和通用分組無線服務(GPRS)等。 1.(Physical Layer) 負責管理電腦通訊裝置和網路媒體之間的互通。 包括了針腳、電壓、線纜規範、集線器、中繼器、網卡、主機介面卡等 ``` ## 3 way handshake 開始的 ``` [SYN] 我: 哈嚕, 有沒有聽到聲音? [SYN, ACK] A: 有聽到,那我呢?有沒有聽到聲音 [ACK] 我: 有滴~ ``` ## 4 way handshake 用來關閉連線的 ``` 1. (B) --> ACK/FIN --> (A) 2. (B) <-- ACK <-- (A) 3. (B) <-- ACK/FIN <-- (A) 4. (B) --> ACK --> (A) ``` ## stack/heap overflow ![](https://i.imgur.com/qdQgYY3.png) ``` stack:區域變數 儲存函數的區域變數 每一次的函數呼叫就會在堆疊區段建立一個 stack frame heap:動態配置變數 heap 區段的記憶體空間用於儲存動態配置的變數 例如 C 語言的 malloc 以及 C++ 的 new 所建立的變數都是儲存於此。 static 跟 global是另外放的 ``` # Problems ( OOP ) ## 封裝、繼承、多型 ``` 封裝、繼承、多型為物件導向三大基礎 。 此三者具有次序性,沒有封裝就不可能有繼承 、沒有繼承就不可能有多型。 封裝 (Encapsulation) 的目的 是將 Class 裡的屬性用 private 隱藏, 只能透過public的方法存取資料,使開發與維護更容易。 繼承 (Inheritance) 的目的,是 要達到(Code Reuse) 或 ( Interface Reuse )。 透過繼承 可以在衍生的calss中重複使用、擴充和修改這些class定義的行為, 又不破壞原先基底class設計。 多型 (Polymorphism) 指的是不同型態的物件, 定義相同的操作介面,由於被呼叫者 (Caller)有著相同的介面, 呼叫者並不用指定特別型別,只需針對介面進行操作, 實際執行的物件則在runtime決定,藉此增加程式碼的彈性。 class Drink{} class Cola entends Drink{} class Juice entends Drinks{} Drink mydrinks[] = [ new Cola(), new Juice() ] ``` https://www.youtube.com/watch?v=jhDUxynEQRI&ab_channel=CodingwithJohn # MinHua's Problem ( Project ) ## Research Direction ``` 我目前的研究主要分成四大類 首先是Virtual Reality, 主要實作及研究於場景建置及人物基本控制 並去研究VR現在對於人類發展的貢獻。 再來是Deep Learning, 訓練模型來對緊急狀況進行預測,又或是放在對虛擬代理人的訓練上 以及Human-Computer Interaction, 使我們能夠利用自然語言就與虛擬代理人溝通,並與它們協作。 最後是Simulation的部分, 主要實作及研究於行人運動及車輛在交通上的模擬, 以及如何模擬虛擬代理人的視線及情緒 而我目前有幫忙實驗室和國外教授的合作,他們在研究的主要就是對於災難發生時, 虛擬代理人及使用裝置的用戶如何進行逃生的模擬, 以及設計任務路線讓用戶感受到對VR的沉浸感, 或調控虛擬代理人的狀態來看對使用者的影響, 及研究怎麼樣的逃生路線可能是最有效率的。 我往後的碩論方向也會與它們繼續合作並朝這個方向進行研究。 ``` ## Independent Study ( ECG ) ``` 使用了1DCNN及2DCNN的結合來進行心電圖診斷。 我們有一個非常大的動機在我們這個研究 我們希望讓病徵誤判為正常的機率降低 也就是說,我們希望如果病人是有病的,我們不要把他判斷成正常的 所以我們利用hierarchy的方法來實作 如果是有病徵的病例需要經過1DCNN的檢測跟2DCNN的檢測。 而我們也透過小波轉換來進行資料前處理 避免他產生一些我們不需要的雜訊 我們最後的結果是很不錯的 準確率都很高 而且剛剛所提的 也發現abnormal的precision是很高的。 ``` ## Computer Animation ``` 是一個人車互動的電腦模擬。 除了行人與行人自己本身的互動模式,這邊稱Social Force Model 我們也注重在Vehicle Pedestrian Interaction 實作的樣貌主要是透過行人通過馬路,與車子的互動 行人會去判斷車子目前的狀態,像是速度及位置 來去決定現在自己的狀態, 可能是在馬路旁的等待區等待,或是跨越馬路 而反過來車子也是,他去判斷前方行人的速度及位置 去預測行人的state為何 如果偵測到行人正在穿越馬路,則會減慢速度 反之則行駛著最高速度或加快速度。 主要是用unity實作。 ``` ## Computer Graphic ``` 是在風場中的旗幟模擬。 我們實作了一篇論文且對她進行修改及新增自己的做法。 前情提要是 旗幟的模擬我們是透過Mass Spring Model 他有m*n的mass,且之間有spring連接著 主要是論文中有提到 會出現super-elastic effect的情況 是因為他沒有對彈簧限制他的伸長量。 而論文中有提及一個做法 是他在超出彈簧原伸長量的10%時, 藉由強制重設mass的position,讓他只伸長10% 不過這樣會造成一種情形, 就是在模擬的時候,在有些iteration中會產生震盪 因此我們試著在原本的彈力函數上再加上一個ReLU, 如果他超過了原伸長量的10% 我們藉由他超過的趴數,來增加我們的彈力。 而因為彈力會大幅提升,就可以限制彈簧的伸長量不容易超過10% 來達成跟原本論文中相同的效果且具有連續性。 ``` ## Parallel Programming ``` 我們將 未來有可能的棋局 展開變成一棵Tree, 然後在搜尋最佳步伐時利用OpenMP來平行化整個程式, 並搭配Alpha-Beta Pruning,也提出不同的平行化方法並它們進行分析。 假設棋盤現在已經被我們轉化成一顆tree 我們有兩種不同的平行化方法去計算最好的score 一種是Nega Search,一種是PVS Search 差別在Nega是root下所有的node分配給不同的thread PVS是先探索到整棵樹最左邊下面的節點,並分配那一層的node給thread 為的是使工作量更平均,主要是因為我們有使用Alpha-Beta Pruning 使用Nega我們最後可能會有一些thread沒事做, 而一個thread的工作量又是整個subtree,所以他會浪費掉很多時間。 我們也利用了排序的方法來加速search的速度 雖然不可能準確地確定cutoff的位置和發生的頻率。 但有可能知道什麼會導致cutoff發生。 像是吃下棋子棋子升級。 當一方的分數比另一方太過優勢時,就容易產生cutoff。 所以我們將權重高的node移到最左邊,希望能提前去cutoff。 來讓thread可以提早去做其他node的事。 之後去分析我們這兩個平行化方法的效能。 ``` ## 3D Game Programming ``` 這是一個卡牌戰旗遊戲 當初我所負責的是去實作 遊戲地圖的製作 他可以根據地形的不同或是人物放置的位置去形成一個不同的遊戲地圖 及控制角色的動作 以及限制他的回合數跟總步數,來平衡這個遊戲。 主要是在unity裡面利用C#去實作整個專案。 ``` ## Programming Language ``` 我們實作這個Scheme語言的Interpreter 可以宣告一個新變數 可以assign值給變數 可以定義function 可以執行function User input有錯誤的話,會跳出error message告訴user哪裡有甚麼錯 也可以透過cout去印出我們的運算結果 在實作之前,我們有一份文法 我們必須根據這個文法來檢查user的input是否為合法的 做法是先將user的input做tokenization 我會根據Scheme裡面有哪些合法token,或是token間是否有whitespace來做切割 切完後再讓token一一進到文法樹,檢查其合法性 若合法則會將token存到一個list中 並印出這個list的運算結果。 不合法的話會透過try catch,將error msg 往上一層丟,直到最上層就會把error msg印出來 ``` ## Computer Architecture ``` 我們就是利用verilog實作一個簡易的5-stage pipeline 包括加減乘法,load store,這些operand 雖然沒有做到forwarding的方法 但是我們有透過紀錄在pipeline裡的資訊 透過塞NOP去解決data hazard的問題。 ``` ## 負責的部分: ``` - Computer Animation: 我主要負責人車互動的部分,我們大致上擬好架構後, 先將Pedestrian的Script建立起來,之後我們就各自用各自的, 我來進行人車互動,他做行人與行人間的Social Force Model, 最後我再把我做的穿越模式的行人接到他做的行人上, 然後加上Transition Area,讓他會有10%的機率會轉換。 - Computer Graphic: 有大致的架構後,我把Mesh的資料結構建立起來並產生出一個旗幟, 夥伴就用我的架構去做旗幟的模擬Dynamic and Force, 結束後我也做了論文中Dynamics Inverse Constraints的實作。 - Parallel Programming: 我做Search Open Book,然後Generate Move因為有好幾個旗子, 我們把旗子分半,一人做一半的步伐。也實作最後Search及平行化的部分, 而Alpha-Beta Pruning則由我的夥伴去找演算法實作。 - 3D Game Programming: 當初我所負責的是去實作 遊戲地圖的製作 他可以根據地形的不同或是人物放置的位置去形成一個不同的遊戲地圖 及控制角色的動作 以及限制他的回合數跟總步數,來平衡這個遊戲。 主要是在unity裡面利用C#去實作整個專案。 - Undergraduate Research: 我提出hierarchy這樣的一個模型並建置好,其他就是做一些測試的資料, 在中間我曾經有想要對資料集較少的資料做Data Augmentation, 但我試完發現準確率沒有甚麼差別,最後沒有放上來, 原因我覺得可能是我要做的那個資料集跟某一個病徵有點像,導致結果她常常會被分辨錯。 ``` ## 問工作相關問題 ( For Phone Call ) * 可以簡單介紹一下我要面試的這個工作的工作流程嗎? * 請問你們目前有在找113年的研替嗎? * 工作的時段通常會是從幾點到幾點? ## 要問的問題 ( For Interview ) * 我如果進入這個職位我第一個任務會是甚麼? * 部門最看重的能力、及開發時最常使用的語言。 * 這個部門之後的規劃是甚麼? * 如果有幸錄取,依照我目前的學經歷,會建議在接下來這段期間加強哪個部份的技能,或能夠修什麼樣的相關課程讓我以後更容易上手或是有甚麼tutorial之類的可以去研讀或練習。 ## 自我介紹 各位主管好,我是蔡旻樺 我目前就讀於國立陽明交通大學的資訊學院多媒體工程所 研究的方向主要在虛擬實境、深度學習、流體模擬、人機互動的部分 最擅長的語言是C++、C#及Python。 從大學開始,就學期間在課程中開發過許多專案, 有與圖形識別或深度學習有關、 平行化程式設計的效能分析、遊戲、或流體模擬...等等。 這些程式的實作經驗都讓我對於OS、OOP及一些專業知識有更深層的了解。 在專案中會去尋找有沒有能更優化或更合理的解法, 除了確保程式的正確性外也提升這個程式的擴展性。 同時我也會用git來更新及保護我的專案,或者是與隊友協作。 上到大學之後發現程式開發是我非常感興趣的一樣技能, 也一直在鑽研並提升自己在這方面的能力。 如果有幸能進入貴公司,也希望可以藉由這個能力協助產品的優化及開發。 同時,與最一流的人才一同合作,也是我的心之所望。 謝謝! ## English version self-introduction My name is Min-Hua Tsai and I am currently studying at the Master of Multimedia Engineering of Computer Science at the National Yang-Ming Chiao-Tung University. My research focuses on virtual reality, deep learning, fluid simulation, and human-computer interaction. My strongest programming languages are C++, C#, and Python. I have developed many projects during my studies, such as image recognition or deep learning, performance analysis of parallel programming, games, or fluid simulation, etc. These programming experiences have helped me gain a deeper understanding of OS, OOP, and some professional knowledge. In my projects, I will look for ways to optimize or find more reasonable solutions. In addition to ensuring the correctness of the program, I will also improve its scalability. I also use git to update and protect my projects, or collaborate with my teammates. Since I entered university, I have found that programming is a skill that I am very interested in, and I have been working on improving my abilities in this field. If I have the opportunity to enter your company, I hope to use this ability to assist in the optimization and development of products. At the same time, it is also my desire to work with the best talents. ## 要問的問題: - 部門最看重的能力、及開發時最常使用的語言。 - 如果有幸錄取,依照我目前的學經歷,會建議在接下來這段期間加強哪個部份的技能,或能夠修什麼樣的相關課程讓我以後更容易上手或是有甚麼tutorial之類的可以去研讀或練習。 ## 合作經驗,合作不愉快, 困難, 如何解決 合作經驗,我覺得我最會帶給大家一種和樂的氣氛,並去認識團隊中的每一個人,了解他們的個性他們的強項,來判斷這個人在這次的專案中適合什麼樣的位置。尤其在交大會常常遇到很多頂尖人才,他們對一些看法常常會有不同的想法,語氣可能甚至會讓人感到不愉悅,撇除這點,我還是會很客觀地去聽取它們的意見,並深度的瞭解和提問它做這件事情的動機,我會思考完並跟他說我對這個想法的看法,讓他覺得它的看法有被別人重視,但反之,對於這個部份我也有我的意見,在認為她的想法被重視過後,通常他也會對我所提的意見給出他的想法,就算沒有,我也會詢問他的想法,這樣的良性溝通我覺得是比較好的。 最怕的是某個成員完全沒有出現或是只出現一下子,曾經我們就果斷踢出這個成員並與教授提出,但他也沒有回來與我們進行交流,雖然增加了很多工作量,但至少Milestone重新設定好,我們就可以繼續這個專案的製作。 ## 優點: 不會介意去問別人問題,問人家這件事情是不用覺得不好意思地,因為術業有專攻,每個人都有自己擅長的領域,只要有禮貌地問一下,通常都會很快拿到解答,也增加效率,事後也會好好的感謝人家並告訴別人他給你多大的幫助,讓幫助我的那個人知道他的幫助是很有意義的。 對於到手的任務總是抱持著勢在必得,絕對可以完成的心態去進行。 ## 缺點: 對於某件事情投入就會花費非常大的心力去處理,導致可能一整天都在用同一個東西。不過同時間可能會有很多事情接二連三的來,雖然我會清楚地記下每件事情的deadline,但我想我應該要學會將時間好好的分配給所有的工作,讓他像是一個Time Sharing的感覺,這樣我就可以用空餘時間,搞不好洗澡的時候我都可以去想其他事情怎麼樣做比較快,而不是整天都只想著某一件事,會變得比較沒有效率。 ## 職涯目標 短期目標: 跟隨公司持續專研最新的專業知識,並且目標成為一位積極、高效且善於團隊合作的工程師。 中期目標: 期許自己能夠有負責專案的能力,並也能夠有效整合專案內成員的意見及產出。 ## 面對衝突: 在發表自己意見時,習慣於先聆聽他人的意見,消化並且理解可能優缺點後,在提出自己的觀點。對方在感到被尊重的情況下,比較有機會進行有意義的討論 ## 新事物、技能的學習: 由於要學的新事物真的很多,若是花太多時間整理自己所應該要學習什麼的資訊,可能會因為數量太多而卻步。 我的作法是不管多小多瑣碎,就先去試試看,試了學了發現遇到問題,在由問題點去作延伸學習。不過若是有找到系統性的教學教材,在時間允許之下有系統的整個學習也是很好的 ## 如何和指導教授溝通想法: 關鍵在於要先快速而準確地知道教授所想表達的意思,在來是提出的問題必須是經過縝密思考(是否有顯而易見的漏洞或是不合哩,應該避免於討論中才發現),大方向邏輯正確,如此才能進行有意義的討論 ## 最有成就感 碩一的時候有一兩個禮拜非常忙,我修四門課,四門課的期末作業同時來,同時也在幫教授寫計畫書跟實作一個教授希望我們碩一新生實作出來的論文。雖然真的很累,是最常遇到天亮的一兩個禮拜,但我把所有的事情都一一完成,而且我認為結果並不馬虎,結束後我覺得我是可以同時做到這麼多事情的,希望在以後的時間規劃上可以更好更有效率。 # Kuanyu Problem ## Programming language 我們的教授希望我們實作出一個語言的直譯器,那因為我自己比較有興趣的關係,所以我實做了2種語言的,分別為C與Scheme的Interpreter 下圖為OurC interpreter的demo 可以宣告一個新變數 可以assign值給變數 可以定義function 可以執行function User input有錯誤的話,會跳出error message告訴user哪裡有甚麼錯 也可以透過cout去印出我們的運算結果 在實作之前,教授會先給我們一份文法 我們必須根據這個文法來檢查user的input是否為合法的 做法是先將user的input做tokenization 我會根據C裡面有哪些token,或是token間是否有whitespace來做切割 切完後再讓token一一進到文法樹,檢查其合法性 若合法則會將token存到一個list中 不合法的話會透過try catch,將error msg 往上一層丟,直到最上層就會把error msg印出來 ### 問啥 薪水、福利 加班狀況 我能夠為你們解決什麼問題? 做事方式(例如版控、軟工、專案管理、測試、Code review) PM或其他同事的狀況 會接觸到的技術與深度 要找的是資深還是新人? 你希望找什麼樣的人?對我的要求是什麼? 我們現在談的工作內容,會不會我進去後會不一樣?為什麼? 可以詳細描述一下這個職位的一天嗎? 這個職位需要on call嗎? ### 人格特質 ##優點: 我是一個負責任的人,如果遇到一個問題遲遲無法解決,會不斷的去做嘗試,直到問題被解決。問題當日無法解決得話,我會遲遲無法入睡,也會不斷的去思考,過程中如果有點想法的話,也會起床去實作看看這麼做是否行的通。 我的英文能力不錯,上網找外國資料可以快速的閱讀,或是可以去聽一些印度人的英文講解來快速作學習。 ##缺點: 對於某件事情投入就會花費非常大的心力去處理,導致可能一整天都在用同一個東西。但同時間可能會有很多事情接二連三的來,雖然我會清楚地記下每件事情的deadline,但我應該學習去更有效的去分配我的時間,而不是永遠卡在同個問題上,導致沒有效率的完成每件事情。 ##合作經驗: 我認為要有一個好的好的合作經驗就必須要有好的團隊氣氛與默契。在團隊裡面,我可以同時是個稱職的組長也可以是個負責任的組員。當這個專案是我比較熟悉的領域的話,我可以擔任組長,並有效的把工作分配給具備完此能力的人,讓此專案可以有效率的進行。但當此專案為我較不熟悉的領域的話,我會選擇去當一個負責任的組員並努力去學習,像是上網查資料及看教學影片來精進自我,來讓自己具備完成工作的能力。 ##面對衝突: 先冷靜自己的情緒並聆聽對方想表達的意見,聽完後再慢慢消化對方的意見的優點與缺點,最後等對方的情緒也比較緩和時再提出自己的觀點。 ##要問的問題: 各部門最看重的能力、及開發時最常使用的語言。 如果有幸錄取,依照我目前的學經歷,會建議在接下來這段期間加強哪個部份的技能,或能夠修什麼樣的相關課程讓我以後更容易上手或是有甚麼tutorial之類的可以去研讀或練習。 ##職涯目標 短期目標: 先熟悉自己的崗位,努力去彌補自己所缺乏的知識,並成為一個負責任,有效率的工程師 中期目標: 期許自己能夠有獨立管理一個專案,除了能有效率的完成自己的份內工作,還可以有效的做調度,讓專案可以順利進行 ##最有成就感 ##最挫折的困難