Comment les gens parviennent-ils à écrire et à maintenir du code extrêmement complexe et difficile à lire? [fermé]

27

La lecture du code source SQLite est une mission IMO impossible. Pourtant, il s'agit d'un logiciel utilisable assez complexe (c'est une base de données intégrée à part entière) qui peut être téléchargé, compilé et utilisé à partir du code d'autres personnes et il est constamment mis à jour.

Comment les gens parviennent-ils à écrire et à maintenir un code aussi complexe et difficile à lire?

acéré
la source
1
Je pense qu'ils ne le font pas :-D
Pawka
2
@Pawka: Où "ils" n'inclut pas les personnes SQLite.
Frank Shearar
11
Même si le code est complexe et difficile à lire, il peut tout de même être relativement bon compte tenu de la complexité du problème qu'il résout. Écrire du code simple et facile qui résout des problèmes difficiles est souvent tout simplement impossible, peu importe à quel point vous suivez les "meilleures pratiques". Ensuite, il est encore plus important de rendre le code aussi simple et clair que possible .
Joonas Pulakka
1
Quelqu'un a-t-il déjà vu un énorme projet facile à lire?
Jeff Davis
2
Embaucher des stagiaires, des post-doctorants, etc. et les faire faire ...
DarenW

Réponses:

19

Il y a une grande différence entre Complexe et Compliqué. Le lien suivant résume le tout. :)

http://codebetter.com/blogs/dru.sellers/archive/2009/09/25/complex-vs-complicated.aspx

Sur une note plus personnelle, je travaille sur une base de code de plus d'un million de lignes de code. J'y suis allé de la ligne 1 à son état actuel. Plus vous êtes farmilar (lire plus vous êtes dans le code), plus cela devient facile. Je ne peux pas vous dire ce que fait chaque ligne, mais je peux vous dire que vous deviez commencer à chercher une tâche ou un bug donné. Cela vient naturellement.

La morale de l'histoire est que, comme toute chose dans le monde de la programmation, cela prend du temps. Si vous vous attendez à regarder SQLite et à le savoir et à le comprendre, vous plaisantez. Il faudra du temps pour comprendre comment tout fonctionne ensemble. La différence entre un bon code et un mauvais code est la durée de ce processus.

Enfin, certains développeurs n'ont pas la possibilité de sauter dans une base de code et de commencer à le comprendre. Beaucoup se sentiront dépassés par la taille ou l'architecture de la base de code. D'autres n'auront aucun problème à y sauter. Tout dépend des points forts des développeurs.

Tony
la source
31

Dans le cas spécifique de SQLite, le principal outil qu'ils ont choisi d'utiliser dans le développement et la maintenance est le test automatisé. Ils sont fiers de la couverture à 100% (couverture de succursale, pas de couverture de relevé) dans leur suite de tests. Selon eux, c'est l'un des logiciels les plus testés au monde. Donc, ils savent tout de suite quand quelque chose qu'ils ont ajouté ou changé provoque une régression, et peuvent se développer sans crainte à la suite de cela.

http://sqlite.org/testing.html

Des chiffres assez stupéfiants - ils ont environ 640 fois plus de lignes de code de test que de code de production.

EDIT: Cette question a été soulevée d'entre les morts, semble-t-il! Et un peu plus d'un an plus tard, cette même page rapporte qu'ils ont 1177 fois plus de lignes de code de test que la production!

Dan Ray
la source
2
Personne d'autre que moi n'y voit un problème plutôt qu'un point de fierté ?
Stephen
1
pas vraiment je suppose. La base de données doit être fiable avant tout.
ts01
5
@Stephen, pourquoi de nombreux cas de test poseraient-ils un problème ?
1
une taille de temps? trop de tests est aussi mauvais que peu de tests (à mon humble avis)
Dainius
9
Comment un test peut-il être une perte de temps s'il couvre un cas possible où le code pourrait échouer?
Ramhound
7
  • les fonctionnalités évoluent avec le temps.
    • les nouvelles fonctionnalités sont motivées par les nouvelles exigences des clients.
    • L'ancien code a été écrit de manière à permettre l'ajout de fonctionnalités futures à implémenter sans casser l'ancien code.
  • experts du domaine (dans ce cas, la base de données est un domaine bien connu en informatique.)
  • rétroaction de la communauté
    • bogues
  • la courbe d'apprentissage abrupte n'était pas un problème pour les personnes bien préparées et persévérantes. Cela peut prendre 6 mois, 1 an ou même plus pour devenir confortable, et c'est ce que certaines personnes peuvent supporter.
  • motivations commerciales. sans soutien monétaire, très peu de gens peuvent investir du temps et de l'énergie dans la courbe d'apprentissage abrupte.
rwong
la source
4

Vous n'avez pas besoin d'avoir une compréhension intime de l' ensemble du projet pour pouvoir le maintenir. Habituellement, avec des logiciels volumineux et complexes, les gens auront leurs propres «domaines» particuliers dont ils s'occupent et ils n'ont qu'une connaissance «passagère» du reste du système.

SQLite est en fait relativement petit à l'échelle des "grands projets logiciels" mais si vous regardez quelque chose comme le système d'exploitation Windows, vous aurez des gens qui travaillent simplement sur le noyau, des gens qui travaillent juste sur le shell, des gens qui travaillent juste sur Internet Explorer, les gens qui travaillent simplement sur le gestionnaire de fenêtres, etc. etc. Quelqu'un qui travaille dans le "shell" ne pourra pas corriger un bogue dans le noyau en un rien de temps.

Il y a aussi l'avantage que ces projets évoluent avec le temps: ils n'ont pas toujours commencé aussi compliqués. Cela signifie qu'un nouveau développeur peut généralement être «formé» par des développeurs plus expérimentés.

Lorsque vous rejoignez une grande équipe de développeurs, vous recevrez un aspect particulier du projet sur lequel travailler (peut-être un bogue ou une nouvelle fonctionnalité) et vous aurez un autre développeur en tant que «copain» pour les premières itérations. Votre copain aura une bonne compréhension de la zone dans laquelle vous travaillez et pourra vous aider à vous repérer.

Pour les projets open source comme SQLite, c'est en fait un peu plus difficile car il n'y a aucune motivation pour les développeurs existants à "former" de nouveaux développeurs. Vous constaterez donc que vous êtes un peu plus seul. Mais vous pouvez toujours trouver de l'aide sur les forums de développeurs ou les listes de diffusion (par exemple, simplement en posant une question comme "Je voudrais implémenter telle ou telle fonctionnalité" ou "J'ai trouvé le bug XYZ, où dois-je commencer à chercher?" Et vous êtes susceptible d'obtenir une certaine forme d'aide.

Dean Harding
la source
Modifiez les détails, et cela ressemble beaucoup à mon travail actuel! La meilleure partie de cette réponse est la spécialisation et la nécessité de se développer au fil du temps. Ajoutez également une pincée d'humour sur le tout.
DarenW
4

Il y a une différence entre un projet difficile à lire et un projet complexe. Si une personne ne comprend pas profondément la langue dans laquelle le projet a été écrit ou le domaine du projet, cela ne signifie pas que le code est mal écrit.

Mon conseil:

  • Assurez-vous de bien comprendre la langue du projet. Il ne suffit pas de connaître la langue.
  • Apprenez tous les détails sur le domaine avant de mettre la main sur le code.

Pour moi, SQLite est loin d'être complexe et rien de compliqué. Le domaine de ce projet exige une compréhension approfondie des concepts larges.

Maniero
la source
3

Une chose qui n'est pas mentionnée dans les autres réponses est "Cela leur vient naturellement". La plupart des gens veulent écrire du bon code mais ils sont prêts à écrire du mauvais code. Certains des programmeurs que j'ai rencontrés sont naturellement des penseurs LINÉAIRES + parfois, très consciemment, ils proposent des solutions complexes. La plupart de ces personnes ne passent pas de temps à lire ou à apprendre du livre qu'elles apprennent au fur et à mesure que le travail l'exige.

Geek
la source
1
LOL, j'ai travaillé avec du soemone comme ça, s'il y avait plusieurs façons de faire quelque chose (et il y en a toujours), il choisirait invariablement la solution la plus compliquée et la plus compliquée. Je ne pense pas qu'il était même au courant de cela.
HLGEM
3

Comment les gens parviennent-ils à écrire et à maintenir un code aussi complexe et difficile à lire?

S'ils sont les codeurs d'origine et qu'ils continuent de le maintenir, ils ne le voient pas comme "complexe et difficile à lire". Ils le voient probablement comme "simple et facile à lire", car ils l'ont écrit eux-mêmes.

Tout code prend du temps pour le comprendre. C'est juste que certains prennent plus de temps que d'autres :)

lamcro
la source
2

Vous pouvez faire le tour de n'importe quelle base de code si vous en avez - de la persévérance, de la patience et une approche méthodique - mais principalement de la persévérance :-)

Nikhil
la source
1

La gestion devient beaucoup plus facile s'il y a des choses toujours faites de la même manière. Je ne connais pas le code SQLite, mais je travaille dans un environnement où il y a plusieurs projets. En plus de comprendre l'analyse de rentabilisation (logique eq), comme tout se fait essentiellement de la même manière partout (accès à la base de données, etc.), il est relativement facile de commencer à travailler sur un autre projet. Texte long court: les directives de codage - de manière appropriée - rendent la vie et ce code beaucoup plus faciles. Cela pourrait être l'un des assistants des codeurs SQLite.

Sascha
la source
1
  • Si vous êtes l'auteur original du logiciel et que vous l'avez travaillé pendant plus de 10 ans et que vous êtes un génie, il peut être possible de comprendre le tout. De gros morceaux de logiciels complexes (comme SQLite ou le noyau Linux) ont en effet exactement un auteur original qui en a une compréhension complète et approfondie, même si d'autres personnes ont contribué.
  • Si l'architecture logicielle est saine (forte cohésion, faible couplage), la compréhension de l'ensemble n'est pas une condition préalable pour y apporter des ajouts et des modifications utiles.
  • La compréhension d'un SGBDR ou d'un système d'exploitation est un cas quelque peu spécial, nécessitant une compréhension approfondie des principes CS sous-jacents. Ce n'est pas le cas avec les applications logicielles "ordinaires".
Joonas Pulakka
la source
1

Ils essaient de l'écrire de manière simple mais pas simpliste.

Aller aussi simple que possible rend les choses plus rapides à comprendre / lire, même si cela peut prendre un certain temps.

Klaim
la source
1

L'algorithme implémenté définit une limite inférieure sur la simplicité du code d'une implémentation. Si une description abstraite de l'algorithme à implémenter est extrêmement compliquée et nécessite que des tonnes de données différentes soient couplées les unes aux autres, alors le code implémentant ledit algorithme ne peut pas être simple, peu importe qui l'écrit.

En d'autres termes, l'une des raisons pour lesquelles j'écris parfois du code impénétrable est que, étant donné l'algorithme que je veux implémenter, je n'ai pas le choix.

dsimcha
la source