# **趨勢科技面試準備** 職稱:Software Engineer/Software Engineer in Test ## 英文自我介紹重點 - I graduated from NSYSU last year, and I majored in CSE. During my university years, I participated in several team projects. - I was always the leader of the development team beacuse I am a responsible person, who will make all-out effort in order to complete the project successfully. - I am willing to learn something new, if that can help me improve the quality of my work, or just to satisfy my curiousity. For instance, while I was developing my graduation project, I chose Unity Engine as the development tool mostly because my teammates and I were kind of interested to it. I even did some research on the navigation algorithm in order to find the most efficient one for my project. - In most cases, I write code in C/C++. C#, Python and Java are the other languages that I had written. I also had some experiences in writing Linux shell script, setting up a MySQL/MSSQL server. - I had taken a course called "Hack technology". The course includes some topics like ARP spoofing, Man-in-the-middle attack, DDoS. It was honestly sort of difficult for me to understand all of them at that time, but that course actually made me interested in information security. This is the reason why I want to work for Trend Micro, aka the biggest Taiwan computer and network security company. - Although I just graduated from the university, I shall utilize my skills and knowledge when I get this position. - 隨☆機☆應☆變 (<ゝω・) ☆ ## 「你有什麼問題想問的嗎?」 參考: https://www.ptt.cc/bbs/Soft_Job/M.1539373883.A.238.html 1. 薪水、福利 1. 加班狀況 2. 我能夠為你們解決什麼問題? 3. 做事方式(例如版控、軟工、專案管理、測試、Code review) 4. PM或其他同事的狀況 5. 會接觸到的技術與深度 6. 要找的是資深還是新人? 7. 你希望找什麼樣的人?對我的要求是什麼? 8. 我們現在談的工作內容,會不會我進去後會不一樣?為什麼? 10. 可以詳細描述一下這個職位的一天嗎? 11. 這個職位需要on call嗎? ## QA應測試之項目 ### Numerically based 1. good values of different types (i.e. positive, negative, zero) 2. boundary conditions 3. maximum, minimum 4. outside of max and min 5. gaps in domain (i.e. prime numbers, even numbers, etc). ### String based 1. delimiter problems (missing or too many) 2. mixed case (hello, Hello, HeLlo) 3. input is too long for string 4. input has white space or other delimiter ### File based 1. file exists and contains correct data 1. file exists but data is wrong type/format 1. file exists but is empty 1. file exists but is corrupt 1. file does not exist ### Logic based 1. Boolean values of 0/false, 1/true, and something else (e.g. 7/Hello) 1. ensure nested statements are tested thoroughly 1. case statements should test all conditions (including ELSE clause) ### Loops 1. ensure entering condition of loop is true 1. are exit values what are expected? 1. is the loop exited at the correct iteration 1. loop body executes zero, once, or multiple times ### Data structures and pointers 1. ordered data structure 1. first element added/removed 1. middle element added/removed 1. last element added/removed ### unordered data structure 1. empty structure 2. single item 3. multiple items 4. full structure 5. duplicate items ### pointers 1. nil 2. pointer is not nil (i.e. points to object) 3. two pointers pointing to same object (e.g. pointers A and B point to object X) 4. pointer to a list of multiple objects ## Thread vs. Process ### Program: 一群程式碼的集合,用以解決特定的問題。以物件導向的觀念來類比,相當於Class。 ### Process: 由Program所產生的執行個體,一個Program可以同時執行多次,產生多個Process。以物件導向的觀念來類比,相當於Object。每一個Process又由以下兩個東西組成: - 一個Memory Space。相當於Object的variable,不同Process的Memory Space也不同,彼此看不到對方的Memory Space。 - 一個以上的Thread。Thread代表從某個起始點開始(例如main),到目前為止所有函數的呼叫路徑,以及這些呼叫路徑上所用到的區域變數。當然程式的執行狀態,除了紀錄在主記憶體外,CPU內部的暫存器(如Program Counter, Stack Pointer, Program Status Word等)也需要一起紀錄。所以Thread又由下面兩項組成 - Stack:紀錄函數呼叫路徑,以及這些函數所用到的區域變數 - 目前CPU的狀態 ### Thread - 一個Process可以有多個Thread。 - 同一個Process內的Thread使用相同的Memory Space,但這些Thread各自擁有其Stack。換句話說,Thread能透過reference存取到相同的Object,但是local variable卻是各自獨立的。 - 作業系統會根據Thread的優先權以及已經用掉的CPU時間,在不同的Thread作切換,以讓各個Thread都有機會執行 ### fork() vs. Thread - A fork gives you a brand new process, which is a copy of the current process, with the same code segments. As the memory image changes (typically this is due to different behavior of the two processes) you get a separation of the memory images (Copy On Write), however the executable code remains the same. Tasks do not share memory unless they use some Inter Process Communication (IPC) primitive. - One process can have multiple threads, each executing in parallel within the same context of the process. Memory and other resources are shared among threads, therefore shared data must be accessed through some primitive and synchronization objects (like mutexes, condition variables and semaphores) that allow you to avoid data corruption. ### Deadlock 在多執行緒中(Multithreading),兩個執行緒若同時存取或改變全域變數 (Global Variable),可能會發生同步(Synchronization)問題。若執行緒之間互搶資源,則可能產生死結 (Deadlock)。 死結的四個條件是: - 禁止搶占 no preemption - 系統資源不能被強制從一個行程中登出 - 持有和等待 hold and wait - 一個行程可以在等待時持有系統資源 - 互斥 mutual exclusion - 只有一個行程能持有一個資源 - 迴圈等待 circular waiting - 一系列行程互相持有其他行程所需要的資源 死結只有在這四個條件同時滿足時出現。預防死結就是至少破壞這四個條件其中一項,即破壞「禁止搶占」、破壞「持有等待」、破壞「資源互斥」和破壞「迴圈等待」。 ### Inter-Process Communication 兩個行程或執行緒間傳送資料或訊號的一些技術或方法。 | 方法 | 提供方(作業系統或其他環境) | | -------- | -------- | | 檔案 | 多數作業系統 | | 訊號 | 多數作業系統 | | Berkeley通訊端 | 多數作業系統 | | 訊息佇列 | 多數作業系統 | | 管道 | 所有的 POSIX 系統, Windows | | 命名管道 | 所有的 POSIX 系統, Windows | | 號誌 | 所有的 POSIX 系統, Windows | | 共用記憶體 | 所有的 POSIX 系統, Windows | | Message passing(不共用) | 用於MPI規範,Java RMI、CORBA、MSMQ、MailSlot以及其他 | | Memory-mapped file | 所有的 POSIX 系統, Windows | ## 虛擬記憶體 虛擬記憶體是電腦系統記憶體管理的一種技術。它使得應用程式認為它擁有連續可用的記憶體(一個連續完整的位址空間),而實際上,它通常是被分隔成多個實體記憶體碎片,還有部分暫時儲存在外部磁碟記憶體上,在需要時進行資料交換。與沒有使用虛擬記憶體技術的系統相比,使用這種技術的系統使得大型程式的編寫變得更容易,對真正的實體記憶體(例如RAM)的使用也更有效率。 注意:虛擬記憶體不只是「用磁碟空間來擴充實體記憶體」的意思——這只是擴充記憶體級別以使其包含硬碟機而已。把記憶體擴充到磁碟只是使用虛擬記憶體技術的一個結果,它的作用也可以通過覆蓋或者把處於不活動狀態的程式以及它們的資料全部交換到磁碟上等方式來實現。對虛擬記憶體的定義是基於對位址空間的重定義的,即把位址空間定義為「連續的虛擬記憶體位址」,以藉此「欺騙」程式,使它們以為自己正在使用一大塊的「連續」位址。 現代所有用於一般應用的作業系統都對普通的應用程式使用虛擬記憶體技術,例如文書處理軟體,電子製表軟體,多媒體播放器等等。老一些的作業系統,如DOS和1980年代的Windows,或者那些1960年代的大型電腦,一般都沒有虛擬記憶體的功能——但是Atlas,B5000和蘋果公司的Lisa都是很值得注意的例外。 那些需要快速存取或者反應時間非常一致的嵌入式系統,和其他的具有特殊應用的電腦系統,可能會為了避免讓運算結果的可預測性降低,而選擇不使用虛擬記憶體。 ## OSI模型 - 第7層 應用層 應用層(Application Layer)提供為應用軟體而設的埠,以設定與另一應用軟體之間的通訊。例如: HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等。 - 第6層 表達層 表達層(Presentation Layer)把資料轉換為能與接收者的系統格式相容並適合傳輸的格式。 - 第5層 會議層 會議層(Session Layer)負責在資料傳輸中設定和維護電腦網路中兩台電腦之間的通訊連接。 - 第4層 傳輸層 傳輸層(Transport Layer)把傳輸表頭(TH)加至資料以形成資料包。傳輸表頭包含了所使用的協定等傳送資訊。例如:傳輸控制協定(TCP)等。 - 第3層 網路層 網路層(Network Layer)決定資料的路徑選擇和轉寄,將網路表頭(NH)加至資料包,以形成封包。網路表頭包含了網路資料。例如:網際網路協定(IP)等。 - 第2層 資料連結層 資料連結層(Data Link Layer)負責網路尋址、錯誤偵測和改錯。當表頭和表尾被加至資料包時,會形成影格。資料連結串列頭(DLH)是包含了實體位址和錯誤偵測及改錯的方法。資料連結串列尾(DLT)是一串指示資料包末端的字串。例如乙太網、無線區域網路(Wi-Fi)和通用分組無線服務(GPRS)等。 分為兩個子層:邏輯鏈路控制(logical link control,LLC)子層和媒介存取控制(media access control,MAC)子層。 - 第1層 實體層 實體層(Physical Layer)在局部區域網路上傳送資料框(data frame),它負責管理電腦通訊裝置和網路媒體之間的互通。包括了針腳、電壓、線纜規範、集線器、中繼器、網卡、主機介面卡等。