I've learnt the following from programming workflows and deploying them with SPD.
1.don't rely on passing all the fields you need in the workflow callout: define what seems sensible, but remember that once you have access to the SPList item, you can work your way around the object model from within your workflow without having to repeatedly change the interface and redeploy.
i.e. once you have defined these three things in your .actions file and passed them to your workflow
public static DependencyProperty __ContextProperty = DependencyProperty.Register("__Context", typeof(WorkflowContext), typeof(YourWorkflowClass));
public static DependencyProperty __ListIdProperty = DependencyProperty.Register("__ListId", typeof(string), typeof(YourWorkflowClass));
public static DependencyProperty __ListItemProperty = DependencyProperty.Register("__ListItem", typeof(int), typeof(YourWorkflowClass));
you're set up to access whatever you might have forgotten to pass explicitly when deploying.
2.Watch out when using the Context directly to create your instance of the sharepoint item you want, as you may unknowingly pass on the permissions of the person calling the workflow. i.e. do this
SPWeb tmpweb = __Context.Web;
SPSite site = new SPSite(tmpweb.Url);
SPWeb web = site.OpenWeb();
instead of this:
SPWeb web = __Context.Web;
3.Debugging is difficult to set up if you don't happen to have visual studio installed on the same box as sharepoint.