How to hire a freelancer – 10 lessons learnt

These days everybody are full of ideas but no time to make these happen. Same here, I have great business ideas every a few weeks but while working full-time on my day job I have har

d time to implement these on my own and all my friends are also very busy.

I decided to try out the www.getacoder.com service to find affordable quality help to my projects and so far I have not been disappointed while following the below steps.

1. Write down IN DETAIL what you want to be done.

Before posting a job to www.getacoder.com make sure you have as detailed as possible overview of your requirements. This is called BRD – Business Requirement Document. This must list everything like, user must be able to register, user must be able to login etc. Programmers can take this doc and can implement every feature step by step.

2. You will start getting contact requests from everywhere

Depending on the clarity of your profile the providers will find you and suddenly you see emails and Skype contact request coming in from people you don’t know. This is because fees for using the freelancer finding websites for programmers are quite high and they might hope to get around it. Second reason is that getacoder own chat is monitored by staff and you cannot discuss freely with developers being afraid that  you violate some terms, for example tell the company webpage that has contact details.

3. Don’t hurry, first bids will be most expensive

The more expensive development company is the more marketing effort is put into it. There are people who send you bids already next minute your job was posted. You are online and engage into chat with them and all looks good. Then they want immediately start working and ask you to award the job to them. One of my project had average bid 1000USD, highest bid of 2600USD(same day) and lowest 350USD which came a few days later. Also because the bids are public then usually every next provider tries to bid lower than previous.

4. Be very careful at what you believe from providers

Many of them have hired professional salespeople BDM – Business Development Managers. These people know psychology and can sell you anything. You cannot automatically trust that they have big companies behind them even if they might give you the link to company website. All portfolio might not be developed by them. What you can believe is when asking them specific questions to understand if they understand the technology but again you are talking to salespeople not developers so they might not know every little detail. I have started to use test tasks to understand the skill of developers. Give the developer specific task to solve that involves critical technology and areas of your project. This testing job must not be time consuming and maybe involve less than half an hour of coding from skilled professional.

 5. Use clearly defined milestones

In the unfortunate event when you should not be satisfied with you developer then you don’t want to lose lot of time and money because of it. So before awarding the project you must agree a few milestones – what features are developed by which date and how much money you will pay by this time. This is where best feature of getacoder.com – the escrow comes into play. You are able to upload the funds into getacoder escrow deposit account bit by bit. Minimum first payment while awarding the job is 30% with step of 10% and you can release every single escrow deposit by 10% increments. This gives you very good flexibility of when and how to pay the programmers. Once every new feature is done the programmer gives you source code and you will give him little bit more money. On the other hand if you are not satisfied with coders for some reason you can cancel the project any time and continue with possibly new programmers while risking with only minimal amount of money and time.

7. Stay in touch with the coders

Since programmers do not know your business well then you have to keep them on track. Even more importantly it is in human nature to delay work until it is too late. If you are asking about the progress then this motivates the workers not to wait till the last minute. In the same time it is very important not to disturb the work of a programmers. Be ready on your side to always answer the programmers questions, every time something is not understood then work usually stops.

8. Check the work thoroughly for all issues at the milestones

You are requesting the work and before accepting the work you are responsible in checking if the delivered project meets all the standards. This is called UAT – User Acceptance Testing . Go through every feature you requested, do stupid things normal user will not do hoping to break down the system, check all the cornercases. In these days you cannot forget the security, make sure all inputs and outputs feel sanitized and you cannot find anything that can be called XSS, CSRF or SQL injection in there.

9. Keep track of all the issues

When you mention the defects or change requests in the usual conversation over e-mail of Skype then these tend to be “forgotten”. You must write all the issues down into some tracking system that you all will see and nothing gets lost. There are solutions like JIRA or Redmine or Trac but these are in most cases little bit of overkill. I suggest you using very simple, free and flexible service www.trello.com . You can create board for the project and invite all members to join there. Each board has lists, I am mostly using “To Do”, Doing, Done and “Confirmed Done” lists. First I will write all issues or Cards, Done is will doublecheck if it was done like asked and finally only me will drag the cards to “Confirmed Done” list. Trello allows to add attachments to Cards and comment them, there will be trace of log for every action.

10. Keep your calm

There will be times when developers look stupid as hell and never do nor understand what you need. It is best not to ruin your relationship. Just talk and discuss the issues in constructive environment. Do all you can and to explain all the developers need without accusing everybody. It is usually better to finish the project with one team of developers and you never finish it once you have started arguing. If nothing helps and you cannot continue working with the developers then you have lowered all the risks by point 5. and you can take the decision to hire another team to finish off what was left undone.

Conclusion

As a conclusion you will get lot of opportunities with www.getacoder.com and if you follow my hints then you will succeed in getting the best service with the best price. This is best option for you if you are lacking more time than money that is usually the case with professionals. Please leave your experiences with freelancer sites into the comments and share the page if you found the information here useful.

If you found this post useful then please share :)

PhoneGap application crashing when rotating

I have seen some apps that crash when rotating from landscape to portrait or vice versa. Beginners might not have such problem as coping original PhoneGap examples with all bloating overhead works. On hte other hand some applications that I created as new project in eclipse and wrote PhoneGap app from scratch had the rotation crash issue.

It was tracked down to one line in AndroidManifest.xml. Make sure that you have

android:configChanges="orientation|keyboardHidden"

in your main activity where you call

super.loadUrl("file:///android_asset/www/index.html");

and PhoneGap jQuery Mobile application will not crash anymore when phone is rotating.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.marguspala.perftest.phonegap"
    android:versionCode="5"
    android:versionName="1.1"
    android:windowSoftInputMode="adjustPan" >

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:debuggable="true"
        android:label="@string/app_name" >
        <activity
            android:configChanges="orientation|keyboardHidden"
            android:label="@string/app_name"
            android:name="PerfTestPhonegapActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:configChanges="orientation|keyboardHidden"
            android:label="@string/app_name"
            android:name="com.phonegap.DroidGap" >
            <intent-filter >
            </intent-filter>
        </activity>
    </application>

</manifest>

 

Quick drag-n-drop mockups in jQuery mobile

While writing HTML in editor manually gives you most flexibility and works kinda well if you are seasoned professional then sometimes it is good to have a tool that can create you quick and dirty mockup of the jquery mobile app.

So far I have found http://www.mobjectify.com which is easiest tool for this. It enables you to create and download jquery mobile app without registration.

Review:

Plus sides:

  • No registration required
  • Intuitive to use, get started in 2-3 minutes
  • Shows result instantly with one click
  • Enables to change themes and CSS

Negative sides:

  • Objects cannot be rearranged
  • Does not have all HTML elements
  • Lacks place to put javascript logic

jQuery $.ajax statusCode and statusText

It is bit tricky to get jQuery $.ajax call exact status. Turns out that error function first parameter has function statusCode() which returns object that contains status parameters. See code below and you will understand how to get hold of the statuscode and statustext values.

    $.ajax({
        type : 'POST',
        url : loginUrl,
        data : {
            username : $('input[name=username]').val(),
            password : $('input[name=password]').val()
        },
        success : onSuccess,
        error : function (xhr, text, err) {            
            alert(xhr.statusCode().status+" "+xhr.statusCode().statusText);
        }
    });

Strange compile error in AndroidManifest.xml

With a few android projects in Eclipse I get compile error in AndroidManifest.xml every time I restart Eclipse. Errors are something like:

Description    Resource    Path    Location    Type
error: Error: No resource found that matches the given name (at 'label' with value '@string/share_name').    AndroidManifest.xml    /MobiwsaleAdmin    line 37    Android AAPT Problem

This project is done with PhoneGap and it includes also Barcode Scanner activities in AndroidManifest.xml. This error does not looks valid at all and compile error is resolved as a workaround by adding space somewhere, saving/recompiling and removing space saving/recompiling again. Result was exactly same as before but no compile error in this case.

Permanent solution was to remove such commented line from AndroidManifest.xml. It looks like commenting out is not perfect in AndroidManifest.xml file.

        <!-- android:label="@string/share_name" -->

 

Apache2 and tomcat6 in ProxyPass configuration failing to talk

Suddenly after reboot of server is started to see below errors in logs and website was down.

Service Temporarily Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.

Apache logs:

[Wed Feb 01 13:29:45 2012] [error] proxy: AJP: disabled connection for (127.0.0.1)
[Wed Feb 01 13:30:46 2012] [error] (111)Connection refused: proxy: AJP: attempt to connect to 127.0.0.1:8009 (127.0.0.1) failed
[Wed Feb 01 13:30:46 2012] [error] ap_proxy_connect_backend disabling worker for (127.0.0.1)
[Wed Feb 01 13:30:46 2012] [error] proxy: AJP: failed to make connection to backend: 127.0.0.1
[Wed Feb 01 13:30:55 2012] [error] proxy: AJP: disabled connection for (127.0.0.1)

Cause of this was failure to create file requested by application logic. For some reason I restarted tomcat which did not help but after restart of apache it started to work like it was working for some time before. See also setting up apache and tomcat proxy.

Jquery mobile mobileinit event not firing

Because Jquery mobile mobileinit event is triggered when mobile jquery starts to load then event listener must be binded before execution reach to loading jquery mobile javascript file.

Usually mobileinit event is binded using selector $ from jquery like this:

$(document).bind("mobileinit",onMobileInit);

This dictates JS files loading sequence in PhoneGap and websites to be something like:

<script src="jquery.js"></script>
<script src="custom-scripting.js"></script>
<script src="jquery-mobile.js"></script>

Here binding to mobileinit is done inside custom-scripting.js

Eclipse HTML formatter tips

Eclipse has decent HTML editor included with WTP.

When editing HTML files, for example PhoneGap project, then hitting CTRL+SHIFT+F formats code nice an neat. Unfortunately sometimes formatting rules are lot exactly what we want. HTML form contains several label and input elements and all of these are considered as one long line.

Open Window>Preferences>Web>HMTL Files>Editor and you will find list of HTML keywords in textbox called “Inline Elements:”. Remove input and label from this list and all of these statements will be each on separate lines.

You can modify more formatter settings there. Line wrapping width is reasonable to be increased with nowadays widescreen monitors.

Add Facebook login to PhoneGap/Cordova Android app Easiest way – UPDATED

First ensure that you have Basic PhoneGap application running on your android. Check this tutorial if needed. Official tutorial is not so good but might help you out if Phonegap Facebook tutorial here fails. For additional information go to https://github.com/davejohnson/phonegap-plugin-facebook-connect/blob/master/README.md.

  1. Download PhoneGap Facebook plugin from https://github.com/davejohnson/phonegap-plugin-facebook-connect/tree/master/www
  2. Move cdv-plugin-fb-connect.js into your android phonegap webroot assets/www
  3. Include it in index.html <script type=”text/javascript” charset=”utf-8″ src=”cdv-plugin-fb-connect.js”></script>
  4. Add <plugin name=”org.apache.cordova.facebook.Connect” value=”org.apache.cordova.facebook.ConnectPlugin” /> into res/xml/plugins.xml
  5. Download facebook_js_sdk.js from https://github.com/davejohnson/phonegap-plugin-facebook-connect/tree/master/lib
  6. Create package org.apache.cordova.facebook and class ConnectPlugin.java. Copy contents of this file into it  https://github.com/davejohnson/phonegap-plugin-facebook-connect/blob/master/native/android/src/org/apache/cordova/facebook/ConnectPlugin.java
  7. Add package com.facebook.android and .java files from https://github.com/facebook/facebook-android-sdk/tree/master/facebook/src to your java source. This enables ConnectPlugin.java to compile.
  8. Add import to com.package.your.R; or whatever is your android package so that your R.java will be imported to FbDialog.java.
  9. Merge facebook icons from https://github.com/facebook/facebook-android-sdk/tree/master/facebook/res to your project res folder. This enables Facebook SDK sources to compile. Espacially is needed this image https://github.com/facebook/facebook-android-sdk/blob/master/facebook/res/drawable/close.png
  10. Verify the facebook using javascript methods in here. https://github.com/davejohnson/phonegap-plugin-facebook-connect/blob/master/example/www/index.html
  11. Dont forget to register you facebook android app, add your APP id to the init method and register your app signing key in facebook. About creating signing key hash look into https://developers.facebook.com/docs/mobile/android/build/#sig

Download the Full Eclipse project sources here:  FacebookTest

In case of any issues don’t hesitate to post into comment and I will respond promptly if I can help.

Basic PhoneGap Android app from scratch step-by-step

This tutorial assumes that you have eclipse which is set up for regular android development and you can create new android projects. Phonegap files are now named cordova

  1. Create new Android project in eclipse.
  2. Download package and extract cordova-1.6.0.jar  from http://phonegap.com/download/
  3. Add cordova-1.6.0.jar to your projects build path. In eclipse open project properties > Java Build Path > Add Jars
  4. Change main Activity superclass to DroidGap
  5. Replace setContentView(R.layout.main); with super.loadUrl(“file:///android_asset/www/index.html”);
  6. Create folder xml into the project res folder. Add there plugins.xml and cordova.xml from the package you download before.
  7. Add into AndroidManifest.xml <uses-permission android:name=”android.permission.INTERNET” />
  8. Create folder www into projects assets folder.
  9. Add index.html file into assets/www. File content is regular HMTL.

By now you can already run the program. Next steps are starting to use PhoneGap special HTML5 features and try accessing hardware. If It fails to run then make sure you have logcat view activated in eclipse or try in linux commandline: Read the rest of this entry »