Software Craftsmanship

No this isn’t about industrializing software development vs. software development as a hand-crafted process. I’m not going to get into that argument, as the very act of developing software is a form of automating something somewhere.

No matter how you look at it, software development is a craft. Like a carpenter, a good software developer carves a beautiful and functional program out of code using defined patterns and technical prowess. They use their years of experience to analyze and decompose problems into maintainable libraries, services, and applications – always looking for new tools to add to their toolshed. They continually revise the way they think about common problems, without emotional attachment to the old, remorselessly refactoring solutions, discarding the old, re-engineering, revising, and re-thinking. They are masters of their profession, and like a true master, they mentor the more junior members of the team.

Unlike other professions though, there is no real industry recognized apprenticeship system. Sure there are certification organizations, but I can point to so many people that have some sort of qualification on paper, but no real skills in the actual process of analysis and development.

I can also point to so many people with the makings of a good true craftsman – and sometimes they are the people that frustrate you the most though. They have a good work ethic, extreme attention to detail for the end product, and pride in the feedback they get from end users. Crack open that solution though, and shining at you is the result of so many impacts with that golden hammer – it could blind you.

Where are the standards? When was the last time you read a technical article, or lifted your head from your cubicle to see what was going on in the rest of the industry? When was the last time someone walked up to you and simply showed you a better way? Unfortunately time itself deems these people “senior”, not their skills.

But it doesn’t have to be this way. Usually it’s the environment that has left them uninspired, comfortable with the fact that what they are doing just works, but no eye for the long term maintainable solutions. What can you do to inspire these people? How do you motivate these people in a working environment that has institutionalized all resistance to change? What do you do when you are surrounded by those that simply resist because new is different?

In other words, how do you start rocking the boat? ;)


The Marginalization of the Operating System

It occurred to me that the phone marketplace is like a microcosm for what is happening in the desktop world. It’s a little like watching the common cold mutate through a season. The gestation period for something so small is so short, that huge changes can occur in an extremely short period of time. As such, we’ve seen huge market share swings from Blackberry, Apple, Microsoft, and Google. Google’s Android lately has been pushing out other market players with (arguably) sub-standard, but cheap software and placing the consumer’s focus back onto what they can hold in their hands – good quality phone hardware.

Although not to the same extent, much the same thing is happening in the desktop world. Although still king of operating systems, Windows is being eroded ever so slightly in market share by MacOS (and to a much greater extent in mind share). Once people start getting used to the idea that their desktop can be something other than Windows, the floodgates will open with cheaper alternatives like Linux – just as what’s happened with iOS (providing a compelling user experience through good design) and then Android (by being good enough at no cost). I also think Microsoft knows this and it has been the driving force in some of the newer software platform decisions.

We’re seeing the foundations being laid for true software as a service in the form of Silverlight, a platform that will extend Microsoft’s reach across all operating systems and allow them to retain the crown as THE platform provider. It will allow them to continue their main software platform business by providing a common API to all operating systems and allowing their software to continue to be sold to everyone. The technological specifics of the platform allow some very interesting business models for selling software as a nice bonus as well, to be discussed another time…

Besides writing a plugin for the most of the major browsers across both Windows and Mac, Microsoft has also been collaborating with Novell by providing source code, specifications, and test suites towards the creation of Moonlight – the open source implementation of Silverlight for Linux and Unix systems. If that’s not a clear indication of what Microsoft considers their “platform”, I’m not sure what is.

A Call to Kill VB

I’ve been around the software development industry a few years, starting originally in Classic ASP using VBScript, then changing over to .Net around the time it first made it’s debut. It was a natural change to upgrade my skills to VB.Net – well, because that’s what it was created for, right? Not just for developers, but for enterprises to have a clear upgrade path to the current technology for existing applications, and to be able to leverage as much as possible the existing skill-set within the organization.

Here we are, ten years later. VB.Net, why do you still exist?

After years of VB.Net getting the language feature Me-Too! treatment, it’s still out there. I’m still seeing developers clinging to this antiquated language with a firm death grip. And I’m still seeing new projects being started with VB.Net…

I realize that .Net was architected with many different languages in mind – so that there would be peace, love and harmony between all developers (except Java!), but is VB even relevant anymore? In fact, whenever someone talks about a .Net application, or working with .Net, I only assume C#. With VB.Net’s ancient syntax, it feels like a “programming for dummies” project that’s gone too far. It’s almost condescending every time I have to code… Staring back at me all smug – saying “you don’t know what you’re doing! Why are you even getting paid?!” OK that part is in my head, but it’s still a WTF feeling…

On the Microsoft side of things; when Microsoft releases new versions of the framework, like Silverlight for Windows Phone, or XNA, C# gets first class treatment, then a VB.Net version is hacked into existence. It’s obvious who’s the star of the show in their eyes when it come to .Net, so who are we kidding? Is VB’s existence even justified anymore? .Net toolsets have matured to the point where Microsoft could, and should be including an uprade wizard to go from a VB.Net project to a C# project. Why not?!

When a development team brings on a new hire based on .Net development skills, 9 out of 10 times they will stare in shock at the existence of VB.Net apps in an Enterprise suite, and have that look of disbelief that some of those apps are brand new.

Microsoft, isn’t it about time you put a bullet in this lame dog? It’s called progress – let’s stop clinging to the past and euthanize VB for the betterment of mankind.

The Importance of Coding Standards

I’ve always had an easy time of spotting how many hands have been in a certain piece of code during its lifetime. You see, there are so many different styles and preferences on how something can or should be done that each developer will do it their own way no matter what. From naming conventions, to code-organization, to business logic location – it doesn’t matter. In a loosely controlled environment, anything goes. It’s always been an issue wherever I’ve worked – with one outstanding exception.

In the military, standards establish specific requirements that a soldier must meet. These standards are usually established due to hard-learned lessons on what the best way to do something is. In certain cases, these standards can actually have a profound impact on the effectiveness of the personnel in question to do their job. Standards allow a team to work together as uniformly and as smoothly as possible. They help maintain discipline when faced with a difficult task, knowing exactly how to approach a specific problem, and they help with integrating new members into any team environment.

Now most development teams are not members of the military, but standards apply in any environment for the same reasons they apply in the Army.

I don’t think it can ever be stressed enough for a development team to be working with a set of well-established coding standards. Coding standards are the fundamental base-line for establishing the quality of code produced by any programmer, and an individual’s adherence to standards shows how much of a team player they are. The problem is that most environments do not have an established set of code standards.

Now I’ve heard before that ANY standards are better from NO standards. And well, I guess that could be right, but wouldn’t just sticking to industry-accepted coding standards be better? Wouldn’t it be easier when training new developers to not have to beat old industry accepted habits out of them? It’s a difficult thing to have to retrain yourself to do something the “wrong” way when you’ve spent years doing it in a way that has logical reasoning behind it. And it really doesn’t matter what I’m talking about, naming conventions, or architecture, logic and reason should be understood by any developer.

Establish a standard people. If you don’t know where to start, start here.

Windows on ARM

It probably escaped the notice of most consumers, but a fairly major announcement was made at CES 2011 that will shape the future of mobile computing for the next few years.

Yes, Microsoft announced that Windows has been ported to the ARM processor. I don’t mean Windows Mobile (Microsoft’s now legacy Mobile OS, or Windows Phone 7 – built on Windows Embedded Compact 7) which already runs on ARM. I mean the Windows desktop, the OS that there is a 91% chance you are using if reading this article from a desktop computer.

ARM processors power a significant portion of mobile and low powered devices including smart-phones, TVs, and industrial hardened portable devices. They can be found anywhere that a system designer needs to conserve power due to battery life, or needs a low-heat high performance processor for a specific task. If you haven’t noticed, this is not the world of Windows.

Windows has always been relegated to mid-range to high performance computers for consumers or businesses. But there is an entire emerging market of smaller embedded computer devices that are becoming the norm. From smart phones to tablets, there is an overall pattern that is becoming apparent. The hardware these devices are running on is starting to rival desktop computers from a few short years ago. Desktops that are still perfectly capable of running a modern operating system with a few bells and whistles turned off. In the time between now and when this software is ready for prime-time, the gap will close even further. In fact, it’s highly likely that Windows 8 and Windows Phone 8 are going to be the same operating system.

Some would argue that Microsoft is late to notice this trend, just as they were late with noticing the trend towards touch based computing. This is further from the truth as can be. It takes years to produce working software as complicated as an Operating System. It takes quite a bit of time, planning, and financial backing to port an OS to an alternate micro-architecture. It’s likely that Microsoft put the plans in motion several years ago for this announcement, just as the Microsoft Surface sat in R&D labs at Microsoft since the beginning of the last decade before making its public debut. It takes careful consideration to release a product into the marketplace, and it’s all about timing.

Back on the subject of ARM however, some would point out a small issue on this subject. Software. You can’t run x86 or x64 compiled software on an ARM processor. You can’t run any natively compiled software on a processor that it’s not specifically compiled for. So this small caveat prevents almost every commercially available piece of software ever written for Windows from being run on Windows for ARM. So why would they do such a thing? Again, it’s all about timing.

The .Net Solution

.Net is a hardware agnostic technology that Microsoft release in 2002. It’s largely been relegated to development of Line of Business software due to its nature. It allows rapid development of software for several mediums (Windows, Web, Mobile) while using a (mostly) common API and set of languages. When used by a skilled team of developers, it’s a technology that produces a high return on investment by lowering development costs and making your IT department as versatile as possible though the application of the same skills to the various target platforms.

What’s special about .Net is that an application is compiled to MSIL (Microsoft Intermediate Language), a processor agnostic language that is JIT-compiled at runtime on the target platform, or pre-compiled during install time, again specifically for that target architecture. Although you can target your compilation for a specific architecture with .Net directly, there are usually specific reasons to do so that would prevent you from running a particular assembly on an alternate architecture anyways.

.Net is not a technology that is widely used in commercial software. There are likely very few software packages the average consumer has installed that use .Net. But it is there. Windows Vista and Windows 7 both have a desktop rendering engine that uses .Net. Microsoft began its push towards full .Net user interface several versions of the framework ago. A push that is finally starting to show a return on investment.

An application written in .Net and compiled for “Any CPU” will run on an ARM based Windows implementation the same as an x86 or x64 PC. It’s the runtime installed on the specific OS that knows about the underlying architecture, freeing the developer to write software that meets business requirements and not just internal platform specific plumbing.

There is a drawback though.

.Net has no first party equivalent on alternate OSs. Yes, there is Mono, but Mono is not a complete implementation of the .Net framework and has no real support or commercial viability due to timelines for support of new features.

Instead, Microsoft has spun off purpose specific versions of .Net. Silverlight, XNA, and to a lesser extent, the older deprecated .Net Compact Framework (Windows Mobile 6.5 and below).

XNA can be used to develop games or 3D interfaces – and works for Windows, Xbox 360, and Windows Phone.

Silverlight is usually found in browser distributed software and exists as a plugin to host the runtime for all the major browsers on both Windows and Mac (and through the Mono implementation for Linux).

Silverlight and XNA are in fact the only way to develop for Windows Phone (an alternate platform for embedded phone devices that shares only its name with the Windows desktop). A move that has ensured that all Windows Phone software moving forward will continue to work on every iteration of the OS and for every type of hardware. This is quite important if what I predicted earlier becomes true – that the Windows desktop OS will displace the current Windows Phone 7 OS in the mobile space. The consumer should not notice.

It’s also possible to use Silverlight for Web development for both Windows and Mac. And through a Silverlight specific version of Click-Once deployment called Out-Of-Browser, you can run Silverlight software just like regular desktop applications, including having a start-menu entry for start-up.

Although not perfect (it would be nice to have one framework to rule them all ;-) they’ve done an admirable job of organizing the chaos with all of the different platform possibilities out there. It’s also quite an exciting time for .Net development from the perspective of someone like me as commercial development begins to take hold and wider industry adoption takes place. The possibilities seem endless.