Modern software development involves a great deal of searching a finding a solution that someone else has been kind enough to develop for you, or at least similar software and component parts of what you are thinking about. I don’t know if industrial and mechanical engineers make it a practice to go through catalogs of parts, visit warehouses and web sites of factories to find out what kind of things are coming out, that they may use to build … well, anything they may come up with, but for software it seems to be a part of the craft. Shopping, researching, comparing and weighing your options.
The internet obviously makes software development a lot different than it used to be when software was best shipped on physical medium. There are so many possible choices, and being such an abstract product, each software component of any complexity can often have many possible uses – we have an alphabet of 1,000,000s of “letters”, all different fonts and faces and sizes and languages that need to fit together into new and meaningful and useful.
The problem with that is partly the complexity of the language and variety of dialects, and also that at a higher level it’s not really natural to build applications today in the way I think they should be built in at least early conceptual stages.
One of the problems is that you’ll crack open Visual Studio, start with the Start page and … new project and … new web project but I have to pick a language FIRST?? why … that’s sort of strange after all, isn’t .NET multi-lingual or “language agnostic”? Now I have to also pick the TYPE of application. Does that make sense really? Often yes, but not always, so I can start with an empty project, and decide what I want to do with some classes, if it’s going to be a Windows library later, but somehow I feel like I am being forced into something too early here; what about helping me decide what I have to do to allow for the flexibility to change my mind?
Now here’s where Visual Studio is lacking, because the direction that you want is not available any more, you can’t even sort project types by name to get clarity. There’s ASP.NET Web Applications/Web Sites/WPF/Windows Forms/SilverLight/ASP.NET Futures/WCF Service and more and what I really want to do is start a solution before I am sure about the architecture. Visual Studio doesn’t really assume that you are completely confused about what kind of class to add either. There’s so many combinations, I think that you really need to study some combinatorial mathematics to be able to calculate the complexity properly, so I won’t try right now, but just to get a basic idea, there are the # of languages * the # of project types (* 2 because there are web site vs. web project path to consider) * classes and then you have the programmer that is just starting out that wonders where to begin. Meanwhile, you have another programmer and developer that has been writing code all his life – certainly not the best of the best, but pretty good – and who loves “untying knots” and piecing the puzzle together is also at a bit of a loss over the huge selection, although I am certainly enjoying the buffet.
The Command Line Beckons
I think developers are rebelling against the IDE because it’s become too complex. The choices are manifold in complexity and everyday they increase. However, it’s impossible for the IDE to really adapt fast enough, at least that’s they way it has been. We resort to text for writing code, because ultimately the RAD concept only goes so far, and all new interconnections must be described explicitly in terms of a known quantity – that is, any new piece of software has to build on top of the compiler ultimately or the library you are using, or whatever granularity level you are building on top of. A simple command line is better for reinforcing proper abstraction.
So, why the command line? What I am really thinking of isn’t CMD.exe, it’s the simplicity of Ruby, Python, and other dynamic languages – and up and comers like F# and Powershell. Microsoft is getting there now, really making enormous strides at the command line lately with these dynamically typed languages. They allow developers to raise the abstraction level in a way that isn’t dependent on some designer metaphor, that tends to box people in. The RAD idea is the idea of visual drag and drop components which you can just hook up properties together, and have a common data type system and set those properties and decide what data to pass and you are done, but where’s the RAD at the command line? That’s great. However, that assumes that everyone really uses the same drag and drop metaphor, and it’s not scalable in the great scheme of things because text is more abstract. If RAD drag and drop really took off, or UML really took off, I’d suppose the only way the world would be if it was much more like Chinese, than C#, because if you draw out a system in UML, extrapolate and refine the design patterns, over time those patterns in a drawing would really be drawn the same way, become a symbol you recognize at a distance, then a shape that is drawn in short form, recognized as a language building block, and so on, essentially a pictogram, but a “living breathing” pictogram that you can zoom in and resolve
Web Browsing Should BE Programming
If you really could program with a multi-touch interface, using symbols for any part of the system, and tie together web browsing, then I envision the day when you start writing a program just by browsing. Browsing == “THINKING”. If you want to have a RAD environment, then you have to be able to think and program at the same time, and try things and browse things.
Back in the day, the Object Browser and the Windows SDK was a lot of information and it was all local, and the UI built specifically for browsing that content. Now I have to browse the web, install 5 or 10 different packages and guidance packages and code generators and look on CodePlex and MSDN and CodeProject and everywhere I can to find out if something exists, and if I am wasting my time, find it and then it takes how long to tie it in to my other ideas that I thought would work?
Build code by searching. That’s what a lot of developers do. Most I’d guess, today. The new command line is search, really, even Powershell acknowledges that in some sense, because of the nature of the verb-noun pairing and the emphasis placed on discoverability that it provides, as well as the overall philosophy that everything can be represented as a single command and you certainly should be able to string together commands and objects in a simple way that is truly scalable. If you do that then people at various levels can always “look in the dictionary” to determine what you mean, but they should always be able to name that information as they please, so that they can recall and reuse it. The same for a program. So people incorporate new ideas into their system by relating it to what they know, and we have to provide a better way to allow developers to navigate relations between real artifacts in the IDE and “in the cloud” and ties them together in testable, scalable and robust ways.
The IDE IS the Language
When you start a conversation about what you want to build, do you start by describing the materials? Only if you make raw materials. Microsoft sometimes forgets this because they are developers and they were brilliant in making Visual Studio.NET and VS2005 and Orcas, but as time goes by, things change, and now developers are not building the same kinds of applications. Visual Studio.NET allowed developers for the first time to start building web services simply and quickly and that’s the sort of building blocks that the IDE provided and the guidance that was provided. Now we’ve grown, and the IDE has still got the shape and metaphors that assume we don’t have any infrastructure, because the web is so new. That’s not true anymore and we’re building CITIES not huts, so saws and axes and windows and doors are great, but we need to figure out how to manage utilities and services and deal with people and manage all this infrastructure that was built willy-nilly with 1000 different best practices and 1000 different theories about how it should be done, all crammed into a few decades. As the language evolves, so does the need for the IDE to adapt.
Visual Studio must merge with the web – I’m not saying trash the client-side application, just that it’s not embracing the power of the web. It only makes sense for developers to be able to tie together the invaluable resources out there and tap into them in ways that make it efficient to share not only code but ideas, processes, and people across traditional boundaries. As it stands today, Visual Studio is not PART of the web, it’s just an onlooker – a tool that has but a loose association with a developer’s other best friend, the internet. While the internet has no foreseeable limit, Visual Studio is just one tool, Expression another, MSDN a web site, and all the Channel9 videos just videos, but they all have qualities that eventually must be tied together to build a better ecosystem for future development of the web. Most of all it has to be flexible enough to allow emergent behaviors to arise without requiring a development environment rebuild and total redesign of the system. There are so many radical new ideas, it’s difficult when it is phrased in such different terms that people just don’t understand that it’s a “natural progression”. For example, Astoria over ADO.NET Entity Framework over DLINQ via WCF is really a lot of different names for things that seem very unrelated but are really a very good and simple use case of the technologies and show what can be done, but the language hasn’t matured enough to talk about how Astoria is built on all these things, because people are still confused by the word “Lambda” and even “expression” because the context is new. So the other way is to talk from the high level down, and they tried that (MS) but developers said, “hey that’s great for RAD, but what about ADO.NET Entity Framework, what do we do!?” and really had to be told, “this is possible because we [MS] are building it on top of the ADO.NET Entity Framework”.
We have to learn to filter out all the SAME things and realize that they are really the SAME.