Quelle est l'expérience du premier million de lignes de code?

Alibaba f2e 2021-10-14 01:49:46
quelle est exp rience du



Ces dernières années,Les produits de Taiwan d'Alibaba Data se développent rapidement.Produits de base Quick BI Continu 2 Est devenu la seule sélection nationale Gartner Maison du quadrant magique BI.Quick BI Le code source de l'entrepôt de code unique a percé 10010 000 lignes.Tout le processus de développement implique beaucoup de gens et de modules,Parce que voici quelques principes,Le produit peut être maintenu dans un état de développement rapide.


Partagez d'abord quelques données clés:

  • Code:TypeScript 8210 000 lignes,Styles Sass+Less+CSS 1810 000 lignes.(cloc Statistiques,Supprimer le Code généré automatiquement)

  • Synergie:Code Review 12,111 Une fois,Commit 53,026 Une fois.



Beaucoup de gens demandent,Tant de codes, Pourquoi ne pas diviser la base de code ? Pas encore de micro - front. 、Serverless Cadre? Vous n'avez pas peur de ne pas pouvoir l'entretenir. , Activez la vitesse de la tortue? ?


La réalité est, Dès le premier jour ,On s'attend à ce qu'il y ait une telle quantité de code.Le temps de démarrage est également de plus en plus lent des premières secondes à l'arrière5~10Minutes, Et à court terme 5Secondes. Tout le processus est terminé. , L'équipe se sent plus Monorepo( Entrepôt à code unique )Avantages.


La pratique veut montrer :

  • Grande Codebase Ça pourrait être une bonne chose. ,Avenue à Jane. Avec des extrêmes “Simple.”L'architecture est plus facile à supporter pour les entreprises complexes et flexibles

  • Pour une architecture simple , Besoin interne C'est clair.Spécifications,PlusProcheLa synergie,PlusEfficaceMise en œuvre

  • Problèmes qui peuvent être résolus par l'ingénierie , Ne pas passer par les spécifications de développement ,Ce qui peut être résolu par des normes ne dépend pas de la liberté



Début des travaux



2019Année4Mois30No., Après - midi ensoleillé , C'était la veille de la fête du 1er mai. , Développer la sagesse collective , Voter pour un nom d'entrepôt satisfaisant . Prêt en même temps Quick BI Et FBI Possibilité de fusion de la base ,Projet ouvert. Plus tard, le Code de base a été corrigé. ,Intégrer les codes d'affaires de haut niveau.


commit 769bf68c1740631b39dca6931a19a5e1692be48dDate: Tue Apr 30 17:48:52 2019 +0800
A New Era of BI Begins



Why Monorepo?




Avant le début des travaux , Pour un seul entrepôt (Monorepo) Et plusieurs entrepôts (Polyrepo) Beaucoup de discussions ont eu lieu au sein de l'équipe .


J'aimais ça aussi. Polyrepo, Créer une indépendance pour chaque composant repo Indépendance npm,Par exemple,2019Il y a un an,Un seul composant d'éditeur de classe de formulaire A 43 - Oui.:



Je pensais que ça marcherait. Découplage parfait 、 Multiplexage extrême ??


Mais en fait,:

  1. Chaque fois Babel、React Attendre qu'une mise à niveau globale dépendante puisse faire décoller la peau, J'ai donc mis au point l'échafaudage. . La construction de roues a été forcée. , Un peu. , Mais la capacité de script augmente

  2. Chaque fois Composants de mise en service,npm link Un instant.. Composants ultérieurs ,C'est possible. 3 Couche npm link,Tout ce qui a été utilisé sait à quel point c'est une mauvaise expérience

  1. Version difficile à aligner , Avant chaque mainlevée de l'entrepôt principal ,L'alignement des versions entre les composants est encore plus un test oculaire, Une légère défaillance en ligne a été déclenchée par inadvertance

  2. Quels sont les avantages d'une réutilisation facile pour les autres? ?En fin de compte, il n'y a pas assez de soutien pour votre entreprise, Comment oses - tu les réutiliser?


Finalement, nous avons regroupé tous ces composants en un seul entrepôt, En fait... Google/Facebook/Microsoft Ces entreprises sont très respectées. Monorepo.


Mais nous ne sommes pas fondamentalistes Monorepo,Il n'est pas nécessaire de regrouper les codes de produits non pertinents. Au sein de l'équipe solide , Un seul produit peut être utilisé Monorepo, Réduit considérablement les coûts de collaboration . Mais au début, , Il y a encore beaucoup de questions au sein de l'équipe .



À propos de Monorepo Quelques questions fondamentales ?


1. Entrepôt unique , Ça va être énorme, non? ?


100 10 000 lignes Quelle est la taille du Code? ?


Devinez d'abord. :1GB?10GB? Encore plus. ?


Tout d'abord,, Calculer selon la formule :

Volume du Code = Volume du code source + .git Le volume de + Fichiers de ressources(Audio et vidéo、Photos、Autres documents)


  1. Prenons le volume du code source:

Il est généralement recommandé que chaque ligne soit inférieure à 120 Les caractères, On prend chaque ligne. 100 Les caractères comptent ,100 Dix mille lignes. :


100 * 1000,000 = 100,000,000 B Après la conversion  100 MB!


Quelle est la taille réelle de notre entrepôt? ?

Seulement 85 MB! En moyenne par ligne 85 Caractères.


  1. Encore une fois. .gitLe volume de:

.gitIl enregistre l'historique de soumission de tous les codes、branch Et tag Information. Ça va être énorme. ?

En fait, Git La couche inférieure a fait beaucoup d'optimisation :1. Tous les branch Et tag Ce sont des citations;2. Est un stockage incrémental pour les changements ;3. Utilisé lors du changement de stockage d'objets zlib Compression.(Le Code de modèle récurrent n'est stocké qu'une seule fois,Pour les compressions de code normalisées, les proportions sont extrêmement élevées).


Selon notre expérience ,.gitEnregistrement 10,000 Une fois commit Soumettre seulement en plus 1~3 Volume de code .


  1. Taille du fichier de ressources

Git A fait beaucoup d'optimisation pour le code source ,À l'exception des fichiers de ressources comme la vidéo et l'audio. Nous avons récemment utilisé BFG L'entrepôt d'un autre produit 22GB Optimisé pour 200MB,Réduction 99%!Et l'historique de soumission et les branches du Code optimisé sont conservés(Parce que BFG Sera édité Git Soumettre un dossier,Section commit id Ça va changer.).


Avant 22 GB Parce qu'il y a des vidéos dans l'entrepôt. 、Publié build Documents et sourcemap Documentation, Rien de tout ça ne devrait être dans l'entrepôt source. .


Résumé, Le volume de code en millions de lignes est généralement 200MB ~ 400MB Entre. C'est une estimation. 1000 10 000 lignes Quel est le volume de code utilisé? ?


Multipliez par dix. 2GB ~ 4GB Entre. Ce contraste node_modules Peu importe. G Dis,Ce n'est pas vraiment,Facile à gérer. Cas supplémentaires ,Linux NoyauOui. 2800 10 000 lignes,Utiliser Monorepo, Des milliers de personnes travaillent ensemble .On dit que Linus C'est pour la gestion. Linux A été développé à partir du code source Git.

2. Ça commence lentement? ?5Minute ou10Minutes?


J'ai entendu certaines équipes dire , 100 000 lignes de code ,Démarrage 10+Minutes,Typique“Stonehenge”Projets, C'est déjà difficile à entretenir. . Déballez le sac. 、 Ou changer le micro - Front . Peut - être l'équipe. 3 Et l'homme l'a démoli. 5 Projets, C'est très compliqué de travailler ensemble. .


C'est ce que nous faisons. 3- Oui.:

  1. Diviser plus par page Entry, Un seul démarrage à la fois Entry

  2. Dépendance entre les paquets de peignes ,Poursuivre l'excellence Lazy loading,Tree-Shaking

  1. Webpack Passer à Vite


En particulier Webpack Passer à Vite Plus tard, Le temps final de démarrage à froid du projet est de 2-5Minutes Optimisé pour 5Secondes Intérieur. Temps de compilation à chaud de 5Secondes Optimisé pour 1Secondes Intérieur,Apple M1 Les ordinateurs sont essentiellement 500ms À l'intérieur.


3. Et la réutilisation du Code? ?Monorepo Voulez - vous importer tout en réutilisant?


Poursuite de la pensée traditionnelle de l'ingénierie logicielle DRY, Mais pas plus. DRY Mieux c'est..


Chaque ligne de code écrite , A un coût :EntretienCoût. Pour réduire le Code , Nous avons des modules réutilisables . Mais il y a un problème avec la réutilisation du Code :Cela devient un obstacle quand vous voulez le modifier plus tard.


Pour des choses comme Quick BI Ce produit itératif à long terme ,La grande majorité des exigences sont des extensions des fonctionnalités existantes,Il est donc très important d'écrire un code facile à entretenir.Donc,, L'équipe n'encourage pas l'utilisation magic Une écriture acrobatique ; Ne pas simplement poursuivre le taux de réutilisation du Code , Plutôt que de chercher à être plus facile à modifier ;Encourager un codage facile à supprimer lorsque les futurs modules sont hors ligne.


Pour les scénarios où le multiplexage existe réellement , On a déballé. .Monorepo À l'intérieur, on en a démonté plusieurs. package( Capture d'écran derrière ), Par exemple, d'autres produits ont besoin BI Construction,Peut être réutilisé @alife/bi-designer,Et en utilisant Tree-Shaking Minimiser l'introduction de la dépendance .



Expérience actuelle de développement



  1. Démarrage à froid 5Secondes, Compilation à chaud 1En quelques secondes.C'était 5~10Minutes.

  2. Un problème qui peut être résolu en changeant une ligne de code , Changez vraiment une ligne et Publiez - la une fois . Au lieu de changer 10+ Projets, Publier par dépendances N Une fois.

  1. Nouveaux arrivants 10Minutes Construire un environnement, Développement manuel

    1. Par rapport à chaque composant précédent Repo, Ça va prendre du temps.

  1. Éviter les problèmes d'alignement des versions

    1. Pour 2C Produits, Plusieurs versions de plusieurs branches de base ne sont pas nécessaires ,Mais plusieurs npm Il n'est pas facile de s'appuyer sur une version alignée

    2. Pour 2B Produits, En raison de plusieurs environnements 、Plusieurs versions,Ce sera plus compliqué., Très complexe .Monorepo Unifier les versions internes dépendantes par branche

  1. Une seule mise à niveau technique est nécessaire .Actuellement basé sur Lerna Développé par Pri Monorepo Programme.


Ce n'est pas une expérience facile à vivre. ,Il y a encore beaucoup de problèmes à résoudre dans le développement.



Problèmes à résoudre



Ce n'est pas la fin du Code, La question complexe qui se pose est la suivante: Synergie、Programme technique、Stabilité(Comment éviter qu'une personne ne soumette un code qui provoque un crash complet du produit?)

1. Gestion des dépendances des paquets


Fractionnement interne de plusieurs sous - paquets , Chaque sous - paquet est un sous - fichier ,Peut être publié séparément npm,Voir ci - dessous:



Les principes fondamentaux de la gestion interne des paquets sont les suivants: :

  • Dépendance unidirectionnelle de gauche à droite , La gauche ne peut être référencée qu'à droite .Évitez les dépendances cycliques

  • Les normes ne suffisent pas , Développer des plug - ins pour la détection automatique ,Si la gauche dépend de la droite pour signaler directement une erreur


Pour Open Source npm Introduction de, Il faut être plus prudent. .La plupart npm La durée d'entretien ne doit pas dépasser xAnnée,Même si c'est comme Moment.js Cela met également fin à la maintenance des bibliothèques d'outils qui étaient auparavant standard.Peut - être. 20% De npm Personne ne l'a gardé. .Mais à l'avenir, si vos utilisateurs en ligne rencontrent des problèmes, Vous devez vous débrouiller seul. , Être passif . Donc notre principe est , Introduction de sources ouvertes npm Trois personnes doivent passer l'examen hors ligne. .


2. Code Review Culture


Les uns pour les autres Code Review Peut aider les nouveaux arrivants à croître rapidement ,C'est aussi une façon de créer une culture technique d'équipe.

Mis en œuvre au sein de l'équipe au cours des dernières années 100% CR,Mais ça ne suffit pas.. L'exécution mécanique peut facilement CR Sous la forme, Il faut faire ça séparément. .


Monorepo Il y a un risque qu'une fois qu'il y a un problème, il puisse être un problème global.


Pour le moment Code Review Principalement divisé en3Scènes:

  1. En ligne MR Code Review【1C'est exact.1】

  2. Thème Code Review【3-5Particuliers】

  1. Groupe avant la sortie de la grande version Code Review【All】


12,111 Une fois Code Review Beaucoup d'expérience ,Surtout:

  1. En temps voulu Review, Encourager les petites particules MR, Pas besoin d'attendre que toute la fonctionnalité soit développée

  2. Le Code est écrit pour être lu., Encourager le Code vernaculaire , Au lieu du chinois classique

  1. Établir des pratiques exemplaires (Structure de l'arbre、Nomenclature、 Spécification du flux de données ). Développer une fonctionnalité qui pourrait avoir 10 Une façon de, Mais l'équipe doit choisir 1 Plantation et promotion

  2. Ne pas encourager l'éblouissement , Pour la maintenabilité future . Peut être réalisé par des techniques simples ,Ne l'utilisez pas.“En profondeur” Technologie des portes froides

  1. Mettre l'accent sur le développement de la propreté , Une culture de code élégant .( Si le nom est facile à comprendre 、 Les commentaires sont - ils complets? 、 S'il y a un danger potentiel de performance, etc. )


3. Construction Technique


Tout d'abord, grâce à l'avant - garde DEF Soutien de l'équipe d'ingénierie , Avec tant de code , Défi constant de la mise à niveau des limites DEF Nous soutenir.


En plus de la spécification de la documentation ,Une spécification qui automatise la vérification des outils est une bonne spécification.


Inspecteur:ESLint、TS Vérification de type、Prettier

Le Vérificateur de grammaire est un moyen important de pousser la spécification au sol,ESLint Peut être incrémenté ,Après optimisation git commit De pre-hooks C'est encore rapide. .Mais... TS type check Parce que les incréments ne sont pas pris en charge plus lentement,Ça doit aller. CI/CD Pour utiliser.


Webpack vs Vite

Utilisation des publications Webpack,Développement et utilisation Vite.

Utilisation de l'environnement de développement Vite Mise en service rapide , Environnement de production toujours utilisé Webpack Emballez.

Le risque est l'incohérence entre le développement et la production des produits compilés,Cette pièce doit être testée par régression avant d'être mise en ligne pour éviter.


4. Optimisation des performances


Pour les produits de données , Les défis en matière de rendement ne découlent pas seulement Monorepo Augmentation de la taille du paquet de ressources après ,Il y a aussi le défi que représente le volume de données volumineuses pour le calcul du rendu.


L'optimisation des performances peut être divisée en 3Liens:

  • Chargement des ressources:Raffinement Tree Shaking, Difficile à raffiner .Webpack En soi Tree-Shaking Ce n'est pas bien. ,Non pris en charge Class method Fais - le. Tree Shaking, Donc parfois vous devez changer le Code .Lazy Loading Le module est chargé à la demande , Surtout les graphiques. 、SQL Les grands composants comme les éditeurs . Pré - Chargement raisonnable de l'interface , Ne laissez pas le réseau s'arrêter .

  • Affichage du rendu: Réduire au minimum les temps de rendu des composants , Optimisation virtuelle du roulement des composants de la classe de table , Pré - chargement du pré - rendu au ralenti .

  • Demande d'accès : Tampon de localisation des ressources ,Utilisation du terminal mobile PWA Oui. JS Mise en cache locale de fichiers et de données de ressources similaires.


Il y a aussi des outils de test de performance , Positionnement des points de carte de performance . Programmer la serrure de performance du Code ,Alerte si vous remarquez une augmentation du volume du paquet avant la soumission du Code.

5. Optimisation de l'architecture axée sur les données


Dans les données ,Je suis convaincu de la valeur commerciale des données. Mais pour le développement lui - même , Peu de données utilisées en profondeur .


Alors... S1 L'accent est mis sur la numérisation des expériences de développement.Analyser en recueillant des données sur l'environnement de développement de tout le monde et le temps de démarrage【 Éviter les volumes internes sans compter d'autres données 】. Trouver beaucoup de choses intéressantes , Par exemple, un étudiant compile à chaud 3~5 Minutes, Il pensait que les autres étaient si lents. ,Impact grave sur l'efficacité du développement,Dix minutes après avoir découvert une anomalie dans les données du rapport.


Un autre exemple,Pour assurer la cohérence des produits emballés en ligne, Pousser l'équipe à faire Node.js Version uniforme, C'était des clous. ,Combien de fois les clous ne savent pas comment ça marche. Une fois que vous avez le rapport, vous pouvez le voir en un coup d'oeil. .



Actuellement, l'ensemble du processus de numérisation fonctionne , J'ai un goût sucré. .Il y a beaucoup d'analyses amusantes à faire dans le futur.



Une expérience plus profonde


La façon la plus efficace est la meilleure à la fois

Chaque ligne de Code laisse un coût .À long terme,La façon la plus efficace est de bien faire.

Su Shimin a dit “Faire de grandes choses est aussi difficile que de petites choses.Les deux consomment votre temps et votre énergie”.Dans ce cas,, Autant écrire le code à la fois. . S'il reste dans le Code “TODO” Peut - être pour toujours. TO DO.Objectivement parlant,, C'est plus difficile à faire à la fois , Tout d'abord, tout le monde pense “D'accord.”Différents critères, C'est la capacité technique de l'individu. 、 La quête de l'expérience 、 Compréhension des affaires .


Technologie de la culture organisationnelle Complémentaire

L'architecture technique et organisationnelle a beaucoup à voir avec,Il est plus important de choisir l'architecture technique qui convient à l'Organisation.

Si une organisation est décentralisée ,Utiliser Monorepo Il y aura des coûts de collaboration importants . Mais si les tissus sont cohésifs, ,Monorepo Peut grandement améliorer l'efficacité .

L'ingénierie et l'infrastructure sont l'affaire de l'équipe, C'est dur de pousser seul. .

À court terme, on peut compter sur la guerre pour copier. ,Il faut former une culture à long terme pour que les itérations se poursuivent.

Le coût élevé de la communication organisationnelle devrait être résolu par l'Organisation,Le pouvoir de résoudre par la technologie est insignifiant.Ce que la technologie peut faire, c'est tirer le meilleur parti des outils, Faire en sorte que le changement se produise rapidement .


La simplicité ne précède pas la complexité , Mais après la complexité

Pour une architecture simple ,Quelqu'un va trouver un moyen de le compliquer. J'ai marché dans la fosse. , Décider de reconstruire , Le succès revient à la simplicité ,L'échec sera renversé par un nouveau modèle simple. Il vaut la peine de marcher sur la fosse elle - même. ,Sinon, les nouveaux arrivants ne peuvent pas s'empêcher de marcher à nouveau. C'est facile d'être compliqué. ,Mais garder la simplicité exige de la prévoyance et de la retenue. N'a pas connu l'expérience du processus ,L'antidote de quelqu'un d'autre pourrait être un poison pour vous.

L'architecture ne peut pas être statique ,Nos diagrammes ont été utilisés pour la première fois directement D3、ECharts C'est simple.,Plus tard, la personnalisation est devenue beaucoup plus complexe et difficile à entretenir,Donc basé sur G2 Auto - étude bi-charts L'architecture est redevenue simple. ,L'expérience de développement avant et après peut être similaire, Mais la technologie derrière ça a complètement changé. .



Résumé et perspectives



Un million de lignes de code n'a rien de terrible. , Est un noeud normal ,Toujours aussi agile que des dizaines de milliers de lignes de code.

Maintenant Quick BI A fait des dizaines de millions de pas , Vers la classe mondiale BI Progrès accomplis dans la réalisation des objectifs.Ce qui précède est plus lié à l'ingénierie,Le but de l'ingénierie est de permettre aux développeurs de se concentrer davantage sur les affaires, Il y a plus de défis commerciaux qui ne sont pas abordés ,Parce que l'analyse des données est intrinsèquement liée à de grandes quantités de données, L'optimisation des performances a une longue pratique ; Un aperçu de l'abondance et de l'hétérogénéité des données ,Il y a beaucoup de visualisation et de précipitation dans les tableaux complexes, La visualisation n'est pas seulement une technologie , C'est aussi l'entreprise elle - même. ; Affichage multi - terminaux comme la télévision à écran plat mobile , Défis liés à l'adaptation de bout en bout .On espère également que l'analyse des données deviendra un moteur à l'avenir,Capacité d'intégration rapide dans les processus administratifs et commerciaux.


Le modèle de développement actuel n'est pas parfait ,Au cours de l'itération, Une dette technologique inévitable ,L'essence de l'optimisation de l'architecture est de maintenir la maintenabilité et de réduire la dette technologique. Récemment, l'équipe se prépare Redux-Toolkit Introduction de,Il y aura une grande mise à jour de la recherche et du flux de données, Partager les progrès .







Attention「Alibaba F2E」Wechat public Number Saisir la nouvelle tendance d'Alibaba Front End




版权声明
本文为[Alibaba f2e]所创,转载请带上原文链接,感谢
https://qdmana.com/2021/10/20211014014520252V.html

  1. 初学者怎么学Web前端?
  2. react
  3. PaddlePaddle:在 Serverless 架构上十几行代码实现 OCR 能力
  4. JavaScript数组 几个常用方法
  5. Angular 依赖注入 - 全面解析
  6. html_day02
  7. 那些年我们前端面试中经常被问到的题!
  8. The starting price of Ducati multistada V2 in North America is less than 100000 yuan
  9. Hls.js 使用文檔
  10. Hls.js travailler avec des documents
  11. Problèmes liés à la précision JS
  12. Copie une partie des propriétés d'un objet à un autre objet
  13. Multiplexage de modules en vuex
  14. Développement multilingue Android, questions d'entrevue pour le développement de logiciels Android
  15. Chen lushai and her best friend Wang Meng play video, fearless of the pressure of public opinion, and in a good mood to dance in a bare back
  16. # Sass速通(四):继承、混合与函数
  17. Vidéo de développement de combat Android, questions d'entrevue rxjava
  18. Bugatti Chiron maintenance cost exposure! One piece for one car, burn money endlessly
  19. android应用开发基础答案,深入理解Nginx
  20. 做了三年前端,你才知道10分钟就能实现一个PC版魔方游戏
  21. Html + CSS + JS implémentation ️ Responsive Lucky Turnover ️ [with full source Sharing]
  22. Ren Jialun, who married young, was in a mess. Now she feels that it is a blessing in disguise
  23. 达梦数据库使用disql生成html格式的巡检报告
  24. React render phase parsing II - beginwork process
  25. Tableau linéaire de la structure des données (dessin à la main)
  26. In 2022, what are the highlights and popular elements in skirts to make skirts more elegant and gentle?
  27. JQuery installation
  28. Exemple de développement Android, dernière compilation de questions d'entrevue Android
  29. Differences and relations between JDK, JRE and JVM, nginx architecture diagram
  30. 【Azure 云服务】Azure Cloud Service 为 Web Role(IIS Host)增加自定义字段 (把HTTP Request Header中的User-Agent字段增加到IIS输出日志中)
  31. 【Azure 云服务】Azure Cloud Service 为 Web Role(IIS Host)增加自定义字段 (把HTTP Request Header中的User-Agent字段增加到IIS输出日志中)
  32. Questions d'entrevue pour les ingénieurs en développement Android, Android Foundation 72 questions
  33. It's kind of Cadillac CT6 to have a Mercedes Benz S-class captain and a 10At entry-level configuration, falling to less than 300000
  34. H6 meets the strong enemy again! The car body has a Cayenne visual sense, breaking 8.8 seconds, and the top configuration is less than 130000
  35. How nginx supports HTTPS and Linux kernel video tutorial
  36. Le martyr se réjouit de sa vieillesse Audi R8 V10 performance Rwd
  37. import 方式隨意互轉,感受 babel 插件的威力
  38. Le mode d'importation peut se déplacer librement pour sentir la puissance du plug - in Babel
  39. Pas de héros en termes de ventes!Du point de vue de la force du produit, la nouvelle version ax7 Mach est plus forte que H6
  40. The vue3 + TS project introduces vant as needed
  41. 深入浅出虚拟 DOM 和 Diff 算法,及 Vue2 与 Vue3 中的区别
  42. 深入淺出虛擬 DOM 和 Diff 算法,及 Vue2 與 Vue3 中的區別
  43. Explorer les algorithmes DOM et diff virtuels et les différences entre vue2 et vue3
  44. 两万字Vue基础知识总结,小白零基础入门,跟着路线走,不迷路(建议收藏)
  45. Résumé des connaissances de base de 20 000 mots vue, Introduction à la petite base blanche zéro, suivre la route et ne pas se perdre (Collection recommandée)
  46. 兩萬字Vue基礎知識總結,小白零基礎入門,跟著路線走,不迷路(建議收藏)
  47. "Talk show conference 4" Zhou qimo a remporté le championnat. Tout le monde l'admire. Il est mature et stable et a une vue d'ensemble
  48. Test logiciel entrevue non technique questions classiques - mise à jour continue!
  49. Digital forward disassembly reverse disassembly
  50. Analyse du cache distribué redis et essence de l'entrevue en usine v6.2.6
  51. [Hadoop 3. X series] use of HDFS rest HTTP API (II) httpfs
  52. Zhang Daxian sang in the morning to bless the motherland, xYG team: singing is much better than us
  53. My three years' experience -- avoiding endless internal friction
  54. Introduction à l'algorithme "dénombrement binaire" modéré 01 - - question d'entrevue leetcode 10.09. Recherche de matrice de tri
  55. Introduction à l'algorithme simple 06 - - leetcode 34. Trouver la première et la dernière position d'un élément dans un tableau de tri
  56. CSS animation
  57. Explain the new tags in HTML5 and the pseudo classes and pseudo elements in CSS3
  58. They are all talking about "serverless first", but do you really understand serverless?
  59. [apprentissage de l'algorithme] 1486. Fonctionnement exclusif du tableau (Java / C / C + + / python / go / Rust)
  60. Front and back end data interaction (VI) -- advantages, disadvantages and comparison of Ajax, fetch and Axios