It's really quite easy.
1) Put your project, study subject or application in the \
$UserBaseDirectory/Applications folder. Just make a folder there with a name such as MyApplication (but in practice something more specific). You could add subsidiary folders such as DevelopmentNotebooks, DistributionNotebooks, *et cetera*. I find it very difficult to convince people to put their projects there! They have all kinds of spurious reasons to go somewhere else. "WRI puts some of their packages there and I don't want to mix my feeble efforts up with their packages." They say that because some of the WRI packages are mixed in on the Installed Add-Ons documentation page. But WRI packages are not in that location. The \$UserBaseDirectory/Applications is your place and you can put anything you want there. You initially don't even have to have any packages in your application. The point is that when you get to adding packages, style sheets, palettes and documentation this is the place where Mathematica will look for ALL of these items. If you zip up your application, send it to a friend and they unzip it into their \$UserBaseDirectory/Applications folder everything will automatically work. They will be able to access your application from anywhere. They won't have to use SetDirectory, or put their notebook in the same folder as the packages. Your style sheets and palettes will show up on their menus. If you add auxiliary files, say data files, to your projects, your routines will know exactly where to look for them. Please, put your project there. Try it out and see how smoothly it works.
2) A fully developed application would have a file structure that looked like this:
MyApplication (which is the application name)
Documentation
FrontEnd
Palettes
MyApplication
palettes associated with MyApplication...
StyleSheets
MyApplication
stylesheets associated with MyApplication...
Kernel
init.m - initialization for MyApplication
package1.m
package2.m,...
DevelopmentNotebooks
DistributionNotebooks
Initially you might have nothing but DevelopmentNotebooks.
3) This is how I usually develop package routines. (Others may find a different path more convenient.) Routines usually arise when I'm working on some material within a study or development notebook. I test it out with the current material. I usually add usage messages, SyntaxInformation and any other items that go with the routine. Then I move the routine to a Routines section at the top of the notebook. I call this "package purgatory" and keep it there until I've used it on more examples. The first draft is quite often not sufficient. When I'm reasonably satisfied I'll move it to the package itself - "package heaven". If I have to do further revision I might do it in the package, or change the package Code cell to an Input cell and go back to the notebook to revise.
4) You application would be loaded with the command:
<< MyApplication`
In this case, Mathematica will evaluate the init.m file in the Kernel folder. This file should contain the statements:
Get["MyApplication`package1`"]
Get["MyApplication`package2`"]
The BeginPackage statements in the packages reflect the folder structure. The package with the name package1.m would have the BeginPackage statement:
BeginPackage["MyApplication`package1`", {...}]
5) You can create a package file by creating a package1.nb file and then changing the "nb" to "m". Package files are similar to Notebook files in that they can have Titles, Sections, Subsections,Text and other cell types. I strongly recommend using the sectional organization and separate cells for the various statements. The operational part of the package is contained in Code cells. You can inactivate routines by changing them to Input cells.
Then, when a routine is ready for package heaven, just copy the usage statement into the Public section and the rest into the Private section.
Following this format, you can slowly build up your work into a very nice application. You don't have to do everything at once. You have a structure that will accommodate the development of your application and your own increasing skills at application development.