Tagged as

A Coder Interview With Marc Clifton

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 Code Project member Marc Clifton.

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 150 articles. He is also the creator of the Needs & Gifts community website and a information-relating application called Intertexti.

Who are you?

My name is Marc Clifton, I live and work out of my home in
Philmont, New York, I have a son who is
pursuing a math-teaching degree at SUNY New Paltz whom I very proud of.
I've been quite blessed to be able to work from home for nearly 20 years now,
except for a small 5 month stint in New York City with Citi Group that I'd
rather erase from my memory banks. My commute is 20 feet and there are no
traffic lights between my house and most everything else that I go to, whether
it's the Farm Store or
hanging out in
Great
Barrington, MA, which has one of the best sushi restaurants in New England
in my opinion. When I'm not working, I enjoy playing Texas Hold'em poker
and doing research in
Anthroposophy, some of which you can read on
my blog, and I like to be involved with the local community, life coaching,
and enjoying the diverse talents and personalities that come through this
community, often staying at my house.

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 -- ok, that project took all of about 8 hours, but
it still one of the more fascinating mergers of one company's needs with
disparate technologies such as shipping, web services, and Excel.

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
video surveillance security product that I co-developed was featured on CNN’s Headline News for the Atlanta Olympic games a few years ago.
Talk about pushing the envelope of the technology at that time - 14.4Kbps
modems, custom compression algorithms, supporting 5 different VGA chipsets -
those were the days!

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.
One time we were doing 1/4 scale tests of emergency engine shutdown procedures,
checking for hydrogen fires, and were amazed to see how the resulting hydrogen
fire, visible on the camera, completely snaked around the physical sensors,
which reported nothing!

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.

Since writing this two years ago, I've taken on some work indirectly for a
company called Health Connect One,
which has taken me down the path of learning Ruby on Rails. I am fortunate
to have an amazing mentor, Eric
Harris-Braun, whom I met at the Quaker
Intentional Community up the road in East Chatham. Diving into Ruby
was no easy task - I walked into a mature web application and an underlying
framework for describing data entry forms which Eric wrote, as well as a
comprehensive suite of tests, deployment processes, and so forth. My first
job was to upgrade a web application from Rails 2 to Rails 3, which involved
touching many different pieces of the code base, especially the test scenarios
(Ruby on Rails has amazing facilities for doing both unit and application level
testing) as well as working in Ubuntu, a new experience in me doing anything
productive. Fortunately, the Rails3 version of the website can also be
fully developed and tested under Windows, which I must admit is not only a more
comfortable environment for me, but frankly, I believe a better one than Ubuntu.
In the process, I've learned a lot about the pros and cons of duck-typed
languages like Ruby (check out
C#
and Ruby Classes) and have developed a couple websites in Ruby on Rails, for
example, Needs & Gifts.

I've also been exploring
ASP.NET with MVC 4 and am amused to see how many of the ideas appear to be
"borrowed" from the Rails community, down to database migrations, the whole MVC
model, routing, etc. Anyone comfortable with ASP.NET should be able to
easily grasp the concepts in Rails, and vice-versa.

What is your development environment?

At this point I primarily use use C#
and Visual Studio for WinForm
development and one of my passions,
n-tier application
development. For my Ruby on Rails work, I still prefer to use Windows and
the excellent RubyMine IDE.
As for databases, I'm equally comfortable in SQL Server, Oracle, and PostgreSQL,
and have discovered to my amusement just how powerful a serialized
DataSet can be for a lightweight client-side database!

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--it happens at the SQL level and is usually expressed in views. Furthermore, there isn't any need for an additional layer because the data can be bound directly to controls. All of this works of course because seven years ago I wrote some code that tracks DataTable transactions, which is the backbone for my SQL generator (never did put together an article for that.) I think it says a lot when code that is seven years old is still in use in applications I develop today.
The work with Ruby on Rails of course uses the ORM that is one of the backbones
of the Rails framework - it's powerful and simple to use, and since the ORM here lives on the web server, it makes more sense to use an ORM at the 2-tier level--for client-side code, a 2-tier approach is pretty much not even a consideration anymore, it's 3-tier or n-tier for me.

Hardware-wise, I have upgraded from what I was using 2 years ago: an
HP desktop with 8GB RAM, 64-bit Windows Vista (Home Edition, would you believe?) and a 1TB hard drive.
Recently, I built my own system using an 8-core AMD FX-8320 processor (3.8Ghz),
16GB of RAM, and two 120GB SSD's - enough space for everything I need, but
starting to get a bit cramped. When working with Ubuntu, I use
Virtual Box to run Ubuntu in a VM,
dedicating 4 processors and 4GB of RAM to Ubuntu.

I still do a lot of development on a Gateway I5 laptop
(the same one I was using 2 years ago), but I recently ordered another 4GB of
RAM to bring it up to 8GB - I should check the mail, the memory is due to arrive
any day now! Given the prevalence of WiFi hotspots, I ditched the Sprint MiFi
card. 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.
My laptop is effectively a clone of my desktop, including a more
resource-limited (1GB, 2 processor) Ubuntu VM.

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)
- interfaces are just no replacement for multiple inheritence! I love the reflection capabilities in C#
and, since I wrote this last, have really come to enjoy lambda expressions and
LINQ. I was quite enamored with Ruby when I first encountered it, even
though it's performance is of course quite poor compared to a compiled language.
I've since come to a deeper understanding of how much more discipline is
required to write good code in a duck-typed language - basically, pretend your working in a strongly typed language and absolutely avoid monkey patching -- your code and any framework code that you use should be sufficiently well architected so that monkey patching is not necessary. So, if you
are disciplined enough and the performance is adequate, Ruby on Rails is quite a good
language and framework in which to build sophisticated websites.

My favorite framework for WinForm development is my own (it better be, right?) and as far as third party components go, I very much 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!

What new tools, languages or frameworks interest you?

At this point, my interests in languages and frameworks have definitely
waned. I used to be enamored with XML (I know, it's not a language, but
bear with me) and its application in declarative programming. Then I
became interested in F# and all things related to functional programming, and of
course lastly in Ruby. At the end of the day, I look at the programming
community and I still think, none of these things are significant advancements
in developing code and working with end-user needs. The whole web
application landscape to me seems like a
Rube Goldberg machine built on
the original 18 HTML tags more than 20 years ago, and quite frankly, I feel
disappointed - it seems like competing vendors and standards have left us, the
architect / developer, to work in environments whose pipes are leaking like an
old boiler room.

That said, I am definitely interested in continuing my pursuits in
Computational Types and
Relationship Oriented Programming, which I discovered from an Insider News
article recently is the same thing as a
Graph Database, such
as Neo4j. That's where my interests
currently like, and I'm struggling with deciding whether to continue doing
WinForm development or to embrace the dark side and work more in the web
application space.

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.

I'd also like to add, now two years later, that especially with languages
like Ruby, I am very peeved by a lack of discipline when it comes to the liberal
use of symbol and string hash keys and the overall avoidance of object-oriented
practices that I see in some of the community code out there. Duck-typing
can lead to all sorts of undisciplined and spaghetti code - having had the years
of experience working with strongly-typed languages, seeing the lack of
recognized architecture and coding practices in the Ruby community drives me
nuts.

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.

How has the developer community influenced your coding?

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.
Now I'd like to add "be a disciplined programmer - learn the languages and tools
that you are using, look at how they can be abused, and avoid doing so!"

What about your work for certain companies? Enquiring minds need to know.

Basically started my career programming games on a Commodore PET and C64.

1986, worked for a company that produced low light and multispectral cameras, worked on fun projects including laser range gating, detecting hydrogen fires, and ocean plankton research. Did a lot of Fortran, Pascal, and C work, plus tons of embedded processor stuff.

By 1990, I was working for a video surveillance company, we put together one of the first B&W "over the phone" video surveillance systems, developed our own compression algorithms and figured out how to get the most out of 14400 baud modems. The system was used in the Atlanta Olympics and was featured on a 30 second spot on CNN. Learned C++ on that job.

By 1994, back to games - edutainment, showed the company how to use source control correctly and proved to them that you could actually write C++ in 32 bit Watcom C. I can't stand it when people say "you can't do that."

1995, worked for a company that did voter registration. This was my first introduction to relational databases (Oracle) and I loved it. Put together a document imaging system for processing ballots. This was also my first introduction to Windows 3.1, which I had been trying to avoid for several years because it seemed so primitive compared to the snazzy things I could do in DOS.

1998 found me working in C++ for a company that worked in the adult entertainment industry (gentlemen clubs) and I put together a cash tracking system. Lots of fun, working with the owner of the company who is a hardware guru - I've always loved working with hardware engineers. Originally written in Access, I migrated it to SQL Server at some point.

In 2004, I ended up architecting client-server solutions for a couple record management companies out in Ohio. I ended up getting these contracts because of my articles, especially regarding MyXaml. Both companies wanted a more flexible, dynamic runtime configurable environment to handle customization. Worked a lot with the DBA, lots of SQL Server stuff, etc.

2009 I did a 5 month stint for CitiGroup, which I hope to never repeat. Great people, it's just that the financial sector is so absolutely corrupt, I felt like I was selling my soul to the devil.

And over the years, I've worked for a communication satellite manufacturer out in California, doing all sorts of fun stuff (automated design, cable/harness, diagnostics, end-of-life analysis, etc) and solving problems that people have said "can't be solved."

Well, hardware was actually my first love, but when I was a kid, a 7476 flip flop was a couple bucks - quite expensive for a 13 year old. Unfortunately, my parents never noticed my interest so of course didn't do anything to support it, so when I discovered software and got access to the school's PDP/11, that took the place of hardware. But at one point, I could tell you a great deal about NTSC video, having written a lot of camera controllers and image processing code.

There are three things I loathe:
underscores for member fields
regions (I want to see the whole thing)
“this.” notation

+1 for regions and this. notation. I went region crazy at first and regret it. The only time I now use them is for copyright headers, grouping of large enumerations and sometimes when implementing interfaces. It's probably a code smell if you need them because of class size.

-1 for underscores. I tried losing the leading underscore for private member fields, but reverted back. Granted, it does look more aesthetically pleasing, but the loss of readability is too high a price.

Pro 1:
Being able to easily and quickly know when a variables scope is accessible to the whole class or just a method. Using m prefix works, but is uglier than leading underscore.

Pro 2:
Using the same parameter name as a private field without having to prefix with this.

I tried losing the leading underscore for private member fields, but reverted back. Granted, it does look more aesthetically pleasing, but the loss of readability is too high a price.

Well, it just seemed redundant to me, as all my member fields are always protected or private and begin with a lower case letter. Nothing else does, except for parameters to methods, of which conflicts, if the occur, only occur in constructors.

si618 wrote:

Using the same parameter name as a private field without having to prefix with this.

Thanks for mentioning it though. VS's native conditional breaks are opaque enough at a glance that what I've been using when I want one is generally this with a normal breakpoint on the 3rd line:

int foo;
if (condition)
foo = 1;

I'm not sure if being less ugly is worth being that much more verbose for something that's not supposed to ever get checked in to source control. OTOH not supposed to and never happened aren't equivalent sets.

Did you ever see history portrayed as an old man with a wise brow and pulseless heart, waging all things in the balance of reason?
Is not rather the genius of history like an eternal, imploring maiden, full of fire, with a burning heart and flaming soul, humanly warm and humanly beautiful?
--Zachris Topelius

Training a telescope on one’s own belly button will only reveal lint. You like that? You go right on staring at it. I prefer looking at galaxies.
-- Sarah Hoyt