This example uses the tikz-cd package because of the "asymmetrical rectangle" node style, and it loads the matrix and calc libraries for cleaner code. A special focus is on drawing the arrow for the connecting homomorphism, answering a question of Jamie Weigandt on TeX.SE.

Edit and compile if you like:
% The Snake Lemma% Author: Andrew Stacey% Source: http://tex.stackexchange.com/questions/3892/\documentclass{article}\usepackage{tikz}\usepackage[active,tightpage]{preview}\PreviewEnvironment{tikzpicture}\setlength{\PreviewBorder}{10pt}%\usepackage{amsmath}\usepackage{tikz-cd}\usetikzlibrary{matrix, calc, arrows}\DeclareMathOperator{\coker}{coker}\begin{document}\begin{tikzpicture}[>=triangle 60]\matrix[matrix of math nodes,column sep={60pt,between origins},rowsep={60pt,between origins},nodes={asymmetrical rectangle}] (s){&|[name=ka]| \ker f &|[name=kb]| \ker g &|[name=kc]| \ker h \\%&|[name=A]| A' &|[name=B]| B' &|[name=C]| C' &|[name=01]| 0 \\%|[name=02]| 0 &|[name=A']| A &|[name=B']| B &|[name=C']| C \\%&|[name=ca]| \coker f &|[name=cb]| \coker g &|[name=cc]| \coker h \\};\draw[->] (ka) edge (A)(kb) edge (B)(kc) edge (C)(A) edge (B)(B) edge node[auto] {\(p\)} (C)(C) edge (01)(A) edge node[auto] {\(f\)} (A')(B) edge node[auto] {\(g\)} (B')(C) edge node[auto] {\(h\)} (C')(02) edge (A')(A') edge node[auto] {\(i\)} (B')(B') edge (C')(A') edge (ca)(B') edge (cb)
Click to download: snake-lemma.tex • snake-lemma.pdf
Open in Overleaf: snake-lemma.tex