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 Code Project member and Outlaw Programmer John Simmons.
John has been a Code Project member for over a decade and while he’s only written 50 articles – no small feat in itself – he’s provided more than 3,900 Q&A answers to help out other troubled coders.
Who are you?
My name is John Simmons, and I’m currently taking up otherwise valuable space in San Antonio, Texas. I currently work for General Dynamics as a Senior Software Engineer, on an Air Force contract under Air Education and Training Command.
What do you do?
I’ve been working in the industry for 30 years, so the list is kind of – well – long. I started out as a defense contractor in San Diego writing test code and documentation for advanced Naval Tactical Data Systems (on a AN/UYK–7 shipboard mainframe computer, and then on to mainframe operations and development on IBM 360/370 systems. I got my first actual PC programming job in 1988 writing estate planning in Turbo Pascal (for DOS), and moved on to C++/Windows programming in about 1990. I held that job for 12 years.
After that, I moved to Texas, and did a year in preventive health care software, followed by three years in embedded software (with a proprietary version of Windows CE) and real-time image capture/transmission. My code flies on F–16 and FA–18 fighters (and probably others) and was responsible for the targeting imagery we all saw on TV when the war in Iraq started. Next up was three years writing software for troop readiness, which was my last job using C++ and MFC.
That was followed by pure .NET development via a year of writing real-time encryption/decryption of streaming video, writing a telecommunications billing management program in WPF, and finally where I’m at now, doing financial management software in ASP.NET, Silverlight and WinForms. Unfortunately, its all in Visual Basic.
What is your development environment?
At work, hardware is a dual-core machine with a couple of smallish hard drives (no larger than 160GB), and 4gb of RAM, and we’re running Windows 7. Everyone has dual 22-inch monitors. We’re using Visual Studio 2010, but all of our web site stuff is still in .NET 2.0, though we also have a couple of Silverlight 4 modules. Along for the ride is a VERY old VB6 app that nobody likes to work on, along with some DTS packages (they call it SSIS now), and the back end is a bastardization of Access and SQL Server 2005.
At home, my main box has a 3.2GHz quad-core AMD cpu with 16GB of memory. NONE of my other six machines have less then 4GB, even my homemade NAS and the pfSense firewall box. I have a dedicated web server box as well so I can test web deployments for web sites, Silverlight modules, and click-once WinForms apps. All totaled, I have approximately 14 terabytes of available hard drive space. All non-appliance boxes are running Windows 7 Ultimate. Of course, I have all the latest Microsoft dev tools and SDKs installed.
It’s hard to keep up any more. I don’t really care for ASP.NET (the stateless nature of web pages is a continuing mind-f*ck for me - sorry, there’s no other way to describe it), and while I really kinda hate XAML, Silverlight is a better option for our websites because everybody in the Air Force is mandated to use IE.
With the current budget problems, we don’t think we’ll ever get the money to hire more bodies so we have a chance to develop on newer technologies. Because of all of that, I have to do all of my exploring at home. That’s okay, though, because above all else, coding is what I like (and prefer) to do on my spare time. I think that’s what makes me different from a lot of other coders out there.
What is your coding pet peeve?
My pet peeve is code that lacks any (or too sparse) comments. I recently had to make heavy modifications to a ASP.NET web page that a) had no supporting design documentation, and b) had absolutely no comments. To make matters worse, one of the files was over 4,500 lines long. I’d like to find and strangle the person responsible for that.
In my own code, I like using “m_” for class variables, and generally use camelCase otherwise. When I’m working on code at work, I stick with the naming convention and coding style already used in the file.
For indenting, I have the IDE set to keep tabs (set at four spaces), and it looks like this:
I try to make my methods do just one thing, and even if a method is only called from one place, I made it a method because it cleaned up the code that calls it.
I use “//————————–” to start a method because it’s easy to see when you’re scrolling fast through a file, and I always try to use the XML comments for IntelliSense.
How did you get started programming?
My ex-wife was tired of me always working on my car (I was REAL big into first generation Mustangs back in the day), and nagged me to “find another hobby.” So on a whim, I went out and bought an Atari 400. Immediately after that, I enrolled in a local computer trade school, and eventually bought an Apple IIe. I got all the neato add-ons for it, including an 80-column card, a C/PM card, and the AppleCat 300 baud modem. Beagle Brothers software was “it”. Then, I discovered Turbo Pascal (yes, for C/PM). That’s what I consider to be my starting point - a $30 Pascal compiler on C/PM.
My first PC program was a utility to change the colors used by the Turbo Pascal 2.0 IDE. I did it because someone said it wasn’t possible. In point of fact, this utility earned me the "Outlaw Programmer" user ID I use on CodeProject. When I posted the code and essentially responded to the naysayer with “neener neener, I’ve done what you said was impossible,” the guy responded with some snide remark that included the wish that all people like me should be branded as outlaws. BWAA-HA-HA-HA-HA!!!
Being exposed to other programmers is an obvious benefit, and tends to make you feel good about your own abilities as well as humbling you when you encounter someone that can really wrangle code with new concepts and technologies. As I get older, I find it harder to deal with the new stuff, so I only do so when it’s absolutely necessary.
The younger guys’ willingness to accept any dogma spewed out of Redmond tends to force a kind of introspection, causing me to push on familiarity with the newer stuff, and that’s a good thing. This happens more from the online community than with the local guys, who more often than not tend to fall into a comfort zone that they’re reluctant (or not inspired) to step out of.
I dislike the new guys that don’t seem to understand that research and reference is an essential part of being a programmer in the fast-moving development ecosystem. Old guys like me were forced to read books and buy the MSDN Library, and then muscle through problems we were dealing with. We had no alternatives. I would have killed to have had access to something like Google back in the ’80s and ’90s, and these new guys are squandering the resource. It’s a shame really.
Secondarily, the student programmers that post questions in the Q&A section seem to have a sense of entitlement, and have no qualms about asking for complete code for their homework assignments – or even worse, they ask for ideas for their final year projects. I hate that, and have no respect at all for the people that do it. I guess I’m just getting crotchety in my old age.
The only programming site I really use regarding forums is The Code Project. It’s good to have tenure somewhere and, generally speaking, the rest of the participants are good people. (Maybe my propensity for stockpiling ammo keeps the wolves at bay.) I get some code off CodePlex, and find answers to my own questions all over the web, but CodeProject is my go-to site. I’m on LinkedIn, but I don’t chase it around. As a general rule, I abhor social networking sites and everything they stand for.
What advice would you offer to an up-and-coming programmer?
That’s probably the toughest question you’ve asked, and I can’t give just one piece of advice, so here’s my list:
0) Don’t waste your time “specializing.” Things move too quickly, and any rigidness in your desire or ability to learn something new when it comes along (or becomes necessary) will seriously hamper your ability to find work. I’ve worked in all kinds of environments regarding a dozen different kinds of subject matter, and in several languages on many platforms. Change happens. You should be able to change to meet the demands placed on you.
1) You ain’t all that. No matter how “mad” your “skillz” are, you don’t know everything. I’ve been doing this for 30 years and have forgotten more than I know right now. My dad used to say, “Don’t let your alligator mouth overload your hummingbird ass.” If you can’t walk the walk on a new task, say so up front, and accept help from the guys that have the knowledge you don’t. At the same time, be proactive and get that knowledge on your own dime. I write code at home. I learned WPF at home because I knew I’d need it for an upcoming task. I learned Silverlight at home. In fact, pretty much everything I know about programming on a PC, I learned on my own time with my own computer and money.
2) Learn how to find the answer on your own. Google is a WONDERFUL resource, and it is a very rare occasion that I can’t find the answer with a concerted Google search.
3) Learn to adapt. Many times, you’ll be coding like gangbusters, and then, you encounter a significant roadblock. More often than not, the roadblock is imaginary, mostly because you’ve been thinking along a certain track, but have encountered something that doesn’t fit your cute little paradigm of the month. Don’t be afraid to step outside the often arbitrary boundaries establish by pundits and theorists. You have a job to do and sometimes you just have crash through the undergrowth and do something that is regarded by “others” (aka “industry experts”) as “bad practice”.
A corollary to this is finding different ways to approach a given problem. The simplest way I can think of to put this is if you can’t add 2 and 2 to get 4, you may have to subtract 3 from 7, or divide 20 by 5. In other words, think outside the box and work the problem.
4) Become not just a good debugger, but an OUTSTANDING debugger. Most of your coding time will be tracking down problems, and I don’t mean the big glaring bugs that have a neon sign over them shouting “HEAR I AM.” I mean those sneaky little bastards that make the word “subtle” a gross understatement. I once tracked down a bug in MFC’s CString class that took me TWO WEEKS to find. Tenacity is the key.