Software bugs? Vermijd deze 10 kostbare programmering fouten

Waarom doen programma’s mislukken? Voor zover wij hebben afgelegd sinds de allereerste keer Ada Lovelace zag het potentieel van de universele berekening in de 19e eeuw, onze software heeft nog steeds bugs. Door de jaren, hoewel we vele geavanceerde manieren hebben ontwikkeld om succesvolle ervan heeft programma nog breken.

Maar waarom?

Terwijl het antwoord op die kunnen worden genomen in een aantal existentiële richtingen, hebben we besloten om een ​​praktisch antwoord te geven. Programmeurs maken fouten. Ze krijgen soms slordig. Ze hebben niet altijd de beste gereedschap of best practices.

De directeuren worden steeds meer gebruik van een IT-omgeving die niet meer is gericht op grote, lange projecten, maar korter, meer duurzame inspanningen om verandering en innovatie te stimuleren. Hier zijn de voors en tegens, en hoe het te laten gebeuren.

Ik geef les object georiënteerd programmeren in het UC Berkeley uitbreiding, waar ik breng zoveel (of meer) tijd leert een goede programmering praktijk Ik weet studenten te helpen begrijpen van de code zelf. In mijn lessen, zie ik een veel voorkomende fouten, en ik zal een aantal van die met u in deze kolom te delen.

Ik bereikte ook uit naar Professor James A. Connor van Northwestern Polytechnic University’s School of Engineering en vroeg hem om een ​​aantal veel voorkomende fouten zijn studenten te delen.

Ik ga eerst, en dan zal ik Jim’s inzichten met u delen.

Fout # 1: Slechte commentaar praktijk

Reacties zijn elementen van de tekst in een programma dat de computer niet uit te voeren. Ze zijn geschreven door een programmeur als notities, uit te leggen wat er aan de hand in de code.

Veel van mijn studenten vermijden commentaar hun code, en begrijpen niet waarom ze hun tijd weg moet nemen om daadwerkelijk codering om wat notities te schrijven. Mijn meest praktisch voorbeeld komt uit mijn eigen leven.

Ik schreef Versie 1.0 van ZENPRESS, een van de eerste content management systemen, terug voor het begin van de eeuw. Ik verwachtte dat het te leveren artikelen voor een paar jaar. Veertien jaar later, is het nog steeds toevoeren van artikelen, die bereid zijn bijna 75.000 artikelen en gevoed 2,6 miljard pagina’s.

Uiteindelijk, het platform dat werd uitgevoerd op overbodig geworden. Ik moest terug in de code duiken. In 2009, ik geport vanaf de oorspronkelijke platform om een ​​modern. Onlangs had ik het opnieuw te veranderen, omdat een belangrijk kenmerk van de taal PHP gewoon in een versie upgrade verdwenen.

Er is geen manier zou ik herinner me hoe al die code werkte na 19 jaar, maar omdat ik mijn code goed had gereageerd, had ik iets van een wegenkaart. Ik was in staat kijkje op mijn code, zie mijn aantekeningen ingebed met de code, en maak fixes.

Reacties zijn ook belangrijk als je werkt aan een team, of wanneer uw software zal leven voorbij uw rentmeesterschap. U kunt verder te gaan met je carrière, en iemand anders kan het nodig zijn om binnen te komen en te begrijpen uw code. In een reactie zal helpen.

Fout # 2: Slechte variabele naamgeving

Ik ga mijn thema van het maken van de code te begrijpen door middel van taal voort te zetten. Ik zal dit illustreren met een voorbeeld. Laten we zeggen dat je in een auto die 20 mijl per gallon krijgt en je rijdt 100 mijl. Hoeveel gas heb je gebruikt?

Wolk, Cloud computing opgroeit, een API in een tijd, Developer, Google koopt Apigee voor $ 625.000.000, hardware, Raspberry Pi vliegt tien miljoen omzet, viert met ‘premium’ bundel; Veiligheid; Adobe reanimeert NPAPI Flash voor Linux na 4-jaar stasis

Het is een simpel voorbeeld, maar het werkt voor onze doeleinden. Laten we zeggen dat je de lijn a = b / c tegenkomen. Wat doet een bedoel je? Wat zijn b en c? Hoe verhouden zij zich tot de rest van je code? Tien minuten nadat u de routine te schrijven, je gaat om te vergeten. Never mind als iemand anders heeft om binnen te komen en maak fixes of schrijf een update.

Kijk nu eens naar deze uitdrukking: gallons = mijl / mpg. Het is meteen duidelijk wat elk van de variabelen is bedoeld om te doen. Eén vertegenwoordigt gallons, een vertegenwoordigt mijl en één staat voor mijl per gallon. Het is duidelijk.

Denk na over de relatie van het geven van variabelen duidelijke, Engels-talige namen (of wat uw moedertaal gesproken taal is) en commentaar. Laten we zeggen dat je een stuk code erven en zie je a = b / c. Wat doet het? Heb je enig idee?

Zorg dat u uw variabelen op een manier die de functie vertegenwoordigt noemen. Je zult een hoop tijd besparen en een hoop kopzorgen.

speciale eigenschap

Fout # 3: Geen lab notities

Ik begon te schrijven ZENPRESS medio 1997 en het live gegaan in januari 1998. Helaas, ik was in een haast om het project af te maken, en ik wilde niet de tijd om lab notities te schrijven voor dat de eerste release te nemen. Ik heb het vaak spijt sindsdien. Te beginnen in juni 1999, toen ik op versie 2 begon, hield ik regelmatig lab notities.

Lab noten zijn records die verder gaan dan de opmerkingen in de code. Wetenschappers gebruiken lab merkt de hele tijd als een dagboek of dialoog van hun ontwikkelingsproces. Lab notes zijn gebruikt om het eigendom van wetenschappelijke ontdekkingen te bewijzen, omdat het proces van exploratie vaak wordt gedocumenteerd in het dagelijks journaal dat wetenschappers gebruiken om de voortgang te nemen.

Lab noten zijn een krachtig hulpmiddel voor programmeurs ook. Mijn laatste lab opmerking voor ZENPRESS werd in maart van dit jaar geschreven, toen ik moest de Zatz archieven van de ene provider naar de andere. Ik blijf regelmatig lab notities op mijn andere projecten als goed, en ik heb al vele malen gered door de mogelijkheid om terug te gaan naar mijn aantekeningen.

speciale eigenschap

Als u nog niet bent houden lab notities, nu beginnen. Noteer wijzigingen die u hebt gemaakt, uw redenering, de dingen die je gezien en weggegooid, verwijzingen naar nuttige middelen, en iets anders dat de toekomst zou helpen. U zult ook moeten helpen je toekomstige collega’s of vervangingen – of een rechter als je nodig hebt om het eigendom te bewijzen.

Fout # 4: Niet schrijven in een menselijke taal

Mijn leerlingen hebben niet alleen te programmeren om hun klassen passeren. Ze moeten ook discussiebord berichten dat hun begrip van bepaalde codering concepten demonstreren schrijven.

We hebben deze om twee redenen. Ten eerste, is natuurlijk het aantonen van begrip van de concepten. Maar veel belangrijker is dat alle professionals te kunnen schrijven.

Afronden

Ik krijg veel push terug op deze van mijn studenten. Ten minste twee elk semester huilen, “Ik wil een programmeur, geen schrijver zijn.” Maar programmering, techniek, IT – bijna alle professionele inspanningen – bestaan ​​niet in een vacuüm.

Je moet om te schrijven om concepten uit te leggen, om een ​​idee te pitchen, om de financiering te krijgen, om te vragen om opheldering, om een ​​voorstel voor te bereiden, of zelfs om te pleiten voor een betere kwaliteit. Open source deelnemers aan het project te werken als collega’s in zeer uitgebreid teams, en de enige manier waarop ze kunnen blijven in sync is door het schrijven van duidelijke en begrijpelijke boodschappen.

De bottom line is simpel: als je wilt professioneel werk of werk te doen op iets van belang zijn, moet je schrijven in een menselijke taal, zoals Engels, en niet alleen in een programmeertaal.

Fout # 5: Slechte code opmaak

Zoals u ongetwijfeld hebt opgepikt, er is een thema hier: maak code begrijpelijk. Code onderhoud is enorm tijdrovend en duur. Eerlijk gezegd, het is niet zo heel veel plezier. Het is veel beter om te kunnen productieve tijd het toevoegen van mogelijkheden dan tot weken te besteden graven door oude code, proberen te achterhalen wat u (of de persoon die je de code uit geërfde) probeerden te doen door te brengen.

Ik heb dit persoonlijk ervaren, niet alleen van mijn oude code, maar van code die ik heb geërfd. Ik Keurt verlaten WordPress open-source plugins als een zijproject. Voor zover ik weet, heb ik meer dan wie dan ook goedgekeurd (en ik spreek over dat onderwerp dit weekend op WordCamp). Elke plugin is ontwikkeld door iemand anders, en te blijven werken, heb ik moest graven door code vreemden ‘.

Gelukkig, de ontwikkelaars waren uitstekend beoefenaars van de programmering kunsten. Ik zou niet hebben genomen aan deze projecten als ze niet waren. Maar toch, het is al een uitdaging om op snelheid te komen. Kun je je voorstellen hoe moeilijk het zou zijn geweest als hun code was slecht gestructureerd?

Door gestructureerde, bedoel ik de manier waarop de code wordt aangelegd. Ik heb een video op dit voor mijn studenten. U bent welkom om hem te bekijken op YouTube.

Denk na over de artikelen die u online te lezen. Sommige zijn mooi opgemaakt, met een lijn tussen elke paragraaf, en alles is consistent. Sommige artikelen, hoewel, hebben alles geregeld in één grote blob, en ze zijn onmogelijk om te lezen.

Iedere programmeur (of project) heeft de neiging om een ​​programmering stijl hebben. Het is niet zo kritisch wat je stijl is, zolang het consistent is. Je moet laten de code formaat u te begeleiden.

Bijvoorbeeld, in mijn code, ik aandringen op nooit met meer dan één witregel tussen secties. Als ik zie een groter deel van de witte ruimte, ben ik dan ook meteen gecued in op het feit dat er iets niet is zoals het hoort te zijn, kan er een bug in dat gebied.

Als je vooruit in uw code te verplaatsen, onderzoeken of uw organisatie een codering stijl. Denk aan het definiëren van een stijl van coderen voor al uw programmeurs, en vasthouden aan een die duidelijk en bevordert onderhoudbaarheid.

Fout # 6: Slechte foutcontrole

Sommige beroemde generaal heeft eens gezegd dat een plan nooit overleeft een ontmoeting met de vijand. Mijn variant daarvan is dat de code niet zal overleven zoals verwacht bij het ondervinden van de gebruikers. Ook al heb je denkt dat je weet hoe gebruikers uw code zal gebruiken, geloof me op deze: je doet het niet.

Gebruikers zullen uw code te breken.

De manier om dit goed te behandelen is met het testen en foutcontrole. Foutcontrole is de praktijk van het controleren van het resultaat van elke operatie in de code. Zorg ervoor dat het is of wat je verwacht, of dat de code het onverwachte resultaat aankan.

Mijn studenten bijvoorbeeld een opdracht die omvat het lezen van een bestand. Bijna alle van hen de code te schrijven door te bellen naar het bestand te lezen routine. Zij controleren of de gebruiker het dialoogvenster annuleert, maar ze zelden controleren om te zien of het bestand daadwerkelijk wordt gelezen, of als er een systeemfout van een soort. Het is nog erger wanneer ze proberen een bestand te schrijven. Ze bijna nooit daadwerkelijk te controleren om te zien of het bestand was, in feite, opgeslagen. Oeps.

U kunt zien hoe dit kan slecht zijn. Om dit tegen te gaan, moet je altijd na te denken over de vraag of je absoluut gedrag kan voorspellen – en dan besef je niet kunt. Je moet om te testen. Testen niet alleen impliceert het uitvoeren van de code zelf. Testen betekent laten echte gebruikers, mensen die mogelijk gedragen in onvoorspelbare manieren, lopen uw code.

U vindt het oneindig informatief vinden.

Fout # 7: Het gebruik van druk verklaringen in plaats van een echte debugger

Ik heb ontdekt door de jaren heen dat de programmeurs van verschillende talen de neiging om verschillende culturen. Voor een groot deel, dat is omdat ze de bouw van verschillende soorten oplossingen en het gebruik van verschillende instrumenten.

Een voorbeeld hiervan is het verschil tussen mijn C # programmeren studenten en de open source PHP ontwikkelaars Ik werk met op een aantal van mijn projecten. Zou bijna geen C # programmeur ooit eens debuggen diens code zonder het gebruik van een symbolische debugger. Dat komt omdat C # native wordt geprogrammeerd met behulp van Visual Studio als de codering milieu, en een debugger is ingebouwd.

Daarentegen heb ik een nooit eindigende stroom van PHP ontwikkelaars die alleen maar denken dat het laten vallen van een echo statement of var_dump is goed genoeg om hen te helpen debuggen hun code gezien. Voor een deel is dit omdat de meeste PHP-programmeurs hebben de neiging om te programmeren in een editor, niet een ontwikkelomgeving. Een groot verschil tussen de twee is de debugger.

Dus wat is een debugger? Simpel gezegd, het is een tool die u toelaat om te kijken in uw code als het draait. Beschouw het als een X-ray, echografie of MRI voor uw code. U kunt de debugger vertellen om te stoppen op bepaalde punten voor u om de status van alle variabelen te onderzoeken. U kunt uw debugger vertellen om te stoppen op bepaalde voorwaarden. U kunt waarden veranderen. U kunt kijken naar en het profiel waarden (hoewel profilering is soms een aparte tool).

Het verschil in productiviteit kan aanzienlijk zijn. Als u wilt dat om de klus sneller en met veel meer nauwkeurigheid gedaan, zorg ervoor om een ​​echte symbolische debugger gebruiken.

Met dat, mijn deel van de tips en observaties is voorbij, en ik draai over de vloer aan Professor James Connor.

Fout # 8: Het gebruik van magische getallen

Veel programmeurs denk dat ze gewoon moeten een keer coderen en het zal perfect zijn. Echter, om de lange-termijn levenscycluskosten van bedrijfs- en industriële software optimaliseren, moet code die veranderende omstandigheden kan weerstaan ​​schrijven.

Een klassiek voorbeeld hiervan is het idee van Magic Numbers. Door magie, bedoel ik nummers die de programmeur denkt dat zal altijd overleven de tand des tijds.

Neem, bijvoorbeeld, een commissie berekening die zou kunnen worden op basis van de klant aankoopbedrag. Op het moment van schrijven, zou de commissie percentage drie procent, of 0,03 zijn.

Nu, voorstellen hoe deze code kan worden geschreven: commissie = 0,03 * te koop. In dit verband is het magische getal is 0,03. Sinds de programmeur denkt dat dit zou voor altijd magisch geldig te zijn, hij harde codes het nummer 0.03 in de code.

Dat is allemaal goed en wel, maar commissies hebben de neiging om te veranderen van jaar tot jaar. Als het volgende jaar de commissie stijgt met een half procent, tot 0,035, zal het heel moeilijk zijn om te jagen in de duizenden regels code.

In plaats van het gebruik van magische getallen, definieert variabelen of constanten op een plaats, en laat uw code te gebruiken die variabelen. Als je pre-definiëren commission_rate, dan code als commissie = commission_rate * verkoop zal niet hoeft te worden gewijzigd.

Een ander ding te overwegen is dat waar je ook een magisch nummer te vinden, je zou kunnen hebben een optie die u wilt blootstellen aan de gebruiker, die u hem of haar set in een sectie voorkeuren kan laten geïdentificeerd.

Fout # 9: Slordig datums en tijden

Hier is een moeilijke vraag: hoeveel dagen in een jaar? 365 kan het normale antwoord, maar dit jaar, natuurlijk, is 366. Zijn er ooit 365,25 dagen in een jaar? Nee er zijn niet.

Maar sommige van mijn studenten hebben beslist dat er sinds schrikkeljaar komt eens in de vier jaar, zijn er dus 365,25 dagen per jaar gemiddeld. Bij uw datumberekeningen maken zij dit gemiddelde, en, als gevolg, niets is correct.

Vaak is het beter om een ​​systeem bibliotheek te gebruiken om data te berekenen, omdat de data die u berekenen misschien niet westerse kalender data.

Laten we eens kijken naar een soortgelijk probleem met de tijd. Elke jaren als de Aarde vertraagt, een extra tweede wordt toegevoegd aan een dag, gewoonlijk aan beide juni 30 of 31 december Dit wordt een tweede sprong en dus is het mogelijk om de klok gaan van 11:59: 59 tot 11:59:60 naar 00:00:00.

Hier is een tweede keer uitdaging. Op plaatsen waar de zomertijd in gebruik is, is het mogelijk om transacties te komen buiten de orde. Bijvoorbeeld: Transactie A wordt eerst geplaatst, maar tijd achteruit gereset door één uur, dan Transaction B is geplaatst. Echter, als je slordig tijd sequencing, zal worden opgenomen dat Transaction B gebeurd eerste. Dit type van fout kan leiden tot financiële boete van ten onrechte te worden gemaakt en allerlei andere chaos.

Nogmaals, er zijn veel goede taal en systeem bibliotheken opgezet om beide van deze tijd problemen tegemoet te komen. Het is vaak beter om bestaande bibliotheken gebruiken dan om je eigen tijd berekeningen te coderen.

Fout # 10 Niet kiezen van de juiste datastructuren

Een gegevensstructuur is een mechanisme voor het weergeven van gegevens in de programma’s. Velen van jullie hebben termen als gelinkte lijst, boom, en de vele gehoord. Elk van deze zijn logische voorstellingen van gegevens die overeenkomen met een aantal architectonische structuur van wat je probeert te vertegenwoordigen.

Een van de meest voorkomende fouten die ik zie programmeurs doen – zowel zowel ervaren programmeurs en newbies – besteedt te weinig aandacht aan datastructuur keuze. Aangezien bijna al uw code is gebaseerd op uw keuze van de data representatie methode, het kiezen van de verkeerde data structuur kan kostbare gevolgen hebben langs de lijn te hebben.

Hier is een voorbeeld dat dit soort ontwerpfout illustreert: het kiezen van een eenvoudige stapel of wachtrij, in plaats van een cirkelvormige wachtrij. Denk aan een stapel als een stapel gerechten. Je de onderste schaal naar beneden, dan een schotel geplaatst dan andere, enzovoort.

Het internet van de dingen is het creëren van nieuwe ernstige veiligheidsrisico’s. We onderzoeken de mogelijkheden en de gevaren.

Als u wilt een gerecht te verwijderen, neem je vanaf de top van de stack. Dit is de zogenaamde last-in, first-out. Het probleem is, als je nodig hebt om iets eerder te verwijderen in de stapel, het is een gedoe. Laten we zeggen dat je tien gerechten in de stapel. om de eerste te krijgen, moet je alle anderen eerst te verwijderen.

Laten we nu denken aan een wachtrij. Als je in de rij staan ​​bij de bank, je bent in een wachtrij. De eerste persoon die is ook de eerste persoon uit. Zodra de eerste persoon wordt geserveerd, de volgende persoon is, en die persoon wordt geserveerd. Het andere ding dat gebeurt, is dat elke persoon neemt een stap voorwaarts, omhoog te bewegen in de wachtrij.

Wat gebeurt er als er te veel mensen opdagen? Ze zijn ofwel weggestuurd of de lijn gaat de deur uit. En wanneer de eerste, heet, al deze mensen moeten bewegen.

Wanneer u een grote hoeveelheid gegevens, kan een wachtrij van dit soort enorm inefficiënt zijn. Telkens wanneer data wordt getrokken vanaf het begin van de wachtrij, de gegevens moeten bewegen. We zitten in een big data wereld, waar we een constante stroom van gegevens via onze systemen.

In dit verband is het misschien beter om een ​​cirkelvormige wachtrij te implementeren. In dit geval, de data niet beweegt. In plaats daarvan wordt een pointer ingesteld dat aan het begin en einde van de wachtrij en, intern, de rij omsluit zelf, zodat de gegevens zijn geordend in een ring in plaats van een lijn. Wanneer een data-element wordt gebruikt en geëlimineerd uit de ring, is er geen noodzaak om alle gegevens in de ring te verplaatsen. Alles wat er gebeurt is het eerste element wijzer naar een nieuw element in de ring.

Dit is maar één van de vele voorbeelden van hoe de keuze van de juiste gegevens structuur enorme gevolgen voor de efficiëntie en effectiviteit van de code kan hebben.

David hier. Ik wil graag een grote shout-out van dank aan professor Connor te sturen voor het delen van een aantal van zijn inzichten. Hopelijk tussen mijn tips en zijn, zul je efficiënter en effectiever programmeurs en te voorkomen dat een aantal van deze ernstige fouten.

By the way, ik doe meer updates op Twitter en Facebook dan ooit tevoren. Zorg ervoor dat u om mij te volgen op Twitter op @DavidGewirtz en op Facebook op Facebook.com/DavidGewirtz.

Cloud computing groeit op, een API in een tijd

Google koopt Apigee voor $ 625.000.000

Raspberry Pi raakt tien miljoen omzet, viert met ‘premium’ bundel

Adobe reanimeert NPAPI Flash voor Linux na 4 jaar stasis