# 2023 年「資訊科技產業專案設計」作業三
## 工作職缺
### [TSMC - Taiwan_IT Engineer](https://careers.tsmc.com/zh_TW/careers/JobDetail?jobId=331&source=External%2BCareer%2BSite)
:::spoiler **Responsibilities**
- Development and integration of Factory Automation Systems.
- Development and integration of Advanced Technology.
- Development and integration of Office Automation Systems.
- Development and integration of Cloud Computing, Kubernates or BigData Analytics Systems.
- Build/Development Scalable Platform for managing container applications.
:::
:::spoiler **Qualifications**
- Major in IT, Computer Engineering, Software Engineering, Computer Science or related fields.
- Familiar with development of C/C++ or JAVA Programming.
- Familiar with Microservices Architecture Pattern, DevOps.
- Familiar with Web Applications for PC and Mobiles.
- Familiar with Hadoop, Spark and Parallel Computing.
- Candidates with multiple skill sets listed above is a plus.
- Experience in large-scale system integration, cloud computing, and social networking for factory automation is a plus.
- Self-motivated, integrity, and result-oriented personality.
:::
### [Appier - Software Engineer, Backend Development](https://boards.greenhouse.io/appier/jobs/1588292)
:::spoiler **Responsibilities**
- Developing and operate scalable, reliable, and maintainable service-based softwares and related components.
- Cowork with team members to design system architecture, choose proper technologies, and plan development.
- Design & develop server-side architecture & function logic of new services.
- Design and maintain database schemas for new services.
- Ensures the scalability of the system.
- Ensure the high performance of responsiveness to requests from the front-end.
- Integrate the front-end modules built by your coworkers into new services.
- Responsible for laying the foundation for the platform as well as proposing solutions to ease software development, monitoring of software, etc.
- Profiling and performance tuning of critical components.
- Deploy system to production and monitor service health.
- Participate in idea brainstorming and contribute ideas to technology, algorithms, and products.
- Participate on-call rotation within Backend team to ensure product reliability and scalability.
:::
:::spoiler **Basic qualifications**
- BS/BA degree in Computer Science or related field with 3+ years experience in related industry
- Ability to build web services on Linux.
- Good at any of the listed language: Python/Scala/Go/Node.js/Java.
- Good knowledge of Network API Design ( e.g. REST or GraphQL).
- Good understanding of any SQL/NoSQL database (MySQL / MongoDB / Redis / etc.)
- Familiar with git.
- Team player and able to work independently.
- Proactive, good interpersonal and problem-solving skill.
:::
:::spoiler **Preferred qualifications**
- MS degree in Computer Science or related field.
- Good at profiler and debugging tools.
- High performance network service on Linux.
- Design and architect large scale distributed system.
- Design and implement distributed algorithm and data structure.
- Familiar with HTML and Javascript.
- Familiar with Nginx / HAProxy.
- Familiar with operation automation tool (such as Ansible).
- Familiar with continuous integration / continuous deployment
- Familiar with monitoring and alert system (Prometheus / Nagios).
- Familiar with functional programming.
- Familiar with Amazon Web Service or Google Compute Engine.
:::
### [Mobagel - Software Engineer, Backend](https://mobagel.com/tw/blog/2022/03/core-tech-software-engineer-軟體工程師(此職務提供實習計畫))
:::spoiler **Responsibilities**
1. Maintain Decanter AI, our flagship analytics product, and develop new features.
2. Build CI/CD flow to maintain product stability.
3. Co-work with data science team to derive new functionalities.
:::
:::spoiler **Basic qualifications**
- Bachelor degree or above in computer engineering/computer science or related fields.
- Experience with Linux based OS (CentOS, Ubuntu, Arch Linux, etc.).
- Experience with an OS scripting language.
- Knows Python.
- Experience with non-trivial Python package (e.g. Jinja2, Pandas, FastAPI, Flask, etc.).
- Experience with containerization technology.
- Experience with database and caching services.
:::
:::spoiler **Preferred qualifications**
- Experience working with complex software systems.
- Experience verifying the correctness of an asynchronous program or parallel program.
- Ability to share experience with junior members and help them grow.
- Knowledge of machine learning algorithms and data processing techniques.
- Experience with DevOps.
- Experience with functional programming.
:::
### [Google - Software Engineer, Full Stack, Google Cloud](https://www.google.com/about/careers/applications/jobs/results/92065324146270918-software-engineer-aiml-learning-platform)
:::spoiler **Responsibilities**
- Write product or system development code.
- Participate in, or lead design reviews with peers and stakeholders to decide amongst available technologies.
- Review code developed by other developers and provide feedback to ensure best practices (e.g., style guidelines, checking code in, accuracy, testability, and efficiency).
- Contribute to existing documentation or educational content and adapt content based on product/program updates and user feedback.
- Triage product or system issues and debug/track/resolve by analyzing the sources of issues and the impact on hardware, network, or service operations and quality.
:::
:::spoiler **Basic qualifications**
- Bachelor’s degree or equivalent practical experience.
- Candidates will typically have 2 years of experience with software development in one or more programming languages, or 1 year of experience with an advanced degree.
- Typically 2 years of experience with data structures or algorithms.
- Typically 2 years of experience with full stack development, across back-end such as Java, Python, GO, and/or C++ codebases, and front-end experience including JavaScript and/or TypeScript, HTML, CSS or equivalent.
:::
:::spoiler **Preferred qualifications**
- Master's degree or PhD in Computer Science or related technical field.
- Experience developing accessible technologies.
:::
## 專業上匹配程度評估
### 需要能力
- 熟悉基於Linux的作業系統(如CentOS,Ubuntu,Arch Linux等),在 Linux 上有構建 Web 服務的能力
- 雲端技術 (e.g., AWS, GCP, Azure)
- 系統設計:支援高流量的大規模分散式網路服務系統(scalable and reliable)
- 資料庫:schema design、索引、快取(Redis 或 memcache)、locking、relational(例如 PostgreSQL)、no sql(例如 MongoDB)、scalable、reliable
- 程式語言: Python, Go, Node.js, JAVA or TypeScript
- 其他技能:git, linux (shell script), docker, CI/CD
- Network API design:REST, GraphQL, gRPC
- 具有物件導向設計概念
- Web 伺服器 (nginx), 負載平衡器 (haproxy)
- 分析和壓力測試
- parallel programming, async programming
- 擁有團隊合作精神,主動積極,具有良好的人際交往和解決問題的能力。
### 自我評估
- [resume](https://docs.google.com/document/d/1KdCiPewbavO0kuZcjygmX4mh9HVoBNxdLBUyw8Gu69Y/edit?usp=sharing)
- 程式語言:C/C++、Python、JavaScript、Dart
- soft skill
- 溝通能力
- 主持小型專案,負責與教授、語音辨識技術團隊、語音合成技術團隊以及NLP技術團隊進行有效的溝通合作
- 團隊合作
- 同領域:使用 Git 與其他開發人員團隊合作進行專案
- 跨領域:與 UI/UX 設計師合作設計開發 APP
- 相關經驗
- 熟悉基於 Linux 的作業系統:修過`Linux核心實作課程`並撰寫專案,也有在 Linux 上使用 Docker 構建 Web 服務的經驗
- 用 Python(使用 Selenium 和 BeautifulSoup)寫網路爬蟲,將資料存入 MySQL 資料庫,並使用 Flask 建立 RESTful API
- 透過 crontab 自動化任務,每日自動抓取新聞資料,再運用 NLP 技術進行深度資料分析
- 擅長使用 Vue.js 搭配 Flask 來開發網頁應用程式
- 使用 Flutter 框架經驗
- 實驗室內部錄音 APP:透過前端錄音功能搜集語料,將語料放置伺服器,並存放路徑至 MongoDB 資料庫
- 擔任 Flutter 教學助教:建立後端 API 連線 SQLite ,並實作即時語音合成以及語音辨識功能
- 欠缺經驗
- 實習或相關工作經驗
- 高流量網路應用 (loadbalancer)
- AWS 雲端技術
- 資料庫索引:Redis
- 其他 API design:GraphQL, gRPC
- 壓力測試和分析
- 英文口說能力須加強
- 校友交流(linkedin聯絡)
- 在面試時,面試官主要是想了解你處理事情的思維和溝通能力,在遇到問題時會如何解決。
- 在考白板題時一定要與面試官討論,讓他了解你的想法和討論,不要一開始就直接解題。
- 了解自己職業生涯想發展的領域,將技能著重在這些領域,不要盲目地找工作。
- 如果面試的結果不好,不要灰心,不一定是你的能力不好,也許是你和面試官的理念不同,或是你疏忽了一些細節,面試後記得檢討並在下一個面試中改進。
## 模擬面試
> 🧔:interviewer 👶:interviewee
>
🧔: LiChiiiii 你好,今天想請你幫我設計一個社群平台,實現使用者發布、閱讀純文字的貼文和互相追蹤功能。
👶: 好的,我想更了解功能需求,總共下列三種基本功能
```
1. 使用者可以發布純文字的貼文
2. 使用者可以閱讀他有追蹤的朋友貼文以及自己過去的貼文,並且由新到舊排序
3. 使用者可以追蹤其他使用者。一旦追蹤,那個人的推文就會顯示在自己的動態上
```
🧔: 對,假設我們只單純實行這三個基本功能,你會如何設計資料的儲存?
👶: 如果使用最單純的作法,我們可以用資料庫來儲存所有資料,資料庫裡面會有兩個 table,其中一個存放所有的貼文,它的 schema 是
```
Post ID <Primary Key>
Content
Time
User ID <Foreign Key>
```
其中 `User ID` 為 Foreign Key 用來建立與另一個 table 之間的關係,而另一個 table 就是存放所有使用者的資料,它的 schema 是
```
User ID <Primary Key>
Follower: a list
```
🧔: 那要如何完成上述的功能呢?
👶: 首先是發布貼文,只要前端發佈一個 HTTP `POST` 請求,並將資料插入至存放所有貼文的 table 即可。
👶: 接著我們透過 HTTP `GET` 請求,從資料庫 query 出所有符合該 user ID 的貼文,以及此 user 所有符合該 user follower ID 的貼文,並按照 `time` 欄位順序由最新到最舊排序回傳給前端,使用者即可看到追蹤的朋友貼文以及自己過去的貼文。
👶: 最後是追蹤其他使用者,前端傳送 HTTP `POST` 請求,並改動該使用者的 `follower` 欄位。
🧔: 雖然確實可以完成三個基本功能,但這個方法是否有缺點?
👶: 有的,理論上存放貼文的 table 會越來越大,大部份使用社群軟體的人都是以閱讀為優先,每次使用者要閱讀時我們都要查詢這個巨大的 table ,這樣顯然速度會很慢。
🧔: 那是否有更好的方法可以實作,改善這個問題?
👶: 這部分要先釐清要優化的目標與應用場景的特性。像是在 Instagram 這類社群平台,不需要非常即時的閱讀到最新貼文,只需要在合理的時間範圍內顯示最新貼文即可,也就是可以使用 eventual consistency 的概念去設計資料的取得。而像是在 Line 這類的專門主打聊天的應用程式就會有即時看到訊息的需求。
🧔: 今天請你設計的社群平台像是 Instagram 的場景,你會如何改善你的設計呢?
👶: 考慮到使用者人數眾多,所以需要一台 load balancer 來負責分配流量,接著我們會有很多的儲存節點,分散在世界各個主要區域,以減少存取的 lattency。
👶: 另外使用類似 Redis 這樣的 memory database,它專門用於加速對於常用資訊的存取。它可以儲存所有 user 的時間軸,也就是說當有使用者想要查看自己的動態時,我們可以藉由其使用者的 user ID 迅速找到相應的 table,並返回所需的內容。
🧔: 但使用者數量龐大,要如何有效的找到對應的 table?
👶: 可以建立一個 hash table,key 是 User ID, value 是 table ID 來實現快速查找,這樣的時間複雜度只會是 `O(1)` 。
🧔: 聽起來這樣的設計會需要龐大的儲存空間。
👶: 對的,這個方法等於是用空間換取時間,所以會需要很大的 memory ,但因為這裡的場景是設定貼文為純文字,所以這個問題不會放大,而這樣的設計會比原先我單純提出的資料庫設計更適合此系統,且更具有擴展性。
🧔: 很好的解釋,今天的面試到這裡,感謝你的參與。
👶: 謝謝。