YC
  • NEW!
    NEW!  Connect Ideas Across Notes
    Save time and share insights. With Paragraph Citation, you can quote others’ work with source info built in. If someone cites your note, you’ll see a card showing where it’s used—bringing notes closer together.
    Got it
      • 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 No publishing access yet

        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.

        Your account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

        Your team account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

        Explore these features while you wait
        Complete general settings
        Bookmark and like published notes
        Write a few more notes
        Complete general settings
        Write a few more notes
        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
      • Make a copy
      • 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 Make a copy 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 No publishing access yet

    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.

    Your account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

    Your team account was recently created. Publishing will be available soon, allowing you to share notes on your public page and in search results.

    Explore these features while you wait
    Complete general settings
    Bookmark and like published notes
    Write a few more notes
    Complete general settings
    Write a few more notes
    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
    # 後端工程師學習路線圖 (Part 1) ## 前言 之前有在分享過一些技能學習和找工作的建議,但發現自己沒有寫太多關於技術方面的內容,所以決定記錄和分享自己從零開始學習的路線圖。 ## 主線 主線這裡會寫比較核心的技術。支線一起寫的話會很長所以決定分開。 ### IDE 寫程式用的編輯器,有些會比較多功能。我一開始是用 Sublime Text,之後就一直用 VS Code 到現在。有些 IDE 會特別針對某個語言設計,個人覺得 VS Code 比較泛用。 > [name=某朋友] VS Code is all you need. ~~嚴格來說只要可以文字編輯的都可以,曾經看過有人用 Word 寫 Python。~~ ~~啊我找到連結了 https://youtu.be/X34ZmkeZDos~~ ### 程式語言 找工作看過要求的後端語言有 Python、C#、Java、PHP、Rust 和 Golang 等等等等等非常多,體感比較多職缺的大概是 C#、Java、PHP 和 Python。 如果是完全沒有寫過程式建議從 Python 入門培養程式邏輯。語法本身比較接近英語,大概會長下面那個樣子。 ```python= if tired: drink_coffee() else: continue_coding() # 翻譯成白話就是如果累了就喝咖啡,否則就繼續寫程式。 ``` Java 會啰嗦一點。 ```java= if (tired) { drinkCoffee(); } else { continueCoding(); } ``` 有了程式邏輯,學其他語言也會比較好上手。先學 Python 會養成忽略資料形態的壞習慣,不過學其他語言時適應一下就好。 學習方式建議買書或課程,我學 Python 幾乎都是自己摸索以致於很多基本的內容我寫了很長時間的程式才知道。 基本語法學到差不多了就可以開始做一些小作品。後面會再給一些個人作品的例子。 再補充一些課程好像不會特別教的事情。程式語言會有自己或共通的 coding style,像 Python 有 PEP 8 建議變數名字怎麼寫、縮排、參數順序等等。一般上不會影響程式的正確性但會影響程式的可讀性。 給個 PEP 8 建議的變數命名例子: ```python= lower_case_with_underscores lowercasewithoutunderscores # 這就不建議,看了會很傷眼。 ``` 可以參考:[PEP 8](https://peps.python.org/pep-0008/#descriptive-naming-styles) Coding style 也不需要特別學,多看其他人的程式就可以體會到了,但一開始建議變數名字要取得有意義,只放 x 和 y 會比較難懂。還有等號前後記得空格。~~不空格的都是邪魔外道。~~ > [name=某學長] 程式是寫給人看的,如果是寫給電腦看的話,那大家就寫 binary 的 machine code 就好啊。 ### Git Git 是一個版本控制的工具,簡單來說就是幫你做歷史記錄的感覺。除了記錄之外也可以當做備份。應該沒有軟體工程師不會用到。 初學者大概知道 add、commit 和 push 就差不多了,可以稍微知道怎麼復原成某個版本。branch 相關的操作等和其他人合作前再學也不遲。 大概在開始做第二第三個作品時可以開始用,但如果很有自信的話在第一個作品也可以開始用。 另外,Git 和 GitHub 是不一樣的東西。GitHub 是類似雲端備份這樣的服務,給個類比就是電腦本地端資料夾和 Google Drive,本地端和雲端各有一份的感覺。Git 可以提供本地端和雲端備份相關操作。另一個也很常用的雲端服務是 GitLab。兩者應該是差不多就看個人喜好,個人習慣 GitHub,某學長因為不希望自己寫的程式被微軟拿去訓練模型所以會用 GitLab。 ### 資料庫 核心應該都是 SQL,我是從 MySQL 開始學,但也只是知道一些基本語法,如果只是做簡單的作品應該是足夠了。 之前面試被考各種 SQL 的問題,包含資料庫一些設計原則和原理之類的。~~然後隔天被光速拒絕~~。也是建議買書或課程,自學可能會不知道自己不知道什麼。 買課程的話要注意課程會教什麼。我買過一個課程只教了語法,個人覺得不太夠,但應該適合初學者。 後期作品做得差不多了,可以挑一種 NoSQL 的語言來學,有些公司會用 MongoDB 和 PostgreSQL 等等 NoSQL 語言。 ### 網路服務相關 我沒有學過很扎實的網路服務,大概知道什麼是 client/server、他們之間是用 http request 溝通、request 裡面的資料會是 json 格式。曾經用下面這些關鍵字去找資料: * backend server * http request * API/endpoint * Restful API 之前工作處理過 json 格式所以沒有特別搜尋,另外可以查一查 server 是如何驗證用戶名字和密碼的。 也是建議買書或課程,但不確定有沒有專門教這些的課程。 之前面試被問什麼是 Restful API,我說 client 和 server 間溝通的一種 API,裡面有一些格式要遵循。然後就被建議面試結束後去 google 一下。 ## 個人作品 撇開修課需要的,作品類型可以分為單純練手感和實際會用到的類型。兩者各有優缺點。 前者可以直接讓你學到未來工作可能會用到的技術。但除非有人在使用,否則要完整地驗證程式正確性會比較困難。 後者是有人實際會使用,用的時候會知道這軟體應該要長什麼樣,缺點是不一定會和未來工作有關係。 我的作品都是以前者為出發點。後者是某次面試的時候面試官建議的。他說自己有個朋友轉職時寫了一個 app 來記錄自己看過的漫畫進度,這 app 很廢但至少他知道這 app 應該要有什麼功能。 有些公司似乎會比較希望是前者那樣的經驗,只能說每家公司在意的點不太一樣。 我的作品基本就用到上面的技能,但在開始寫會員系統 server 之前,在修課和工作時都有在寫程式,大概累積有三年時間了,所以有些基礎可能沒特別提到,如果有問題或建議也歡迎討論。以下是我做過和朋友寫的的一些作品題目,歡迎參考。 ### 手寫數字辨識 這是之前修課寫的,用的是 Python,資料集是 MNIST,方法是 Singular value decomposition (SVD)。不過當初剛學 Python,也不是很懂 SVD,但寫出來蠻有趣的。 現在手寫數字辨識大概都直接 CNN 之類了吧?不過這需要一點 ML/DL 基礎。 好像很多 Python 課都會教爬蟲,自己沒上過不是很理解為什麼教這個,希望有人可以解惑。 ### terminal-based big two card game 自學 Java 想要了解 OOP 的概念時寫的,大概會是下面這樣: ```shell= Enter player 1 names: Alice // user input Enter player 2 names: Bob Enter player 3 names: Carol Enter player 4 names: Dave Dealing cards... New round begins. Next turn: Alice 0 1 2 3 4 5 6 7 8 9 10 11 12 C[3] D[3] C[4] H[5] S[5] H[7] H[10] S[10] H[J] C[K] D[K] S[K] H[A] 0 // user input Player Alice plays a single C[3]. Next turn: Carol 0 1 2 3 4 5 6 7 8 9 10 11 12 H[4] D[5] D[6] S[6] S[7] C[8] S[9] C[J] S[J] D[Q] C[A] D[A] S[A] -1 // user input Player Carol passes. ... ``` 流程大致上是: 1. 玩家們輸入名字。 2. 程式發牌。 3. 每回合公告當前玩家名字,顯示玩家手牌,等待玩家出牌。 4. 玩家出牌或跳過,程式判斷玩法是否合法,合法就下一個玩家,否則持續等待玩家直到玩法為合法為止。 5. 重複步驟 3 和 4 直到出現贏家。 用其他語言應該也做得到一樣的事情。想要練一點前端可以想辦法去接前端,我是不太會設計所以就長這樣。 ### 會員系統伺服器 這是為了直接學 Spring 才寫的,大致上就只是開 API 讓前端去接。功能上有新增賬號、用戶登入、用戶資料 CRUD 和密碼重設的功能。 有做 Unit test 和 Integration test,蠻多公司會在意這些。 Spring 要學的東西蠻多的,可能不太適合初學者,我是看了官方的線上課程,之後就一直看技術文件、 source code 和一點點的 chatGPT 才寫出來的。chatGPT是用免費版,特別寫是因為 Spring 不久前有大改,免費版的chatGPT 根本寫不出新的東西。但換來的是學到很多扎實內容。 ### 遊戲公會戰報名 Discord Bot 這是朋友寫的。大致上是為了避免過多的人同時打boss以至於有些人被遊戲判定為無效攻擊。也可以讓其他人知道當前公會戰進度。 ~~用過的都說好。~~ ### 部落衝突 Discord Bot ~~你沒看錯,部落衝突。在你面前的可是玩了10年以上的老玩家。~~ 這是我想寫的,官方有開 API 給我們用。我是看到官方的 API 後才知道什麼叫作接 API。目前只想到要記錄部落戰防守次數高的陣型有哪些。 國外有神人寫了一個基於 COC API 的網站,裡面蠻多有趣的功能可以看看。 連結:https://www.clash.ninja/ ## 參考 https://roadmap.sh/backend 寫完發現好像和其他人建議的類似,但這個完整很多。 也有前端和其他領域版本的,可以去看看。 ## 結語和題外話 內容比預計的還長,所以其他部分會另外寫。有問題歡迎留言或私訊。 一些題外話: 網路上好像一直有種非本科就不能當工程師的風氣。雖然我是數學系畢業,但學習路上沒有想過本科或非本科的問題,只知道我想找軟體工程師的工作就應該要學習什麼技能,目前有順利找到還算滿意的工作。所以我覺得如果你喜歡寫程式,都可以開始學一學,網路上有些酸言酸語就少看些。 有些人就會說啊肯定是成功了才會分享啊,也不看看失敗的人有多少 我只想說好喔 > [name=某朋友] 這行有電腦就能學 像醫生那種專業就根本不可能讓非本科來

    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
    Sign in via Google Sign in via Facebook Sign in via X(Twitter) Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    By signing in, you agree to our terms of service.

    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