Tuesday, April 28, 2009

Squishing Bugs

Ick. Debugging code may be one of the most frustrating things in all of programming. Errors messages are almost always a sure-fire way to raise your blood pressure. Learning how to use debuggers and to read error messages is a valuable skill for any programmer. A good debugger is almost always a good programmer.

Generally, there are two types of errors in programming. The first kind might seem more frustrating in the beginning, but they are far easier to fix. The second might mean that there is something terribly wrong, and they can be a major pain to find.

1. Compile errors - These errors show up when you try to compile your code. Often they are accompanied by a cryptic compiler-error message like "Invalid Parameter List in Call" (this is from Ada 95.) Depending on what language you are programming in and what compiler you have these can be general, meaning anything from forgetting to import a package to sending the wrong type, to very specific, like "this needs a semi-colon." Usually these are problems with your syntax. Sometimes it is wrong, other times you just need to add something (in Java it might want you to handle some exception.) You have to get good at fixing these, because the more of a beginner you are, the more these are going to show up.

2. Run-time errors - These errors occur after you have compiled your code. Whenever you try to run your program, some kind of error occurs. The error messages for these are usually more general, but it still depends on the language and your debugger ("Segmentation Fault" in C++ is a classic.) These errors are the real problem because while they could be simple fixes, such as deleting your arrays in a language with un-managed memory, they could also be design flaws in your code.

Becoming a good debugger involves how you go about solving your bugs. Like all things, there is a right way and a wrong way to go about it. The wrong way comes naturally; The right way comes through practice and patience. Here are ten tips to help you on your quest to become a great debugger. (Of course your goal is to eventually write perfect, blissful, elegant code every time. Still, helping debug code once you have become a perfect programming life-form will endear you to the commoners.)

1. Don't Panic - It can be easy to get flustered or perplexed. Keep a level head. Go through your code systematically and logically.

2. Read the Error Messages - Often people see that they get an error and immediately go back to their code without even looking at the error message or at what line it is triggered. Often the error message and the line information can help you fix an error in 30 seconds flat. Read them.

3. Look for help online - This can be an easy way to find out if you implemented your code correctly, or if you have any simple syntax errors.

4. Use print statements - This can often be an easy way to see exactly where your code is failing (errors can often be caused in code before a later line triggers the error.) A simple "Got Here" print statement, or printing out your values, can help you quickly diagnose the problem. Remember to use .flush() or something similar to make sure the print statements print exactly when they are supposed to instead of staying in the buffer.

5. Comment out code sections - another great way to diagnose the problem. Often what you think is causing the error is only where an earlier error or miscalculation is exposed. Commenting out your latest code additions can help you focus on the right section instead of looking at overwhelming amounts of code.

6. Write test code - implementing problematic code on its own can give you a picture of whether the code itself is wrong, or whether it is having a problem working with code you have already written. It also helps you look at one chunk of code at a time.

7. Be aware of what is happening on the lower level - remember, depending on the language you are using, variables are often references to spaces in memory, not always primitives. Understanding how things are stored in memory, and how the functions you are calling work will greatly aid your debugging skills. (for instance in Java, string assignment copies the reference, not the actual information.)

8. Keep trying new things - Some people get stuck trying the same thing over and over again, unwilling to admit that they were wrong, that they need to try something different, or that they need to rethink their code. Be imaginative in your solutions, and don't be afraid to do it the long way; stalling won't help.

9. Take a Break - Sometimes you just need to walk away. Often your brain will still be working on the problem, even though you are doing something else. I can't count the times I have been talking with someone and stopped in the middle of the conversation and said "Oooohh, I should try this..."

10. Don't Give Up - Keep at it. Losing heart and giving up can ruin your coding experience. Asking for help is ok. Throwing up your hands and tossing in the towel isn't.

So go out there and squish some bugs!

Sunday, April 26, 2009

5 Ways to Become a Better Programmer

Here are five easy ways to become a better programmer. Think of these more as a mindset, rather than a checklist of things to do. If you follow these steps and make them attitudes, you will grow in programming by leaps and bounds.

1. Write Programs - Ok, I know this sounds like a no-brainer. Really though, it all starts by typing code. Often starting here can help you ask the right questions, and really help you with some of the things further down the list. Check out my post on tips and resources for coming up with programs to write.
2. Spend Time on Forums - Forums can be a great place to ask questions and learn about all kinds of programming topics. Don't worry if some of it (or a lot of it) goes over your head. Keep browsing and interact when you can. As long as you ask questions in the right manner (most programming forums have a sticky about this: READ IT!) forum-goers are generally a helpful lot. This is also a good place to do number 3...
3. Look at Other's Code - This can be a great help when you are looking for programs to write, if you are stuck in a program, or just want to learn something new. Looking at other's code can help you find shortcuts in syntax and show you quicker ways of doing things. Also, reading another person's code is an invaluable skill: Get good at it!
4. Look Up What You Don't Know - This is probably the most important one of the bunch. It works along with all of the other steps. If something goes over your head, or you can't seem to work something out, ask and research. There is so much information in the computer world it is impossible to have a handle on even half of it. Asking questions and researching any piece of information can help you learn much quicker. This is a life concept I try to implement every day. From acronyms to programming concepts, to words - If you stop to look things up, you will gain in knowledge very quickly then if you just gloss over things.

And now for some shameless promoting...
5. Read This Blog - Surfing the web in general for Programming info is a great idea. I try to point you to the good stuff to make your search a little easier and provide little tidbits of knowledge on various topics. I hope you find this blog useful.

So there you have it, five ways to becoming a better programmer. More to come in the future I am sure, but these are some concepts I have found invaluable. Happy learning...

Friday, April 24, 2009

Some classes

Just for the heck of it...

Some classes I have taken in the past:



Architecture *password is "adda"* but you didn't hear that from me...

go ahead, check 'em out

Ruby Gems and Python Eggs

Ever need to write some code and think to yourself "Somebody has to have already written this (insert grumbling, moaning, sighing, etc.)?" Chances are, you're right. A huge help when you are starting to program on your own is finding applications that others have written that you can use and tailor to your own needs. Fortunately, there are tons of places to find these things on the web.

Scripting languages especially often have their own packaging system and a place where you can look up other programmer's useful code. In Ruby, RubyGems is an excellent resource for this. RubyForge has a huge application archive where you can search for interesting and useful packages. Python uses eggs, or .egg files for packaging. The Python site also has a package index that you may browse.

One great thing you can do to expand your programming horizons is to snoop around in these areas and look at some implementations, and some packages. I guarantee that you will find something sweet, and you will definitely find packages that are extremely useful. So go out there and check out what other people have written. Looking around can save you valuable time when working on projects. Happy hunting...

Monday, April 20, 2009

Regular Geek

This is an excerpt from another blog, I think it has some nice insights:

  • Creation - Some people really enjoy the ability to create something. You start with a blank canvas, or an empty file, and you write code. Eventually that code gets compiled, packaged or whatever and becomes an executable thing. For something like a web site, you actually get to see and interact with your creation.

  • Instant Feedback - Right on the heels of creation is the instant feedback. This is true when you are programming in languages like C++ and Java as well as “really instant” changes like web sites. For programming, you get the code-compile-test cycle giving you the feedback. For web sites, you can change some basic feature and just reload the page in order to see your new results.

  • Puzzles and Problem Solving - Some people, like myself, just love to solve puzzles or various problems. In many cases, this is almost an addiction. These same people probably love to complete puzzles like Sudoku or crosswords. In “modern” terms, you can consider this a “House-complex” (after the fantastic TV show) where solving the problem is the only thing that matters.

  • People - Do you get to meet fascinating people in the software development industry? Yes, absolutely. However, many people get into software development because they do not like people. In product development companies, the programmers can all be “in the back room” and not deal with business people, customers or users. They get their needed (and limited) human interaction by dealing with other programmers.

  • See a Need, Fill a Need - Some people get into programming completely by accident. They may work in drug development research as a scientist, but they need someone to gather data and run complex analysis or simulations. In many cases, there is no funding in the budget for a new hire so that person learns to program. Eventually, they either become too valuable as a programmer or they “fall in love” with software development and they have a new career. This probably happens more often than you think, as there are a lot of programmers who do not have a formal computer science education. This is also good for the industry as it brings a different perspective into development, instead of all the people learning all of the same theories.

  • Money - There are plenty of people who start a career in software development because they want to make a lot of money. In reality, you can make a very good salary in software development, but that can not be the only reason for joining the field. If one of the previous items is not true in your case, you will hate programming within two years. Also, some people see how much money startups can make and figure they just need to learn to program a little to get there. Well, most startups fail to make any money and most programmers do not work at startups.

  • robdiana in Programming, Regular Geek, Mar 2009

For me the 1st and 3rd reasons are it. They are absolutely my bread and butter. Number two just makes life easier. What about you?

Revamping Old Code

remember that program you had to write for your C++ class... Rewriting your old code can be a great way of learning another language. By rewriting something that you already know in a different way, you can quickly pick up new syntax.

This isn't just a great way to learn a new language; It is also a great way to improve your programming skills. Go back and look at some of your old programs. Chances are, you will find ways to improve their implementation, either in speed or amount of code.

For example, I recently took an old piggybank program I had to write in C++ and converted it to Python. All this simple program did was asked for a dollar amount and turned it into the least amount of change. Back when I wrote it for the first time, I used all if statements. While I was re-writing it in Python, I discovered that I could create a better implementation using modulus arithmetic.

Isn't it great how you can learn new material on your old material. Any other suggestions on re-using old code to teach yourself?

Sunday, April 19, 2009

Programming to Program

To learn to program you must program. This is a concept that a lot of time flies over beginners. They get excited about coding, but instead of grinding out some code, they read tutorial after tutorial, or search through the web looking for something that isn't there.

But, once you realize this concept, what do you do about it? It can be pretty tough to think up a program to write yourself. One of the things that I have learned is that often, if you aren't in a class or some environment that forces you to learn, i.e. gives you tasks or assignments, it can be difficult to push yourself.

Probably the best learning tool that can be found on the internet is programming challenges. These appear in books and forums. Someone gives a list of programming quandaries as a challenge to other programmers to solve. These can greatly help you learn to program faster, sharper, and more efficiently.

A great place to find these are forum threads. Right now Programming Forums has some great challenges out there. There is also an e-book that has challenges in it, with robotic judges as well.
These challenges are your best friend, they invite you to program, and even give you what to program. You can't help but learn. Great Stuff!! If you have any sites that you have found, or have made yourself, post them below!

Friday, April 17, 2009

what reversing strings can teach us...

Reversing a string is almost a standard interview question for internships and other jobs requiring programming. What is interesting is that there are many ways to reverse a string, which we will look at below. The answer to which method is the best reveals an interesting lesson in computer science.

Alrighty, so you have your scripting languages that make it mind numbingly easy to reverse a string, in Python the answer is simply mystring[::-1] and voila, string reversed. Probably the most standard way in C++ is to simply make a temp array and iterate through your string, putting each letter from the back to the front in your temp array. This is a satisfactory answer, but it won't win you any brownie points either. The shortest code in C would have to use recursion.

# include

void recurs_string(char * );

/* Definition of the recurs_string() function */

void recurs_string(char *string)

if (*string)

void main(void)
char str[100];
printf("\n Input a string: ");
printf("\n Reverse of the string: %s", str);
printf("\n Reverse string is: ");

(I got this from here, because I am too lazy to write my own)

While recursion may l
ook impressive, it uses a lot of stack, so it really isn't the best way either. The best way to reverse a string is below.

public string Reverse(string str)
// convert the string to char array
char[] charArray = str.ToCharArray();
int len = str.Length - 1;
for (int i = 0; i < len; i++, len--) {
charArray[i] ^= charArray[len];
charArray[len] ^= charArray[i];
charArray[i] ^= charArray[len];
return new string(charArray); }
Now if you are
me when you saw this code you were like "what the heck is '^=' ?" that happens to be the XOR (exclusive OR) operator. XOR is a logic operator that returns a one if only one of the two input s is a one. for example 1 XOR 0 = 1, 0 XOR 1 = 1, but 1 XOR 1 = 0. Why this is useful is that XORing two elements three times performs a bitwise switch of those two elements, lets take a look.

XOR 0111010

= 1011111
XOR 0111010

= 1100101

So you can see, performing XOR operations on two individual characters actually switches there values. This has a practical learning application. Sometimes, the best implementation of a solution can be achieved using low-level logic operations, such as arithmetic shifts, bitwise logic operatiors such as AND, OR, XOR, etc. and binary addition and subtraction. keep this in mind the next time you are trying to optimize your code (and make yourself king of the geeks by writing something that is faster than everybody elses code, and only you can understand.)

Wednesday, April 15, 2009

New to Python (and blogging)

I shall begin at the beginning... I am a Junior in an undergraduate program in Mathematics and Computer Science, I have just gotten a programming internship for the summer. What does this mean? That in the endless sea of knowledge in the programming world I am about two feet deep.

But that's OK. In this blog I will be sharing my new gained knowledge of programming, whatever sundry topics they may be, and ask for opinions and help as well. So, on to my first content.

For this internship I was informed that I will be using Python. I have never used Python seriously before. The closest I have come was dabbling in Ruby, which is pretty sweet, I must say. If anyone out there is looking for good Python resources this is the site. After nosing around on it, I personally recommend Quick and Painless Python Tutorial by Norm Matloff, if you are familiar with other languages, such as C++. Once you have dabbled in Python a little (btw, I am using Context now as my text editor, could I use Eclipse?) Dive into Python might be for you, it tackles some more language specific stuff, that is slightly more advanced. incidently, other than installing the package on python.org's site, I recommend Active Python if you are using Windows, it's free and it allows you to execute your programs on the command line. (Of course all of the above links are to free stuff, I am a college student!)

I will let you know how my Python adventures go, one thing that has intrigued my is Regular Expressions, I haven't looked at them, but from my experience with Ruby, they seem like a must-have. delving more into this later. Also swirling around in my head are questions about GUI's and other tools used with Python, Python in .NET, Iron Python, etc. the list goes on and on, and it seems only hours of scanning the web will satiate my quandaries.

Any useful comments? thoughts? code snippets that might be helpful...