Jan
27

One of the first things my wife said to me after we got married was “I knew you played video games, but I didn’t know how much you played them.”  The thing you have to know about programmers, no matter what they are or what they do today, they probably started out as a kid playing games on “something” with a video screen.  That kid is still in all of them, yearning to topple empires, win dogfights with a starship, or hack zombies to bits.

Which brings us to our most recent entry in the “Future Products” category.  You can’t swing a dismembered limb in a GameStop without smacking into a game with zombies in it.  Vampires may be in vogue with all the tweens  and moms, but zombies have the hearts of nerds around the world (take that Edward Cullen).  So why shouldn’t WE get in on the game.

Let’s think about this for a second…what kind of zombie game would *I* like to write? I’ve seen a lot of things done with (and to) zombies, but I’ve never seen an  RTS zombie game (NOTE: if there is one out there, please don’t tell me…it will spoil the illusion…I’ll have to buy it instead of dreaming about writing one…I’ll have to hide it from my wife…and my kids (who love zombies)…it won’t be pretty).  A few quick pen strokes and …

Zombie Apocalypse XXVII - Basic Concept

Zombie Apocalypse XXVII - 10,000 ft View

There you have it.  The 10,000 ft. view of the game.  The last “bastion” of humanity, trapped in…well trapped someplace and trying to survive.  All they need are some motivation to venture outside…like food, equipment, exercise by running away and screaming very loudly.  Let’s zoom in the camera a bit and take a look at what it might look like up close….

Zombie Apocalypse XXVII - 1,000 ft View

Zombie Apocalypse XXVII - 1,000 ft View

NOTE:  Please excuse the crudity of the drawings in both cases.  If I’m going to do a formal presentation, I will use formal tools.  But for informal brainstorming, I can crank out ideas on pages about 10 times faster this way.

A full 3-D world…but a small one.  To make up for the lack of artistic skills (and the lack of an art department for that matter), we (that is to say Nonlinear Ideas and its amazingly dedicated staff who follow my every whim…except when they don’t) will use the equivalent of cardboard cutouts for our “agents” moving about the board.

We’ll also avoid needing a path finding engine (and the tools to post-process the geometry files and create path nodes)  by using a simple terrain and simple flocking behaviors (i.e. seek) for moving agents about the game.

As for plot, we’ll re-imagine existing plots that (seem to) have worked for others in new and bold ways the originators would never have thought (i.e. steal what is not nailed down, dress it up, sell it fast, get out early).

Well, that’s it then.  Right.  That’s all you need to get a game started.  Nothing left now but to write the code, demo it to EA, sell the rights, retire to private island and fight off real pirates with our own private army.  Sort of like the game we’re talking about, but with real people.

Some time passes….

Well, I’ve submitted the drawings to the marketing department.  It seems they’ve wasted no time and jumped right on top of this with their (usual) crack analysis skills (see their response below).

Zombie Apocalypse XXVII - Response from Marketing

Zombie Apocalypse XXVII - Response from Marketing

Maybe next time…

, , ,

Jan
12

From Glue Logic to Program Logic

My first introduction to the Python computer language was in the late 90’s.  The project I was on was being moved to “an evil empire” in Oregon and I was tasked with transferring the entire contents of our CR database into “something” that they could easily parse and/or import.  At this time, Python was (as far as I was concerned) a great “glue logic” language.  You wouldn’t use it to deliver your application, but you could use it for quick one-off tasks like building your code base, doing large scale search-and-destroy (or modify) file operations, etc.  I used it to execute queries against the database and push the data into several output files.

Since then, I’ve worked on a few Python applications:

  • SNMP MIB Browser, delivered as a downloadable program for Windows
  • A tool to track requirement and test case changes in MS Word and handle traceability and user notification
  • A unit-test suite for the code base of a dialysis machine
  • A tool-chain for “building” the pattern/image sets that go onto an SD memory card in a pattern cutter.
  • A lint processing system; zillions of code files in, one simple ranked report out.

There were numerous other small projects scattered throughout.  All of these were 100% Python.  I’ve even seen a company where their entire server based sensor system (thousands of input readings in real-time) is built almost entirely on a python framework.  Python has evolved from being the “glue-logic” that helps the build process or the release process to the “program logic” that makes the application work.

IronPython

IronPython is an implementation of the Python language which runs on the .Net framework.  That is to say, it is a collection of .Net assemblies that allow you to compile and execute Python code as a .Net language such as C#, Visual Basic, etc.  As of the current release (2.6), you cannot use many of the existing Python (called cPython) libraries with it, as they are actually binary libraries (or rely on them), and cannot interface with IronPython.  On the other hand, you can access any compatible .Net assembly.  This gives you a (very) large space from which to draw capabilities that you use IronPython to glue together and solve the task at hand.

There are essentially three ways you can use IronPython.  The first is that you can use it to create whole applications by itself.  The second is to have a primary implementation in a .Net language (e.g. C#) as your main program logic and then use the IronPython engine (and Python code) to handle details that are dynamic.  The third is for quick “knock off” scripts used to do system operations or small easy tasks.

I strongly recommend staying away from the first option.  Before the flame wars begin and I’m branded as a heretic, you should recognize that while IronPython executes as a .Net language, the support for it in Visual Studio is minimal, at best.  An add-on for using it in VS, IronPython Studio, hasn’t been updated in 2 years and the remarks on it are mixed at best.  If you are working in .Net and you’ve worked in just about anything else for comparison, you know that intellisense, refactoring, and GUI development support in VS is pretty good.  Without it, you’re guessing the names of imports, classes, functions, manually adding callbacks, fiddling with code (and recompiling) to get the GUI just right;  that’s a hassle and more importantly, a waste of valuable time.

The second option, the one which this article focuses on, seems like a very good use of IronPython.  Consider the following scenarios:

  1. You are delivering a business application to your end users.  They each have a certain way they like the application configured.  Or they each have a custom processing need (e.g. business logic).  Your application is the engine that contains and performs the main operations on the data.  You can use IronPython to create custom scripts for each customer to handle their particular configuration and business logic.  When they need updates or modifications, you send them updated Python scripts.
  2. You have a server based application and users have a “client” on their desktop.  The client application allows them to pull/push data to/from the server.  You provide extra processing capabilities in the form of scripts that the users can either create or obtain from your organization.
  3. You want to write a video game.  Using a scripting engine in video games is very common.  All sorts of “operations” and “capabilities” (initialization, dialog, plot, victory condition, artificial intelligence, level instantiation, etc.) that are constantly changing during development not become scripted and can be handed off to non-programmers.  The syntax of Python is relatively easy and you don’t have to recompile the engine every time you change the code.

The third option is on an “as-needed” basis.  For these types of operations, I usually stick to cPython; the libraries are there and existing Python tools recognize the existing packages without any hassles.

Examples

The first thing we should do is ask ourselves how we think IronPython will be used.  I created a list of operations/situations that I wanted to create an example for so that I could understand how the limits (and syntax) of using IronPython:

  1. Define a class in C#, access it from Python.
  2. Define a class in Python, create an instance and call a member function from C#.
  3. Execute a Python function (not the same as a class).
  4. Define a Python variables as module level variables, access and manipulate them from C#.
  5. Pass a function pointer (delegate) from C# to Python.  Allow Python to call it with an argument.
  6. Execute a “yield” operation in Python.
  7. Trap a Python script compile error.
  8. Trap a Python script execution error.

I’m going to discuss some of these but most should be fairly obvious (and the comments in the code (download from here) should be sufficient to tie it all together.

Environment

  • The entire application code was written in Visual Studio 2008 Professional edition.  The code should run without an issue in the Express edition as well.
  • I used IronPython version 2.6, which can be found here.

Test Harness

In order to execute the tests, I created a new project as a simple C# Windows Forms application.  A screenshot of the finished product is below.

Executing IronPython Tests

Executing IronPython Tests

The program is little more than a form with buttons for executing tests, a “SimpleLogger” class for logging messages, a timer updated for updating the logger, and the code for executing the tests themselves.  The “Setup Python” button initializes the IronPython engine and scope (you can segment variables and data by “scope”).  I left it in so you could see that it takes a non-trivial amount of time to initialize the engine.

Because the entire code base can be downloaded, I’m going to be sparse on including code here unless it will be value added to do so.  I will walk through the first example, executing a C# class from Python, so that you get the feel for the flow of execution.

Infrastructure

The following statements include the IronPython and Microsoft Dynamic Language Runtime (DLR) namespaces.

using IronPython.Hosting;
using IronPython.Runtime;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;

I’ve also include the following declarations at the top of the main form class:

private ScriptEngine pyEngine = null;
private ScriptRuntime pyRuntime = null;
private ScriptScope pyScope = null;
private SimpleLogger _logger = new SimpleLogger();

The SimpleLogger class is included in the source code.  It is a thread-safe tool for creating log entries and works both from the C# and the Python side.

Initialization

The following bit of code initializes the engine and sets up the “scope”.  The ScriptScope is the container that holds all the variables, functions, and class definitions that you would like to “group” together.  When the engine executes, it executes against a scope.

            if (pyEngine == null)
            {
                pyEngine = Python.CreateEngine();
                pyScope = pyEngine.CreateScope();
                pyScope.SetVariable("log", _logger);
                _logger.AddInfo("Python Initialized");
            }
Note that the _logger object is passed into the Python Scope by pyScope.SetVariable(…).  Now Python has a reference to the SimpleLogger instance and can reference the methods it exposes.

I also created a simple function to take a string (Python code statements), compile them and execute them in the scope defined.

        private void CompileSourceAndExecute(String code)
        {
            ScriptSource source = pyEngine.CreateScriptSourceFromString(code, SourceCodeKind.Statements);
            CompiledCode compiled = source.Compile();
            // Executes in the scope of Python
            compiled.Execute(pyScope);
        }

Now all you have to do is construct the Python code using strings, hand it off to the function, and it executes automatically.

For the first test, we want to add an element to the _logger from Python.  First, we need to create the Python code.  We can do this by loading it from a file or by just passing in the string.  For this project, I’m going for a “self-contained” solution, so the Python code will be created by C# directly:

        private String CreatePythonScript1()
        {
            String result = "";
            string[] lines =
                {
                    @"def DoIt1(logObj):",
                    @"   logObj.AddInfo('Executed in a function call using log object input.')",
                    @"",
                };
            result = String.Join("\r", lines);
            return result;
        }

I’m being a bit anal and using the “@” for raw strings here.  In Python, a string can be either enclosed in single quotes or double quotes (and even triple single/double quotes), but I’m going to stick with single quotes so the editor doesn’t start coloring/un-coloring and confusing me.  This is a simple declaration of a Python function, “DoIt1(logObj)”, which takes an argument logObj.

When you hit the “Test 1″ button, the following code gets executed:

        private void btnTest1_Click(object sender, EventArgs e)
        {
            CompileSourceAndExecute(CreatePythonScript1());
            CompileSourceAndExecute("DoIt1(log)");
        }

The first line compiles the Python function.  The second passes in the _logger object, defined in the Python scope as “log”.  And the list on the GUI gets “magically” updated.

The rest of the code contains the remaining examples.  Unless you are looking for something fairly exotic, I think I’ve covered the majority of the examples for usage that I think are practical for working applications.  Feel free to leave feedback if you have any trouble or need clarification.

The Source Code can be downloaded from this link:  IronPythonTest2 Source Code

, , , , , ,

Jan
08

Coding is all about grammar, software is all about philosophy.
– Unknown

Programming can be fun, so can cryptography; however, they should not be combined.
–Charles Kreitzberg and Ben Shneiderman

The sooner you start to code, the longer the program will take.
–Roy Carls

Our developers never release code. Rather, it tends to escape, pillaging the countryside all around.
–The Enlightenment Project

Perl is the crystal meth of programming: it’s so incredibly useful when you need to do a large amount of work in a small amount of time that you tend to overlook the fact that it’s basically precipitating the implosion of your vital organs.
–Dan Martinez

Programmers are the tools for converting caffeine into code.
–Unknown

If you lie to the compiler, it will get its revenge.
–Henry Spencer

There are only two industries that refer to their customers as users.
–Edward Tufte

Einstein argued that there must be simplified explanations of nature, because God is not capricious or arbitrary. No such faith comforts the software engineer.
–Fred Brooks, Jr.

To iterate is human, to recurse divine.
–L. Peter Deutsch

Good judgment comes from experience, and experience comes from bad judgment.
–Fred Brooks

There are two ways to write error-free programs; only the third works.
–Alan J. Perlis

When Leo Tolstoy wrote Anna Karenina, he could have been thinking about cubicles: “there are no conditions of life to which a man cannot get accustomed, especially if he sees them accepted by everyone around him.”
–Leo Tolstoy

The real value of tests is not that they detect bugs in the code but that they detect inadequacies in the methods, concentration, and skills of those who design and produce the code.
–C.A.R. Hoare

The most important single aspect of software development is to be clear about what you are trying to build.
–Bjarne Stroustrup

Most of you are familiar with the virtues of a programmer. There are three, of course: laziness, impatience, and hubris.
–Larry Wall

I did say something along the lines of C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows your whole leg off.
–Bjarne Stroustrup

There are two ways of constructing a software design. One way is to make it so simple that there are obviously no deficiencies. And the other way is to make it so complicated that there are no obvious deficiencies.
–C.A.R. Hoare

Any fool can use a computer. Many do.
–Ted Nelson

Trying to outsmart a compiler defeats much of the purpose of using one
–Brian W. Kernighan and P. J. Plauger

UNIX is simple. It just takes a genius to understand its simplicity.
–Dennis Ritchie

Putt’s Law: Technology is dominated by two types of people–those who understand what they do not manage and those who manage what they do not understand.

An organization that treats its programmers as morons will soon have programmers that are willing and able to act like morons only.
–Bjarne Stroustrup

Theoretically, software is the only component that can be perfect, and this should always be our starting point.
–Jesse Poore

Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.
–Damian Conway

Documentation is a love letter that you write to your future self.
–Damian Conway

If you think good architecture is expensive, try bad architecture.
–Brian Foote and Joseph Yoder

Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: nothing works and they don’t know why.
–Unknown

If the code and the comments disagree, then both are probably wrong.
–Unknown

Those who want really reliable software will discover that they must find means of avoiding the majority of bugs to start with, and as a result, the programming process will become cheaper. If you want more effective programmers, you will discover that they should not waste their time debugging, they should not introduce the bugs to start with.
–Edsger Dijkstra

In theory there is no difference between theory and practice. In practice there is.
–Yogi Berra

For a successful technology, honesty must take precedence over public relations for nature cannot be fooled.
–Richard Feynman

One of the main causes of the fall of the Roman Empire was that, lacking zero, they had no way to indicate successful termination of their C programs.
–Robert Firth

Hofstadter’s Law: It always takes longer than you expect, even when you take into account Hofstadter’s Law.

PHP is a minor evil perpetrated and created by incompetent amateurs, whereas Perl is a great and insidious evil, perpetrated by skilled but perverted professionals.
–Jon Ribbens

If you want a girlfriend, avoid working in the computer games industry like the plague. If you work seven days a week, 15 hours a day for almost two years, with barely enough time for a pint, you have no time whatsoever for relationships. Plus computer-games makers are regarded as being about as hip and cool as abattoir workers.
–Toby Gard

Your problem is another’s solution; your solution will be his problem.
–Unknown

Embedded lines of code are growing 26% annually but developers are increasing by 8%.
–Venture Development Corporation

Productivity can decrease by as much as 25% when workers put in 60+ hour weeks for a prolonged time. And, turnover is nearly three times higher among workers who work extended hours. Absenteeism among companies with extended hours is more than twice the national average.
–Reworded from Circadian Technologies Shiftware Practices 2005 survey

There’s a fine line between being on the leading edge and being in the lunatic fringe.
–Frank Armstrong

Two things are infinite: the universe and human stupidity; and I’m not sure about the universe.
–Albert Einstein

Some people, when confronted with a problem, think I know, I’ll use regular expressions. Now they have two problems.
–Jamie Zawinski

The most amazing achievement of the computer software industry is its continuing cancellation of the steady and staggering gains made by the computer hardware industry.
–Henry Petroski

One test is worth a thousand opinions.
–Unknown

If the lessons of history teach us anything it is that nobody learns the lessons that history teaches us.
–Unknown

The trouble with the world is that the stupid are cocksure and the intelligent are full of doubt.
–Bertrand Russell

Debugging is like alien abduction. Large blocks of time disappear, for which you have no explanation.
–Unknown

Most software today is very much like an Egyptian pyramid with millions of bricks piled on top of each other, with no structural integrity, but just done by brute force and thousands of slaves.
–Alan Kay

If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization.
–Gerald Weinberg.

Ugly programs are like ugly suspension bridges: they’re much more liable to collapse than pretty ones, because the way humans (especially engineer-humans) perceive beauty is intimately related to our ability to process and understand complexity. A language that makes it hard to write elegant code makes it hard to write good code.
–Eric S. Raymond

Let us change our traditional attitude to the construction of programs. Instead of imagining that our main task is to instruct a computer what to do, let us concentrate rather on explaining to human beings what we want a computer to do.
–Donald Knuth

The most unsuccessful three years in the education of cost estimators appears to be fifth-grade arithmetic.
–Norman R. Augustine

No engineer looks at a television remote control without wondering what it would take to turn it into a stun gun. No engineer can take a shower without wondering if some sort of Teflon coating would make showering unnecessary. To the engineer, the world is a toy box full of suboptimized and feature-poor toys.
–Scott Adams

I love deadlines. I like the whooshing sound they make as they fly by.
–Douglas Adams

In handling resources, strive to avoid disaster rather than to attain an optimum.
–Butler Lampson

There are various reasons that software tends to be unwieldy, but a primary one is what I like to call “brittleness”. Software breaks before it bends, so it demands perfection in a universe that prefers statistics.
–Jaron Lanier

People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years.
–Joseph Licklider

Code generation, like drinking alcohol, is good in moderation.

--Alex Lowe

Nothing makes the software work like the hardware.

– Unknown

To error is human, but announcing your brand new Twitter, YouTube, Blog, and Forum Page in the same worldwide e-mail
as an application update is just asking for Trouble.
– Unknown

Overall pedigree unknown; attributed to a post on embedded.com; read at your own risk.

, , ,

Jan
05

I always keep a few sticky notes on my desktop to remind me about the realities of the (seemingly endless) tasks at hand:

The Six Stages Of A Project
1. Enthusiasm (This project rocks!)
2. Disillusionment  (This project blows chunks!)
3. Panic (How is this my fault?!)
4. Search for the Guilty (Run Away!  Run Away!)
5. Punishment of the Innocent (Blame the new hires!)
6. Rewards for the Non-Participants (Can you say MIP?)
The Five Rules Of Plumbing
1. Hot on the left
2. Cold on the right
3. Waste flows downhill
4. When in doubt, add a vent
5. Payday is on Friday

Happy Tuesday

, , , ,

Dec
31

We’ve uploaded a series of tutorial videos to YouTube for Time Tracker. The first one (press the “More” button to see it below) is a “soup to nuts” tutorial on using Time Tracker. We hope that you have already found Time Tracker to be easy to use. This video is meant to teach someone who has gotten the hang of creating records to the point where they can feel confident generating reports, filtering records, understanding what the rounding features do, etc.

As we create new features in Time Tracker, we’ll also be adding new videos to the YouTube page, so be sure to check up on it occasionally to see what has changed.

Feel free to leave us comments or requests for other features or videos of features that you would like to see.



, , , , , ,

Dec
26

A few weeks ago, a friend of mine called me and asked me how he could find out if somebody had been reading the e-mail at his computer.  I asked him why he thought somebody was reading his e-mail.  He works as mortgage broker and one of his co-workers started calling up his clients.

I asked him if he had any anti-virus software (he does, pretty good stuff), if the computer was his or the company’s (it’s not his), and what his password was (one of his children’s names).  After the third question, I told him (a) his co-worker had almost certainly broken into his files and (b) he needs to change his password to something less obvious than a marquee screaming “come steal this”.

I also told him if he was worried about somebody being on his computer again in his absence, he could pick up one of those programs that suspicious significants use to check-up/catch their significants.  You can find them just by searching Google with keywords like “software catch cheating spouse”.

Now it also got me thinking about a product we could produce.  Just about every laptop shipped these days has a camera.  What my friend really needed wasn’t just something to take a shot of the screen that his co-worker was looking at, he needed a picture of his co-worker as well shot at the same time.  Let’s lay out some basic marketing requirements of what this “thing” should look like:

  1. The program/project name will be “You Are So Busted”.
  2. The software should automatically start when the user starts the computer, logs on,  etc., unless it has been configured otherwise.
  3. The software should be stealthy.  Maybe a tray icon (at the most), but nothing in the task bar unless the owner is actually configuring it.
  4. The software should take a picture of the desktop (or focus window) periodically.  Maybe every 10 seconds.  Same thing with a web-cam if it is present.  We don’t need high motion video here…people searching through your mail, surfing for porn, or hanging out in chat rooms aren’t exactly switching screens that fast.
  5. The software should NOT need a key logger or any of the other (hacker-like) and complicated features I’ve seen in some of the other “catcher” programs out there.

The interface and use model must be very simple.  Most of the other ones I’ve seen look pretty complicated.  People are using them (obviously), but I think our competitive advantage comes in simplifying the system, not adding a million options to it (Time Tracker aside).  It should be one main screen with the following options:

  1. Start Automatically (default to “yes”).
  2. Use Web Cam (default to “yes” if a web cam is found).
  3. Set Storage Location (default to “somewhere”…doesn’t need to be changed).
  4. Set Password (default to no password; if set, must be used for configuration as well).
  5. Use Password (default to yes if the password is set).
  6. Watch Captures – Look at capture sequences by date.  Show both the camera and the screen shots in sequence.  Let the user increase/decrease the view rate.
Now onto the other questions the we should ALWAYS ask when talking about a new product:
  1. Is this technologically viable?  Absolutely.
  2. Is there a market for it?  Yes.  Price targets look to be in the range of $20 – $100.  A recurring model is probably not a good strategy here…once somebody is caught, the situation for application re-use would be expected to go away.
  3. Is this product ethically sound?
    1. This type of product is already in wide use.
    2. We didn’t steal or infringe on the design or technology.
    3. It appears there is market demand for it.
    4. In order to pay our staff, we need to bring in revenue.
    5. There is nothing illegal (that we know of) about monitoring the use of your own computer.
  4. Is this product morally sound?  Well now, that is really a different question.  If somebody’s relationship is in trouble, should we feed their paranoia or provide a tool to validate it?  It’s unlikely that such a tool would diminish it…the absence of proof does not remove suspicion.  We’re not marriage/relationship councilors.  If we wanted to help them, we’re not the right people.  On the other hand, “the truth shall make you free”.  If you are already suspicious, you’re probably not having the most rewarding of relationships.  Maybe this is more like helping to get to the truth faster so people can get on with their lives.  Or is that just a justification…

On the drawing board for now.

, , , , , ,

Dec
24

In case you may have missed it, all the major updates on our website were done on Christmas Eve.  After this last bit of work, the fun goes on, but the work stops.

Merry Christmas, Happy Chanukah, Season’s Greetings, and Happy New Year To All.

May we put 2009 behind us as quickly as possible, finding peace, accomplishment, and resuscitated profits in 2010; it’s been a pretty brutal year.

James Wucher

Nonlinear Ideas Inc.

Dec
24

A version of Time Tracker for your iPhone or iPod touch.

Basic Feature Set

  • Create Projects, Tasks (assigned to Projects) and Records like you can in the existing Time Tracker application.
  • Allow you to filter records like the existing application.  You would be able to see roll-ups of the time for viewed Records as well.
  • Send the data via e-mail so it can be imported into the PC version of Time Tracker.

, , , , , , , , , ,

Dec
23

This is going to get a little nerdy…and long…and possibly be slighltly less boring than clipping your toenails…feel free to nod off or bail out at any time.

Time Tracker has a “multi-user” option already.  This feature is somewhat crude (but effective), in that it requires the users to send their record files (with a “tag” for each user) to the “manager” who collects all the record files in one instance of Time Tracker.  This has been in place for some time (and since complaints about it have been ZERO, we’re assuming everybody is reasonably satisfied).

However, this is not what people really think of when they think “multi-user”.  What people really think of as multi-user is “connected”, either through the browser (i.e. web page interface) or an application (i.e. a program you run), but connected in a way that changes made by other users are immediately visible to you.

Let’s start with the basic goals that this program would need to satisfy:

  1. The program would need to maintain a list of Projects.
  2. The program would “general” list of Tasks, any of which could be used in the Projects.
  3. Records are generated by Workers.  Each Record is associated with a Project and Task.
  4. A Worker could work at any computer to create Records, as long as they can access the system (e.g. Log In).
  5. A Worker could create Records while not connected to the system, but could upload their Records (and download any changes) when they are connected later.  Workers could be put into Groups.
  6. A Manager (who is also a Worker) can create Records, but also see any Records created for any Project/Workers that have been assigned to them by the Administrator.
  7. An Administrator adds Workers, Managers, Projects, Tasks, and other Administrators to the system.  They also configure what Projects/Workers are assigned to Managers.
  8. The system must be easy to install and update.

The statements above reflect only the bare minimum the system would have to do.  On top of this, you could build a pretty nice system.  For example:

  1. Costs could be assigned to hours worked, by individual Worker rate, by Project rate, by Task rate, etc.  It could even be a dynamic (e.g. scripted) so that for each “System”, we would create a custom billing model to match up with your particular business model.
  2. The current Time Tracker system for generating reports (filtering by Project/Task/Worker) could be expanded to include graphs, “cheat checking” (this is a whole other topic).
  3. Limits could be placed on Projects, Tasks, Workers, etc., which would be pushed down to the creation of records.

Implementation Quirks

In order to create this kind of system, the data for the system has to “live” somewhere that every user of the system can see.  Looking over the competing products for this system, it looks like the “first” choice is “just use the web” for the system.  That is to say, everybody gets to see web pages and use web pages.  This has some really good advantages:

  1. All the data and code lives on a machine somewhere that the clients don’t have to configure and the developers don’t have to test for.  This also avoids the problem of creating a central server at the customer’s site.
  2. Updates are immediate to everybody in the world at the same time.

On the other hand, there are a few disadvantages as well.

  1. You don’t have to support every type of machine, but you do  have to support every browser.  There are LOTS of browsers.
  2. If their access is down (as a company or as an individual) they can’t track time.
  3. Updates are immediate to everybody in the world at the same time.  Sometimes, when you deploy an update, you want to test it at a control site (with some benevolent and forgiving users) before unleashing it on the unsuspecting general populace.
  4. Developing for the web is extremely limiting.  It’s not hard to get text, some images, etc. up on a browser.  It is very hard to get dynamic forms to work correctly (without Ajax, Flash, etc.).  Doing these kinds of things is relatively easy in a desktop application.
  5. If your site is hacked, EVERY customer is in danger of losing their data.

Business Questions

  1. How much of a market is there for this product?
  2. Can we produce a product that is competitive with what we see on the Web already (but at a lower price or with some other factor that provides an advantage)?
  3. Is there any other product that we can pursue with a better chance of either (a) making us money or (b) making us happy?

From Here…

Right now, this project is still on the drawing board.

, , , , , , , , ,

Dec
23

Time Tracker 2.5.1 has been released and is available on the Nonlinear Ideas website.

This release should be fully backward compatible with any previous version of Time Tracker.

– Major Features -

  1. We’ve added the ability to “limit” any task to a fixed amount of time.  This can be configured so you can set it any time you start working or just when you want it.  This feature was requested by one of our users “down under” (thanks Ian).
  2. We’ve added the ability to round to minutes.  This was asked for by one of our users.
  3. Fixed the icons so they had at least one other color (yellow).  Since the desktop icon was black, some users couldn’t see it at all.
  4. Fixed the colors on Vista so that they appeared correctly.  We can’t say they are pretty, but at least they are consistent.
  5. Added support for subscription based licenses.