TweetFollow Us on Twitter

Dumb bugs
Volume 9
Number 11
Column TagsState of the Industry

Glenn’s Philosophy on Programming

Tricks to avoid wasting time on “dumb” bugs

By G. Weinreb, Somerville, Massachusetts

The most important thing in software development is that the programmer must love their code. If the programmer does not love his code, coding becomes a chore as opposed to a joy, causing code quality, coding productivity, and the programmer's mental state to degrade. In order for a programmer to love their code, ALL of the following must be true:

• The code must be well organized with specific functionality localized to one area, as opposed to appearing multiple times.

• ALL routines must be extremely well tested.

• ALL routines must be extremely well documented.

• Many routines must contain defensive code, especially the low level ones.

• The programmer must have a decent machine with which to develop.

• The programmer must have a decent development environment and a decent understanding of how to use it.

• The programmer must have a good debugger. Working with complex black boxes, into which you cannot peer, is a hell that I would not wish upon even the fiercest of competitors.

The fundamental principle behind programming is that each issue must be localized to one area (e.g. one function); and that this one area do it's job extremely well (i.e. employ defensive code, include outstanding documentation, and be extremely well tested). And then all the other routines are to rely on ONE to implement the specific functionality. If similar functionality is copied and implemented in different places, then the programmer has less time to make each copy solid. Unsolid (non defensive, non documented, non tested) code leads to the following scenario:

A programmer is programming one function that calls another, and finds that the called one is not working well. So the programmer stops what he/she is doing and goes to fix the lower level routine. Now, if it is undocumented, the programmer needs to read each line, figure out what it's doing, and then document it - which can take more time than coding the thing from scratch. Therefore, undocumented code is in a sense disposable - you use it once and then throw it away and get another (like a Kleenex) when you need to change it. So the poor programmer documents the routine, tests it and makes it solid. But then we find that many other routines call this function, and our making it solid has changed it a little, causing it to not work for some of it's other callers. Subsequently, the programmer must fight to make it work in all cases - which requires coding in other areas - which can lead to new frontiers. And much time goes by while the poor programmer has accomplished very little on the original routine. And subsequently, they find it very hard to love their code.

So,

• Code MUST be well documented, which includes:

+ function headers for all functions

+ descriptive headers for each file

+ descriptions of passed arguments

+ documentation in the code which describes what it does and how it does it

• Code must be thoroughly tested because the devil is in the details and the details are what will bite you. Subsequently, you've got to DIG, DIG, DIG to uncover those subtle little problems. And the key to this is to have the confidence that they exist, else you will not dig for them - SO ASSUME THEY EXIST AND DIG, DIG, DIG.

• Code MUST be defensive in order to get ahead of the bugs. Defensive coding entails looking for problems and showing an alert if one is found. Several examples:

a) Arguments passed to low level routines (i.e. the one's called by many other routines) are checked if doing development. A global variable, 'gDevelopment', is set TRUE when doing development, and at any time, the user can press an Option key to toggle the state of 'gDevelopment' TRUE/FALSE. 'gDevelopment' is typically used in the following way:

/* 1 */

void SetUserItem (
 DialogPtr dialog, //ptr to dialog box
 short itemNr,   //item's DITL #
 ProcPtr doDraw) //procedure pointer for                       
 //user  DITL item
{
 if (gDevelopment)  {// if doing develop...
 if (IfPtrIsNullOrBadYell ((Ptr) dialog, 1))                   return;
 // test for null or bad ptr
 if (IfDitlNrIsBadYell (itemNr, TRUE)) return;           // test for 
bad ditl #
 if (IfPtrIsNullOrBadYell ((Ptr) doDraw, 1))
 return;// test for null or bad ptr
 }
 body .....
 body .....
}

Subsequently, if there is trouble, the programmer knows about the problem before it causes harm. And bugs can cause harm in a manner which is not obvious and/or a manner which does not lead the programmer to the bad code (e.g. a bug in area A destroys memory in area B, which crashes 100 mouse clicks latter). Defensive coding is like being at the window with a shotgun when the burglar climbs in - "Hey, what the hell do you think you're doing?". Programmers must get ahead of bugs, not behind, in order to love their code.

Someone playing devil's advocate might say, "Doesn't it take time to install defensive code and doesn't it slow your program?". It does take some time to implement, yet not much since it involves mindless cut/copy/paste of similar existing code fragments. The time for the processor to check for 'gDevelopment' TRUE is less than a microsecond (for perspective, HLock() costs 121µs on a Mac IIcx). Subsequently, adding "if (gDevelopment)" increases execution time by only a tiny amount. Freeing the programmer from fighting bugs will give him/her more time to optimize code - which will save orders of magnitude more execution time.

b) One can use macros to add defensive coding to toolbox routines. e.g.

/* 2 */

 #define HLock_(h) \
 \
 if (gDevelopment) { \
 if (CheckHandle((Handle) h, TRUE, TRUE))    \
 HLock((Handle) h);\
 } \
 else if (h){    \
 HLock((Handle) h);\
 }

This simple little macro has saved my life on a number of occasions.

c) We will define the phrase "memory problem" as code which writes to memory where it should not, and possibly causes trouble in an unrelated area and/or in an intermittent way - both of which are infamous to programmers. In the case of a "memory problem", one must have a strategy for dealing with it (other than fumbling around and saying, "Gee's, this really IS a tough one."). One technique is to use a global, 'gShakeLikeHell', which is toggled TRUE/FALSE by pressing an Option key (it is always set to FALSE when you first launch the application), and a macro defined as follows:

/* 3 */

#define SHAKELIKEHELLIFSHAKING\
 \
 if (gShakeLikeHell) \
 ShakeLikeHellifShaking();

ShakeLikeHellifShaking() compacts the heap, creates handles, disposes of handles, and tests existing data structures. If you have an intermittent or nebulous bug, the best response is to install the SHAKELIKEHELLIFSHAKING macro throughout your code under development, run the application, and press the Option key to turn it on. Chances are you will crash, or see the problem sooner (i.e. closer to the bad code). Ideally you would like to isolate the problem area between 2 SHAKELIKEHELLIFSHAKING macros (which is a mechanism which identifies if the problem does or does not originate from a specified range of code). After installing the macro, you can leave it in your code - it cost less than a microsecond. [Except for the time spent in the ShakeLikeHellifShaking routine. - Tech. Ed]. Installing this macro may seem silly, yet I can attest it has worked beautifully on many occasions - encouraging me to love my code.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

HandBrake 1.0.2 - Versatile video encode...
HandBrake is a tool for converting video from nearly any format to a selection of modern, widely supported codecs. Features Supported Sources VIDEO_TS folder, DVD image or real DVD (unencrypted... Read more
PhotoDesk 4.1.5 - Instagram client for p...
PhotoDesk lets you view, like, comment, and download Instagram pictures/videos. (NO Uploads! / Image Posting! Instagram forbids that! AND you need an existing Instagram account). But you can do so... Read more
Sound Studio 4.8.6 - Robust audio record...
Sound Studio lets you easily record and professionally edit audio on your Mac. Easily rip vinyls and digitize cassette tapes, or record lectures and voice memos. Prepare for live shows with live... Read more
Capo 3.5.1 - Slow down and learn to play...
Capo lets you slow down your favorite songs so you can hear the notes and learn how they are played. With Capo, you can quickly tab out your songs atop a highly-detailed OpenCL-powered spectrogram... Read more
Google Earth 7.1.8.3036 - View and contr...
Google Earth gives you a wealth of imagery and geographic information. Explore destinations like Maui and Paris, or browse content from Wikipedia, National Geographic, and more. Google Earth combines... Read more
QuickBooks 16.1.11.1556 R12 - Financial...
QuickBooks helps you manage your business easily and efficiently. Organize your finances all in one place, track money going in and out of your business, and spot areas where you can save. Built for... Read more
Google Earth 7.1.8.3036 - View and contr...
Google Earth gives you a wealth of imagery and geographic information. Explore destinations like Maui and Paris, or browse content from Wikipedia, National Geographic, and more. Google Earth combines... Read more
QuickBooks 16.1.11.1556 R12 - Financial...
QuickBooks helps you manage your business easily and efficiently. Organize your finances all in one place, track money going in and out of your business, and spot areas where you can save. Built for... Read more
FileZilla 3.24.0 - Fast and reliable FTP...
FileZilla (ported from Windows) is a fast and reliable FTP client and server with lots of useful features and an intuitive interface. Version 3.24.0: New The context menu for remote file search... Read more
Bookends 12.7.8 - Reference management a...
Bookends is a full-featured bibliography/reference and information-management system for students and professionals. Bookends uses the cloud to sync reference libraries on all the Macs you use.... Read more

Super Mario Run dashes onto Android in M...
Super Mario Run was one of the biggest mobile launches in 2016 before it was met with a lukewarm response by many. While the game itself plays a treat, it's pretty hard to swallow the steep price for the full game. With that said, Android users... | Read more »
WarFriends Beginner's Guide: How to...
Chillingo's new game, WarFriends, is finally available world wide, and so far it's a refreshing change from common mobile game trends. The game's a mix of tower defense, third person shooter, and collectible card game. There's a lot to unpack here... | Read more »
Super Gridland (Entertainment)
Super Gridland 1.0 Device: iOS Universal Category: Entertainment Price: $1.99, Version: 1.0 (iTunes) Description: Match. Build. Survive. "exquisitely tuned" - Rock Paper Shotgun No in-app purches, and no ads! | Read more »
Red's Kingdom (Games)
Red's Kingdom 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: Mad King Mac has kidnapped your father and stolen your golden nut! Solve puzzles and battle goons as you explore and battle your... | Read more »
Turbo League Guide: How to tame the cont...
| Read more »
Fire Emblem: Heroes coming to Google Pla...
Nintendo gave us our first look at Fire Emblem: Heroes, the upcoming mobile Fire Emblem game the company hinted at last year. Revealed at the Fire Emblem Direct event held today, the game will condense the series' tactical RPG combat into bite-... | Read more »
ReSlice (Music)
ReSlice 1.0 Device: iOS Universal Category: Music Price: $9.99, Version: 1.0 (iTunes) Description: Audio Slice Machine Slice your audio samples with ReSlice and create flexible musical atoms which can be triggered by MIDI notes or... | Read more »
Stickman Surfer rides in with the tide t...
Stickson is back and this time he's taken up yet another extreme sport - surfing. Stickman Surfer is out this Thursday on both iOS and Android, so if you've been following the other Stickman adventures, you might be interested in picking this one... | Read more »
Z-Exemplar (Games)
Z-Exemplar 1.4 Device: iOS Universal Category: Games Price: $3.99, Version: 1.4 (iTunes) Description: | Read more »
5 dastardly difficult roguelikes like th...
Edmund McMillen's popular roguelike creation The Binding of Isaac: Rebirth has finally crawled onto mobile devices. It's a grotesque dual-stick shooter that tosses you into an endless, procedurally generated basement as you, the pitiable Isaac,... | Read more »

Price Scanner via MacPrices.net

12-inch 1.2GHz Space Gray Retina MacBook on s...
Amazon has the 2016 12″ 1.2GHz/512GB Space Gray Retina MacBook (Apple model #MLH82LL/A) on sale for $1299.99 including free shipping. Their price is $300 off MSRP. Read more
Twelve South Releases RelaxedLeather Cases fo...
Inspired by the laid-back luxury of burnished leather boots and crafted in rich tones of taupe, herb and marsala, RelaxedLeather cases deliver smart, easy protection for the iPhone 7. Each genuine... Read more
Week’s Best Deal: New 2016 13-inch 2.0GHz Mac...
Amazon has the new 2016 13″ 2.0GHz non-Touch Bar MacBook Pros on sale for a limited time for $225 off MSRP including free shipping: - 13″ 2.0GHz MacBook Pro, Space Gray (MLL42LL/A): $1274.99 $225 off... Read more
Back in stock: Apple refurbished Mac minis fr...
Apple has Certified Refurbished Mac minis available starting at $419. Apple’s one-year warranty is included with each mini, and shipping is free: - 1.4GHz Mac mini: $419 $80 off MSRP - 2.6GHz Mac... Read more
Apple Ranked ‘Most Intimate Brand’
The top ranked ‘”intimate” brands continued to outperform the S&P and Fortune 500 indices in revenue and profit over the past 10 years, according to MBLM’s Brand Intimacy 2017 Report, the largest... Read more
B-Eng introduces SSD Health Check for Mac OS
Fehraltorf, Switzerland based independant Swiss company- B-Eng has announced the release and immediate availability of SSD Health Check 1.0, the company’s new hard drive utility for Mac OS X. As the... Read more
Apple’s Education discount saves up to $300 o...
Purchase a new Mac or iPad using Apple’s Education Store and take up to $300 off MSRP. All teachers, students, and staff of any educational institution qualify for the discount. Shipping is free: -... Read more
4-core 3.7GHz Mac Pro on sale for $2290, save...
Guitar Center has the 3.7GHz 4-core Mac Pro (MD253LL/A) on sale for $2289.97 including free shipping or free local store pickup (if available). Their price is a $710 savings over standard MSRP for... Read more
128GB Apple iPad Air 2, refurbished, availabl...
Apple has Certified Refurbished 128GB iPad Air 2s WiFis available for $419 including free shipping. That’s an $80 savings over standard MSRP for this model. A standard Apple one-year warranty is... Read more
13-inch 2.7GHz Retina MacBook Pro on sale for...
B&H Photo has the 2015 13″ 2.7GHz/128GB Retina Apple MacBook Pro on sale for $100 off MSRP. Shipping is free, and B&H charges NY tax only: - 13″ 2.7GHz/128GB Retina MacBook Pro (MF839LL/A): $... Read more

Jobs Board

*Apple* macOS Systems Integration Administra...
…most exceptional support available in the industry. SCI is seeking an Junior Apple macOS systems integration administrator that will be responsible for providing Read more
*Apple* Retail - Multiple Positions- Deer Pa...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Retail - Multiple Positions - Apple,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
*Apple* Technician - nfrastructure (United S...
Let’s Work Together Apple Technician This position is based in Portland, ME Life at nfrastructure At nfrastructure, we understand that our success results from our Read more
*Apple* Mobile Master - Best Buy (United Sta...
**467692BR** **Job Title:** Apple Mobile Master **Location Number:** 000602-Columbia MO-Store **Job Description:** **What does a Best Buy Apple Mobile Master Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.