# 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 ,但因為這裡的場景是設定貼文為純文字,所以這個問題不會放大,而這樣的設計會比原先我單純提出的資料庫設計更適合此系統,且更具有擴展性。 🧔: 很好的解釋,今天的面試到這裡,感謝你的參與。 👶: 謝謝。