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 track down another prominent Code Project member Marc Clifton.
Marc is the creator of two open source projets, MyXaml and Interacx. He has been a Code Project member since 2002, is a perennial community MVP and has written over 130 articles.
Who are you?
My name is Marc Clifton, and I work out of my home in Philmont, New York. I prefer to work as a contractor, focusing primarily on n-tier WinForms application development.
What do you do?
I tend to work on projects that help automate business processes and improve information flow. This has led me to develop software that improves the profitability and accounting in adult entertainment clubs (Video Simplex), boat yard management, and the design of communication satellites (Space Systems/Loral) such as those used by DirecTV and Sirius. I have solved complex technical issues regarding failure and end-of-life analysis of switch rings, which are used on satellites to switch in spare transmitters to extend the lifetime of a satellite.
One of the more amusing projects I have worked on was to tie in to NOAA to determine how much ice should be packed with a shipment of chocolate based on 3-day temperature predictions.
I’ve also worked on voter registration software (Votec), done “edutainment” game development, and helped develop the security system for the MX Missile Train (fortunately cancelled by Congress years ago!) The security product that I co-developed was featured on CNN’s Headline News for the Atlanta Olympic games a few years ago.
Throughout my career, I have enjoyed immensely working with hardware engineers, especially on low light intensified camera systems and multi-spectral cameras (Xybion Corp. and Robot Research, now Sensormatic). One of the highlights of my career after the Challenger shuttle disaster was developing real-time spectral analysis software to detect hydrogen fires on the launch pad.
I have also developed my own n-tier application development environment, Interacx, which I have used extensively with my clients, and I developed the MyXaml open source project, which allows developers to instantiate object graphs declaratively.
What is your development environment?
When required (business rules and domain-specific development), I use C# – with some dabbling into Python and F# – using Visual Studio.
For n-tier development work, I prefer to use my own product, Interacx, as it provides unified form, schema, and report designers (using DevExpress XtraReports) with automated SQL generation, plugins for change tracking, security, etc. Interacx is developed in C#, so I venture into that various APIs for domain-agnostic development. I shy away from the idea of having declarative concepts implemented imperatively, hence Interacx is my preferred environment for developing n-tier applications.
For that reason, I also avoid with a passion anything ORM related – the idea of taking a database table or view and re-implementing it as a set of classes is my personal soapbox. Yes, there is a place for ORM when doing processing of the data, but the majority of my work involves the correct presentation and mining of data, which in no way involves an ORM.
Hardware-wise, I have an HP desktop with 8GB RAM, 64-bit Windows Vista (Home Edition, would you believe?) and a 1TB hard drive. The processor is an AMD Phenom II X6 running at 2.70 Ghz. I also do a lot of development on a Gateway I5 laptop. I prefer the convenience of a being able to work where I want. I use a Sprint MiFi card for Internet access when there’s no wifi hotspots available. I also have a dedicated server (Peer1) that is terribly under-utilized – my websites are in total disarray – but it is a central repository for all my source code, using Subversion.
I’m not sure I have a favorite language. I miss C++ with multiple inheritance (when you want it, you really want it) and STL (C#’s generics just don’t cut it). I rather dislike interfaces, but I love the reflection capabilities in C#. My favorite framework is my own (it better be, right?) and I also like DevExpress, but wish that it was simpler – I guess having incredibly powerful and also simple are opposing forces – so I wrap the DevExpress UI classes that I use and automate the behavior that I want, once I figure out how to get DevExpress to do what I want. That way, I never have to figure it out again!
I have an ongoing struggle with learning functional programming with F#. The way one thinks about programming problems functionally is so different to my old imperative brain. What I really want is someone to teach it to me, but I think that would require more of a therapist than a programmer!
I really have no interest in WPF – mainly because my clients don’t either.
I do have a passion for all things declarative and have been looking at some interesting ideas related to relationship-oriented programming that hopefully will evolve into some articles.
What is your coding pet peeve?
Aesthetics. Code should not just be beautiful, it should look and be formatted beautifully. It drives me nuts when developers don’t line up their statements and are inconsistent about the use of white space. Code for me is a piece of art, and I think there is a correlation between how much care a developer puts into how their code looks, its architecture, and its quality from the user’s perspective.
There are three things I loathe:
- underscores for member fields
- regions (I want to see the whole thing)
- “this.” notation, a hangover from the days when IntelliSense didn’t kick in right away but required an object reference.
Other than that, I don’t have a naming convention preference as long as it is applied consistently and classes are neatly organized with regards to delegates, enums, fields, properties, constructors and methods.
How did you get started programming?
In 6th grade, my very first keystroke, on a PDP–11 teletype, was (following the instructions) to press Ctrl+C, which duly crashed the computer. Turns out the power supply for the mag tape drive was tied in with the CPU, so if the tape drive drew too much current, it crashed the CPU. I exited the school’s computer room with all due haste and didn’t touch the thing for a year.
I learned BASIC on that machine, programmed my first Federation vs. Romulan game (a 10x10 grid printed out every round) and saved my programs on punch tape. I had a dickens of a time understanding how a computer “knew” that when I wrote A=5, that later A would still equal 5. The next year I was teaching BASIC.
After high school, I dived into assembly language (still my first real love, I think programming should be done only in assembly language!) and wrote my second Star Trek game for the Commodore PET and a Fairchild joystick, which became a small commercial success and launched me on this adventure.
I remember when I first was working with C# and was trying to figure out how to force the debugger to break at a certain place without using a breakpoint. Coming from the C/C++ environment where I would simply emit an “int 3” assembly language instruction, I had the idea that maybe something like that would need to be done in C#. Searching online, I didn’t find anything, so I figured out how to emit the instruction in C# and promptly spit out an article on the topic, thinking, “Ooh, I’ve done something cool.” One of the first responses I got to the article was “I guess you don’t know about System.Diagnostics.Debugger.Break();”
Oh, my ego!
But this illustrates how the developer community, especially online, has influenced my coding – the .NET Framework is full of stuff I just don’t know about. So I like it when even a simple article or blog utilizes something I didn’t know about in .NET or with the C# language (may not even be the topic of the article). I look at some of the LINQ or lambda expressions people use and I wonder, how the heck did you figure that out? So it’s that last 10%, the somewhat obscure, rarely used, but really useful at times, coding features that I like to read about and that influence my own code.
There’s a lot to like about the developer community today. The folks that frequent The Code Project and StackOverflow answer questions promptly and I’ve gotten good answers. There’s also a wealth of knowledge to mine when I’m looking for an answer. It surprises me how many answers I find on blogs, but that may simply be because of Google’s search bias.
What I dislike is the spin-doctoring from, quite frankly, certain Microsoft bloggers that seem then to get picked up by the rest of the dev community. I don’t like the hype around new technologies, the “faster and with fewer bugs” mantra. The only way I’ve ever succeeded at having fewer bugs is by doing things slower! I don’t understand how someone in marketing can think that developers are actually stupid enough to believe that hype, but then again, those product blurbs probably aren’t written with developers as the target audience in mind.
I’m also not a fan of instructional videos. I’d much rather have a well written document that I can easily bookmark, cross reference, write some notes in the margins, and so forth. But then again, writing documentation takes longer than slapping together a low-res video. That’s too bad, because we are doing a disservice to each other, in my opinion.
Basically, the only online resources I use are Google, Code Project, and StackOverflow. Google often points me to MSDN and various people’s blogs, and that’s it. The only forum I actually spend time hanging out in is Code Project’s Lounge. The rest of my online time is spent on non-developer sites (don’t get any ideas!) dealing with science and philosophy.
What advice would you offer to an up-and-coming programmer?
My first employer, Paul Zuzelo, took the time and had the patience to hammer that into me when I was 18: Learn how to clearly communicate (in a human language, not a computer language) 1) the problem you are trying to solve and 2) the way you are going to solve the problem.