プログラマーのように考える
あらゆるスキルレベルや技術スタックのソフトウェア開発者が知っておくべき(主に技術的な)リソースの厳選カタログ。Alexey Migutskyとコントリビューターによるコミュニティリスト(https://github.com/mtdvio/every-programmer-should-know)を基にしており、CC BY 4.0ライセンスです。オリジナルは「非常に主観的で、科学的根拠はなく」順不同です。
いつ使うか
- 「次に何を学ぶべきか / すべての開発者がXについて知っておくべきことは?」
- 基礎トピックに関する本、講演、論文、コース、記事のリクエスト
- ある概念(浮動小数点、タイムゾーン、Unicode、メモリ、CAP/分散クロック、暗号)を説明するとき、定番の読み物を紹介したい場合
- キャリアに関する質問:面接、オファー交渉、株式、リモートワーク、履歴書
- 「どこでコーディング練習や面接対策ができるか?」
使い方
- 質問をカタログの1つ以上のセクションにマッチさせる。
- セクション全体ではなく、2~4個のリソースを推薦する。それぞれについて、なぜ適切か、および形式(本/動画/記事/論文/コース/サイト)を1行で説明する。
- レベルに合わせて調整する:初心者には視覚的で易しいリソース(『Grokking Algorithms』『Hello Algo』『Learn X in Y Minutes』)を最初に、経験者には深いまたは古典的な資料(『Introduction to Algorithms』『DDIA』『Lamport』『Out of the Tar Pit』)を推薦する。
- トピックがカタログにない場合は、その旨を明確に伝え、一般知識から回答する。無関係なリンクを強制しない。
- 一部のリンクは古く、移動または削除されている可能性がある。Webアクセスが可能でリンクが重要な場合は、使用前に確認する。そうでなければ、リンクが古い可能性があることを伝える。
- ユーザーの言語で返答する。リソースタイトルは原文のまま保持する。
- 必要に応じて、誰もこれをすべて暗記する必要はないことを伝える。これは地図であり、チェックリストではない。
推奨パス(カタログからの組み合わせ)
- 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(なぜすべきでないか)
カタログ
はじめに
- 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 — Webアプリケーション脆弱性の標準リスト
- PortSwigger Web Security Academy(ラボ)— https://portswigger.net — 実践的なWebセキュリティラボ
- 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/
UX / ユーザビリティ
- 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
SEO
- 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
- TL;DR Stock Option(記事)— https://tldroptions.io/
面接対策
- Tech Interview Handbook(ガイド)— https://techinterviewhandbook.org/
- Cracking the Coding Interview(本)— https://www.goodreads.com/book/show/12544648-cracking-the-coding-interview
- LeetCode(サイト)— https://leetcode.com/
- Codility(サイト)— https://www.codility.com/
- HackerRank(サイト)— https://www.hackerrank.com/
- Pramp(サイト)— https://www.pramp.com/
- Interviewing.io(サイト)— https://interviewing.io/
コーディング練習
- Project Euler(サイト)— https://projecteuler.net/
- Codewars(サイト)— https://www.codewars.com/
- Advent of Code(サイト)— https://adventofcode.com/
- Codeforces(サイト)— https://codeforces.com/
- AtCoder(サイト)— https://atcoder.jp/
その他
- このリストは随時更新されます。貢献や提案があれば、元のリポジトリ(https://github.com/mtdvio/every-programmer-should-know)でIssueやPRを開いてください。