目次
プロフェッショナルプログラミング - このリストについて
木を切り倒すのに6時間与えてください、そして私は最初の4時間を斧を研ぐのに費やします。(エイブラハムリンカーン)
プログラマー向けのフルスタックリソースのコレクション。
このページの目的は、より熟練した開発者になることです。私が本当に刺激的だと思ったリソース、または時代を超越したクラシックになったリソースだけが見つかります。
このページは包括的なものではありません。私はそれを軽く保ち、圧倒しすぎないようにしています。記事の選択は意見があります。
項目:
- 🧰 : リソースのリスト
- 📖:本
- 🎞 : 映像/動画抽出/動画/トーク
- 🏙 : スライド/プレゼンテーション
- ⭐️ : 必読
このリストへの貢献
PRを開いて貢献してください!私はすべてを追加するつもりはありません:上記のように、私はリストを簡潔に保とうとしています。
必読の本
私はこれらの本が信じられないほど刺激的であることに気づきました:
次のような無料の本がいくつかあります。
必読の記事
- 新しいソフトウェアエンジニアのための実用的なアドバイス
- シニアエンジニアであることについて
-
ソフトウェア開発で学んだ教訓:何年にもわたる苦労して得た教訓をすべて1つの短い記事で提供する記事の1つ。必読。
-
私が苦労して学んだこと
- 最初に仕様、次にコード
- テストはより良いAPIを作る
- 未来思考は未来のゴミです
- ドキュメンテーションはあなたの未来の自分へのラブレターです
- 何もしないよりもアプリケーションをクラッシュさせる方が良い場合があります
- カーゴカルトを理解し、近づかないでください
- 「仕事に適したツール」は、議題を推進することだけです
- 基本的な関数型プログラミングを学ぶ
- 常に日付にタイムゾーンを使用する
- 常にUTF-8を使用する
- ライブラリの作成
- 監視することを学ぶ
- 明示的は暗黙的よりも優れています
- 企業はスペシャリストを探していますが、ジェネラリストをより長く維持します
- ユーザーデータを処理する最も安全な方法は、それをキャプチャしないことです
- 停止する時間になったら、停止する時間です
- コードの使用には責任があります
- そうでないときに「完了しました」と言わないでください
- 人々があなたにどのように反応するかに注意を払う
- マイクロアグレッションに注意してください
- 「私が知らないこと」のリストを保持する
- あなたが優れたプログラマーであることのしるし
- あなたが悪いプログラマーであるという兆候
-
ジュニア開発者として学ばなかった7つの絶対的な真実
- キャリアの早い段階で、自分でコーディングするよりも、1年間で支援チームで10倍多く学ぶことができます
- すべての企業に問題があり、すべての企業に技術的負債があります。
- 実際の経験が不足しているトピックについて過度に意見を述べることはかなり傲慢です。
- 多くの会議の講演では、実際のシナリオではなく概念実証が取り上げられています。
- レガシーを扱うことは完全に正常です。
- アーキテクチャは、つまらないことよりも重要です。
- 必要に応じて、ドキュメントよりも自動化に焦点を当てます。
- 技術的負債があることは健全です。
- シニアエンジニアは、プログラミング以外にも多くのスキルを身に付ける必要があります。
- 私たちは皆、いくつかの分野ではまだジュニアです。
-
優れたソフトウェアを構築する方法
- 基本的なエンジニアリングプラクティスの優れた高レベルの要約。
- 悪いソフトウェアの根本原因は、特定のエンジニアリングの選択とはあまり関係がなく、開発プロジェクトの管理方法に関係しています。
- プラトニックに良いエンジニアリングのようなものはありません:それはあなたのニーズとあなたが遭遇する実際的な問題に依存します。
- ソフトウェアは静的な製品としてではなく、開発チームの集合的な理解の生きた現れとして扱われるべきです。
- ソフトウェアプロジェクトは、小さすぎるために失敗することはめったにありません。彼らは大きくなりすぎるので失敗します。
- 問題文を装った官僚的な目標に注意してください。私たちの最終目標が市民の生活をより良くすることであるならば、私たちは彼らの生活を悪化させているものを明確に認識する必要があります。
- ソフトウェアの構築は、障害を回避することではありません。それは、良いものを構築するために必要な情報を取得するために、できるだけ早く戦略的に失敗することです。
その他の一般的な資料とリソースのリスト
公理のリスト:
-
教訓 - アービット
- データはコードよりも優れています。
- 正確さはパフォーマンスよりも重要です。
- 決定論的はヒューリスティックを打ち負かします。
- 100行の単純さは、20行の複雑さよりも優れています。
- 抽象化が漏れている場合、それは宇宙の法則によるものではありません。あなたはただ抽象化するのが嫌いです。通常、抽象化を十分に狭く指定しませんでした。
- そこにいる悪魔を目覚めさせることを恐れてコードのセクションを変更することを避けた場合、あなたは恐れて生きています。自分が書いたコードの小さなセクションの快適な範囲にとどまるか、よく知っている場合、伝説的なコードを書くことは決してありません。すべてのコードは人間によって書かれており、人間が習得することができます。
- 明らかに正しい方法と間違った方法がある場合は、正しい方法で行います。コーディングには信じられないほどの規律が必要です。
- 正しい答えを得る最良の方法は、間違った方法でそれを試すことです。
- 練習は物事が良いか悪いかを教えてくれます。理論はその理由を教えてくれます。
- 問題を解決する資格がないことは、問題を解決しない理由にはなりません。
- 使用しているシステムを理解していなければ、それを制御することはできません。誰もシステムを理解していない場合、システムは制御しています。
- 埋め込まれた経験則
- 私の人生を変えた50のアイデア
- 10,000時間のプログラミングについての考察
- ソフトウェアエンジニアとしての20年間で学んだ20のこと
コース
トピック
アルゴリズムとデータ構造
その他のリソース:
正直に言うと、アルゴリズムはかなりドライなトピックになる可能性があります。このクォーラの質問には、次のようなおかしな学習の選択肢がリストされています。
実装例:
API設計と開発
一般的な REST コンテンツ:
ガイドラインの例:
より具体的なトピック:
態度、習慣、考え方
-
マスタリングプログラミング、ケントベック。
- 熟練したプログラマーの特徴
-
プログラミングのタオ:プログラミングに関する一連のたとえ話。
- 所有権を取得することは、あなたが望むものを手に入れるための最も効果的な方法です
- より良い開発者になるための時間を見つける
-
1日10分:アレックス・アレインが毎日10分書くことで、200時間以内に本を書いた方法。
-
ソフトウェアエンジニアの世話と給餌(または、エンジニアが不機嫌になる理由)
- ソフトウェア、プロダクトマネージャー、デザイナー、ソフトウェアエンジニアの三位一体では、エンジニアだけが創造的な心をオフにして、ただ生産することが期待されています。
- エンジニアとプロダクトマネージャーの両方が、製品の仕様や要件がイケアの家具マニュアルと同等であると誤って考える傾向があります。
- これは、エンジニアを不機嫌にする最大のことの1つであり、常に優先順位がシフトしています。
- 多くのエンジニアは、プロダクトマネージャーが気が変わったと不平を言うでしょうが、時間の見積もりでそれを説明する人はほとんどいません。
- コンピュータサイエンスプログラムは、業界で直面するタスクに備えるためのものではありません。
- 使用できる数を超えるエンジニアがいる場合、エンジニアリング時間は開発から離れ、計画、同期、および調整に費やされます。
- クリエイティブなプロセスにエンジニアを巻き込む
- エンジニアに創造性を発揮する機会を与えます。
- 休暇を奨励する。
- コードを作成しましょう
- 感謝の気持ちを表す
-
製品志向のソフトウェアエンジニア、ゲルゲリー・オロシュ
- 優れた製品エンジニアは、最小限の愛すべき製品には適切な深さが必要であることを知っています
- 製品志向のエンジニアは、エッジケースを迅速にマッピングし、それらの作業を削減する方法を考えます。
- ユーザー調査とカスタマーサポートに従事する
- 十分に裏付けられた製品の提案をテーブルに持ち込む
- 製品/エンジニアリングのトレードオフを提供
-
40年からの40の教訓、スティーブ・シュラフマン
- 最も重要なことを進歩させたいのなら、誰を失望させるかを決める必要があります。それは避けられません。
- あなたができる最善の投資はあなた自身の教育です。学習をやめないでください。あなたができる2番目に良い投資は、本物で有意義な相互作用を通じてネットワークを構築することです。それはあなたが知っていることであり、あなたが知っている人です。
- 求めていないものや積極的に求めていないものは決して得られません。頑張れ!
- それはトンネルの終わりの光についてではありません。トンネルです。毎日現れて、プロセスを楽しんでください。
- 優れたチームメイトは、常に自分の利益よりも組織とその目的を優先します。
- あなたのスポットを選んでください。私たちには限られた時間があり、私たちの脳はそれほど多くを処理することができません。焦点が重要です。賢明に選択してください。
- すべての人が何かに苦労している可能性があります。親切にしてください。力になる。
-
コーディング、エゴ、注意について
- 初心者の心は絶対的な知識が無限であり、したがってスコアを維持することは時間の無駄であるという事実を受け入れます。
- 習熟とは、知識の蓄積ではなく、単に勢いの蓄積です。
- エゴの気晴らしに対処することで、問題解決プロセスを愛することを学びました。それは私に学習プロセスを愛し、尊重することを教えてくれました。その結果、私はより生産的です。私はあまり不安ではありません。僕はより良いチームメイトだ。私はより良い友人であり、より良い思想家です。
- 固定と成長:私たちの生活を形作る2つの基本的な考え方
- 優れたソフトウェアエンジニアはどのように見えますか?
- 良い睡眠、良い学習、良い生活
- 🎞スティーブ・ジョブズ:助けを求めなければ、それほど遠くまでは行けません
- プログラミングの引用
-
親切に
- 親切であることは、基本的にあなたの周りの人々への影響に責任を持つことです。
- それはあなたが彼らの気持ちに注意を払い、あなたの存在が彼らにどのように影響するかに配慮する必要があります。
-
ウォーレンバフェットは、この1つの単純な習慣が成功した人々を他のすべての人から分離すると言います
- 成功した人と本当に成功した人の違いは、本当に成功した人はほとんどすべてにノーと言うということです。
- ラッキーになるには?
-
プログラマーは無能を祝うのをやめるべきです、DHH
- プログラミングの魔法は、主にあなたがまだ知らないことです。
- プログラミングをキャリアにしようとするのであれば、習得への道を歩むべきではないと考えるのは問題ありません。
- 制限速度はありません
インポスター症候群は過小評価されています:インポスター症候群を克服するために多くの話が行われています。私は自己懐疑論を受け入れ、毎日自分自身を疑うと言います。あなたの知識の多くが毎年期限切れになる動きの速い業界では、あなたの周りの最も若い人々でさえ、あなたが持っていないスキルを常に調理します。あなたは初心者の決意(そして恐れさえも)で適用することによって競争力を維持します。このトレッドミルの利点は、すべてのエンジニアがそれに乗っていることです:あなたが詐欺師であるからといって、他の人があなたよりもふさわしいという意味ではありません。自分を擁護し、リスクを冒し、物事がうまくいったときに背中を軽くたたき、問題解決の実績を築き始めるときは、自分のスキルと適応性を信頼する必要があります。間違いなく、あなたは最後に解決した問題と同じくらい良いだけです。
ダン・ヘラー、ソフトウェアのキャリアを築く
私はすでに自分の執筆の井戸を空にすることは決してないことを学びましたが、井戸の深い部分にまだ何かがあるときはいつも立ち止まり、夜にそれを供給した泉から補充するようにしました。--アーネストヘミングウェイ
認証/承認
オートメーション
ソフトウェアエンジニアリング&ランダムを超えて
バイアス
バイアスは採用だけに当てはまるわけではありません。たとえば、基本的な帰属バイアスは、まったく異なるコンテキストで、ずっと前に書かれた誰かのコードを批判する場合にも当てはまります。
キャッシュ
キャリア成長
スタッフ工学への行き方
文字セット
雲
コードレビュー
コーディングとコード品質
コンパイラ
構成
データベース
SQL セクションも参照してください。
演習:
NoSQL:
データ形式
データサイエンス/データ工学
デバッグ
デザイン(ビジュアル、UX、UI、タイポグラフィ)
非デザイナーのデザインブックを読むことを強くお勧めします。これはかなり短い本で、非常に実用的な設計アドバイスを提供します。
記事:
リソース:
- 🧰開発者向けのデザインリソース:ストックフォト、Webテンプレート、CSSフレームワーク、UIライブラリ、ツールからのデザインとUIリソース...
デザイン(オブジェクト指向モデリング、アーキテクチャ、パターン、アンチパターンなど)
ここに良い本のリストがあります:
アーキテクチャに関する絶対的な参考文献の1つはMartin Fowlerです:彼のソフトウェアアーキテクチャガイドをチェックしてください。
記事:
製図台で消しゴムを使用するか、建設現場でそりハンマーを使用できます。(フランクロイドライト)
リソース:
デザイン: データベース スキーマ
-
データベーススキーマ設計の謙虚なガイド、マイク・アルチェ
- 少なくとも第 3 正規形を使用する
- 制約のある最後の防衛線を作成する
- 完全なアドレスを 1 つのフィールドに保存しない
- 名と姓を同じフィールドに保存しない
- テーブル名とフィールド名の規則を確立します。
デザイン:パターン
デザイン:シンプルさ
-
シンプルに簡単に🎞、リッチなヒッキー。これは、シンプルさ、使いやすさ、複雑さを再定義し、簡単に見えるソリューションが実際に設計に害を及ぼす可能性があることを示す、信じられないほど刺激的な講演です。
Dev environment & tools
ツール
ツールに関する記事:
-
派手な道具の復活
- シンプルなツールはあなたにもう少し考えさせます
- ドラッカー:「後で思い出すために書き留めているのではなく、今思い出すために書き留めているのです。」
- 摩擦のないメモ取りはメモを生成しますが、メモリは生成しません。
ダイバーシティ&インクルージョン
私の経営資源リストをチェックしてください。
港湾労働者
charlax/python-education の Python 固有のセクションも参照してください。
-
Docker Composeを使用した本番環境対応のWebアプリに関するベストプラクティス
- オーバーライドファイルを使用してdevとprodの2つの作成ファイルを回避する
- エイリアスとアンカーによるサービスの重複の削減
- あなたのドッカーファイルではなく、あなたのドッカー作成を定義する
HEALTHCHECK
- 環境変数を最大限に活用する
- マルチステージビルドを使用してイメージサイズを最適化する
- 非ルートユーザーとしてのコンテナの実行
-
Python開発者のためのDockerのベストプラクティス
- マルチステージ ビルドを使用する
- レイヤーキャッシュを活用するためのDockerfileコマンドの順序に細心の注意を払ってください
- 小さいDockerイメージはよりモジュール化され、安全です(ただし、Alpineに注意してください)
- レイヤーの数を最小限に抑えます(、、
RUN
COPY
ADD
)
- 特権のないコンテナーを使用する
- 優先
COPY
ADD
- Python パッケージを Docker ホストにキャッシュする
- 文字列構文よりも配列を優先する
- との違いを理解する
ENTRYPOINT
CMD
- 指示を含める
HEALTHCHECK
- 可能な限り、タグの使用を避けてください。
latest
- シークレットをイメージに保存しない
- ファイルを使用する(インクルードなど)
.dockerignore
**/.git
- Dockerファイルとイメージをリントしてスキャンします(例:
hadolint
)
- 標準出力または標準エラーへのログ
- ドッカーコンテナのセキュリティ
ドキュメンテーション
最も薄いインクは、最も強力なメモリよりも信頼性があります。
-- 中国のことわざ
ドットファイル
記事
Editors & IDE
特にVimについて:
私のvim構成と私のvimチートシートを自由にチェックしてください。
電子メール
エンジニアリング管理
管理リストをチェックアウトする
リソース。
演習
学ぶための最良の方法は、実践することによって学ぶことです。
練習:
関数型プログラミング (FP)
- さようなら、オブジェクト指向プログラミング
-
Functional Programming & Haskell🎞: FP を学ぶ理由!
-
関数型プログラミングの基礎:FPとその利点の簡単な紹介。
-
OO vs FP、ロバートC.マーティン、クリーンコードブログ。OOPの専門家からのOOPとFPの違いについての非常に興味深い見方。
- オブジェクト指向は状態に関するものではありません。オブジェクトは関数のバッグであり、データのバッグではありません。
- 機能プログラムは、オブジェクト指向プログラムと同様に、データを操作する関数で構成されています。
- FPは割り当て時に規律を課します。
- オブジェクト指向は、関数ポインタに規律を課します。
- ソフトウェア設計の原則は、プログラミングスタイルに関係なく適用されます。代入演算子を持たない言語を使用することにしたからといって、単一責任の原則を無視できるわけではありません。
-
解析、検証しない
- 不正な状態を表現できないようにするデータ構造を使用する
- 立証責任を可能な限り押し上げるが、それ以上は押し上げない
- データ型をコードに通知させ、コードにデータ型を制御させないでください
- 複数のパスでデータを解析することを恐れないでください
- データの非正規化表現を避ける (特に変更可能な場合)
- 抽象データ型を使用して、バリデータをパーサーのように「見せる」
- 🏙関数型プログラミング
- 15分でモナド
-
ヘマンス/関数型プログラミング専門用語:関数型プログラミングの世界からの専門用語を簡単な言葉で
ハードウェア
ティッカー
ユーモア
インシデント対応 (オンコール、アラート、停止、消火、事後分析)
- Heroku でのインシデント対応
-
アラートに関する私の哲学
- ページは、緊急で、重要で、実用的で、現実的である必要があります。
- ノイズの多いアラートを削除する側の誤り–過剰監視は、監視不足よりも解決が難しい問題です。
- 症状は、より少ない労力でより多くの問題をより包括的かつ堅牢にキャプチャするためのより良い方法です。
- 症状ベースのページまたはダッシュボードに原因ベースの情報を含めますが、原因を直接警告することは避けてください。
- サービングスタックが上に行くほど、1つのルールでより明確な問題をキャッチできます。しかし、何が起こっているのかを十分に区別できないほど遠くまで行かないでください。
- 静かなオンコールローテーションが必要な場合は、タイムリーな対応が必要であるが、差し迫って重要ではないものに対処するためのシステムを用意することが不可欠です。
- この古典的な記事は、現在、GoogleのSREブックの章になっています。
- オンコールに関する Google SRE ブックの章
-
SRE の場合のランブックドキュメントの作成
- プレイブックは「ストレス、平均修復時間(MTTR)、人為的ミスのリスクを軽減します」。
- 空白のドキュメントから始めるのは非常に難しいため、テンプレートを使用すると便利です。
- 知識の呪いは、誰かが他の人とコミュニケーションをとっていて、無意識のうちに彼らがコミュニケーションを取っている人々の知識のレベルを想定しているときに発生する認知バイアスです。
- コンテンツを一目で見やすくします。
- スクリプトが 1 行より長い場合は、コードのように扱い、リポジトリにチェックインしてソース管理し、テストする可能性があります。
-
インシデントレビューと事後分析のベストプラクティス、Gergely Orosz
死後
「私たち全員が今日と同じように愚かである未来を計画しましょう。」
- ダン・ミルスタイン
事後分析の概要の例:
- エグゼクティブサマリー
- インパクト
- 影響を受けるユーザーの数
- 収益の損失
- 期間
- チームへの影響
- タイムライン
- 根本原因分析
- 教訓
- アクションアイテム(タスク追跡ツールへの直接リンクを含む)
- 予防改善のための業務(研修含む)
- 検出を改善するためのタスク (監視とアラートを含む)
- 緩和策を改善するためのタスク(緊急対応を含む)
インターネット
インタビュー
注:これはインタビュアーとしてではなく、インタビュイーとしてのあなたについてです。インタビュアー向けのリソースのリストを確認するには、エンジニアリング管理リポジトリにアクセスしてください。
このドキュメントの「演習」セクションも参照してください。
Kubernetes
学習と暗記
学ぶ方法を学びましょう!
About Zettelkasten and PKM (personal knowledge management):
Richard Feynman's Learning Strategy:
- Step 1: Continually ask "Why?”
- Step 2: When you learn something, learn it to where you can explain it to a child.
- Step 3: Instead of arbitrarily memorizing things, look for the explanation that makes it obvious.
Most people overestimate what they can do in 1 year and underestimate what they can do in a decade.
– Bill Gates
Frankly, though, I think most people can learn a lot more than they think they can. They sell themselves short without trying.
One bit of advice: it is important to view knowledge as sort of a semantic tree — make sure you understand the fundamental principles, ie the trunk and big branches, before you get into the details/leaves or there is nothing for them to hang on to.
— Elon Musk
"Experience is something you don't get until just after you need it."
― Steven Wright
Tell me and I forget. Teach me and I remember. Involve me and I learn.
– Benjamin Franklin
Education is the kindling of a flame, not the filling of a vessel.
– Socrates
That which we persist in doing becomes easier for us to do; not that the nature of the thing itself is changed, but that our power to do is increased.
– Ralph Waldo Emerson
A wise man can learn more from a foolish question than a fool can learn from a wise answer.
– Bruce Lee
A lecture has been well described as the process whereby the notes of the teacher become the notes of the student without passing through the mind of either.
— Mortimer Adler
Fools learn from experience. I prefer to learn from the experience of others.
— Bismark
Licenses (legal)
Linux (system management)
Low-level, assembly
Math
Network
-
The Great Confusion About URIs
- A URI is a string of characters that identifies a resource. Its syntax is , where only and are mandatory. URL and URN are URIs.
<scheme>:<authority><path>?<query>#<fragment>
<scheme>
<path>
- A URL is a string of characters that identifies a resource located on a computer network. Its syntax depends on its scheme. E.g. .
mailto:billg@microsoft.com
- A URN is a string of characters that uniquely identifies a resource. Its syntax is . E.g.
urn:<namespace identifier>:<namespace specific string>
urn:isbn:9780062301239
Observability (monitoring, logging, exception handling)
Logging
-
Do not log dwells on some logging antipatterns.
- Logging does not make much sense in monitoring and error tracking. Use better tools instead: error and business monitorings with alerts, versioning, event sourcing.
- Logging adds significant complexity to your architecture. And it requires more testing. Use architecture patterns that will make logging an explicit part of your contracts
- Logging is a whole infrastructure subsystem on its own. And quite a complex one. You will have to maintain it or to outsource this job to existing logging services
-
Lies My Parents Told Me (About Logs)
- Logs are cheap
- I can run it better myself
- Leveled logging is a great way to separate information
- Logs are basically the same as events
- A standard logging format is good enough
- Logging - OWASP Cheat Sheet Series
Error/exception handling
Monitoring
- Google, Site Reliability Engineering, Monitoring Distributed Systems
- PagerDuty, Monitoring Business Metrics and Refining Outage Response
- 🧰 crazy-canux/awesome-monitoring: monitoring tools for operations.
- Monitoring in the time of Cloud Native
-
How to Monitor the SRE Golden Signals
- From the Google SRE book: Latency, Traffic, Errors, and Saturation
- USE Method (from Brendan Gregg): Utilization, Saturation, and Errors
- RED Method (from Tom Wilkie): Rate, Errors, and Duration
- Simple Anomaly Detection Using Plain SQL
- How percentile approximation works (and why it's more useful than averages)
Operating system
Over-engineering
“A complex system that works is invariably found to have evolved from a simple system that worked. A complex system designed from scratch never works and cannot be patched up to make it work. You have to start over, beginning with a working simple system.”
— John Gall, General systemantics, an essay on how systems work, and especially how they fail..., 1975 (this quote is sometime referred as "Galls' law")
"Software engineering is what happens to programming when you add time and other programmers."
— Rob Pike, Go at Google: Language Design in the Service of Software Engineering
You can’t connect the dots looking forward; you can only connect them looking backwards. So you have to trust that the dots will somehow connect in your future. You have to trust in something — your gut, destiny, life, karma, whatever. This approach has never let me down, and it has made all the difference in my life.
— Steve Jobs
Performance
Personal productivity
Check out this section on my list of management resources, "Personal productivity".
Perspective
-
At 31, I have just weeks to live. Here's what I want to pass on
- First, the importance of gratitude.
- Second, a life, if lived well, is long enough.
- Third, it’s important to let yourself be vulnerable and connect to others.
- Fourth, do something for others.
- Fifth, protect the planet.
-
Life Is Not Short
- "The most surprising thing is that you wouldn’t let anyone steal your property, but you consistently let people steal your time, which is infinitely more valuable." — Seneca
Problem solving
Project management
See the Project management section on my engineering-management list of resources.
Programming languages
I would recommend learning:
- JavaScript and maybe another interpreted language (Python, Ruby, etc.). Interpreted languages are useful for quick one-off automation scripts, and fastest to write for interviews. JavaScript is ubiquitous.
- A compiled language (Java, C, C++...).
- A more recent language to see where the industry is going (as of writing, Go, Swift, Rust, Elixir...).
- A language that has first-class support for functional programming (Haskell, Scala, Clojure...).
A bit more reading:
- A brief, incomplete, mostly wrong history of programming languages
- Types
- Resources To Help You To Create Programming Languages
-
Effective Programs - 10 Years of Clojure 🎞, Rich Hickey. The author of Clojure reflects on his programming experience and explains the rationale behind some of Clojure's key design decisions.
-
Learn more programming languages, even if you won't use them, Thorsten Ball
- These new perspectives, these ideas and patterns — they linger, they stay with you, even if you end up in another language. And that is powerful enough to keep on learning new languages, because one of the best things that can happen to you when you’re trying to solve a problem is a change of perspective.
-
Programming Language Checklist: a fun take on "so you want to build your own language?"
- Static vs. dynamic languages: a literature review
- Polyglot Programming and the Benefits of Mastering Several Languages
- It's not what programming languages do, it's what they shepherd you to
- Ask HN: What do you code when learning a new language/framework?
There are only two kinds of languages: the ones people complain about and the ones nobody uses.
-- Bjarne Stroustrup (C++ creator)
Python
For Python feel free to checkout my professional Python education repository.
JavaScript
JavaScript is such a pervasive language that it's almost required learning.
-
mbeaudru/modern-js-cheatsheet: cheatsheet for the JavaScript knowledge you will frequently encounter in modern projects.
-
javascript-tutorial: comprehensive JavaScript guide with simple but detailed explanantions. Available in several languages.
Garbage collection
Programming paradigm
Reading
Refactoring
-
The Rule of Three, Coding Horror
- Every programmer ever born thinks whatever idea just popped out of their head into their editor is the most generalized, most flexible, most one-size-fits all solution that has ever been conceived.
- It is three times as difficult to build reusable components as single use components.
- A reusable component should be tried out in three different applications before it will be sufficiently general to accept into a reuse library.
- Refactor vs. Rewrite
- Tripping over the potholes in too many libraries
Regex
Releasing & deploying
Versioning:
Checklists:
Feature flags:
-
Flipping out, Flickr. One of the first articles about feature flags.
-
Feature Flags, Toggles, Controls, a website documenting feature flags, from Launch Darkly.
-
Feature Toggles (aka Feature Flags), Pete Hodgson, martinFowler.com. Comprehensive article on the topic.
- Deliver new functionality to users rapidly but safely
- Release Toggles allow incomplete and un-tested codepaths to be shipped to production as latent code which may never be turned on.
- Experiment Toggles are used to perform multivariate or A/B testing.
- Ops Toggles control operational aspects of our system's behavior.
- Permissioning Toggles change the features or product experience that certain users receive.
- Static vs dynamic toggles
- Long-lived toggles vs transient toggles
- Savvy teams view their Feature Toggles as inventory which comes with a carrying cost, and work to keep that inventory as low as possible.
-
Feature Flags Best Practices: Release Management, LaunchDarkly
-
How we ship code faster and safer with feature flags, Github.
-
Flipr: Making Changes Quickly and Safely at Scale, Uber
Testing in production:
- Why We Leverage Multi-tenancy in Uber's Microservice Architecture
-
Developing in Production
- Complex systems have emergent behavior, producing epiphenomenon that only appears with sufficient scale.
- Wood's theorem: As the complexity of a system increases, the accuracy of any single agent’s own model of that system decreases rapidly.
- The more tools and code that you add to create elements in a system, the harder it is to replicate an environment encompassing those tools and code.
- At the core of testing in production is the idea of splitting deployments (of artifacts) from releases (of features).
-
Testing in Production: the hard parts, Cindy Sridharan
- The whole point of [actual] distributed systems engineering is you assume you’re going to fail at some point in time and you design the system in such a way that the damage, at each point is minimized, that recovery is quick, and that the risk is acceptably balanced with cost.
- How can you cut the blast radius for a similar event in half?
- Differentiate between deployment (0 risk) and release
- Build a deploy-observe-release pipeline
- Make incremental rollouts the norm (canaries, %-based rollouts, etc.)
- Test configuration changes just like you test code
- Default to roll back, avoid fixing forward (slow!)
- Eliminate gray failures - prefer crashing to degrading in certain cases
- Prefer loosely coupled services at the expense of latency or correctness
- Use poison tasters (isolate handling of client input)
- Implement per-request-class backpressure
- Have proper visibility from a client/end-user standpoint (client-side metrics)
- Testing in Production, the safe way
Search
Security
- 📖 Penetration Testing: A Hands-On Introduction to Hacking, Georgia Weidman
- Penetration Testing Tools Cheat Sheet
- A practical guide to securing macOS
- Web Application Security Guide/Checklist
-
Reckon you've seen some stupid security things?: everything not to do.
- Checklist of the most important security countermeasures when designing, testing, and releasing your API
-
OWASP Cheat Sheet Series: a series of cheat sheets about various security topics.
-
Secure by Design, a book review by Henrik Warne.
- There is a big overlap between secure code and good software design
- Every domain value should instead be represented by a domain primitive.
- External input needs to be validated before it is used in the system, in the following order: origin, size, lexical content, syntax, semantics.
- Entities should be consistent at creation, have limited operation, shouldn't be sharing mutable objects.
- Three Rs to do every few hours: rotate secrets automatically, repave servers and applications (redeploy on clean footprint), repair vulnerable.
- Don’t use exceptions for the control flow.
-
OWASP Top Ten Web Application Security Risks
- ukncsc/zero-trust-architecture: Principles to help you design and deploy a zero trust architecture
- 🏙 Minimum Viable Security
- The Open Software Assurance Maturity Model
- Security by Obscurity is Underrated
-
Don't Wanna Pay Ransom Gangs? Test Your Backups, Krebs on Security
- The Beginner’s Guide to Passwords
- Learnings from 5 years of tech startup code audits
-
API Tokens: A Tedious Survey: don't use JWT.
Training for developers:
List of resources:
Shell (command line)
SQL
System administration
System architecture
Reading lists:
Blogs:
-
High Scalability: great blog about system architecture, its weekly review article are packed with numerous insights and interesting technology reviews. Checkout the all-times favorites.
Books:
Articles:
Microservices/splitting a monolith:
Scalability
Reliability
- I already mentioned the book Release it! above. There's also a presentation from the author.
- Service Recovery: Rolling Back vs. Forward Fixing
-
How Complex Systems Fail
- Catastrophe requires multiple failures – single point failures are not enough.
- Complex systems contain changing mixtures of failures latent within them.
- Post-accident attribution to a ‘root cause’ is fundamentally wrong.
- Hindsight biases post-accident assessments of human performance.
- Safety is a characteristic of systems and not of their components
- Failure free operations require experience with failure.
- 🧰 Testing Distributed Systems
Resiliency
Site Reliability Engineering (SRE)
Note: this section is only about SRE as a role. Checkout the System Architecture for more content related to reliability.
Books:
- 📖 Site Reliability Engineering
- Written by members of Google's SRE team, with a comprehensive analysis of the entire software lifecycle - how to build, deploy, monitor, and maintain large scale systems.
Articles:
-
Graduating from Bootcamp and interested in becoming a Site Reliability Engineer?: a great collection of resources to learn about SRE.
-
Operating a Large, Distributed System in a Reliable Way: Practices I Learned, Gergely Orosz.
- A good summary of processes to implement.
-
Production Oriented Development
- Code in production is the only code that matters
- Engineers are the subject matter experts for the code they write and should be responsible for operating it in production.
- Buy Almost Always Beats Build
- Make Deploys Easy
- Trust the People Closest to the Knives
- QA Gates Make Quality Worse
- Boring Technology is Great.
- Non-Production Environments Have Diminishing Returns
- Things Will Always Break
-
Meaningful availability
- A good availability metric should be meaningful, proportional, and actionable. By "meaningful" we mean that it should capture what users experience. By "proportional" we mean that a change in the metric should be proportional to the change in user-perceived availability. By "actionable" we mean that the metric should give system owners insight into why availability for a period was low. This paper shows that none of the commonly used metrics satisfy these requirements…
- 🏙 High Reliability Infrastructure migrations, Julia Evans.
- 🏙 The Paradox of Alerts: why deleting 90% of your paging alerts can make your systems better, and how to craft an on-call rotation that engineers are happy to join.
Reliability is the one feature every customer users. -- An auth0 SRE.
Resources:
Technical debt
-
TechnicalDebt, Martin Fowler.
-
Fixing Technical Debt with an Engineering Allocation Framework
- You don't need to stop shipping features to fix technical debt
- Communicate the business value
-
Ur-Technical Debt
- Today, any code that a developer dislikes is branded as technical debt.
- Ward Cunningham invented the debt metaphor to explain to his manager that building iteratively gave them working code faster, much like borrowing money to start a project, but that it was essential to keep paying down the debt, otherwise the interest payments would grind the project to a halt.
- Ur-technical debt is generally not detectable by static analysis.
Testing
Why test:
-
Why bother writing tests at all?, Dave Cheney. A good intro to the topic.
- Even if you don’t, someone will test your software
- The majority of testing should be performed by development teams
- Manual testing should not be the majority of your testing because manual testing is O(n)
- Tests are the critical component that ensure you can always ship your master branch
- Tests lock in behaviour
- Tests give you confidence to change someone else’s code
How to test:
Test pyramid:
End-to-end tests:
Tools
Version control (Git)
Learning Git, courses and books:
Cheat sheets:
More specific topics:
Work ethics, productivity & work/life balance
-
Your non-linear problem of 90% utilization, Jason Cohen: why constantly running at 90% utilization is actually counter-productive.
-
Evidence-based advice on how to be successful in any jobs: most self-help advices are not research-based. The ones listed in this article are.
-
The Complete Guide to Deep Work
- The ability to perform deep work is becoming increasingly rare at exactly the same time it is becoming increasingly valuable in our economy.
- Choose Your Deep Work Strategy
- Build a Deep Work Routine
- Discipline #1: Focus on the Wildly Important
- Discipline #2: Act on the Lead Measures
- Discipline #4: Create a Cadence of Accountability
- Our Ability for Deep Work is Finite
- The Craftsman Approach to Tool Selection
- Stop Using Social Media
- Get Your Boss on Board With Deep Work
-
Every productivity thought I've ever had, as concisely as possible
- Context intentionality as the key difference between home and every other place on planet earth
- Rules are about exceptions
-
Makers, Don't Let Yourself Be Forced Into the 'Manager Schedule'
- Research shows that it takes as long as 30 minutes for makers to get into the flow
- Use maker-manager office hours
- Communication can happen at a quieter asynchronous frequency in the form of thoughtful, written discussions rather than soul-sucking meetings or erratic one-line-at-a-time chat messages
- Build a team knowledge base to minimize repetitive questions and allow self-onboarding.
-
100 Tips for a Better Life
- Deficiencies do not make you special. The older you get, the more your inability to cook will be a red flag for people.
- History remembers those who got to market first. Getting your creation out into the world is more important than getting it perfect.
- Discipline is superior to motivation. The former can be trained, the latter is fleeting. You won’t be able to accomplish great things if you’re only relying on motivation.
- You do not live in a video game. There are no pop-up warnings if you’re about to do something foolish, or if you’ve been going in the wrong direction for too long. You have to create your own warnings.
- Cultivate a reputation for being dependable. Good reputations are valuable because they’re rare (easily destroyed and hard to rebuild). You don’t have to brew the most amazing coffee if your customers know the coffee will always be hot.
- Compliment people more. Many people have trouble thinking of themselves as smart, or pretty, or kind, unless told by someone else. You can help them out.
- 🏙 2011 GTD Getting Things Done
- Build tools around workflows, not workflows around tools
- Rethinking Best Practices
- The Cult of Done Manifesto
"Do what you love until you love to Do" I often think about the “Read what you love until you love to read” comment from @naval, and this is a good generalization. My experience has been that it is easier to educate a Do-er than to motivate the educated; you have to believe you can Do before you embark on an effort. – John Carmack
Web development
Writing (communication, blogging)
➡️ See also my engineering-management list
-
Undervalued Software Engineering Skills: Writing Well
- From the HN discussion: "Writing a couple of pages of design docs or an Amazon-style 6 pager or whatever might take a few days of work, but can save weeks or more of wasted implementation time when you realise your system design was flawed or it doesn't address any real user needs."
-
Sell Yourself Sell Your Work
- If you've done great work, if you've produced superb software or fixed a fault with an aeroplane or investigated a problem, without telling anyone you may as well not have bothered.
-
The Writing Well Handbook
- Ideas — Identify what to write about
- First Drafts — Generate insights on your topic
- Rewriting — Rewrite for clarity, intrigue, and succinctness
- Style — Rewrite for style and flow
- Practicing — Improve as a writer
-
Write Simply, Paul Graham
- Writing is Thinking: Learning to Write with Confidence
-
It's time to start writing explains why Jeff Bezos banned PowerPoint at Amazon.
- The reason writing a good 4 page memo is harder than "writing" a 20 page powerpoint is because the narrative structure of a good memo forces better thought and better understanding of what's more important than what, and how things are related.
- Powerpoint-style presentations somehow give permission to gloss over ideas, flatten out any sense of relative importance, and ignore the interconnectedness of ideas.
-
Programming and Writing, Antirez
- Writing one sentence per line
-
Ask HN: How to level up your technical writing?. Lots of great resources.
-
Patterns in confusing explanations, Julia Evans
- Technical Writing for Developers

If you’re overthinking, write. If you’re underthinking, read.
– @AlexAndBooks_
Resources & inspiration for presentations
Keeping up-to-date
Website and RSS feeds (I use Feedly):
安全:
ニュースレター:
概念
用語集