像程式設計師一樣思考
一份精心策劃的(主要是)技術資源目錄,每位軟體開發者都應了解,無論其技能水平或技術棧為何。基於 Alexey Migutsky 和貢獻者於 https://github.com/mtdvio/every-programmer-should-know 的社群清單,採用 CC BY 4.0 授權。原始清單公開聲明是「高度主觀的,未經科學驗證」,且沒有特定順序。
使用時機
- 「我接下來該學什麼 / 每位開發者對 X 應該知道什麼?」
- 要求提供基礎主題的書籍、演講、論文、課程或文章。
- 解釋一個概念(浮點數、時區、Unicode、記憶體、CAP/分散式時鐘、密碼學)並希望指出權威讀物。
- 職涯問題:面試、 offer 協商、股權、遠端工作、履歷。
- 「我可以在哪裡練習程式設計 / 準備面試?」
使用方式
- 將問題與下方目錄中的一個或多個章節進行匹配。
- 推薦 2-4 個資源,而非整個章節。針對每個資源,用一句話說明為何適合,並指出其格式(書籍 / 影片 / 文章 / 論文 / 課程 / 網站)。
- 根據程度調整:初學者優先獲得視覺化或溫和的資源(《Grokking Algorithms》、《Hello Algo》、《Learn X in Y Minutes》);經驗豐富的開發者則獲得較深入或經典的材料(《Introduction to Algorithms》、《DDIA》、Lamport、《Out of the Tar Pit》)。
- 如果目錄中沒有該主題,請如實說明並根據一般知識回答;不要強行提供不相關的連結。
- 某些連結可能較老舊,可能已失效或移動。如果可以存取網路且某個連結很重要,請在使用前檢查它;否則請註明該連結可能已過時。
- 以使用者語言回覆;資源標題保留其原始形式。
- 在適當時候提醒人們,沒有人需要全部牢記在心——它是一張地圖,而非核對清單。
建議路徑(來自目錄的組合)
- 剛開始學 CS: Map of Computer Science → Computer Science Roadmap → Grokking Algorithms → Big O Cheatsheet → Floating Point Guide → Unicode and Character Sets。
- 後端 / 分散式系統: Latency Numbers → Understanding Distributed Systems → Designing Data-Intensive Applications → Fallacies of Distributed Computing → Time, Clocks and the Ordering of Events → Jepsen。
- 寫出更好的程式碼: The Art of Readable Code → Clean Code / Code Complete → Working Effectively with Legacy Code → Out of the Tar Pit → Simple Made Easy。
- 面試準備: Tech Interview Handbook → Cracking the Coding Interview → LeetCode / Codility → How To Interview As a Developer Candidate → Ten Rules for Negotiating a Job Offer。
- 安全基礎: OWASP Top 10 → Portswigger Academy → Hashing, Encryption and Encoding → Cryptographic Right Answers → Rolling Your Own Crypto (why not to)。
目錄
簡介
- Map of Computer Science (影片) — https://www.youtube.com/watch?v=SzJ46YA_RaA
- 40 Key Computer Science Concepts Explained in Layman's Terms (文章) — http://carlcheo.com/compsci
- Computer Science Roadmap (文章) — https://roadmap.sh/computer-science
- Community-driven Roadmaps for Developers (網站) — https://github.com/kamranahmedse/developer-roadmap
常見謬誤
- Awesome Falsehoods (清單) — https://github.com/kdeldycke/awesome-falsehood — 程式設計師常誤解的字串、地址、姓名、數字、電子郵件、時區、日期等。
演算法
- Big O Cheatsheet (網站) — http://bigocheatsheet.com/
- Computer Science Distilled (書籍) — https://www.goodreads.com/book/show/34189798-computer-science-distilled
- Grokking Algorithms (書籍) — https://www.goodreads.com/book/show/22847284-grokking-algorithms-an-illustrated-guide-for-programmers-and-other-curio
- Introduction to Algorithms (書籍) — https://www.goodreads.com/book/show/108986.Introduction_to_Algorithms
- Algorithms Visualization (網站) — https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
- Algorithms for Competitive Programming (網站) — https://cp-algorithms.com/
資料結構
- Hello Algo (書籍) — https://www.hello-algo.com/en/chapter_preface/about_the_book/
- UC Berkeley Data Structures Course (影片/課程) — https://sp19.datastructur.es/
- Foundations of Data Structures, edX (課程) — https://www.edx.org/course/foundations-data-structures-iitbombayx-cs213-1x-0
- Data Structures, Coursera (課程) — https://www.coursera.org/learn/data-structures
- Mathematics for Computer Science, Eric Lehman et al. (書籍, PDF) — https://people.csail.mit.edu/meyer/mcs.pdf
數字
- How to Count (書籍) — https://www.goodreads.com/book/show/12093869-how-to-count
- Floating Point Guide (文章) — http://floating-point-gui.de/
- What Every Computer Scientist Should Know About Floating-Point Arithmetic (文章) — https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
- Basic Number Theory Every Programmer Should Know (文章) — https://www.codechef.com/wiki/tutorial-number-theory/
字串
- Unicode and Character Sets, Joel Spolsky (文章) — https://www.joelonsoftware.com/articles/Unicode.html
- Homoglyphs (工具) — https://github.com/codebox/homoglyph/
- Unicode Common Locale Data Repository (網站) — http://cldr.unicode.org/
- ASCII (影片) — https://www.youtube.com/watch?v=B1Sf1IhA0j4
- UTF-8 (影片) — https://www.youtube.com/watch?v=vLBtrd9Ar28
延遲
- Interactive Latency Infographics (網站) — https://people.eecs.berkeley.edu/~rcs/research/interactive_latency.html
- Latency Numbers Every Programmer Should Know (文章) — https://gist.github.com/jboner/2841832
時間
- Some Notes About Time (文章) — https://unix4lyfe.org/time/
- The Problem with Timezones (影片) — https://www.youtube.com/watch?v=-5wpm-gesOY
記憶體
- What Every Programmer Should Know About Memory, Ulrich Drepper (文章系列) — https://lwn.net/Articles/250967/ — 完整論文 PDF: https://akkadia.org/drepper/cpumemory.pdf
分散式系統
- Understanding Distributed Systems (書籍) — https://www.goodreads.com/book/show/56977420-understanding-distributed-systems
- Designing Data-Intensive Applications (書籍) — https://www.goodreads.com/book/show/23463279-designing-data-intensive-applications
- Designs, Lessons and Advice from Building Large Distributed Systems, Jeff Dean (論文/投影片) — https://www.cs.cornell.edu/projects/ladis2009/talks/dean-keynote-ladis2009.pdf
- Time, Clocks and the Ordering of Events in a Distributed System, Leslie Lamport (論文) — https://www.microsoft.com/en-us/research/publication/time-clocks-ordering-events-distributed-system/
- There Is No Now (文章) — https://queue.acm.org/detail.cfm?id=2745385
- Jepsen: how databases behave under partition (文章) — https://aphyr.com/tags/jepsen
- Fallacies of Distributed Computing Explained (論文) — https://pages.cs.wisc.edu/~zuyu/files/fallacies.pdf
機器學習
- Andrew Ng Machine Learning Specialization (課程) — https://www.coursera.org/specializations/machine-learning-introduction
正規表達式
- RegexHQ (網站) — https://github.com/regexhq
- Learn Regex the Easy Way (教學) — https://github.com/ziishaned/learn-regex
- Regex Crossword (遊戲) — https://regexcrossword.com/
安全性
- Secure Programming HOWTO, David Wheeler (書籍) — https://www.dwheeler.com/secure-programs/
- Rolling Your Own Crypto (文章) — http://loup-vaillant.fr/articles/rolling-your-own-crypto
- Cryptographic Right Answers (文章) — https://gist.github.com/tqbf/be58d2d39690c3b366ad
- An Open Letter to Developers Everywhere (About Cryptography) (文章) — https://gist.github.com/paragonie-scott/e9319254c8ecbad4f227
- Foundations of Security: What Every Programmer Needs to Know (書籍) — https://www.goodreads.com/book/show/128003.Foundations_of_Security
- OWASP Top 10 (參考) — https://owasp.org/www-project-top-ten — 標準的網頁應用程式漏洞清單。
- PortSwigger Web Security Academy (實驗室) — https://portswigger.net — 動手操作的網頁安全實驗室。
- Web Application Exploits and Defenses, Google Gruyere (實驗室) — https://google-gruyere.appspot.com/part1
- Hashing, Encryption and Encoding (文章) — https://www.integralist.co.uk/posts/hashing-and-encryption/
使用者體驗 / 易用性
- Don't Make Me Think (書籍) — https://www.goodreads.com/book/show/18197267-don-t-make-me-think-revisited
- Inventing on Principle, Bret Victor (影片) — https://vimeo.com/906418692
搜尋引擎最佳化
- What Every Programmer Should Know About SEO (文章) — https://katemats.com/blog/what-every-programmer-should-know-about-seo
架構
- A Field Guide to Boxology (論文) — https://web.cs.wpi.edu/~cs562/s98/pdf/Boxology.pdf
- Out of the Tar Pit (論文) — https://github.com/papers-we-love/papers-we-love/blob/master/design/out-of-the-tar-pit.pdf
- No Silver Bullet, Fred Brooks (論文) — http://www.cs.unc.edu/techreports/86-020.pdf
- Growing a Language, Guy Steele (影片) — https://www.youtube.com/watch?v=_ahvzDzKdB0
- CQRS and Event Sourcing (影片) — https://www.youtube.com/watch?v=JHGkaShoyNs
- Practical Object-Oriented Design in Ruby (書籍) — https://www.poodr.com/
- Evolutionary Software Architectures (影片) — https://www.youtube.com/watch?v=CglSFhwbI3s
- System Design Primer (指南) — https://github.com/donnemartin/system-design-primer
- How JavaScript Works, parts 1-4 (文章) — https://medium.com/sessionstack-blog/how-does-javascript-actually-work-part-1-b0bacc073cf
- Entity-Component-System Architecture with Unity by Example (影片) — https://www.youtube.com/watch?v=lNTaC-JWmdI
程式碼設計
- Programming Principles Wiki (網站) — http://www.principles-wiki.net/
工程哲學
- Category Theory in Life (影片) — https://www.youtube.com/watch?v=ho7oagHeqNc
- Simple Made Easy, Rich Hickey (影片) — https://www.infoq.com/presentations/Simple-Made-Easy
- Speed in Software Development (文章) — https://www.targetprocess.com/articles/speed-in-software-development/
- #NoEstimates (影片) — https://www.youtube.com/watch?v=QVBlnCTu9Ms
- The Myth of the Genius Programmer (影片) — https://www.youtube.com/watch?v=0SARbwvhupQ
- Making Badass Developers, Kathy Sierra (影片) — https://www.youtube.com/watch?v=FKTxC9pl-WM
- The Ten Rules of a Zen Programmer (文章) — https://www.zenprogrammer.org/en/10-rules-of-a-zen-programmer.html
- The Mythical 10x Programmer, antirez (文章) — http://antirez.com/news/112
- The Debugging Mindset (文章) — https://queue.acm.org/detail.cfm?id=3068754
- The Future of Programming, Bret Victor (影片) — http://worrydream.com/dbx/
- The Good Software Development Manifesto (文章) — https://www.infoworld.com/article/3214481/application-development/the-good-software-development-manifesto.html
- All the Little Things, Sandi Metz (影片) — https://www.youtube.com/watch?v=8bZh5LMaSmE
- Teach Yourself Programming in Ten Years, Peter Norvig (文章) — https://norvig.com/21-days.html
實務
- Working Effectively with Legacy Code (書籍) — https://www.goodreads.com/book/show/44919.Working_Effectively_with_Legacy_Code
- The Art of Readable Code (書籍) — https://www.goodreads.com/book/show/8677004-the-art-of-readable-code
- Code Complete (書籍) — https://www.goodreads.com/book/show/4845.Code_Complete
- Clean Code (書籍) — https://www.goodreads.com/book/show/3735293-clean-code
- Test Driven Development: By Example (書籍) — https://www.goodreads.com/book/show/387190.Test_Driven_Development
- Going To Production Checklist (核對清單) — https://github.com/mr-mig/going-to-production
- Release It! (書籍) — https://www.goodreads.com/book/show/1069827.Release_It_
- Professor Frisby's Mostly Adequate Guide to Functional Programming (書籍) — https://mostly-adequate.gitbook.io/mostly-adequate-guide/
- SICP: Structure and Interpretation of Computer Programs (書籍) — https://www.goodreads.com/book/show/43713.Structure_and_Interpretation_of_Computer_Programs
- Thirteen Ways of Looking at a Turtle (文章) — https://fsharpforfunandprofit.com/posts/13-ways-of-looking-at-a-turtle-3/
- Programming Paradigms for Dummies, Peter Van Roy (論文) — https://www.info.ucl.ac.be/~pvr/VanRoyChapter.pdf
- Learn X in Y Minutes (網站) — https://learnxinyminutes.com/ — 濃縮的語言基礎。
- Hyperpolyglot (網站) — http://hyperpolyglot.org/ — 相似語言的並排功能比較。
- Pomodoro for Programmers (文章) — https://medium.com/@mr_mig_by/pomodoro-for-programmers-d6568dd1e6fc
- Site Reliability Engineering, Google (書籍, 免費線上版) — https://sre.google/sre-book/table-of-contents/
職涯
- Levels.fyi (網站) — https://www.levels.fyi — 科技公司的薪資數據。
- 10 Things Every Programmer Should Know for Their First Job (文章) — http://www.applematters.com/article/10-things-every-programmer-should-know-for-their-first-job/
- How Much Do Software Engineers Really Make in Each City? (文章) — https://www.codementor.io/blog/best-cities-software-engineer-earnings-271vpf599k
- Software Engineering 101 (投影片) — https://slides.com/mr-mig/se101
- The Passionate Programmer (書籍) — https://www.goodreads.com/book/show/6399113-the-passionate-programmer
- Soft Skills: The Software Developer's Life Manual (書籍) — https://www.goodreads.com/book/show/23232941-soft-skills
- The Complete Software Developer's Career Guide (書籍) — https://www.goodreads.com/book/show/35674293-the-complete-software-developer-s-career-guide
- Programming Beyond Practices (書籍) — https://www.goodreads.com/book/show/29895093-programming-beyond-practices
- Ten Rules for Negotiating a Job Offer (文章) — https://medium.com/free-code-camp/ten-rules-for-negotiating-a-job-offer-ee17cccbdab6
- How To Interview As a Developer Candidate (文章) — https://medium.freecodecamp.com/how-to-interview-as-a-developer-candidate-b666734f12dd
- How To Get a Tech Job Abroad Faster (文章) — https://relocate.me/blog/job-relocation/landing-a-tech-job-abroad-7-simple-tips/
- How To Be a STAR Engineer (論文) — http://vlsicad.ucsd.edu/Research/Advice/star_engineer.pdf