Description of seven last fatal
errors. These errors are conceptual on their nature and cause errors
described in the 1st and 2nd part of the article. They also include
such errors as insufficient attention paid to the project in whole
and to the program code as its part.
One of the main advantages of
PHP is its disadvantage at the same time: PHP is very easy to learn.
This attracts many people but in spite of its false easiness its
rather difficult to learn right and effective usage of this language.
As a rule we deal with
insufficient programming praxis. Inexperienced programmers face the
necessity of complicated web-applications creation. Thus the mistakes
are frequently done which an experienced programmer could evade such
as unjustified usage of printf() function or wrong usage of PHP
semantics.
In this series including three
articles the most typical from our point of view errors are
presented. These errors may be classified on some categories from
non-critic to the fatal ones. Together with these errors analysis the
ways of their evading are described and also some little tricks which
have been collected for many years of programming praxis are
presented.
Audience of the article
This series of articles is
meant for those PHP-programmers who want to evade the mostly common
errors in the code writing. The reader is at least supposed to know
general PHP syntax; some experience of practical language usage is
also very desirable.
Introduction
One of the main advantages of
PHP is its disadvantage at the same time: PHP is very easy to learn.
This attracts many people but in spite of its false easiness its
rather difficult to learn right and effective usage of this language.
As a rule we deal with
insufficient programming praxis. Inexperienced programmers face the
necessity of complicated web-applications creation. Thus the mistakes
are frequently done which an experienced programmer could evade such
as unjustified usage of printf() function or wrong usage of PHP
semantics.
In this series including three
articles the most typical from our point of view errors are
presented. These errors may be classified on some categories from
non-critic to the fatal ones. Together with these errors analysis the
ways of their evading are described and also some little tricks which
have been collected for many years of programming praxis are
presented.
Part I: 7 childish
errors are described (21-15 backwards according to the grade of their
importance in our classification). Such errors dont cause serious
problems but they reduce effect of programs work and are also
expressed in a bulky difficult to read code which is also difficult
to change.
Part II: The next 7
error (14-8) which are classified as serious. They lead to the
considerable reduction of codes completion speed and scripts safety
reduction; the code becomes even more complicated.
Part III: Description of
the last seven fatal errors. These errors are conceptual on their
nature and cause errors described in the 1st and 2nd part of the
article. They include such errors as insufficient attention paid to
the project as a whole and to the programs code as their part.
7. Programming by means of method cut-paste: wrong approach
Some beginners have a habit of
copying another code, for example, scripts for addresses
verification, mail sending and form processors. Such activities
result into mixture of operators which does what it has to do
although not in a proper way.
And if the code functions under
optimal conditions, it will obligatory break down during real
testing. At this holes patching never makes your code
- extensible: the program will look like a set of scraps which were fastened together. Ask an experienced programmer to change something in such script and he is sure to prefer writing one of his own. Unreadable code is an inextensible code.
- safe: you insert another persons code into your project without knowing what exactly this code does. Think about it. And what if this code contains false system call which destroys all the files form your fixed disk? Besides that the same code cannot have the same protection and safety for different systems. And finally youre simply copying someone elses errors.
- fast: if you compose code from the parts of different scripts, you shouldnt expect fast work from it. Thus in this case logical development of the script is simply absent; and its a common fact that scripts speed is based on its logic.
Correct approach: examine
and then copy
Before you copy code of someone
else examine it carefully. Analyze what has been done and in what
way. And only if this code is easy to read, fits into your programs
logic and doesnt contain any errors, only in this case it can have
pretensions of being copied. If these rules are observed, the copied
part can be integrated into the project rapidly and smoothly.
Libraries are what you need
Use libraries of PHP-functions
only from reliable sources such as, for example, PEAR and PHP Classes
Repository. Optional functionality which API from these libraries
offers to you will benefit your project. So if youve found a
ready-made library of functions which are necessary to you (from
reliable source), its usage is always welcomed.
6. Absence of technical directives in the project
Once in the very beginning of
my career I worked over one serious project (on PERL) in team with
three other programmers. I was young (and I wasnt a supervisor of a
project), we had no technical directions. Each of us took his part of
the project and worked over it on his own. When we started assembling
our project our parts were quite different on their styles.
For example, one of my
colleagues used BiCapitalization in the variables names. I used
underscore ("_"). The supervisor of the project chose the
most original style and mixed both methods according to his mood
(this fact caused conflicts in the names space; everyone knows how
unpleasant it is for a developer).
We needed 20 hours optional
time; although nothing like that would have happened if we had set up
clear technical directives for our project.
Technical directives describe
structure and external presentation of the source of the project,
determine methods and realization strategics of the final product.
For development of any project
you have to set up technical directives and follow them. In the
technical directives various working aspects should be determined:
general items, for example, division of the source (its file
structure) and more concrete ones, for example, rules of variables
naming (suffixes and prefixes, global, in full).
Technical directives are the
set of consent which should be observed independently from the
personal preferences of programmers. Technical directives fix all the
decisions concerning all questionable moments like these:
- which variables should be declared as global and how they will be differentiated from the local variables;
- structure of documents saving, i.e. rules in which directory this or that file should be placed: src or lib.;
- style and contents of comments;
- documentation rules;
- strings width.
Technical directives should be
arranged into a document; each projects participant should have its
copy. After the project ends this document must be saved for the
further addressings to the source.
Example of technical
directives project
For better understanding well
try to set a sample of technical directives: without details, the
main items only. Of course, all the necessary elements will be
presented but they will be rather schematically: in reality technical
directives can easily have 10-40-pages length. Its worth to mention
that you dont need to write new technical directives for each new
project: its enough to have a ready-made sample and change it if
necessary.
Technical directives for
presentation of the project DesignMultimedia.com
So lets give an example of the
external presentation of the project. Having developed a document
like this you may concentrate on the realization of the project only
and dont worry about incoherence of sources, naming conflicts or
sites structure if you develop your own site.
Introduction
This part determines following
moments:
- file structure
- documentation of sources
- comments: style, meanings, definitions
- directives concerning assembling of the project
- rules of variables naming
File structure (on the
example of DesignMultimedia.com)
Explanations to the structure:
<Here the explanations
concerning all the described before rules and agreements are given in
order to exclude every false interpretation>
Running titles
Each page of the initial text
of the project contains following heading:
<Here the heading is
indicated. It may include whatever you want: from the codes sample to
a simple copyright.>
For example, all c. and h.
files within PHP4 project had the following standard heading:
/*
+-----------------------------------------------------------------------+
| PHP version 4.0 |
+-----------------------------------------------------------------------+
| Copyright (c) 1997, 1998, 1999, 2000 The PHP Group |
+-----------------------------------------------------------------------+
| the given file with the source gets under action of PHP license |
| for version 2.02 which copy is saved in the given program package in file |
| LICENSE; the given license is also available on the address in WWW |
| http://www.php.net/license/2_02.txt. |
| If you havent got the PHP license copy and don't have any possibility |
| to get it through WWW we beg you to inform us on the address |
| license@php.net and the license will be immediately sent to you. |
+-----------------------------------------------------------------------+
|\Authors: Sterling Hughes <sterling@php.net> |
+-----------------------------------------------------------------------+
*/
And the lower running title:
<Here you place your
standard lower running title; in the project PHP4 in all files .c and
.h you can see following :>;
/*
* Local variables:
* tabulation width : 4
* main indent C: 4
* Tabulation:
*/
And comments if necessary.
<Here explanations about the
contents of upper and lower running titles are given; perhaps the
reasons for their presence are explained (in depends on the running
titles contents).>;
Documentation
In this part codes
documentation style in the application is defined: if itll be
arranged in the javadoc form or XML Docbook
Comments style
Here the comments style
together with explanation of abbreviations and some phrases is
described
Rules of projects assembling
Here the rules in form of bans
or directives are given, for example: Dont save different classes
within one file or Save each class within a single file
Naming of variables
Here you can write something
like this :
By naming of the variables in
the given project the following rules are to be observed:
[1] In the names of the classes
bicapitalization is used.
[2] Functions names are written
with lower-case letters, for the separation of the words underscore
("_") is used.
[3] Other more concrete rules.
5. Absence of the expert judgement about the program
The idea to add this item
visited me during the similar testing which I was asked to do by my
friend. Having examined his code I was able to reduce the variables
quantity on one third (that resulted into 400 per cent increase of
data base addressing speed), quantity of strings in the program on
about one half and beside that make many improvements with general
result 1000 per cent speed increase (that means ten times faster).
What is the moral? The moral is
that quality, speed and safety of your code will incredibly increase
in case you always have another available experienced programmer who
will examine your code. Other person will pay attention to all the
errors about which you even didnt know and find simpler ways for
solving this or that task. Beside that its easier for him to find
such places of your code which make PHP work slower or which can be
potential holes.
One of the reasons for the
incredible success of PHP project which is a language with uncovered
sources is the fact that many people have seen the code. Thousands of
people tested PHP for free against the presence of errors, potential
fails, incompatibility, working speed etc. Thus by the appearance of
a new PHP version minimum 2-3 very experienced programmers have
looked through the code.
As an ideal all the projects of
medium/large scope should be looked through by at least two guest
programmers. As in any other kind of art a new look is always
welcomed. But people are mostly satisfied with one tester.
Person who is able to give
rapid judgement about the work done and introduce constructive
motions about the codes contents and realization of a project as a
whole is supposed to be an experienced expert.
Often its useful to set up a
short questionnaire for the person who looks through the code. Here
are some possible questions:
- What is the purpose of code XXX?
- How does file XXX fit into the rest of the project?
- What is the algorithm for the errors neutralization?
- Can we chase actions of an average user of the given program?
- Where can a program user be mistaken?
4. Patching up a project
You may have written an
application and had an idea that some moments are worth rewriting. To
patch up means to write patches instead of examining the reason of
errors appearance and its removal.
If youve done such mistake and
wrote patches your code wont work properly which is caused by the
compromise of speed and safety.
Indexes for the projects
imperfections
Of course, by the initial
projecting of an application you suppose that your thoughts are the
most correct ones. And you can understand that something goes wrong
only in the last moment when the application (and its parts as well)
is nearly written up to the end. There are two indexes which testify
of a wrong projects plan:
- Very frequent codes reanimation: program breaks down constantly and you find different methods to force it to work. But this doesnt fit into the initial plan of your project. On the other hand although it isnt the best way out in the given situation, it is the best salvation you can find within the plan youve already set up.
- Very complicated realization. Complicated operations are done for salvation of simple tasks. In the example given below cycle for is used for the output of a string:
<?php
$GeorgeBush=
"If you examine market tendencies, I think, youll mention
that the larger import part comes into the USA from abroad ";
for ($idx
=
0
;
$idx
<
strlen
(
$GeorgeBush
);
$idx
++) {
$GeorgeBush
[
$idx
];
}?>
This code is written well; it
passes through the line in cycle and puts out the famous phrase of
George Bush correctly. The syntax is correct as well as nesting. And
nevertheless we could get the same result by the simple output of the
whole string (print()).
Improvement of programs
drawbacks
When you realize that the
program has some drawbacks or that it isnt simply realized in the
best way, you undertake proper steps for the codes optimization.
There can be plenty of variants this way: you can leave everything as
it is, you may change some modules of the program or rewrite the
whole project.
In the most cases it can be
useful to have a judgement of an independent expert: having looked
through and examined the code he will be able to judge about scope of
imperfections properly.
Lets examine three categories
of errors:
- Little localized mistakes: sometimes errors in your program arent so critical for its functioning and its correction doesnt compensate money and time spent on it.Ways of correction: in this case its necessary to document somehow the fact of error itself. When you decide to change or renew your application youll correct this error at once. As an example for the error of such class can serve wrong data organization in the separate part of application (simple massive in the place where it would be more logical to use an associative one; riding-crop instead of more suitable tree).
- Considerable but localized errors: sometimes it happens so that you really have to rewrite some part of an application. For example, if you write your operation system, there can be plenty of errors in the Windows dispatcher and at the same time the rest of the code can be in order.Ways of correction: all you need is to change project of Windows dispatcher namely (not the whole operation system). It seems to be the mostly widespread case in the programming practice: single modules contain errors but the general project structure is correct.
- Considerable widespread errors: and finally the emergency case when errors are contained in the realization of the projects infrastructure itself.Ways of correction: if the applications infrastructure itself was projected wrong, usually we need reorganization on the level of different program modules interaction. This is, of course, the most laborious work which takes a lot of time and it is rarely done especially if we speak about projects on the last stages of their realization. As an example of such errors we can demonstrate usage of simple files for saving the whole amount of information within such huge search system as Yahoo.
3. Excluding of ultimate user from the development process
Imagine such situation: youve
got a task to develop a corporate application special for your
company. Youve spent hours on search and documentation of tone of
documents, defined costs of the project, set up tasks and completed
them. In three months you bring the ready-made project only to hear
in response:
It isnt what we wanted.
Our demands changed.
Yes but
Eh, what program are you
talking about? (Your initial customer is already fired from the
company!!!!).
Has something like that ever
happened to you?
A user is always to have the
last word in the judgement about your application. Its namely he who
will use your application (and, of course, he will keep trying to use
it wrong). Many programmers write such things which are masterpieces
on their own but at the same time dont correspond with users demands.
And it often occurs because one or some misunderstandings.
And these misunderstandings
appear when you ignore the ultimate user during the development
process. Dont forget about your future users when creating an
application. Always keep in your mind WHAT users want get from you
and in what way the program should achieve the set aims. Its
principally important to have connection with users and pay your
attention to following procedures:
- permanent feedback
- creation of models
- beta-testing
Permanent feedback
Benjamin Franklin wrote in his
Poor Richards anthology: One stitch in time is worth of nine. We can
apply the same rule for the applications development. If you really
want to finish your project as soon as possible, its very important
to have connection with user and be interested in his opinion about
your program. What do they like about it? What do they dislike? How
can you improve your application?
Creation of models
Creation of the program models
is a whole system which includes many tests and communication with
users and acting during the whole period of applications development.
However doing tests on models takes much time. And its worth to start
it from definition of users testers group.
Check application against
conformity with demands but also pay your attention to the direct
responses of users themselves. Besides that many programmers test an
application only after having written and assembled it. They make a
mistake cause this may fail the whole project: the differences
between what a user needs and what youve done are too big. Besides
that users often understand what they really need only having some
real sample before their eyes. Users demands to the project are
constantly changing during the development (although many programmers
would prefer quite the opposite).
There is a method for evading
this headache: divide the whole application development process into
some stages. By ending of each stage think over the following:
- Does the work youve done on the given stage bring some useful for a user result?
- Are there any things left which user would like to see in your application but which still arent presented in the project?
- Will the optional functionality which has been added on the given stage be set in action?
- What is the net profit in the functionality of your application?
- Has your work improved or worsened the application?
- How to divide work into stages?
Usually good practice is
considered such limitation of stages when some considerable portion
of users interface is completed.
As for me, I consider the first
stage finished when the first variant of common applications
interface is ready. This occurs when designers define the backbone of
the site. The next test of users interface can be done when the
mostly general demonstrational model of functionality of your
application will be ready.
Then tests are done after the
finishing each module or multiplier. The example of such module we
may call users dispatcher in application or search system of a site.
By testing I gather my own testers group (I invite others who are
more competent in the subjects tested at the moment) and offer them
the same questionnaire which I described before. This enables you to
see general result of your work on the given stage. You may ask
additional questions or hold to the initial list.
Beta-testing
This is the mostly widespread
testing form which looks a bit like modeling but usually beta-testing
is done when the project is on the last stage of its development. The
project is sent to a certain group of beta-users; they test an
application and sent their references, comments and error messages to
the developer. Beta-testing isnt as interactive as modeling and its
worth to do it as early as you can. However beta-testing is simply
necessary before you release your application.
2. Absence of a plan
Nowadays many projects are
written according to the principle the main is starting; further it
goes on its own. For example, I wrote one of my first projects basing
on the 40 minutes long telephone conversation. And although
everything functioned the risk of falling down was big enough. Of
course, if I had thought over and planned everything before starting
to code, the risk of fails appearance would have been considerably
less.
For example, abstraction in the
project was nearly equal to zero. I.e. if customer had had a wish to
use MySQL instead of MSSQL, we would have to rewrite the whole
project. Besides that the safety system wasnt done properly. All data
were saved in cookie. There were some other defects but they were too
inconsiderable to be described in details.
In his work "The Mythical
Man Month" which was devoted to the software development process
Fred Brooks described optimal plan for work over an application that
looks like that:
- 1/3 Projecting: you develop a functioning conception. What do different application modules (or parts of these modules) include? How do they interact? How should the whole application function? Answers on these questions build a base for the whole system development.
- 1/6 Coding: thats the thing that all of us adore to do. We realize conception into life.
- 1/4 Testing of separate modules and common testing on the early development stage. By creation of big systems such moment comes: the application isnt ready yet but its already developed up to the stage when you may test its basic functionality.
- 1/4 Testing of the whole system: it is the last stage when we already deal with the ready-made application; now it should be checked and rechecked in order to have as few bugs as possible left.
But nowadays we are already
happy if we can spend 1/6 of all the time on the first part
(projecting). In the most cases programmers are eager to print code
without having a clear idea of what they should write and without
considered task estimation and, of course, without any ready-made
ways of its solution. Such behavior can be compared with attempts to
write a term paper without setting up a plan.
Coding can be a simple
statement of what youve already have projected, no more than this.
Many programmers come to such grade when they write all the
application (or the most difficult parts of it) in pseudocode and
only after it code the project in the real language such as, for
example, PHP.
Notice: projecting of
appearance, work and thinking of your application is also known as
informational architecture.
Stages of projects
development
A lot can be said concerning
this theme. But its enough to enumerate: debugging, compiling flow
blocks, modeling, project management and terms establishment.
But we will content ourselves
with a minimal set of general recommendations.
So an ideal projects plan
includes:
- stage of demands learning
- stage of development
- stage of testing
Stage of demands learning
Complete analysis of demands
made to the program is the first step in planning of an application;
you define what exactly you need to do. You describe detailed and
precisely what the program will do and how it will work. Its one of
the principal moments in development.
Determination of users
demands
So how can you clear up what
exactly a customer expects from your application? You should play a
role of consultant occupied with determination of customers needs and
in particular try to analyze what this customer presents himself. For
example, you should be interested in following:
- What are they occupied with?
- What makes their product better than the others (or unique)?
- In what way would they like to present themselves to the audience?
- Which features/properties of their site will help them to achieve their market?
The last question enumerated
will be able to help you with the projects extension. Can you offer
some optional functionality and thus make their site better? If you
can, your customer will be extremely happy and youll have the
opportunity to deal with a big project (and it also costs more).
Methods of research can vary
from questionnaires to the private conversations with people
occupying key positions in the company. But whatever you choose its
always very important to ask all the questions enumerated in this
chapter.
Determination of
technological demands
On the given stage you are to
determine which technologies your application will use. The main
question: will we be able to satisfy customers demands; do we dispose
of technical ability for this? At this you should take into account
language in which the application is realized, operating system of a
platform, servers speed and speed of connection with it and many
other aspects.
Stage of development
So the specifications are
ready. On the given stage you should decide how your application will
be realized, what and when will occur in it. You may even make some
rough drafts in pseudocode if some parts seem too complicated to you.
In other words youll need to:
- model an application
- illustrate it
- make some rough drafts in pseudocode
To model
Before you start coding you
should think over the way in which different parts of your
application will communicate with each other.
As an example well examine a
script with message sending form. Well describe all possible actions
which user can make for filling in such a form. On the highest
applications abstraction level only two actions are possible: a user
either has sent his data or hasnt sent them.
If the data arent sent, you
need to send a page with an empty form to the user. In other case its
necessary to make (to repeat) one of the following actions:
- if the data is correct (i.e. correspond with correct data criteria), you need to send the message to the addressee and a gratitude page to the user.
- otherwise we send an error message with indication of what was wrong and offer an opportunity to correct it.
To illustrate
Below a very simple diagram
illustrating applications work is presented. The diagram is made in
Microsoft Visio(r) and suits ideally for the simple message sending
application.
However when we speak about
more complicated projects its always useful to have special tool for
diagram building available. Here are three of them enjoying the most
success: Dia, Visio and UML.
Pseudocode
Pseudocode (i.e. such code
which only describes an applications work and isnt correlated with
any of the languages) is a rather common practice among developers.
Usually it is used when some confusing situations are faced or when
the general overview of applications work isnt clear. I also think
that pseudocode is rather useful by the applications interfaces
determination and especially when interfaces I have created are used
by other developers. Pseudocode helps to find the simplest but at the
same time sufficient methods of treating this or that application
part.
To give an example well return
to our script for messages sending:
if (formSubmitted) {
valid_name(name) or error() and output_form();
valid_email(email) or error() and output_form();
valid_message(message) or error() and output_form();
message = name & email;
send_mail(email, message);
print "Thank you for your feedback";
} else {
print "Send us feedback";
formelement(name);
formelement(email);
formelement(message);
}
This code determines the main
scripts structure and demonstrates all the necessary elements. Of
course, code isnt a working PHP-script (although it could take this
place). The mission of pseudocode is to set tasks and, perhaps, to
base them on theory. The grade of pseudocodes abstraction depends on
you only. As for me, I incline to less abstract code. It depends on
that how sure you feel when programming.
And finally when youve already
planned your application you can start coding: all the steps that
should be done are already familiar to you; you also know what you
should get as a result.
Stage of testing
One of the most important
stages in the applications development which nevertheless is not very
often done is (final) testing. Often under pressure of a manager or
due to the time shortage the testing phase is reduced to minimum or
omitted at all. And the application is considered to be
conventionally fit.
Frankly speaking, programmers
hate testing. This, perhaps, is the most annoying and irritating
occupation connected with programming. Testing results into hours and
days of unknown bugs hunting, debugging, checking of all the possible
combinations and situations and all this in order to make sure that
the program functions properly in the most cases. And nevertheless
you are NOT GOING to get a code without any bugs! Something is sure
to slip away from your attention. And things which (you are sure!)
shouldnt happen occur at any case.
Regression tests
People are seldom content
themselves with one applications version: most of them are in
perpetual endless renewal. Make sure that adding new functions doesnt
distort work of the old ones: functions on which users depend to a
certain extent. To do this you should know about such notion as
regression tests cycle. So are called tests which prove that
functionality of the present version wont be upset in the following
release. Each new version of PHP-project itself passes series of
regression tests and thus by adding some innovations the previous
functionality is saved completely. Thus we not only achieve backward
compatibility of all PHP-versions (i.e. new abilities added but the
old scripts keep working correctly) but also confirm the fact that
innovations dont upset work of other functions (and even dont change
their behavior).
Volume tests
Congratulations, your
application works perfectly with one user: everything seems to go
right and happen at a huge speed. And what happens if 20 users will
work with the application simultaneously? And 30 users? And what
about 100? How fast is your project working now? Does it show up
strange errors?
Independent from the tests you
do make sure that your project works correctly at big loadings and
changing conditions.
But this doesnt mean that users
should do all testing work instead of you (when you simply lay out
everything on the site and wait for references and letters about the
errors found, you know). Make beta-testing as it is described in the
previous chapter. Besides that there are special service programs
which emulate big users flow. The first thing to memorize is AB from
Apache. AB or Apache Benchmark makes adjusted quantity of requests to
the page and shows up quantity of successful requests, quantity of
requests failed, average speed and so on.
We recommend you insistently to
test your web-projects by means of AB (of course, if youve made a
decision to use Apache server). This way youll be able to find and
optimize pages which eat up memory or load to long. (Also think about
purchasing of a wonderful caching utility from Zend- The Zend Cache).
1. Fouled-up terms
Error number one for all time
and nowadays which is haunting programmers is complete inability to
calculate their time inputs.
Dont be afraid too much because
we are all optimists. Its quite natural to suppose that realization
of a project will take exactly that period of time which it has to.
And no bugs are taken into account. Even more than that, we often
have no idea that we might have any problems with realization of
something.
So lets pull ourselves
together, suppress this instinct and calculate time inputs otherwise.
From my personal practice: when I take up a new project I take into
account all the factors I can memorize, estimate period of time I
need for each of them, sum all this up. Then I double the result I
got. Isnt it accurate? I wouldnt say so: customers are pleased when
you bring a ready-made project before the indicated term (and
conversely: if you are late, they are rather displeased).
Such reassurance method of time
inputs indication helps me to work properly over a project and keep
within terms indicated by me. But here, of course, everything depends
on the accuracy of the original calculations.
Every programmer underestimates
(far more seldom overestimates) time which he needs for a projects
development. At this each of them has his own coefficient of
potential errors admission. For me its 2, for someone t can be 1.5
and for someone else even 3. The whole trick consists in finding your
personal coefficient and amending your calculations.
Underestimation of time inputs
for the projects development can result into following consequences
(which are too familiar to me):
- You sacrifice all your free time to the project. Youll spend day and night working over it and have no time to rest (I dont intend to say developing is bad but programming non-stop is impossible to bear).
- You will be in hurry. This means you will carry about presenting the ready-made project in time instead of thinking about its readability, safety and working speed.
- Hurrying up you may leave out such important stages as testing of a code or checkout. The customer may dislike it and youll get some extra-work.
- You may need outside help. This costs some money and isnt always useful (according to the Brookss law, especially by development of capital projects).
Always leave enough time for
prolonged checkout (the same period as you leave for the whole coding
stage and even more) and no less than one third of all the time for
planning. These two stages determine the whole projects development.
SterlingWonderfulToyland.com:
Example
Lets examine as an example one
simple project: site SterlingWonderfulToyland.com. This is a usual
commercial internet-site. Its purpose is to sell via internet game
devices and videogames with discounts; the items quantity is limited.
As a supporter of old and
checked sales methods the sites owner John Giuseppe wants to invite
customers to his storehouse and choose goods themselves. Thus the
whole site can be logically divided into two parts:
- the order system itself
- html-part of the site which invites customers to the storehouse and design of this storehouse itself.
By planning I would make up two
separate estimates for those parts. Then I would sum up these two
terms, add a week for assembling two parts and presented the final
term to the customer (for the whole site without any division).
Html-part
For simple strategic part of
the site I would taken as base the time I need to make up one page in
some editor, for example, in Macromedia Dreamweaver. And as dynamic
elements are absent in this part for determination of general time
input you may simply multiply time you need to make up one page by
the quantity of pages (under condition that pages design is already
developed). Then I would double the result I got (as my personal
coefficient is 2). Generally, this part doesnt need really detailed
planning (think over: a designer submits you with schedule of that
how everything should look like, your task is to make up pages in
Dreamweaver).
Notice: add one more interval
which is equal to about 1/3 of all time, youll use it for assembling
of the project. So if youve planned development of script for credit
cards checking in 9 days, add another 2-3 days.
Orders system
Distribution of regalement for
dynamical part is rather difficult thing. The thing that can help you
here is simple division of task into some simple components (as, for
example, operations with credit cards, instant order at one click,
products catalogue, management system of this catalogue and so on)
and calculation without any coefficient. Then I sum up and multiply
by my personal coefficient of errors admitted. Only after that I
calculate one third of time for the whole development and add it. All
the optional time I spend on checkout and testing in order to provide
a customer with a correctly working project.
Notice: add another one third
of the time for planning as in simple html-part.
How to present such terms to
the customer
The fact youve managed to
calculate the terms for project realization correctly doesnt mean
that the customer accepts them as you do. Sometimes having indicated
too long terms you simply loose your customer. Your competitors will
set more attractive terms only to get this order and they simply wont
hold within these limits. So what should you do to please the
customer and at the same time be honest and hold within indicated
terms?
Here the moment comes when you
have to present your services and terms to the customer in a proper
way Which terms can you offer? What makes your terms real and why
exactly this term is indicated instead of any other one? Often
imagined conversation with the customer helps: imagine yourself on
his place and think what you could expect from the potential
employee.
Here are some of the aspects
which seemed the most important to me:
- Make high-quality work. Others can work a bit faster than you but your advantage is that you make everything properly and correctly and this finally will save a lot of customers time and money (this argument is especially considerable if you are hourly paid).
- Keep to the terms. You set terms and intend to keep to them. Others con set terms which are more attractive but they are not going to keep to them.
- Give references. Your previous projects illustrate your professional skills. Collect references and letters of recommendation from customers who were pleased with your work in order to present them to the potential chief/ customer.
- Be careful! Check orthography and grammar in all your calculations. Add schedules and graphics, describe all you plan to do and time you need for each task indicated carefully and clearly.
- Offer some variants. Dont content yourself with simple declaration of time which some task is considered to take. Give some possible variants. How will the events develop according to optimistic scenery? And according to the pessimistic one?
- Indicate the shortest possible terms. Large terms have more chances for not being kept to.
If the terms indicated by
you are too short
If a nuisance like this has
nevertheless happened to you and you are going to be late, there are
still some possible variants of actions (which arent mentioned too
often in such situations):
- Maintain contacts! There can be nothing more important than permanent contacts between programmer and customer. All the time inform the customer about what you are doing about the project. If you need to prolong your terms, itll be much easier to do than in case there were no news from you at all during that period of time.
- Demonstrate the ready-made part of a site to the chief/customer. Demonstration of the work youve already done often makes negotiations concerning optional time easier. Show youre working over the project.
- Find a switchman. Take the whole responsibility for being late yourself but dont forget to indicate different external factors which prevented you from making the order in time.
- Cut the angles. Thats disgusting and annoying but if you really dont have enough time youll have to cut some angles and present to the customer release version of the product with detailed list of all the bugs. Then during the testing or later youll return to them and correct.
- WYSIWYG. Working over web-projects I prefer to write html-code with because I dont trust graphic html-coders too much. However if your project is endangered, its worth to treat such variant.
Summary
PROGRAMMING BY MEANS OF METHOD
CUT-PASTE: WRONG APPROACH.
Usually copying of someone
elses code isnt considered to be a very good idea. Itll be great to
examine techniques and algorithms of another code and integrate them
into your project if necessary. Or you can use ready-made libraries.
But you shouldnt simply copy another code.
ABSENCE OF TECHNICAL DIRECTIVES
IN THE PROJECT
Making up detailed directives
is necessary by developing every project. Directives let you lead
your project organized in the style and documentation which is common
for everyone and thus let you evade many probable misunderstandings
in the future.
ABSENCE OF EXPERT APPRECIATION
OF THE PROGRAM.
Someone is obligatory to look
through your code. New look on the project will find such things as
non-optimized SQL-requests, wrong syntax application, too complicated
solutions, holes and other drawbacks.
HOLES PATCHING
Serious drawbacks cannot be
corrected with patches. If you see that something has been projected
wrong (or in a way that isnt proper enough), in the most cases its
better to reproject and rewrite this module.
EXCLUDING OF AN END-USER FROM
THE DEVELOPMENT PROCESS.
Never do this. These are namely
users who will judge about appropriateness of your application when
everything will be said and done. Attraction of users to the
applications development process itself will let you evade many
probable misunderstandings.
ABSENCE OF A PLAN.
Forget about principle the main
is to start; further it goes on its own. Find time for detailed
planning. Each projects plan should include following stages:
examining of demands, development and testing.
FOULED-UP TERMS.
Find enough time for the
projects realization! Aiming at keeping to the unreal terms youll
increase your chances for making previous 20 errors. Dont let
yourself be wasted in time.
21 errors of a PHP-programmer translate to Việt Nam