Dialyzer is a great
static analysis tool for Erlang and has
helped me catch many bugs related to what types I thought I was passing
to a function versus what actually gets passed. Some of the errors
Dialyzer emits are rather cryptic at first (as seems commonplace in the
Erlang language/environment in general) but after you understand the
causes of the errors, the fix is easily recognized. My most common error
is Dialyzer inferring a different return type that what I put in my
-spec, followed by Dialyzer telling me the same function has no local
return. An example:

foo.erl:125: The specification for foo:init/1 states that the function might also return {'ok',tuple()} but the inferred return is none()
foo.erl:126: Function init/1 has no local return

Spot the error? In the record definition, var\_1 is initialized to an
empty tuple and var\_2 is initialized to an empty list, yet the spec
typing for the record does not take that into account. The corrected
version:

Just returned from IT Expo West last night. Three days of learning,
hob-nobbing, and talking myself hoarse about the awesomeness that is
2600hz. We got a decent
writeup
posted on TMC's site, met quite a few people, collected beaucoup
business cards, and generally had a fun time hanging with the team.
Super tired but ready to keep building the best hosted PBX software
platform! Bonus: See Darren's awesome (yet mildly awkward)
video
interview! Also, VoIP service providers looking to offset calling
costs for their business clients can look at
PromoCalling as a way to compete with
Google and Skype's free calling plans.