🔍 搜尋結果:面試

🔍 搜尋結果:面試

程式設計師必須具備的7個習慣!

介紹 -- 作為一名程式設計師,您知道您的工作需要高度專注,因此往往會佔用您大量的時間。是的,這也發生在我身上,我花了很多時間做任務,但有時結果並沒有達到預期。我意識到我從工作經驗和同事的見解中獲得了一些東西,並且有一本書很有趣並且對改善我的習慣非常有幫助。 您是否知道我們每天都遵循模式和習慣來生活,這些習慣會影響我們目標的結果。所以如果你想改變你的生活並實現你想要的,你要做的第一件事就是改變你的習慣。史蒂芬‧柯維在他的***《高效能人士的七個習慣》一***書中說:「*我們看待世界的方式完全基於我們自己的看法。* 」 讓我們先看看與我們日常活動相關的較小事物,而不是著眼於如此之大的世界。是的,沒錯,我想從我作為一個程式設計師的角度來分享。作為程式設計師,您應該了解一些提高生產力的習慣。其中一些內容也是基於我的經驗,所以結果可能會有所不同,但相信我,如果你練習得好,這將會很有用。好的,讓我們開始吧! **1. 積極主動** 柯維在他的書中描述了我們生活中存在的兩類人。**關注圈**是一個包含我們無法控制的事物的圈。同時,較小的圓圈是**影響圈**,其中包含我們可以控制的東西。 ![主動式和被動式](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p50j7r9vgw6hhipidjz2.png) 基於這兩個圈子,**反應型的**人會更多地考慮**關注圈**,而**主動型的**人會更多地考慮**影響圈**。程式設計師也是一樣,我們中間一定有兩類人。 有**一些反應型程式設計師**忙於處理辦公室條件、公司財務等無法控制的事情,他們甚至認為自己的職業生涯可以透過影片《*如何在三個月內成為最好的程式設計師*》來決定。另一方面,也有一些**積極主動的程式設計師**選擇練習,嘗試幾次面試和比賽,以打開成為程式設計師或任何他們夢想的工作的機會。 積極主動的人知道他們需要了解外在事物,但他們才是對自己的職業負責的人。換句話說,要積極主動,你可以更專注於從自己內部尋找靈感,並且可以控制它,而不會忽視自己之外的重要事物,而不是僅僅期望別人給你一個「*神奇食譜*」。 **2.以終為始** 我們中的許多人一生都在隨波逐流,甚至不知道自己的目的。因此,我們所擁有的只是希望,這無論如何都不是一個好的策略。史蒂芬·柯維說「以終為始」換句話說,在做任何事情時,包括啟動一個專案,你必須確定明確的成功衡量標準以及實現這些目標的計劃。 ![開始就要考慮如何結束](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b1bbrkhtnd78rarqcfd8.png) 如果您將其應用於編程,那麼每當您開始一個新專案時,您都會花時間了解最終產品。要建構的功能的功能和非功能要求是什麼? 我記得有人說過軟體工程是做出權衡的藝術。很少有正確和錯誤的答案,而是確定不同類型的設計以及特定情況下的優點和缺點的問題。不管你相信與否,我的經驗是,花 30 分鐘仔細規劃可以為你節省 10 多個小時的程式設計時間。 > 「人們比以往任何時候都更加努力工作,但由於缺乏清晰度和遠見,他們並沒有取得多大進展。本質上,他們是在用盡全力推一根繩子。史蒂芬‧柯維博士 當然,這並不容易,因為每個計劃都可能出錯,我也陷入過幾次。但這仍然比根本不計劃任何事情要好得多。 **3、要事第一** 能夠選擇什麼是重要的、什麼是不重要的也是一種有效的習慣。透過根據您的需求對您的興趣進行排序,您將能夠確定首先完成的工作的優先順序。 這個習慣與時間管理密切相關。柯維建議我們根據他建立的四個像限(他稱之為艾森豪威爾矩陣)來做主要事情。 ![艾森豪威爾矩陣](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hv4j1roh5p3f4gaw52uc.png) 以前我認為這個象限對於我的任務來說並不那麼重要。事實證明,這一點常常被大多數程式設計師所忽略。當我擔任軟體工程師時,我不斷受到需要解決的錯誤的轟炸。另一方面,我也有長期的專案需要完成。 當你承受如此大的壓力時,你就會忘記學習。因此,如果你的程式碼有問題,你只想去谷歌或使用人工智慧並複製貼上解決方案,而無需真正理解它。是的,真正了解問題的原因對學習來說很重要,但並不迫切。對許多程式設計師來說,隨著職業的進步,學習就會停止。這就是為什麼你需要專注於屬於這個象限的任務,並為你的長期成功安排特定的時間。換句話說,優先考慮並實現最重要的目標,而不是不斷地對緊急情況做出反應。 **4.雙贏思維** 一個人的**收穫**就是另一個人的**損失**——這個想法在我們的大腦中非常熟悉,可能是因為我們經常觀看的各種比賽和體育賽事。在這本書中,柯維博士認為培養「豐富心態」很重要。也就是說,相信有足夠的資源和機會讓每個人都獲得成功。這種心態對於軟體工程師的職業生涯成功至關重要。我們與其他工程師和其他工作職能人員(例如資料科學和產品管理)一起工作。 ![雙贏協議](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w1thqzuw744a9usc2ezo.png) 能夠有效協作是您需要具備的主要技能之一。因此,能夠超越個人職業目標並為團隊擁有雙贏的心態非常重要。不只是透過讓別人輸來贏得自己,或是屈服於別人讓他們贏,甚至讓別人輸,因為我們也輸了。 習慣了總是想著能夠贏得多方的支持,會讓我們總是努力取得最好的結果。不僅如此,從長遠來看,這也極大地影響了我們與他人的關係。 為了建立長期良好的關係,我們需要與許多人建立關係。透過**雙贏思維**,這將有助於我們在未來建立良好的聲譽或形象,並使我們的工作從長遠來看更加有效。 **5. 首先尋求理解,然後被理解** 你是那種在給別人機會之前就忙著徵求自己回饋的人嗎?這不是史蒂芬·柯維所推薦的。 ![先尋求理解,再尋求被理解](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bg3uigm6p7xm7h9stc7v.png) 為了被別人理解,我們首先要做的就是**先理解別人**。高效能的人能夠具有極大的同理心,並透過理解他人來尊重他人。 但這如何適用於程式設計師呢?除了口頭交流之外,工程師還使用程式碼來相互交流。高效率的程式設計師了解**同理心**在編碼中的重要性。他們優先考慮程式碼的清晰度,以確保其他人(包括將來的自己)可以輕鬆理解和維護程式碼。 除了其他工程師之外,程式設計師還透過他們的產品與最終用戶進行交流。高效率的程式設計師會設身處地為最終使用者著想,優先考慮使用者體驗。他們預測用戶需求,設計可交付的介面,並建立錯誤訊息來引導用戶而不是讓他們感到困惑。 **6. 協同增效** 能夠與他人很好地協同工作的人將是高效的人。透過良好的關係和協作,您可以建立比僅依靠自己更好的解決方案。數學上1 + 1 = 2。 ![協同作用](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lb8uq52jfzpkl28kyp32.png) 柯維博士在他的書中強調了欣賞差異並利用差異創造一個大於各個部分總和的整體的重要性。因此,關鍵在於充分發揮每個團隊成員的作用,創造出使用者喜愛的產品。高效的程式設計師採用**協作**編碼實踐,例如程式碼審查、配對程式設計和其他知識共享。透過結合個人技能和見解,團隊可以建立更強大、更有效率和創新的產品。 儘管這並不容易,尤其是對於程式設計師來說,他們大多數都是單獨工作,但透過習慣這一點,我們不僅可以成為獨立的人物,而且可以成為可以與任何人一起工作和良好協作的人。 **7.磨利鋸子** 高效率的人會在生活中不斷實踐事物,從而不斷進步、良好發展。科維說,我們在生活中必須磨練四件主要的事情:***身體、心靈、精神和精神***。是的,總的來說,這對於任何領域的生活來說都是非常重要的。但讓我們試著專注在更具體的事情上。 ![敏銳的發現](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f2tj8no1yezmseadugi4.png) 對程式設計師來說,這是最重要的習慣。為了理解這個習慣,我們假設有兩個工人正在嘗試砍柴。第一個工人是個年輕人,整個8小時的輪班時間裡,他一直不停地砍柴。第二位工人是一位年紀較大的男子,每小時需要休息 10 分鐘,在休息期間他會花時間磨鋸子。如果你認為年長的人會砍更多的木頭,那麼你就已經理解了這個習慣。 作為一名程式設計師,你將面臨如此多的新技術。高效率的程式設計師了解**持續學習**的重要性。磨礪鋸子需要投入時間來獲取新技能、了解產業趨勢以及探索新技術。高效率的程式設計師必須透過練習、參加會議、參加程式設計社群等方式騰出時間進行專業發展。這種習慣可以幫助我們適應科技進步。 **結論** 有時候,在我們不知不覺中,壞習慣或多或少影響我們的生活,讓我們的生活變得低效。然而,一個習慣如果持續太久,就很難打破。 如果我們想要改善我們的生活,從改變我們的觀點到改變我們的習慣,這就是我們需要理解的。實踐史蒂芬‧柯維所說的這七個習慣將幫助我們更有效、更有意義地改變我們的生活。 僅僅了解這些習慣是不夠的,我們還必須全部應用它們,因為每一點都同樣重要且相互關聯。因為只有過有效的生活,我們才能走上更大成功的道路。 **參考** [富蘭克林科維](https://www.franklincovey.com/the-7-habits/) [高效能人士的七個習慣](https://books.google.co.id/books?id=36V_PAAACAAJ&hl=id&source=gbs_book_other_versions_r&cad=1) --- 原文出處:https://dev.to/tentanganak/7-habits-that-programmers-must-have-1dfj

我在 IT 產業工作了 10 多年。這是我希望在開始時就知道的 5 件事

我需要吐露一些心聲,所以我在這裡,希望能與年輕的 IT 專業人士分享一些有用的東西。在我的職業生涯中,我經歷了自由工作、實習、公司工作、職業轉變,甚至推出了自己的 SaaS(這個故事下次再說…)。我犯過無數的錯誤,也學到了一些慘痛的教訓。以下是我希望 10 年前就知道的 5 件重要事情。 1. 一致性是關鍵 --------- 曾經有一段時間,我懷疑自己所做的一切——品質、選擇、從方向到技術堆疊。我在技術之間切換,考慮放棄我正在做的事情,並再次改變職業。這導致我對自己的技能缺乏信心,常常感到非常沮喪。再加上自由職業的收入和普遍的內向——我甚至沒有任何更有經驗的人可以諮詢來衡量我的進步。這很艱難——當時我主要建立 WordPress 網站。如果我把時間浪費在懷疑和優柔寡斷上,專注於一條職業道路,我會取得更多、更快的成就。選擇一條道路並堅持下去——它會比廣泛的平庸發展的技能產生更多的結果,尤其是在開始時。 這也適用於尋找你的第一份工作。如果您一開始無法找到夢想的工作或任何 IT 工作,那麼這還沒結束。是的,這可能需要幾個月甚至幾年的時間!但如果您覺得 IT 是您的位置,請繼續挖掘該位置。找臨時工作維持生計。尋找更便宜的住房,如果有必要的話,和父母住在一起。購買便宜且健康的食物(提示:您吃的蛋白質越多,您一整天感到的飢餓感就越少)。如果您有系統地投入時間來發展和找工作 – 您就會成功。 2. 你會掙扎並且不理解事情-這是正常的(隨著時間的推移,情況會好起來,但不會完全好) ------------------------------------------- 隨著時間的推移,它會變得更容易,但鬥爭永遠不會完全消失。我在大學逃課,留下了我的電腦科學基礎知識中的空白,而這些空白是經驗無法填補的。但這還不是最重要的。最重要的是,在工作中,你會存在著知識上的空白。也許不是在特定的工作、角色或專案中——你可以徹底學習一個專案,特別是如果你在它上工作的時間足夠長的話。但總體上不了解有關您職業的某些事情是正常的。您不需要了解曾經建立的每一個處理器架構;系統架構師不需要了解特定的測試工具。您不需要徹底了解亞馬遜的每項服務來建立強大的測試系統。這是正常的。 3.不要執著於一份糟糕的工作 -------------- 有時你最終會得到一份糟糕的工作。認識到一份糟糕的工作很簡單——一天結束時,你想把自己裹在毯子裡,躲在角落裡,最重要的是,工作中沒有人可以與你談論改善情況。糟糕的工作可能有多種原因 - 有時是團隊,有時是管理層,有時是你 - 不適合該職位,招聘錯誤,但沒關係。不好的是堅持那份工作。原因可能有很多——沒有安全網、沒有合適的替代方案、對新工作的到來沒有信心……你決定等待。等待、忍受、拖拖拉拉,直到你完全精疲力盡,或者儘管你付出了努力,但還是被明確地趕出了家門。這種情況可能發生在你職業生涯的任何階段,你絕對不能讓它發展到極端。如果你覺得有什麼不對勁,那你可能是對的。如果你強烈地不想去上班——那就是有問題了。切斷這些聯繫,否則你會精疲力竭,或在一個糟糕的地方紮根數週、數月、甚至數年,而沒有力量去改變任何事情。當臨界點到來時,你會面臨更疲憊的情況。 4. 經常換工作可能有好處,但不適合所有人 --------------------- 我仍然看到對初學者程式設計師的建議:多換工作。他們說,這樣你就會獲得更多經驗。在這裡一年,在那裡六個月,三、四年後,你的經驗就和高年級學生一樣了。這可以工作。但這並不適合所有人。 人們在如何集中和保持注意力方面存在差異。如果你沒有註意力不集中的問題,你可以輕鬆地在一個地方工作幾年,並徹底學習所有流程——這將增加你在當前公司的價值,並為你在未來的面試中提供故事。人們低估了深刻的理解,但許多職位和公司卻很重視它。 跳槽也很有用,但對於那些在任務被理解後難以保持注意力的人來說可能是有益的。對這些人來說,當工作中的驚喜消失或接近消失時,工作就變成例行公事,他們可能會開始破壞它。如果你有這樣的感覺——這可能就是你的情況,你需要從熟悉的地方跳到未知的地方。一次又一次。隨著時間的推移,這些人會成為具有超強適應性的專家,對他們來說,新語言或新領域都不會成為障礙。 及時辨識什麼適合您個人非常重要。 5. 不要錯過機會,即使它們看起來很小或微不足道 ------------------------ 測試自動化的職業生涯讓我的生活變得更好。這個機會一直就在我面前。我不只一次想過嘗試它,甚至開始學習一些東西,但我放棄了——我認為測試並不認真,而且在經過幾年的 Web 開發後轉向測試是個壞主意(哈哈)。事實證明,我不需要付出很大的努力就可以在這個領域建立一份嚴肅的職業生涯。從酒吧工作轉向網頁開發對我來說是一個更大的努力。 為了養活自己而工作也是如此。我的第一份 Web 開發工作賺了 50 美元。我製作了兩個 WordPress 網站——一個 30 美元,另一個 20 美元。自從我從頭開始學習以來,這還不錯。我之前的工作經驗大部分都是在酒吧度過的。儘管我將自己(主要是在我的腦海中)定位為網頁開發人員,但我從事了任何工作——從編寫文字到編輯圖像。在自由業的前 2-3 年裡,我最大的單筆收入是用 Photoshop 編輯了數千張電影海報。三天三夜幾乎不間斷的工作讓我賺到了 500 美元——這對那個時代來說是一個了不起的結果。 還有一件事:行話和抽象 ----------- 你讀到的、聽到的和做的很多事情都可能非常混亂和複雜,以至於變成了白噪音。有時,一件難以理解的事情會流入另一件事情中,留下不愉快的痕跡和限制感。但這是正常的!一旦你開始解開抽象概念的結,並意識到術語和行話背後的含義,一切都會很快步入正軌。看起來這種混亂沒有盡頭,但事實並非如此——遲早,你會明白一切(或幾乎一切)。 實際上,程式設計論壇和技術播客對我幫助很大。我只是閱讀和聆聽所有內容,谷歌搜尋每個未知的單字和術語。在某些時候,這會導致您的手機和電腦上的瀏覽器中出現數十個和數百個選項卡,但最終,此流程開始縮小。透過每個新的閱讀選項卡,您會變得更聰明,對自己的知識更有信心,即使在很長一段時間內看起來並非如此。 --- 我希望這篇文章能對大家有所幫助,並激勵人們不要害怕變化,尋找自己的位置,不要在遇到困難時就放棄。請記住,每條道路都是獨一無二的,重要的是要找到自己的道路,遵循自己的興趣、願望並專注於自己的感受。一切都會好起來的,但還是祝你好運。 --- 原文出處:https://dev.to/vorniches/ive-worked-in-it-for-over-10-years-here-are-5-things-i-wish-i-knew-when-i-started-43pe

系統設計面試的資料庫分片

*揭露:這篇文章包含附屬連結;如果您透過本文中提供的不同連結購買產品或服務,我可能會獲得補償。* [![資料庫分片的類型](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/42ob2tziqrlt820gdsy7.jpg)](https://bit.ly/3pMiO8g) image\_credit -[設計大師](https://bit.ly/3pMiO8g) 朋友們大家好,在這個資料驅動的世界中,有效處理大量資料的能力對於企業和組織來說至關重要。 傳統的整體資料庫往往難以跟上現代應用程式和服務的需求,並成為效能瓶頸。 這就是**資料庫分片發揮**作用的地方,它為**水平擴展資料提供了強大的解決方案。** 如果你不知道什麼是Sharding?分片是一種資料庫架構技術,它將大型資料庫劃分為更小、更易於管理的部分,稱為“分片”,分佈在多個伺服器上。 每個分片都包含資料的子集,它們一起形成完整的資料集。這種方法透過分配工作負載、減少延遲和啟用並行處理來增強效能和可擴展性。 分片對於處理大規模應用程式和高流量系統特別有用,確保沒有單一伺服器成為瓶頸,並提高資料庫系統的整體效率和可靠性。 過去,我討論過常見的系統設計問題,例如[API 網關與負載平衡器](https://dev.to/somadevtoo/difference-between-api-gateway-and-load-balancer-in-system-design-54dd)、[水平與垂直擴展](https://dev.to/somadevtoo/horizontal-scaling-vs-vertical-scaling-in-system-design-3n09)、 [正向代理與反向代理](https://dev.to/somadevtoo/difference-between-forward-proxy-and-reverse-proxy-in-system-design-54g5),在這份全面的**資料庫分片指南**中,您將了解資料庫分片,探索其概念、優點、實施策略和實際用例。 分片也是系統設計面試的重要議題,因為 因為它展示了對如何處理大規模資料並提高系統效能和可擴展性的理解,這是開發人員的關鍵技能和經驗。 在這些面試中,通常會評估候選人設計能夠有效管理高流量和大量資料的系統的能力。分片展示了分散式系統、資料庫管理的知識以及解決潛在瓶頸和故障點的能力。 它反映了候選人設計彈性、高效能和可擴展架構的能力,這是在現實場景中建立強大且高效的軟體系統的關鍵技能。 順便說一句,如果您正在準備系統設計面試並想深入學習系統設計,那麼您還可以查看[**ByteByteGo**](https://bit.ly/3P3eqMN) 、 [**Design Guru**](https://bit.ly/3pMiO8g) 、 [**Exponent**](https://bit.ly/3cNF0vw) 、 [**Educative**](https://bit.ly/3Mnh6UR)和[**Udemy**](https://bit.ly/3vFNPid)等網站,這些網站有許多很棒的系統設計課程,這裡有一個很好的系統設計 Exponent 的面試備忘單,以快速修改面試的基本系統設計概念。 [![軟體設計面試備忘錄](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k3i7ytpm4lzhad3dclk5.png)](https://bit.ly/3cNF0vw) ***PS 繼續閱讀直到最後。我有一份獎金給你。*** 用於系統設計的資料庫分片 ------------ 現在,我們來了解一下什麼是資料庫分片?為什麼需要它以及它如何幫助擴展您的應用程式。我們還看到不同類型的資料庫分片,例如基於哈希和基於範圍的分片。 目錄 1. 介紹 2. 什麼是資料庫分片? 3. 為什麼要分片?對可擴展性的需求 4. 資料庫分片如何運作? 5. 分片策略 6. 挑戰和考慮因素 7. 現實世界的用例 8. 實施資料庫分片 9. 最佳實踐 10. 結論 一、簡介 ---- 在當今資料驅動的世界中,企業和組織被大量資訊淹沒。有效管理和處理這些資料是傳統整體資料庫難以應對的挑戰。 隨著用戶群的成長、應用程式工作負載的增加以及對即時分析的需求的飆升,對可擴展資料庫解決方案的需求變得至關重要。 > 這就是資料庫分片作為實現水平可擴展性的強大工具的作用。 [![資料庫分片概述](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gx9climi3dpc0fpgie24.png)](https://bit.ly/3Mnh6UR) --- 2.什麼是資料庫分片? ----------- **資料庫分片是一種資料庫架構策略,用於跨多個資料庫執行個體或伺服器分割和分佈資料。**術語“分片”是指整個資料集的分區或子集。 每個分片獨立運作並包含一部分資料。透過將資料分佈在多個分片上,系統可以實現水平可擴展性,從而能夠處理更大的資料量和更高的工作負載。 分片對於資料集快速成長或高吞吐量要求的應用程式尤其有利,例如社交媒體平台、電子商務網站和遊戲應用程式。 它使這些應用程式能夠跨多個伺服器或叢集分配資料庫負載,從而防止任何單一資料庫伺服器成為瓶頸。 這是一個**簡單的圖表,將資料庫分片解釋為水平擴展:** [![什麼是資料庫分片](https://miro.medium.com/v2/resize:fit:609/1*Dmb3LCxTWjyGj_uYjEGnHA.png)](https://bit.ly/3P3eqMN) --- 3. 為什麼要進行資料庫分片?對可擴展性的需求 ----------------------- 現在,讓我們看看為什麼需要資料庫分片 ### 3.1.單體資料庫中的可擴展性挑戰 傳統的整體資料庫在可擴展性方面有其限制。在整體架構中,所有資料都儲存在單一資料庫執行個體中。 隨著資料量和使用者負載的增加,單體資料庫可能面臨幾個挑戰: - **效能瓶頸:**單一資料庫伺服器可能成為效能瓶頸,導致查詢回應時間緩慢且應用程式停機。 - **儲存有限:**單一伺服器的儲存容量有限,難以處理超大資料集。 - **垂直擴展成本**:透過升級硬體進行垂直擴展可能成本高昂,而且回報遞減。 - **複雜性:**管理大型整體資料庫可能很複雜且容易出錯,需要大量維護和最佳化。 ### 3.2.解決方案:透過分片實現水平可擴展性 資料庫分片透過將資料分佈在多個分片上(每個分片駐留在單獨的資料庫伺服器或叢集上)來解決這些可擴展性挑戰。這種方法有幾個優點: - **提高效能:**分片將資料庫負載均勻分佈在多個伺服器上,從而提高查詢效能和回應能力。 - **無限的可擴展性:**隨著資料的成長,可以加入新的分片,從而實現近乎無限的可擴展性。 - **成本效益:**與不斷升級單一伺服器相比,分片是一種經濟高效的解決方案。 - **高可用性**:分片可以提高容錯性和可用性,因為一個分片的故障不會影響整個系統。 這是資料庫的水平分片和垂直分片的樣子 [![如何使用分片擴充資料庫](https://miro.medium.com/v2/resize:fit:609/1*0j0DLUHN8EeykY-XxVSzJA.png)](https://medium.com/javarevisited/top-3-system-design-cheat-sheets-templates-and-roadmap-for-software-engineering-interviews-53012952db28) --- ### 4. 資料庫分片如何運作? 資料庫分片背後的核心思想是將資料分成更小的、可管理的部分,稱為分片。每個分片都是一個獨立的資料庫子集,用於儲存整個資料集的一部分。 分片可以分佈在多個資料庫伺服器或叢集\*\*,從而實現並行處理並提高效能。 以下是資料庫分片工作原理的進階概述: ![資料庫分片如何運作?](https://miro.medium.com/v2/resize:fit:609/1*1FCBTWUliqTM-VYNcd_YHA.png) 您可以看到資料庫分片提供了一種邏輯方法來將資料等級分割到多個伺服器和叢集上。 ### 4.1.資料分割區 分片的第一步是決定如何對資料進行分區。有幾種常見的分區策略,我們將在下一節中詳細探討。 分區策略的選擇取決於應用程式的要求和資料分佈。 ![資料分割區](https://miro.medium.com/v2/resize:fit:375/1*jsHUuhNxK-goazpSQUfAMg.png) ### 4.2.片鍵 **分片鍵**是用來決定特定資料屬於哪個分片的欄位或屬性。選擇合適的分片鍵至關重要,該鍵可以在分片之間均勻分佈資料,以防止熱點(分片接收的流量明顯多於其他分片)。 ### 4.3.資料分佈 一旦對資料進行了分區並選擇了分片鍵,資料就會分佈在可用的分片中。分發過程可以自動化,通常涉及分片機製或服務,根據分片鍵將資料路由到正確的分片。 ### 4.4.查詢路由 當對資料庫進行查詢或請求時,查詢路由器或協調器會根據分片鍵決定要查詢的分片。涉及多個分片的查詢可能需要結果的協調和聚合。 ### 4.5.聚合 在某些情況下,可能需要聚合多個分片的查詢結果才能產生最終結果。這種聚合可以發生在應用程式層級或透過專用聚合層。 ### 4.6.資料一致性 確保分片之間的資料一致性是分片的關鍵方面。兩階段提交或最終一致性等技術用於維護資料完整性。 [![資料庫分片完整指南](https://miro.medium.com/v2/resize:fit:497/1*ZVrIULaZsBFrzfEeoO63IQ.png)](https://www.java67.com/2019/09/top-5-courses-to-learn-system-design.html) --- 5. 分片策略 ------- 選擇正確的分片策略對於分片資料庫系統的成功至關重要。選擇取決於資料的性質、存取模式和可擴展性要求。以下是一些常見的分片策略: ### 5.1.基於範圍的分片 基於範圍的分片涉及根據分片鍵中特定值範圍對資料進行分區。例如,如果您要對客戶資料進行分片,則可以使用基於範圍的策略,其中每個分片包含姓氏以特定字母開頭或屬於特定範圍的客戶。 當資料分佈不均勻且您希望將相關資料保留在一個分片中時,基於範圍的分片非常有用。 以下是[DesignGuru.io](https://bit.ly/3pMiO8g)基於範圍的分片範例: [![基於範圍的資料庫分片](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3j4ttcmk6e1oifbd4sr6.png)](https://bit.ly/3pMiO8g) --- ### 5.2.基於哈希的分片 基於雜湊的分片使用雜湊函數將分片鍵映射到特定分片。這種方法在分片之間均勻分佈資料,有助於避免熱點。 當資料存取模式不可預測或您想要確保資料均勻分佈時,基於雜湊的分片特別有效。 以下是[DesignGuru.io](https://bit.ly/3pMiO8g)在資料庫上基於哈希的分片範例: [![基於哈希的分片](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hoks5uj5825fjwo9zd6m.png)](https://bit.ly/3pMiO8g) --- ### 5.3.基於目錄的分片 基於目錄的分片維護一個中央目錄,將分片鍵對應到對應的分片。此目錄有助於將查詢有效地路由到適當的分片。但是,它可能會引入單點故障。 基於目錄的分片適用於需要對分片分配保持高度控制的場景。 這是[DesignGuru.io](https://bit.ly/3pMiO8g)的基於目錄的分片範例 [![基於目錄的分片](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s8691g3i2seemih5in0p.png)](https://bit.ly/3pMiO8g) --- ### 5.4.地理分片 在處理基於位置的資料(例如使用者位置)時,地理分片是相關的。資料根據與分片鍵關聯的地理區域進行分區。 此策略對於具有地理分佈的使用者或資料的應用程式很有價值。 正如他們所說,一張圖片勝過 1000 個單詞,這是來自[**Architecture Notes**](https://architecturenotes.co/database-sharding-explained/)的漂亮圖表,它解釋了不同類型的資料庫分片 ![資料庫分片策略](https://miro.medium.com/v2/resize:fit:609/1*_X8CwmkPPT1JLyiwSN6ZlQ.jpeg) 信用 --- <https://architecturenotes.co/database-sharding-explained/> --- 6. 挑戰和考慮 -------- 雖然資料庫分片提供了顯著的好處,但它也帶來了一系列挑戰和考慮因素: 6.1.資料遷移 在分片之間遷移資料可能非常複雜且耗時。正確的規劃和工具對於確保遷移過程順利進行至關重要。 6.2.備份與復原 管理備份並確保跨多個分片的資料復原需要仔細的規劃和強大的備份解決方案。 6.3.查詢複雜度 涉及來自多個分片的資料的查詢的實施和最佳化可能很複雜。應用程式程式碼可能需要處理查詢路由和結果聚合。 6.4.資料一致性 在分片環境中維護資料一致性可能具有挑戰性。開發人員需要考慮分散式事務、衝突解決和最終一致性等因素。 6.5.監控和擴展 有效的監控和擴展策略對於確保分片資料庫的健康和效能至關重要。辨識效能瓶頸並根據需要加入新分片至關重要。 ![資料庫分片的挑戰與注意事項](https://miro.medium.com/v2/resize:fit:609/1*GXRq3DgwsPpvG72EDUkX2Q.png) --- 7. 資料庫分片的實際用例 ------------- 資料庫分片適用於可擴展性和效能至關重要的各種現實場景。讓我們探討一些值得注意的例子: 7.1.社群媒體平台 Facebook、Twitter 和 Instagram 等社群媒體平台處理大量用戶生成的內容,包括貼文、圖像和影片。分片使這些平台能夠有效地分發和管理用戶資料。 7.2.電子商務網站 電子商務網站面臨著劇烈的流量波動,尤其是在促銷活動期間。分片幫助他們處理增加的負載並提供無縫的購物體驗。 7.3.遊戲應用 線上遊戲應用程式通常需要即時互動和低延遲回應時間。分片可確保遊戲資料的分佈以獲得最佳效能。 7.4.金融服務 金融機構每天處理大量的交易資料。分片允許他們擴展資料庫以處理負載,同時保持資料完整性。 ![MongoDB 中的資料庫分片](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c5rwxxozvp46xalmhu8r.png) --- 8. 如何實現資料庫分片? ------------- 實施資料庫分片需要仔細的規劃和執行。以下是涉及的步驟: 8.1.評估與規劃 首先評估應用程式的可擴展性要求和資料分佈模式。選擇合適的分片策略和分片鍵。 8.2.資料庫設計 設計資料庫架構以適應分片。定義資料如何跨分片分區和分佈。 8.3.分片實施 實施分片機製或使用適合您選擇的策略的分片資料庫系統。跨分片分佈現有資料。 8.4.查詢路由 發展一種查詢路由機制,根據分片鍵將查詢定向到適當的分片。如有必要,處理查詢聚合。 8.5。資料一致性 實施資料一致性機制,例如分散式交易或最終一致性,以維護資料完整性。 8.6。測試與優化 徹底測試分片資料庫系統,優化查詢並監控效能。根據需要擴展系統。 讓我告訴你一個秘密,分片還可以讓你的資料庫更快: ![分片如何使資料庫更快](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a4xuebb3yiyfkg4bebaz.png) --- ### 9. 資料庫分片最佳實踐 若要充分利用資料庫分片,請考慮遵循以下最佳實務: - **選出正確的分片鍵:** 選擇能夠均勻分佈資料並避免熱點的分片鍵。 - **監控和規模**: 持續監控分片資料庫的運作狀況和效能。隨著資料的成長加入新的分片。 - **備份和災難復原:** 實施強大的備份和復原程序來保護您的資料。 - **資料遷移:** 仔細規劃資料遷移並使用高效率的工具和流程。 - **查詢最佳化:** 優化分片環境中的查詢效能。 - **資料一致性:** 了解並實施適合您的應用程式的資料一致性模型。 而且,如果您需要備忘單,這裡有[**ByteByteGo**](https://bit.ly/3P3eqMN)提供的一份不錯的資料庫分片備忘單,可幫助您快速修改關鍵分片概念 [![資料庫分片備忘單](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wgf23bifr1mvth1hol9j.jpg)](https://bit.ly/3P3eqMN) --- ### 系統設計訪談資源: 而且,這裡列出了最佳系統設計書籍、線上課程和練習網站,您可以查看這些內容,以便更好地為系統設計面試做好準備。這些課程中的大多數也回答了我在這裡分享的問題。 1. [**DesignGuru 的 Grokking 系統設計課程**](https://bit.ly/3pMiO8g):一個互動式學習平台,提供實作練習和真實場景,以增強您的系統設計技能。 2. [**《系統設計面試》作者:Alex Xu**](https://amzn.to/3nU2Mbp) :這本書深入探討了系統設計概念、策略和麵試準備技巧。 3. Martin Kleppmann 的[**「設計資料密集型應用程式」**](https://amzn.to/3nXKaas) :綜合指南,涵蓋了設計可擴展且可靠的系統的原則和實踐。 4. [LeetCode 系統設計 標籤](https://leetcode.com/explore/learn/card/system-design):LeetCode 是一個受歡迎的技術面試準備平台。 LeetCode 上的系統設計標籤包含各種練習問題。 5. GitHub 上的[**「系統設計入門」**](https://bit.ly/3bSaBfC) :精選的資源列表,包括文章、書籍和影片,可幫助您準備系統設計面試。 6. [**Educative 的系統設計課程**](https://bit.ly/3Mnh6UR):一個互動式學習平台,提供實作練習和真實場景,以增強您的系統設計技能。 7. **高可擴展性部落格**:該部落格包含有關高流量網站和可擴展系統架構的文章和案例研究。 8. **[YouTube 頻道](https://medium.com/javarevisited/top-8-youtube-channels-for-system-design-interview-preparation-970d103ea18d)**:請參閱「Gaurav Sen」和「Tech Dummies」等頻道,以取得有關係統設計概念和麵試準備的富有洞察力的影片。 9. [**ByteByteGo**](https://bit.ly/3P3eqMN) :Alex Xu 的一本現場書籍和課程,用於系統設計面試準備。它包含《系統設計訪談》第一捲和第二卷的所有內容,並將隨即將推出的第三卷進行更新。 10. [**Exponent**](https://bit.ly/3cNF0vw) :一個專為面試準備的網站,特別是針對亞馬遜和谷歌等 FAANG 公司,他們還有很棒的系統設計課程和許多其他材料,可以幫助您破解 FAAN 面試。 [![如何為系統設計做準備](https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkqv3p46jmw5qc0newuiu.jpg)](https://bit.ly/3P3eqMN) image\_credit - [ByteByteGo](https://bit.ly/3P3eqMN) 請記住透過參與實際專案和參加模擬面試將理論知識與實際應用結合。不斷的練習和學習無疑會提高你在系統設計面試中的熟練程度。 --- ### 10. 結論 這就是關於**資料庫分片及其工作原理的**全部內容。資料庫分片是實現水平可擴展性以及處理大量資料和高工作負載的強大策略。 透過跨多個分片分佈資料,組織可以提高效能、確保高可用性並滿足現代應用程式的需求。 然而,**分片並不是萬能的解決方案**,並且有其自身的一系列挑戰和考慮因素。正確的規劃、仔細的實施和遵守最佳實踐是成功分片的關鍵。 隨著資料量和複雜性不斷增長,掌握資料庫分片技術對於企業和開發人員來說變得越來越重要。 獎金 --- 正如承諾的,這是給你的獎金,一本免費的書。我剛剛找到一本新的免費書籍來學習分散式系統設計,您也可以在 Microsoft 上閱讀它 --- [https://info.microsoft.com/rs/157-GQE-382/images/EN-CNTNT -eBook-設計分散式系統.pdf](https://info.microsoft.com/rs/157-GQE-382/images/EN-CNTNT-eBook-DesigningDistributedSystems.pdf) ![學習分散式系統的免費書籍](https://miro.medium.com/v2/resize:fit:317/0*ICrIesz1fT-KtmUZ.png) --- 原文出處:https://dev.to/somadevtoo/database-sharding-for-system-design-interview-1k6b

GraphQL、REST 和 gRPC 之間的區別

*揭露:這篇文章包含附屬連結;如果您透過本文中提供的不同連結購買產品或服務,我可能會獲得補償。* [![GraphQL、REST 和 gRPC 之間的區別](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j0rpasf3053dewpovmo4.png)](https://bit.ly/3pMiO8g) image\_credit -[設計大師](https://bit.ly/3pMiO8g) 開發者們大家好,如果您正在準備編碼面試以及系統設計和微服務面試,您還應該準備 REST、GraphQL 和 gRPC 等內容,例如**REST、GraphQL 和 gRPC 之間有什麼區別?** ,這也是程式設計面試的熱門議題之一。 之前,我討論了[API 網關與負載平衡器](https://dev.to/somadevtoo/difference-between-api-gateway-and-load-balancer-in-system-design-54dd)、[水平與垂直擴展](https://dev.to/somadevtoo/horizontal-scaling-vs-vertical-scaling-in-system-design-3n09)、 [正向代理與反向代理](https://dev.to/somadevtoo/difference-between-forward-proxy-and-reverse-proxy-in-system-design-54g5)之間的區別以及[**JWT、OAuth 和 SAML 之間的區別**](https://medium.com/javarevisited/difference-between-jwt-oauth-and-saml-for-authentication-and-authorization-in-web-apps-75b412754127),在本文中,我將分享我對REST、 GraphQL 的想法,和 gRPC,這三種用於建立 Web API 的流行通訊協定。 它們用於允許不同的軟體元件透過網路相互通信,例如[微服務可以使用 REST 在它們之間進行同步通訊](https://medium.com/javarevisited/how-microservices-communicates-with-each-other-synchronous-vs-asynchronous-communication-pattern-31ca01027c53)。 這些協議都有自己的優點和缺點,了解它們之間的差異不僅從技術面試的角度很重要,而且對於為您的專案選擇正確的協議也很重要。 在本文中,您將了解**REST、GraphQL 和 gRPC 之間的差異**。您將了解每個協議背後的核心概念、它們的優點和缺點,並提供一些何時使用每個協議的用例。 讀完本文後,您應該更了解哪種協議最適合您的專案要求。 順便說一句,如果您正在準備系統設計面試並想深入學習系統設計,那麼您還可以查看[**ByteByteGo**](https://bit.ly/3P3eqMN) 、 [**Design Guru**](https://bit.ly/3pMiO8g) 、 [**Exponent**](https://bit.ly/3cNF0vw) 、 [**Educative**](https://bit.ly/3Mnh6UR)和[**Udemy**](https://bit.ly/3vFNPid)等網站,它們有許多很棒的系統設計課程 [![如何回答系統設計問題](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fehiytzxrwt4g89ubwfm.jpg)](https://bit.ly/3pMiO8g) 我們將首先進行一些介紹,然後深入研究它們中的每一個,然後再次回顧它們的差異,以便您清楚地了解它們的優點和缺點以及何時使用它們。 [REST](https://en.wikipedia.org/wiki/Representational_state_transfer)代表表述性狀態傳輸,它是一種流行的協議,用於建立透過 HTTP 公開資料和功能的 Web 服務。 它基於 HTTP 協定和一組約束,定義如何辨識和定址資源以及如何對這些資源執行操作。 另一方面, [**GraphQL**](https://graphql.org/)是 Facebook 開發的 API 查詢語言。它允許客戶端準確指定他們需要的資料,並且伺服器僅使用該資料進行回應。 GraphQL 的建立是為了解決 REST 的缺點和限制,因此它提供了一種更靈活、更有效的從伺服器獲取資料的方式,因為客戶端可以在單一請求中請求多個資源。 而且, [gRPC](https://grpc.io/)是一種用於建立 API 的高效能開源協定。它使用**Google 的 Protocol Buffers**作為資料格式,並提供對串流和雙向通訊的支援。 gRPC 由於其效能和對多種程式語言的支援而經常用於[微服務架構](https://javarevisited.substack.com/p/difference-between-microservices)中。 現在我們知道它們是什麼,讓我們深入研究它們。 --- 什麼是 REST?什麼時候使用它? -------------- 正如我所說,REST(表述性狀態傳輸)是一種用於設計分散式應用程式(尤其是基於 Web 的 API)的架構風格。 [RESTful API](https://javarevisited.blogspot.com/2018/02/top-5-restful-web-services-with-spring-courses-for-experienced-java-programmers.html)使用 HTTP 方法(例如 GET、POST、PUT、DELETE)對 URL(統一資源定位器)辨識的資源執行 CRUD(建立、讀取、更新、刪除)操作。 > > 如果您了解 HTTP,那麼您就了解 REST。 REST 還依賴**無狀態的客戶端-伺服器架構**,其中來自客戶端的每個請求都包含伺服器完成請求所需的所有訊息,而無需維護會話狀態。 以下是 REST 是不錯選擇的一些場景: 1. **當您需要透過 API 公開資料和服務時,**因為 REST 是一種流行且完善的協議,用於建立可供其他應用程式和服務輕鬆使用的 API。 2. **當您需要支援多種平台和程式語言時,**因為 REST 依賴標準 HTTP 方法和資料格式,因此它可以被多種程式語言和平台使用。 3. **當您需要支援快取時,**因為REST支援緩存,這可以提高效能並減少網路流量。 4. 當您需要建立簡單、輕量級的 API 時 5. 當您需要支援大量資源時 此外,了解 HTTP 方法對於設計 REST API 非常重要。您可以進一步查看[**REST API 設計、開發和管理**](https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&subid=0&offerid=323058.1&type=10&tmpid=14538&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Frest-api%2F)課程,以了解 REST API 設計、開發和管理。 [![何時使用 REST API](https://miro.medium.com/v2/resize:fit:609/1*X-VfQ3bf6WL-tcb9C8J7DA.png)](https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&subid=0&offerid=323058.1&type=10&tmpid=14538&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Frest-api%2F) 總體而言, **REST 是一種靈活且廣泛採用的協議**,對於許多類型的 API 來說都是不錯的選擇。 然而,它可能不是所有場景的最佳選擇,特別是那些需要即時更新或更複雜的查詢和資料操作的場景。 在這些情況下,其他協定(例如 GraphQL 或 gRPC)可能更合適。 --- 什麼是 GraphQL?什麼時候使用它? -------------------- GraphQL 是一種 API 查詢語言,由 Facebook 於 2012 年開發,並於 2015 年作為開源專案發布。 GraphQL 允許客戶端定義他們所需的資料結構,並且伺服器可以準確地回應該資料,而無需任何不必要的資料。 它通常用作 RESTful API 的替代方案,特別是在客戶端需要對傳回的資料進行細微控制的情況下。 以下是 GraphQL 是不錯選擇的一些場景: 1. 當您想要減少網路流量時,GraphQL 允許客戶端準確指定他們需要的資料,這可以減少透過網路傳輸的不必要的資料量。 2. 當您需要支援各種客戶端時,因為 GraphQL 支援強類型查詢,這可用於確保客戶端以他們理解的格式接收正確的資料。 3. **當您需要支援即時更新時**,因為 GraphQL 支援透過訂閱進行即時更新,這允許客戶端在更新可用時立即接收更新。 4. 當您需要支援複雜的查詢和資料操作時:因為GraphQL允許客戶端使用簡單的語法執行複雜的查詢和資料操作操作,例如過濾、排序和聚合。 5. 當您需要支援版本控制時,因為 GraphQL 透過允許客戶端指定他們在請求中使用的架構版本來支援版本控制,這樣隨著架構隨時間的發展,可以更輕鬆地保持向後相容性。 總的來說,GraphQL 是一個強大且靈活的協議,對於資料細粒度控制和即時更新很重要的場景來說,它是一個不錯的選擇。 但是,**它可能比 RESTful API 需要更多的設定和配置,**特別是當您使用多種程式語言或平台時。 您可以進一步查看[**GraphQL by Example**](https://click.linksynergy.com/deeplink?id=CuIbQrBnhiw&mid=39197&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fgraphql-by-example%2F%3FcouponCode%3DLEADERSALE24A)和[GraphQL with React: The Complete Developers Guide](https://click.linksynergy.com/deeplink?id=CuIbQrBnhiw&mid=39197&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fgraphql-with-react-course%2F%3FcouponCode%3DLEADERSALE24A)以了解有關 GraphQL 及其使用方法的更多資訊。 這也是一個很好的圖表,突出顯示了**REST 和 GraphQL 查詢之間的差異:** [![何時使用 GraphQL](https://miro.medium.com/v2/resize:fit:609/0*7uX0fDc7ROg3OgjF.png)](https://click.linksynergy.com/deeplink?id=CuIbQrBnhiw&mid=39197&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fgraphql-by-example%2F%3FcouponCode%3DLEADERSALE24A) --- 什麼是 gRPC?什麼時候使用它? ----------------- 現在讓我們看看什麼是 gRPC 以及它提供什麼? gRPC 是 Google 開發的一個高效能、開源的遠端過程呼叫 (RPC) 框架。 它使用Protocol Buffers作為介面描述語言,支援多種程式語言,可以輕鬆建構跨不同平台和環境的分散式系統。 以下是 gRPC 是不錯選擇的一些場景: 1. **當您需要高效能和高效率時,**因為 gRPC 使用二進位協定並支援串流傳輸,這可以使其比其他協定更快、更有效率,特別是在高延遲或低頻寬連線上。 2. 當您需要支援多種程式語言時,因為 gRPC 支援多種程式語言,包括 Java、C++、Python 和 Go,可以輕鬆建立跨不同平台和環境的分散式系統。 3. 當您需要支援即時更新時,因為 gRPC 支援雙向流,這允許伺服器即時向客戶端發送更新。 4. **當您需要處理大量資料時,**因為 gRPC 使用 Protocol Buffers,它比 JSON 或 XML 等其他資料格式更有效率、更緊湊,使其成為處理大量資料的不錯選擇。 5. 當您需要建立微服務或分散式系統時,因為 gRPC 提供了一個強大且靈活的框架,用於建立可以水平擴展並處理大量流量的微服務和分散式系統。 總體而言,gRPC 是一個強大且高效的協議,對於效能、效率和即時更新很重要的場景來說,它是一個不錯的選擇。 但是,**與 RESTful API 等其他協定相比,它可能需要更多的設定和配置**,特別是當您使用多種程式語言或平台時。 您可以進一步查看[Protocol Buffers 3 完整指南 \[Java、Golang、Python\]](https://click.linksynergy.com/deeplink?id=JVFxdTr9V80&mid=39197&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fprotocol-buffers%2F)和[gRPC \[Java\] 大師班:建立現代 API 和微服務](https://click.linksynergy.com/deeplink?id=JVFxdTr9V80&mid=39197&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fgrpc-java%2F),以了解有關 gRPC 和 Google Protocol buffer 的更多資訊。 這是一個很好的圖表,突出顯示了 REST、gRPC 和 GraphQL 請求之間的區別 [![REST 和 GraphQL 之間的區別](https://miro.medium.com/v2/resize:fit:609/1*o4TgSCCvQgyE0OKsVSgQwg.png)](https://click.linksynergy.com/deeplink?id=JVFxdTr9V80&mid=39197&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Fprotocol-buffers%2F) image\_credit --- [https://medium.com/@LadyNoBug/grpc-vs-rest-vs-others-5d8b6eaa61df](https://medium.com/@LadyNoBug/grpc-v-s-rest-v-s-others-5d8b6eaa61df) --- GraphQL、REST 和 gRPC 之間的區別 ------------------------- 現在您已經了解什麼是REST、gRPC 和GraphQL 以及它們的工作原理,以下是REST、GraphQL 和gRPC 之間的主要區別(以點格式表示),記住它們的主要特徵以及何時在專案中使用它們: ### REST: - 代表代表性狀態轉移 - 使用 HTTP 方法(GET、POST、PUT、DELETE)執行 CRUD 操作 - 以結構化格式傳送資料,通常是 JSON 或 XML - 不同資源可以有多個端點 - 客戶端收到回應中指定的所有資料,即使他們不需要全部資料 - 支援緩存,但管理起來可能很複雜 - 完善且廣泛採用,提供大量工具和文件 ### 圖形語言: - 允許客戶準確指定他們需要什麼資料,並僅接收該資料 - 使用單一端點存取多個資源 - 擁有自己的查詢語言,允許複雜的資料取得和操作 - 可以支援透過訂閱即時更新 - 在某些情況下比 REST 更有效率,特別是對於頻寬有限的行動設備 - 與 REST 相比,快取可以更細粒度且更易於管理 - 比 REST 需要更多的設定和配置,並且可能需要更多的專業知識才能有效使用 ### 遠程過程呼叫: - 代表帶有 Google 協定緩衝區的遠端程序呼叫 (RPC) - 使用二進位資料代替 HTTP 進行通信 - 支援串流資料即時更新 - 使用協定緩衝區進行序列化,這比 JSON 或 XML 更有效率 - 可以跨不同的程式語言使用 - 專為微服務之間的高效能、低延遲通訊而設計 - 比 REST 需要更多的設定和配置,並且可能需要更多的專業知識才能有效使用 - 互通性可能不如 REST 或 GraphQL,因為它不是基於 HTTP 這裡還有一個很好的表格,突出顯示了 REST、GraphQL 和 gRPC 之間的區別,您可以使用它來快速複習: [![REST、GraphQL 和 gRPC 之間的區別](https://miro.medium.com/v2/resize:fit:609/1*USJRkl5JS0IT90RqwMEopA.png)](https://javarevisited.blogspot.com/2022/04/difference-between-graphql-and-rest-api.html) 還值得注意的是,**這些協議並不相互排斥,並且可以組合使用它們以利用它們的不同優勢。** 例如,您可能對大多數 API 使用 REST,但對某些資源密集型查詢使用 GraphQL,或使用 gRPC 在微服務之間進行通信,同時對外部 API 用戶端使用 REST 或 GraphQL。 --- ### 系統設計訪談資源: 而且,如果您正在準備系統設計面試,那麼這裡有一些最佳系統設計書籍、線上課程和練習網站的精選列表,您可以查看這些內容,以便更好地準備系統設計面試。 1. [**DesignGuru 的 Grokking 系統設計課程**](https://bit.ly/3pMiO8g):一個互動式學習平台,提供實作練習和真實場景,以增強您的系統設計技能。 2. [**《系統設計面試》作者:Alex Xu**](https://amzn.to/3nU2Mbp) :這本書深入探討了系統設計概念、策略和麵試準備技巧。 3. Martin Kleppmann 的[**「設計資料密集型應用程式」**](https://amzn.to/3nXKaas) :綜合指南,涵蓋了設計可擴展且可靠的系統的原則和實踐。 4. [LeetCode 系統設計 標籤](https://leetcode.com/explore/learn/card/system-design):LeetCode 是一個受歡迎的技術面試準備平台。 LeetCode 上的系統設計標籤包含各種需要練習的問題。 5. GitHub 上的[**「系統設計入門」**](https://bit.ly/3bSaBfC) :精選的資源列表,包括文章、書籍和影片,可幫助您準備系統設計面試。 6. [**Educative 的系統設計課程**](https://bit.ly/3Mnh6UR):一個互動式學習平台,提供實作練習和真實場景,以增強您的系統設計技能。 7. **高可擴展性部落格**:該部落格包含有關高流量網站和可擴展系統架構的文章和案例研究。 8. **[YouTube 頻道](https://medium.com/javarevisited/top-8-youtube-channels-for-system-design-interview-preparation-970d103ea18d)**:請參閱「Gaurav Sen」和「Tech Dummies」等頻道,以取得有關係統設計概念和麵試準備的富有洞察力的影片。 9. [**ByteByteGo**](https://bit.ly/3P3eqMN) :Alex Xu 的一本現場書籍和課程,用於系統設計面試準備。它包含《系統設計訪談》第一捲和第二卷的所有內容,並將隨即將推出的第三卷進行更新。 10. [**Exponent**](https://bit.ly/3cNF0vw) :一個專為面試準備的網站,特別是針對亞馬遜和谷歌等 FAANG 公司,他們還有很棒的系統設計課程和許多其他材料,可以幫助您破解 FAAN 面試。 [![如何為系統設計做準備](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kqv3p46jmw5qc0newuiu.jpg)](https://bit.ly/3P3eqMN) image\_credit - [ByteByteGo](https://bit.ly/3P3eqMN) #### 結論 這就是**REST、GraphQL 和 gRPC 技術之間的差異。**簡而言之,REST 是一種用於建立Web 服務的流行協議,受到HTTP 的啟發並充分利用HTTP 提供的功能,而GraphQL 是一種查詢語言,允許客戶端準確指定他們需要從伺服器獲取哪些資料。 它的建立是為了解決 REST 的缺點,因此如果您正在努力維護 REST API,那麼它絕對是一個可行的選擇。 另一方面, **gRPC**是一種高效能、開源協議,常用於微服務架構。 這些協定中的每一個都有不同的用途,並且它們都可以一起使用,為 Web 應用程式提供全面且高效的通訊系統。 --- 原文出處:https://dev.to/somadevtoo/difference-between-graphql-rest-and-grpc-58bl

10 個工程博客,免費成為系統設計英雄

簡介: ------- 系統設計基本上是您想要建造的系統的藍圖。它是定義系統架構、元件和介面以滿足某些特定需求的過程。系統設計是軟體開發行業的熱門話題之一,在技術面試中被廣泛詢問,學習這項技能將保證你的加薪。 ![唐納川普說系統設計就是金錢](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/26gmdveo1ak1y0r752cn.gif) 在這篇文章中,我將分享十大系統設計工程博客,這些博客將幫助您免費成為系統設計大師 [字節字節 Go 博客](https://blog.bytebytego.com/) ------------------------------------------ Byte Byte Go 是一家教育科技新創公司,專注於提供系統設計主題的培訓和課程,幫助您像專業人士一樣在系統設計面試中取得好成績。 Byte Byte go 可以認為是學習和掌握系統設計技能最好的學校之一。 他們使用互動式動畫影片、心智圖、備忘錄等分解了複雜的系統設計主題,這將幫助您輕鬆掌握系統設計。無論您是系統設計新手還是想跟上當前行業標準,Byte Byte Go 都是您的必去之選 ![位元組GO博客](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ffpgu7maxrhb2jbejve5.png) [谷歌研究](https://research.google/blog/?page=1&) --------------------------------------------- 谷歌是世界上最受歡迎、最高效的搜尋引擎之一。他們每天在其平台上處理數十億用戶和請求。 Angular、Flutter、Android、Google Cloud、Firebase 等 Google 產品是幾乎每個開發人員都使用的一些關鍵技術。谷歌研究平台擁有廣泛的軟體開發主題,包括機器學習、軟體系統、硬體和架構、分散式和平行系統,這個平台是軟體開發人員學習和研究各種主題的隱藏寶石 ![谷歌研究](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3jwp16grrttt33g44eg1.png) [Dropbox 技術博客](https://dropbox.tech/) ------------------------------------- Dropbox 是一家美國科技公司,為各種用例提供儲存解決方案和其他軟體產品。他們每天也處理數百萬個請求,然後管理和擴展大型軟體基礎設施。在這裡您可以探索各種主題,例如基礎設施、前端開發、安全性、行動應用程式開發等。 ![投遞箱技術博客](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gdp43crv099kww6yl8ls.png) [Netflix 科技部落格](https://netflixtechblog.com/) --------------------------------------------- Netflix 是全球最受歡迎、最成功的 Ott 巨頭之一,每天處理數百萬用戶和請求。您可以關注 Netflix 工程博客,了解從視訊串流、微服務到機器學習和人工智慧等各種主題。如果您在 Ott 行業工作或計劃在視訊串流技術之上建立一些東西,您必須關注 Netflix 技術部落格以供參考。 ![Netflix 科技部落格](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2trw7unayy4uett3cri0.png) [優步工程博客](https://eng.uber.com/) ------------------------------- 優步是世界上最受歡迎、也有望成為最大的線上計程車服務提供者之一。優步也涉足線上食品配送領域。我將 Uber 工程部落格放入此列表的原因是因為您會在他們的部落格中找到一些最重要的主題,例如使用地圖和位置來提供服務。使用地理位置資料是軟體工程中最重要的主題之一,電子商務和物流等最常見的工業部門非常依賴這些訊息,以便他們能夠盡快交付產品或服務。如果您是軟體產業中從事地理位置或導航技術工作或計劃使用這些技術建立某些東西的人,那麼 Uber 工程部落格是您必須查看的內容 ![優步工程博客](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m1kwwqi4orz3cunyeo9p.png) [元工程博客](https://engineering.fb.com/) ------------------------------------ Meta(原 Facebook)是世界上最大的社群媒體巨頭,也是最受歡迎的用於建立使用者介面的 JavaScript 函式庫(即 React.js)的創辦人和維護者。除此之外,幾乎所有流行的社交媒體應用程式(包括 facebook、instagram、whatsapp、threads 等)都歸他們所有。元工程博客包含廣泛的軟體工程主題,如網絡和移動開發、基礎設施系統、影片技術、AR 和 VR 技術等。 VR 科技 ![元工程](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d8mba756nkk0q9fnsy4t.png) [Stripe 工程博客](https://stripe.com/blog/engineering) -------------------------------------------------- Stripe 是最受歡迎的提供支付相關解決方案的公司之一。大多數線上企業和電子商務網站都使用 stripe 來處理付款、訂閱和發票,即使我也使用 stripe 來存取客戶的付款。 Stripe Engineering 部落格涵蓋了廣泛的主題,您可以探索這些主題,例如使用機器學習進行詐欺偵測、用於響應式和互動式支付介面的 UI 和 UX 相關主題、應用程式安全性等等。因此,如果您正在從事支付工作或計劃建立與處理支付相關的東西,您一定要查看 Stripe 工程部落格作為參考。 ![Stripe 工程博客](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5g8eoq6f2puv2nkekfxy.png) [亞馬遜工程博客](https://aws.amazon.com/blogs) --------------------------------------- 亞馬遜工程博客 亞馬遜是世界上最大的電子商務巨頭,不僅如此,它還擁有亞馬遜網路服務(最大的雲端服務供應商)、亞馬遜Prime(最受歡迎的OTT巨頭之一)、有聲故事平台亞馬遜音樂等等。多的。 Amazon Engineering 部落格涵蓋了廣泛的主題,包括容器和 Kubernetes、雲端模式和架構、機器學習和 Amazon 人工智慧技術,以解決複雜的業務挑戰。因此,如果您打算使用 AWS 建立下一個應用程式或整合 Alexa 等亞馬遜技術,那麼亞馬遜工程部落格是您必須查看的地方。 ![亞馬遜工程博客](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a07bwfp2rsebvi180cnl.png) [微軟開發部落格](https://devblogs.microsoft.com/) ------------------------------------------ 微軟是美國最受歡迎的科技巨頭之一,擁有最常用的作業系統 Windows、用於建立極快企業應用程式的點網框架、Bing 搜尋引擎、copilot(最高效的人工智慧工具之一)、最大的程式碼共享、託管和版本控制平台GitHub、Azure雲端平台(最大的雲端服務提供者之一)。 Microsoft 工程部落格包含廣泛的主題和教程,還包括 Windows、azure、機器學習和人工智慧、dot net 框架。如果您打算使用 Microsoft 技術建立下一個應用程式或軟體,那麼您必須關注它 ![微軟開發部落格](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y10tc92q65czuks6cidk.png) [蘋果開發者新聞](https://developer.apple.com/news/) -------------------------------------------- 蘋果是世界上最大的科技巨頭之一,也擁有最受歡迎的Mac作業系統和IOS(iPhone作業系統)。 MacBook 和 iPhone 擁有非常龐大的用戶群,因此大多數新創公司和企業也為 Mac 和 IOS 用戶打造產品。 Apple 開發者新聞主要包含與IOS、Swift(建立本機IOS 和Mac OS 應用程式的唯一語言)、Swift UI(Apple UI)相關的主題,以及一些與C++、Kubernetes 等主題相關的主題。正在計劃的人要為 iOS 或 Mac OS 用戶建立軟體,開發者新聞是您必須參考的。 ![蘋果開發者新聞](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8ewo1tt4046wgom5d8hy.png) 結論 -- 在本文中,我討論了 10 個您必須查看的工程博客,以提高您的系統設計技能。如果您關注每個博客,那很好,但我建議您必須僅根據您將使用的堆疊或您正在處理的行業類型來查看那些博客 --- 原文出處:https://dev.to/kumarkalyan/10-engineering-blogs-to-become-a-system-design-hero-for-free-20ee

系統設計面試的 10 個微服務架構挑戰

*揭露:這篇文章包含附屬連結;如果您透過本文中提供的不同連結購買產品或服務,我可能會獲得補償。* [![微服務架構最佳實踐](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rkibz6xn6xqibepgu9cz.png)](https://bit.ly/3P3eqMN) image\_credit - [ByteByteGo](https://bit.ly/3P3eqMN) 朋友們大家好,如果您正在準備系統設計面試,那麼您也必須準備微服務架構。這是許多面試官最喜歡的架構,它提供了大量的材料來拷問你。 毫無疑問,微服務架構透過將單體應用程式分解為更小的、鬆散耦合的服務,徹底改變了軟體開發。 過去,我分享過幾篇系統設計面試文章,例如[API 網關與負載平衡器](https://medium.com/javarevisited/difference-between-api-gateway-and-load-balancer-in-microservices-8c8b552a024)、 [正向代理與反向代理](https://medium.com/javarevisited/difference-between-forward-proxy-and-reverse-proxy-in-system-design-da05c1f5f6ad)以及[常見的系統設計問題](https://medium.com/javarevisited/7-system-design-problems-to-crack-software-engineering-interviews-in-2023-13a518467c3e),在本文中我們將討論微服務架構的挑戰。 它也是程式設計師必須了解的[基本系統設計主題或概念](https://medium.com/javarevisited/top-10-system-design-concepts-every-programmer-should-learn-54375d8557a6)之一。 雖然微服務方法承諾提高可擴展性、靈活性和更快的開發週期,但它也帶來了一系列挑戰,這對開發人員來說非常重要,不僅要了解這些挑戰,還要有效地解決這些挑戰。 雖然有很多文章討論微服務最佳實踐,但很少有文章闡述它們提供的好處以及它們解決的挑戰。 在本文中,我們將探討開發人員在使用微服務時所面臨的十大主要挑戰,並學習克服這些挑戰的有效策略。 順便說一句,如果您正在準備系統設計面試並想深入學習系統設計,那麼您還可以查看[ByteByteGo](https://bit.ly/3P3eqMN) 、 [Design Guru](https://bit.ly/3pMiO8g) 、 [Exponent](https://bit.ly/3cNF0vw) 、 [Educative](https://bit.ly/3Mnh6UR)和[Udemy](https://bit.ly/3vFNPid)等網站,它們有許多很棒的系統設計課程 此外,對各種微服務模式(例如服務發現、CQRS 和 Saga)的紮實了解對於解決我們將在本文中討論的許多挑戰大有幫助,就此而言,這裡有一個來自[DesignGuru.io](https://designgurus.org/link/84Y9hP)的漂亮圖表,說明如何微服務中的服務發現工作,我們將在本文後面使用此模式 [![微服務中的服務發現](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e0ke14if9uyunsszj0lu.png)](https://www.designgurus.io/course/grokking-microservices-design-patterns?aff=84Y9hP) --- 微服務開發的10大挑戰及解決方案 ---------------- 以下列出了使用微服務架構建立應用程式時可能面臨的主要挑戰 ### 1. 服務溝通挑戰 如果您在現實世界的微服務架構中工作過,那麼您可能知道微服務嚴重依賴服務間通信,隨著服務數量的增長,這可能會成為一個挑戰。 由於每個服務都有自己的 API 和協議,管理通訊變得複雜。 為了解決這個問題,請採用 REST、訊息佇列和事件驅動架構等通訊模式。此外,請考慮使用[**API 閘道**](https://medium.com/javarevisited/difference-between-api-gateway-and-load-balancer-in-microservices-8c8b552a024)來集中通訊邏輯並處理橫切問題。 ![微服務架構挑戰](https://miro.medium.com/v2/resize:fit:609/1*I4tv-pLx4ccaaBTFzquzsA.png) --- ### 2. 資料管理挑戰 由於架構的分散性,跨微服務的資料管理可能會很複雜。不一致的資料模型和維護資料一致性帶來了困難。 為了解決這個問題,您可以實施多語言持久性策略,使用適合每個服務特定需求的資料庫。 您還應該利用事件來源和[**CQRS(命令查詢職責分離)**](https://javarevisited.substack.com/p/how-cqrs-pattern-works-in-microservices)等技術來維護資料完整性以及讀寫操作的分離。 [![微服務的資料管理挑戰](https://miro.medium.com/v2/resize:fit:609/1*XKdhM77EN6isbz5eeH2K9A.jpeg)](https://medium.com/javarevisited/what-is-cqrs-command-and-query-responsibility-segregation-pattern-7b1b38514edd) --- ### 3. 分散式追蹤與監控挑戰 由於請求跨越多個服務,監控和除錯微服務應用程式變得非常具有挑戰性。傳統的監控工具可能無法提供所需的可見度。 為了解決這個問題,您應該整合 Jaeger 或 Zipkin 等分散式追蹤系統來追蹤跨服務的請求。 您還可以使用集中式日誌記錄和監控解決方案來聚合和分析來自各種服務的日誌和指標,有助於早期發現問題。 對於開發人員來說,微服務中的偵錯問題是處理和了解 Zipkin 等追蹤系統真正運作的最大挑戰之一。 ![微服務架構中的分散式追蹤與監控挑戰](https://miro.medium.com/v2/resize:fit:609/1*MRyM0qiMBljjsfnoemCAeg.png) --- ### 4. 服務編排與編排挑戰 微服務可以集中編排,也可以以分散的方式編排。這兩種方法都有其挑戰。 編排服務可能會導致單點故障,而編排可能會導致追蹤流程的複雜性和難度增加。 在這種情況下,您應該努力尋求平衡,對關鍵工作流程採用編排,並對可以獨立運作的服務進行編排。 ![微服務中的服務編排與編排挑戰](https://miro.medium.com/v2/resize:fit:609/1*O_AFZvulWl5ZZYE1BG7hYQ.png) --- ### 5. 部署與 DevOps 挑戰 微服務的部署涉及管理多個服務實例並確保不同環境之間的相容性。使用傳統方式部署微服務幾乎是不可能的。 使用 Docker 等工具的容器化和使用[Kubernetes 的](https://medium.com/javarevisited/top-15-online-courses-to-learn-docker-kubernetes-and-aws-for-fullstack-developers-and-devops-d8cc4f16e773)編排可以幫助標準化部署流程,事實上,如果您想要穩健的話,它們是必須的。 您還應該採用**DevOps 實踐**並自動化部署管道,以確保微服務的一致性和快速部署。 ![微服務中的部署與 DevOps 挑戰](https://miro.medium.com/v2/resize:fit:609/1*Bxoxd1eCCtPyJzMtLeFVYw.jpeg) --- ### 6. 跨服務挑戰的測試 測試微服務一點也不容易,由於其互動的複雜性,它需要一個全面的策略。 傳統的單元測試可能還不夠。 為了解決這個問題,您可以結合整合測試、合約測試和端到端測試來驗證服務互動和資料流。 您還應該實施一個強大的[CI/CD 管道](https://javarevisited.blogspot.com/2018/09/top-5-jenkins-courses-for-java-and-DevOps-Programmers.html),以在整個微服務生態系統中自動進行測試。 ![應對微服務中的服務挑戰](https://miro.medium.com/v2/resize:fit:609/1*fKlBw13XQ5RyazLXl2MIIQ.png) --- ### 7. 安全和存取控制挑戰 微服務可能會暴露大量端點,從而增加潛在的攻擊面。大多數時候,您甚至不會意識到這一點,但不用擔心,幾乎所有大型組織都有龐大的安全團隊,高薪來騷擾您。 就您而言,您應該確保跨服務的安全性,管理身分驗證和授權以及保護傳輸中的資料會帶來重大挑戰。 採用零信任安全模型,實作[OAuth2](https://medium.com/javarevisited/5-best-online-courses-to-learn-oauth-2-0-and-jwt-in-2023-719fd63c834)和[JWT(JSON Web Tokens)](https://medium.com/javarevisited/difference-between-jwt-oauth-and-saml-for-authentication-and-authorization-in-web-apps-75b412754127)等 API 安全標準,並採用具有強大存取控制機制的 API 閘道。 ![微服務中的安全性和存取控制挑戰](https://miro.medium.com/v2/resize:fit:609/1*GP0lglBapQS929e3Paf1ng.png) 積分 --- superTokens --- ### 8. 可擴展性和資源分配 可擴展性是微服務的核心承諾,也是許多公司放棄單體應用而轉向微服務的主要驅動力之一,但它需要仔細規劃。 某些服務可能會遇到比其他服務更重的負載,導致資源分配挑戰。 您應該利用容器**編排平台**和工具(例如 K8)根據需求動態分配資源。 您也可以根據 CPU 使用率或請求率等指標實施自動擴展,以確保最佳的資源使用率。 [![微服務中的可擴展性和資源分配挑戰](https://miro.medium.com/v2/resize:fit:609/1*JH4N7C199Gl3dhc2sh3xHQ.png)](https://medium.com/javarevisited/difference-between-horizontal-scalability-vs-vertical-scalability-67455efc91c) --- ### 9. 版本控制和相容性挑戰 隨著微服務的獨立發展,保持向後和向前相容性變得至關重要。 不相容的更改可能會破壞整個系統。 作為經驗豐富的開發人員或技術主管,您應該在程式碼層級和通訊協定中實作 API 的版本控制。 您也可以利用語意版本控制來清楚傳達相容性期望。逐步淘汰舊版本,同時為遷移提供足夠的支援和文件。 ![微服務中的版本控制和相容性挑戰](https://miro.medium.com/v2/resize:fit:609/1*xezI58bd7nSSjW35u2XfGQ.jpeg) --- ### 10.組織複雜性和溝通挑戰 微服務架構可以反映組織的結構,從而導致溝通和協作方面的挑戰,例如不同的團隊管理不同的微服務。 從事不同服務的跨職能團隊需要協調他們的工作,這一點很重要。 作為經驗豐富的專家,您應該透過定期會議、分享文件和促進資訊交換的工具來培養溝通和協作的文化。 ![組織複雜性與溝通挑戰](https://miro.medium.com/v2/resize:fit:609/1*6-rMCG_PZDnt1Z1RWvPWyg.jpeg) --- ### 系統設計訪談資源: 而且,這裡列出了最佳系統設計書籍、線上課程和練習網站,您可以查看這些內容,以便更好地為系統設計面試做好準備。這些課程中的大多數也回答了我在這裡分享的問題。 1. [**DesignGuru 的 Grokking 系統設計課程**](https://bit.ly/3pMiO8g):一個互動式學習平台,提供實作練習和真實場景,以增強您的系統設計技能。 2. [**《系統設計面試》作者:Alex Xu**](https://amzn.to/3nU2Mbp) :這本書深入探討了系統設計概念、策略和麵試準備技巧。 3. Martin Kleppmann 的[**「設計資料密集型應用程式」**](https://amzn.to/3nXKaas) :綜合指南,涵蓋了設計可擴展且可靠的系統的原則和實踐。 4. [LeetCode 系統設計 標籤](https://leetcode.com/explore/learn/card/system-design):LeetCode 是一個受歡迎的技術面試準備平台。 LeetCode 上的系統設計標籤包含各種練習問題。 5. GitHub 上的[**「系統設計入門」**](https://bit.ly/3bSaBfC) :精選的資源列表,包括文章、書籍和影片,可幫助您準備系統設計面試。 6. [**Educative 的系統設計課程**](https://bit.ly/3Mnh6UR):一個互動式學習平台,提供實作練習和真實場景,以增強您的系統設計技能。 7. **高可擴展性部落格**:該部落格包含有關高流量網站和可擴展系統架構的文章和案例研究。 8. **[YouTube 頻道](https://medium.com/javarevisited/top-8-youtube-channels-for-system-design-interview-preparation-970d103ea18d)**:請參閱「Gaurav Sen」和「Tech Dummies」等頻道,以取得有關係統設計概念和麵試準備的富有洞察力的影片。 9. [**ByteByteGo**](https://bit.ly/3P3eqMN) :Alex Xu 的一本現場書籍和課程,用於系統設計面試準備。它包含《系統設計訪談》第一捲和第二卷的所有內容,並將隨即將推出的第三卷進行更新。 10. [**Exponent**](https://bit.ly/3cNF0vw) :一個專為面試準備的網站,特別是針對亞馬遜和谷歌等 FAANG 公司,他們還有很棒的系統設計課程和許多其他材料,可以幫助您破解 FAANG 面試。 而且,這是一個很好的系統設計面試備忘錄,可以快速修改基本的系統設計概念: [![系統設計面試備忘錄](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1ooidxg5v3bopt7a6uf4.png)](https://bit.ly/3cNF0vw) image\_credit - [tryExponent](https://bit.ly/3cNF0vw) ### 結論 這就是關於微服務架構挑戰以及如何應對這些挑戰的全部內容。微服務架構在可擴展性、靈活性和更快的開發方面提供了顯著的優勢。 然而,這些優勢也伴隨著開發人員必須有效應對的一系列獨特挑戰。 透過在服務通訊、資料管理、監控、測試、安全性等方面採用最佳實踐,團隊可以克服這些挑戰並釋放微服務的全部潛力。 隨著軟體開發環境的不斷發展,解決這些挑戰對於成功實施微服務仍然至關重要 雖然我寫這篇文章是為了準備系統設計面試,但對於使用微服務並希望獲得更多控制和更好組織的經驗豐富的開發人員來說,它同樣有價值。 微服務開發一切順利! **獎金**\\ 正如承諾的,這是給你的獎金,一本免費的書。我剛剛找到一本新的免費書籍來學習分散式系統設計,您也可以在 Microsoft 上閱讀它 --- [https://info.microsoft.com/rs/157-GQE-382/images/EN-CNTNT -eBook-設計分散式系統.pdf](https://info.microsoft.com/rs/157-GQE-382/images/EN-CNTNT-eBook-DesigningDistributedSystems.pdf) [![關於分散式系統的免費書籍](https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fso5r1wv8x95i74nz6p89.png)](https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fso5r1wv8x95i74nz6p89.png) --- 原文出處:https://dev.to/somadevtoo/10-microservices-architecture-challenges-for-system-design-interviews-6g0

系統設計面試的 9 種快取策略

*揭露:這篇文章包含附屬連結;如果您透過本文中提供的不同連結購買產品或服務,我可能會獲得補償。* ![系統設計面試的 5 大快取策略](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3smq5msfo852zeoej5iz.jpg) image\_credit - [ByteByteGo](https://bit.ly/3P3eqMN) 朋友們大家好,在系統設計中,效率和速度是最重要的,為了增強效能和減少回應時間,快取扮演著重要的角色。如果您不知道什麼是快取?讓我先給你一個簡短的概述 **快取是一種技術,涉及將經常存取的資料的副本儲存在允許更快檢索的位置。** 例如,您可以將網站存取量最大的頁面緩存在 CDN(內容交付網路)內,或者類似地,交易引擎可以在處理訂單時緩存符號表。 過去,我分享過幾篇系統設計面試文章,例如[API 網關與負載平衡器](https://medium.com/javarevisited/difference-between-api-gateway-and-load-balancer-in-microservices-8c8b552a024)、 [正向代理與反向代理](https://medium.com/javarevisited/difference-between-forward-proxy-and-reverse-proxy-in-system-design-da05c1f5f6ad)以及常見的[系統設計問題](https://medium.com/javarevisited/7-system-design-problems-to-crack-software-engineering-interviews-in-2023-13a518467c3e),在本文中,我們將探討系統設計中快取的基礎知識,並深入研究不同的快取策略這些都是技術面試的必備知識。 它也是程式設計師必須了解的[基本系統設計主題或概念](https://medium.com/javarevisited/top-10-system-design-concepts-every-programmer-should-learn-54375d8557a6)之一。 順便說一句,如果您正在準備系統設計面試並想深入學習系統設計,那麼您還可以查看[**ByteByteGo**](https://bit.ly/3P3eqMN) 、 [**Design Guru**](https://bit.ly/3pMiO8g) 、 [**Exponent**](https://bit.ly/3cNF0vw) 、 [**Educative**](https://bit.ly/3Mnh6UR)和[**Udemy**](https://bit.ly/3vFNPid)等網站,它們有許多很棒的系統設計課程 [![如何回答系統設計問題](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/23jeu6ppweg5zt5prvhx.jpg)](https://bit.ly/3pMiO8g) *PS 繼續閱讀直到最後。我有一份免費獎金給你。* --- 軟體設計中的快取是什麼? ------------ 從本質上講,**快取**是一種將資料副本儲存在比原始來源更快存取的位置的機制。 透過保持經常存取的資訊隨時可用,系統可以更快地回應使用者請求,從而提高整體效能和使用者體驗。 在系統設計的背景下,快取可以發生在各個級別,包括: 1. **客戶端緩存** 客戶端(使用者的裝置)在本機上儲存資源的副本,例如映像或腳本,以減少向伺服器重複請求的需要。 2. **伺服器端緩存** 伺服器儲存請求回應的副本,以便在再次發出相同請求時可以快速提供相同的回應。 3. **資料庫快取** 經常查詢的資料庫結果儲存在記憶體中,以便更快地檢索,從而減少重複執行相同資料庫查詢的需要。 下圖顯示了客戶端和伺服器端快取: [![系統設計中的伺服器端與客戶端緩存](https://miro.medium.com/v2/resize:fit:609/1*shxGE-uy-6LYrqFSvigP6w.png)](https://bit.ly/3pMiO8g) --- 系統設計面試的 9 種快取策略 --------------- 了解不同的快取策略對於在技術面試中取得好成績至關重要,尤其是對於涉及設計可擴展和高效能係統的角色。以下是一些需要了解的關鍵快取策略: ### 1.最近最少使用(LRU) 這種類型的快取用於首先刪除最近最少使用的專案。您可以透過追蹤每個專案的使用情況並逐出最長時間未使用的專案來輕鬆實現這種快取。 如果面試中問到,可以使用雙向鍊錶來實現這種緩存,如下圖所示。 不過,在現實世界中,您不需要建立自己的緩存,您可以使用現有的資料結構(例如 Java 中的 ConcurrentHashMap)進行快取或使用其他開源快取解決方案(例如 EhCache)。 ![最近最少使用 (LRU) 快取策略](https://miro.medium.com/v2/resize:fit:609/1*9NGx2Rwcb20Ue3vJrBxjAw.png) --- ### 2. 最近使用的 (MRU) 在這種類型的快取中,首先刪除最近使用的專案。與 LRU 快取類似,它需要追蹤每一項的使用情況並逐出最近使用過的一項。 --- ### 3. 先進先出(FIFO) 這種類型的快取首先驅逐最舊的專案。如果在面試期間詢問,您可以使用佇列資料結構來維護將專案新增至快取的順序。 ![先進先出 (FIFO)](https://miro.medium.com/v2/resize:fit:609/1*PZdxKx2Yx6ehZ_i23ZgEkw.png) --- ### 4. 隨機更換 這種類型的快取會隨機選擇一個專案進行驅逐。雖然這種類型的快取實現起來更簡單,但可能並非在所有場景下都是最佳的。 --- ### 5. 直寫式緩存 在這種類型的快取中,資料同時寫入快取和底層儲存。這種類型的快取的優點之一是它可以確保快取始終是最新的。 另一方面,由於雙重寫入,寫入延遲會增加。 ![直寫式快取](https://miro.medium.com/v2/resize:fit:609/1*6b7N9Rzogo6c2Ju1pqrkgQ.png) --- ### 6. 後寫式快取(Write-Back) 在這種類型的快取中,資料會立即寫入緩存,而底層儲存的更新則被推遲。 這也減少了寫入延遲,但如果系統在更新寫入儲存之前發生故障,則會降低資料遺失的風險。 下面是它的工作原理: ![後寫式快取(Write-Back)快取工作](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iw3xu4olff7qv7kct4we.png) --- ### 7. Cache-Aside(延遲載入) 這意味著應用程式程式碼負責將資料載入到快取中。它提供對快取資料的控制,但另一方面,它還需要額外的邏輯來管理快取填充。 ![快取旁路(延遲載入)工作](https://miro.medium.com/v2/resize:fit:557/1*-cUQHLhJb5LqlYSFyTQbuQ.jpeg) --- ### 緩存失效 除了快取和不同的快取策略之外,這是軟體工程師應該了解的另一個重要概念。 當底層儲存中的對應資料發生變更時,快取失效會刪除或更新快取條目。 快取失效的最大好處是確保快取資料保持準確,但同時也帶來了管理快取一致性的複雜性。 而且,這是來自[DeisgnGuru.io](https://bit.ly/3pMiO8g)的一個很好的圖表,它解釋了系統設計面試的各種快取失效策略 [![前 3 種快取失效策略](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iy5sxvo6huz356mnhlvy.png)](https://bit.ly/3pMiO8g) --- ### 全域緩存與本地緩存 在全域快取中,單一快取在多個實例之間共用。在本地快取中,每個實例都有自己的快取。全域快取的優點之一是它可以提高資料一致性,而本地快取可以減少爭用並提高效能。 ![全域緩存與本地緩存](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sf4aw6c3i4zp5t0itgv5.png) --- ### 系統設計訪談資源: 而且,這裡列出了最佳系統設計書籍、線上課程和練習網站,您可以查看這些內容,以便更好地為系統設計面試做好準備。這些課程中的大多數也回答了我在這裡分享的問題。 1. [**DesignGuru 的 Grokking 系統設計課程**](https://bit.ly/3pMiO8g):一個互動式學習平台,提供實作練習和真實場景,以增強您的系統設計技能。 2. [**Alex Xu 的《系統設計面試》**](https://amzn.to/3nU2Mbp) :本書深入探討了系統設計概念、策略和麵試準備技巧。 3. Martin Kleppmann 的[**「設計資料密集型應用程式」**](https://amzn.to/3nXKaas) :綜合指南,涵蓋了設計可擴展且可靠的系統的原則和實踐。 4. [LeetCode 系統設計 標籤](https://leetcode.com/explore/learn/card/system-design):LeetCode 是一個受歡迎的技術面試準備平台。 LeetCode 上的系統設計標籤包含各種練習問題。 5. GitHub 上的[**「系統設計入門」**](https://bit.ly/3bSaBfC) :精選的資源列表,包括文章、書籍和影片,可幫助您準備系統設計面試。 6. [**Educative 的系統設計課程**](https://bit.ly/3Mnh6UR):一個互動式學習平台,提供實作練習和真實場景,以增強您的系統設計技能。 7. **高可擴展性部落格**:該部落格包含有關高流量網站和可擴展系統架構的文章和案例研究。 8. **[YouTube 頻道](https://medium.com/javarevisited/top-8-youtube-channels-for-system-design-interview-preparation-970d103ea18d)**:請參閱「Gaurav Sen」和「Tech Dummies」等頻道,以取得有關係統設計概念和麵試準備的富有洞察力的影片。 9. [**ByteByteGo**](https://bit.ly/3P3eqMN) :Alex Xu 的一本現場書籍和課程,用於系統設計面試準備。它包含《系統設計訪談》第一捲和第二卷的所有內容,並將隨即將推出的第三卷進行更新。 10. [**Exponent**](https://bit.ly/3cNF0vw) :一個專為面試準備的網站,特別是針對亞馬遜和谷歌等 FAANG 公司,他們還有很棒的系統設計課程和許多其他材料,可以幫助您破解 FAANG 面試。 [![如何為系統設計做準備](https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkqv3p46jmw5qc0newuiu.jpg)](https://bit.ly/3P3eqMN) image\_credit - [ByteByteGo](https://bit.ly/3P3eqMN) ### 結論: 這就是軟體工程師應該了解的有關快取和不同類型快取的全部內容。正如我所說,快取是系統設計中的一個基本概念,對快取策略的深入理解對於技術面試的成功至關重要。 無論您是要優化速度、最大限度地減少延遲還是確保資料一致性,選擇正確的快取策略都取決於您正在設計的系統的特定要求。 當您準備技術面試時,請深入研究這些快取策略,了解它們的權衡,並準備好將這些知識應用到現實場景中。 **獎金** 正如承諾的,這是給你的獎金,一本免費的書。我剛剛找到一本新的免費書籍來學習分散式系統設計,您也可以在 Microsoft 上閱讀它 --- [https://info.microsoft.com/rs/157-GQE-382/images/EN-CNTNT -eBook-設計分散式系統.pdf](https://info.microsoft.com/rs/157-GQE-382/images/EN-CNTNT-eBook-DesigningDistributedSystems.pdf) ![](https://miro.medium.com/v2/resize:fit:317/0*ICrIesz1fT-KtmUZ.png) --- 原文出處:https://dev.to/somadevtoo/9-caching-strategies-for-system-design-interviews-369g

沒有人長大後想成為 DevOps 工程師

當我看到那些不像我一樣主要在線下成長的年輕一代時,我為他們感到有點遺憾。我已經三十多歲了,所以我知道在成長過程中盡快接入[撥號](https://en.wikipedia.org/wiki/Dial-up_Internet_access)網路(以避免長時間阻塞電話線)存取幾個維基百科頁面來完成我的任務是什麼感覺。什麼。透過親身經歷我們所有人口袋裡的個人電腦的崛起,我覺得自己並沒有免疫,但更有能力利用它來為自己謀利,而不是僅僅因為更加“ [互聯](https://www.newyorker.com/news/the-new-yorker-interview/jonathan-haidt-wants-you-to-take-away-your-kids-phone)”而成為其無限幸福和滿足的虛假承諾的受害者。 ![撥號](https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExamF3aXZ0NHZxYmo4NWVqa2FhcWwxM2lhYnYwaHowdmtpZGlhNTNiZiZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/XreQmk7ETCak0/giphy.gif) 另一方面,還有另一場革命,**我沒有直接參與其中**,這場革命是在 2009 年 O'Reilly Velocity 會議上著名的[Flickr](https://www.youtube.com/watch?v=LdOe18KhtT4)演講之後,在 00 年代全世界的 IT 部門中發生的。事件讓`DevOps`聲名大噪,並展示了一個可以從孤立的、發展緩慢的基於[ITIL](https://en.wikipedia.org/wiki/ITIL)的組織轉向更好的組織的未來。 不到 5 年前,我最近從教學轉向了科技。我不知道在任何其他不實踐 Flickr 演講中所傳授的實踐的專業環境中工作會是什麼樣子。敏捷方法論和「DevOps」仍然[難以確定](https://www.reddit.com/r/devops/comments/812527/can_someone_explain_what_devops_is/)的定義是我從未質疑過的現狀。 **但我現在對此表示懷疑**。如果我認為,未來的世代缺乏基本的視角,並且可以從了解沒有智慧型手機的生活是什麼樣子中獲益匪淺。**我必須將同樣的邏輯應用在自己身上,並且齊心協力去理解 DevOps 到底是什麼?它是對什麼的回應?它最初的承諾是什麼?人們如何以及為何最終成為 DevOps 工程師?未來成為 DevOps 工程師意味著什麼?** DevOps 如何開始及其最初的承諾 ------------------ 我有時想知道,在開發人員必須填寫基礎設施配置請求表並等待數天或數週才能得到服務的日子裡,情況一定是什麼樣子。我聽說過那種文化中典型的運營人員的故事,他們總是互相指責,脾氣暴躁,最喜歡說的詞是`“NO“`和`“Where's my pager?“` 。 ![行動者](https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExdG03ZXE5d3dqNjgyYXV3NnowaGdoeDc5aTIxM3ZnMGlxdnVhbnVuNSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/hSKk6hx9OzomRvFRcJ/giphy.gif) John Allspaw 和 Paul Hammond 以及他們著名的速度演講[「每天 10+ 部署:Flickr 上的開發和運維合作」](https://www.youtube.com/watch?v=LdOe18KhtT4)的許多與會者不必懷疑,開發人員和維運團隊之間的常見摩擦一定是對他們來說一切都太生動了。 多年來,我多次觀看了這個演講,有幾件事對我來說很突出。首先,我沒有意識到當時的談話包含瞭**如此多的髒話**,或者也許只是奧爾斯帕先生。另一個是演講者提出的關鍵訊息,即開發和營運團隊實際上共享相同的目標。**為業務賦能。** ![動圖](https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExaHB6Z3Myd2tpaDc3eGE3eDZ2OTMwa2ZnazMydDVlNnVkOTczeGF3dSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/FspLvJQlQACXu/giphy.gif) 他們繼續討論組織可能希望採用的工具和文化特徵來實現一天的多次生產部署。他們談到了自動化基礎設施、功能標記、共享警報和監控,所有這些都圍繞著新的協作文化結合起來,這種文化重視信任以及對系統故障和避免指責的更健康的態度。 具有巨大影響力的[《DevOps 手冊》](https://itrevolution.com/product/the-devops-handbook-second-edition/)和[《站點可靠性工程》](https://sre.google/sre-book/table-of-contents/)書籍在很大程度上進一步明確了 DevOps 在接下來的幾年中的含義。 ![主要書籍](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yb33ik288tctk2v22jf6.png) 前者的開頭章節用幾句話描述了 DevOps 的做事方式渴望解鎖什麼 > *“\[多個團隊共同努力\]實現計劃工作快速進入生產(例如,每天執行數十、數百甚至數千次程式碼部署),同時實現世界一流的穩定性、可用性和安全性。”* 我們兌現了承諾嗎? --------- 當我想到 Flickr 演講中提出的想法時,我的腦海中浮現出一種走在巨人肩膀上的感覺。這些對許多人來說一定是革命性的想法是我所知道的唯一的職業現實。因此,無論是否可以對當前的 DevOps 方法、最佳實踐和工具進行改進,我都對迄今為止所取得的所有進展表示感謝。我問過 2009 年之前配置伺服器或進行駭客攻擊的人,他們都證實**現在的情況比那時好。** 話雖如此,大多數公司是否都在瘋狂地進行運輸,同時實現世界一流的穩定性、可用性和安全性?**很大程度上沒有。** DevOps 世界即使擁有[裝滿現代可用工具的龐大工具箱](https://landscape.cncf.io/),仍然執行該演講中提出的完全相同的框架。 用[亞當雅各](https://twitter.com/adamhjk)的話來說 > 「問題不在於我們沒有對系統的每個單獨部分進行足夠的最佳化。我們在每一步都建立了更有效率的工具。但是整個系統是如何組合在一起的呢?使用體驗如何?這與 2009 年的情況基本相同,這也是我們陷入困境的原因。 **孤島仍然存在,交接容易出錯,而且在許多情況下協作相當強迫和僵化。**任何擔任 DevOps 工程師一段時間的人都會有一長串他們認為自己的組織出錯的事情,並且通常對自己的組織解決問題的能力也同樣缺乏信心。 Adam 是一位經驗豐富的 DevOps 實踐者,他甚至呼籲[第二波 DevOps](https://www.systeminit.com/blog-second-wave-devops) ,它不僅僅是簡單地改進工具,而是邀請我們跳出框框思考,挑戰既定規則,看看另一面會發生什麼。 說到DevOps實踐者,這些人是誰?一個人如何以及為何成為一個人? 人們最初是如何進入 DevOps 的? ------------------- 在短短 15 年裡,科技業取得了長足的發展。 **DevOps 工程師、SRE 和平台工程師**等職位現在在招聘網站上很常見,也是技術招聘人員的熱門專案。然而,在 IT 世界之外,這些術語仍然鮮為人知。儘管發展迅速,DevOps 還不是一個人們渴望加入的職業;相反,許多人只是**“陷入其中”** 。 ![動圖](https://media1.giphy.com/media/v1.Y2lkPTc5MGI3NjExMHlhdTVzdG9wNmNzOGp6ZDljN3RlenNhMTExMTJ5N3RoY3MyYjIydCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/SeTPXfY3RFPkQ/giphy.gif) 在與我表弟交談後,我偶然進入了 DevOps,在我獲得 CCNA 憑證後決定反對嚴格的網路工程路徑後,他建議我選擇 DevOps。我很好奇誰最終會進入 DevOps,以及未來的工程師是否會選擇它作為他們的第一個職業選擇,我詢問了[/devops](https://www.reddit.com/r/devops/comments/1c24rbg/will_people_ever_grow_up_wanting_to_be_a_devops/) Reddit 子版塊,並對各種不同的意見感到驚訝。 **我發現了一些「我剛剛陷入其中」的人:** ![陷入其中](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zaafmdejwi6k9aus874r.png) **其他人則適度看好新一代:** ![樂觀的 DevOps](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ouj4w92mly7j2jbi20m2.png) ![DevOps 選擇你](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/px309e69lvjygl8vnobz.png) **其他人則不那麼樂觀:** ![我希望不是](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lnzjwtczbg9zl8wh9zru.png) ![孩子們的願望](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u3z44eoh0yqgsaqyh8mf.png) 儘管 DevOps 的定義仍然存在很大[爭議](https://www.reddit.com/r/devops/comments/vfxmxv/what_exactly_is_devops/),但它似乎不太可能將自己定位為學生在招聘會上聽到或永久加入到大學課程中的職業。這可能是因為我們傾向於想像自己在特定領域表現出色,相信專業化會增加我們成功的機會。 小時候,我夢想著成為一個著名樂團的主音吉他手,擁有神級的粉碎能力。我並沒有夢想能夠相當擅長演奏所有樂器。 **在 DevOps 中,沒有吉他獨奏。**為了脫穎而出,您需要熟悉一長串工具、語言、框架、超大規模器和流程。最優秀的 DevOps 工程師本質上都是通才。這種模組化、樂高式的工作和體驗性質可能會讓 DevOps 在 IT 部門之外不太受歡迎。 通才、修補匠的案例和膠水的概念 --------------- 不可能嘗試對 DevOps 從業者應該具備哪些特徵形成非主觀的描述,但根據我的短暫經驗以及我從與比我更有經驗的人的對話中學到的東西,出現了一些特徵。 ### 通才 您讀過「[如何在 DevOps 領域找到工作](https://www.simplilearn.com/tutorials/devops-tutorial/how-to-become-devops-engineer)」指南嗎?還記得知識要求部分嗎? Linux、Docker、CI/CD、Git、Hypersclaer、網路等。 如果您曾經面試過開發人員或產品設計等職位,您很可能需要在流程的某個階段展示自己的作品集。在 DevOps 面試中這種情況很少見。我想不出有誰定期組裝和更新 DevOps 組合? DevOps 角色的模組化和分散式系統建構性質並不適合在產品組合中進行精心策劃的展示。 作為一個厭倦了教高中英語七年的人,我自然而然地被 DevOps 所吸引,這個領域要求我學習許多工具和概念,並以協作方式將它們拼湊在一起。不深入專注於任何一個概念,而是提高快速學習新事物的技能,這就是我培養的癒傷組織。在這樣的環境中茁壯成長的多面手正好適合。 ### 修補匠 在 DevOps 方面表現出色的人可能會認為自己是[修補匠](https://www.reddit.com/r/devops/comments/1cr1ho6/hot_take_were_all_just_tinkerers/)。 ![修補匠](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/odqy1j4yuwc1anaioe69.png) 我喜歡這個想法,它適合我遇到的許多 DevOps 工程師。僅僅為了了解事物的知識而對學習事物如何工作感興趣是我所遇到的 DevOps 導師的一個共同特徵。當然,花週末在家庭實驗室安裝更強大的開關或在 3D 列印機上渲染新的迷你雕像並不能直接展示 DevOps 技能,但這些背景知識比憑證更能表明 DevOps 的潛在成功。 ### 膠水 複雜系統中的許多工作可能會受到關注,因為很難規劃或預測。由於 DevOps 涉及將工具編織在一起來建造平台或交付系統,**因此需要大量的黏合劑**。 流程必須到位並自動化,以跟上技術堆疊中每個工具附帶的技術債務和維護工作。那些能夠自然而然地、常常吃力不討好的充當黏合劑,透過自動化、溝通或改進重複流程連接系統的不同部分的個人,對於組織的成功至關重要。這項技能不是您在履歷中列出的內容,但與修補匠的好奇心和通才的開放性相結合,它是一個強大的組合。 目前狀態:平台與 DevOps --------------- 這些討論中常出現[錯誤的二分法,](https://www.reddit.com/r/devops/comments/17lz167/devops_vs_platform_engineering_i_still_struggle/)通常是出於行銷原因:DevOps 已死,平台才是未來。平台工程師的目標是為開發人員提供對傳統 Ops 相關元件(k8s、IaC 元件、IAM)的自主權,而無需直接交互,使開發人員能夠自助服務並保持獨立。 精心設計的、針對特定環境的平台可以提高開發人員的速度。根據[2023 年 Puppet DevOps 狀況報告](https://www.puppet.com/resources/state-of-platform-engineering),超過三分之二 (68%) 的受訪者認為採用平台工程後開發**速度**提高了。然而,速度不應該是唯一的衡量標準。正如[georgouslyhumble](https://www.reddit.com/r/devops/comments/16ipm9h/comment/k0ly9uq/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button)在 Reddit 上指出的那樣,**有時目標是在滿足新的組織要求的同時保持現有的速度**。例如,日誌記錄 sidecar 可以在不改變開發人員速度的情況下標準化日誌收集,從而增強平台以滿足不斷成長的公司要求。 維運工作仍然複雜且動態,熟練的維運人員對於超過一定複雜性閾值至關重要。平台為開發人員提供支持,但請注意,它們不一定會減少孤島或更緊密地整合開發和營運團隊。 團隊在堆疊中新增工具時要謹慎,因為新工具通常會帶來快速累積的維護和維護開銷。像[Glasskube](https://github.com/glasskube/glasskube)這樣可以**減少營運開銷的工具是不可或缺的**。我們需要更多這些工具來為未來建立強大且高效的 DevOps 平台。 未來預測 ---- ![動圖](https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExdmQ3b2J1M3A1dWw3MHgwZTQyaWdobDdwM3BnZ3htY3drNWt0bXZicSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/ZZkCo8zKWtt2ZgozfX/giphy.gif) ### 某種類型的平台將會勝出 **勝出的系統、平台或工作方法不必「教導」使用者如何一起工作和協作。**未來的系統只有在使團隊協作成為最簡單、最直觀、最自然的工作方式,同時抽像出開發人員和維運人員都無法完成的工作的情況下,才能在不影響安全性和穩定性的情況下提供無限軟體交付的難以置信的可能性。 為了創造它,我們必須跳脫框架思考。 ### 第二波 DevOps 可能是一種方式 值得慶幸的是,有許多不安分、不墨守成規的人為 DevOps 領域的方法、流程和工具的不斷改進做出了貢獻。 有人可能會說,重新思考 DevOps 的正式[運動](https://www.systeminit.com/blog-second-wave-devops)已經出現,這非常令人興奮。 ### 通才和修補匠越多越好 最有能力不斷連結拼圖、閉合回饋循環並重新思考糟糕想法的人是那些不怕用深度專業化換取專業通用化的人。那些敢於冒險並通過一路修修補補、測試和提出問題來快速學習的人將使這艘象徵性的船在越來越快地走向卓越工程的過程中保持漂浮。 如何找到足夠的這些人是另一個問題。 結論 -- 看起來我還不太明白為什麼人們長大後不想成為 DevOps 工程師,也許這是一個相對較新的領域,再加上通才通常不被認為是最酷的孩子這一事實的混合體。 展望下一波人才,無論他們是有意識地選擇還是偶然進入 DevOps 角色,有一件事是肯定的:了解該領域的歷史是關鍵。這是未來工程師能夠培養辨識當前狀態與理想未來之間差距的唯一方法。如果忽視這一差距,現狀就會佔上風,我們將注定陷入停滯的平庸。 不可否認,自 DevOps 時代之前以來,技術格局已得到極大改善,但同樣明顯的是, **DevOps 15 年來仍在站穩腳跟。** 經驗豐富的專業人士需要保持敏銳的眼光,辨識並鼓勵周圍的年輕修補匠、通才和“粘合者”,不要擔心追逐某些頭銜,而是幫助重新定義**DevOps 並將其發展為能夠實現2009 年最初願望的東西。** --- 如果您喜歡這類內容並希望看到更多內容,請考慮在 GitHub 上給我們一個 Star 來支持我們🙏 [![連小貓也喜歡送星星](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1h9v5nqc7pfp6u3h1kqd.jpeg)](https://github.com/glasskube/glasskube) --- 原文出處:https://dev.to/glasskube/why-nobody-grows-up-wanting-to-be-a-devops-engineer-2jli

如何在 2024 年找到一份 Web 開發人員工作(不死不休)🧑‍💻💀

嘿,我是文斯... ========= ![https://dev-to-uploads.s3.amazonaws.com/uploads/articles/az8xf61b2qxx1msfo4t5.png](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/az8xf61b2qxx1msfo4t5.png) 我是一名自學成才的開發人員,在新冠疫情期間改變了職業生涯。透過在空閒時間學習和建構、參加黑客馬拉松以及為開發人員建立教育內容,我能夠從教育轉向 Web 開發。 當我找到第一份開發工作時,儘管我決心成為高級工程師,但我還是從一個薪水非常低的「實習生」職位開始。雖然這並不理想,但它讓我在工作中學習並踏入了大門。 一年後,經過一番努力,我得到了一個更好的職位,薪水是以前的三倍! 🤯 ![https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sf1fhsgwuurkre9a7drq.png](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sf1fhsgwuurkre9a7drq.png) 如今,我目前擔任[Wasp](https://wasp-lang.dev)的創始開發人員關係工程師,負責建置[OpenSaaS.sh](http://opensaas.sh/)等內容,這是一個適用於 React 和 NodeJS 的免費開源 SaaS 入門模板,以及 Stripe、OpenAI 和 AWS S3 整合。它基於我從建立第一個盈利的 SaaS 應用程式[CoverLetterGPT.xyz](http://coverlettergpt.xyz/)中學到的知識,該應用程式目前擁有 100 多個客戶,每月收入約 500 美元!沒什麼瘋狂的,但我仍然感到自豪。 現在,我目前擔任開發人員的角色,社群中的人們經常向我詢問有關找到技術工作的建議。考慮到這一點,並結合我過去的經驗,我想我應該寫一篇綜合文章,分享我所學到的和認為最有效的方法。 享受! 2024 年開發人員目前就業市場 ================ 首先,讓我們快速了解一下目前軟體開發人員的就業市場。 ![圖片描述](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7lmohbs24ds94kwxo9dt.png) 如果您花時間在 Reddit 或[X.com](http://X.com) (又名 Twitter)上,那麼您可能會看到人們抱怨當前的開發人員就業市場有多糟糕。 為了嘗試找到一些實際的統計資料來支持這些說法,我使用[Perplexity.ai](http://Perplexity.ai)來幫助我找到一些有關軟體開發人員當前需求的訊息,我對結果感到驚訝。 顯然,對軟體開發人員的需求仍然很高,事實上**,平均需求高於其他工作,並且[預計在未來幾年將增長更多](https://icts.io/2024/02/01/5-predictions-on-software-development-jobs-in-2024)**! 那麼,為什麼現在有些開發商感覺比平常更難找到工作呢? 嗯,那是因為它實際上*更難*,但前提是您是經驗不足的開發人員。 另一方面,如果您是一位經驗豐富的開發人員,擁有豐富的工作經驗,那麼還有更多的空缺職位可供您選擇。但如果您是剛起步的初級開發人員,競爭將比以往更加激烈。 原因如下: 1. **所需技能的複雜性**:軟體開發越來越複雜,需要廣泛的技能,這使得[許多候選人很難滿足工作要求](https://nxtide.com/the-global-shortage-of-software-developers-and-its-serious-implication-in-the-comming-years/)。 2. **遠距工作趨勢**:向遠距工作的轉變擾亂了入門級開發人員管道,[使公司更難找到和培訓新人才。](https://www.revelo.com/blog/software-developer-shortage-us) 3. **經濟因素**:疫情和隨後的經濟變化導致[招聘模式波動,在某些時期出現大量裁員,隨後需求激增](https://icts.io/2024/02/01/5-predictions-on-software-development-jobs-in-2024)。 基本上,儘管對經驗豐富的開發人員的需求很高,但對經驗不足的開發人員的需求相對較低。 因此,由於初級和中級工程師的供應相對較多,都在競爭相同的工作,您如何才能獲得經驗豐富的開發人員的技能並讓自己脫穎而出? 成為問題解決者,而不僅僅是編碼員 ================ 軟體開發職業意味著變化是永恆的。你必須隨時準備好學習新事物並走出你的舒適區,因為, 1. 工作需要它,並且 2. 該行業以極快的速度發展 在這樣的環境中,憑證、課程和學位(在某種程度上)就不那麼重要了,因為它們不能證明你具備適應和解決出現的新問題所需的技能。當然,它們證明您擁有一定數量的基礎知識,但這只是工作所需技能的一小部分。 您希望能夠透過以下方式證明您可以應對以前從未遇到過的挑戰: - 快速了解這個新主題, - 找到合適的方法來解決它,並且 - 快速執行該方法以實現您的目標 [![圖片描述](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2lbjy6ikx8iy9lb3ngx5.png)](https://www.tiktok.com/@techfren/video/7361777687158983943) 但不要只是從我這裡奪走它。 AJ,又名[TikTok 上的 Techfren](https://www.tiktok.com/@techfren/video/7361777687158983943) ,談論如何在後人工智慧世界中駕馭當前的工作環境。他在這裡提出了一些與本文相關的好觀點。例如: 1. 一般的編碼知識甚至不太相關,因為人工智慧擁有非常廣泛的編碼知識。作為一名工程師,你不再有價值,因為你知道如何編碼——人工智慧現在知道如何很好地編碼(並使用比你更多的程式語言)。**你的價值在於批判性思考、解決問題以及為這些問題建立解決方案。** 2. 企業將開始更多地尋找這些通才問題解決者來建立內部應用程式(即內部工具)作為付費服務的替代品,以節省資金並滿足其特定的業務需求,因為人工智慧使開發人員能夠提高工作效率。 因此,很明顯,解決問題的技能需求量很大,並且在未來將繼續變得更加重要。我們可以假設更有經驗、更受歡迎的開發人員擁有這些技能,那麼我們該如何自己建立它們呢? 解決自己的問題 ======= 好的。因此,您認為自己是一位充滿好奇心的開發人員,能夠快速適應和學習新事物,並即時解決問題。 但你要如何向未來的雇主證明這一點呢? 簡單的。只解決自己的問題!在實踐中 - 在 Web 開發領域 - 這意味著「處於舒適區的邊緣」並建立適合您和您的興趣的獨特 Web 應用程式。 [![圖片描述](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n06z1ktgs70g5c7cv2r7.png)](https://tiktok.com/@cameronblackwoodcode/video/7364455582981524768) 自學成才的工程師和內容創作者卡梅倫·布萊克伍德 (Cameron Blackwood) 在他的[TikTok 影片中完美地描述了這一點,為新開發人員提供如何提高技能的建議](https://tiktok.com/@cameronblackwoodcode/video/7364455582981524768)。他也擁有獨特的視角,因為他之前擔任過技術招募人員,他說: - 建立一個網頁應用程式來解決您日常生活中遇到的問題 - 嘗試與您目前在日常工作中學習/做的事情不同的事情。 - 在空閒時間繼續建構和嘗試新事物。 當然,您製作的這些應用程式不一定是完美的,但它們越獨特,就越能展示出對問題的創造性和良好實現的解決方案,就越好。 如果您在思考要建立的東西時遇到困難,有時只需嘗試新工具即可激發新想法。但無論你決定如何處理它,都取決於你自己,重要的是開始,所以開始吧! --- 順便說一句, [Wasp](https://wasp-lang.dev)是輕鬆建立解決您獨特問題的新應用程式的好方法。這也是在 React 和 NodeJS 中建立客製化全端應用程式的最快方法之一,而無需為身份驗證、路由、端到端類型安全性、部署等編寫一堆樣板程式碼。 作為示例,請觀看此影片,該影片向您展示了在整個應用程式中實施全端身份驗證是多麼容易。 https://www.youtube.com/watch?v=Qiro77q-ulI 做繁重的工作 ====== ![好的](https://media2.giphy.com/media/v1.Y2lkPTc5MGI3NjExa2s1d3J6dmQ2ZHc3b2RsYXQxdnFhOWR5Z3licmhjajdxZ2N3anBsOCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/AYECTMLNS4o67dCoeY/giphy.gif) 當我寫這篇文章時,我很幸運地看到了[Jonathan Stern 的這條推文](https://x.com/jonathanrstern/status/1792220536837230723),他在推文中談到了他在開始第一份開發工作時發現非常有價值的建議。 在那份工作之前,Jonathan 給 Replit 的執行長[Amjad Masad](https://x.com/amasad)寫了一封電子郵件,並在開始他作為軟體開發人員的第一份工作時尋求建議。 阿姆賈德是這麼說的: > 證明自己並讓自己變得不可或缺的兩種方法: > > 1. 具有令人難以置信的生產力和創造力——這在剛開始時很難做到 > > 2. 做無人願意做的無聊工作 > > 2 適合每個人,它只需要努力和紀律,但沒有人做到,所以我建議這樣做。順便說一句,2 通常可以以有趣的方式導致 1。 現在,儘管這是針對已經有工作的開發人員的建議,但我認為這是許多正在尋找工作的經驗不足的開發人員應該聽到的建議。 從更廣泛的意義上來說,阿姆賈德的建議是先降低你的期望並努力工作。做沒有人願意做的無聊工作也可能意味著做你不熱衷的工作,但從長遠來看,這對你有利。 這也可能意味著接受一些不完全是你之前想要的工作,並做繁重的工作,以便成為任何雇主都希望在其團隊中擁有的「不可或缺」的開發人員。 做個好人 ==== 這個建議非常籠統,幾乎適用於任何工作(或任何事物),但成為一個好的共事者可能比大多數求職者想像的更有價值和被忽視。 一旦您滿足了工作要求,您對未來雇主的吸引力很大程度上取決於他們是否可以想像與您在團隊中工作。雖然從表面上看這似乎簡單明了,但實際上實施起來要困難得多。 ![圖片描述](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3s990jfmwryfx8gk9xw5.gif) 想一想。 您將在一個具有許多不同個性的團隊中工作。任務可能會變得複雜,截止日期可能會很緊迫,而且工作可能會變得混亂。肯定會犯錯。 *你是那種在壓力下會失去幽默感的人嗎?* *當有人因為你不直接負責的錯誤而責備你時,你會如何反應?* *您是否與您的團隊進行公開且有效的溝通?* *努力工作一年卻沒有加薪,你還會保持謙虛和認真嗎?經過一年的努力工作、大量的讚揚和豐厚的加薪(這可能更難),你還會保持謙虛和認真嗎?* 誠實、開放、真誠是難以獲得的寶貴特質,人們往往可以立即看出你是否是這種人。正是這些類型的人,在與同樣滿足工作要求的其他候選人競爭時,最終獲得了工作機會。 投入更少的精力,送出更少的應徵信 =============== 我和許多其他雇主抱怨的一件事是,求職者在申請中幾乎沒有任何努力。最嚴重的冒犯是應徵信內容明顯是複製貼上的。 ![打字](https://media0.giphy.com/media/v1.Y2lkPTc5MGI3NjExNW0wMm03N3IwaTdlcWdtcHd4MXpsZWV5ZDVkMXBzOGQ5ZWVlNG9vaCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/13GIgrGdslD9oQ/giphy.webp) 雇主討厭這一點,因為這是你將如何工作的明顯跡象。如果你的工作申請是懶惰地完成的,那麼你的工作很可能會表現得類似(或更糟!)。 這就是為什麼我認為最好將更多的精力投入到更少的工作申請中。 沒有神奇的數字,但每當我申請工作時,總會有 2 或 3 個讓我感到*非常*興奮。所以這些是我唯一申請的,我在這些申請中投入了很多思考和努力。 ![圖片描述](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0kvjr8y8gcc4switxoga.png) 除了[為我的專案製作包含描述和學習目標的自己的作品集](https://vincanger.github.io/)之外,我還會建立某種形式的與工作申請相關的額外內容。在某些情況下,這是一個簡單的範例應用程式,或者在其他情況下是解釋影片或文章。 重要的是,這些額外的內容是嘗試解決工作描述中提出的問題或任務,以表明我可以做好這類工作,並且我渴望並願意*做繁重的工作。* 我的假設是,大多數其他申請者在申請時不會花這麼大的力氣,因此我的申請會從人群中脫穎而出,而且效果很好,因為即使我之前沒有很多經驗,我也被要求面試其中的許多職位! --- 順便一提… 我們在[Wasp](https://wasp-lang.dev/)正在努力建立這樣的內容,更不用說建立一個現代的開源 React/NodeJS 框架,讓您能夠快速行動! 如果您想看到更多這樣的內容,您可以[在 GitHub 上給我們一個星星,非常輕鬆地幫助我們!](https://www.github.com/wasp-lang/wasp) 。 ![https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qgbmn45pia04bxt6zf83.gif](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qgbmn45pia04bxt6zf83.gif) <https://www.github.com/wasp-lang/wasp> ⭐️ GitHub 上的 Star Wasp 🙏 現在得到那份工作...... ============== 軟體開發人員的就業市場正在改變。這是有道理的,因為軟體開發人員的角色也在不斷發展,而現在我們正在進入人工智慧時代,這些角色的發展速度更快。 這意味著,隨著雇主的適應,他們可能會繼續尋找能夠證明他們能夠跟上所有這些發展的開發人員,並利用手邊的工具來解決我們周圍世界面臨的問題。 因此,如果你能夠證明這一點,同時成為一個認真而謙虛的工人,那麼你可能不會很難找到你一直想要的那份甜蜜的技術工作。現在只需將注意力和精力放在正確的事情上,這有時可能很困難,這將使以後找工作的過程變得容易得多。 當然,這些建議是基於我的經驗和主觀觀點,所以如果您有不同意見,請在評論中告訴我們。或者你有自己的秘訣來幫助你找到工作嗎?如果是這樣,我們想聽聽看! 感謝您的閱讀,祝您求職愉快。 --- 原文出處:https://dev.to/wasp/how-to-get-a-web-developer-job-in-2024-without-dying-inside-eo8

ChatGPT - 給開發人員的提示

了解 ChatGPT: ----------- ChatGPT 是一種人工智慧 (AI) 聊天機器人,它使用自然語言處理來建立類人對話。這個語言模型可以回答問題並撰寫各種書面內容,包括文章、社交媒體貼文、論文、程式碼和電子郵件,這使其成為各個層級的程式設計師都興奮的工具。 > OpenAI(一家人工智慧研究公司)建立了ChatGPT,並於2022 年11 月推出了該工具。 什麼是即時工程以及為什麼它很重要? ----------------- 及時的工程設計使用戶可以輕鬆獲得相關結果。它還有助於減輕大型語言模型訓練資料中現有的人類偏見可能存在的偏見。此外,它還增強了用戶與人工智慧的交互,因此即使輸入很少,人工智慧也能理解用戶的意圖。 在製作提示時, - 記住要清晰簡潔。 - 具體:指定程式語言選擇並清楚描述您需要的功能。例如,提示可以是“編寫一個 JavaScript 函數來計算給定數字的總和”,而不是模糊的“編寫一個函數來計算總和”。 - 包括必要的背景和細節,但避免任何含糊或不必要的資訊。 - 定義輸入和輸出:如果您需要的函數或程式碼段需要特定的輸入或輸出格式,請在提示中包含此資訊。 ChatGPT 如何幫助開發者: ---------------- ChatGPT 是一種高階語言模型,可以透過多種方式幫助開發人員完成編碼之旅。讓我們來探討其中的一些。 **1. 編寫程式碼:**使用ChatGPT,您可以根據具體描述產生程式碼。例如,如果您需要 C# 函數來計算 2 個數字中的某些數字。您可以如下所示提示 ChatGPT,它將返回相應的程式碼。 提示範例: ``` "Write a C# function to calculate the sum of the 2 given numbers." ``` **2.重構程式碼:**借助ChatGPT的幫助,您可以重構程式碼,以提高程式碼效率,減少錯誤,並使其更易於將來修改或擴展。 提示範例: ``` I have a piece of code and I need you to refactor it: INSERT YOUR CODE HERE ``` **3. 程式碼審查和偵錯:**您可以使用 ChatGPT 審查程式碼片段並分享潛在的問題或錯誤。 提示範例: ``` "Here's a C# code snippet. The function is supposed to return the maximum value from the given list, but it's not returning the expected output. Can you identify the problem?". INSERT YOUR CODE HERE ``` **4. 新增編碼最佳實務或原則:** ChatGPT 可協助您根據風格指南重寫程式碼。 提示範例: ``` Rewrite the code below following the Google style guidelines for JavaScript. INSERT YOUR CODE HERE ``` **5. 解釋程式碼:** ChatGPT 可以幫助解釋舊的和複雜的程式碼片段的工作原理。要獲得特定程式碼段的解釋,請提供程式碼片段並詢問。 提示範例: ``` "Could you please explain how this C# function works?". INSERT YOUR CODE HERE ``` **6. 最佳化程式碼:** ChatGPT 可以幫助優化程式碼,以增強效能或可讀性,使您的程式碼精簡且有效率。 提示範例: ``` "Here’s a function I wrote in JavaScript that prints first n Fibonacci Numbers. Could you suggest any optimizations for better performance?" INSERT YOUR CODE HERE ``` **7. 建立單元測試:**您可以使用 ChatGPT 透過為您編寫測試案例來自動化單元測試。 提示範例: ``` Please write unit tests for the following code. INSERT YOUR CODE HERE ``` **8. 新增程式碼註釋:**如果您的程式碼不言自明但需要註釋,ChatGPT 可以立即為您完成。 提示範例: ``` Add comments to the following code: INSERT YOUR CODE HERE ``` **9. 建立樣板程式碼:** ChatGPT 可以幫助您產生樣板程式碼。 提示範例: ``` Write a boilerplate JavaScript function that will take a variable of type User, and validate whether the user has the right permissions or not. ``` **10. 建立正規表示式:**正規表示式幫助我們匹配、定位和管理文本,提供了一種快速且相對簡單的方法來操作資料,特別是在大型複雜程式中,ChatGPT 可以幫助我們編寫這些正則表達式。 提示範例: ``` Write a regular expression that matches: REQUEST ``` 這些是 ChatGPT 如何讓開發人員的生活變得輕鬆的一些例子。除此之外,ChatGPT 還可以幫助學習新概念、理解設計模式、程式碼重構、集思廣益、面試準備等等。 ChatGPT 提示編寫程式碼: ---------------- 我收集了 ChatGPT 提示,這些提示可以讓開發人員的生活變得輕鬆,因為他們可以更有效地利用強大的 AI 支援的 ChatGPT。 - [編寫和生成程式碼的提示](https://dev.to/techiesdiary/chatgpt-prompts-for-writing-and-generating-codes-59kf) --- 原文出處:https://dev.to/techiesdiary/chatgpt-prompts-for-developers-216d

身為開發者,我的創業失敗、接案、以及自我成長經驗分享!

2020年,我剛關閉了之前的創業公司,厭倦了在專案公司的兼職工作。我曾經(現在仍然是)數位遊牧者並尋找遠距工作。 當時是新冠疫情之前,遠距工作並不像今天那麼重要。太多的開發人員(主要是自由工作者)尋找工作和一些職位。 我在那裡找不到工作,甚至連面試機會都沒有。憑藉我的技能,我知道我適合任何地方(我作為開發人員已經有 7 年多了。) ![拒絕](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hft38itzykdcozohfgs6.png) --- 做我自己的事 ------ 我創辦了另一家名為 Linvo 的新創公司,進展非常順利。我得到了客戶並賺了錢——但最終沒有成功。 那時候我每天都在共享辦公(早上9點到12點)簽失業金來拿政府的錢🙈 我在共享辦公空間的開放空間裡,所以我可以選擇與不同的創辦人進行個人聯繫——不是為了找工作,而是談論幾乎所有的事情。 但隨著談話的繼續,人們了解了我的技能。 ![你了解我](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rhaunmgwvor6o0zy7ina.gif) --- 在共享辦公空間閒逛 --------- 我想謙虛一些,但幾乎所有在開放空間工作的新創公司都向我提供了工作機會,完全遠程,幾乎可以以我想要的任何期限工作。就這樣,我開始在[Novu](https://novu.co/)工作了整整兩年。 ![我](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w6as772lphqfoo7a9q7j.png) 現在,很明顯,當你與人建立個人聯繫時,找到工作會更容易(這就是新創公司參加活動來銷售他們的產品的原因)。但我想更深入地了解我是如何從 0 到 100 的。 我之前寫過一篇文章,內容是[為開源做出貢獻將使你找到新工作的機會增加 10 倍](https://dev.to/github20k/contributing-to-open-source-will-10x-your-chances-to-land-a-new-job-433f) 我堅持這一點。但還有更多。 生活中的一切都與風險有關 - 您越信任,有人僱用您/使用您的服務/向您購買軟體的機會就越大。 但信任是很難的。 當你編寫程式碼時如何才能獲得信任? --- 我所說的與我所是的 --------- 每當我尋找自由工作者(例如前端開發人員)時,我無法確定是否: - 他們有著極佳的個人契合度 - 他們實際上可以寫出好的程式碼 - 他們可以跳出框框思考。 因為我只能從他們那裡得到一些關於他們自己的話語。 作為一名企業家,我已將我的工作從開發人員轉移到開發人員成長(成長駭客),因為我認為這對企業的發展至關重要。 在 Novu 的第二年,我決定需要建立自己的知識庫,以便人們能夠了解有關我的一切資訊 - 贏得他們的信任並向他們展示我的個性。 因此,我建立了[Gitroom 電子報](https://gitroom.com)和[YouTube 頻道](https://www.youtube.com/@nevo-david),以便人們可以看到我的行銷技能,也建立了我的[Gitroom 開源專案](https://github.com/gitroomhq/gitroom/),以便他們可以看到我的開發技能。 我非常穩定(每天都出現)——目前,時事通訊已連續 46 週(幾乎一年)。 ![條紋](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8thomejgye2j11dm1a8q.png) 並分享有價值的資訊—這是至關重要的: - 我不教簡單的程式碼,例如演算法 - 我不教 CSS 和 HTML 我主要注重以資歷為基礎來獲得他們的信任。 今天,我有太多的客戶 - 我拒絕了很多工作,直到我學會瞭如何擴展或獲得一些缺失的技能。 --- 做這個 --- 由於閱讀本文的大多數人都是純粹的開發人員(而不是行銷人員/成長駭客),因此我會提出一些建議。 1. **為開源做出貢獻**——展示你的技能的最佳方式。沒有什麼比對大型程式碼庫的開源貢獻更重要的了,這是人們需要的大部分證據。 2. **擴大你的貢獻**-不是每個人都知道你的貢獻;在所有可能的社交媒體(X、Linkedin、Youtube、Daily.dev)上談論它,讓人們了解您所做的事情。 **專業提示:**標記您貢獻程式碼的公司;他們可能會重新發布您。 3. **想想你的受眾**- 我看到太多的「影響者」專注於初級開發人員,例如(你必須知道的10 個CSS 技巧和10 個HTML 標籤),雖然這會大大增加你的受眾規模,因為有更多的初級開發人員在世界上比前輩。你會建立錯誤的受眾。作為一名大三學生,你將與許多開源創始人一起打上自己的烙印。即使對於開發相關職位來說,這也可能是錯誤的,因為你建立的受眾永遠不會付錢。 ![做這個](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o3h1py1um97u0w3l3xlq.png) --- 吉特魯姆 ---- 我將注入一些可以幫助你的自我推銷:) [Gitroom](https://github.com/gitroomhq/gitroom)是一個用於社群媒體排程的開源工具。 向 Gitroom 做出貢獻可以實現我討論的兩點。 1. 為大型程式碼庫做出貢獻 2. 透過安排社交媒體貼文來擴大您的貢獻。 但還有第三個,我想你會喜歡的。 Gitroom 是最大的開源創辦人社群;你實際上會和他們一起出去玩,他們不斷在世界各地尋找遠端員工。 這是獲得內部信任的好方法。 貢獻後,加入我們的 Discord 頻道。 所有開源創始人都在那裡。 ***如果可以的話請給 Gitroom 星標*** --- 糖霜 -- 本文不會為你粉飾它。 如果你想被錄用,你需要表現出色。 這不是一個「欺騙」人們僱用你的快速計劃。 它只是擴大您的知識和技能的工具。 如果您不能為大型程式碼庫做出貢獻,就不要指望被雇用。 這是我在上一篇文章的一段對話: ![程式碼庫](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hksdy5v7k8qpgbwo0f8x.png) 如果你還不夠好,那就努力提升你的技能。 當涉及到實際工作時,沒有任何魔術。 --- 原文出處:https://dev.to/github20k/i-am-suitable-for-the-job-but-unsure-why-i-cant-get-it-5eg4

2024 年程式設計師和開發人員應該學習的 5 項技能

*揭露:這篇文章包含附屬連結;如果您透過本文中提供的不同連結購買產品或服務,我可能會獲得補償。* [![面試時必須了解的 10 個系統設計概念](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kfxdldzd09fwws7nve36.png)](https://bit.ly/3cNF0vw) image\_credit -[指數](https://bit.ly/3cNF0vw) 開發者們大家好,如果您一直從事程式設計和軟體開發,那麼您就會知道,在我們的領域中只有一個常數,那就是「變化」。 我們總是需要學習新的工具、技術、框架和技能來完成我們的工作,而且永無止境。如果你不學習,你就會和其他人一起落後,這就是為什麼我總是尋找新技能來學習。 在本文中,我將分享程式設計師和開發人員在 2024 年可以學習的 5 項技能,以更好地完成工作並提高效率。 過去,我討論過[API 網關與負載平衡器、](https://dev.to/somadevtoo/difference-between-api-gateway-and-load-balancer-in-system-design-54dd)[水平與垂直擴展](https://dev.to/somadevtoo/horizontal-scaling-vs-vertical-scaling-in-system-design-3n09)、 [正向代理與反向代理](https://dev.to/somadevtoo/difference-between-forward-proxy-and-reverse-proxy-in-system-design-54g5)之間的區別,你們非常喜歡,在本文中我將分享最重要的五種開發人員技能2024 年成為舞台中心。 ***PS 繼續閱讀直到最後。我有一份獎金給你。*** 這些技能包括新舊但必不可少的技能,例如快速工程、編碼、雲端運算領域、系統設計和Python,這些技能是任何軟體開發人員都需要的基本技能。 無論您是想要提升自己的經驗豐富的開發人員,還是想要提升自己形象的中級開發人員,這些技能都一定會對您有所幫助。 2024 年軟體工程師應該學習的 5 項技能 ---------------------- 在不斷發展的技術領域,對於尋求在 2024 年及以後蓬勃發展的開發人員來說,保持領先地位至關重要。 當我們探索軟體開發的動態領域時,某些技能已經成為現代開發人員不可或缺的技能,這就是您將在本文中學到的內容。 讓我們深入探討預計在 2024 年產生重大影響的前五項開發人員技能。 ### 1. 系統設計 到 2024 年,開發人員需要超越傳統的程式設計實踐,擁抱現代系統設計原則。這涉及了解分散式系統、微服務架構以及設計可擴展和彈性的應用程式。 能夠應對系統設計複雜性的開發人員能夠更好地建立強大的解決方案,以滿足快速發展的技術環境的需求。 如果您想深入學習系統設計,那麼您也可以查看[**ByteByteGo**](https://bit.ly/3P3eqMN) 、 [**Design Guru**](https://bit.ly/3pMiO8g) 、 [**Exponent**](https://bit.ly/3cNF0vw) 、 [**Educative**](https://bit.ly/3Mnh6UR)和[**Udemy**](https://bit.ly/3vFNPid)等網站,它們有許多很棒的系統設計課程 [![如何回答系統設計問題](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xd9nfio7kl57gyevndql.jpg)](https://bit.ly/3pMiO8g) 如果您需要更多資源,那麼這裡有[系統設計書籍](https://www.linkedin.com/pulse/8-best-system-design-books-programmers-developers-soma-sharma/)、 [課程](https://www.linkedin.com/pulse/10-best-system-design-courses-beginners-experienced-2023-soma-sharma/)和[網站](https://javarevisited.blogspot.com/2022/08/top-7-websites-to-learn-system-design.html)的列表,供您在 2024 年學習和掌握軟體設計和架構。 --- 2. 快速工程 ------- 在這個人工智慧工具的時代,軟體開發並非一成不變,越來越多的人工智慧工具來幫助您進行編碼、除錯和測試,但您需要及時的工程設計才能有效地利用這些工具。 換句話說,快速工程已成為旨在快速交付高品質產品的開發人員的關鍵技能。 這不僅涉及編寫高效、簡潔的程式碼,還涉及採用敏捷方法和工具來簡化整個開發過程。 精通即時工程的開發人員可以快速回應不斷變化的需求,確保他們的軟體在面對不斷變化的市場需求時保持適應性和彈性。 如果您需要資源來學習 ChatGPT 和提示工程,那麼我建議您查看 Coursera 上的[針對開發人員的 ChatGPT 提示工程](https://datacamp.pxf.io/c/1193463/1012793/13294?u=https%3A%2F%2Fwww.datacamp.com%2Fcourses%2Fchatgpt-prompt-engineering-for-developers)課程。 [![最佳即時工程課程](https://miro.medium.com/v2/resize:fit:609/1*gpcsXMiCmBgVIr_I7RFYGg.jpeg)](https://medium.com/javarevisited/top-5-chatgpt-online-courses-for-2023-e6fc706cc483) 如果您需要更多選項,那麼您也可以查看這些[ChatGPT 和 Prompt Engineering 課程](https://javinpaul.medium.com/top-10-udemy-courses-to-learn-artificial-intelligence-in-2023-85a10ef473ca)以了解更多資訊。 --- 3. 編碼 ----- 雖然編碼似乎是一項顯而易見的技能,但其重要性怎麼強調也不為過。掌握編碼不僅限於編寫功能性程式;它涉及編寫乾淨、可維護和可擴展的程式碼。 開發人員應該專注於提高程式語言的熟練程度、理解演算法和實施最佳實踐。 堅實的編碼基礎是任何開發工作成功的基石。而且,如果您需要資源,可以查看[《2024 年完整 JavaScript 課程:建立真實專案》](https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&subid=0&offerid=323058.1&type=10&tmpid=14538&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fthe-complete-javascript-course%2F)作為開始。 [![學習 JavaScript 編碼的最佳課程](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aesrzc6ogw58ktw6nxax.png)](https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&subid=0&offerid=323058.1&type=10&tmpid=14538&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fthe-complete-javascript-course%2F) 如果您需要更多選擇,您也可以查看這些[**程式設計和程式設計課程**](https://medium.com/javarevisited/7-best-coding-course-to-learn-programming-with-zero-experience-in-2020-52f7d0d9cb80) --- 4.雲端運算 ------ 雲端運算已經從一個流行詞變成了開發人員的基本技能。隨著對雲端服務的依賴日益增加,開發人員必須精通在雲端環境中部署、管理和最佳化應用程式。 AWS、Azure 和 Google Cloud 等平台是現代開發不可或缺的一部分,精通雲端運算的開發人員可以建立可擴展且經濟高效的解決方案。 而且,如果您需要資源,可以查看這些文章,您可以在其中找到強烈建議的[**資源來學習雲端運算**](https://coursera.pxf.io/c/3294490/1164545/14726?u=https%3A%2F%2Fwww.coursera.org%2Flearn%2Faws-fundamentals) [![學習AWS的最佳課程](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d4mboj5cv4fufo8om7v0.jpeg)](https://coursera.pxf.io/c/3294490/1164545/14726?u=https%3A%2F%2Fwww.coursera.org%2Flearn%2Faws-fundamentals) 而且,如果您需要更多選擇,還可以參考這篇文章,您可以在 Coursera 上找到強烈推薦的[AWS 基礎專業課程](https://medium.com/javarevisited/top-10-courses-to-learn-amazon-web-services-aws-cloud-in-2020-best-and-free-317f10d7c21d)。該程式是AWS自己建立的。 --- ### 5.Python [Python](https://www.python.org/)繼續維護其作為多功能且強大的程式語言的主導地位。從 Web 開發到資料科學、機器學習和人工智慧,Python 始終處於創新的前沿。 2024 年的開發人員應該投資掌握 Python,因為它不僅有助於快速開發,而且還提供了通往塑造產業未來的眾多尖端技術的入口網站。 如果你想在 2024 年學習並掌握 Python,你可以從 Python 課程[100 Days of Code: The Complete Python Pro Bootcamp for 2024 開始](https://click.linksynergy.com/deeplink?id=JVFxdTr9V80&mid=39197&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2F100-days-of-code%2F),我現在也用它來學習 Python。 [![學習Python的最佳課程](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p5wlgc9kzsa03o0agoz3.png)](https://click.linksynergy.com/deeplink?id=JVFxdTr9V80&mid=39197&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2F100-days-of-code%2F) 如果您需要更多資源,您也可以查看這些[Python 書籍](https://javarevisited.blogspot.com/2019/07/top-5-books-to-learn-python-in-2019.html)、 [課程](https://betterprogramming.pub/top-5-courses-to-learn-python-in-2018-best-of-lot-26644a99e7ec)和[網站](https://medium.com/javarevisited/10-free-python-tutorials-and-courses-from-google-microsoft-and-coursera-for-beginners-96b9ad20b4e6)來深入學習 Python。 這就是**您在 2024 年可以學習的 5 項最重要的開發人員技能**。總之,2024 年頂尖開發人員技能反映了業界對敏捷性、適應性和卓越技術的需求。 無論您是經驗豐富的開發人員還是剛開始編碼之旅,磨練這些技能無疑將使您成為不斷發展的軟體開發世界中的寶貴資產。 迎接挑戰,保持好奇心,踏上持續學習之旅,在 2024 年及以後的動態格局中蓬勃發展。 ### 獎金 正如所承諾的,這是給您的獎勵,一本免費的書,您可以閱讀它來學習分散式系統設計,您可以下載免費的 PDF 或在 Microsoft 上在線閱讀 --- [https://info. microsoft.com/rs/ 157-GQE-382/images/EN-CNTNT-eBook-DesigningDistributedSystems.pdf](https://info.microsoft.com/rs/157-GQE-382/images/EN-CNTNT-eBook-DesigningDistributedSystems.pdf) ![學習分散式系統設計的免費書籍](https://miro.medium.com/v2/resize:fit:276/0*AwK4rZgpbC15wA_b.png) 請在評論中告訴我您 2024 年將學習哪些技能?我總是渴望學習可以提升我作為軟體開發人員的形象的技能。 謝謝 --- 原文出處:https://dev.to/somadevtoo/5-skills-programmers-and-developers-should-learn-in-2024-3bmp

被開除的心路歷程

![射擊](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aro2mn9dgxz28sc68di5.jpg) 不久前,我從高級開發人員的職位被解雇了,在此之前我從未被解僱過,無論我走到哪裡,我一直都是中等到頂級的表現,並且一直受到同事的喜愛,但這裡的情況卻大不相同。 我當時在哪裡 ------ 我離開了以前的工作,因為他們遇到了財務問題,而且我已經在那裡工作了一段時間,覺得自己的角色已經變得陳舊,我是高級開發人員和團隊負責人的混合體,我的團隊到最後只剩下我了。 我變得沒有動力,我的團隊不知疲倦地工作的公司主要專案之一被取消了。由於公司必須轉型,一年多來的工作實質上都被丟進了垃圾箱。 所以我開始尋找另一份工作,我不想要另一個發展職位,我想要更多的挑戰,我想要擴展自己。我看到一家顧問公司正在尋找一位開發人員,希望能夠從事一些很酷的專案。我申請了,通過了他們的測試,通過了面試,準備嘗試新的東西。 ![風暴](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ymelx2tsgdr6mlucvmur.jpg) 走進暴風雨 ----- 在我加入之前,我參加了這家公司的夏季聚會,沒有任何危險信號,人們看起來很高興,業主看起來也很好。 我拿到了筆記型電腦和一個漂亮的迎賓禮盒,我真的很興奮,準備重新振作起來,抓住這個機會。 我做了正常的人力資源工作,在第一天設定了我的環境,然後被告知我應該繼續的專案尚未獲得批准。被告知開始關注我的認證,並被告知專案何時準備就緒。 突然接到一位業主的電話,說有一個前端專案需要資源來加速進度。技術堆疊有點超出了我的舒適區,但想要給人留下深刻的印象並表明我相當多才多藝,就像確信我能做到一樣,我解釋說我需要加快使用所使用的技術堆疊的速度,並獲得了大約一半的時間閱讀我需要的內容的一天。 烏雲密佈 --- 我遇到了該專案的首席開發人員,雖然他有點友好,但他似乎對我沒有技術堆疊經驗感到相當不高興,但他給我分配了一些任務,然後讓我去做,直到…一個小時後,他打電話給我,問我過得怎麼樣。告訴他,努力讓專案在本地執行,他和我一起完成了編譯和執行,有一些環和資料庫條目讓我執行。 任務本身很簡單,但我無法弄清楚所使用的編碼風格和模式。事後看來,這個計畫的一些決定有點值得懷疑。 我每兩個小時就會接到電話詢問進度,並會收到評論,例如你們進展緩慢,我們落後了,然後很快就保證我們會到達目標。很快我就從「我可以征服任何事情」變成了「也許我作為開發人員很糟糕」。 看起來要開始下雨了 --------- 我確實沒有交到任何朋友,也沒有與這家公司的人建立任何密切的聯繫。我感到非常孤獨,從派對生活變成一個非常內向和保守的人,這真是令人震驚。我還沒有完全從這件事中恢復過來,我現在還是比較安靜,不會說太多話。 這種情況又持續了兩週,一直對我進行微觀管理的開發人員需要休假,並給了我一週的任務。 他完成了有問題的任務,我們給了他們估計,此時我開始變得有點矛盾,我是否能夠完成我的工作。 這些任務在紙上很簡單,但實際上我花了很多時間嘗試瀏覽程式碼庫。有時我會分心,看太多 YouTube 影片,很快就會失去注意力。我不再關心,此時,開始找工作,解釋我覺得我在這個角色上犯了錯。 ![噢,雷鳴般的](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l661a91r5htrz4ntiqy6.jpg) 現在雷聲大作 ------ 另一位開發人員度假回來後,他似乎對我沒有完成所有任務感到憤怒,我確實為我設法完成的任務提出了 PR,但他的半令人放心的台詞回來了“我們會完成它”。 一天快結束時,我收到了人力資源部門發來的一封不祥的電子郵件,告訴我客戶不滿意,我已經完成了對該專案所做的所有工作的審核。 我完成了審計並回信說,我對客戶沒有向我提出這個問題感到失望,回想起來,這是一個非常糟糕的主意。下一分鐘我就收到了隔天早上召開人力資源會議的請求。 雷擊 -- 在人力資源電話中,很快就告訴我要被解僱,我知道為什麼,我沒有費心去抗爭或爭論,我接受了它,現在接受了我新發現的失業。 在那之後的幾天裡,我感到很生氣,這表明我對面試官失去了冷靜,對這個世界普遍感到不安。我給了自己幾天悶悶不樂的時間,然後重新上馬並找到了一家更好的諮詢公司,儘管我的角色不太注重開發人員。 反思 -- 我寫這篇文章的原因是,被解僱是可以的,是的,這很可怕,而且尋找新角色的不確定性,特別是在當今的市場上,是一種可怕的感覺,但正如偉大的首席開發人員會說「我們會到達那裡」。 反思這一點,我需要休息一下,我以前的角色到這個可怕的角色是如此充實,我經歷了一些重大的生活事件和一些普遍困難的時期,去年,我搬了家,我的兒子出生並換了工作。我注定會崩潰,我的通知期很長,我應該在角色之間休息一些時間。 我還認為我應該從開發中休息一下,我覺得我在這個階段確實失去了對開發的熱情,而進入我現在所擔任的角色幫助我通過遠離開發一步來重新激發了我對開發的熱情。 我不應該那麼急於接受任何專案,我應該直截了當地說我不認為我可以勝任這個角色,請為我找到另一個專案,也應該儘早標記我不認為我可以勝任這個角色工作。 我應該更以客戶為中心,如今,只需與客戶交談就可以幫助我克服一些障礙。 對於首席開發人員,我理解他們承受的壓力,我不會因為我的失敗而抨擊他們或責備他們。然而,作為現在的團隊領導,我確保自己保持專業,鼓勵我的團隊成員,並確保回饋是建設性的,而不是一系列帶有虛假保證的挖掘。 歸根結底,被解僱並不是你生命的終結,甚至不是你職業生涯的終結,你可以重新振作起來,並將其作為一種學習經驗。 ![反思](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o6baqjwghqu6svzrmkn6.jpg) --- 原文出處:https://dev.to/darkliahos/so-i-got-fired-3ko5

我從亞馬遜面試的 coding 測驗中學到了什麼

最近,我受邀參加亞馬遜的線上編碼評估。由於我與目前的工作簽訂了一段時間的合同,我認為嘗試一下可能會很有趣,沒有壓力。以下是我從徹底崩潰和燃燒的編碼評估中學到的東西: \#1.先解決問題 --------- 我花了很多時間來驗證論點,儘管這可能是您在現實生活中所做的事情,但這對於編碼評估來說並不是一個好主意。有時,公司會拋出邊緣情況 - 也許您的`List`為空,或者為`null` - 但通常是在他們驗證您的解決方案對有效輸入的行為之後。 \#2.了解基礎知識 ---------- 您不想在計時器倒數時浪費時間谷歌搜尋如何深度複製陣列。了解如何使用所有標準資料結構並練習、練習、再練習。 #3。仔細閱讀提示 --------- 有時您的提示會出現警告。也許提示希望您返回最佳解決方案(如果存在),但如果您的解決方案低於某個閾值,則根本不返回任何內容。確保您滿足提示的要求。 #4。使用您自己的編輯器 ------------ 線上編碼評估或多或少必須提供某種線上 IDE 來幫助您編譯、偵錯和執行程式。**不要使用它。**它將變得陌生、緩慢,並且可能具有您不想要的特定功能(程式碼完成),或缺少一些您需要的功能(自動庫導入)。 #5。限制時間練習 --------- 這些編碼評估旨在快速進行,但如果您知道自己在做什麼,又不會太快以致您耗盡時間。話雖這麼說,當您完成後,您可能會想返回並清理一些程式碼、優化並加入一些註釋。練習的時間比你應該分配的時間*少*。 有[第三方](https://coderbyte.com/)評估平台,亞馬遜有線上[編碼評估演示](https://www.myamcat.com/start-demo?data=VvSY8gb%2BBAAefK0phJWENBOPoTXDc8na4fhRROtwuZ9MIbQ7gXB2pLYyDf%2B4UUy3bjNJmcgRqJuzDgML1nQF%2Bg%3D%3D)。我確信其他公司也存在這些,如果有人可以在評論中提供它們。 --- 就是這樣!我想如果我遵循了上面我自己的建議,我可能至少能夠及時完成提示。如果你像我一樣是個完美主義者,你需要把它留在門口,以便能夠先制定一個有效的解決方案,然後回去清理它。祝你好運! 如果您喜歡這篇文章,請考慮[為我買杯咖啡](https://ko-fi.com/Z8Z811E9B)來支持我的工作! --- 原文出處:https://dev.to/awwsmm/what-i-learned-from-bombing-an-amazon-coding-assessment-4aom

成為資深前端開發者需要的 37 個心態

我真的很喜歡 @abbeyperini 的[帖子](https://dev.to/abbeyperini/12-tips-from-a-mid-level-developer-29bk),並決定在擔任軟體開發人員**5 年多**後分享我的技巧。 準備好?讓我們深入探討。 1.掌握基礎知識 ======== 建在搖搖欲墜的土地上的房子🏠,稍有問題就會倒塌。 同樣,如果你沒有紮實的基礎: - 你會很難適應 JavaScript 框架 - 你會陷入第一個不熟悉的問題 - 您無法掌握某些問題之間的共同主題 因此,如果你想提升前端開發人員的水平,首先要掌握**HTML** 、 **CSS**和**JavaScript** 。 --- 2. 了解網路的工作原理 ============ 在過去的幾年裡,前端開發變得更加複雜。 使用了許多工具(*捆綁器*、*轉譯器*等) 如果您不了解網路的工作原理(即「唯一」支援的語言是**HTML** (用於結構)、 **CSS** (用於樣式)和**JavaScript** (用於互動)),您將很難理解為什麼需要有這麼多工具可以在線執行您的程式碼。 ![建築模組](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/miha7y379n9wnemtnhdi.gif) --- 3.熟悉資料結構與演算法 ============ 由於程式設計面試,資料結構和演算法經常受到不好的評價🤦‍♀️。 **然而**,了解關鍵因素及其複雜性至關重要。如果沒有這些知識,您將無法編寫複雜的程式或評估程式碼效率。 以下是需要了解的資料結構/演算法的非詳盡列表: **資料結構:***棧*、*佇列*、*雜湊圖*、*集合*、*圖*等。 **演算法:***動態規劃*、*貪心演算法*、*遞迴*等。 --- 4. 透過實踐而不是閱讀/觀看來學習 ================== 教學會欺騙您,讓您感覺自己正在取得進步。 它們讓你相信你正在學習和進步,但你並沒有前進。真正的學習是透過實踐或教學發生的。 所以,多多練習,避免陷入教學地獄🔥。 --- 5.遇到困難時尋求協助 =========== 你不是一個人。 您附近很可能有高級開發人員,您可以向他們尋求協助。 所以,不要浪費時間去兔子洞裡。您的目標是提供價值,如果您浪費時間解決其他人已經解決的問題,您就無法實現這一目標。 ![請求幫忙](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iksbkr0yvd3gqh4x22d5.png) --- 6.以正確的方式尋求協助 ============ 在尋求幫助之前,請確保您已經做了最低限度的事情。 你應該首先: - 在 Google/Stack Overflow/ChatGPT 上搜尋解決方案 - 了解你的目標以及什麼不起作用 - 記錄所有失敗的嘗試 另外,不要針對同一問題重複尋求協助。當您獲得幫助時,請在某處記下,以免忘記。 --- 7. 不要複製/貼上你不理解的程式碼 ================== 由於多種原因,這非常糟糕: - 您最終可能會得到不安全的程式碼,這些程式碼會暴露令牌等敏感資訊。 - 您將無法輕鬆除錯程式碼。 - 你將無法向你的同事解釋它。 這對 ChatGPT 尤其重要,因為它有時只能提供 80% 的準確答案。 ![困惑的表情符號](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sfansm0i6qss45kkcz8a.png) --- 8. 不要盲目採納網路上找到的每一個建議 ==================== 我剛開始的時候就犯了這個錯誤。 我發現有人建議說 React 中的記憶化是邪惡的,所以我停止使用它。 令我尷尬的是,我的程式碼在預生產中崩潰了。 所以,別讓我「老」了。 當您在網路上看到建議時,請先問自己以下問題: - 這個建議適用於我嗎? - 提供建議的人是否與我的情況類似? **TLDR** :運用常識🫠。 --- 9. 懷抱良好的意願:人們希望你成功❤️ ==================== 當你是新人時,人們通常會認為人們正在等待發現你的錯誤並解僱你。 至少,這是我的思想對我低聲說的。 但事實恰恰相反。 當一家公司僱用你時,它非常希望你成功。否則,這就是浪費他們在培訓和入職方面投入的時間和資源。 因此,相信你的公司希望你做得很好,並毫不猶豫地向你的同事尋求支持。 --- 10.完成勝於完美 ========= 追求完美往往會導致以下結果: - 拖延 - 浪費時間 - 過於複雜 - ETC。 因此,目標是在推動更多之前交付/驗證 V0。 ![做完比求完美強](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u146x2ia7stie8eyvwpa.png) --- 11. 始終將任務分解為可管理的任務 ================== 感到不知所措的最簡單方法是什麼? 👉 試圖咬得比你能咀嚼的更多。 始終將專案分解為更小的任務。 這會: - 讓你不會感到不知所措 - 讓您的 PR(拉取請求)更容易審核 - 提供進步感 --- 12. 值得信賴,當你需要幫助時會伸出援手 ===================== 剛開始時,您的首要任務是贏得經理的信任。 當他們想到你時,應該安心。 他們應該相信: - 你在簡單的任務上很可靠 - 必要時您會尋求協助 - 有任何問題你都會溝通 您不想因為成為經理必須持續監控的問題而增加他們的工作量🔎。 --- 13.表現出對工作的熱情 ============ 用熱情可以彌補很多不足🤪。 當你是新人時,要充滿渴望和興奮。 只有經驗豐富的開發人員才能承受缺乏熱情的後果。 沒有人願意不斷地督促某人工作。指導已經夠困難的了;必須激勵某人會使事情變得更具挑戰性。 ![熱情](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hmc0s50vm86bam0069nw.png) --- 14. 對學習新事物/工具/方法保持開放態度 ====================== 前端開發不斷發展。 因此,您需要對新技術持開放態度。 不要太拘泥於現有的工具。相反,表現出學習的興趣😋。 --- 15. 掌握你的開發工具🛠️ ============== 想要加快您的開發時間嗎? 掌握你的開發工具: - 您的 IDE(例如 VSCode) - 您的原始碼控制系統(例如 Github) - 您的瀏覽器和檢查器(例如 Chrome 檢查器) - ETC。 ![工具包](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9h6zn8k68yghmb0ecffh.png) --- 16. 專注於創造價值 =========== 不要在真空中編寫程式碼。 您編寫的每段程式碼都應該為以下方面提供價值: - 您的客戶 - 你的公司 - 您的利害關係人 - ETC。 您的報酬與您提供的價值掛鉤,而不是與您編寫的程式碼掛鉤。 因此,優先考慮編寫有目的的有效程式碼🥅。 --- 17. 為你的工作辯護:它不會自己說話 =================== 可能是新開發人員最常見的錯誤之一(特別是如果您來自重視謙虛的文化)。 1. 你做了一些了不起的事。 2. 沒有人知道這件事。 👉 那工作並不重要。 因此,透過寫作、演示等方式分享您的作品。 ![為你的工作說話](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t55ep1c3phxgypwchbfh.png) --- 18. 喜歡寫愚蠢的程式碼而不是聰明的程式碼 ====================== 程式碼被閱讀的次數遠多於寫的次數📝。 因此,不要編寫只有您才能理解的聰明程式碼。 **可讀性>效能>聰明。** 您希望您的同事能夠有效率地處理您的程式碼,並在必要時為您提供協助等。 --- 19.你的經理是你最好的盟友 ============== 除非你特別不幸,否則你的經理會支持你的成長📈。 他們通常希望你能夠蓬勃發展,為團隊做出貢獻,並留在公司,而不是在其他地方尋找機會。 因此,請務必招募他們來實現您的目標。 分享你的勝利、挫折(以積極的方式)和挫折,而不是獨自奮鬥。 --- 20.讓你的經理的生活更輕鬆 ============== 這個很簡單,但常被忽略。 您的經理可能有您可以協助解決的問題: - 他們可能需要加入文件但缺乏時間 - 他們的工作量可能龐大,需要支持 - 和更多 這可能是贏得經理支持(升遷、加薪等)的最簡單方法。他們已經意識到這些任務並且可以直接看到它們的影響(至少對他們來說)。 ![最佳老闆杯](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yz4tz3h7o12oh4x4f0lg.png) --- 21.了解任務背後的大局 ============ 不要成為程式碼猴子🐒。 剛開始時它可能會對您很有幫助。 但要達到下一個級別,您需要了解任務背後的背景: - 為什麼它們有價值 - 為什麼你被分配給他們 - 它們如何適應公司的整體策略 這種理解對於您的職業生涯更上一層樓至關重要。 --- 22. 為團隊做出貢獻(文件、技術講座、演示等) ======================== 這不僅對公司有利,對您也有利。 透過進行演示、共享文件等,您可以展示您的技能並提高團隊的生產力。 始終致力於盡可能提升團隊的表現:這是令人愉快且有益的😊。 ![貢獻](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rbmz4r1ucrrqe84mpq6f.png) --- 23. 成為特定領域的“掌門人” ================ 如果我必須提供一個建議,那就是這個。 在職業生涯的初期,探索各個領域是可以的。 但是,要晉升到中/高級級別,請專注於培養某一領域的專業知識。這對於促銷來說比多個領域的平均水平更具吸引力。 因此,我們的目標是培養[T 型](https://www.forbes.com/sites/lisabodell/2020/08/28/futurethink-forecasts-t-shaped-teams-are-the-future-of-work/)技能:在某一領域擁有廣泛的知識和深厚的專業知識。 --- 24. 培養你的溝通技巧 ============ 不幸的是,這是必須的。 溝通對於開發人員來說至關重要。我們經常需要做以下事情: - RFC(徵求意見) - 示範 - 演講 - ETC。 因此,請確保您具有基本的溝通能力。 --- 25. 當你遇到問題時休息一下 =============== 當你深陷一個問題時,很難停下來。 即使已經過去了 5 年多,我仍然在掙扎🥹。 然而,休息後我總是會產生更新鮮的想法。 所以,如果你已經被困太久了,那就離開吧。 ![休息](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/96yk7dr61s2sc7rflive.png) --- 26. 發揮你的優勢,而不是劣勢 ================ 不要再浪費時間試圖修復明顯的弱點。 如果您持續花費超過 1 小時才能完成同您級別的其他人在不到 5 分鐘內完成的任務,請避開該任務。 投入更多的精力很可能不會讓你在這方面表現出色。 相反,做必要的事情並專注於最大限度地發揮你的優勢。如果某件事對你來說很自然且有價值,那就多做一點吧🚀。 --- 27. 掌控自己的職涯道路 ============= 沒有人會為你規劃你的職涯。 如果沒有計劃,你就會為別人的計劃而努力。 因此,請確保您為自己想要在 1/2/5 年內實現的目標制定計劃 💪。 --- 28. 與其他開發人員一起交流 =============== 您目前是否患有冒名頂替症候群? 如果是這樣,請花時間與其他開發人員交流。 您很快就會意識到您並不孤單。 與其他開發人員聯繫還有其他好處: - 您可以學習新的技巧/技巧 - 你們可以討論共同的經歷 - 你們可以在工作上互相補充 - ETC。 ![朋友們](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y9r46ijzzv99jfdjrssa.png) --- 29. 指導年輕開發人員 ============ 這是冒名頂替症候群的最佳治療方法之一。 一旦你開始指導年輕的開發人員: - 你會發現你知道一些事情 - 您將把自己定位為中/高級開發人員 - ETC。 --- 30.讓你解決的問題多樣化 ============= 如果你不斷地解決同樣的問題,你的進步就會趨於穩定。 確保您正在解決不同的問題,以便您可以: - 比較各種方法 - 開發解決問題的工具包 - ETC。 ![雞蛋放在多個籃子裡](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hllqddeurnt0bx03m2md.png) --- 31.尋找導師 ======= 擁有偉大的導師是我職業生涯的亮點。 - 導師了解您的旅程,讓您腳踏實地。 - 他們會指導你避免他們所犯的錯誤。 - ETC。 **如何尋找導師?** 與您互動的更有經驗的開發人員聯繫,提出問題,討論他們的經驗等。 如果您無法聯繫資深開發人員,請與 X 等平台上的個人互動,與他們建立關係,然後聯絡 😉。 --- 32. 致力於 JavaScript 框架並掌握它 ========================= 最好的框架是能夠幫助您最快實現目標的框架。 所以,忽略網路上毫無意義的爭論。 選擇您最熟悉或需要學習的框架。 並掌握它。這就足夠了。 有了紮實的 JavaScript 基礎知識,過渡到另一個框架將會很快。 ![合約](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s7p9c7u02uqv5b8fhxew.png) --- 33.不斷思考使用者體驗 ============ 身為前端開發人員,你應該考慮使用者。 即使您有 PM 或設計師,也要確保使用者體驗良好 😌。 - 需要時使用載入狀態 - 在 UI 中傳達進度 - 給用戶回饋 - ETC。 --- 34. 坦然地說“不” =========== 這對我來說是一件艱難的事。 我對每一個專案都感到興奮,並努力拒絕。 但身為開發人員,您經常會收到超出您處理能力的請求。 因此,請優先考慮與您的目標最相符的那些。 --- 35.不斷投資你的技能 =========== 選擇成為前端開發人員,您就致力於從事必須不斷學習的職業。 因此,透過學習新語言、掌握新技術等不斷投資你的技能。 ![技能](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l2lptuajtkra0p080nnc.png) --- 36. 當面臨太多工作時,減少功能而不是提高程式碼品質。 ============================ 您的應用程式擁有的功能越多越好,對嗎?正確的? 最初,這似乎是正確的,但附加的功能會導致更多的程式碼。更多的程式碼意味著更多的問題(維護、錯誤等)。 因此,當時間緊迫時,應減少功能而不是犧牲程式碼品質。 --- 37. 努力了解你的合作者(設計師、後端開發人員等) ========================== 始終尊重您的合作者(後端開發人員、設計師、產品經理等)。 應用程式開發是團隊的努力。 團隊成員之間的協同越多,環境就會越快樂、越有效🥰。 ![交朋友](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1vdbfdepvkkxdug91noo.gif) --- 感謝您閱讀這篇文章🙏。 發表評論 📩 分享小貼士。 並且不要忘記加上“💖🦄🔥”。 如果您喜歡這樣的文章,請加入我的**免費時事**通訊**[FrontendJoy](https://frontendjoy.substack.com/)** 。 如果您想要每日提示,請在[X/Twitter](https://twitter.com/_ndeyefatoudiop)上找到我。 --- 原文出處:https://dev.to/_ndeyefatoudiop/37-tips-from-a-senior-frontend-developer-251b

為開源做出貢獻將使您獲得新工作的機會增加 10 倍 🚀

最近我一直在嘗試讓一些程式設計師在 Upwork 上為我工作。每個申請者都提出了很多關於他們是否能夠真正處理我的專案的問題。 我還沒有僱用任何人。 ![沒有技能](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bps04cekis2pasb07w07.gif) --- 將作業新增至 Upwork ------------- 我做了一個非常簡單的職位描述,並回答了幾個問題: ![問題](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8krynn1qyxy0fpifel23.png) 並開始收到許多無用的申請。如果其中許多是使用 ChatGPT 建立的,我不會感到驚訝。 ![無益的](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/swlrnc124ryte61zozh1.png) 然後收到了很多帶有未解決問題的申請: - 我怎麼知道他們可以處理我的專案? - 我怎麼知道他們沒有說謊? - 我如何知道他們是否能夠以高品質的貢獻來應對? - 我怎麼知道他們知道如何與我正確溝通? ![大聲哭](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mg3dva9mc5zxeal24kka.png) 如此多的懸而未決的問題給聘用任何候選人帶來了巨大的風險。如果他們做得不好,我可以: - 失去時間 - 賠錢 - 浪費了我的時間(因為我需要教他們) 我需要面試和測試每個候選人(很頭痛) --- 開源閃耀 ---- 現在,假設有人為我的開源儲存庫做出了貢獻。 現在我明白了: - 他們的水平 - 他們處理大型專案的能力 - 他們如何溝通 我可以告訴你,在[Novu](https://novu.co/) ,很多貢獻者已經從貢獻者轉變為員工。 大多數開發人員常犯的錯誤 ------------ 我透過 GitHub 收到了一個人的申請。這是他們的 GitHub 個人資料: ![輪廓](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9jd2ktb7tjb3e8r85ast.png) 他們沒有為不同的開源儲存庫做出很多貢獻,而是嘗試建立和應用自己的演示。 這是一個很大的錯誤。 每個擁有1年以上經驗的開發者都可以從0開始;在受控環境中要容易得多。 實際上,為大型程式碼庫做出貢獻(並進行合併)是一個不同的層次。 以下是我從 HackSquad 不和諧中收到的一條訊息: ![黑客小隊不和諧](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8rlz8fl98vr9bsc1zrrh.png) > “但是初學者無法為他們龐大的程式碼庫做出貢獻” 這就是您在申請工作時降低風險的方法。 因此,不要建立 100 個演示專案,而是專注於為更大的程式碼庫專案做出 1-2 個貢獻。 對您的貢獻具有戰略意義 ----------- 在為任何大型程式碼庫專案做出貢獻之前,請檢查: - 是一家公司嗎? - 他們在招人嗎? - 他們有空缺職位來滿足我正在尋找的職位嗎? - 我可以向類似公司或 Upwork 展示這項貢獻嗎? --- 您應該貢獻的專案 ======== 所有列出的專案都是完全遠端的公司,到處招募。 [1.Gitroom](https://github.com/gitroomhq/gitroom/) -------------------------------------------------- 我沒有太多的預算,但我正在努力減輕一些工作。如果您想:這是一個很好的專案: - 從一個中型專案開始 - 使用最先進的技術,例如 NextJS 和 NestJS - 接觸更多支援許多開源公司的開源公司(因為 Gitroom)。 我還打開了一系列很酷的問題,您可以從這裡開始! [![吉特魯姆](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zlcqtrvpmjr03c96bydd.png)](https://github.com/gitroomhq/gitroom/) 2.[Copilotkit](https://github.com/CopilotKit/CopilotKit/) ---------------------------------------------------- 如今,出現了一個新概念「AI工程師」。它主要適合那些有興趣用人工智慧建立東西而不自己建立人工智慧的人。 Copilotkit 正在建立包裝現有法學碩士的聊天機器人。如果您想:這是一個很好的專案: - 與法學碩士合作 - 使用 NextJS 以及未來更多的框架 - 做一些很酷的人工智慧狗屎:) [![副駕駛套件](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d9ps9yyn60w9xqx3e1ie.png)](https://github.com/CopilotKit/CopilotKit/) 3.[Wing](https://github.com/winglang/wing/) ----------------------------------------- 雖然許多人去學習電腦科學,但他們是作為開發人員而不是工程師來編寫全端軟體的;你不必學習CS(我剛從高中畢業)。如果您想從事工程師職業,那麼這是一個很好的專案,如果您想: - 建造一個轉譯器,接受程式碼並最後將其轉換為 JS - 編寫複雜的演算法 - 打造深度基礎設施 ![翅膀](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/krrlly1b3x6rqc3w1ki4.png) 4.[LLMWare](https://github.com/llmware-ai/llmware) ------------------------------------------------- 我問[聖地牙哥](https://twitter.com/svpino)當今人工智慧最大的趨勢是什麼。他表示,RAG 和 LLM 是最大的炒作或主要是未來。 LLMWare 是與 RAG 相關的一切的殺手。如果您想:這是一個很好的專案: - 與 RAG 一起玩 - 播放和微調模型 - 成為 Python 專業人士 ![法學碩士軟體](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8az6baig5ctii4l64rgx.png) 5.[Novu](https://github.com/novuhq/novu) ------------------------------------- 我在 Novu 工作過,所以我可以告訴你這是一家很好的公司:) 他們的程式碼庫相當大(3 年的編碼)。如果您想:這是一個很好的專案: - 他們已經聘請了許多社區成員 - 簡單的程式碼庫全端 javascript - 巨大的社區(很有趣) ![新的](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ku2dva54034m8wq6abhp.png) 6.[Taipy](https://github.com/avaiga/taipy) --------------------------------------- 我愛泰比。他們建立了一個獨特的 Python 應用程式建構器;這是一個很酷的專案,因為它不像全端 JavaScript 應用程式那麼容易。如果您想:這是一個很好的專案: - 學習Python - 炫耀對大型程式碼庫的出色貢獻 - 成為大社區的一份子。 ![類型](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ajd52xb20zu8zy8fsgzt.png) --- 如果您是一家也在招聘的開源公司,請在評論中加入您的儲存庫:) --- 原文出處:https://dev.to/github20k/contributing-to-open-source-will-10x-your-chances-to-land-a-new-job-433f

2024 年 50 大系統設計面試問題

*揭露:這篇文章包含附屬連結;如果您透過本文中提供的不同連結購買產品或服務,我可能會獲得補償。* [![面試時必須了解的 10 個系統設計概念](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kfxdldzd09fwws7nve36.png)](https://bit.ly/3cNF0vw) image\_credit -[指數](https://bit.ly/3cNF0vw) 朋友們大家好,如果您正在準備技術面試,那麼您必須準備系統設計問題,因為這是大多數人都遇到困難的地方。 即使經驗豐富的程式設計師也很難解決常見問題,例如如何設計 WhatsApp 或 YouTube,或回答[API 閘道與負載平衡器](https://dev.to/somadevtoo/difference-between-api-gateway-and-load-balancer-in-system-design-54dd)、[水平與垂直擴充](https://dev.to/somadevtoo/horizontal-scaling-vs-vertical-scaling-in-system-design-3n09)、 [正向代理與反向代理](https://dev.to/somadevtoo/difference-between-forward-proxy-and-reverse-proxy-in-system-design-54g5)之間的差異。 在當今日益分散的世界中,建立強大且可擴展的系統的能力是頂級科技公司所追求的基本技能。 系統設計面試已成為評估候選人解決現實挑戰、評估權衡以及設計能夠處理複雜需求的系統的能力的關鍵組成部分。 之前也分享過[資料庫分片](https://medium.com/javarevisited/what-is-database-sharding-scaling-your-data-horizontally-1dc12b33193f)、[系統設計主題](https://dev.to/somadevtoo/10-must-know-system-design-concepts-for-interviews-2fii)、 [微服務架構](https://medium.com/javarevisited/10-microservices-design-principles-every-developer-should-know-44f2f69e960f)、 [系統設計演算法](https://dev.to/somadevtoo/10-distributed-data-structures-and-system-design-algorithms-for-interviews-a4j),今天就分享一下系統設計面試題。 在本文中,我精心設計了*50 多個系統設計面試問題,*以指導應徵者從基本概念到複雜的設計場景。 無論您是旨在掌握要點的初學者,還是尋求提高技能的經驗豐富的工程師,這些問題不僅可以幫助您為面試做好準備,還可以提高您對系統設計和軟體架構的了解。 順便說一句,如果您正在準備系統設計面試並想深入學習系統設計,那麼您還可以查看[**ByteByteGo**](https://bit.ly/3P3eqMN) 、 [**Design Guru**](https://bit.ly/3pMiO8g) 、 [**Exponent**](https://bit.ly/3cNF0vw) 、 [**Educative**](https://bit.ly/3Mnh6UR)和[**Udemy**](https://bit.ly/3vFNPid)等網站,它們有許多很棒的系統設計課程 [![如何回答系統設計問題](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xd9nfio7kl57gyevndql.jpg)](https://bit.ly/3pMiO8g) PS 繼續閱讀直到最後。我有一份免費獎金給你。 --- 2024 年 50 道系統設計面試題 ------------------ 這裡列出了針對初學者和經驗豐富的開發人員的 50 個流行的系統設計面試問題,您可以解決這些問題來開始準備。 在此列表中,我不僅分享了簡單、中等和困難的系統設計問題,還分享了基於概念的問題,例如 API 閘道與負載平衡器或微服務與整體式設計。您可以練習這些系統設計問題和麵試問題。 ### 基於系統設計概念的問題 1\. API網關和負載平衡器有什麼差別? \[ [解決方案](https://javarevisited.substack.com/p/difference-between-api-gateway-and?utm_source=profile&utm_medium=reader2)\] 2\. 反向代理和正向代理有什麼不同? [(回答)](https://dev.to/somadevtoo/difference-between-forward-proxy-and-reverse-proxy-in-system-design-54g5) 3\. 水平縮放和垂直縮放有什麼不同? [(回答)](https://dev.to/somadevtoo/horizontal-scaling-vs-vertical-scaling-in-system-design-3n09) 4\. 微服務和單體架構有什麼差別? [(回答)](https://dev.to/somadevtoo/difference-between-microservices-vs-monolithic-applications-for-system-design-interview-2lb5) 5\. 垂直分區和水平分區有什麼差別? 6.什麼是速率限制器?它是如何運作的? [(回答)](https://javarevisited.substack.com/p/what-is-rate-limiter-how-does-it?utm_source=profile&utm_medium=reader2) 7\. 單一登入 (SSO) 的工作原理是什麼? [(回答)](https://javarevisited.substack.com/p/how-does-sso-single-sign-on-authentication?utm_source=profile&utm_medium=reader2) 8\. Apache Kafka 是如何運作的?為什麼這麼快? [(回答)](https://javarevisited.substack.com/p/how-does-apache-kafka-works?utm_source=profile&utm_medium=reader2) 9\. Kafka、ActiveMQ 和 RabbitMQ 之間的差異? [(回答)](https://javarevisited.substack.com/p/difference-between-kafka-rabbitmq?utm_source=profile&utm_medium=reader2) 10\. JWT、OAuth 和 SAML 之間的差異? [(回答)](https://javarevisited.substack.com/p/difference-between-jwt-oauth-and?utm_source=profile&utm_medium=reader2) 這是來自 DesignGuru.io 的一個很好的圖表,它解釋了垂直和水平資料庫分區之間的區別 [![水平分區和垂直分區的區別](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kosgqvr5d2prlpo61tv7.png)](https://bit.ly/3pMiO8g) --- ### 𝐄𝐚𝐬𝐲 系統設計問題 現在,讓我們開始討論簡單的系統設計問題。這些是常見問題,您需要設計隨處使用的小型實用程序,例如 URL 縮短器: 1\. 如何設計像TinyURL這樣的URL縮短器 \[[解決方案](https://bit.ly/3dZoQ2G)\] 2\. 如何設計像Pastebin這樣的文字儲存服務? \[[解決方案](https://www.youtube.com/watch?v=9wAj-5IMdyU)\] 3\. 設計內容傳遞網路(CDN)? \[[解決方案](https://bit.ly/3dZoQ2G)\] 4\. 設計停車庫【[解決方案](https://bit.ly/3eMUosX)】 5.設計自動販賣機【[解決方案](https://javarevisited.blogspot.com/2016/06/design-vending-machine-in-java.html)】 6\. 如何設計分散式鍵值存儲 7.設計分散式緩存 8.設計分散式作業調度器 9\. 如何設計認證系統 10\. 如何設計統一支付介面(UPI) 並且,以下是來自 Educative.io 的 YouTube 高級設計供您參考: [ ![YouTube 的高層設計](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/03a26o4bntorhtpngs4v.jpg)](https://bit.ly/3Mnh6UR) --- ### 𝐌𝐞𝐝𝐢𝐮𝐦 系統設計問題 現在,是時候看看中等難度的系統設計問題了。這些問題既不簡單也不太困難,但您需要對各種軟體架構元件和系統設計概念有深入的了解才能回答這些問題。 11.設計Instagram【[解決方案](https://bit.ly/3BqamCL)】 12\. 如何設計 Tinder 13.設計WhatsApp([解決方案](https://bit.ly/3SbA9Eu)) 14\. 如何設計 Facebook 15.設計推特 16.設計Reddit 17.設計Netflix【[解決方案](https://bit.ly/3bbNnAN)】 18.設計Youtube【[解決方案](https://bit.ly/3bbNnAN)】 19\. 設計谷歌搜尋 20.設計像亞馬遜這樣的電子商務商店 21.設計Spotify 22.設計TikTok 23\. 設計 Shopify 24\. 設計愛彼迎 25\. 為搜尋引擎設計自動完成功能 26.設計速率限制器 27.像Kafka一樣設計分散式訊息佇列 28.設計航班預訂系統 29.設計線上程式碼編輯器 30.設計證券交易所繫統 31.設計一個分析平台(指標和日誌記錄) 32.設計通知服務 33.設計支付系統 而且,這是來自 DesignGuru 的 Netflix 高級系統設計,這是我最喜歡的學習系統設計的地方之一 [![Netflix 系統設計架構](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v7aj73gezzybzgi8dewp.jpg)](https://bit.ly/3pMiO8g) --- ### 𝐇𝐚𝐫𝐝 系統設計問題 現在,讓我們來看看一些需要你付出更多努力的難題。解決這些問題你可能會感到不舒服,但透過這樣做你會變得更好。 34\. 如何設計像 Yelp 這樣的基於位置的服務 35\. 設計優步 36.設計像 Doordash 這樣的送餐應用程式 37.設計Google文件 38\. 如何設計Google地圖 39\. 設計縮放 40\. 如何設計像 Dropbox 這樣的檔案共用系統 41\. 如何設計像BookMyShow這樣的訂票系統 42.設計分散式網路爬蟲 43.如何設計程式碼部署系統 44.設計像S3這樣的分散式雲端存儲 45\. 如何設計分散式鎖定服務 這是 Educative.io 的 Google 地圖的高級設計 [![Google 地圖的高層設計](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vn97eqxqthqx6714gadl.png)](https://bit.ly/3Mnh6UR) 而且,如果您需要解決方案,則可以在 @ Ashish Pratap Singh 的 GitHub 儲存庫中找到它們:https://github.com/ashishps1/awesome-system-design-resources/blob/main/README.md#system-design-interview-problems 而且,現在可以看到更多有關係統設計面試準備的資源 --- ### 系統設計訪談資源: 而且,這裡列出了最佳系統設計書籍、線上課程和練習網站,您可以查看這些內容,以便更好地為系統設計面試做好準備。這些課程中的大多數也回答了我在這裡分享的問題。 1. [**DesignGuru 的 Grokking 系統設計課程**](https://bit.ly/3pMiO8g):一個互動式學習平台,提供實作練習和真實場景,以增強您的系統設計技能。 2. [**《系統設計面試》作者:Alex Xu**](https://amzn.to/3nU2Mbp) :這本書深入探討了系統設計概念、策略和麵試準備技巧。 3. Martin Kleppmann 的[**「設計資料密集型應用程式」**](https://amzn.to/3nXKaas) :綜合指南,涵蓋了設計可擴展且可靠的系統的原則和實踐。 4. [LeetCode 系統設計 標籤](https://leetcode.com/explore/learn/card/system-design):LeetCode 是一個受歡迎的技術面試準備平台。 LeetCode 上的系統設計標籤包含各種練習問題。 5. GitHub 上的[**「系統設計入門」**](https://bit.ly/3bSaBfC) :精選的資源列表,包括文章、書籍和影片,可幫助您準備系統設計面試。 6. [**Educative 的系統設計課程**](https://bit.ly/3Mnh6UR):一個互動式學習平台,提供實作練習和真實場景,以增強您的系統設計技能。 7. **高可擴展性部落格**:該部落格包含有關高流量網站和可擴展系統架構的文章和案例研究。 8. **[YouTube 頻道](https://medium.com/javarevisited/top-8-youtube-channels-for-system-design-interview-preparation-970d103ea18d)**:請參閱「Gaurav Sen」和「Tech Dummies」等頻道,以取得有關係統設計概念和麵試準備的富有洞察力的影片。 9. [**ByteByteGo**](https://bit.ly/3P3eqMN) :Alex Xu 的一本現場書籍和課程,用於系統設計面試準備。它包含《系統設計訪談》第一捲和第二卷的所有內容,並將隨即將推出的第三卷進行更新。 10. [**Exponent**](https://bit.ly/3cNF0vw) :一個專為面試準備的網站,特別是針對亞馬遜和谷歌等 FAANG 公司,他們還有很棒的系統設計課程和許多其他材料,可以幫助您破解 FAAN 面試。 [![如何為系統設計做準備](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kqv3p46jmw5qc0newuiu.jpg)](https://bit.ly/3P3eqMN) image\_credit - [ByteByteGo](https://bit.ly/3P3eqMN) 請記住透過參與實際專案和參加模擬面試將理論知識與實際應用結合。不斷的練習和學習無疑會提高你在系統設計面試中的熟練程度。 這就是2024 年50 個系統設計面試問題。有線上課程以及我分享過的書籍。 無論您是準備技術面試的候選人,還是希望提高技能的經驗豐富的專業人士,掌握系統設計都是在不斷發展的科技行業中推進職業生涯的關鍵一步,這些問題將對您有所幫助。 。 ### 獎金 正如承諾的,這是給你的獎金,一本免費的書。我剛剛找到一本新的免費書籍來學習分散式系統設計,您也可以在 Microsoft 上閱讀它 --- [https://info.microsoft.com/rs/157-GQE-382/images/EN-CNTNT -eBook-設計分散式系統.pdf](https://info.microsoft.com/rs/157-GQE-382/images/EN-CNTNT-eBook-DesigningDistributedSystems.pdf) ![](https://miro.medium.com/v2/resize:fit:365/0*99i4bdkoEjeeJio8.png) 謝謝 --- 原文出處:https://dev.to/somadevtoo/top-50-system-design-interview-questions-for-2024-5dbk

面試時必須了解的 10 個系統設計概念

*揭露:這篇文章包含附屬連結;如果您透過本文中提供的不同連結購買產品或服務,我可能會獲得補償。* [![面試時必須了解的 10 個系統設計概念](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kfxdldzd09fwws7nve36.png)](https://bit.ly/3cNF0vw) image\_credit -[指數](https://bit.ly/3cNF0vw) 您好,作為開發人員,充分理解基本系統設計概念對於開發可擴展、可靠和高效能的軟體系統至關重要。 [**系統設計**](https://medium.com/javarevisited/7-system-design-problems-to-crack-software-engineering-interviews-in-2023-13a518467c3e)涉及設計軟體系統的體系結構和元件,以滿足特定要求並實現所需的性能特徵。 隨著技術的快速進步和軟體應用的複雜性不斷增加,掌握系統設計概念對於程式設計師建立高效且有效的系統至關重要。 在上幾篇文章中,我回答了流行的系統設計問題,例如[API 網關與負載平衡器](https://dev.to/somadevtoo/difference-between-api-gateway-and-load-balancer-in-system-design-54dd)以及[水平與垂直擴展](https://dev.to/somadevtoo/horizontal-scaling-vs-vertical-scaling-in-system-design-3n09),今天,我們將看看每個程式設計師都應該學習的 10 個關鍵系統設計概念。 這些概念為設計能夠處理大規模資料、容納並髮用戶並提供最佳效能的軟體系統奠定了堅實的基礎。 無論您是初學者還是經驗豐富的開發人員,了解這些系統設計概念都將使您能夠建立強大且可擴展的軟體系統,以滿足現代應用程式的需求。那麼,讓我們深入探討這些基本的系統設計原則吧! 順便說一句,如果您正在準備系統設計面試並想深入學習系統設計,那麼您還可以查看[**ByteByteGo**](https://bit.ly/3P3eqMN) 、 [**Design Guru**](https://bit.ly/3pMiO8g) 、 [**Exponent**](https://bit.ly/3cNF0vw) 、 [**Educative**](https://bit.ly/3Mnh6UR)和[**Udemy**](https://bit.ly/3vFNPid)等網站,它們有許多很棒的系統設計課程 以下是每個程式設計師都應該考慮學習的 10 個重要的系統設計概念: 1. **可擴展性** 2. **可用性** 3. **可靠性** 4. **容錯能力** 5. **快取策略** 6. **負載平衡** 7. **安全** 8. **可擴展的資料管理** 9. **設計模式** 10. **效能最佳化** 理解和應用這些系統設計概念可以幫助程式設計師和開發人員建立強大的、可擴展的、高效能的軟體系統,以滿足現代應用程式和使用者的需求。 現在,讓我們深入研究它們中的每一個並了解它們是什麼以及如何在您的應用程式中實現它們。 ### 1. 可擴展性 可擴展性是指系統或應用程式處理不斷增加的工作負載或使用者而不顯著降低效能或功能的能力。 它是系統設計中的一個重要概念,因為它允許系統成長並適應不斷變化的需求,**例如增加的資料量、使用者流量或處理需求,**而不會遇到效能瓶頸或限制。 在現代運算環境中,系統需要處理大量且不斷成長的資料和用戶,可擴展性至關重要。例如,流行的網站、行動應用程式和基於雲端的服務需要能夠同時處理數百萬甚至數十億個請求,而分散式資料庫和大資料平台需要擴展以處理 PB 或 EB 的資料。 對於需要適應尖峰負載的系統來說,可擴展性也很重要,例如假期期間的線上購物或因病毒事件導致的用戶活動突然激增。 > 可擴展性主要有兩種:**垂直可擴展性和水平可擴展性**。垂直可擴展性涉及向單一伺服器或節點加入更多資源(例如 CPU、記憶體或儲存)以處理增加的工作負載。另一方面,水平可擴展性涉及向系統加入更多伺服器或節點以分配工作負載並處理增加的需求。 水平可擴展性通常透過[負載平衡](https://medium.com/javarevisited/difference-between-api-gateway-and-load-balancer-in-microservices-8c8b552a024)、 [分片](https://medium.com/javarevisited/what-is-database-sharding-scaling-your-data-horizontally-1dc12b33193f)、分區和分散式處理等技術來實現。 實現可擴展性需要仔細的系統設計、架構和實作。它涉及設計能夠有效處理不斷增加的工作負載、有效利用資源、最大限度地減少依賴性以及跨多個節點或伺服器分佈處理的系統。 > 快取、非同步處理、平行處理和分散式資料庫等技術通常用於提高可擴展性。測試和效能監控對於確保系統在擴展時繼續保持良好效能也至關重要。 可擴展性是建立強大的高效能係統的重要考慮因素,這些系統可以處理成長並適應隨時間變化的需求。它使系統能夠滿足不斷增長的需求,提供無縫的用戶體驗,並支援業務成長,而不會遇到效能限製或停機。 這是來自[**ByteByteGo**](https://bit.ly/3P3eqMN)的一個很好的圖表,這是準備系統設計面試的好地方,它顯示了[*垂直擴展和水平擴展之間的區別*](https://medium.com/javarevisited/difference-between-horizontal-scalability-vs-vertical-scalability-67455efc91c) [![水平縮放與垂直縮放](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xd4vz64i6vywjpopepku.png)](https://bit.ly/3P3eqMN) --- ### 2. 可用性 可用性是指軟體系統即使在發生故障或中斷時也能保持運作並可供使用者存取的能力。 高可用性是許多系統的關鍵要求,特別是那些任務關鍵型或時間敏感型系統,例如線上服務、電子商務網站、金融系統和通訊網路。 此類系統的停機可能會導致重大的財務損失、聲譽受損和客戶不滿。因此,保證高可用性是系統設計時重點考慮的問題。 可用性通常**使用正常運作時間(衡量系統運作時間的百分比)和停機時間(衡量系統不可用的時間)等指標**來量化。 實現**高可用性涉及設計具有冗餘、容錯和故障轉移機制的系統**,以最大限度地降低因硬體故障、軟體故障或其他意外事件而導致停機的風險。 > 在系統設計中,採用了各種技術和策略來提高可用性,例如負載平衡、叢集、複製、備份和復原、監控和主動維護。 實施這些措施是為了最大限度地減少單點故障、檢測故障並從故障中恢復,並確保系統即使在發生故障或中斷時也能保持運作。 透過設計具有高可用性的系統,工程師可以確保系統可以長時間存取和執行,從而提高客戶滿意度、減少停機時間並提高業務連續性。 [![系統設計中的高可用性](https://miro.medium.com/v2/resize:fit:546/0*SnLVBPu0JGx4N9F7.gif)](https://www.linkedin.com/pulse/top-20-system-design-interview-questions-answers-soma-sharma-g0pqc/) --- ### 3、可靠性 可靠性是指**軟體系統在交付預期結果時的一致性和可靠性**。建立具有可靠元件、錯誤處理機制和備份/復原策略的系統對於確保系統按預期運作並產生準確的結果至關重要。 可靠性是系統設計的關鍵因素,因為它直接影響系統的整體性能和品質。可靠的系統應始終按預期執行,不會出現意外故障、錯誤或中斷。 **關鍵任務應用通常需要高可靠性,**因為系統故障可能會造成嚴重後果,例如在航空、醫療保健、金融和其他安全關鍵領域。 可靠性通常使用各種指標來量化,例如**平均故障間隔時間 (MTBF)** (測量故障之間的平均持續時間)和故障率 (FR)(測量一段時間內故障發生的速率)。 > 可靠性可以透過各種技術和策略來實現,例如冗餘、錯誤檢測和糾正、容錯和穩健設計。 在系統設計中,要實現高可靠性需要仔細考慮各種因素,包括元件品質、系統架構、錯誤處理、容錯機制、監控和維護策略。 透過**設計高可靠性的系統**,工程師可以確保系統始終如一地按預期執行,從而提高客戶滿意度、減少停機時間並提高系統效能和可用性。 --- ### 4. 容錯性 容錯是指系統或元件在故障或故障(例如硬體故障、軟體錯誤或其他不可預見的問題)時繼續正常運作的能力。 容錯系統旨在檢測、隔離故障並從故障中恢復,而不會完全故障或停機。 容錯是系統設計中的重要概念,特別是在分散式系統或需要在具有挑戰性的環境中可靠運作的系統中。 它涉及實現冗餘、錯誤檢測、錯誤糾正和錯誤恢復機制,以確保即使某些元件或子系統發生故障,系統也能繼續運作。 > 有多種技術和策略可以實現容錯,例如**複製**,即在不同位置維護相同資料或服務的多個副本,以便在一個發生故障時,其他副本可以接管;檢查點,定期保存系統狀態,以便在發生故障時,系統可以恢復到先前已知的良好狀態;優雅降級,即係統在故障時可以繼續執行,但功能會減少。 容錯對於確保系統的高可用性、可靠性和彈性至關重要,特別是在系統故障可能造成嚴重後果的關鍵任務應用程式中。 透過在系統設計中納入容錯機制,工程師可以建立強大且可靠的系統,即使在遇到意外故障時也可以繼續運作並提供預期結果。 [![系統設計中的容錯](https://miro.medium.com/v2/resize:fit:609/0*AKUPawvM6q1K8utM.jpg)](https://bit.ly/3P3eqMN) --- ### 5. 快取策略 快取策略是一種用於優化系統效能的技術,它透過將經常存取的資料或結果儲存在稱為快取的臨時儲存位置中,以便可以快速檢索資料,而無需重新計算或從原始來源取得。 系統設計中常用的快取策略有以下幾種: 1. **完全緩存** 在此策略中,整個資料集或結果都會快取在快取中,提供對所有資料或結果的快速存取。當資料或結果相對較小且可以輕鬆儲存在記憶體或本地快取中時,此策略非常有用。 2. **部分快取** 在此策略中,通常基於使用模式或頻繁存取的資料,僅快取資料或結果的子集。當資料或結果規模很大,或並非所有資料或結果都被頻繁存取,並且快取整個資料集不可行時,此策略很有用。 3. \*\*基於時間的到期時間 在此策略中,資料或結果被快取特定的時間,之後快取被認為是陳舊的,並且資料或結果從原始來源獲取並在快取中更新。當資料或結果相對穩定且不經常變化時,此策略很有用。 4. **LRU(最近最少使用)或 LFU(最不常使用)替換策略** 在這些策略中,最近最少使用或最不頻繁使用的資料或結果被從快取中逐出,以為新資料或結果騰出空間。當快取的儲存容量有限且需要驅逐不常存取的資料以容納新資料時,這些策略非常有用。 5. **直寫式或後寫式緩存** 在這些策略中,資料或結果在更新或插入時寫入快取和原始來源(直寫)或僅寫入快取(後寫)。當系統需要保持快取和原始來源之間的一致性或原始來源無法直接更新時,這些策略就非常有用。 6. **分散式快取** 在此策略中,快取分佈在多個節點或伺服器上,通常使用分散式快取框架或技術。當系統跨多個節點或伺服器分佈或擴展並且需要保持分散式快取的一致性和效能時,此策略就非常有用。 7. **自訂快取** 可以根據系統或應用程式的特定要求和特徵來實施自訂快取策略。這些策略可能涉及上述策略或其他自訂方法的組合,以滿足系統的獨特需求。 選擇*合適的快取策略取決於資料或結果的大小、存取頻率、資料或結果的易變性、儲存容量、一致性要求以及系統的效能目標等多種因素*。仔細考慮和實施快取策略可以顯著提高系統效能、降低資源利用率、提高可擴展性並增強使用者體驗。 [![系統設計的快取策略](https://miro.medium.com/v2/resize:fit:609/0*vm4O76NLJuhVu68G)](https://bit.ly/3P3eqMN) --- ### **6.負載平衡** 負載平衡是分散式系統或網路中使用的技術,用於在多個伺服器或資源之間均勻分配傳入的網路流量或工作負載,確保沒有任何單一伺服器或資源因過多的流量或工作負載而不堪負荷。 負載平衡的目的是優化資源利用率,最大化系統可用性,提高系統整體效能和可靠性。在微服務架構中, [*負載平衡和 API 閘道*](https://medium.com/javarevisited/difference-between-api-gateway-and-load-balancer-in-microservices-8c8b552a024)通常指的是相同的,但事實並非如此,API 閘道可以做更多的事情,如[本文](https://medium.com/javarevisited/what-is-api-gateway-pattern-in-microservices-architecture-what-problem-does-it-solve-ebf75ae84698)所述。 負載平衡可以透過各種演算法或方法來實現,例如: 1. **循環:**傳入請求以輪流方式依序分發到每個伺服器或資源,確保所有伺服器或資源之間的流量平均分配 2. **最少連線:**傳入請求分發到活動連線數最少的伺服器或資源,確保負載最少的伺服器或資源接收新請求。 3. **來源 IP 關聯性:**來自相同客戶端 IP 位址的傳入請求將導向至相同伺服器或資源,確保來自特定用戶端的請求始終由相同伺服器或資源處理。 4. **加權循環:**傳入請求根據分配給每個伺服器或資源的預定義權重進行分配,從而允許根據伺服器或資源容量或功能採用不同的流量分配比率。 5. **自適應負載平衡:**負載平衡演算法根據伺服器或資源健康、效能或其他指標的即時監控,動態調整流量分配,確保最佳的資源利用率和系統效能。 負載平衡可以使用基於硬體的負載平衡器、基於軟體的負載平衡器或基於雲端的負載平衡服務來實現。 它在具有高流量負載或資源密集型工作負載的分散式系統或網路中發揮著至關重要的作用,可以實現資源的高效利用,增強系統的可用性和可靠性,並提供無縫的用戶體驗。 這裡還有一個來自[DesignGuru.io](https://bit.ly/3pMiO8g)的漂亮圖表,這是一個學習面試準備系統設計的優秀網站,它強調了負載平衡器和 API 閘道之間的區別: [![負載平衡器和API網關之間的區別](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bi0uzsaryydef7es0dmv.jpg)](https://bit.ly/3pMiO8g) --- ### **7. 安全** 系統設計中的安全性是指考慮和實施保護系統免受潛在安全威脅、漏洞或攻擊的措施。 它涉及設計和實施具有內建安全功能和實踐的系統,以防止未經授權的存取、資料外洩、資料外洩、惡意軟體攻擊和其他安全風險。 系統設計中的安全性通常涉及以下原則: 1. **身份驗證:**確保使用者或實體經過驗證並根據其身分和憑證被授予適當的存取權限。 2. **授權**:實施存取控制和權限,限制使用者或實體存取未經授權的資源或執行未經授權的操作。 3. **加密**:透過使用加密技術來保護敏感資料,以防止未經授權的存取或資料外洩。 4. **稽核和日誌記錄**:實施機制來追蹤和記錄系統活動和事件,以用於監視、稽核和取證目的。 5. **輸入驗證:**驗證和清理所有輸入資料,以防止常見的安全漏洞,例如 SQL 注入、跨站腳本 (XSS) 和跨站請求偽造 (CSRF) 攻擊。 6. **修補程式和更新**:使用最新的安全性修補程式和更新使系統保持最新狀態,以解決已知的安全漏洞。 7. **深度防禦**:實施多層安全控制,例如防火牆、入侵偵測系統和防毒軟體,以提供針對安全威脅的多層防禦。 8. **最小權限原則**:將使用者或實體的存取權限限製到執行其任務所需的最低限度,減少安全漏洞或攻擊的潛在影響。 9. **安全通訊**:使用安全通訊協定(例如 HTTPS 或 SSL/TLS)來保護傳輸中的資料免於攔截或竊聽。 系統設計中的安全性對於保護資料和資源的完整性、機密性和可用性以及確保系統的整體安全狀況至關重要。應考慮並納入系統的設計、開發和部署階段,以減輕潛在的安全風險並防範安全威脅。 --- ### **8. 可擴展的資料管理** 可擴展的資料管理是指系統或應用程式有效處理不斷增長的資料量而不會出現效能下降或功能遺失的能力。 它涉及設計和實施資料管理實務和技術,這些實務和技術可以處理不斷增加的資料量、使用者負載和處理要求,同時保持可接受的效能和可靠性水準。 可擴展的資料管理通常涉及以下原則: 1. **資料分區:**將大型資料集分割成更小的、可管理的區塊或分區,以將資料分佈在多個儲存或處理資源上。這有助於減少單一資源的負載,並允許並行處理和提高效能。 2. **分散式資料庫系統:**使用分散式資料庫或資料儲存解決方案,可以將資料分佈在多個節點或伺服器上,從而實現水平擴展並提高效能。 3. **資料複製**:跨多個節點或伺服器複製資料,以確保資料可用性和容錯性。這可能涉及資料鏡像、資料分片或資料快取等技術,以提高效能和可靠性。 4. **快取和記憶體中資料儲存:快取**經常存取的資料或將資料儲存在記憶體中,以便更快地檢索和處理,減少對昂貴的磁碟 I/O 操作的需求並提高效能。 5. **索引和查詢最佳化**:使用高效的索引和查詢最佳化技術來加速資料檢索和處理操作,尤其是在大型資料集中。 6. **資料壓縮:**實施資料壓縮技術以減少儲存佔用空間並提高資料傳輸效率,特別是對於大型資料集。 7. **資料歸檔和清除**:實施資料歸檔和清除實踐以刪除或歸檔舊的或不經常存取的資料,減少儲存和處理開銷並提高效能。 8. **可擴展的資料處理框架:**使用可擴展的資料處理框架,例如 Apache Hadoop、Apache Spark 或 Apache Flink,可以分散式並行方式處理大規模資料處理和分析任務。 9. **雲端的資料管理**:利用雲端的資料管理服務,例如 Amazon S3、Amazon RDS 或 Google Bigtable,提供可擴充和託管的資料儲存和處理功能。 10. **監控和可擴展性測試**:定期監控系統效能並進行可擴展性測試,以辨識和解決效能瓶頸、資源限製或其他可擴展性挑戰,並確保資料管理實踐能夠有效處理不斷增長的資料量和負載。 簡而言之,可擴展的資料管理對於需要處理大量資料、使用者負載和處理要求的現代應用程式和系統至關重要。 它使系統能夠成長並適應不斷變化的需求,而無需犧牲效能或可靠性,從而確保資料管理實踐能夠有效地處理不斷增加的資料量和負載。 --- ### **9. 設計模式** 系統設計中的[設計模式](https://medium.com/javarevisited/top-10-microservice-design-patterns-for-experienced-developers-f4f5f782810e)是指用於解決軟體系統開發過程中遇到的常見設計挑戰或問題的可重複使用解決方案或最佳實踐。 [設計模式](https://medium.com/javarevisited/21-software-design-pattern-interview-questions-and-answers-b7d1774b5dd2)是被廣泛接受和經過驗證的設計和架構軟體系統的方法,它們為設計高效、可維護和可擴展的系統提供了一組明確的指南。 系統設計中的設計模式可分為多種類型,包括: 1. **建立模式:**這些模式專注於物件建立機制,並提供以靈活且可重複使用的方式建立物件的方法。建立模式的範例包括 Singleton、Factory Method、Abstract Factory、Builder 和 Prototype 模式。 2. **結構模式:**這些模式著重於類別和物件的組織以形成更大的結構或系統。結構模式的範例包括適配器、橋、複合、裝飾器和外觀模式。 3. **行為模式:**這些模式著重於系統內物件或元件之間的互動和通訊。行為模式的範例包括觀察者、策略、命令、迭代器和模板方法模式。 4. **架構模式:**這些模式為設計系統的整體架構提供了高階指南和策略。架構模式的範例包括模型-視圖-控制器 (MVC)、模型-視圖-視圖模型 (MVVM)、分層架構、微服務和事件驅動架構模式。 設計模式在系統設計中非常重要,因為它們提供了經過驗證的標準化方法來解決常見的設計挑戰、提高程式碼品質並確保軟體系統的可維護性和可擴展性。 它們促進程式碼的可重複使用性、關注點分離和功能封裝,從而更容易管理複雜的系統並使其適應不斷變化的需求。 透過使用設計模式,開發人員可以利用現有知識和最佳實踐來設計強大而高效的系統,以滿足使用者和利害關係人的需求。 在過去的幾篇文章中,我還討論了常見的微服務設計模式,如[**事件來源**](https://medium.com/javarevisited/what-is-event-sourcing-design-pattern-in-microservices-architecture-how-does-it-work-b38c996d445a)**、** [**CQRS**](https://medium.com/javarevisited/what-is-cqrs-command-and-query-responsibility-segregation-pattern-7b1b38514edd) \*\*、SAGA\*\*、 [**每個微服務的資料庫**](https://medium.com/javarevisited/what-is-database-per-microservices-pattern-what-problem-does-it-solve-60b8c5478825)**、** [**API 閘道**](https://medium.com/javarevisited/difference-between-api-gateway-and-load-balancer-in-microservices-8c8b552a024)、 [**斷路器**](https://medium.com/javarevisited/what-is-circuit-breaker-design-pattern-in-microservices-java-spring-cloud-netflix-hystrix-example-f285929d7f68),並分享了[*設計微服務的最佳實踐*](https://medium.com/javarevisited/10-microservices-design-principles-every-developer-should-know-44f2f69e960f),您也可以查看這些文章以了解有關微服務通訊的更多訊息,包括同步和非同步通訊。 --- ### 10. 性能 雖然我們已經知道效能意味著什麼,但還記得速度慢的筆記型電腦嗎?在系統設計中,效能是指軟體系統處理資料和交付結果的速度、反應能力和效率。 透過高效的演算法、快取、索引和其他技術來優化系統效能對於建立能夠處理大規模資料處理並提供最佳回應時間的系統至關重要。 系統設計中的效能是指軟體系統或應用程式有效率且有效地執行其預期功能或任務,同時滿足效能要求和期望的能力。它涵蓋了系統的回應時間、吞吐量、資源利用率、可擴展性和效率等各個方面。 效能是系統設計中的關鍵因素,因為它直接影響使用者體驗、系統可靠性和整體系統效率。效能不佳的系統可能會導致反應時間慢、吞吐量低、資源利用率高以及系統資源使用效率低下,導致系統效能下降和使用者不滿意。 系統設計人員在設計過程中需要考慮各種與效能相關的因素,例如選擇適當的演算法和資料結構、最佳化程式碼、最大限度地減少不必要的開銷、有效管理系統資源以及確保正確的系統配置和調優。 效能測試和分析技術還可用於辨識和解決效能瓶頸並優化系統效能。 優化系統設計中的效能需要在功能、複雜性和資源利用率之間進行仔細的平衡。它涉及做出明智的設計決策、使用最佳實踐以及持續監控和優化系統性能,以確保系統滿足其性能要求並提供流暢高效的用戶體驗。 ### 結論 這就是面試的基本系統設計概念。理解和掌握這些關鍵的系統設計概念對於程式設計師建立健壯、可擴展且高效的軟體系統至關重要。 這些概念,包括容錯、可靠性、可用性、快取策略、負載平衡、安全性、可擴展資料管理、設計模式和效能,在確保軟體系統滿足其預期目標、最佳執行並提供卓越的效能方面發揮著關鍵作用。 透過對這些系統設計概念的深入理解,您可以做出明智的設計決策,選擇適當的技術和技巧,並優化系統效能。 它還允許您設計具有彈性、可擴展、安全和高效的系統,能夠應對現代軟體開發的挑戰並滿足最終用戶的期望。 順便說一句,如果您正在*準備系統設計面試*並想要深入學習系統設計,那麼您還可以查看[**ByteByteGo**](https://bit.ly/3P3eqMN) 、 [**DesignGuru**](https://bit.ly/3pMiO8g) 、 [**Exponent**](https://bit.ly/3cNF0vw) 、 [**Educative**](https://bit.ly/3Mnh6UR)和[**Udemy**](https://bit.ly/3vFNPid)等網站,它們有許多很棒的系統設計課程,如果您需要免費的系統設計課程您也可以查看下面的文章。 --- 原文出處:https://dev.to/somadevtoo/10-must-know-system-design-concepts-for-interviews-2fii

50 多個核心 Java 面試問題及程式設計師答案

--- 標題:針對程式設計師的 50 多個核心 Java 面試問題及其答案 發表:真實 描述:核心 Java 面試常見問題及其答案,幫助初學者和初級開發人員獲得第一份 Java 開發工作。 標籤: java、程式設計、職業 封面圖:https://thepracticaldev.s3.amazonaws.com/i/k63545lbbjmh582tiosr.png --- *揭露:這篇文章包含附屬連結;如果您透過本文中提供的不同連結購買產品或服務,我可能會獲得補償。* Java程式設計師大家好!在過去的幾年裡,我一直在分享許多[Java 面試問題](http://javarevisited.blogspot.sg/2015/10/133-java-interview-questions-answers-from-last-5-years.html)、答案和單獨討論。我的許多讀者要求我將他們聚集在一起,以便他們可以在同一個地方進行面試準備。 這篇文章就是這個結果。 本文包含**50 多個 Java 面試問題和答案**,涵蓋所有重要主題,如核心 Java 基礎知識、 [Java 集合框架](https://javarevisited.blogspot.com/2011/11/collection-interview-questions-answers.html)、 [Java 多執行緒和並發](https://javarevisited.blogspot.com/2014/07/top-50-java-multithreading-interview-questions-answers.html)、 [Java IO](https://javarevisited.blogspot.com/2014/08/socket-programming-networking-interview-questions-answers-Java.html) 、 [JDBC](https://javarevisited.blogspot.com/2012/12/top-10-jdbc-interview-questions-answers.html) 、 [JVM 內部原理](http://www.java67.com/2016/08/10-jvm-options-for-java-production-application.html)、 [編碼問題](http://www.java67.com/2018/06/data-structure-and-algorithm-interview-questions-programmers.html)、 [物件導向程式設計](http://www.java67.com/2015/12/top-30-oops-concept-interview-questions-answers-java.html)等。 這些問題是從我做過的各種 Java 訪談中挑選出來的,我的朋友、讀者和其他人根據自己的經驗分享了一些問題。它們絕不是非常困難。您可能已經在電話或面對面的面試中見過它們。 這些問題對於複習重要的 Java 主題(例如核心 Java 概念、多執行緒、lambda、流和集合)也非常有用。 我還分享了一些*用於進一步學習和提高的有用資源*,例如 Udemy 上的[**完整 Java 大師**](https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&subid=0&offerid=323058.1&type=10&tmpid=14538&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fjava-the-complete-java-developer-course%2F)課程,您可以加入課程來提高和填補 Java 技能方面的空白。 我還寫過有關 Java 面試準備的書籍,例如[《Grokking the Java Interview》](https://gumroad.com/l/QqjGH)和[《Grokking the Spring Boot Interviews》](https://gumroad.com/l/hrUXKY) ,其中我為 Java 開發人員分享了很多問題。 如果你今年正在準備 Java 面試,你也可以**[在 Gumroad 上取得我的 Java + Spring Interview + SQL Bundle](https://javinpaul.gumroad.com/l/sowpfg)** ,使用程式碼**Friends20**還可獲得 20% 的折扣 [![Java 和 Spring 面試書籍](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xj0hpl0w5lyvdrnwlsoe.png)](https://javinpaul.gumroad.com/l/sowpfg) 那我們還在等什麼?以下是針對初學者和經驗豐富的 Java 開發人員的面試中最常見的一些 Java 問題的清單。 2 至 3 年經驗豐富的程式設計師的 50 個 Java 面試問題 --------------------------------- 因此,為了不浪費您的時間,這裡列出了一些針對初學者程式設計師的常見[核心 Java 面試問題](http://www.java67.com/2018/03/top-50-core-java-interview-questions.html)。此清單主要針對初學者和經驗不足的開發人員,例如具有 2 到 3 年 Java 經驗的人。 1) **Java如何實現平台無關性?** ([回答](http://www.java67.com/2012/08/how-java-achieves-platform-independence.html)) 提示:字節碼和Java虛擬機 答案 - Java 透過產生字節碼然後在 Java 虛擬機器上執行來實現平台獨立性,該虛擬機將這些字節碼轉換為依賴計劃的機器程式碼。由於不同平台的 JVM 不同,我的意思是,對於 Windows,您有單獨的 JRE(其中包括 JVM),對於 Linux,您將有單獨的 JRE。由於 Java 程式碼不會編譯為本機機器碼,而是編譯為字節碼,這使得它們獨立於平台。 2) **Java中的**`**ClassLoader**`**是什麼**? ([回答](http://javarevisited.blogspot.sg/2012/12/how-classloader-works-in-java.html#axzz59AWpr6cb)) 提示:JVM 的一部分,用於載入類別的字節碼。你可以自己寫。 答:在Java中,程式碼被封裝在類別中,因為Java是物件導向的程式設計。你的程式是在類別中寫的,為了執行它們,JVM 會載入這些包含你的程式碼的類別。負責載入類別的 JVM 元件稱為類別載入器。它們是存在的三個主要類別載入器:引導類別載入器、擴充類別載入器和應用程式類別載入器。 這是一個很好的圖表,顯示了每個 Java 類別載入器的功能: [![Java 中的類別載入器](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g2brxfmzd67dv2k7rwmv.PNG)](https://javarevisited.blogspot.com/2021/05/java-classloader-interview.html) 3)**寫一個Java程式來檢查一個數字是偶數還是奇數?** ([回答](http://javarevisited.blogspot.sg/2013/04/how-to-check-if-number-is-even-or-odd.htm)) 提示:您可以使用位元運算符,例如位元與,記住,二進位格式中偶數末尾為 0,奇數末尾為 1。 4) **Java中**`**ArrayList**`**和**`**HashSet**`**的差別**? ([回答](http://www.java67.com/2012/07/difference-between-arraylist-hashset-in-java.html)) 提示: `List`和`Set`之間的所有差異都適用於此,例如排序、重複、隨機搜尋等。請參閱 Richard Warburton 的[**《Java 基礎知識:集合》**](https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fjava-fundamentals-collections)以了解有關Java 中的ArrayList、HashSet 和其他重要集合的更多資訊。 [![](https://miro.medium.com/max/875/1*hd861fcwDe86tY-1Y0VNRQ.png)](https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fjava-fundamentals-collections) 5)**什麼是單例中的雙重檢查鎖定?** ([回答](http://www.java67.com/2016/04/why-double-checked-locking-was-broken-before-java5.html)) 提示:兩次檢查實例是否已初始化,第一次不加鎖,第二次加鎖。 **6)如何在Java中建立線程安全的Singleton? (** [**回答**](http://javarevisited.blogspot.sg/2012/12/how-to-create-thread-safe-singleton-in-java-example.html)**)** 提示:有很多方法,例如使用 Enum 或使用雙重檢查鎖定模式或使用巢狀靜態類別。 **7) Java中Serialized和Externalized的差別? (** [**回答**](http://www.java67.com/2012/10/difference-between-serializable-vs-externalizable-interface.html)**)** 提示:Externalized 讓您可以更好地控制序列化過程。 **8) Java中何時使用瞬態變數? (**[**回答**](http://www.java67.com/2012/08/what-is-transient-variable-in-java.html)**)** 提示:當您想要在實作 Serialized 介面的類別中使變數不可序列化時。換句話說,您可以將其用於不想保存其值的變數。請參閱[**完整的 Java MasterClass**](https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&subid=0&offerid=323058.1&type=10&tmpid=14538&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fjava-the-complete-java-developer-course%2F)以了解 Java 中的瞬態變數。 **9) Java中transient變數和volatile變數的差別? (** [**回答**](http://www.java67.com/2012/11/difference-between-transient-vs-volatile-modifier-variable-java.html)**)** 提示:完全不同,一個用於序列化上下文,另一個用於並發。 **10) Java中什麼時候使用易失性變數? (**[**回答**](http://www.java67.com/2012/08/what-is-volatile-variable-in-java-when.html)**)** 提示:當你需要指示JVM一個變數可以被多個執行緒修改並提示JVM不緩存其值。 **11)我們可以重寫Java中的私有方法嗎? (** [**回答**](http://www.java67.com/2013/08/can-we-override-private-method-in-java-inner-class.html)**)** 提示:不,因為它在子類別中不可見,這是在 Java 中重寫方法的主要要求。 12) **Java中**`**Hashtable**`**和**`**HashMap**`**的差別**? **(** [**回答**](http://javarevisited.blogspot.sg/2010/10/difference-between-hashmap-and.html#axzz53B6SD769)\*\*) \*\*提示:有幾個但最重要的是`Hashtable` ,它是同步的,而`HashMap`不是。與`HashMap`相比,它也是遺留的且緩慢的。 13) **Java中**`**List**`**和**`**Set**`**的差別**? **(** [**回答**](http://javarevisited.blogspot.sg/2012/04/difference-between-list-and-set-in-java.html#axzz53n9YK0Mb)**)** 提示: `List`是有序的並且允許重複。 `Set`是無序的,不允許有重複的元素。 14) **Java中**`**ArrayList**`**和**`**Vector**`**的區別**([**答案**](http://www.java67.com/2012/09/arraylist-vs-vector-in-java-interview.html)**)** 提示:很多,但最重要的是, `ArrayList`是非同步的,速度很快,而`Vector`是同步的,速度很慢。它也是像`Hashtable`這樣的遺留類別。 **15)** **Java 中**`**Hashtable**`**和**`**ConcurrentHashMap**`的差異? **(** [**回答**](http://javarevisited.blogspot.sg/2011/04/difference-between-concurrenthashmap.html#axzz4qw7RoNvw)**)** 提示:更具可擴展性。請參閱 Richard Warburton 的[**《Java 基礎知識:集合》**](https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fjava-fundamentals-collections)以了解更多資訊。 16) `**ConcurrentHashMap**`**如何實現可擴充性? (** [**回答**](http://javarevisited.blogspot.sg/2017/08/top-10-java-concurrenthashmap-interview.html#axzz50U9xyqbo)**)** 提示:透過將映射分為段並僅在寫入操作期間鎖定。 **17) 您將重寫哪兩個方法來將**`**Object**`**用作**`**HashMap**`**中的**`**Key**` **? (** [**回答**](http://www.java67.com/2013/06/how-get-method-of-hashmap-or-hashtable-works-internally.html)**)** 提示:等於和哈希碼 **18) Java中wait和sleep的差別? (**[**回答**](http://www.java67.com/2012/08/what-are-difference-between-wait-and.html)**)** \\ 提示: `wait()`方法釋放鎖定或監視器,而 sleep 則不會。 19\) **Java中**`**notify**`**和**`**notifyAll**`**的差別**? **(** [**回答**](http://www.java67.com/2013/03/difference-between-wait-vs-notify-vs-notifyAll-java-thread.html)**)** 提示: `notify`通知一個隨機執行緒正在等待該鎖,而`notifyAll`通知所有等待監視器的執行緒。如果你確定只有一個執行緒在等待,那麼使用`notify` ,否則`notifyAll`會更好。請參閱 Java Champion Heinz Kabutz 的[**線程基礎迷你課程,**](https://javaspecialists.teachable.com/p/threading-essentials/?product_id=539197&coupon_code=SLACK100?affcode=92815_johrd7r8)以了解有關線程基礎知識的更多資訊。 20\) 為什麼要**在 Java 中重寫 hashcode 以及**`**equals()**` ? **(** [**回答**](http://javarevisited.blogspot.sg/2015/01/why-override-equals-hashcode-or-tostring-java.html#axzz55oDxm8vv)**)** 提示:遵守 equals 和 hashcode 約定,如果您打算將物件儲存到集合類別(例如`HashMap`或`ArrayList`中,則需要遵守這一點。 21) `**HashMap**`**的負載因子是什麼意思? (**[**回答**](http://www.java67.com/2017/08/top-10-java-hashmap-interview-questions.html)**)** 提示:觸發`HashMap`調整大小的閾值一般為 0.75,這表示如果 HashMap 已滿 75%,則`HashMap`會自行調整大小。 **22)** **Java 中**`**ArrayList**`**和**`**LinkedList**`之間的差異? **(** [**回答**](http://www.java67.com/2012/12/difference-between-arraylist-vs-LinkedList-java.html)**)** 提示:與陣列和鍊錶相同,其中一個允許隨機搜尋,而另一種則不允許。在鍊錶上插入和刪除很容易,但在陣列上搜尋很容易。請參閱[**《Java 基礎知識:集合》**](https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fjava-fundamentals-collections) **(** Richard Warburton 在 Pluralsight 上的課程),以了解更多關於 Java 中基本集合資料結構的資訊。 **23)** **Java 中**`**CountDownLatch**`**和**`**CyclicBarrier**`之間的差異? **(** [**回答**](http://www.java67.com/2012/08/difference-between-countdownlatch-and-cyclicbarrier-java.html)**)** 提示:屏障被打破後,您可以重複使用`CyclicBarrier` ,但計數為零後,您無法重複使用`CountDownLatch` 。 24)**在 Java 中什麼時候使用**`**Runnable**`**和**`**Thread**` ? **(** [**回答**](http://www.java67.com/2016/01/7-differences-between-extends-thread-vs-implements-Runnable-java.html)**)** 提示:總是 **25) Java 中 Enum 類型安全的意義是什麼? (** [**回答**](http://www.java67.com/2014/04/what-java-developer-should-know-about-Enumeration-type-in-Java.html)**)** 提示:這表示您不能將不同 Enum 類型的實例指派給 Enum 變數。例如,如果您有一個像`DayOfWeek` day 這樣的變數,那麼您無法從`DayOfMonth`枚舉中為其指派值。 **26) Java 中整數的自動裝箱如何運作? (** [**回答**](http://javarevisited.blogspot.sg/2012/07/auto-boxing-and-unboxing-in-java-be.html#axzz59AWpr6cb)**)** 提示:透過使用Java中的`valueOf()`方法。 **27)** **Java 中**`**PATH**`**和**`**Classpath**`之間的差異? **(** [**回答**](http://www.java67.com/2012/08/what-is-path-and-classpath-in-java-difference.html)**)** 提示:作業系統使用`PATH` ,而JVM 使用`Classpath`來定位Java 二進位文件,例如JAR 檔案或Class 檔案。請參閱[**Java 基礎知識:核心平台**](https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fjava-fundamentals-core-platform),以了解有關`PATH` 、 `Classpath`和其他 Java 環境變數的更多資訊。 [![](https://miro.medium.com/max/478/1*PBuMgGmVXwBguv-SPw7YJw.jpeg)](https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fjava-fundamentals-core-platform) **28) Java中方法重載和重寫的差別? (** [**回答**](http://www.java67.com/2015/08/top-10-method-overloading-overriding-interview-questions-answers-java.html)**)** 提示:重寫發生在子類別中,而重載發生在同一個類別中。此外,覆蓋是執行時活動,而重載是在編譯時解決的。 **29) 如何防止 Java 中的類別被子類化? (**[**回答**](http://www.java67.com/2017/06/10-points-about-final-modifier-in-java.html)**)** \\ 提示:只需將其建構函數設為私有即可 **30) 你如何限制你的類別被你的客戶使用? (** [**回答**](http://javarevisited.blogspot.sg/2016/01/why-jpa-entity-or-hibernate-persistence-should-not-be-final-in-java.html)**)** \\ 提示:使建構子私有或從建構子拋出異常 **31)** **Java 中**`**StringBuilder**`**和**`**StringBuffer**`之間的差異? **(**[**回答**](http://www.java67.com/2016/10/5-difference-between-stringbuffer.html)**)** 提示: `StringBuilder`不同步,而`StringBuffer`同步。 **32) Java 中多態性與繼承的差別? (** [**回答**](http://www.java67.com/2014/04/difference-between-polymorphism-and-Inheritance-java-oops.html)**)** 提示:繼承允許程式碼重複使用並建構類別之間的關係,這是多態性所需要的,多態性提供動態行為。請參閱\[**物件導向的 Java 程式設計:資料結構及超越專業化**\]( https://coursera.pxf.io/c/3294490/1164545/14726?u=https%3A%2F%2Fwww.coursera.org%2Fspecializations%2Fjava-object-orientation)在Coursera 上,了解有關OOP 功能的更多資訊。適合初學者的最深入的課程之一。 \[![](https://thepracticaldev.s3.amazonaws.com/i/vuohxotp8qeh638lzjpr.png) \]( https://coursera.pxf.io/c/3294490/1164545/14726?u=https%3A%2F%2Fwww.coursera.org%2Fspecializations%2Fjava-物件導向) 順便說一句,如果您發現 Coursera 課程很有用,因為它們是由世界各地的知名公司和大學建立的,我建議您加入[**Coursera Plus**](https://coursera.pxf.io/c/3294490/1164545/14726?u=https%3A%2F%2Fwww.coursera.org%2Fcourseraplus) ,這是Coursera 的訂閱計劃,可以讓您無限制地存取他們最受歡迎的課程、專業、專業憑證和指導專案。它的費用約為 399 美元/年,但它完全物有所值,因為您可以獲得無限的憑證。 **33)我們可以在Java中重寫靜態方法嗎? (**[**回答**](http://www.java67.com/2012/08/can-we-override-static-method-in-java.html)**)** \\ 提示:否,因為重寫在執行時間解析,而靜態方法呼叫在編譯時解析。 **34) 我們可以存取Java中的私有方法嗎? (**[**回答**](http://www.java67.com/2012/08/can-we-override-private-method-in-java.html)**)** \\ 提示:可以,在同一個班級內,但不能在班級外 **35) Java中介面和抽象類別的區別? (** [**回答**](http://www.java67.com/2017/08/difference-between-abstract-class-and-interface-in-java8.html)**)** 提示:從[Java 8](https://dzone.com/articles/5-courses-to-crack-java-certification-ocajp-1z0-80)開始,差異變得模糊。然而,一個Java類別仍然可以實作多個接口,但只能擴展一個類別。 **36) Java 中 DOM 和 SAX 解析器的差別? (**[**回答**](http://www.java67.com/2012/09/dom-vs-sax-parser-in-java-xml-parsing.html)**)** \\ 提示:DOM 將整個 XML 檔案載入到記憶體中,而 SAX 則不會。它是一個基於事件的解析器,可用於解析大文件,但 DOM 速度很快,對於小文件應該是首選。 **37) Java 中 throw 和 throws 關鍵字的差異? (**[**回答**](http://www.java67.com/2012/10/difference-between-throw-vs-throws-in.html)**)** \\ 提示: throws 聲明方法在發生錯誤時可以拋出什麼異常,但 throw 關鍵字實際上會拋出異常。請參閱[**Java 基礎知識:異常處理**](https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fjava-fundamentals-exception-handling)以了解有關 Java 中異常處理的更多資訊。 [![](https://miro.medium.com/max/875/1*O5DEoN9mOy3D0HxFKWwfKQ.png)](https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fjava-fundamentals-exception-handling) **38) Java 中的故障安全迭代器和故障快速迭代器的差異? (** [**回答**](http://www.java67.com/2015/06/what-is-fail-safe-and-fail-fast-iterator-in-java.html)**)** 提示:故障安全性不會拋出`ConcurrentModificationException` ,而`fail-fast`則在迭代時檢測到底層集合的外部變更時拋出 ConcurrentModificationException。 **39) Java 中迭代器和枚舉的差別? (** [**回答**](http://javarevisited.blogspot.sg/2010/10/what-is-difference-between-enumeration.html#axzz59AWpr6cb)**)** 提示:迭代器還使您能夠在迭代時刪除元素,而枚舉不允許這樣做。 **40)** **Java 中的**`**IdentityHashMap**`是什麼? **(** [**回答**](http://www.java67.com/2016/09/difference-between-identityhashmap-weakhashmap-enummap-in-java.html)**)** 提示:一個`Map` ,它使用`==`相等運算子來檢查相等性,而不是`equals()`方法。 **41)** **Java 中的**`**String**`池是什麼? **(** [**回答**](http://javarevisited.blogspot.sg/2016/07/difference-in-string-pool-between-java6-java7.html#axzz4pGGwsyna)**)** 提示: `String`文字池。請記住,它已從 JDK 7 中的永久代空間移至堆疊。 **42)** Java 中`**Serializable**`**類別可以包含不可序列化欄位嗎? (** [**回答**](http://javarevisited.blogspot.sg/2016/09/how-to-serialize-object-in-java-serialization-example.html)\*\*) \*\*提示:是的,但您需要將其設定為靜態或瞬態。 **43) Java 中 this 和 super 的差別? (**[**回答**](http://www.java67.com/2013/06/difference-between-this-and-super-keyword-java.html)**)** 提示:this 指的是目前實例,而 super 指的是超類別的實例。 **44)** **Java 中**`**Comparator**`**和**`**Comparable**`之間的差異? **(** [**回答**](http://www.java67.com/2013/08/difference-between-comparator-and-comparable-in-java-interface-sorting.html)**)** \\ 提示: `Comparator`定義自訂排序,而`Comparable`定義物件的自然順序,例如`String`字母順序。請參閱[**完整的 Java 大師課程**](https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&subid=0&offerid=323058.1&type=10&tmpid=14538&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fjava-the-complete-java-developer-course%2F)以了解有關 Java 排序的更多資訊。 [![](https://miro.medium.com/max/875/1*MTR8OytpiIMidLndBnsJ5g.png)](https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&subid=0&offerid=323058.1&type=10&tmpid=14538&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fjava-the-complete-java-developer-course%2F) **45)** **Java 中**`**java.util.Date**`**和**`**java.sql.Date**`之間的差異? **(**[**回答**](http://javarevisited.blogspot.sg/2012/04/difference-between-javautildate-and.html)**)** 提示:前者包含日期和時間,後者僅包含日期部分。 46)為什麼**Java中的**`**Object**`類別**中宣告了wait和notify方法**? **(**[**回答**](http://javarevisited.blogspot.sg/2012/02/why-wait-notify-and-notifyall-is.html)**)** 提示:因為它們需要僅對物件可用的鎖。 **47)為什麼Java不支援多重繼承? (** [**回答**](http://javarevisited.blogspot.sg/2011/07/why-multiple-inheritances-are-not.html)**)** 提示:它不支持,因為 C++ 的體驗不好,但對於 Java 8,它在某種意義上是支援的 --- 現在 Java 中不支援`Type`的多重繼承。 **48) Java 中檢查異常和非檢查異常的差異? (** [**回答**](http://javarevisited.blogspot.sg/2011/12/checked-vs-unchecked-exception-in-java.html)**)** 提示:如果是選取的,則必須使用 catch 區塊處理異常,而如果是未選取的,則由您決定;編譯不會打擾你。 **49) Java 中錯誤和異常的區別? (**[**回答**](http://www.java67.com/2012/12/difference-between-error-vs-exception.html)**)** 提示:我厭倦了打字,請檢查答案 **50) Java 中的競爭條件和死鎖的差異? (** [**回答**](http://javarevisited.blogspot.sg/2012/02/what-is-race-condition-in.html#axzz59AbkWuk9)**)** 提示:這兩種錯誤都是並發應用程式中發生的錯誤,一種是由於執行緒調度而發生的,另一種是由於編碼不良而發生的。請參閱[Java 中的多執行緒和平行計算](https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&subid=0&offerid=323058.1&type=10&tmpid=14538&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fmultithreading-and-parallel-computing-in-java%2F),以了解有關死鎖、競爭條件和其他多執行緒問題的更多資訊。 其他資源 --- - [Java 面試指南:200+ 面試題目及答案](https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&subid=0&offerid=323058.1&type=10&tmpid=14538&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fjava-interview-questions-and-answers%2F) - [Spring框架面談指南---200+問答](https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&subid=0&offerid=323058.1&type=10&tmpid=14538&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fspring-interview-questions-and-answers%2F) - [準備工作面試 作者:John Sonmez](https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fdeveloper-job-interviews) - [Markham 曝光的 Java 程式設計面試](http://www.amazon.com/Java-Programming-Interviews-Exposed-Markham/dp/1118722868?tag=javamysqlanta-20) - [破解編碼面試 --- 189 個問題和答案](http://www.amazon.com/Cracking-Coding-Interview-6th-Edition/dp/0984782850/?tag=javamysqlanta-20) - [求職面試的資料結構與演算法分析](https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&subid=0&offerid=323058.1&type=10&tmpid=14538&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fdata-structure-and-algorithms-analysis%2F) - [過去 5 年 130 多道 Java 面試題](http://javarevisited.blogspot.sg/2015/10/133-java-interview-questions-answers-from-last-5-years.html) - [Grokking the Java Interview - 免費範例 PDF](https://javinpaul.gumroad.com/l/HMOAv) - [深入了解 Spring Boot 面試 - 免費 PDF 範本](https://javinpaul.gumroad.com/l/grokking-springboot-interview-sample) ### 結束語 謝謝,您已經讀到了文章的結尾...祝您程式設計面試順利!這當然不會很容易,但這些問題肯定會對您有所幫助。它還會鼓勵您了解更多。 如果您喜歡這篇文章,請與您的朋友和同事分享,並且不要忘記在 Twitter 上關注[javinpaul](https://twitter.com/javinpaul) ! > **PS ---**如果您需要一些免費資源來學習 Java,您可以查看[**我最喜歡的免費 Java 課程**](https://medium.com/javarevisited/10-free-courses-to-learn-java-in-2019-22d1f33a3915)清單來開始您的準備。 &gt; > **PSS ---**我沒有提供圖片中分享的面試問題的答案“程式碼中建立了多少個 String 物件?”你能猜出並解釋一下嗎? 而且,如果你今年正在準備 Java 面試,你還可以**[在 Gumroad 上取得我的 Java + Spring Interview + SQL Bundle](https://javinpaul.gumroad.com/l/sowpfg)** ,使用程式碼**friends20**也可以獲得 20% 的折扣 --- 原文出處:https://dev.to/javinpaul/50-core-java-interview-questions-with-answers-for-programmers-3bc