Quelles sont vos trois premières étapes lorsque vous présente d'abord un problème de logiciel? [fermé]

softwareengineering.stackexchange https://softwareengineering.stackexchange.com/questions/12864

Question

Je suis curieux de connaître les étapes très tôt que l'esprit d'un programmeur prend lors de sa première rencontre un problème qu'il est censé résoudre. Comment allez-vous commencer le raisonnement à ce sujet? Quelles sont les premières questions que vous vous posez ??.

Ok, laissez-moi le rendre plus concret pour ceux d'entre vous qui pensent que la question est trop vague ou entièrement dépendante de la situation. Choisissez tout des exigences suivantes et de penser à haute voix au sujet de vos premières impressions / / intuitions tendances sur la façon de le résoudre.

1) construire un simple traitement de texte avec environ autant de fonctionnalités que MS Word Pad
2) concevoir un seul jeu de cartes personne (par exemple Solitaire)
3) construire une calculatrice scientifique
4) Tout problème de votre choix avec échelle / complexité similaire à celle qui précède trois

Était-ce utile?

La solution

1) faire fonctionner . Même si elle ne fait rien, mais disons salut.

2) Analyse . Calculez ce dont il a besoin, ce serait bien, etc.

3) a immédiatement . Ajouter un comporte un temps à tester entre chacun.

Autres conseils

1) Spécifie . Briser le problème en plusieurs parties de base et de déterminer comment ils sont censés travailler. Lorsque le problème est déjà bien défini, comme un jeu de cartes avec des règles connues, un montant équitable de cette étape peut être passé sous silence, mais il est bon d'aller dessus juste pour vous assurer de comprendre le domaine du problème, ainsi que vous le pensez vous faites.

2) Mettre en place un référentiel de contrôle de code source pour le projet . Très important de le faire avant même de commencer à écrire de code.

3) Tirez votre IDE et commencer le piratage .

Mentalement, je fais ce qui suit, très rapidement et abstraitement

1) Exigences Gathering - Je créer rapidement une liste mentale de la fonctionnalité et la façon dont il peut être mis en œuvre

2) Méthodologie - J'essaie de savoir quelles technologies sont les mieux adaptés pour le travail

3) Identifier les problèmes - Avant même de commencer le projet que je tente d'identifier les problèmes qui peuvent survenir et comment les éviter dès le départ go

Dans le procédé que je fais ce qui suit:

1) Exigences Gathering - Je vais presque toujours créer une spécification du projet qui répertorie toutes les fonctionnalités, la façon dont les caractéristiques de travail, ce qu'ils font, ce qu'ils ne pas faire et les groupes d'utilisateurs seront les utiliser. Je pense que cela est essentiel, car il définit clairement les objectifs pour toutes les parties et peut aider à tester et Q.A. ainsi que de fournir un aperçu pour le développement.

Pour les projets payés, il assure également les clients ont pas d'attentes non satisfaits, mais je le fais pour des projets internes.

2) Développement - Développement pour moi comprend la mise en place d'un environnement de développement séparé de l'environnement de production, la mise en place de contrôle de version (Git pour moi), et se chaque caractéristique fait, faire des tests sur la manière.

3) Expérience utilisateur - La phase UX implique d'avoir un style Designer graphique tous les éléments sur le site / application que je suis un programmeur et ne devrait pas permettre de prendre des décisions de conception: P

Il consiste également à tester l'application et de faire des ajustements nécessaires. A la fin de cette phase, l'application / logiciel / site devrait être prêt pour une première version.

1. Est-ce que le programme existe déjà? Si le programme existe déjà sur le marché, je peux faire beaucoup mieux? Quelqu'un est-il intéressé par une meilleure version?

2. Would développer ce programme intéressant pour moi? Serait-ce une expérience growthful? Avec l'expérience, les développeurs ont généralement plus d'occasions de faire de la programmation qu'ils ont le temps disponible.

3. Que ressources dois-je? Pas assez? Négocier. Maintenant est le bon moment.

En fait, quand j'ai l'occasion de développer un programme, ou la résolution d'un problème, mes premières pensées tournent toujours autour de la question: Dois-je veux participer

Les gestionnaires pensent souvent qu'ils peuvent obtenir un ingénieur pour résoudre quoi que ce soit. Il est important de prendre soin de soi-même pour éviter d'entrer dans un désordre.

  1. existe déjà?
  2. Il semble complexe? Est-ce que je sais vraiment comment il devrait fonctionner?
  3. permet d'essayer un prototype!
  • Ma première réponse instinctive est d'entrer mode solutions . Mon cerveau commence à chercher des solutions, petites et grandes immédiatement. Cela arrive plus vite qu'il faut pour lire l'énoncé du problème.

  • Mais assez vite, je me surprends à aller dans cette (mauvaise) chemin, et me forcer consciemment dans mode Pro et je prends un pas en arrière.

  • Une fois Mode pro , j'écris un test.

Ma première question est toujours « Quel est le besoin / problème d'affaires nous essayons de résoudre? ». Trop de fois, on m'a demandé de construire une solution qui finit par ne pas aborder réellement le problème des clients.

Si je peux comprendre leurs besoins et objectifs, je peux assurer que ce que je construis sera utile. Cela permet aussi de réduire la mauvaise interprétation des exigences et réduit le nombre d'itérations nécessaires pour obtenir quelque chose d'utilisable en production.

  1. Qu'est-ce que je voulais exactement? À quoi ressemble la solution comme, par exemple. est un nouveau programme, la fixation d'un bogue dans une application existante, le remplacement d'un système, ou autre chose? Ceci est probablement similaire dans beaucoup de façons de la réponse de Mason Wheeler. Notez que ceci est tout ce qui est le produit fini, pas nécessairement ce que les paramètres sont là-dessus.

  2. Quels paramètres ne ce problème ont? Par exemple, je suis en train de résoudre ce dans l'heure, jour, semaine, mois, année, etc.? Quelle est la taille d'une solution que j'essaie de créer, par exemple. le remplacement d'un système de gestion de contenu d'un site Web peut être tout à fait différente à l'échelle que de créer un formulaire pour le suivi du temps gagné hors de l'intranet de l'entreprise? Quelle est la priorité d'obtenir ce fait? Suis-je Aptes à travailler à ce 24/7 pour le résoudre ou est-ce juste quand je suis dans le bureau et ce n'est pas quelque chose qui doit se résoudre tôt ou la compagnie est mort?

  3. Qui vient avec moi pour mettre en œuvre cette solution? C'est là après que je sais ce que je suis en train de faire et clouer quelques détails sur comment, pourquoi, quand et où ce sera, sur ma liste de choses à faire est de voir si cela est quelque chose que je peux faire seul , dois-je passer cette demande ainsi que d'un autre ministère comme si le correctif est un changement à un pare-feu ce ne peut pas être quelque chose que je peux faire moi-même, ou pourrais-je tirer dans d'autres pour aider à ce sujet? Parfois, un problème peut arriver à qui a une sensation « toutes les mains sur le pont » où plusieurs développeurs tentent de trouver des solutions, un peu comme la façon dont les différents médecins sur Maison essayer de proposer diverses idées différentielles.

Ce sont des aspects à mon point de départ à un problème donné. Parfois, clouer le problème peut être une lutte, comme il peut y avoir un cas où un développeur et un testeur ont des interprétations différentes des exigences et que quelqu'un doit être le juge et décider qui a raison et qui a tort. Parfois, les deux peuvent se tromper si la personne qui a créé l'exigence n'a pas obtenu suffisamment de détails et divers cas ont été laissées à l'interprétation. Après cela, il peut y avoir différentes solutions que je passe le long de ces différents plans pour quelqu'un d'autre de décider qui est celle à suivre: Une solution d'aide à la bande rapide qui ne devrait pas durer longtemps, mais peut travailler dans le très court terme , une solution modérée qui peut prendre plus de temps, mais mieux mieux à l'avenir intermédiaire, ou la solution de force industrielle qui peut être surpuissant mais résout définitivement le problème de façon permanente.

Je décomposer le problème en parties plus petites et plus petites jusqu'à ce que j'ai quelque chose qui ressemble à une solution au problème.

  • définir les différents ensembles (si nécessaire), par exemple UI / BLL / DAL / Tests.
  • Puis les « grands acteurs » (classes) qui vont dans les cartes de jeu par exemple, Jeu
  • Définir les noms (propriétés) et les verbes (méthodes) pour les principaux acteurs. J'utilise les valeurs que les retours en boîte pour presque tout.
  • Définir les principaux cas d'utilisation du système (ce qui va faire l'utilisateur). Câbler habituellement une interface utilisateur simple à conduire les classes sous-jacentes

Après cela, je commence à coller les morceaux ensemble et en remplaçant les valeurs en boîte avec une fonctionnalité réelle, refactoring si nécessaire.

Comme je l'écris chaque morceau de fonctionnalité I unité d'écriture et des tests d'intégration en tandem (je ne suis pas totalement vendus sur le TDD « premier test » partie encore - je ne sais pas ce que l'interface va ressembler jusqu'à ce que je l'écris et si je teste d'abord, je finis par faire trop refactoring du code de test).

Tous les projets que vous énumérez ne sont pas négligeables si vous voulez les faire correctement - à savoir un produit fini, poli, produit testé. Par conséquent, mes premières étapes sont:

1. Exigences / spécifications . Notez ce qu'il doit faire et ce qu'il ne doit pas faire. Donner la priorité au to-do - essentiels (ne peut pas fonctionner sans elle), belle-to-have et « si le temps de tuer ». Commandez les articles par ordre de priorité. D'accord avec celui qui paie pour le projet que ce soit le bon ordre. Restez à l'étape 1 jusqu'à ce que vous avez un accord.

2. Design . Extrayez l'interface utilisateur - quelles seront les caractéristiques ressemblent à l'utilisateur. Cela ne doit pas être assez - crayon et du papier fera - mais il vous aidera à travailler à travers le flux de travail de l'utilisateur et de ce viendra le haut niveau de conception, les principaux composants / modules de l'application. Cela ne doit pas être un effort « grand design à l'avance », mais une interface utilisateur médiocre ou flux de travail va tuer toute chance de succès. Travailler avec le promoteur du projet (celui qui paie) jusqu'à ce qu'ils soient satisfaits de l'UX.

3. Développement itératifs . Mettre en œuvre le code juste assez pour atteindre l'exigence suivante sur la liste hiérarchisée, conforme à la conception et flux de travail. Vérifiez dans ce code. Faire preuve de parrain du projet. Aller à 3.

J'essaie toujours de commencer le développement avec 3 questions à l'esprit:

  • Dois-je comprendre le besoin réel de l'entreprise ?

Très souvent, le « problème présentant » est pas le vrai problème.

Par exemple, je me recenly demandé de produire une gestion de projets complexes framwork quand tout l'utilisateur nécessaire était une liste statique des tâches avec une zone de texte de progression à côté de chacun.

Des questions comme « ce seront les utilisateurs réellement utiliser pour? » sont utiles pour obtenir le vrai problème.

  • Est-ce vraiment un problème de programmation "?

La fonctionnalité requise existe déjà dans une application que nous avons déjà? Que nous pouvons acheter? Pourrait-on utiliser à la place stylo et du papier?

Par exemple, le « construire un simple traitement de texte avec environ autant de fonctionnalités que MS Word Pad » doit répondre avec « avez-vous envisagé d'utiliser WordPad » plutôt que d'un projet de programmation.

On m'a déjà demandé de construire une base de données qui stocker des informations sur les processus industriels, avec une série de rapports de gestion qui énumèrent les processus qui sont tombés dans certaines catégories. Il est avéré qu'un maximum de 33 dossiers serait créé dans la base de données, et qu'il serait utilisé par 3 personnes qui se sont assis côte à côte. La solution parfaite est un fichier physique contenant 33 feuilles de papier A4. Les utilisateurs auraient pu compter physiquement les pages pour produire leurs rapports de gestion. (Chose curieuse, la direction a décidé d'acheter dans un système à la place! Au moins, je suis libre d'aller faire un travail de valeur).

  • Dois-je comprendre les priorités réelles du client ?

Dans toute application, certaines fonctionnalités sont plus importants que d'autres. Il est important d'obtenir idée claire de ce qui compte vraiment pour vos utilisateurs. Parfois, les choses qui sont importantes pour nous en tant que développeurs (par exemple. Que de peu compliqué) sont moins importants pour nos custiomers (par exemple. Le look and feel de l'application).

Un collègue développeur m'a dit récemment au sujet d'une démonstration de l'application web qu'il a fait pour vérifier que l'application répond à leurs besoins. Il était frustré becasuse les utilisateurs ont été incapables de voir au-delà de la conception des pages. Pour ces utilisateurs, était initialement plus appearence important que la fonctionnalité, si nécessaire pour être prioritaire par l'équipe de développement.

En termes de décider ce qu'il faut faire:

  1. Quel est le besoin? Qui en a besoin? Pourquoi? Comment sera-t faire de l'argent (ou d'atteindre un autre but pour les projets non monétaires). Combien est disponible à dépenser pour elle. Sont les rendements susceptibles de justifier les dépenses likley.
  2. Quelles sont les caractéristiques les plus précieuses. Quelles sont les caractéristiques les plus inconnues; susceptible d'être la plus risquée (c'est-à-dire, le plus imprévisible). Essayez de décomposer les caractéristiques dans les plus petits morceaux, le client peut toujours reconnaître (accepter) comme caractéristiques. Vous n'avez pas besoin d'identifier toutes les fonctionnalités, juste essayer d'obtenir quelques-unes qui ont une grande valeur pour le client.
  3. Mettre en œuvre la caractéristique la plus risquée, la plus précieuse (trade off pour obtenir la valeur maximale et supprimer le risque maximal au début du projet).

En termes de décider comment le faire:

  1. Y at-il qui résout déjà le problème tout code existant / technologie / produit / service, puis-je utiliser ou adapter cela?
  2. Sinon, quels sont les concepts de domaine impliqués et les contraintes techniques sur la solution.
  3. Mettre en œuvre la fonction d'essayer d'obtenir l'expression la plus simple des parties du modèle de domaine requis pour cette fonction. Découpler le modèle de domaine autant que possible de toute considération technique (technologie de base de données par exemple, OS, machine client vs nuage, etc.). J'utilise généralement une approche axée sur de test pour y parvenir.
Licencié sous: CC-BY-SA avec attribution
scroll top