Welcome to our continuing series of Code Project interviews in which we talk to developers about their backgrounds, projects, interests and pet peeves. Here we talk to Steve Smith, serial software-development entrepreneur and currently an Executive VP of the Services Team for Telerik.
Who are you?
My name is Steve Smith, and I'm a recovering serial entrepreneur. I'm currently an Executive Vice President of the Services Team at Telerik, where I'm fortunate to be able to work with my wife (also EVP Services) Michelle.
We've run and sold a number of companies in the past, including ASPAlliance.com, Lake Quincy Media, and NimblePros. Most recently, NimblePros was acquired by one of our favorite NimblePros clients, Telerik. Previously, ASPAlliance.com and Lake Quincy Media were both acquired by one of my favorite developer web sites, The Code Project.
We live in Kent, Ohio, and work in nearby Hudson.
What do you do?
One of my first projects for a paying client was called Four Walls, because it managed everything that happened inside the four walls of a customs receiving warehouse for The Limited's various brands. This was a great first project and was where I first really learned to use ASP (classic). I had to build the entire thing pretty much solo, because all of the client's dev resources were tied up with mandatory Y2K-apocalypse-avoidance work, hence bringing me in as a consultant to complete this project.
It was also at this time that I became involved with and ultimately took over ASPAlliance.com, which I ran from 1999–2009.
ASPAlliance.com was another early project, and I learned a lot about building web applications and ASP.NET by maintaining this site. Unfortunately, the advertising side of the business really started to take off, and most of my development energy after 2002 or so went into building up the ad platform for the AspAlliance Ad Network. Eventually this would grow into Lake Quincy Media and its proprietary ad platform, AdSignia, which was a from-scratch rewrite begun in 2005.
AdSignia taught me a great deal about scalable software development, as it basically had to serve multiple requests per page view for hundreds of developer web sites within Lake Quincy Media's ad network. If the ad server was slow, or had errors, it could impact all of these sites. My passion for code quality and performance and scalability topics grew from my experience with this platform. I continued to work with and improve AdSignia after The Code Project acquired Lake Quincy Media (and ASPAlliance.com) in 2009.
Most recently, my focus has been on developer training and software project assessment. On the training side of things, I've authored several courses for Pluralsight on topics I think every developer should know, like SOLID Principles of Object Oriented Design and Design Patterns. I also have courses on Kanban Fundamentals and Web Application Performance and Scalability, and I'm working on a course on N-Tier Application Development in C#.
From an assessment point of view, I've worked with several clients recently with the goal of assessing risks in their codebase, so the project stakeholders could make an informed decision about what they were getting in return for their investment. This is a service we offered at NimblePros, and which Telerik Services also offers, potentially covering processes and practices in addition to the code itself.
What is your development environment?
I have several computers, which I'm guessing isn't all that uncommon. At the office, I have a quad-core i7-based machine with 12 GB of RAM, and at home I have something similar. In both cases I have a couple of 24" monitors. I run Windows 7 and do most of my software development in Visual Studio 2010. I also am rather fond of my Asus Zen Ultrabook, which I received a few months ago and have now used quite a bit, including for a number of presentations. In every case, the main drive on the machine is an SSD, and I've found that makes a very noticeable difference in the responsiveness of the machine(s) and hence my productivity.
I'm most comfortable with C# and ASP.NET, most recently MVC. I'm a big proponent of testing and testable code, and I mostly use NUnit and Moq to accomplish these tasks. I'm also a fan of DVCS, with Mercurial as my first choice, but I'm learning Git as well, and at this point having to work with non-DVCS systems really cramps my style of working in small increments.
I'm currently learning a lot JavaScript, both client-side and server-side with Node.
I'm also learning about single page applications and MVVM using Telerik's KendoUI JavaScript framework, and I've played with Knockout as well for this purpose.
Beyond that, I'm trying my best to increase my knowledge of Telerik's tools, which include components as well as our Sitefinity CMS/application platform and tools for testing, profiling, mocking, reporting, developing mobile apps, and probably some other stuff I'm missing or can't talk about yet.
What is your coding pet peeve?
I'm a big fan of Clean Code (the book and the more general concept). The book has a lot of great information in it and I consider it required reading for developers. Two of my personal pet peeves are inappropriate comment usage and regions. I've written entire articles on When to Comment Your Code and my thoughts on regions in the past.
The short version is that comments should tell the reader Why, not What. What the code does should be obvious, and if it isn't, then refactor the code rather than putting lipstick on a pig by applying comments to compensate. Add comments to explain why a particular design choice was made, or when something unintuitive is being done, so another developer doesn't improperly "optimize" the code. Delete comments that don't add value, as they're simply noise.
Regions (in C# and VB) are a workaround for unclean code. Have a bunch of methods that don't really relate to the class at hand? Sweep them under the #region rug. Have a really long method and you can't see it all at once? Don't refactor it, just add regions. Classes getting so big that you can't find anything in them easily? Don't break up the class into smaller, cohesive classes, just use regions to cover up the real problem. I actually did a [survey on regions][http://ardalis.com/regional-differences] that had 400 responses that you can check out if you're interested.
When it comes to casing and indentation style, I tend to follow the predominant style for the language in question. That means slightly different styles for C# and JavaScript, for instance.
I've never really cared about spaces vs. tabs for indenting, but if you pinned me down I'd probably argue for 2 spaces per level of indent as it fits books and narrow columns better.
I avoid Hungarian notation since we long ago outgrew the number of types that anybody can reasonably associate with three letter codes, and since I can type quickly and I use a modern IDE with statement completion, if I really need to include information about the type of a variable I do it as a suffix. For example, rather than having lblName
and txtName
and Name
(or strName
- the actual string that will hold the name), I'll have NameLabel
, NameTextBox
, and Name
. One benefit of this approach is that they're all grouped together in statement completion, and another is there's no need to continually invent new tiny abbreviations for every control or object we write.
Oh, and if you are still clinging to Hungarian notation, it may also come as a surprise to you that modern operating systems also allow filenames longer than 8 characters, so you can type full descriptive names there as well.
Another not-quite-code pet peeve of mine is the use of www in URLs. It might have made sense in the 90s (last century), but today if I tell you to visit codeproject.com, do you really need me to note with a prefix that it's on the World Wide Web? Unfortunately, I think www is probably here to stay due to the inertia it's accumulated in the form of web giants like Microsoft.com, Facebook.com, and Google.com. But at the very least, make sure your company's web site works without the www, even if it silently redirects to the longer version. Twitter, at least, values short URLs enough to drop the useless www even if users insist on typing it.
How did you get started programming?
I started programming on a Commodore Vic–20 at school and an Apple II+ at home. In both cases, I learned to use some variant of Basic (with line numbers!) to perform extremely simple tasks or draw ASCII art on the screen.
Probably my crowning achievements during this era were the development of my own secret club program (a password-protected, single-user program with no persistence mechanism) that some of my friends could log into when they came to my house. Once logged in, there really wasn't much to see, except some more text-based menus and info on “club activities”.
Later on in school I learned Turbo Pascal and started to learn how to solve real problems using software.
Out of high school, my primary interest was in physics, but I got a full-ride scholarship from Air Force ROTC that required me to major in computer science, so I figured I'd do both. Not long after I started at the University of Chicago, in an amazing fiasco, the AFROTC scholarship failed to materialize, and I ended up transferring to The Ohio State University, where ultimately I got a degree in Computer Science Engineering. So, although the whole scholarship debacle was pretty awful, I can at least thank the Air Force to some extent for pointing me in the direction of computer science in college.
Most of the things I've learned about writing good code and software development practices and processes came after college. I certainly think my degree was valuable, but as an employer of software developers I am constantly disappointed in the habits and practices most developers in or just out of undergraduate programs have. I really wish things like SOLID principles of OOD, rules of simple design, and unit testing were covered in degrees that are meant to prepare students for careers in software development (which I understand is not necessarily the same as computer science).
The developer community has had a huge impact on my professional career. I was fortunate early on to become involved in ASPAlliance.com, which was really just a fluke as I was looking for a place to host some code samples so I would have them with me whenever I went to a new client. Ultimately that one decision to set up some space on ASPAlliance (essentially I had a blog) led to a lot of my later connections in the industry and community. It introduced me to a group of ASP experts that eventually would become the ASPInsiders group, which remains active today (and which has spawned many similar insiders groups within Microsoft, many of which I manage private mailing lists for).
It was my involvement with this group and the ASP/ASP.NET product team that led to my first being awarded a Microsoft MVP in 2001. Later, my involvement in ASPAlliance and other community/influential programs led to my invitation to join Microsoft's Regional Director program in 2005.
Before Twitter, my IM contact list was my main way to keep in touch with this geographically separated community. Now, it's rare that I use IM unless I really need to privately talk to someone, and instead Twitter is the main channel for general conversation.
Today, private mailing lists for insiders programs and public discussion on Twitter are my main means of interacting with the developer community, along with blogging, reading blogs, and blog comments. I don't tend to spend much time on forums anymore, as email and Twitter are both more platform agnostic and mobile-friendly.
What advice would you offer to an up-and-coming programmer?
Never stop learning, and never believe you know so much that you can't learn from someone else. Never be afraid to ask questions, and get to know others in the developer community through whatever channels you're most comfortable with. You never know when a particular connection will end up making a huge difference in your career. It's a fairly small world, and the Internet has made it even smaller, so it's also important that you try to avoid burning bridges. Finally, work on your communication skills (written, oral, presenting, everything) — these will always serve you well in your career.