Table des matières
- Programmation professionnelle - À propos de cette liste
- Principes
- Contribuant à cette liste
- Livres à lire
- Articles à lire
- Autres documents généraux et liste de ressources
- Autres listes
- Livres
- Articles
- Axiomes
- Cours
- Sujets
- Algorithme et structures de données
- Conception et développement de l'API
- Attitude, habitudes, état d'esprit
- Authentification / autorisation
- Automation
- Meilleures pratiques
- Au-delà de l'ingénierie logicielle et aléatoire
- Biais
- Entreprise
- Cache
- Croissance de carrière
- Choisir votre prochaine / première opportunité
- Se rendre au personnel Eng
- Ensembles de caractères
- Échecs
- Nuages
- Revues de code
- Codage et qualité de code
- Communication
- Compilateurs
- Configuration
- Intégration continue (IC)
- Bases de données
- Formats de données
- Science des données / génie des données
- Débogage
- Design (visuel, UX, interface utilisateur, typographie)
- Conception (modélisation OO, architecture, motifs, anti-motifs, etc.)
- Conception: schéma de base de données
- Design: motifs
- Conception: simplicité
- Dev Environment & Tools
- Docker
- Documentation
- Dot
- Éditeurs et IDE
- E-mail
- Gestion de l'ingénierie
- Exercices
- Expérimentation
- Programmation fonctionnelle (FP)
- Développement de jeux
- Graphique
- Matériel
- Http
- Humour
- Réponse des incidents (oncall, alerte, pannes, lutte contre les incendies, post-mortem)
- Internet
- Interview
- Kubernetes
- Modèle de grande langue (LLM)
- Apprendre et mémoriser
- Licences (légales)
- Linux (gestion du système)
- À faible code / sans code
- Assemblage de bas niveau
- Apprentissage automatique / AI
- Mathématiques
- Commercialisation
- Réseau
- Observabilité (surveillance, journalisation, manipulation des exceptions)
- Enregistrement
- Organisation d'erreur / exception
- Métrique
- Surveillance
- Open source
- Système d'exploitation (OS)
- Surenchérir
- Performance
- Gestion des connaissances personnelles (PKM)
- Productivité personnelle
- Perspective
- Confidentialité
- Résolution de problèmes
- Gestion des produits pour les ingénieurs logiciels
- Gestion de projet
- Langues de programmation
- Python
- Javascrip
- Collection des ordures
- Programmation paradigme
- Parler en public (présentation)
- En lisant
- Refactorisation
- Expirat
- Libérer et déploier
- Versioning
- Listes de contrôle
- Fonctionnalités
- Test de production
- Fiabilité
- Recherche
- Sécurité
- Shell (ligne de commande)
- SQL
- Administration système
- Architecture du système
- Modèles d'architecture
- Microservices / fendre un monolithe
- Évolutivité
- Ingénierie de fiabilité du site (SRE)
- Dette technique
- Essai
- Outils
- Système de type
- Typographie
- Contrôle de version (GIT)
- Éthique du travail, productivité et équilibre travail / vie privée
- Développement Web
- Écriture (communication, blogging)
- Ressources et inspiration pour les présentations
- Rester à jour
- Concepts
- Mes autres listes
Programmation professionnelle - À propos de cette liste
Donnez-moi six heures pour couper un arbre et je passerai les quatre premiers à aiguiser la hache. (Abraham Lincoln)
Une collection de ressources complètes pour les programmeurs.
Le but de cette page est de faire de vous un développeur plus compétent. Vous ne trouverez que des ressources que j'ai trouvées vraiment inspirantes, ou qui sont devenues des classiques intemporels.
Principes
- Cette page n'est pas censée être complète. J'essaie de le garder léger et pas trop écrasant.
- La sélection des articles est opinionnée.
- Je ne suis pas nécessairement d'accord ou n'approuve chaque ligne écrite dans chacune de ces ressources. Il en va de même pour leurs auteurs: je n'approuve pas tout que chacun de ces auteurs a dit et je dirai jamais.
Articles:
- ? : Liste des ressources
- : livre
- ? : Vidéo / extrait de film / film / discours
- ? : Diapositives / présentation
- ️: doit lire
- ? : papier
Contribuant à cette liste
N'hésitez pas à ouvrir un RP pour contribuer!
Je n'ajouterai pas tout: comme indiqué ci-dessus, j'essaie de garder la liste concise.
Livres à lire
J'ai trouvé ces livres incroyablement inspirants:
- The Pragmatic Programmer: de compagnon à maître: le livre pratique le plus inspirant et le plus utile que j'ai lu sur la programmation.
- Code complet: Un manuel pratique de construction de logiciels: un bel ajout au programmeur pragmatique, vous donne le cadre nécessaire pour parler du code.
- Libérez-le! Cela vous donnera environ 3 ans d'expérience dans le monde réel.
- Règles d'évolutivité: 50 principes pour la mise à l'échelle des sites Web
- L'interface de programmation Linux: un manuel de programmation système Linux et Unix: en dehors de vous enseigner presque tout ce que vous devez savoir sur Linux, ce livre vous donnera un aperçu de l'évolution des logiciels et de la valeur d'avoir des interfaces simples et élégantes.
- Structure et interprétation des programmes informatiques (GRATUIT): L'un des manuels les plus influents de l'informatique (écrit et utilisé au MIT), le SICP a été influent dans l'éducation CS. BYTE a recommandé SICP "pour les programmeurs professionnels qui sont vraiment intéressés par leur profession".
Il existe des livres gratuits disponibles, notamment:
- Développement de logiciels professionnels: assez complet et un bon compagnon de cette page. Les chapitres gratuits sont principalement axés sur les processus de développement de logiciels: conception, test, rédaction de code, etc. - et pas tant sur la technologie elle-même.
- ? VHF / Free-Programming-books
- ? Ebookfoundation / Free-programming-books
Articles à lire
- Conseils pratiques pour les nouveaux ingénieurs logiciels
- En tant qu'ingénieur senior
- Les leçons apprises dans le développement de logiciels: l'un de ces articles qui vous donnent des années de leçons durement gagnées, le tout dans un court article. Doit lire.
- Les choses que j'ai apprises à la dure
- Spec d'abord, puis code
- Les tests font de meilleures API
- La pensée future est la saccagé future
- La documentation est une lettre d'amour à votre futur moi
- Parfois, il vaut mieux laisser l'application s'écraser que de ne rien faire
- Comprendre et rester à l'écart du culte de la cargaison
- "Le bon outil pour le travail" est juste de pousser un programme
- Apprenez la programmation fonctionnelle des bases
- Utilisez toujours les fuseaux horaires avec vos dates
- Utilisez toujours UTF-8
- Créer des bibliothèques
- Apprenez à surveiller
- Explicite est meilleur que implicite
- Les entreprises recherchent des spécialistes mais gardent des généralistes plus longtemps
- La meilleure façon sécurisée de gérer les données des utilisateurs n'est pas de les capturer
- Quand il est temps de s'arrêter, il est temps de s'arrêter
- Vous êtes responsable de l'utilisation de votre code
- Ne dis pas "c'est fait" quand ce n'est pas
- Faites attention à la façon dont les gens réagissent
- Méfiez-vous des micro-agressions
- Gardez une liste de "choses que je ne sais pas"
- Signes que vous êtes un bon programmeur (tout ce ici n'est pas génial - certains points sont contre-productifs)
- L'instinct d'expérimenter d'abord
- Détachement émotionnel du code et du design
- Désireux de réparer ce qui n'est pas cassé
- Fasciné par l'incompréhensible
- Obligé d'enseigner
- Patience incorruptible
- Une poursuite destructrice de la perfection
- ENCYCLOPÉDIQUE COMPRISE DE LA PLATEFORME
- Pense dans le code
- Quand à Rome, fait comme les Romains
- Crée leurs propres outils
- Indifférent à la hiérarchie
- Excité par l'échec
- Indifférent aux circonstances
- Remplace l'impulsion de l'engagement
- Motivé par les expériences
- 7 vérités absolues que je suis sans développant en tant que développeur junior
- Au début de votre carrière, vous pouvez apprendre 10 fois plus dans une équipe de soutien en 1 an, que le codage par vous-même
- Chaque entreprise a des problèmes, chaque entreprise a une dette technique.
- Être trop opiniâtre sur des sujets avec qui vous manquent d'expérience du monde réel est assez arrogant.
- De nombreux pourparlers de conférence couvrent la preuve des concepts plutôt que des scénarios du monde réel.
- Faire face à l'héritage est complètement normal.
- L'architecture est plus importante que le nitpicking.
- Concentrez-vous sur l'automatisation sur la documentation le cas échéant.
- Avoir une dette technique est sain.
- Les ingénieurs seniors doivent développer de nombreuses compétences en plus de la programmation.
- Nous sommes tous encore juniors dans certaines régions.
- Comment créer un bon logiciel
- Un bon résumé de haut niveau des pratiques d'ingénierie fondamentales.
- La cause profonde du mauvais logiciel a moins à voir avec des choix d'ingénierie spécifiques, et plus à voir avec la gestion des projets de développement.
- Il n'existe pas de bonne ingénierie platoniquement: cela dépend de vos besoins et des problèmes pratiques que vous rencontrez.
- Les logiciels doivent être traités non pas comme un produit statique, mais comme une manifestation vivante de la compréhension collective de l'équipe de développement.
- Les projets logiciels échouent rarement car ils sont trop petits; Ils échouent parce qu'ils deviennent trop gros.
- Méfiez-vous des objectifs bureaucratiques se faisant passer pour des déclarations de problème. Si notre objectif final est d'améliorer la vie des citoyens, nous devons reconnaître explicitement les choses qui aggravent leur vie.
- La construction de logiciels ne consiste pas à éviter l'échec; Il s'agit de défaut stratégiquement aussi rapidement que possible d'obtenir les informations dont vous avez besoin pour construire quelque chose de bien.
- Comment être un ingénieur -10x
- Annuler la sortie de 10 ingénieurs.
- Tenez 10 ingénieurs en otage dans une discussion technique.
- Déchet 10 semaines de salaire sur les coûts des nuages.
- Paste 400 heures d'ingénierie sur une mauvaise architecture.
- Encourir 400 heures de triage de bogues.
Autres documents généraux et liste de ressources
Autres listes
- Liuchong / Awesome-Roadmaps: une liste organisée de feuilles de route.
Livres
- Le manuel de l'imposteur - 30 $. De l'auteur: "Je n'ai pas de diplôme CS? Je ne le fais pas non plus - c'est pourquoi j'ai écrit ce livre."
- Le livre informatique
Articles
- Mr-mig / Every-programmeur-Sould-Know: une collection de choses (principalement) techniques que chaque développeur de logiciels devrait savoir
- Lois célèbres du développement de logiciels
- La bibliothèque des constructeurs Amazon
- Il y a une liste des meilleurs articles de ce fil Twitter
- Kdeldycke / Awesome-Falsehood: Falsehood Les programmeurs croient en
- hellera / programming-talks
- Techyaks: liste des conférences
- Des discussions qui ont changé ma façon de penser la programmation
- Ce que chaque major d'informatique devrait savoir
- kamranahmedse / développeur-roadmap
- MTDVIO / Every-Programmer-Should-Know: une collection de choses (principalement) techniques que chaque développeur de logiciels devrait savoir
- Les attentes de Mike Acton envers les ingénieurs logiciels professionnels
- Des choses qu'ils ne vous ont pas appris sur l'ingénierie logicielle
- La connaissance du domaine est plus importante que vos compétences de codage
- Le code est secondaire. La valeur commerciale est la première.
- Vous travaillez avec l'incertitude la plupart du temps
- Nous surestimons notre capacité à court terme, mais sous-estimons notre capacité à long terme.
- La spécialisation est pour les insectes.
- Vous voulez un avantage injuste dans votre carrière technologique? Consommer du contenu destiné à d'autres rôles
- La compréhension interfonctionnelle est essentielle dans les entreprises technologiques modernes
- Aide à éviter de sous-estimer l'importance et la difficulté d'autres rôles
- Vous aide à être stratégique dans votre interaction avec les personnes dans ce rôle
- Apprenez-vous à programmer dans dix ans
Axiomes
- Préceptes - urbit
- Les données sont meilleures que le code.
- L'exactitude est plus importante que la performance.
- Déterministe bat Heuristic.
- Cent lignes de simplicité valent mieux que vingt lignes de complexité.
- Si vos abstractions fuisent, ce n'est pas dû à une loi de l'univers; Vous sucez simplement le résumé. Habituellement, vous n'avez pas précisé l'abstraction assez étroite.
- Si vous évitez de changer une section de code par peur d'éveiller les démons, vous vivez dans la peur. Si vous restez dans les limites confortables de la petite section du code que vous avez écrit ou que vous connaissez bien, vous n'écrirez jamais le code légendaire. Tout le code a été écrit par des humains et peut être maîtrisé par les humains.
- S'il y a clairement une bonne façon de faire quelque chose et une mauvaise façon, faites-le de la bonne façon. Le codage nécessite une discipline incroyable.
- La meilleure façon d'obtenir la bonne réponse est de l'essayer dans le mauvais sens.
- La pratique vous dit que les choses sont bonnes ou mauvaises; La théorie vous explique pourquoi.
- Ne pas être qualifié pour résoudre un problème n'est pas une raison de ne pas le résoudre.
- Si vous ne comprenez pas un système que vous utilisez, vous ne le contrôlez pas. Si personne ne comprend le système, le système contrôle.
- Règles de base intégrées
- 50 idées qui ont changé ma vie
- Réflexions sur 10 000 heures de programmation
- 20 choses que j'ai apprises au cours de mes 20 ans en tant qu'ingénieur logiciel
Cours
- Google Tech Dev Guide
- Le semestre manquant de votre éducation CS, MIT. Comprend des conférences sur le shell, les éditeurs, la dispute de données, le GIT, le débogage et le profilage, la programmation de méta, la sécurité et la cryptographie.
- Mathématiques pour l'auto-procureur aventureux, Neil Sainsbury
- JWASHAM / CODING-interview-University: un plan d'étude informatique complet pour devenir ingénieur logiciel.
- Apprenez-vous en informatique: un ensemble d'opinion des meilleures ressources CS.
- OSSU / Computer-Science: Education autodidacte gratuite en informatique!
Sujets
Algorithme et structures de données
- Lisez les CLR. Vous pouvez regarder et télécharger le cours sur OCW - il existe également des cours plus récents.
- Ou le manuel de conception de l'algorithme
- Essayez quelques algorithmes sur le projet Euler
- CS 61B printemps 2023
Autres ressources:
- Algorithmes, Jeff Erickson
Soyons honnêtes: les algorithmes peuvent être un sujet assez sec. Cette question Quora répertorie une alternative d'apprentissage plus drôle, notamment:
- Algorithmes de gêne
- Algorithmes essentiels
- Visualisation de la structure des données
- ? 15 algorithmes de tri en 6 minutes
- Hachage
- Visualiser les algorithmes
- B-arbres et index de base de données
Exemples d'implémentations:
- Trekhleb / javascript-algorithms: algorithmes et structures de données implémentées en javascript
- Les algorithmes
Algorithmes dans les systèmes distribués:
- Algorithme de consensus de radeau
Conception et développement de l'API
Contenu de repos général:
- Styles architecturaux et conception d'architectures logicielles basées sur le réseau, Roy Fielding (l'inventeur de REST)
- Une collection de ressources utiles pour construire des API HTTP + JSON RESTful.
- Best Practices for Rest API Design, Stack Overflow Blog
- REST NON PUSTROW: A Guide de conception de l'API Perfect: Livre très complet sur la conception de l'API RESTful.
Exemples de lignes directrices:
- Directives de l'API REST de Microsoft
- API RESTFul et directives d'événements Zalando RESTFul
- Guide de conception de l'API de Google: un guide général de la conception de l'API en réseau.
- AIP-1: Objectif AIP et directives
- L'AIP signifie la proposition d'amélioration de l'API, qui est un document de conception fournissant une documentation concise de haut niveau pour le développement de l'API.
Sujets plus spécifiques:
- Pourquoi vous devriez utiliser des liens, pas des clés, pour représenter les relations dans les API, Martin Nally, Google
- "L'utilisation de liens au lieu des clés étrangères pour exprimer des relations dans les API réduit la quantité d'informations qu'un client doit connaître pour utiliser une API et réduit les façons dont les clients et les serveurs sont couplés les uns aux autres."
- Donnez-moi / événements, pas webhooks
- Les événements peuvent déverrouiller les fonctionnalités Webhook indispensables, comme permettre à vos consommateurs WebHook de rejouer ou de réinitialiser la position de leur abonnement WebHook.
- Déverrouiller la puissance du patch JSON
Attitude, habitudes, état d'esprit
- Mastering Programming, Kent Beck.
- Les traits d'un programmeur compétent
- Le Tao de la programmation: un ensemble de paraboles sur la programmation.
- La prise de possession est le moyen le plus efficace d'obtenir ce que vous voulez
- Trouver le temps de devenir un meilleur développeur
- Dix minutes par jour: comment Alex Allain a écrit un livre en moins de 200 heures, en écrivant 10 minutes par jour.
- Les soins et l'alimentation des ingénieurs logiciels (ou pourquoi les ingénieurs sont grincheux)
- Dans le triumvirat des logiciels, des chefs de produit, des concepteurs et des ingénieurs logiciels, seuls les ingénieurs devraient désactiver leur esprit créatif et produire.
- Les ingénieurs et les chefs de produit ont tendance à penser, à tort, que les spécifications ou les exigences du produit sont équivalents au manuel de meubles d'Ikea.
- C'est l'une des meilleures choses qui rendent les ingénieurs grincheux: les priorités en constante évolution.
- Même si de nombreux ingénieurs se plaindront que les chefs de produit changent d'avis, presque aucun ne représentera cela dans leurs estimations temporelles.
- Les programmes d'informatique ne consistent pas à vous préparer aux tâches auxquelles vous êtes confronté dans l'industrie.
- Lorsqu'il y a plus d'ingénieurs que ce qui peut être utilisé, le temps d'ingénierie finit par s'éloigner du développement et de la planification, de la synchronisation et de la coordination.
- Impliquer les ingénieurs dans le processus créatif
- Donnez aux ingénieurs des opportunités d'être créatives.
- Encouragez les congés.
- Laissez-les coder
- Exprimer une appréciation
- L'ingénieur logiciel axé sur les produits, Gergely Orosz
- Les grands ingénieurs de produits savent que les produits aimables minimaux ont besoin de la bonne profondeur
- Les ingénieurs à l'esprit produit cartactent rapidement les cas de bord et pensez à des moyens de réduire les travaux sur eux: apporter souvent des solutions qui ne nécessitent aucun travail d'ingénierie
- S'engager dans la recherche des utilisateurs et le support client
- Apporter des suggestions de produits bien soutenues à la table
- Offrir des compromis de produit / ingénierie
- 40 leçons de 40 ans, Steve Schlafman
- Si vous voulez faire des progrès sur les choses qui comptent le plus, vous devez décider qui vous allez décevoir. C'est inévitable.
- Le meilleur investissement que vous pouvez faire est votre propre éducation. N'arrêtez jamais d'apprendre. Le deuxième meilleur investissement que vous pouvez faire est de construire votre réseau grâce à des interactions authentiques et significatives. C'est ce que vous savez et qui vous savez.
- Vous n'obtiendrez jamais ce que vous ne demanderez pas ou ne chercherez pas activement. Allez-y!
- Il ne s'agit pas de la lumière au bout du tunnel. C'est le tunnel. Apparaître tous les jours et profiter du processus.
- Un grand coéquipier met toujours l'organisation et son objectif avant ses propres intérêts.
- Choisissez vos taches. Nous avons un temps limité et notre cerveau ne peut que traiter autant. La concentration est la clé. Choisissez judicieusement.
- Chaque personne a probablement du mal avec quelque chose. Soyez gentil. Être utile.
- Sur le codage, l'ego et l'attention
- L'esprit du débutant accepte le fait que la connaissance absolue est infinie et que le score est donc une perte de temps.
- La maîtrise est simplement l'accumulation de l'élan, pas l'accumulation de connaissances.
- Faire face à la distraction de l'ego m'a appris à aimer le processus de résolution de problèmes. Cela m'a appris à aimer et à respecter le processus d'apprentissage. En conséquence, je suis plus productif. Je suis moins anxieux. Je suis un meilleur coéquipier. Je suis un meilleur ami et un meilleur penseur.
- Fixe vs croissance: les deux mentalités de base qui façonnent nos vies
- À quoi ressemble un grand ingénieur logiciel?
- Bon sommeil, bon apprentissage, bonne vie
- ? Steve Jobs: Si vous ne demandez pas d'aide, vous n'irez pas très loin
- Citations de programmation
- Être gentil
- Être gentil, c'est fondamentalement la responsabilité de votre impact sur les personnes qui vous entourent.
- Cela nécessite que vous soyez conscient de leurs sentiments et attention à la façon dont votre présence les affecte.
- Warren Buffett dit que 1 habitude simple sépare les gens qui réussissent de tout le monde
- La différence entre les gens qui réussissent et les gens qui réussissent, c'est que les gens qui réussissent vraiment disent non à presque tout.
- Comment avoir de la chance?
- Les programmeurs devraient cesser de célébrer l'incompétence, DHH
- La magie de la programmation est en grande partie juste des choses que vous ne savez pas encore.
- Ce n'est pas bien de penser que vous ne devriez pas être sur certains moyens vers la maîtrise, si vous avez l'intention de faire de la programmation de votre carrière.
- Il n'y a pas de limite de vitesse
- N'attendez pas la motivation, agissez pour l'élan
- Commencez par une petite tâche. Ensuite, montez son élan.
- Les habitudes de codage les plus importantes
- Les habitudes de codage les plus importantes
- Étirements quotidiens
- Faire des pauses régulières
- Ne codez pas tard dans la nuit
- Améliorez votre environnement de codage
- Conseils pour de nouveaux développeurs de logiciels qui ont lu tous ces autres essais de conseils
- Les microservices ne sont pas le problème. Les personnes incompétentes sont
Le syndrome d'Imposter est sous-estimé: beaucoup de discussions se déroulent dans le surmonte du syndrome d'imposter. Je dis embrasser l'auto-scepticisme et douter de vous-même chaque jour. Dans une industrie rapide où beaucoup de vos connaissances expirent chaque année, même les personnes les plus juniors autour de vous préparent constamment les compétences que vous n'avez pas; Vous restez compétitif en postulant avec la détermination (et même la peur) du novice. L'avantage de ce tapis roulant est que chaque ingénieur est là-dessus: ce n'est pas parce que vous êtes un imposteur que d'autres personnes méritent plus que vous, parce que ce sont des imposteurs. Vous devez vous défendre, prendre des risques, vous tapoter le dos lorsque les choses se passent bien et, alors que vous commencez à créer des antécédents de résolution de problèmes, faites confiance à vos compétences et à votre adaptabilité. Ne vous y trompez pas: vous êtes aussi bon que le dernier problème que vous résolvez.
Dan Heller, construire une carrière dans le logiciel
J'avais déjà appris à ne jamais vider le puits de mon écriture, mais toujours à m'arrêter quand il y avait encore quelque chose là-bas dans la partie profonde du puits, et de le faire remplir la nuit des ressorts qui l'ont nourri. - Ernest Hemingway
- The Grug Breent Developer: Habits of Self Aware Programmer. Comme Tao de la programmation, un style différent.
Un bon jugement vient de l'expérience. L'expérience vient du mauvais jugement.
Procrastination
- Les nouvelles sont mauvaises pour vous - et abandonner la lecture vous rendra plus heureux, le gardien
- Les nouvelles trompeuses
- Les nouvelles sont hors de propos
- Les nouvelles n'ont pas de pouvoir explicatif
- Les nouvelles sont toxiques pour votre corps
- Les nouvelles augmentent les erreurs cognitives
- Les nouvelles inhibent la pensée
- Les nouvelles fonctionnent comme une drogue
- Les nouvelles perdent du temps
- Les nouvelles nous rend passifs
- La nouvelle tue la créativité
Authentification / autorisation
- Autorisation dans un monde de microservices
- Logique d'autorisation: les règles sont difficiles car elles évoluent avec le temps
- Le livre de Copenhague fournit une directive générale sur la mise en œuvre de l'authentique dans les applications Web
Automation
- L'automatisation doit être comme Iron Man, pas Ultron
Meilleures pratiques
- Pratiques d'ingénierie logicielle
Au-delà de l'ingénierie logicielle et aléatoire
- Pourquoi les ingénieurs logiciels aiment le travail du bois
Biais
Les biais ne s'appliquent pas à l'embauche. Par exemple, le biais d'attribution fondamental s'applique également lors de la critique du code de quelqu'un écrit il y a longtemps, dans un contexte totalement différent.
- Feuille de triage du biais cognitif. #embauche
Entreprise
- Paiements 101 pour un développeur
- Les 4 plus gros problèmes avec les systèmes de facturation maison
- ? Les 14 douleurs de construction de votre propre système de facturation
Cache
- Défis et stratégies de mise en cache, bibliothèque Amazon Builders
Croissance de carrière
- Les triangles conjoints de développement de niveau supérieur examinent comment définir un ingénieur senior.
- Dix principes de croissance en tant qu'ingénieur, Dan Heller.
- Ne vous appelez pas un programmeur, Patrick McKenzie.
- En tant que directeur de l'ingénierie
- Les conseils de carrière que j'aurais aimé avoir à 25 ans
- Une carrière est un marathon, pas un sprint
- La plupart du succès vient de la répétition, pas de nouvelles choses
- Si le travail était vraiment si génial, tous les riches auraient le travail
- La gestion est une question de gens, pas de choses
- Écoutez vraiment les autres
- Reconnaissez que le personnel est des personnes ayant une capacité émotionnelle finie
- Ne vous contentez pas de réseauter avec des gens de votre âge
- Ne sacrifiez jamais l'éthique personnelle pour une raison de travail
- Reconnaître que l'échec apprend
- Conseil de carrière, j'aurais aimé qu'on m'a donné quand j'étais jeune
- Ne vous concentrez pas trop sur les plans à long terme.
- Trouvez de bons penseurs et des appels froids ceux que vous admirez le plus.
- Attribuez une valeur élevée à la productivité pendant toute votre durée de vie.
- N'optimisez pas trop les choses qui ne sont pas votre priorité absolue.
- Lisez beaucoup et lisez des choses que les gens autour de vous ne lisent pas.
- Réfléchissez sérieusement sur le problème à hiérarchiser la résolution.
- Lisez plus l'histoire.
- Pourquoi les bons développeurs sont favorisés dans le malheur, Rob Walling. Ou pourquoi la direction pourrait ne pas être pour vous.
- Un guide pour utiliser votre carrière pour aider à résoudre les problèmes les plus urgents du monde
- Quel est le travail d'un ingénieur senior? Vous devez être plus qu'un simple contributeur individuel.
- De coder le diplômé du bootcamp à la construction de bases de données distribuées
- Lire des livres (et des papiers), pas des articles de blog
- Assumez-vous à votre trajectoire de carrière
- ? L'ingénieur bien arrondi comprend de grandes recommandations de livres.
- Paradigm Polyglot (Apprenez différentes langues et paradigmes)
- Base de données polyglot
- Protocole polyglot (de préférence TCP / IP et HTTP)
- Compétence avec outillage de construction, emballage et distribution
- Débogage, observabilité
- Déploiement, infra et DevOps
- Architecture et mise à l'échelle des logiciels
- Capacité à écrire des compilateurs, des interprètes et des analyseurs de jouets
- Capacité à écrire des jeux de jouets
- Capacité à comprendre l'analyse algorithmique
- Quelques conseils de carrière, Will Larson.
- Le conseil que vous obtenez est la tentative de quelqu'un de synthétiser ses expériences, pas une déclaration précise sur le fonctionnement du monde.
- Construisez un réservoir de prestige.
- Certaines personnes sont si bonnes dans quelque chose qu'ils finissent par être irremplaçables dans leur rôle actuel, ce qui les fait coincé dans leur rôle même s'ils sont un bon candidat pour des candidats plus intéressants.
- De grandes relations vous suivront partout où vous allez. De mauvais aussi.
- Au début de votre carrière, essayez de travailler dans autant de types d'entreprises différents et dans différents produits verticaux que possible.
- Astuce maléfique: évitez les choses "faciles"
- Le code ultime kata
- Traits d'un ingénieur logiciel senior: impact, perception, visibilité, influence, mentorat
- Génie logiciel - les pièces souples
- Pensez de manière critique et formulez-vous des arguments bien soulignés
- Maître les fondamentaux
- Concentrez-vous sur l'utilisateur et tout le reste suivra
- Apprenez à apprendre
- Comment posséder votre croissance en tant qu'ingénieur logiciel
- Le programmeur de quarante ans
- Mieux vous obtenez, moins vous ressemblez à tout le monde
- Vous apprenez des principes profonds en faisant les bases
- Regardez dans d'autres domaines, apprenez des autres domaines
- Faites attention aux conseils de productivité
- Les ingénieurs seniors vivent dans le futur
- À quoi ressemblerait une carte de votre carrière?
- Comment réussir sur Amazon (ou toute autre grande entreprise d'ailleurs)
À propos des ingénieurs seniors:
- Les développeurs juniors de mensonges croient à devenir senior
Choisir votre prochaine / première opportunité
- DÉCISIONS DE CARRIÈRE - par Elad Gil - Elad Blog
Se rendre au personnel Eng
- Je suis devenu ingénieur du personnel FAANG en 5 ans. Ce sont les 14 leçons que j'ai apprises en cours de route.
- L'ingénierie logicielle n'est pas seulement le codage. En fait, le codage en est une petite partie.
- Pipeline votre travail
- Soyez ouvert aux commentaires et écoutez. Comme, sérieusement, écoutez.
- Une excellente rétroaction est difficile à trouver; le chérir.
- Gardez un œil sur l'horizon (mais pas les deux).
- Déterminez ce qui compte et laissez partir le reste.
- La comparaison est vraiment le voleur de la joie.
- Le mentorat est une belle chose.
- Les bons jours, en général, ne se contentent pas de «se produire».
- Les conseils et les conseils ne sont que cela; Ce ne sont pas des règles.
- Les guides pour atteindre les rôles d'ingénierie du personnel, seront Larson
- Être visible
- Ressources supplémentaires sur l'ingénierie du personnel et plus
Ensembles de caractères
- Le minimum absolu de chaque développeur de logiciels doit absolument connaître positivement sur Unicode et les jeux de caractères (pas d'excuses!)
- Le minimum absolu que chaque développeur de logiciels doit connaître Unicode en 2023 (toujours pas d'excuses!)
Échecs
(Oui - les échecs obtiennent sa propre section :)
- Wiki de programmation à l'échec
- Comprimer les mouvements d'échecs
Nuages
- Guides ouverts / OG-AWS: un guide pratique des AWS
Revues de code
- Comment effectuer une revue de code, la documentation des pratiques d'ingénierie de Google.
- Revues post-engagement: une idée intéressante pour augmenter la vitesse des développeurs (il y a cependant quelques mises en garde).
- Comment faire tomber votre critique de code amoureux de vous
- Passez en revue votre propre code d'abord
- Écrivez une description de la liste de change claire
- Automatiser les trucs faciles
- Répondez aux questions avec le code lui-même
- Changements de portée étroite
- Changements fonctionnels et non fonctionnels séparés
- Répondre gracieusement aux critiques
- Solliciter astucieusement les informations manquantes
- Attribuer tous les liens avec votre critique
- Minimiser le décalage entre les cycles d'examen
- Comment faire des avis de code comme un humain
- Demandez à HN: Comment révisez-vous le code ?: Grande discussion sur les hackernews, pleine d'idées intéressantes.
- Pyramide de Code de Maslow
- Un autre sur le même sujet: la pyramide de revue de code
- Revue de code dans les équipes distantes: ensemble de règles très complètes.
- Aucune revue de code par défaut
- Responsabilité de la convention
Codage et qualité de code
- Écrire du code facile à supprimer, pas facile à étendre
- Les dix commandements de la programmation sans ego
- Code propre: un manuel de l'artisanat logiciel agile, Robert C. Martin. Décrit de nombreuses meilleures pratiques utiles. Un peu long. Il y a aussi une feuille de triche de code propre.
- Ce qu'est l'artisanat logiciel
- Nous sommes fatigués d'écrire de la merde.
- Nous n'accepterons pas le vieux mensonge stupide sur le nettoyage des choses plus tard.
- Nous ne croirons pas l'affirmation selon laquelle rapidement signifie sale.
- Nous ne permettrons à personne de nous forcer à nous comporter de manière non professionnelle.
- Conseils sur la dénomination des variables booléennes
- Il existe une convention pour préfixer les variables booléennes et les noms de fonction avec "IS" ou "Has".
- Essayer de toujours utiliser est, même pour les pluriels (
isEachUserLoggedIn
est meilleur que areUsersLoggedIn
ou isUsersLoggedIn
) - Évitez les préfixes personnalisés (
isPaidFor
est meilleur que wasPaidFor
) - Éviter les négatifs (
isEnabled
est meilleur que isDisabled
)
- Comment écrire du code incompatible
- KettanaTo / Naming-Cheatheet :: Directives complètes du langage-autochtone sur les variables NAMING. Maison du modèle A / HC / LC.
- ? Guides d'ingénierie de qualité
Communication
Voir aussi la section d'écriture
- Comment communiquer efficacement en tant que développeur
- Beaucoup de conseils et d'exemples concrets pour une écriture courte, moyenne et longue
- Que visualisez-vous lors de la programmation?
Compilateurs
- La page de ressources de l'écrivain du compilateur
- Kanaka / Mal: Mal - faire un lisp
Configuration
- Les inconvénients de JSON pour les fichiers de configuration, Martin Tournoij.
- Impossible d'ajouter des commentaires
- Citation excessive et bruit de syntaxe
- L'utilisation de DC (configuration déclarative) pour contrôler la logique n'est souvent pas une bonne idée.
- Vos configurations sont nulles? Essayez un vrai langage de programmation
- La plupart des formats de configuration modernes sont nuls
- Utilisez un vrai langage de programmation
Intégration continue (IC)
- Intégration continue, martinfowler.com
Bases de données
Voir aussi la section SQL.
- Une introduction en anglais simple au théorème de la capuche
- Théorème de Pacelc: «En cas de partitionnement du réseau (P) dans un système informatique distribué, il faut choisir entre la disponibilité (a) et la cohérence (C) (selon le théorème de la plafond), mais bien (e), même lorsque le système Exécute normalement en l'absence de partitions, il faut choisir entre la latence (L) et la cohérence (C). "
- Migrations de base de données sur les temps d'arrêt zéro (les exemples de code utilisent des rails, mais cela fonctionne très bien pour tout langage de programmation)
- Algorithmes derrière les systèmes de stockage modernes, file d'attente ACM
- Créons une base de données simple
- Lectures dans les systèmes de base de données, 5e édition
- Comparaison des types de bases de données: comment les types de bases de données ont évolué pour répondre aux différents besoins
- Comment fonctionne une base de données relationnelle
- Utilisez l'index, Luke
- Introduction du cours - MySQL pour les développeurs, PlanetScale
- Comment fonctionnent les moteurs de requête
- Pourquoi vous devriez probablement utiliser SQLite | Epic Web Dev
Nosql
- Modèles nosql
- NOSQL Bases de données: une enquête et des conseils de décision
- Le DynamoDB Docs a de superbes pages:
- Lire la cohérence
- De SQL à nosql
- Conception nosql pour DynamoDB
- Redis a expliqué
Postgres
- Opérations sûres pour PostgreSQL à volume élevé (ceci est pour PostgreSQL mais fonctionne également très bien pour les autres DBS).
- L'isolement des transactions dans Postgres, expliquée
- Exercices postgresql
- Fiche de triche des opérations de Postgres
- Utilisez simplement Postgres
- Postgres suffit
- Postgres: ne faites pas ça
- PostgreSQL et UUID comme clé primaire
Formats de données
- Les programmeurs de mensonges croient des numéros de téléphone,
libphonenumber
de Google. - Règles pour la saisie semi-automatique: spécifications approximatives pour les champs de saisie semi-automatique
- Les programmeurs de mensonges croient aux adresses
- Les programmeurs de mensonges croient des noms
- Kdeldycke / Awesome-Falsehood: Falsehood Les programmeurs croient en
- Comprendre les représentations des uuides, des ulides et des cordes
- Les programmeurs de mensonges croient des listes de mensonges
- Australie / Lord_Howe est le fuseau horaire le plus étrange
Science des données / génie des données
- Une douzaine sale: douze pièges d'interprétation métrique commune dans des expériences contrôlées en ligne
- DataStackTV / Data-iningineer-roadmap: Fonde de route pour devenir ingénieur de données
- Chemin d'apprentissage de l'ingénierie des données impressionnante
- Architectures émergentes pour l'infrastructure de données moderne
- Comment aller au-delà d'un lac de données monolithique à un maillage de données distribué
- Les plates-formes de données basées sur l'architecture Data Lake ont des modes de défaillance courants qui conduisent à des promesses non tenues à grande échelle.
- Nous devons considérer les domaines comme la préoccupation de première classe, appliquer la réflexion sur la plate-forme pour créer une infrastructure de données libre-service et traiter les données comme un produit.
- Mlops
- Plateforme Big Data d'Uber: 100+ pétaoctets avec latence infime
- SQL devrait être le choix par défaut de la logique de transformation des données
Débogage
Voir également la section de réponse aux incidents dans ce doc
- Résolution de problèmes de canard en caoutchouc
- Courir en caoutchouc
- Cinq pourquoi
- L'analyse des cinq mensonges
- Le vrai problème se révèle lorsque la technique fait partie d'un modèle.
- Les éléments d'action peuvent être très éloignés de la cause profonde.
- L'Infinite Hows critique la méthode Five Whys et défend un ensemble différent de questions à apprendre des incidents.
- Voir aussi: Erreurs humaines: modèles et gestion
- "Le problème avec les cinq pourquoi est qu'elle est visée au tunnel dans une explication linéaire et simpliste de la façon dont le travail se fait et des événements se transpirent."
- "L'erreur humaine devient un point de départ, pas une conclusion." (Dekker, 2009)
- "Quand nous demandons" comment? ", Nous demandons un récit."
- "En ce qui concerne les décisions et les actions, nous voulons savoir comment il était logique que quelqu'un fasse ce qu'il a fait."
- À chaque étape "pourquoi", une seule réponse sera sélectionnée pour une enquête plus approfondie. Demander "comment" encourage une exploration plus large.
- "Dans les enquêtes sur les accidents, comme dans la plupart des autres efforts humains, nous tombons en proie au principe de ce que vous regardez-vous Aller voir (ce que vous regardez), dans une large mesure, il déterminera ce que nous trouvons réellement (ce que vous trouverez). " (HollNagel, 2009, p. 85) (voir illustration de Wylfiwyf)
- «Une dernière raison pour laquelle une« cause profonde »peut être sélectionnée est qu'elle est politiquement acceptable comme cause identifiée. sont politiquement inacceptables. " (Nancy Leveson, Engineering a Safer World, p. 20)
- Bounded rationality: rational individuals will select a decision that is satisfactory rather than optimal
- The article provide concrete ways and questions to solicit stories from people, which will yield better insights.
- What were you expecting to happen?
- If you had to describe the situation to your colleague at that point, what would you have told?
- Did this situation fit a standard scenario?
- What were you trying to achieve?Were there multiple goals at the same time?Was there time pressure or other limitations on what you could do?
- See template here
- Linux Performance Analysis in 60,000 Milliseconds
- Post-Mortems at HubSpot: What I Learned From 250 Whys
- Debugging zine, Julian Evans
- If you understand a bug, you can fix it
- The Thirty Minute Rule: if anyone gets stuck on something for more than 30 minutes, they should ask for help
- How to create a Minimal, Reproducible Example , Stack Overflow
- Some ways to get better at debugging, Julia Evans
- Learn the codebase
- Learn the system (eg, HTTP stack, database transactions)
- Learn your tools (eg,
strace
, tcpdump
) - Learn strategies (eg, writing code to reproduce, adding logging, taking a break)
- Get experience: according to a study, "experts simply formed more correct hypotheses and were more efficient at finding the fault."
- What exactly is the 'Saff Squeeze' method of finding a bug?
- A systematic technique for deleting both test code and non-test code from a failing test until the test and code are small enough to understand.
- tcpdump is amazing, Julia Evans
- What we talk about when we talk about 'root cause'
Design (visual, UX, UI, typography)
I highly recommend reading The Non-Designer's Design Book. This is a pretty short book that will give you some very actionable design advices.
- If you're working on data, Edward Tufte's The Visual Display of Quantitative Information is considered a classic.
- The Universal Principles of Design will give you enough vocabulary and concepts to describe design challenges into words.
- Book recommendations from HackerNews
- ?Design for Non-Designers
Articles :
- 10 Usability Heuristics Every Designer Should Know
- Visibility of System Status
- The Match Between The System And The Real World
- Every system should have a clear emergency exit
- Don't forget that people spend 90% of their time interacting with other apps
- Recognition Rather Than Recall (recognition = shallow form of retrieval from memory, eg a familiar person, recall = deeper retrieval)
- ”Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.” – Antoine de Saint-Exupery
- Help Users Recognize, Diagnose, And Recover From Errors
- How to pick more beautiful colors for your data visualizations
- Visual design rules you can safely follow every time
Typograhy: see "Typography" section
Ressources:
- ? bradtraversy/design-resources-for-developers: design and UI resources from stock photos, web templates, CSS frameworks, UI libraries, tools...
Design (OO modeling, architecture, patterns, anti-patterns, etc.)
Here's a list of good books:
- Design Patterns: Elements of Reusable Object-Oriented Software: dubbed "the gang of four", this is almost a required reading for any developer. A lot of those are a bit overkill for Python (because everything is an object, and dynamic typing), but the main idea (composition is better than inheritance) definitely is a good philosophy.
- And their nefarious nemesis Resign Patterns
- Patterns of Enterprise Application Architecture: learn about how database are used in real world applications. Mike Bayer's SQLAlchemy has been heavily influenced by this book.
- Domain-Driven Design: Tackling Complexity in the Heart of Software, Eric Evans
- Clean Architecture, Robert C. Martin. Uncle Bob proposes an architecture that leverages the Single Responsibility Principle to its fullest. A great way to start a new codebase. Also checkout the clean architecture cheatsheet and this article.
- Game Programming Patterns: a book about design, sequencing, behavioral patterns and much more by Robert Nystrom explained through the medium of game programming. The book is also free to read online here.
One of the absolute references on architecture is Martin Fowler: checkout his Software Architecture Guide.
Articles:
- O'Reilly's How to make mistakes in Python
- Education of a Programmer: a developer's thoughts after 35 years in the industry. There's a particularly good section about design & complexity (see "the end to end argument", "layering and componentization").
- Domain-driven design, Wikipedia.
- On the Spectrum of Abstraction ?, Cheng Lou
- The “Bug-O” Notation, Dan Abramov
- Antipatterns
- Inheritance vs. composition: a concrete example in Python. Another slightly longer one here. One last one, in Python 3.
- Composition Instead Of Inheritance
- Complexity and Strategy: interesting perspective on complexity and flexibility with really good examples (eg Google Apps Suite vs. Microsoft Office).
- The Architecture of Open Source Applications
- The Robustness Principle Reconsidered
- Jon Postel: "Be conservative in what you do, be liberal in what you accept from others." (RFC 793)
- Two general problem areas are impacted by the Robustness Principle: orderly interoperability and security.
- Basics of the Unix Philosophy, Eric S Raymond
- Eight Habits of Expert Software Designers: An Illustrated Guide
You can use an eraser on the drafting table or a sledge hammer on the construction site. (Frank Lloyd Wright)
Ressources:
- ? Principes de conception
Design: database schema
- A humble guide to database schema design, Mike Alche
- Use at least third normal form
- Create a last line of defense with constraints
- Never store full addresses in a single field
- Never store firstname and lastname in the same field
- Establish conventions for table and field names.
Design: patterns
- KeystoneInterface, Martin Fowler.
- Build all the back-end code, integrate, but don't build the user-interface
- 101 Design Patterns & Tips for Developers
- Python Design Patterns: For Sleek And Fashionable Code: a pretty simple introduction to common design patterns (Facade, Adapter, Decorator). A more complete list of design patterns implementation in Python on Github.
- SourceMaking's Design Patterns seems to be a good web resource too.
- Anti-If: The missing patterns
Design: simplicity
- Simple Made Easy ?, Rich Hickey. This is an incredibly inspiring talk redefining simplicity, ease and complexity, and showing that solutions that look easy may actually harm your design.
Dev environment & tools
Outils
- Glances: An eye on your system
- HTTPie: a CLI, cURL-like tool for humans
- jq: command-line JSON processor
- tmux: terminal multiplexer
- htop: an interactive process viewer for Linux
- htop explained
- socat
- Visual guide to SSH tunnels
- casey/just: a command runner written in Rust (claims to be better than Makefile)
- Gazr: an opinionated way to define your
Makefile
Article about tools:
- The return of fancy tools
- Simple tools make you think a little more
- Drucker: "I'm not writing it down to remember it later, I'm writing it down to remember it now."
- Frictionless note-taking produces notes, but it doesn't produce memory.
Docker
See also the Python-specific section in charlax/python-education.
- Best Practices Around Production Ready Web Apps with Docker Compose
- Avoiding 2 Compose Files for Dev and Prod with an Override File
- Reducing Service Duplication with Aliases and Anchors
- Defining your
HEALTHCHECK
in Docker Compose not your Dockerfile - Making the most of environment variables
- Using Multi-stage builds to optimize image size
- Running your container as a non-root user
- Docker Best Practices for Python Developers
- Use multi-stage builds
- Pay close attention to the order of your Dockerfile commands to leverage layer caching
- Smaller Docker images are more modular and secure (watch out for Alpine though)
- Minimize the number of layers (
RUN
, COPY
, ADD
) - Use unprivileged containers
- Prefer
COPY
over ADD
- Cache python packages to the docker host
- Prefer array over string syntax
- Understand the difference between
ENTRYPOINT
and CMD
- Include a
HEALTHCHECK
instruction - Whenever possible, avoid using the
latest
tag. - Don't store secrets in images
- Use a
.dockerignore
file (include **/.git
, etc.) - Lint and Scan Your Dockerfiles and Images (eg with
hadolint
) - Log to stdout or stderr
- Docker Containers Security
Documentation
- Documentation-Driven Development
- Writing automated tests for your documentation: this should be required, IMO. Testing code samples in your documentation ensures they never get outdated.
- ? Documentation is king, Kenneth Reitz
- Keep a Changelog
- Architectural Decision Records (ADR): a way to document architecture decision.
- Documenting Architecture Decisions
- joelparkerhenderson/architecture-decision-record: examples and templates for ADR.
- And a CLI tool: npryce/adr-tools
- The documentation system
- Checklist for checklists
- Best practices for writing code comments
- Always be quitting
- Document your knowledge
- Train your replacement
- Déléguer
- By being disposable, you free yourself to work on high-impact projects.
- Write documentation first. Then build.
- Diátaxis: a systematic approach to technical documentation authoring
- There are four modes: tutorials, how-to guides, technical reference and explanation
- The docs goes into a lot of details about each model.
- ARCHITECTURE.md
- Two open source projects with great documentation (esbuild and redis)
The palest ink is more reliable than the most powerful memory. -- Chinese proverb
Dotfiles
- ? Awesome dotfiles: lots of great dotfiles.
- My dotfiles
Articles
- Setting Up a Mac Dev Machine From Zero to Hero With Dotfiles
Editors & IDE
- Sublime Text essential plugins and resources
- Bram Moolenaar (Vim author), Seven habits of effective text editing (presentation). This is about Vim but it contains good lessons about why investing time in learning how to be productive with your text editors pays off.
- VScode is one of the most popular text editors as of writing.
- Visual Studio Code Can Do That?, Smashing Magazine.
- Coding with Character
Vim
- ? vim-awesome
- ? Vimcasts
- ️ Is Vim Really Not For You? A Beginner Guide
- The first part of a series of 6 articles with lots of detailed and practical tips for using Vim efficiently.
- A Vim Guide for Advanced Users: more advanced shortcuts and commands
- Learning the vi and Vim Editors
- Practical Vim, Drew Neil
- Learn Vimscript the Hard Way
- VimGolf: nice challenges to learn Vim
- Vim anti-patterns
- Learn Vim For the Last Time: A Tutorial and Primer
- Vim Cheat Sheet & Quick Reference
- History and effective use of Vim
- Moving Blazingly Fast With The Core Vim Motions
- micahkepe/vimtutor-sequel: Vimtutor Sequel - Advanced Vim Tutor Lessons
- Vim Racer - An Online Game for VIM Navigation
Feel free to check my vim configuration and my vim cheatsheet.
Other editors:
E-mail
- Email explained from first principles
- ? Transactional Email Best Practices
Engineering management
Checkout my list of management resources.
Exercices
The best way to learn is to learn by doing.
- build-your-own-x: compilation of well-written, step-by-step guides for re-creating our favorite technologies from scratch
- Richard Feynman: "what I cannot create, I do not understand"
- The elevator programming game
- Challenging projects every programmer should try, Austin Z. Henley
- Challenging projects every programmer should try: text editor, space invaders, compiler (Tiny Basic), mini OS, spreadsheet, video game console emulator.
- More challenging projects every programmer should try: ray tracer, key-value store web API, web browser, stock trading bot.
- Let's Build a Regex Engine
- Write a time-series database engine from scratch
- 7 GUIs to build to learn fundamental UI programming skills
- A list of programming playgrounds, Julia Evans
- Write more "useless" software
Pratique:
- CodinGame
- Codewars
- Exercice
Expérimentation
- 8 annoying A/B testing mistakes every engineer should know
Functional programming (FP)
- Goodbye, Object Oriented Programming
- Functional Programming & Haskell ?: some good reasons to learn FP!
- Functional Programming Fundamentals: short introduction to FP and its advantages.
- OO vs FP, Robert C. Martin, The Clean Code Blog. A pretty interesting take on the differences between OOP and FP from an expert in OOP.
- OO is not about state. Objects are bags of functions, not bags of data.
- Functional Programs, like OO Programs, are composed of functions that operate on data.
- FP imposes discipline upon assignment.
- OO imposes discipline on function pointers.
- The principles of software design still apply, regardless of your programming style. The fact that you've decided to use a language that doesn't have an assignment operator does not mean that you can ignore the Single Responsibility Principle.
- Parse, don't validate
- Use a data structure that makes illegal states unrepresentable
- Push the burden of proof upward as far as possible, but no further
- Let your datatypes inform your code, don't let your code control your datatypes
- Don't be afraid to parse data in multiple passes
- Avoid denormalized representations of data, especially if it's mutable
- Use abstract datatypes to make validators “look like” parsers
- ? Programmation fonctionnelle
- Monads in 15 minutes
- hemanth/functional-programming-jargon: jargon from the functional programming world in simple terms
- The definitive guide to learning functional programming, Exercism
Games development
- Introduction · Joys of Small Game Development
Graphique
Matériel
- NandGame: build a computer from scratch.
- What Every Programmer Should Know About SSDs
- How To Make A CPU - A Simple Picture Based Explanation
HTTP
- Choosing an HTTP Status Code — Stop Making It Hard
- HTTPWTF
- 10 Surprising Things You Didn't Know About HTTP
- The HTTP crash course nobody asked for
Humour
- The Jeff Dean Facts
- Compilers don't warn Jeff Dean. Jeff Dean warns compilers.
- Unsatisfied with constant time, Jeff Dean created the world's first
O(1/N)
algorithm. - Jeff Dean mines bitcoins. In his head.
- The Daily WTF: Curious Perversions in Information Technology
Incident response (oncall, alerting, outages, firefighting, postmortem)
Also see this section on my list of management resources, "Incident response".
Also see the Debugging section in this doc.
- Incident Response at Heroku
- Described the Incident Commander role, inspired by natural disaster incident response.
- Also in presentation: Incident Response Patterns: What we have learned at PagerDuty - Speaker Deck
- The Google SRE book's chapter about oncall
- Writing Runbook Documentation When You're An SRE
- Playbooks “reduce stress, the mean time to repair (MTTR), and the risk of human error.”
- Using a template can be beneficial because starting from a blank document is incredibly hard.
- The Curse of Knowledge is a cognitive bias that occurs when someone is communicating with others and unknowingly assumes the level of knowledge of the people they are communicating with.
- Make your content easy to glance over.
- If a script is longer than a single line, treat it like code, and check it into a repository to be source control and potentially tested.
- Incident Review and Postmortem Best Practices, Gergely Orosz
- Computer Security Incident Handling Guide, NIST
- Incident Management Resources, Carnegie Mellon University
- Sterile flight deck rule, Wikipedia
- Shamir Secret Sharing It's 3am.
- Site Reliability Engineering and the Art of Improvisation has lots of good training ideas
- Walkthroughs of observability toolsets
- Decision requirements table building
- Team knowledge elicitation
- Asking the question, “Why do we have on-call?”
- Spin the Wheel of Expertise!
Alerting:
- My Philosophy On Alerting
- Pages should be urgent, important, actionable, and real.
- Err on the side of removing noisy alerts – over-monitoring is a harder problem to solve than under-monitoring.
- Symptoms are a better way to capture more problems more comprehensively and robustly with less effort.
- Include cause-based information in symptom-based pages or on dashboards, but avoid alerting directly on causes.
- The further up your serving stack you go, the more distinct problems you catch in a single rule. But don't go so far you can't sufficiently distinguish what's going on.
- If you want a quiet oncall rotation, it's imperative to have a system for dealing with things that need timely response, but are not imminently critical.
- This classical article has now become a chapter in Google's SRE book.
- ? 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.
Autopsie
- A great example of a postmortem from Gitlab (01/31/2017) for an outage during which an engineer's action caused the irremediable loss of 6 hours of data.
- Blameless PostMortems and a Just Culture
- A list of postmortems on Github
- Google's SRE book, Postmortem chapter is excellent and includes many examples.
- Human error models and management
- High reliability organisations — which have less than their fair share of accidents — recognise that human variability is a force to harness in averting errors, but they work hard to focus that variability and are constantly preoccupied with the possibility of failure
"Let's plan for a future where we're all as stupid as we are today."
– Dan Milstein
Example outline for a postmortem:
- Résumé exécutif
- Impact
- Number of impacted users
- Lost revenue
- Durée
- Team impact
- Chronologie
- Root cause analysis
- Leçons apprises
- Things that went well
- Things that went poorly
- Action items (include direct links to task tracking tool)
- Tasks to improve prevention (including training)
- Tasks to improve detection (including monitoring and alerting)
- Tasks to improve mitigation (including emergency response)
Internet
- How Does the Internet Work?
- How the web works
- Advice to young web developers
Interviewing
Note: this is about you as an interviewee, not as an interviewer. To check out my list of resources for interviewers, go to my engineering-management repository.
- System design interview for IT company
- Technical Interview Megarepo: study materials for SE/CS technical interviews
- How to Win the Coding Interview
- I spent 3 months applying to jobs after a coding bootcamp. Here's what I learned.
- Top 10 algorithms in Interview Questions
- Interactive Python coding interview challenges
- Tech Interview Handbook
- A complete computer science study plan to become a software engineer
- Interview advice that got me offers from Google, Microsoft, and Stripe
- A framework for grading your performance on programming interview problems
- Preparing for the Systems Design and Coding Interview, Gergely Orosz
- What I Learned from Doing 60+ Technical Interviews in 30 Days
- System Design Interview Guide for Senior Engineers, interviewing.io
Questions you should ask:
- Questions to ask your interviewer
- Questions to ask the company during your interview
- Interviewing the Interviewer: Questions to Uncover a Company's True Culture
- Twipped/InterviewThis: questions to ask prospective employers
- tBaxter/questions-for-employers: A big collection of useful questions to ask potential employers.
CV:
- The Red Flags on Your Resume
- What we look for in a resume
- We look for demonstrated expertise, not keywords
- We look for people who get things done
- We look for unique perspectives
- We care about impact, not meaningless metrics
- Why you shouldn't list certifications on LinkedIn
See also the exercises section in this document.
Kubernetes
- OWASP/www-project-kubernetes-top-ten
- Kubernetes Tutorial for Beginners: Basic Concepts
Large Language Model (LLM)
- What Is ChatGPT Doing… and Why Does It Work?, Stephen Wolfram
- Embeddings: What they are and why they matter
Learning & memorizing
Learn how to learn!
- How I Rewired My Brain to Become Fluent in Math: subtitled the building blocks of understanding are memorization and repetition .
- One Sure-Fire Way to Improve Your Coding: reading code!
- Tips for learning programming
- You can increase your intelligence: 5 ways to maximize your cognitive potential: forgive the clickbait title, it's actually a good article.
- How to ask good questions, Julia Evans.
- Stop Learning Frameworks
- Learning How to Learn: powerful mental tools to help you master tough subjects
- Why books don't work, Andy Matuschak.
- "As a medium, books are surprisingly bad at conveying knowledge, and readers mostly don't realize it."
- "In learning sciences, we call this model “transmissionism.” It's the notion that knowledge can be directly transmitted from teacher to student, like transcribing text from one page onto another. If only!"
- "By re-testing yourself on material you've learned over expanding intervals, you can cheaply and reliably commit huge volumes of information to long-term memory."
- Strategies, Tips, and Tricks for Anki: those advices work for any tool actually
- Add images. Our brains are wired visually, so this helps retention.
- Don't add things you don't understand.
- Don't add cards memorizing entire lists.
- Write it out. For wrong answers, I'll write it on paper. The act of writing is meditative. I really enjoy this.
- Keep on asking yourself why? why does this work? why does it work this way? Force yourself to understand the root of a topic.
- Cornell Method: when reading a topic, write out questions on the margins to quiz yourself.
- Pretend you have to teach it
- Use mnemonics phrases like PEMDAS for lists and other hard-to-remember topics.
- Delete cards that don't make sense or you don't want to remember anymore.
- Effective learning: Twenty rules of formulating knowledge
- Build upon the basics
- Stick to the minimum information principle: the material you learn must be formulated in as simple way as it is
- Cloze deletion is easy and effective: Kaleida's mission was to create a ... It finally produced one, called Script X. But it took three years
- Graphic deletion is as good as cloze deletion
- Avoid sets
- Avoid enumerations
- Combat interference - even the simplest items can be completely intractable if they are similar to other items. Use examples, context cues, vivid illustrations, refer to emotions, and to your personal life
- Personalize and provide examples - personalization might be the most effective way of building upon other memories. Your personal life is a gold mine of facts and events to refer to. As long as you build a collection for yourself, use personalization richly to build upon well established memories
- Provide sources - sources help you manage the learning process, updating your knowledge, judging its reliability, or importance
- Prioritize - effective learning is all about prioritizing.
- How to Remember Anything You Really Want to Remember, Backed by Science
- Quiz yourself
- Summarize and share with someone else.
- Connect what you just learned to experiences you previously had.
- How To Remember Anything Forever-ish: a comic about learning
- Get better at programming by learning how things work
- How to teach yourself hard things
- Building Your Own Personal Learning Curriculum
- Always do Extra
- Extra is finishing those two screens, but then researching a new library for form validation that might reduce the boilerplate code.
- Extra must be balanced against Normal Work.
- Extra must be aligned with your Normal Work.
- Against 3X Speed
- Lectures are most effective when they're only a component of the classroom experience
- Learning is about spaced repetition, not binge-reading books
- The Problems with Deliberate Practice
- Why Tacit Knowledge is More Important Than Deliberate Practice
- In Praise of Memorization
- You can't reason accurately without knowledge
- Memorizing organized your knowledge
- It stays with you
- Celebrate tiny learning milestones, Julia Evans.
- Keep a brag document
- You can do a lot "by accident"
- Fixing a bug can be milestone
- Why writing by hand is still the best way to retain information, StackOverflow
- ? Making Badass Developers - Kathy Sierra (Serious Pony) keynote
- How to study (with lots of cartoons from Calvin & Hobbes!)
- Manage your time
- Take notes in class & rewrite them at home
- Study hard subjects first & study in a quiet place
- Read actively & slowly, before & after class
- Faites vos devoirs
- Study for exams
- Take Exams
- Do research & write essays
- Do I really have to do all this?
- Are there other websites that give study hints?
- 10 Things Software Developers Should Learn about Learning
- ? Things I Learned the Hard Way, Bryan Cantrill
About flashcards:
- Augmenting Long-term Memory
- How to write good prompts: using spaced repetition to create understanding - also includes lots of insightful research papers.
- Effective learning: Twenty rules of formulating knowledge
- Rules for Designing Precise Anki Cards
- Fernando Borretti, Effective Spaced Repetition
- Anki-fy Your Life gets into why it makes sense to invest in your memory.
About Zettelkasten and PKM (personal knowledge management): see 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 à. — 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)
- Software Licenses in Plain English
Linux (system management)
- Welcome to Linux command line for you and me!
- Linux Performance, Brendan Gregg
Low-code/no-code
- How Levels.fyi scaled to millions of users with Google Sheets as a backend
Low-level, assembly
- Back to Basics, Joel Spolsky. Explains why learning low level programming is important.
- I think that some of the biggest mistakes people make even at the highest architectural levels come from having a weak or broken understanding of a few simple things at the very lowest levels.
- What's in a Linux executable?
- The Elements of Computing Systems: building a modern computer from first principles (nand2tetris).
- Old pattern powering modern tech
- Demystifying bitwise operations, a gentle C tutorial
- Understanding the Power of Bitwise Operators. No math needed
- Memory Allocation (an interactive article)
- Why does 0.1 + 0.2 = 0.30000000000000004?, Julia Evans (about floating point)
- Putting the "You" in CPU
- x86-64 Assembly Language Programming with Ubuntu
Machine learning/AI
- Transformers from Scratch
Mathématiques
Commercialisation
- goabstract/Marketing-for-Engineers
Réseau
- The Great Confusion About URIs
- A URI is a string of characters that identifies a resource. Its syntax is
<scheme>:<authority><path>?<query>#<fragment>
, where only <scheme>
and <path>
are mandatory. URL and URN are URIs. - A URL is a string of characters that identifies a resource located on a computer network. Its syntax depends on its scheme. Eg
mailto:[email protected]
. - A URN is a string of characters that uniquely identifies a resource. Its syntax is
urn:<namespace identifier>:<namespace specific string>
. Eg urn:isbn:9780062301239
- Everything you need to know about DNS
- Examples of Great URL Design
- Four Cool URLs - Alex Pounds' Blog
Observability (monitoring, logging, exception handling)
See also: Site Reliability Engineering (SRE)
Enregistrement
- 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
- The Audit Log Wall of Shame: list of vendors that don't prioritize high-quality, widely-available audit logs for security and operations teams.
- Guide on Structured Logs
Error/exception handling
- Error handling antipatterns in this repo.
- Writing Helpful Error Messages, Google Developers' course on Technical Writing
- Explain the problem
- Explain the solution
- Write clearly
Métrique
- 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…
- ? Meaningful Availability paper.
- This paper presents and evaluates a novel availability metric: windowed user-uptime
Surveillance
- 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)
- Implementing health checks
- IETF RFC Health Check Response Format for HTTP APIs
Open source
- Non-code contributions are the secret to open source success
Operating system (OS)
- The Linux Programming Interface: A Linux and UNIX System Programming Handbook: already mentioned above.
- Modern Operating Systems, Andrew Tanenbaum, Herbert Bos (not read)
- Operating Systems: Three Easy Pieces (free book, not read)
- Linux Kernel Development, Robert Love. A very complete introduction to developing within the Linux Kernel.
- The 10 Operating System Concepts Software Developers Need to Remember
- Play with xv6 on MIT 6.828
- macOS Internals
Over-engineering
- 10 modern software over-engineering mistakes
- A good example of over-engineering: the Juicero press (April 2017)
- You Are Not Google: the UNPHAT method to avoid cargo cult.
- Don't even start considering solutions until you Understand the problem. Your goal should be to “solve” the problem mostly within the problem domain, not the solution domain.
- eNumerate multiple candidate solutions. Don't just start prodding at your favorite!
- Trop réfléchir
- 1st poison: education.
- 2nd poison: marketing.
- 3rd poison: ego
- Solution: Stop trying to connect all the dots ahead of time. Embrace uncertainty and start doing.
- Don't Let Architecture Astronauts Scare You, Joel
- Sometimes smart thinkers just don't know when to stop, and they create these absurd, all-encompassing, high-level pictures of the universe that are all good and fine, but don't actually mean anything at all.
- Your typical architecture astronaut will take a fact like “Napster is a peer-to-peer service for downloading music” and ignore everything but the architecture, thinking it's interesting because it's peer to peer, completely missing the point that it's interesting because you can type the name of a song and listen to it right away.
“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
- Numbers Everyone Should Know
- Latency numbers every programmer should know
- Rob Pike's 5 Rules of Programming
- You can't tell where a program is going to spend its time.
- Mesure
- Fancy algorithms are slow when n is small, and n is usually small.
- Fancy algorithms are buggier than simple ones
- Data dominates.
- Performance comparison: counting words in Python, Go, C++, C, AWK, Forth, and Rust: a great way to learn about measuring performance.
- The Mathematical Hacker
- Four Kinds of Optimisation
Personal knowledge management (PKM)
- Zettelkasten Method
- How to build a second brain as a software developer
- Notes Against Note-Taking Systems
- An interesting contrarian take!
- I am waiting for any evidence that our most provocative thinkers and writers are those who rely on elaborate, systematic note-taking systems.
- I am seeing evidence that people taught knowledge management for its own sake produce unexciting work.
- MaggieAppleton/digital-gardeners
- Notes apps are where ideas go to die. And that's good.
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
Confidentialité
- Privacy Enhancing Technologies: An Introduction for Technologists, Katharine Jarmul, MartinFowler.com
Résolution de problèmes
- Dealing with Hard Problems
- Invert, always, invert
- Define the problem - what is it that you're trying to achieve?
- Invert it - what would guarantee the failure to achieve this outcome?
- Finally, consider solutions to avoid this failure
- ? Hammock Driven Development, Rick Hickey
- A classic talk on problem solving.
Product management for software engineers
See the Product management section on my entrepreneurship-resources list of resources.
- Checkout this newsletter produced by Posthog: Product for Engineers
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?
- The seven programming ur-languages: ALGOL, Lisp, ML, Self, Forth, APL, Prolog
- Lua: The Little Language That Could
- The Montréal Effect: Why Programming Languages Need a Style Czar
- TodePond/DreamBerd: a perfect programming language
There are only two kinds of languages: the ones people complain about and the ones nobody uses.
-- Bjarne Stroustrup (C++ creator)
List of resources:
- Great Works in Programming Languages
Python
For Python check out my professional Python education repository.
Javascrip
In this repository: check ./training/front-end/
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.
- 30 Days of JavaScript: 30 days of JavaScript programming challenge is a step-by-step guide to learn JavaScript programming language in 30 days.
- Unleash JavaScript's Potential with Functional Programming
Collection des ordures
- A Guide to the Go Garbage Collector: a very insightful guide about Go's GC
Programmation paradigme
- Imperative vs Declarative Programming, Tyler McGinnis.
- I draw the line between declarative and non-declarative at whether you can trace the code as it runs. Regex is 100% declarative, as it's untraceable while the pattern is being executed.
- ? Imperative vs Declarative Programming
Public speaking (presenting)
En lisant
- Papers we love: papers from the computer science community to read and discuss. Can be a good source of inspiration of solving your design problems.
- The morning paper: one CS research paper explained every morning.
- The Complete Guide to Effective Reading
- The benefits of note-taking by hand
- The Art of Reading More Effectively and Efficiently
- You should be reading academic computer science papers, Stack Overflow Blog
- How to Remember What You Read
- Take notes
- Rester concentré
- Mark up the book
- Make mental links
- Quit books
- Writing summaries is more important than reading more books
- In 1-2 sentences, what is the book about as a whole?
- What are the 3-4 central questions it tries to answer?
- Summarize the answers in one paragraph each.
- What are the most important things you have learned personally?
- There was an interesting contrarian take in the Hacker News thread: "Once I relaxed and decided, 'If the stuff in this book is good enough, my brain will keep it FOR me' both my satisfaction AND utility of books increased dramatically."
- You Are What You Read, Even If You Don't Always Remember It
- "I cannot remember the books I've read any more than the meals I have eaten; even so, they have made me.", Ralp Waldo Emerson
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
- The Best Regex Trick
- regex101: build, test, and debug regex
Releasing & deploying
- How we release so frequently
- How to deploy software, Zach Holman
- BlueGreenDeployment, Martin Fowler
- Move fast and break nothing, Zach Holman
- ? Move fast and don't break things, Google
- Shipping to Production, The Pragmatic Programmer
Versioning
- SemVer - Semantic Versioning
- CalVer - Calendar Versioning
- Semantic Versioning Will Not Save You
- Version numbers: how to use them?
Checklists
- Production Readiness Checklist, Gruntwork
- Checklist: what had to be done before deploying microservices to production
- Things end users care about but programmers don't: includes colors, formatting, themes, integrations, UX, compatibility, operations.
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
- Feature flags are ruining your codebase
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
- Multi-Tenancy in a Microservice Architecture
Fiabilité
See also System architecture
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.
Citations:
Quality is a snapshot at the start of life and reliability is a motion picture of the day-by-day operation. – NIST
Reliability is the one feature every customer users. -- An auth0 SRE.
Articles:
- I already mentioned the book Release it! au-dessus de. 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.
- Systems that defy detailed understanding
- Focus effort on systems-level failure, instead of the individual component failure.
- Invest in sophisticated observability tools, aiming to increase the number of questions we can ask without deploying custom code
- 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
- ? High Reliability Infrastructure migrations, Julia Evans.
- Appendix F: Personal Observations on the Reliability of the Shuttle, Richard Feynman
- Lessons learned from two decades of Site Reliability Engineering
Ressources:
- ? dastergon/awesome-sre
- ? upgundecha/howtheysre: a curated collection of publicly available resources on SRE at technology and tech-savvy organizations
Élasticité
- ? The Walking Dead - A Survival Guide to Resilient Applications
- ? Defensive Programming & Resilient systems in Real World (TM)
- ? Full Stack Fest: Architectural Patterns of Resilient Distributed Systems
- ? The 7 quests of resilient software design
- ? Resilience engineering papers: comprehensive list of resources on resilience engineering
- MTTR is more important than MTBF (for most types of F) (also as a presentation)
Recherche
- What every software engineer should know about search
Sécurité
- 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.
- Docker Security
- How to improve your Docker containers security
- 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
- How to start an AppSec program with the OWASP Top 10
- 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
- The Password Game
- Learnings from 5 years of tech startup code audits
- API Tokens: A Tedious Survey: don't use JWT.
- The Six Dumbest Ideas in Computer Security
Training for developers:
- Hacksplaining
- Codebashing
- OWASP Security Knowledge Framework
- PagerDuty Security Training
- Gruyere: Web Application Exploits and Defenses
List of resources:
- ? meirwah/awesome-incident-response: tools for incident response
- ? Starting Up Security
- ? decalage2/awesome-security-hardening: security hardening guides, tools and other resources
Shell (command line)
- The case for bash
- ? alebcay/awesome-shell
- ? dylanaraps/pure-bash-bible: pure bash alternatives to external processes.
- The Bash Hackers Wiki provides a gentler way to learn about bash than its manages.
- Awk in 20 Minutes
- ? Linux Productivity Tools
- jlevy/the-art-of-command-line: master the command line, in one page must read
- Minimal safe Bash script template
- Command Line Interface Guidelines
- The Linux Commands Handbook
- How to write idempotent Bash scripts
- Learn bash by playing an adventure
- Effective Shell
- Computing from the Command Line
- What helps people get comfortable on the command line?, Julia Evans
- 6 Techniques I Use to Create a Great User Experience for Shell Scripts
SQL
- SQL styleguide
- Best practices for writing SQL queries
- Practical SQL for Data Analysis
- Reasons why SELECT * is bad for SQL performance
- Animate SQL
- Lost at SQL, an SQL learning game
- Joins 13 Ways
- spandanb/learndb-py: learn database internals by implementing it from scratch.
- SQL for the Weary
System administration
- ? kahun/awesome-sysadmin: a curated list of amazingly awesome open source sysadmin resources
Architecture du système
See also Reliability, Scalability
Reading lists:
- ? donnemartin/system-design-primer: learn how to design large scale systems. Prep for the system design interview.
- ? A Distributed Systems Reading List
- ? Foundational distributed systems papers
- ? Services Engineering Reading List
- ? System Design Cheatsheet
- karanpratapsingh/system-design: learn how to design systems at scale and prepare for system design interviews
- A Distributed Systems Reading List
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:
- Building Microservices, Sam Newman (quite complete discussion of microservices)
- Designing Data-Intensive Applications
Articles:
6 Rules of thumb to build blazing fast web server applications
The twelve-factor app
Introduction to architecting systems for scale
The Log: What every software engineer should know about real-time data's unifying abstraction: one of those classical articles that everyone should read.
Turning the database outside-out with Apache Samza
Fallacies of distributed computing, Wikipedia
The biggest thing Amazon got right: the platform
- All teams will henceforth expose their data and functionality through service interfaces.
- Monitoring and QA are the same thing.
Building Services at Airbnb, part 3
- Resilience is a Requirement, Not a Feature
Building Services at Airbnb, part 4
- Building Schema Based Testing Infrastructure for service development
Patterns of Distributed Systems, MartinFowler.com
ConwaysLaw, MartinFowler.com (regarding organization, check out my engineering-management list).
The C4 model for visualising software architecture
If Architects had to work like Programmers
Architecture patterns
- BFF (backend for frontend)
- Circuit breaker
- Rate limiter algorithms (and their implementation)
- Load Balancing: a visual exploration of load balancing algos
- Good Retry, Bad Retry: An Incident Story: insightful, well-written story about retries, circuit breakers, deadline, etc.
Microservices/splitting a monolith
- Service oriented architecture: scaling the Uber engineering codebase as we grow
- Don't start with microservices in production – monoliths are your friend
- Deep lessons from Google And EBay on building ecosystems of microservices
- Introducing domain-oriented microservice architecture, Uber
- Instead of orienting around single microservices, we oriented around collections of related microservices. We call these domains.
- In small organizations, the operational benefit likely does not offset the increase in architectural complexity.
- Best Practices for Building a Microservice Architecture
- ? Avoid Building a Distributed Monolith
- ? Breaking down the monolith
- Monoliths are the future
- "We're gonna break it up and somehow find the engineering discipline we never had in the first place."
- 12 Ways to Prepare your Monolith Before Transitioning to Microservices
- Death by a thousand microservices
Évolutivité
See also: Reliability, System architecture
- Scalable web architecture and distributed systems
- Scalability Rules: 50 Principles for Scaling Web Sites (presentation)
- Scaling to 100k Users, Alex Pareto. The basics of getting from 1 to 100k users.
Site Reliability Engineering (SRE)
See: Reliability
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.
Essai
- ️ Testing strategies in a microservices architecture (Martin Fowler) is an awesome resources explaining how to test a service properly.
- ? Testing Distributed Systems
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:
- A quick puzzle to test your problem solving... and a great way to learn about confirmation bias and why you're mostly writing positive test cases.
- Testing is not for beginners: why learning to test is hard. This shouldn't demotivate you though!
- Arrange-act-assert: a pattern for writing good tests
- Test smarter, not harder
Test pyramid:
- The test pyramid, Martin Fowler
- Eradicating non-determinism in tests, Martin Fowler
- The practical test pyramid, MartinFowler.com
- Be clear about the different types of tests that you want to write. Agree on the naming in your team and find consensus on the scope of each type of test.
- Every single test in your test suite is additional baggage and doesn't come for free.
- Test code is as important as production code.
- Software testing anti-patterns, Kostis Kapelonis.
- Write tests. Not too many. Mostly integration. for a contrarian take about unit testing
- ? Unit test 2, Integration test: 0
- Testing in the Twenties
- Google Testing Blog: Test Sizes
- Pyramid or Crab? Find a testing strategy that fits, web.dev
End-to-end tests:
- Just say no to more end-to-end tests, Google Testing Blog
- End-to-end testing considered harmful
Outils
- DevDocs API Documentation: a repository for multiple API docs (see also Dash for macOS).
- DevChecklist: a collaborative space for sharing checklists that help ensure software quality
- ? Free for developers: list of free tiers for developments tools and services
- Choose Boring Technology
- Ask HN: Best dev tool pitches of all time?
- A list of /uses pages detailing developer setups, gear, software and configs
The future life expectancy of some non-perishable things, like a technology or an idea, is proportional to their current age — Lindy's Law
Type system
- Counterexamples in Type Systems: a library of runtime issues that weren't caught by the type system
Typographie
- Butterick's Practical Typography
- Typography for Lawyers
- Quick guide to web typography for developers · OlegWock
- Features of your font you had no idea about
Version control (Git)
Learning Git, courses and books:
- Git Book
- Git from the inside out
- Git Tutorials and Training, Atlassian
- Git Immersion
- A Visual Git Reference (a bit more advanced)
- Think Like (a) Git
- Git's database internals I: packed object store: an insightful deep dive from Github
- Oh My Git!: a game to learn git
Cheat sheets:
- Git Cheat Sheet
- git-tips
- Oh Shit, Git!?!
More specific topics:
- Conventional Commits
- Git Merge vs. Rebase: What's the Diff?
- ? Story-telling with Git rebase
- ? Git Rebase vs. Merge
- ? 10 Git Anti Patterns You Should be Aware of
- Learn Git Branching: an interactive game
- Fix conflicts only once with git rerere
- Monorepo Explained
- How to Write a Git Commit Message
- git-worktree: manage multiple working trees attached to the same repository.
Work ethics, productivity & work/life balance
Check out this section on my list of engineering-management resources, "Personal productivity".
Web development
In this repository: check training/web-dev/ and ./training/front-end/
Learning guide and resources:
- grab/front-end-guide: a study guide and introduction to the modern front end stack.
- Front-End Developer Handbook 2019, Cody Lindley
- A Directory of design and front-end resources
- ? codingknite/frontend-development: a list of resources for frontend development
Topics:
- 136 facts every web dev should know
- Maintainable CSS
- Things you forgot (or never knew) because of React
- Checklist - The A11Y Project for accessibility
- DevTools Tips
- 67 Weird Debugging Tricks Your Browser Doesn't Want You to Know
- Client-Side Architecture Basics
- Web Browser Engineering: this book explains how to build a basic but complete web browser, from networking to JavaScript, in a couple thousand lines of Python.
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
- Some blogging myths, Julia Evans
- George Orwell's Six Rules for Writing
- Never use a metaphor, simile, or other figure of speech which you are used to seeing in print.
- Never use a long word where a short one will do.
- If it is possible to cut a word out, always cut it out.
- Never use the passive where you can use the active.
- Never use a foreign phrase, a scientific word, or a jargon word if you can think of an everyday English equivalent.
- Break any of these rules sooner than say anything outright barbarous.
- Blog Writing for Developers
Guides & classes about technical writing:
- Documentation Guide — Write the Docs
- Principes
- Style guides
- Docs as code
- Markup languages
- Outils
- Technical Writing One introduction, Google
- Grammaire
- Active voice
- Clear & short sentences

If you're overthinking, write. If you're underthinking, read. – @AlexAndBooks_
Resources & inspiration for presentations
- https://twitter.com/devops_borat
- https://speakerdeck.com/
- Dilbert
- Calvin & Hobbes (search engine)
- https://twitter.com/_workchronicles
Keeping up-to-date
Website and RSS feeds (I use Feedly):
- Hacker News ️
- S'aventurer
- High Scalability: see above
Sécurité:
- Schneier on Security
- Krebs on Security
- The Hacker News
Newsletters:
- Bytes (JavaScript)
- PyCoders (Python)
- Posthog
Blogs:
- kilimchoi/engineering-blogs
Concepts
Glossaire
- BDD
- CAP theorem
- DDD
- SEC
- EAV
- SAISIR
- BAISER
- Make it run, make it right, make it fast
- Pavillon
- SOLIDE
- TDD
- Two Generals' Problem
- YAGNI
My other lists
- engineering-management
- entrepreneurship-resources
- professional-programming
- python-education