Jun-Wei Huang
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    --- tags: interview --- ## 要放在 104 上的簡介 雖然以往都是掛後端工程師,但我前後端都會。 「會」指的是: ### 一、在前端方面: 1. 按設計稿切出一模一樣的網頁(嗯…但如果缺字體或者圖層沒有分開,臣妾還是做不到的 🤣)。 2. 按照前端框架(現在是用 Nuxt 3)傳統,把每個元素擺在它應該擺的地方。 3. 使用應該還算主流、語意化的元件 — Vuetify(遵循 Material Design)。 另外,在前端方面,一些特別想堅持的點是: 1. 既然現代的框架致力於簡化開發所須要的編譯設定,會想儘量避開特別設置 gulp、webpack 之類的事情。 2. 同樣是 Vue,選用 Nuxt 3 而不是用 Vue CLI,因為它簡化了大部分設定的工作,甚至路由編排也能透過令檔案命名符應規則實現。 3. 生命苦短,不要再 jQuery、Bootstrap ,或是作一些沒有前後端分離的事情。 > 註:我覺得有一個指標能夠判斷你是不是真的有從 Nuxt 2 Migrate 到 Nuxt 3,就是 「Ref」。比起以往 Nuxt 2 搭配 Vuex 存狀態,透過 Composables 管理狀態自由很多,所以真的可以不用用上 Pinia,真的。還有就是 setup 的寫法讓 .vue 的 script 看起來清爽許多,支援 TypeScript 讓編譯氣能檢查,編輯器能自動完成等。 ### 二、在後端方面: 過去工作經歷對外的 title 都是 PHP 工程師。PHP 接觸過 Codeigniter 2、Laravel、Magento(這個怪物級的 Framework 當時候只有入門一下下)、Fatfree、ThinkPHP、Phalcon,也曾基於 WordPress 作佈景主題和外掛開發。待過接案公司、行銷公司、電商、遊戲公司及影音平台。 在接案公司時基本了解了 Web 這個領域工作上的劃分,專案或產品的生命週期。 有短暫迷戀過 PSR-4 的 Vanilla PHP、Valnilla JavaScript,短暫地與 ES6 和 CSS3 保持距離。 在行銷公司做過的活動網站雖然生命週期短但流量可觀。特別注重 Transaction 和索引,在多主機之間共享 Session。除了快取,儘量把非同步處理的事件塞到 Queue 去(用 Redis 當 Queue)。做的事情又進一步延伸嘗試實現 Multi Tenancy 以及如何做出一個足夠彈性好客製化的公版及不同專案可以共用的模組上。 也做過彙整 GA 蒐集到的資料,將它們轉換為對行銷工作有意義的訊息(像是什麼 7 日活躍用戶、沉默用戶,或是觀察用戶所在的地區、使用的裝置)。當時整理 GA 資料取徑的是透過 MySQL Trigger,整理成時、日、週、月報表。現在有各式各樣的 CDC 了,相信會好做些,程式碼也比較能進版本控管。 後來有一陣子,著迷於設計出能夠擴展、可靠的基礎設施(k3d、Skaffold、Keel、Helm…),以及思考類似軟體設計本體論的東西(看很多 DDD 和設計模式的書)。也剛好那陣子待的公司想要嘗試這些技術,所以有在工作上用到。可是每個人一天都是 24 小時,對這類工作投入越多的時間,對其他方面就會變得沒那麼熟悉(新買的 Mac 連 k3d 都還沒裝過)。 ### 三、其他: 對於 Python 上 async/await 相關的操作滿熟悉的,也在用 Python 做爬蟲的過程中實現 Consumer/Producer,並且用 ProcessPool 去消化 Task。爬蟲的話,從早期 jsdom、cheerio、phantom.js,到 Selenium、Puppeteer 等都接觸過,不過畢竟不是專精在這方面,再細一點的繞過反爬蟲的方式就沒特別研究。 早些年在大學念書的時候,還沒有像 docker、k8s 這些容器化技術,待的學校也沒有開設機器學習、深度學習的課程。但是基於技術狂熱(可能對別人也不算多),在工作之餘都有試著去接觸(k8s 上過工研院的課,用的是 Rancher,深度學習上的是公部門的職訓,但是學的不深)。 ### 四、作品 作為後端工程師有一點很可惜的是我們在功能方面的努力很難直接有具體的畫面可以呈現給別人,又由於公司經手過的專案要為保護所以都不能與外人道,只能儘量擠出 Side Projects…。這裡,因為自己做專案,沒辦法維護很複雜的架構,或者租貴鬆鬆的服務,所以我是選用 Firebase 全家餐,搭配 Algolia 的免費額度,擺在 Netlify 上。 #### 羽球開團/報名網站 ![image](https://hackmd.io/_uploads/rkGvQR5pT.png) 做的事情大概是: 1. 後台能夠開團,前台能夠報名。 2. 報名後,團員可能會被錄取,或從請球團管理員幫忙從後台取消,也可以自己取消報名。報名後球團管理員會收到通知。錄取後,團員會收到通知。 3. 錄取後,團員還是能自行取消,但這時候會通知管理員。 4. 錄取的結果,會即時顯示在前台(不用重新整理畫面),並且會顯示通知。 5. 出席情況會有人數、程度的統計。 6. 確定錄取的團員,可以在前台的頁面上點歌(串 Spotify,這個介面我自己覺得做得有點酷炫)。 ##### 核心功能 https://gitlab.com/z411392/new-boyholic-badminton-api 核心功能是用 Apollo Server 做,清楚分出「命令」和「查詢」,並且保持每個參數都有明確的型態定義,並且有用到什麼宣告什麼(節省傳輸量)。透過劃分模組切分出不同領域,不同模組間不直接呼叫,而是透過 ApolloServer 執行 GraphQL,確保之後模組可以自主的佈署在不同的物理環境。 > 比較特別的是: > 1. 譬如通知這件事情,是透過 pubsub 切出去,不用擠在同一個 Request/Response 回應。 > 2. 透過 Firestore 的對資料異動監聽功能,把 Projection/Event Handler 切出去,使它成為一個在語意上獨立的單元。 ##### 後台 ![Screenshot 2024-03-07 at 16.38.31](https://hackmd.io/_uploads/Hyqo0eDpT.png) ![Screenshot 2024-03-07 at 16.39.10](https://hackmd.io/_uploads/HJ9iAgPTp.png) ![Screenshot 2024-03-07 at 16.41.48](https://hackmd.io/_uploads/B19j0xDTp.png) https://gitlab.com/z411392/new-boyholic-badminton-cms ##### 前台 ![Screenshot 2024-03-07 at 16.40.12](https://hackmd.io/_uploads/B1KiCewTT.png) ![Screenshot 2024-03-07 at 16.40.32](https://hackmd.io/_uploads/ry5jAxPpa.png) ![Screenshot 2024-03-07 at 16.40.42](https://hackmd.io/_uploads/Bk5s0lw6p.png) [點歌功能](https://res.cloudinary.com/boyholic/video/upload/v1709801381/demo/Screen_Recording_2024-03-07_at_16.46.17.mov) https://gitlab.com/z411392/new-boyholic-badminton-www 前台和後台的介面都是用 Nuxt 3 + Vuetify + Tailwind (還有 SCSS…但我後來覺得 SCSS 寫完看起來很阿雜)。 > 比較特別的是: > 1. 花了一點時間研究怎麼在 Firebase Auth 透過 Open ID Connect 串 LINE 登入。 > 2. 持久化用的 ID 是以 uuid.v5 的方式生成。 > 3. 透過 Firestore 的監聽,即時更新頁面上的資料,並顯示通知。 > 4. 因為譬如 Safari 要用 Web Notification API 的話,要把網頁包成 PWA,所以通知是串另外的 LINE Notify。 > 5. 用 KSQL 以外的方式實現了一種 Event Sourcing。 #### Flutter 練習 2023 年中,因為同事的關係接觸到 Flutter,覺得前景可期(可以同時寫完 Web、Android、iOS、Mac!如果沒有底層要特別銜接的話)。狀態管理方面,同事用的是 GetX(其實應該說 GetX 不只是狀態管理,而是一個在 Flutter 之上的框架)。 我自己實驗了 flutter_hook、riverpod、bloc 等。繞了一圈,心得是,其實用原生的 Notifier、ListenableBuilder 也能實現局部重新渲染。bloc 則是使一連串的操作和狀態變得可測試(有點像狀態機)。 這裡有一個我用 Flutter 練習寫出的作品: https://gitlab.com/z411392/fake_ec (其實編譯完的 Web 檔案,作為靜態檔案,直接丟到 Netlify 上就能運作了。) #### Infinite Scroll 這裡有一個其他家面試者的前端小 quiz: https://hackmd.io/@di-gochisou/ByupzRu_p 這邊是我作答的內容: https://github.com/z411392/mewney-quiz > 對方回覆說,其實他們想看的處理 Scoll 時額外作 Debouncing 的那個過程。 > > 但,因為我用的是 Vuetify 的 Infinite Scroll 元件,這邊是不會有他們想看的那個關於捲動的 Debouncing 的。不過應他們要求,我還是在發載入的方法上硬是多套了一層 😅。 > > 雖然沒有 offer,但在這個作業裡我學習到,如果更新關鍵字後沒有特別去取消前一次關鍵字的資料載入,我們會有很高的機率在新的搜尋結果看到也前一個關鍵字的搜尋結果。有針對這點特別用到了 AbortController。 ### 感觸 其實現在 ChatGPT、Copilot 等基於語言模型的服務,讓我們能很方便能找到感興趣的問題和答案。那到底什麼算「專業」、什麼叫「內行」呢…?每次聽到討論的最後,好像都是逼得大家都要去刷 Code 面對那些離生活或工作很遠的題目,使大家被科技理性奴役。 (我前同事甚至還覺得,工作中一天沒有用上這些服務表示,你工作流程可能有問題。我想說,蛤?不是通常關鍵字打一打就會在 Stackoverflow 上找到答案嗎?而且看過好幾個然後比較一下不是比較妥當嗎?) 嗯…我不是那種,一路走著最正確道路,最快跑到終點的人。我當然還是會努力的先快速瀏覽記住有哪些可能很重要之後會用上的東西(而不是每次遇到了才被迫了解他是什麼),但我不是每個算法、結構都一下子鑽研得很細節的人。 譬如前一陣子因為前同事間討論才去翻到怎麼在諸多座標間找到一個最鄰近目前位置座標的算法。又譬如用 trie 快速比對出某些前綴開頭的字串。我能辦到的就是…想跟著需求,緩步前進,把人照顧得服服貼貼。 總之,希望接下來能夠一起共事的,是溫柔圓融的你們。 ### 其他可以參考的資料 #### 怎麼實現捲動動畫 https://codepen.io/z411392/pen/yLryyyb #### 在爬蟲方面的經驗 https://hackmd.io/oeH89T61RQOsUZiT-tUYtw #### 簡單自我介紹 https://docs.google.com/presentation/d/1Ijoca_fdEa2Cap5Dkq_LpVmOy1cRS9Uy0hjAneqGE2o/edit#slide=id.g2ae14e47cf5_0_79 #### 工作態度調查 https://hackmd.io/s22klOFKSfiEABboM4L5JQ

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully