Welcome to our continuing series of Code Project interviews in which we talk
to developers about their backgrounds, projects, interests and pet peeves. In
this installment we train our sights on Dan Mohl. Dan is a “Red Headed Code Monkey” and Microsoft F# MVP. Read on to learn more about his many coding exploits.
Who are you?
My name is Daniel Mohl and I live with my wife and daughter in Franklin, TN, which is just outside of Nashville. I've been slinging code since I was 8 and have been doing it professionally since 1998.
By day, I'm an architect working on a wide variety of platforms and solutions. During my free time, I'm active in the development community. I blog on a regular basis, am active on Twitter, contribute to a few open source projects, speak at various user groups and conferences, and recently wrote an article for MSDN Magazine entitled Authoring an F#/C# VSIX Project Template.
What do you do?
To date, I've contributed 14 project and item templates to Visual Studio Gallery and nearly a dozen NuGet packages to NuGet Gallery. My primary purpose for creating these templates and packages is to reduce the initialization time needed to create solutions that utilize the power of F#. These templates also serve as a nice learning tool.
Additionally, I'm proud to have contributed in varying levels to open source projects such as FsUnit and FSharpx. Open source projects such as these are continually reshaping the way that I and many others create software solutions and they often assist in driving the future of software development as a whole.
What is your development environment?
Like many die hard techies, I use several machines (both virtual and physical) and development environments. My preferred hardware is a MacBook Pro. The one that I'm currently using has a 2.66 GHz Intel Core i7 with 8 GB of RAM. I'm running VMware Fusion 4.0.1 with several VMs that run various Windows OS versions (Windows XP, Windows 7, Windows Server 2008 R2, Windows 8 Developer Preview) and versions of Visual Studio including VS2010 Professional, VS2010 Ultimate, VS2010 Shell, and VS2011 Developer Preview. On Mac OS, I occasionally use MonoDevelop, MacVim, and WebStorm.
I've worked with quite a few languages, but my current favorites are F#, C#, JavaScript, CoffeeScript, and Erlang. Frameworks and libraries are also something that I thoroughly enjoy exploring. A few that I've worked a decent amount with include ASP.NET MVC, jQuery, WPF, Silverlight, WCF, WP7, and WIF.
Ever since the Visual Studio 11 Developer Preview became available, I've been spending most of my free time exploring the new features of F# 3.0. The F# Type Provider mechanism is extremely interesting and it is going to change the way that data is accessed and manipulated. As Don Syme put it in his announcement of the F# 3.0 Preview, "this lays the foundation for simplifying programming in our information-rich world." I also spend a lot of time working with JavaScript and associated tools/languages/frameworks. The recent advances in this area have truly been astounding. CoffeeScript and Node.js are two examples of items in this category that I am excited about.
What is your coding pet peeve?
My biggest pet peeve is inconsistency. No matter how many hands are working to achieve a goal, the end solution should look as though a single mind created it. While I certainly have favorite conventions and standards, it's worth sacrificing these preferences when necessary in order to achieve the goal of consistency.
As for my favorites, it really depends on the language and/or framework. I'm a big fan of convention over configuration and I often go with the default conventions that are defined by the frameworks that assist in this approach. I find that this makes it easier for other developers to quickly jump into a project. I'm not against the idea of creating custom conventions; however, there needs to be a compelling reason to do so.
Additionally, each language tends to have slightly different best practices, standards, and conventions. I like to seek out leaders in the community associated with the specific language, read their code, and apply what they prescribe. Often, by reading their code, my mind is opened not only to the best practices, standards, and conventions for that language, but also to new ideas that drive improvement of best practices and/or standards in the other languages with which I work.
How did you get started programming?
In 1985, my parents brought home our first household computer: an IBM PC. Among other things, it came with a handful of green screen games and several large instruction manuals. I was immediately enthralled with the device and set to work learning BASIC from the large manuals in order to manipulate the source to modify the high scores of these games. In elementary school, I had a teacher who had done a bit of programming. He graciously offered to help me write a few simple games on the Commodore 64. I continued to play with computers through high school and I decided to pursue programming as a career. In my first few years of college, I took classes on several different languages including Pascal, COBOL, BAL, and Visual Basic. In 1998, I took my first full-time programming job writing automobile insurance software in QBasic. From there it was Delphi, C#, and all the rest.
I am active on many online resources such as Twitter, G+, LinkedIn, and GitHub. The developer community has repeatedly improved my development practices and challenged my ideas. On a daily basis I discover something new via some link on Twitter or through exploration of code on GitHub. I also have found sites like fssnip.net, tryfsharp.org, and CoffeeScript's home to be very useful.
What advice would you offer to an up-and-coming programmer?
Seek to improve continually. Never become complacent. This is one of the reasons that I think it is so important to always be learning new frameworks, languages, patterns, approaches, etc. Even if something doesn't seem applicable to your current situation, the knowledge gained by learning something new can often benefit in unexpected ways.
There are countless ways to seek improvement. A few of my favorites include user groups, technical conferences, technical magazines, blogs, Twitter, books, podcasts, code katas, koans, and GitHub. I also find that explaining concepts to others can help you improve or understand something more deeply. Because of this, I often encourage up-and-coming programmers to pick a focus area and start a blog about it.