Monday, October 18, 2010

The productivity collapse

(Most developers rebel at this point. "I can crank out a thousand lines of code over the weekend!" And no doubt that's true. However, these numbers reflect costs over the entire development cycle, from inception to shipping. Maybe you are a superprogrammer and consistently code much faster than, say, 200 lines of code per month. Even so, that only shifts the curve up or down on the graph. The shape of the curve, the exponential loss of productivity, is undeniable.)

Computer science professors show their classes graphs like the one in Figure 2 to terrify their students. The numbers are indeed scary. A million LoC project sentences us to the 32 LoC/month chain gang. We can whip out a small system over the weekend but big ones take years.

Or do they?

COCOMO

Barry Boehm, the father of software estimation, derived what he calls the Constructive Cost Model, or COCOMO, for determining the cost of software projects.5 Though far from perfect, COCOMO is predictive, quantitative, and probably the most well-established model extant.

Boehm defines three different development modes: organic, semidetached, and embedded, where "embedded" means a software project built under tight constraints in a complex of hardware, software, and sometimes regulations. Though he wasn't thinking of firmware as we know it, this is a pretty good description of a typical embedded system.

Under COCOMO the number of man-months (MM) required to deliver a system developed in the "embedded"
where KSLoC is the number of lines of source code in thousands, and Fi are 15 different cost drivers.

Cost drivers include factors such as required reliability, product complexity, real time constraints, and more. Each cost driver is assigned a weight that varies from a little under 1.0 to a bit above. It's reasonable for a first approximation to assume these cost driver figures all null to about 1.0 for typical projects.

This equation's intriguing exponent dooms big projects. Schedules grow faster than code size does. Double the project's size and the schedule will grow by more than a factor of two—sometimes far more.

Despite his unfortunate eponymous use of the word to describe a development mode, Boehm never studied real-time embedded systems as we know them today so there's some doubt about the validity of his exponent of 1.20. Boehm used American Airlines' Sabre reservation system as a prime example of a real-time application. Users wanted an answer "pretty fast" after hitting the enter key. In the real embedded world where missing a deadline by even a microsecond means the 60 Minutes crew appears on the doorstep with multiple indictments, managing time constraints burns through the schedule at a prodigious rate.

Fred Brooks believes the exponent should be closer to 1.5 for real-time systems. Anecdotal evidence from some dysfunctional organizations gives a value closer to 2. The rule of thumb becomes: double the code and multiply man-months by four. Interestingly, that's close to the nearly n2 number of communication channels between engineers noted before.

Let's pick an intermediate and conservative value, 1.35, which sits squarely between Boehm's and Brooks' estimate and is less than most anecdotal evidence suggests. Figure 2 shows how productivity collapses as the size of the program grows.

Correlating interruptions with productivity

The results? The top 25% were 260% more productive than the bottom quartile!

The lesson here is that interruptions kill software productivity, mirroring Joel Aron's results. Other work has shown it takes the typical developer 15 minutes to get into a state of "flow," where furiously typing fingers create a wide-bandwidth link between the programmer's brain and the computer. Disturb that concentration with an interruption and the link fails. It takes 15 minutes to rebuild that link but, on average, developers are interrupted every 11 minutes.4

Interruptions are the scourge of big projects.

A maxim of software engineering is that functions should be strongly cohesive but only weakly coupled. Development teams invariably act in the opposite manner. The large number of communication channels makes the entire group highly coupled. Project knowledge is distributed in many brains. Joe needs information about an API call. Mary is stuck finding a bug in the interface with Bob's driver. Each jumps up and disturbs a concentrating team member, destroying that person's productivity.

Subtract software costs by adding CPUs

In 1946 programmers created software for the ENIAC machine by rewiring plug-boards. Two years later the University of Manchester's Small-Scale Experimental Machine, nicknamed Baby, implemented von Neumann's stored program concept, for the first time supporting a machine language. Assembly language soon became available and flourished. But in 1957 Fortran, the first high-level language, debuted and forever changed the nature of programming.

In 1964, Dartmouth BASIC introduced millions of (comparatively) non-techies to the wonders of computing while forever poisoning their programming skills. Three years later, almost as a counterpoint, OOP (object-oriented programming) appeared in the guise of Simula 67. The C language, still the standard for embedded development, and C++ appeared in 1969 and 1985, respectively.

By the 1990s, a revolt against big, up-front design led to a flood of new "agile" programming methods including eXtreme Programming (XP), SCRUM, Test-Driven Development, Feature-Driven Development, the Rational Unified Process, and dozens more.

In the 50 years since programming first appeared, software engineering has morphed to something that would be utterly alien to the software developer of 1946. That half-century has taught us a few pivotal lessons about building programs. Pundits might argue that the most important might be the elimination of goto, the use of objects, or building from patterns.

They'd be wrong. The fundamental insight of software engineering is to keep things small. Break big problems into little ones.

For instance, we understand beyond a shadow of a doubt the need to minimize function sizes. No one is smart enough to understand, debug, and maintain a 1,000-line routine, at least not in an efficient manner. Consequently, we've learned to limit our functions to around 50 lines of code (LoC). Reams of data prove that restricting functions to a page of code or less reduces bug rates and increases productivity.

But why is partitioning so important?

A person's short-term memory is rather like cache—a tiny cache, actually—that can hold only five to nine things before new data flushes the old. Big functions blow the programmer's mental cache. The programmer can no longer totally understand the code; errors proliferate.

Wednesday, October 6, 2010

New Technology

Sunday, September 26, 2010

General Ledger & Cashbook

Enter Your Company Name

Go to the File menu and select Configure. Then click on the Global tab. Enter your company name in the Company Name field. (This is the name that will appear at the top of each printed report.) Then click on the OK button.


Post an Entry

Click on Entries in the dark grey navigation area on the left. This will take you to the Entries screen.

To begin a new entry click on the New button at the bottom. The screen will switch to New Entry mode. This is displayed in the bottom left corner of the screen.

Enter the date for the entry in the Date field at the top. Then select the first account from the drop-down list labelled Account.

You will notice that a new line appears at the top of the grid. The grid is used for viewing only. All data must be entered using the fields at the top of the screen above the grid.

Next enter the details in the Description field, the amount in the Amount field and indicate if it is a Debit or Credit.

Press the key to go to the next line (or click on the blank line at the bottom of the grid) and repeat the process. When you are finished click on the Save button to save the entry to the database. You will not be able to save an entry unless the total debits equal the total credits.

To edit an entry click on the Edit button to switch the screen to Edit Mode. Then click on the line in the grid that you wish to alter. When you are finished click on the Save button to save the changes to the database. Click Cancel to discard any changes. Click Delete to delete the entire entry from the database.

View an Account

Click on Accounts in the dark grey navigation area on the left. This will take you to the Accounts screen.

Select the account you wish to view from the drop-down list. The entries for the selected account appear in the grid.

To view the entire entry double-click on it in the grid. This will take you directly to the Entries screen and display the entire entry. You can then double-click on a line in the entry grid to get back to the Accounts screen and view the account for that line.

Create a Cashbook

Go to the Maintain menu and select Cashbooks. To add a new cashbook use the key on your keyboard.

In the Account field enter the abbreviation of the account you wish to associate with this cashbook or double-click to select it from a list.

In the Abbrev field enter the abbreviation you wish to use to identify this cashbook. Often this will be the same as the abbreviation of the account with which the cashbook is associated but it can be different.

Enter the name of the cashbook in the Name field. Again this will likely be the same as the name of the associated account but this is not necessarily so.

Optionally enter a description of the cashbook in the Description field. This is to remind you of the purpose for the cashbook.

To edit the details of a cashbook click on the field you wish to edit and then click it a second time (as distinct from a double-click.)

To delete a cashbook hold down the key and press the key.

Make an Entry in a Cashbook

Click on Cashbooks in the dark grey navigation area on the left. This will take you to the Cashbooks screen.

Select the cashbook you wish to make an entry into from the drop-down list. The entries for the selected cashbook appear in the grid.

To begin a new entry click on the New button at the bottom. The screen will switch to New Entry mode.

Enter the date for the entry in the Date field at the bottom. Then enter the details in the Description field, the amount in the Amount field and indicate if it is a Debit or Credit. Select an account from the Other A/c drop-down list only if you wish to automatically create a corresponding entry in the ledger. Indicate if this entry has appeared on the bank statement by putting a tick in the check box next to On Statement. Finally save this entry to the database by clicking on the Save button or pressing the key on your keyboard.

To edit an entry click on the Edit button to switch the screen to Edit Mode. When you are finished click on the Save button to save the changes to the database. Click Cancel to discard any changes. Click Delete to delete the entire entry from the database.

Reconcile a Cashbook with a Bank Statement

Click on Cashbooks in the dark grey navigation area on the left. This will take you to the Cashbooks screen.

Select the cashbook you wish to reconcile with from the drop-down list. The entries for the selected cashbook appear in the grid.

For those entries in the cashbook which have matching transactions on the bank statement put a tick in the check box next to On Statement. (You can toggle this on and off for an entry by double-clicking on it in the grid.)

For those transactions on the bank statement which do not have a matching entry in the cashbook create a new entry in the cashbook and put a tick in the check box next to On Statement.

The amount next to Stmt Balance at the top of the screen after the arrow (-->) is the closing statement balance. This should match the closing balance shown on the bank statement.

The amounts next to Balance are the opening and closing balances of the cashbook including unreconciled entries (Entries which do not have a tick next to On Statement.) The amounts next to A/c Balance are the opening and closing balances of the associated ledger account.

View or Print a Balance Sheet

Click on Balance in the dark grey navigation area on the left. This will take you to the Balance Sheet screen.

Enter the date of the balance sheet in the As At field at the bottom.

Click on the Print button to display a preview. To print click on the printer icon at the top.

Change the Layout of the Balance Sheet

Click on Balance in the dark grey navigation area on the left. This will take you to the Balance Sheet screen.

The balance sheet (A, L and P) accounts are shown in the tree view along with the other elements used on the balance sheet including headings, groups, subtotals, totals and a special Retained Earnings element. You can change the order of the elements by dragging and dropping them. To include an account or the Retained Earnings element in a group drag and drop it onto the group.

To create a new heading, group or subtotal click on the Heading, Group or Subtotal buttons to the right of the tree view. To rename an element click on the Edit button. To delete an element click on the Delete button.

View or Print an Income Statement

Click on Income in the dark grey navigation area on the left. This will take you to the Income Statement screen.

Enter the begin and end dates of the income statement in the Begin Period and End Period fields at the bottom. These can be turned on or off by putting or removing a tick in the check box above each field. If you do not specify a begin date then the income statement will include all entries in the ledger from the earliest entered date. If you do not specify an end date then all entries in the ledger up to the latest entered date will be included.

Click on the Print button to display a preview. To print it click on the printer icon at the top.

Change the Layout of the Income Statement

Click on Income in the dark grey navigation area on the left. This will take you to the Income Statement screen.

The income statement (I and E) accounts are shown in the tree view along with the other elements used on the income statement including headings, groups, subtotals, totals and a special Net Income element. You can change the order of the elements by dragging and dropping them. To include an account in a group drag and drop it onto the group. (The Net Income element cannot be moved from the last position. It must always remain at the bottom.)

To create a new heading, group or subtotal click on the Heading, Group or Subtotal buttons to the right of the tree view. To rename an element click on the Edit button. To delete an element click on the Delete button.

IMPORTANT NOTES

When you select an account from the Other A/c drop-down list a corresponding double-entry is automatically posted to the ledger and linked to this entry in the cashbook. If you make any changes to this entry in the cashbook the double-entry in the ledger is automatically updated to reflect the changes. If you delete the entry from the cashbook the ledger double-entry is also deleted automatically.

Note that the converse does not apply. In other words if you edit or delete the double-entry in the ledger no changes are automatically made to the cashbook entry. This is important because it allows for flexibility in editing the general ledger without affecting the cashbook and its reconciliation to a bank statement.

Note also that it is not required to specify an Other A/c when making a cashbook entry. In this case no ledger double-entry is posted. This is useful for example when setting up a new cashbook and you wish to enter the opening balance to match the balance shown on the bank statement.

Accounting Software

General Ledger & Cashbook

Ledger is a FREE accounting system for any organization that needs a general ledger or cashbook. Because it is incredibly easy to install and use, it will also appeal to students of double-entry bookkeeping.

Ledger provides unparalleled flexibility. All account balances are calculated dynamically so that the standard accounting reports can be created for any arbitrary date or period without the need for a period close or roll-over.

Ledger has received more than 150,000 downloads since it was first made available in December 2004 without A SINGLE BUG REPORT! For more information please see our FAQ page or the discussions in the Responsive Software Google Group.

free counters
Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Powerade Coupons