Enregistrez pour la première fois à la tête de l'équipe backend

Au cours du dernier mois et demi, j'ai participé pour la première fois au développement du projet de l'entreprise de 0 à 1 en tant que chef d'équipe de développement back-end, et j'enregistrerai cette expérience de développement.

1. Introduction générale

Tout d’abord un peu de contexte. L'entreprise pour laquelle je travaille est engagée dans des activités liées aux communautés intelligentes, et le projet développé est un outil de mise à niveau du système pour aider les collègues chargés de la mise en œuvre de l'entreprise à installer et à mettre à niveau le système.

Il y a quatre personnes impliquées dans le développement back-end, dont moi. Parmi les trois autres collègues, un est un jeune diplômé et deux travaillent dans le big data. Selon le plan technique de l'entreprise, le rythme de développement des projets internes doit être court et rapide et doit être réalisé en langage Python, tandis que tous les projets externes doivent être réalisés en langage Java.

Le projet traverse le cycle de vie normal du développement, comprenant la collecte des exigences, la conception du produit, la conception du système, la conception détaillée, le codage, les tests et d'autres processus. La conception détaillée est une conception détaillée de l'interface. Elle a duré au total 3 jours et 45 points de fonction ont été conçus, dont 40 interfaces et 5 préparations d'initialisation. Le temps de codage est prévu pour être de 3 semaines. Finalement, le développement concerné a été achevé dans les délais.

Je joue le rôle de chef d'équipe durant ce processus de développement. Mes principales tâches sont les suivantes :

(1) Construction du cadre du projet. Ce développement est un processus de 0 à 1. Avant cela, il n'existait pas de framework pour les projets Python.

(2) Mise en œuvre de technologies clés. Y compris les interfaces communes et les points techniques complexes.

(3) Répartition des tâches. Toutes les interfaces sont attribuées à des membres désignés en fonction de la charge de travail pour réaliser le maximum de développement d'interface.


2. Construction du cadre du projet

Il n'existe en fait pas beaucoup de frameworks de projet couramment utilisés pour le développement Web en Python. J'ai trois candidats :

Le framework de non-séparation front-end et back-end de Django, le framework le plus simple à utiliser de Flask et le framework asynchrone hautes performances FastAPI.

En comparant ces trois frameworks, j'ai choisi Flask sous trois angles : la logique métier, la pile technologique de l'entreprise et la complexité.

Logique métier

La logique métier n'a pas d'exigences particulières en matière de performances. Elle appelle simplement le script ansible d'exploitation et de maintenance via l'interface. Il n'y a pas de haute concurrence, de tâches à forte intensité de calcul, etc., donc les trois peuvent être satisfaits.

pile technologique

La pile technologique de l'entreprise sépare le front-end et le back-end, donc un framework comme Django qui ne sépare pas le front-end et le back-end n'est pas adapté, bien que Django puisse également être utilisé pour un développement back-end pur (anti-blocage).

Complexité

En termes de complexité, Flask est certainement le plus simple. Django est connu pour être volumineux et complet, mais sa configuration est complexe. FastAPI est un framework asynchrone et nécessite l'apprentissage de la programmation asynchrone. Bien qu'il soit très fluide lorsqu'il est utilisé comme framework synchrone, le coût d'apprentissage doit augmenter considérablement. Les trois autres collègues n’ont jamais réalisé de projets Python, ils essaient donc de réduire le coût d’apprentissage.

Après avoir mesuré ces trois directions, le framework Flask a finalement été déterminé, associé au framework de base de données peewee orm. Les technologies de base comprennent :

(1) Flacon de cadre Web

(2) Base de données ORM framework peewee

(3) Base de données SQLite

(4) Sous-processus du module d'exécution de script d'exploitation et de maintenance

(5) Service WSGI Gunicorn

(6) Pré-engagement de l'outil de vérification de code

Avant le codage, j'avais préparé un cadre de projet complet et écrit une démo de l'interface CRUD de la base de données. Au cours du processus de développement ultérieur, mes collègues ont imité les interfaces pertinentes, ce qui a amélioré dans une certaine mesure l'efficacité du développement.


3. Mise en œuvre des technologies clés

Lorsque vous dirigez une équipe pour développer et incitez un membre à réaliser un projet Python pour la première fois, vous devez naturellement vous assigner des tâches difficiles. Sélectionnez trois explications représentatives sur la mise en œuvre des technologies clés. Les trois sont : l’interface générale pour l’exécution des commandes système, les journaux de streaming et la résolution de problèmes d’écriture multithread SQLite.

Interface commune de commande système

Le projet est principalement utilisé pour l'installation et la mise à niveau d'autres systèmes développés par l'entreprise, il est donc nécessaire d'appeler des scripts pertinents écrits par le personnel d'exploitation et de maintenance en utilisant ansible. Le format du script ansible appelé est le suivant :

ansible-playbook 03.mysql.yml
ansible-playbook 08.zk.yml

Vous devez exécuter la commande ci-dessus dans le chemin spécifié. Au cours de la phase de conception détaillée, nous savions que nous devions utiliser Python pour appeler les commandes système. Nous avons donc demandé à nos nouveaux collègues diplômés d'étudier le module de sous-processus et de produire les documents pertinents. Premièrement, il donne aux nouveaux arrivants une orientation d'apprentissage, et deuxièmement, il profite de cette opportunité pour se familiariser avec les technologies requises pour le projet.

Au cours de la phase de développement, sur la base de la compréhension des modules pertinents, le développement d'interfaces communes a été achevé. Lorsque vous écrivez une interface universelle, veillez à ne pas la modifier du jour au lendemain, car le code qui en dépend doit également changer en conséquence. C'est acceptable une ou deux fois, mais si vous le faites plus souvent, on vous demandera probablement de saluer vos ancêtres. Par conséquent, le niveau d'implémentation de l'interface est non seulement terminé, mais également appelé par moi-même, et ce n'est qu'après avoir confirmé qu'il n'y a aucun problème qu'il est déclaré terminé.

Soyez patient lors du débogage jusqu'à ce qu'il soit terminé, puis informez-en les autres développeurs du groupe jusqu'à ce qu'il n'y ait plus de problèmes. Un grand nombre d'appels à cette commande sont nécessaires pour exécuter des scripts dans tout le système, et ils se terminent tous sans problème au final, sans bugs causés par l'interface.

Journaux en streaming

Selon la conception du produit, lorsqu'un composant est installé, un journal doit être affiché sur la page Web et le format du journal doit être le même que le journal d'installation dans le terminal, c'est-à-dire défilement et impression ligne par ligne. . L'exigence du produit pour le journal est que les journaux soient affichés en mode défilement complet et que la page doit être actualisée pour pouvoir à nouveau afficher les journaux dans leur intégralité. Afin de réaliser cette fonction, trois options ont été étudiées :

1. Actualisation régulière. Inconvénients : il y a des dizaines de milliers de lignes dans le journal. Chaque fois que le journal entier est lu sur le front-end, le front-end se fige et l'impression ne sera pas continue, ce qui rend l'expérience mauvaise.

2. prise Web. Le push actif du backend vers le frontend peut être effectué, mais l'actualisation de la page ne démarrera pas le push depuis le début.

3. Réponse en streaming. Vous pouvez couper des fichiers volumineux en petits morceaux et les transmettre par lots au front-end. Lorsque la page est actualisée, elle sera repoussée depuis le début, ce qui répond aux exigences.

Après comparaison, nous avons finalement utilisé la réponse en streaming, qui est la méthode de réponse de ChatGPT. Mais il reste une question à résoudre : quand la poussée prendra-t-elle fin ? Étant donné que l'installation écrit les journaux dans le fichier et que le journal de streaming lit les journaux, si les journaux ont été lus et que l'installation n'est pas terminée, il est alors absolument nécessaire d'attendre au lieu d'arrêter la réponse.

La solution consiste à insérer un caractère de marque une fois l'installation terminée. Lorsque le journal de streaming lit le caractère de marque, il indique que l'opération est terminée. Si le caractère de marque n'est pas lu, il attendra. Le code de base est le suivant :

def log_flow():
    query = request.values
    log_path = query["log_path"]

    def generate():
        with open(log_path, "r") as f:
            while True:
                chunk = f.read(800)
                if not chunk or chunk.isspace():
                    time.sleep(0.1)
                if chunk == 800 * "-":
                    break
                content = json.dumps({"content": chunk})
                yield f"event: message\ndata: {content}\n\n"
                time.sleep(0.05)

return Flask_response(generate(), mimetype="text/event-stream"

Effet:

problème d'écriture multithread sqlite3

En termes de stockage de base de données, le leader a décidé d'utiliser sqlite 3. Nous avons également essayé d'utiliser MySQL pour des raisons raisonnables, mais cela n'a pas fonctionné. Le leader a déclaré que le projet ne nécessite qu'une base de données légère, et que sqlite3 est léger, il convient donc. Et il a été utilisé avec beaucoup de maturité dans d’autres projets. Eh bien, comme le leader a insisté, je n’ai eu d’autre choix que de serrer les dents.

Il n'y a eu aucun problème au début, mais des problèmes ont été découverts au milieu et à la fin du développement du projet. L'interface signalait souvent des erreurs :

File "/home/ljk/.virtualenvs/idt_dev/lib/Python3.8/site-packages/peewee.py", line 3246, in execute_sql
cursor.execute(sql, params or ())
File "/home/ljk/.virtualenvs/idt_dev/lib/Python3.8/site-packages/peewee.py", line 3014, in __exit__
reraise(new_type, new_type(exc_value, *exc_args), traceback)
File "/home/ljk/.virtualenvs/idt_dev/lib/Python3.8/site-packages/peewee.py", line 192, in reraise
raise value.with_traceback(tb)
File "/home/ljk/.virtualenvs/idt_dev/lib/Python3.8/site-packages/peewee.py", line 3246, in execute_sql
cursor.execute(sql, params or ())
peewee.OperationalError: database is locked

Après interrogation, j'ai découvert que sqlite3 ne prend pas en charge l'écriture multithread. SQLite3 prend en charge les transactions effectuées à l'aide de verrous de bibliothèque. Lorsqu'une écriture démarre, la base de données entière est verrouillée et une erreur sera signalée s'il y a une autre opération d'écriture.

Tout d'abord, ce problème est techniquement difficile à résoudre. Il s'agit de la conception architecturale de sqlite3. Peut-il toujours prendre en charge l'écriture multithread ? Cela ne peut être résolu que par la logique métier. Après une réunion et une discussion, plusieurs solutions ont été trouvées :

  • Bibliothèque de succursale. Divisez les opérations d’écriture dans différentes bibliothèques pour les terminer. Étant donné que l'opération d'écriture verrouillera la bibliothèque, séparez les bibliothèques en différentes bibliothèques pour éviter le problème de verrouillage de la bibliothèque.
  • File d'attente d'écriture globale. Placez toutes les écritures dans une file d'attente de messages et transformez l'écriture multithread en écriture en série.
  • Indicateur d'écriture global. Avant de commencer toutes les opérations d'écriture, déterminez s'il existe un indicateur d'écriture et écrivez s'il peut être écrit. Sinon, l'interface revient pour indiquer à la base de données frontale qu'elle est occupée.

Après vote, tout le monde a décidé à l'unanimité d'utiliser la troisième méthode de mise en œuvre, celle qui présente la moins de difficulté technique et le code le moins intrusif. Parce que c’est moi qui ai proposé la troisième option, je la compléterai finalement. Pour le processus spécifique, veuillez vous référer à un autre document « Analyse des problèmes de table de verrouillage SQLite dans le fonctionnement Peewee ».

En fin de compte, le problème a été résolu : même s'il n'était pas élégant, il s'agissait en partie de la solution optimale en termes de coût du temps et de contrôle des risques. À l'avenir, nous étudierons l'implémentation de la file d'attente d'écriture de sqliteQueueDatabase fournie par peewee, un framework ORM.

Extrait du plug-in d'extension peewee :

SqliteQueueDatabase est disponible en tant que SqliteDatabase standard. Si vous souhaitez une lecture et une écriture simples à partir d'un accès multithread à la base de données SQLite.

SQLite n'autorise qu'une seule connexion à écrire dans la base de données à un moment donné. Par conséquent, si vous disposez d'une application multithread (telle qu'un serveur Web) qui doit écrire dans une base de données, vous pouvez parfois voir des erreurs lorsqu'un ou plusieurs threads essayant d'écrire ne peuvent pas acquérir le verrou.

SqliteQueueDatabase est conçu pour simplifier les opérations en envoyant toutes les requêtes d'écriture via une connexion de longue durée. L'avantage est que vous pouvez voir plusieurs threads écrire dans la base de données sans conflits ni délais d'attente. Cependant, l'inconvénient est que vous ne pouvez pas émettre une transaction d'écriture contenant plusieurs requêtes - essentiellement, toutes les opérations d'écriture s'exécutent en mode de validation automatique.


4. Sentiments personnels

C'était la première fois que je dirigeais une équipe en développement et j'ai réalisé beaucoup de choses.

Le héros du projet

La première est de vraiment comprendre ce qu’est la conscience du protagoniste. Divers articles disent qu'il faut avoir un sentiment d'appropriation du projet pour se développer plus rapidement. J’ai l’impression que vous ne pouvez ressentir cette conscience que si vous vous tenez dans une telle position.

La première personne responsable de l'avancement du projet, c'est vous. Tous les problèmes, petits ou grands, qui surviennent dans le projet vous seront adressés. La réunion de direction posera des questions sur l'avancement du projet, y a-t-il des obstacles et peut-il être achevé dans les délais ? Les membres de l'équipe demanderont si ce cadre de vérification est OK ? Y a-t-il un problème avec cette syntaxe ? Le testeur vous demandera qui doit donner ce bug ? Vous devez donc bien connaître ce projet, depuis un élément de configuration du code jusqu'au contrôle de l'avancement du projet. Tout problème au cours du processus de développement doit être résolu rapidement. Le chef d'équipe n'est qu'une brique, la déplaçant là où elle est nécessaire ~

Harmonie d'équipe

Parlons d’harmonie d’équipe. Dans le passé, lorsque je faisais un petit développement, je devais simplement accomplir mes propres tâches. L'ambiance de l'équipe affecte-t-elle la vitesse d'écriture du code ? Diriger une équipe pour se développer est différent. Il y a des collègues avec diverses caractéristiques dans l'équipe, y compris ceux qui travaillent dur sans signaler de progrès, ceux qui sont capables mais ont un mauvais caractère, et ceux qui ont un bon caractère et progressent lentement. Bref, il existe des personnes de toutes sortes de personnalités.

Au cours de ce développement, j'ai rencontré une personne très compétente mais de mauvais caractère. Lorsqu'il voyait des problèmes techniques mineurs, il démarrait directement une discussion de groupe. Qui n'est pas un jeune homme passionné ? Comme vous pouvez l’imaginer lorsque vous rencontrez cette situation pour la première fois. Les dirigeants ont dû nous en parler une ou deux fois et ont même alarmé la plupart des chefs de département. L’ambiance dans l’équipe était particulièrement mauvaise à cette époque et personne ne parlait. Je n’ai pas osé en dire plus, de peur que l’ambiance ne se détériore et que le projet ne se réalise pas comme prévu et que d’ici là, cela deviendrait mon problème si ce n’était pas mon problème. Je ne peux donc que choisir de l’endurer et d’éviter autant que possible les différences. Heureusement, le discours du leader a joué un grand rôle en réconfortant et en critiquant en cas de besoin. Plus tard, il n'y a eu aucun conflit verbal et le projet a été achevé avec succès dans les délais.


5. Résumé

Diriger une équipe sur un projet pour la première fois a été pour moi un défi et une amélioration. D'un point de vue technique, cela me permet d'examiner les problèmes d'un point de vue plus élevé lorsque je suis confronté à la sélection technologique à l'avenir ; d'un point de vue personnel, c'est une opportunité rare pour moi d'être en charge de l'équipe de développement et de me connecter avec les tests. équipe, équipe front-end, équipe d'exploitation et de maintenance, etc. Ceci est un exercice pour ma communication.

Enfin, j'espère faire mieux la prochaine fois pour que tous les membres de l'équipe puissent progresser.

Recommandations sur les outils de développement

JNPF, de nombreuses personnes l'ont utilisé, c'est un maître de fonctions, et tout système d'information peut être développé sur cette base.

Le principe est de concrétiser certaines scènes et processus récurrents du processus de développement en composants, API et interfaces de bases de données pour éviter de réinventer la roue. Cela améliore considérablement la productivité des programmeurs.

Site officiel : www.jnpfsoft.com/?csdn Si vous avez du temps libre, vous pouvez élargir vos connaissances.

Il s'agit d'un cadre de développement rapide simple et multiplateforme basé sur Java Boot/.Net Core. Le front-end et le back-end encapsulent des milliers de classes communes pour une expansion facile ; il intègre un générateur de code pour prendre en charge la génération de code commercial front-end et front-end afin de répondre à un développement rapide et d'améliorer l'efficacité du travail ; le framework intègre diverses classes couramment utilisées tels que des formulaires, des rapports, des graphiques et des grands écrans. La démo est facile à utiliser directement ; le framework back-end prend en charge Vue2 et Vue3.

Afin de prendre en charge le développement d'applications avec des exigences techniques plus élevées, de la modélisation de bases de données à la conception de pages en passant par la construction d'API Web, il n'y a presque aucune différence par rapport au développement de logiciels traditionnel. Cependant, le mode de visualisation low-code réduit le travail répétitif de création d'ajouts, de suppressions. , modifier et vérifier les fonctions .

Je suppose que tu aimes

Origine blog.csdn.net/Z__7Gk/article/details/132807681
conseillé
Classement