Thank you everyone for some great responses!
While I've been the lead developer in many projects I've only been in
business a little over a year. Im still learning a lot of things the
hard way. I learned a few things from this project; so even if I have
to send this guy to collections or am forced to sue him,
It was a valuable experience.
I made a few mistakes with this guy..
* I discounted my rate to get the job.
* I let the project start without a hard specification.
* I didn't get a firm contract since there wasn't a firm definition
of the deliverable.
For those reasons I said I'd do it on an hourly basis and bill him
periodically. Later in the game he wants to shift to a milestone based
billing, essentially one HUGE milestone that includes half of his
project. He already owes me for 56 hours of work, the rest of the
project if all goes well should take another 20 hours. It's a lot of
money to my small company to be at risk. What really makes me nervous
is that he doesn't even want to pay half of what he currently owes me.
This project has made me realize that I can't take on another project
before I get some contracts created that spell out my terms.
The project in question is an Internet application modification
project. The $99 software he wanted it based on was junk. Despite my
recommendations to pick something else due to scalability and design
issues, he wanted to stick with it. It's a Perl CGI web application with
ton's of SQL calls per page, REALLY screwy template and variable 'mazes'
in the code, and zero documentation related to the code itself. Making
modifications to it is very time consuming compaired to a project you'd
download on sourceforge. Having the source code and being 'open source'
are two different things. With an open source project you have people
to turn to when you find code that doesn't follow typical design
methodologies.
Heres a breakdown of a typical line of code from this code, I sent this
to the client to explain the issues I was having :
Heres *one line* from bidding.pm in *AccountMgr.pm*:
* $Template =&Translate_File($Global{BiddingList_Template});*
**/The above line looks innocent enough until you try to figure out
what it's loading:/
Searching through the code I eventually find this line in*
Configuration.pm*:
$Global{BiddingList_Template} =
"$Global{Template_Dir}/BiddingList.html";
Looking up $Global{Template_Dir}I eventually find this line:
$Global{Template_Dir} = "$Global{Templates_Dir}/$Global{Theme}";
Now there are two variables to decode ($Global{Templates_Dir} and
$Global{Theme}
$Global{Templates_Dir} = "$Global{Data_Dir}/templates
Ok.. now I have to look up $Global{Data_Dir}
$Global{Data_Dir} = "$Global{CGI_Dir}/data
This isn't defined specifically anywhere I can find with grep.. but
must be /cgi-bin/auction/
Now theres $Global{Theme}
$Global{Theme} = $Themes{$Global{Language}};
Now theres $Global{Language}
$Global{Language} = $Cookies{User_Language}
Cant find this anywhere.. but it must be English.
That leaves $Themes{English}
I finally find this line:
$Themes{$Lang} = $Theme;
Another line in Configuration.pm: ($Lang, $Theme) = split(/\:/, $Line);
and $Line comes from $Global{Themes}
And finally in Defaults.pm I find that line:
*Defaults.pm*: $Global{Themes} = "English:Default";
The above line is splitting $Global{Themes} on ':' into $Lang and
$Theme.
/*So what file is it loading?? :)*/
/**/It's loading:
/cgi-bin/auction/data/tempates/Default/BiddingList.html
Then theres the function that's processing the file: Translate_File
*DisplayMgr.pm: Translate_File*
All that does is load the whole file into a string, simple enough
once you figure out all the layers of BS to get there.
.
*_Thats just one line._*
I hate when people write code like this; it's almost like the author
purposefully made it obscure though perl makes that an easy task (grin)
On that note.. did that person that was looking for the Perl list like
this one find one?
JD
--
JD Austin
Twin Geckos Technology Services LLC
email:
jd@twingeckos.com
http://www.twingeckos.com
phone/fax: 480.344.2640