Ends and coends should be thought of as very canonical constructions: as Finn said, they can be described as weighted limits and colimits, where the weights are hom-functors.

Recall that if $J$ is a (small) category, a *weight* on $J$ is a functor $W: J \to Set$. The limit of a functor $F: J \to C$ with respect to a weight $W$ is an object $lim_J F$ of $C$ that represents the functor

$$C^{op} \to Set: c \mapsto Nat(W, \hom_C(c, F-)).$$

Dually, given a weight $W: J^{op} \to Set$, the weighted colimit of $F: J \to C$ with respect to $W$ is an object $colim_J F$ that represents the functor

$$C \to Set: c \mapsto Nat(W, \hom_C(F-, c)).$$

Then, as Finn notes above, the end of a functor $F: J^{op} \times J \to C$ is the weighted limit of $F$ with respect to the weight $\hom_J: J^{op} \times J \to Set$, and the coend is the weighted colimit of $F$ with respect to $\hom_{J^{op}}: J \times J^{op} \to Set$.

The ordinary limit of $F$ is the weighted limit of $F$ with respect to the terminal functor $t: J \to Set$. Ordinary limits suffice for ordinary ($Set$-based) categories, but they are inadequate for enriched category theory. The concept of weight was introduced to give an adequate theory of enriched limits and colimits (replacing $Set$ by suitable $V$, and functors as above by enriched functors, etc.)

Weighted colimits and weighted limits (in particular coends and ends) can be expressed in terms of Kan extensions. For any weight $W$ in $Set^{J^{op}}$, the weighted colimit of $F: J \to C$ (if it exists) is the value of the left Kan extension of $F: J \to C$ along the Yoneda embedding $y: J \to Set^{J^{op}}$ when evaluated at $W$, in other words

$$(Lan_y F)(W)$$

A similar statement can be made for weighted limits, as values of a right Kan extension.