Book Review: Code by Charles Petzold

If you're new here, you may want to subscribe to my RSS feed. Thanks for visiting!

Today’s post is a short review of a classic book about computer programming written by the foremost software engineer who has ever worked at Microsoft Corporation: Charles Petzold. Back in 1994, I read Charles Petzold’s book Programming Windows, which contained alot of great source code examples for applications that ran in Windows 95. Back then, I was working with Microsoft C and SDK Version 7 and the first version of Visual C had not yet been produced by Microsoft. I had to actually build my programs in C in a DOS editor, compile all related files in DOS and then run the Windows application from the DOS command prompt. Ah, the old days of programming! That book was a great read and it was fascinating to see how Microsoft Windows 95 really worked.

However, there is another book by Charles Petzold that surpasses Programming Windows, and that book is Code: The Hidden Language of Computer Hardware and Software. This book (published in 2000) is a must read for anyone who really wants to understand the fundamentals of binary code and how essential elements of the computer go to work for us, producing amazing interfaces and also behind the scenes capabilities for data processing. So, whether you are a computer geek or a simple guy trying to compete in the highly-competitive computer industry, I encourage you to get at least a used copy of this book and study it well. Charles will reveal all of the inner workings of computers and the thought processes that are at the heart of all modern computing. This book has twenty-five (25) chapters, and each one will take you toward another transformative level of computing insight:

Chapter 1: Best Friends
Chapter 2: Codes and Combinations
Chapter 3: Braille and Binary Code
Chapter 4: Anatomy and a Flashlight
Chapter 5: Seeing Around Corners
Chapter 6: Telegraphs and Relays
Chapter 7: Our Ten Digits
Chapter 8: Alternatives to Ten
Chapter 9: Bit by Bit by Bit
Chapter 10: Logic and Switches
Chapter 11: Gates (not Bill)
Chapter 12: A Binary Adding Machine
Chapter 13: But What About Subtraction?
Chapter 14: Feedback and Flip-Flops
Chapter 15: Bytes and Hex
Chapter 16: An Assemblage of Memory
Chapter 17: Automation
Chapter 18: From Abaci to Chips
Chapter 19: Two Classic Microprocessors
Chapter 20: ASCII and a Cast of Characters
Chapter 21: Get on the Bus
Chapter 22: The Operating System
Chapter 23: Fixed Point, Floating Point
Chapter 24: Languages High and Low
Chapter 25: The Graphical Revolution

Thank you, Charles Petzold, for a truly incredible book!

Microsoft Visual C Sharp: Working with Strings

Working with Strings

Strings are special data types that can hold textual information. In the Microsoft Visual C# language, string is a keyword. It is simply a different name from the String class in the System namespace. Therefore, string has all the properties and methods of the String class. A value in a string cannot be modified.

String Methods

When string methods are called or when you make changes to a string, a new string is actually created. If you try to change a character in a string, you get an error. The following sample program tries to replace the 4th character of the str1 string ABCDEF with X, which cannot be done. Compiling this program should give you an error message about this.

//———————————————————-
using System;
class Str_Err
{
public static void Main ()
{
string str1 = “ABCDEF”;
str1[3] = ‘X’;
Console.WriteLine(str1);
}
}
//———————————————————

So, if strings cannot be modified, then is their usefulness limited? No, because string methods allow you to make string comparisons, which come in handy as you develop your program. A number of extremely useful methods can be used with string comparisons. The following list shows some of the more prominent string methods, along with descriptions of their use.

Static Methods

Compare - compares the values of two strings.

CompareOrdinal - compares the values of two strings without compensating for language or other internationalization issues.

Concat - concatenates (joins) two or more strings into one string.

Copy - creates a new string from an existing string.

Equals - compares two strings to determine whether they contain the same value. Returns true if the two values are equal. Otherwise, returns false.

Format - replaces format specifiers with their corresponding string values. Specifiers were covered earlier today.

Join - Concatenates two or more strings. A specified “separator string” is placed between each of the original strings.

Methods and Properties of Each Instance

Char – returns the character at a given location.

Clone – returns a copy of the stored string.

CompareTo – compares the value of the string with the value of another string. This method returns a negative number if this string is less than the compared string, 0 if equal, and a positive number if the value of this string is greater.

CopyTo – copies a portion of or all of a string to a new string or character array.

EndsWith – determines whether the end of the value stored in the string is equal to a string value. If they are equal, true is returned; otherwise, false is returned.

Equals – compares two strings to determine whether they contain the same value. Returns true if the two values are equal. Otherwise, false is returned.

IndexOf – returns the index (location) of the first match for a character or string. Returns -1 if the value is not found.

Insert – inserts a value into a string. This is done by returning a new string.

LastIndexOf – returns the index (location) of the last match for a character or a string. Returns -1 if the value is not found.

Length – returns the length of the value stored in the string. The length is equal to the length number of characters contained.

PadLeft – right-justifies the value of a string and then pads any remaining spaces with a specified character (or space).

PadRight – left-justifies the value of a string and then pads any remaining spaces with a specified character (or space).

Remove – deletes a specified number of characters from a specified location within a string.

Split – the opposite of join. Breaks a string into substrings based on a specified value. The specified value is used as a breaking point.

StartsWith – determines whether the value stored in a string starts with a specified character or set of characters. Returns true if there is a match and false if not. If specified character is null, true is also returned.

Substring – returns a substring from the original string starting at a specified location. The number of characters for the substring might also be specified but is not required.

ToCharArray – copies the characteristics in the current string value to a char array.

ToLower – returns a copy of the current value in all lowercase letters.

ToUpper – returns a copy of the current value in all uppercase letters.

Trim – removes copies of a specified string from the beginning and end of the current string.

TrimEnd – removes copies of a specified string from the end of the current string.

TrimStart – removes copies of a specified string from the beginning of the current string.

Building Strings

The StringBuilder class is provided in the System.Text namespace to create an object that can hold a string value that can be changed. An object created with the StringBuilder class operates similarly to a string. The difference is that methods of a StringBuilder can directly manipulate the value stored. The methods and properties for a StringBuilder object are displayed in the following list:

Append – appends an object to the end of the current StringBuilder.

AppendFormat – inserts objects into a string based on formatting specifiers.

Capacity – sets or gets the number of characters that can be held. Capacity can be increased up to the value of MaxCapacity.

Chars – sets or gets the character at a given index position using indexer notation.

EnsureCapacity – ensures that the capacity of StringBuilder is at least as big as a provided value. If the value is passed to EnsureCapacity, the value of the Capacity property is set to this new value. If MaxCapacity is less than the value passed, then an exception is thrown.

Questions? Drop me an e-mail at great.documents@gmail.com and I’ll do my very best to answer your question or concern. All The Best, Keith

Inspired Source: Learn C# in 21 Days by Bradley Jones

Microsoft Visual C#: Object Oriented Programming

There are four pillars or key-characteristics that make up an object-oriented language:

(1) Encapsulation

(2) Polymorphism

(3) Inheritance

(4) Reuse

Because Microsoft Visual C# is an object-oriented language, it is important to understand these concepts to truly harness the power and versatility of the language.

Encapsulation is the concept of making classes or “packages” that contain everything you need. In object-oriented programming, this means that you can create a class that stores all the variables that you need and all the routines to manipulate the data. You can create a “Triangle” class that stores information about triangles. This could include information about the three angles, the three sides, and more. By encapsulating a triangle, you allow the user to be oblivious to how the triangle works. The user needs to know only how to interact with the triangle. This provides a “shield” to the inner workings of the triangle. Any programs that you write that use the “Triangle” class should not need revisions of any kind.

Inheritance is the way in which individual instances of a class automatically carry with them all the attributes of the “umbrella” class over them. So, triangles, circles, squares, etc. all inherit characteristics of the “shapes” class which overshadows all of them.

Polymorphism means having the capability of assuming different forms. For example, different formulas for different shapes are needed to determine the areas of individual triangles, squares, or circles that are submitted to the program. Polymorphism is the way in which you can guarantee, for example, that all unique shapes will be treated as such and correctly united with the correct area formula (that is, per this example).

Reuse: when you create a class , you should be able to reuse it to create lots of objects. By using inheritance and some of the features in the above sections, you can create routines that can be used repeatedly in many programs and in many ways. By encapsulating functionality, you can create routines that have been tested and are proven to work. You won’t have to test the details of how the functionality works. Rather, you need only know that it works correctly.

Inspired Source: Learn C# in 21 Days by Bradley Jones

Microsoft Visual C Sharp: Lesson Two

The second topic that I would like to discuss is Program Flow. In Microsoft Visual C#, there are mechanisms by which you can successfully control your logic and the overall flow of the program. It is important to select the right method to control the direction of your program.

Method #1: If - Else Statements

Essentially, the else component of the if-else statement gives you the capability of having code that executes when the if statement’s conditions fail or are false. Also, only one of the two aspects of this statement actually execute. Both never execute, if set up correctly. So, this the beauty of this particular program flow is that if you have a simple fork in the logic, if-else allows the program to go via route A or route B quite easily.

Note: If-Else Statements can be increased to include else if statements as well. Nonetheless, when all listed paths for the program logic prove false, the final else is where the program continues on ahead.

Method #2: Switch Statements

Microsoft Visual C# provides yet another much easier way to modify program flow based on multiple values that are stored in a variable: with the switch statement. The format for this statement is as follows:

switch (value)
{
case result 1:
case result 2:
case result n:
default:
}

In this program flow, there is no condition. Rather, a value is used. This value can be the result of an expression or it can be a variable. This value is then compared to each of the values in each of the case statements until a match is found. If a match is not found, then the flow goes to the default case. If there is no default set-up, then the first statement following the switch statement is where the flow goes.

Method #3: Iteration Statements

When you want to repeat a segment of code in your application, Microsoft Visual C# provides a number of iteration (e.g. repetition) techniques. They are as follows: while, do, for, and foreach.

The basic logic of a while statement is as follows:

while (condition)
{
statement(s)
}

A while statement uses a conditional statement. If the condition is met (true), then the statement is executed. Otherwise, the statement(s) are not executed and the program flow goes to the next command following the while statement.

A do statement, however, first executes its statements. Then a while is presented with a condition. If the while condition is true, the program returns to the statements, otherwise, the program flow goes to the next line after the do….while. The syntax for a do statement is as follows:

Do
{
statement(s)
} while (condition);

The for statement, the third of the four iteration methods, consolidates steps into a much simpler format, as illustrated below:

for (initializer; condition; incrementor)
{
statement(s);
}

The initializer is executed when the for statement begins. Then, the condition statement is evaluated. Finally, the incrementor is generally used to increment a counter. After the incrementor is executed, the condition is again evaluated, and this happens as long as the incrementor is true and not maxed out. As long as the incrementor is not maxed out, the statement(s) in this program flow are read by the compiler and executed accordingly.

Lastly, the foreach statement iterates very much like the for statement. However, the foreach statement has a special purpose - it can loop through collections such as arrays.

Inspired Source: Learn C# in 21 Days by Bradley Jones

Microsoft Visual C Sharp: Lesson One

Even though I am a Technical Writer, from time to time I must learn new programming languages so that I can stay at the cutting edge of my profession. Currently, I work with a group of professionals that utilize Microsoft Visual C#. According to Microsoft Press, books about Visual C# were the leading sellers among programming books in 2006 and 2007. Also, if you investigate applications being built for both local desktops as well as the web, many of them have been built using Microsoft Visual C#. At some future point I also want to learn PHP, but right now, I believe there is a lot I can contribute to my professional experience by learning this emerging and dynamic object-oriented programming language developed by Microsoft. So, I hope you similarly benefit from these postings.

Today’s lesson is going to feature the very essentials of a Visual C# application: (1) Whitespace, (2) Visual C# keywords, (3) Literals, and (4) Identifiers.

Whitespace: Because C# compilers ignore whitespace, you should make liberal use of it to help format your code and make it readable to other programmers and managers besides yourself. Whitespace is the blank space put into a listing. Whitespace can consist of spaces, tabs, line feeds, and carriage returns.

Example: int radius = 10;

The same expression could be written as: int radius = 10 ;

The second line compiles exactly the same as the first line. So, Visual C# is able to intelligently interpret the white space and not see it as meaning anything extra. The only exception to this rule is that when you use double quotations, this is a fixed text string, so the compiler will not change this in any way. They way you enter the text is the way it appears in the compiled output.

Keywords: There are approximately seventy-six (76) keywords in the Microsoft Visual C# language. Keywords cannot be used outside their designated and functional purposes. The following list is a list of these seventy-six keywords with a brief definition:

abstract: a modifier that can be used to indicate that a class is to be used only as a base class to another class.

as: an operator used to perform conversations between compatible types. The value to the left of the operator is cast as the type on the right.

base: a keyword that enables values and types in a base class to be accessed.

bool: a logical data type that can be either true or false. Bool is equivalent to System.Boolean in the Microsoft .NET framework.

break: a program flow keyboard that enables programs control to exit a loop or a conditional block, such as “switch” or “if”.

byte: a data type that stores an unsigned integer in 1 byte. This is a value from 0 to 255. This keyword is equivalent to System.Byte in the Microsoft .NET framework.

case: a program flow keyword that defines a logical condition within a switch statement.

catch: part of the try-catch error-handling logic of a program. The catch blocks are used to specify exceptions to be handled and the code to be executed when such exceptions occur.

char: a data type that stores a single Unicode character in 2 bytes. This keyword is equivalent to System.Char in the Microsoft .NET framework.

checked: a program flow keyword that indicates that overflow-checking for integer-type arithmetic operations and conversions should occur.

class: a reference data type that can contain both data and method definitions. A class can contain constructors, constants, fields, methods, properties, indexers, operators, and nested types.

const: this is a modifier that is applied to a data member or variable. When used, the value of the data type is constant and, therefore, cannot be changed.

continue: this is a program flow keyword that enables program control to automatically go to the next iteration of a loop.

decimal: this is a data type that stores a floating-point number in 16 bytes. The precision of a decimal variable is better than that of the other floating point types. This makes it better for storing financial values. The suffixes m and M designate a decimal literal. This keyword is equivalent to System.Decimal in the Microsoft .NET framework.

default: this keyword is a label within a switch statement to which program flow goes when there is no matching case statement.

delegate: this keyword is a reference type that can receive a method based on a specified method signature. This signature of methods is based on the declaration of the delegate (similar to function pointers in languages such as C and C++).

do: this is a looping program flow construct that causes execution of a statement or block of statements until a condition at the end of the block evaluates to false.

double: this is a data type that stores a floating-point number in 8 bytes. The suffixes d and D designate a double literal. This keyword is equivalent to System.Double in the Microsoft .NET framework.

else: this is a conditional program flow statement that contains a statement or block of statements that is executed when a preceding if statement evaluates to false.

enum: this is a value data type that can store a number of predetermined constant values.

event: this is a keyword used to specify an event. The event keyword enables a delegate to be specified that can be called when an “event” occurs in a program.

explicit: this is a keyword used to declare an explicit conversion operator for a user-defined type.

extern: this is a modifier that indicates that a method is external and, thus, outside the C# code.

false: this is a boolean literal value. This keyword can also be used as an operator that can be overloaded.

finally: the finally block executes after the try block’s scope ends. It is generally used to clean up any resources allocated in the try block.

fixed: a keyword used within unmanaged code to lock a reference type in memory so that the garbage collector won’t move it.

float: this is a data type that stores a floating-point number in 4 bytes. The suffixes f and F designate a float literal. This keyword is equivalent to System.Single in the Microsoft .NET framework.

for: a program flow statement used for looping. This statement contains an initializer, a conditional, and an iterator. The statements within the for construct’s block execute until the conditional evaluates to false. The initializer is executed at the start of the for. The iterator is executed after each execution of the for statement’s statement block.

foreach: an iterative program flow construct that enables you to loop through a collection or array.

get: a special word used for creating an accessor that gets the value from a property. This is not a reserved word.

goto: this is a program flow constant that jumps program flow from the current location to a labeled location elsewhere in the program.

if: this is a program flow construct that executes a block of code when a condition evaluates to true.

implicit: this is a keyword used to declare a user-friendly defined type conversion operator that does not have to be specified (e.g. called implicitly).

in: this is a keyword used with the foreach keyword. This keyword identifies the collection or array that the foreach will loop through.

int: a data type that stores a signed integer in 4 bytes. The range of possible values is from -2,147,483,648 to 2,147,483,647. This keyword is equivalent to System.Int32 in the Microsoft .NET framework. Literal numbers with no suffix are of type int by default if the value fits within the given range for an int.

interface: this is a keyword used to declare a reference type that defines a set of members but does not declare them.

internal: this is an access modifier that enables a data type to be accessible only from within files in the same assembly.

is: this is an operator used to determine at runtime whether an object is a specified type.

lock: this is a keyword used to make a block of code critical. This section of code does not enable more than one thread to access it at a time.

long: this is a data type that stores a signed integer in 8 bytes. The range of possible values is from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807. This keyword is equivalent to System.Int64 in the Microsoft .NET framework. The suffixes l and L designate a long literal.

namespace: this is a keyword that enables you to organize a number of types into a group. This is used to help preven name collisions and to make it easier to reference types.

new: this is an operator used to create an object. This is also used as a modifier to hide a member inherited from a base class.

null: this is a literal used to represent reference value points to nothing.

object: this is a type based on the System.Object. class in the .NET framework. All other types are derived from object.

operator: this is a keyword used to create or overload an operator’s functionality in a class or structure.

out: this is a parameter modifier that enables the parameter reference variable to be used to return a value from a method. The variable must be assigned a value in the method.

override: this is a keyword used to provide a new implementation of a method or property, which replaces a base class’s existing method or property with the same signature.

params: a parameter modifier that indicates that a variable number of values can be contained in the parameter. This modifier can be used only with the final parameter in a method’s parameter list.

partial: a potential future keyword used to indicate that the associated class is only partially defined in the current listing. This allows a single class to be broken across multiple source listings.

private: this is an access modifier that indicates that a method, property, or other member of a structure or class is accessible only within the same class or structure.

protected: this is an access modifier that indicates that a method, property, or other member of a class is accessible only within the same class or within classes that are derived from this class.

public: this is an access modifier that indicates that a method, property, or other member of a class or structure is accessible.

readonly: this is a data member modifier that indicates that after the initial assignment - either at the time of declaration or within the constructor - the value within the data member cannot be changed.

ref: this is a parameter modifier that indicates that changes to the parameter variable will also be reflected in the variable that was passed as the ref argument.

return: this is a keyword used to return a value from a method.

sbyte: this is a data type that stores a signed integer in 1 byte.

sealed: this is a modifier for classes that prevents you from deriving from the class.

set: this is a special word used for creating an accessor that sets the value in a property.

short: this is a data type that stores a signed integer in 2 bytes.

stackalloc: this is a keyword that is used to allocate a block of memory on the stack.

static: this is a modifier that is used to indicate that only a single value will be stored for the type.

string: this is a data type that stores Unicode characters. String is an alias for System.String in the Microsoft .NET framework.

struct: this is a value data type that can contain both data and method definitions. A structure can contain constructors, constants, fields, methods, properties, indexers, operators, and nested types.

switch: this is a program flow construct that changes program flow based on a value of a variable.

this: a keyword used within a non-static method that associates a variable with the current instance of a class or structure.

throw: a program flow statement that is used to throw an exception, which indicates that something abnormal has occurred. This is used with try and catch.

true: this is a boolean literal value. True can also be used as an operator.

try: this keyword is used for exception handling.

typeof: this is an operator that returns the data type of an object.

uint: this is a data type that stores an unsigned integer in 4 bytes.

ulong: this is a data type that stores an unsigned integer in 8 bytes.

unchecked: this is an operator or statement that can be used to indicate that overflow checking on integer data types should be ignored.

unsafe: a keyword used to identify code that is considered unsafe to execute in the managed environment. For example, unsafe should be used to wrap any code that uses pointers.

ushort: this is a data type that stores an unsigned integer in 2 bytes.

using: this is a keyword for creating an alias for a namespace. It can also be used to shortcut the need to use fully qualified names for types within a namespace.

value: the name of the variable being set by a set property accessor.

virtual: a modifier used on a method or property to indicate that the method or property can be overridden.

void: this is a keyword used in place of a type to indicate that no data type is used. In method declarations, void can be used to declare that no value is returned from the method.

where: this is a potential future keyword used to declare constraints on generics.

while: this is a looping program flow construct that causes execution of a statement or block of statements as long as a condition evaluates to true.

yield: this is a potential future keyword that is used within iterators to indicate a value that should be returned to a foreach statement. The yield keyword indicates where the foreach statement should continue on its next iteration.

Literals: these are straightforward hard-coded values. They “are what they are”. Simple as that.

Identifiers: is the name given to the class, and class-body is the code that makes up the class.

Here is a brief example:

class identifier
{
class-body;
}

Questions? Just shoot me an e-mail at great.documents@gmail.com.
I’ll try my very best to answer your question :) All The Best, Keith

(Inspired Source: Teach Yourself C# in 21 Days, by Bradley Jones)

The Software Development Cycle

The software development cycle is composed of six (6) major phases. As a Technical Writer, I usually end up writing about a software module after it has been tested, but that is not always the case. Many times architects or others in management will ask me to create a “dummy” document that will spell out the details of how the system is to look, at least from the GUI perspective. Also, architecture and management are interested in having quality specifications determined before programming actually starts. So, yes, Technical Writing and Software Documentation are usually the “caboose” of the software development cycle, however, there are always exceptions to the rule.

Phase One: Determining the problem to solve. All software systems have been designed to help the user solve a problem or accomplish a task. This is why we have today great programs like Microsoft Office and Microsoft Developer Studio, not to mention the many open-source alternatives that exist as well. Again, the most important step is this step because one needs to clearly define the reason behind developing a software module or system.

Phase Two: Architecture. Software architects design the specifications in which code must be written. Architects determine the platform, scope, size, and depth of programming and how all aspects of the system are to communicate. The program could be a simple desktop application or it could also be a sophisticated system with a front end GUI, intermediate code, and back-end database with tables and more.

Phase Three: Programming. Once architecture has established its parameters for the system, developers next begin to code the system. It is good for programmers to insert meaningful comments in their code so that different programmers can work on the same module. Also, system documentation can be generated from these comments to provide further support for the modules as they unfold in development.

Phase Four: Quality Assurance. After all programming is done, testing is the key to ensuring that the logic of the code is strong and that there are no bugs that will affect the user. Sometimes as a Technical Writer I have to help QA write testing scripts so that the integrity of the system is really determined accurately.

Phase Five: Documentation. As mentioned above, this is the usual time at which software is actually documented and presented in the written word. Today there are many great tools to create a nice user manual or on-line help manual for those using the software. There is nothing more frustrating than trying to use a software program and simply getting stuck. This is where the Tech. Writer comes in and saves the day.

Phase Six: Implementation and Customer Feedback. At this point, all bugs have been worked out and all documentation for the program is done. The application or system simply needs to be implemented and then the user can begin putting the program to use. After the user has really put the system to work, he or she can then contact the software vendor and give some meaningful feedback. As a Tech. Writer, I have also helped to create installation guides so that users successfully install the software on their computers, and in this way they can access all options available within the system successfully.

Great Documentation: 10 Tips

I have been writing software documentation for the past twelve years, and it amazes me how many IT professionals like to push documentation to the back burner. Quality documentation alone can save a project because many times there is a turnover of programmers and developers, so quality documentation ensures smooth sailing in current and future projects.

If I had to summarize ten truly important foundation points that establish quality software documentation, here they are, reflecting upon my twelve years of technical writing experience and additional years, beforehand, working as a software trainer:

1. Short Sentences, Always. When you write about technical things, long sentences can confuse the reader. It is best to use short sentences to ensure that your reader is following you.

2. Consistent Terms, Also. When you write about a system of some kind, there are certain terms that will be repeated as you work your way through the technical document. Make sure you spell out these acronyms or technical expressions at the outset of the document. This way, the reader will not think you are talking “geek” but rather are being sincere in your efforts to explain something.

3. Clear Screen Shots. I am a visual man, and so are many others out there. It is always a great thing to be able to show, visually, what you are discussing. A nicely selected screen shot, especially with relevant data, will always enhance your documentation and help the reader really understand what you are presenting.

4. Relevant Diagrams. Just like quality screen shots, nice diagrams also will help the reader to understand your points, but also will prepare them for future text that you will be presenting in the document. A nice diagram gives the reader a “visual” preparation for what you have not yet discussed or presented. It gives them a chance also to recover from perhaps difficult text that they cannot understand, but because you gave them a nice diagram, now perhaps they understand.

5. Know Your Reader. This goes without saying. The ones reading technical documentation about software are not just users, but also developers and quality assurance personnel. Make sure you include a few “techie” comments or observations to remind them that you are aware they are taking the time from their busy schedule to read your documentation.

6. Give Examples. I love to read and have examples. Things are so much clearer afterwards! Yes, all readers, both technical and non-technical most surely like to challenge their understanding with examples, especially when you are using relevant data and models, putting the system to the test.

7. Short Paragraphs. Just like my first point of short sentences, it is good to have short paragraphs. Do not cover more than one important concept per paragraph. This keeps the reader with a sense of confidence as he or she is reading. OK?

8. Detailed Table of Contents. After you have written your documentation, create a detailed Table of Contents, because this way nobody has to “look for something”. It will be immediately found because you took the time to provide a nice “document” map in the form of a good TOC.

9. Detailed Index. In the same way it is good to have a meaningful and descriptive Table of Contents, it is also good to be able to have a nice index that covers, alphabetically, important concepts. Perhaps your document is really long and the reader cannot find a concept in the TOC. With a nice index, he or she will find the concept.

10. Publishing Your Work. The three most popular formats for final documentation are (1) Microsoft Word or another text presentation program like Adobe Acrobat, (2) Microsoft Help in a compiled .CHM file that runs as a stand-alone desktop application, and (3) Web Help that can be created with programs like Robohelp. Choose the output that will be best for your audience :)

Happy Fourth of July to all

This Friday, the USA will again celebrate its independence from English political rule and tyranny. Freedom and liberty are two very important concepts to not only Americans, but also people around the world. Through solid principles of freedom, we are all able to express ourselves in new and dynamic ways, and create new opportunities for ourselves and those around us. So, the celebration of freedom on July 4th for me is more than just a historical or political event, it is highly symbolic and reminds me that freedom is not something we should ever take for granted. It requires work, attention, and cultivating, so that it is preserved and maintained. Principles of freedom include respecting others, honoring those who have done good deed and works with their time, and also pledging within ourselves to do our very best each day we live, so that we help to transform this world into a better place.

So, this July 4th, I hope that this day is a new beginning toward a world that will embrace collaboration and human value more. Globalization has been a difficult economic situation, because oftentimes big corporations are exploiting third world nations and their people. So, let us wish freedom and liberty for people all around the world, so that those who have been oppressed, say economically, can have new opportunities to work and serve in ways that are not only more dignified, but also that receive a better paycheck and are valued for their individual gifts that they have to offer. All The Best, Keith

Paraphrasing: 3 Recommendations

Paraphrasing:

As most of you know, copying someone else’s work is a violation of copyright. In academic circles it is called “plagiarism” and this might cost you the grade you were trying to get in that history class. So, in a nutshell, never copy someone else’s work! However, it is not wrong to paraphrase, or capture the essence of what someone has said in your own words. There are three recommendations I have for you so that you are successful with this writing tip and don’t end up walking on someone else’s lawn, if you get my drift.

1. Recommendation #1:
Understand what the original text says, but understand it in a bullet-list or nice menu structure.

2. Recommendation #2:
If you copy text directly or even “closely”, you must cite the author as the source, with all bells and whistles. There is your obligation as a writer, that is, an honest one.

3. Recommendation #3:
When you paraphrase, make sure you use text that is completely “you” and that you are not following the presentation structure of the other person. Again, capture the essence of the text or message, but in your own unique way, even if it means presenting a summary of ideas and the actual content size is less. It is better to be safe than sorry :)

Thanks Bill!

As most of you know, yesterday, Friday, June 27, 2008, was the last day Bill Gates worked, officially, at Microsoft Corporation. From today forward, he will only assume the role of Chairman of the Board at Microsoft and will no longer officially partake in software development projects at the firm. Since the early 1970s, Bill Gates has revolutionized the world with software technology, and indirectly has started a whole new sector of the economy and thanks to Bill Gates, since my college days, I have always enjoyed gainful employment in the software development sector, primarily as a Technical Writer and Trainer.

While Bill Gates did not develop the original code that eventually became Microsoft DOS (Disk Operating System) that eventually came to power the very first personal computers at International Business Machines (IBM), he did succeed in revamping the code and copyrighting it so that Microsoft could control its official use and unfoldment. So, from this angle Bill Gates was far smarter than Steve Jobs, who also is a brilliant computer scientist, but who offered his Apple computers and software for a far more expensive price that the average person could not afford. So, the personal computer won over the Apple in the most critical stage of the emerging software industry and marketplace.

Bill Gates, now, will work closely with his wife Melinda and associates at the Gates Foundation where he will focus on charitable projects that will hopefully make a difference in our afflicted world. Bill Gates was asked in an interview by ABC News if he was born to be a philanthropist and that software was just the vehicle to get him there. He said “No! I’m just a software developer.” So, there you have it, a man of true dedication to his professional field of interest, but who knows that his right arm, Steve Ballmer, current CEO of Microsoft, will be able to fare better in this stage of the firm.

The following list contains “milestones” of Bill Gates and his journey with Microsoft, since the 1970s:

1980: Microsoft develops first operating system for IBM.

1981: IBM rolls out first personal computers to run MS-DOS.

1983: The first release of Microsoft Word (word processing software).

1985: The first release of Microsoft Windows (to run on top of MS-DOS).

1986: Microsoft Corporation stock goes public.

1989: The first release of Microsoft Office Suite.

1991: The Federal Trade Commission begins its investigation into alleged MS antitrust activity.

1994: Bill and Melinda Gates are married.

1995: The release of Microsoft Windows 95.

1995: The release of Internet Explorer 2.0 - taking on Netscape Navigator for Internet browsing.

1997, 1998: U.S. Justice Department prosecutes Microsoft for antitrust activity.

2000: Bill Gates steps aside as Chief Executive Officer at Microsoft, passes job to Steve Ballmer.

2001: Microsoft and U.S. Government antitrust case finally settled.

2001: Microsoft releases Windows XP operating system.

2005: Microsoft releases its XBox gaming system.

2006: Microsoft unveils its Zune music player.

2007: Microsoft tries to buy Yahoo for $44.6 billion, but does not succeed.

2008: Bill Gates retires from activities at Microsoft, only now serving as board chairman.