Wednesday, September 28, 2011

Freelance software development

This article discusses what you should do if you want to work as a freelance software developer. In my view it is becoming more and more easy to get freelance work specially in the field of software, online marketing and content writing. I am working as a freelance developer for more then 4 years. I am working full time from home and I am earning as much as a full time employee of the same experience level will earn from a reputable organization. My advantage is that I have flexible schedule. I work from 8 a.m to 2 p.m, and leave my desk when the kids arrive home after school, I spend time with them and, take rest in the afternoon and then work for 2 hours in the evening when they are playing, finally I start my work at 8 p.m and keep working till my husband comes home. This is why I love my job, I can have good time with my family.


Now I would like to discuss how one should start bidding, winning and completing the project.

1) Find and create a good freelancing site. I have worked at elance.com, vWorker.com and oDesk.com. I have found all of them to be really good. I started as an individual and created a free account. A free account is better as you will not have to invest anything. You will start earning without investing a penny.

2) Find the areas of your expertise. Completing a project is more difficult then winning a project. I have seen many developers who just wanted to grab a project. They had lots of ideas of getting the project done, like forward the project to someone who has used the required technology, find juniors to implement the project etc. But if you are not a champion in the technology that is required by the project them most probably you will fail and you will get a bad rating. A bad rating means no more work. So first of all find your area of expertise, it can be anything related to software development like java, .net, quality assurance, testing, project management, php or requirements gathering etc. You will find more projects for some of the fields like php, jquery and SEO etc.

3) Start searching the project and start making your bids. Before placing the bid make sure that you understand the project completely and you can make an estimate on the time and cost. Here are my tips for making bids

  • Don't bid too small or you will loose interest in the project after winning and start working on the project.
  • Don't put too high amount otherwise you will most probably not be awarded with the project.
  • Multiply your time estimate with 2 or 3. All clients want perfect work, to make them happy you need to invest more time. Mostly our time estimates are not correct as we make estimate on the basis of what we see. But when its about implementing the things we have to be careful about many things which take time.
  • With your bid explain your understanding about the project.
  • Write a small description of how you will implement the project. Don't write everything.
  • Try to ask questions to open a communication channel with the client. Don't ask unnecessary question it will simply make the client annoyed.
  • Inform the client about your availability and about previous experiences of the same type of project.
  • If the client has provided a list of technologies you should know and you don't know some of them, inform him about them too. In case the client chooses you for the project, he would know that there will be learning curve for those technologies.
 3) Don't get dishearten if you placed bids on many project and didn't won even a single project. Try to find out why others are being awarded, try to find out a patterns in your failures, like did the accepted bid had very low/very high amount then your bid, did the accepted bidder was a successful coder at the site etc.

4) After you win a bid make sure that the client had escrow the funds at the site and make sure the terms are good for to start working.

5) I think, I don't need to say that you should work very hard to make the project a success. Deliver exactly what the client wants. Don't try to add extra functionality you think is good, but you are not being paid for it. Think about the time and money the client is investing on the project, keep yourself at the place of client and think what you would the coder to do.

6) Keep in touch with the client and inform him about your progress. Try the understand what type of communication your client wants. If he doesn't want to get bothered about everything, then may be a weekly report will be suitable for him. Try to be consistent, and overcome the difficulties that would arise during your development. Remember "Google" as a best friend of all developers.

7) After finishing the project, ask the client to review and don't mark it as 100% complete until he completes his review or the deadline has arrived. Ideally the project should be marked as 100% complete before or on the deadline.

8) The client will review your work and release payment after full satisfaction. Allow atleast one week to the client to review your work. Don't get impatient if the client takes time in reviewing and releasing payment. Remind him to review your work after 4-5 days.

9) After the client releases your payment you can choose any method to withdraw funds which are supported by your freelancing site. Payoneer is a famous withdrawl method these days which costs very low, other methods are worldpay and bank to bank wire transfer. Request the client to leave a feedback score for your work if he doesn't do so after releasing the payment.

10) Last but not least, remember me in your prayers while enjoying the money!

Tuesday, September 27, 2011

Support GWTCanvas in IE7 and 8

HTML5 is out for quite a long time now. The most popular thing is, I think, Canvas. It is being used for drawing, image editing, charting, games, intros and many more things.

I had created an image editor for a client who wanted me to make it work at internet explorer 7 and 8 also. As internet explorer doesn't support html5 so I had to use excanvas to make the application work in IE7 and 8. It was a tough job and I was annoyed by the client's insist on these version of internet explorer. I was like, who is going to use such old versions of a browser when we have a lots of choices plus chorme and FireFox are getting more and more popular. After I finished the application and made it work on all major browsers (including internet explorer 7 and 8) I got another project in which client wanted to make his GWTCanvas application run at IE7 and 8. I was again shocked why people are so serious about these old browsers.

In those days my computer had become very slow, I had tried many tricks but nothing worked. So I had to restore my operating system factory state. After I restored the initial installation (three years old) of windows vista I had internet explorer running on my computer. I was ready to upgrade it to internet explorer 9. But when I tried to do so I got to know that I had to install many service packs. I started downloading the service packs. There were lots of problems while trying to apply service packs and update the operating system. So I had IE7 on my computer for many days. Now I know why clients insist on supporting these old browsers.

Now lets talk about how we can make GWTCanvas run on the IE7 and 8. Because old browsers don't have Html5 support so GWT guys has not supported it their implementation also. If you try to simply add excanvas.js in your html file, it will not work. This is because that GWT canvas module has following lines in their .gwt.xml file.


Due to the above lines when you will try to run following line you will not get the canvas element in you application.

canvas = Canvas.createIfSupported();
 
GWT knows that the user is running the application in internet explorer 7/8 so the canvas support is not present. To overcome this problem you will have to override the "canvasElementSupport" property by adding following lines in your GWTExCanvas module



Notice that previously the value of canvasElementSupport was "no" and now it is "maybe". Including these lines will make the canvas available in internet explorer 7/8 too. But the canvas will still not get created. This is because the GWT's implementation of DOM doesn't have a way to create html element for Canvas. To add this support we will have to subclass the com.google.gwt.dom.client.DOMImplIE8 so that we can add the method createElement for html canvas element. We will have to put our class in same package as DOMImplIE8. Following is my implementation of this class.

package com.google.gwt.dom.client;

public class MyDOMImplIE8 extends DOMImplIE8 {

     @Override
    public Element createElement(Document doc, String tagName) {

        Element elem = super.createElement(doc, tagName);
        if (tagName.equalsIgnoreCase("canvas")) {
            elem = createExCanvas();
        }
        return elem;
    }

    private native Element createExCanvas()/*-{
        var el = $doc.createElement('canvas');
        el.setAttribute("width",300);
        el.setAttribute("height",150);
        el = G_vmlCanvasManager.initElement(el);
        return el;                                                        
    }-*/;


Here G_vmlCanvasManager.initElement is to initiate excanvas.

Also add following lines in your .gwt.xml file.


Now the last point is where do we add the excanvas.js. You can let the users of our GWTExCanvas module add excanvas.js in their html file or include it in your own java code. I preferred the second option. I created a JSNI method and pasted the excanvas file in this method. The method was called in a static block inside the above class.

 static {
         initExCanvas();
     }


    private native static void initExCanvas()/*-{
// CONTENTS OF EXCANVAS.JS HERE
}-*/;

Now my own GWTExCanvas module was ready. I just have to add it in my application and use the standard GWTCanvas code. If you have already developed your application and now you want to add IE7/8 support, this solution is ideal as all you have to do is to inherit this module. Make sure to inherit it after inheriting GWT in your .gwt.xml file.

Thanks for reading.