The second argument is htmlAttributes which you can use to add additional attributes to the HTML that is generated by the helper (@Html.TextBoxFor is a HTML helper).
The generated code for your example will be along the lines of:
@Html.TextBoxFor(m => m.FirstName, new { @placeholder = "First name"})
<input type="text" name="FirstName" placeholder="First name" />
If you want, you can add more attributes and they will also be added to the generated tag:
@Html.TextBoxFor(m => m.FirstName, new { placeholder = "First name", @class="my_text_box_class" })
<input type="text" name="FirstName" placeholder="First name" class="my_text_box_class" />
It's also possible to override the value of the textbox using Value (upper case V!):
@Html.TextBoxFor(m => m.FirstName, new { placeholder = "First name", Value="John Johnson"})
<input type="text" name="FirstName" placeholder="First name" value="John Johnson" />
The reason for the @ symbol is for when you want an attribute named exactly as a C# reserved word. class, private, namespace etc. It is a way to make the C# complier stop interpreting it as it's C# meaning. The @ symbol is only required for these reserved words.
placeholderHTML attribute to the input. The @ sign is needed if you use a reserved word (keyword). Otherwise you would get a compilation error. Although, "placeholder" is no keyword, so it is not needed in this case.