Responding to Richard Grimes article on .NET


Edit #1 – Based on feedback, fixed grammatical errors…

I recently ran across an article written by Richard Grimes in Dr. Dobbs Journal titled Mr. Grimes farewell. I wanted to respond to some of Richard’s assertions and points in the article. You should take Richard’s article with a grain of salt as he does clearly state that the article is “his opinion”. That being said, Richard’s article is supposed to be his view of the current state of .NET, but rather than discuss how far we’ve come and where we’re going, he instead argues three points – the .NET Framework is too large blocking adoption, issues with the design of the .NET Framework, and over half the article bashing Visual Basic, and finally that Microsoft is “losing confidence” in the .NET Framework. His quotes, italicized in gray, and my responses are below.

On the size of the .NET Framework blocking adoption

  • RG:The framework redistributable is 25 MB, which is many times larger than the Java redistributable. One of the lessons of the early versions of Visual Basic was that the shareware and freeware market created the popularity of the language. While there are some shareware apps written in .NET, I often hear people complain about the huge redistributable.

My Response: Maybe I’m being too picky, but the size is 23,698K or 23.7MB. While Java’s runtime is smaller, it still weighs in at 15MB. Throughout the article, Richard refers to .NET applications when he’s really referring to client or public client (meaning not in the firewall) For example, installing the .NET Framework on a server or within an intranet where you can control the environment certainly isn’t an issue. Even for public client machines, there’s plenty of commercial shareware from games to RSS readers that require the .NET Framework. I’ve also talked to plenty of shareware developers and they certainly aren’t using Java. Many use C/C++, Visual Basic, or Delphi. As far as adoption “and the state of .NET”,  which the article is supposed to be about is best summarized by Soma, the Developer Division Vice President in his post on .NET Momentum.

Soma: We have seen over 70 million downloads of the .NET framework from Windows Update and the Microsoft Download center to date.  For a simple guy like me, that translates to about 5.5 million downloads a month.  Another interesting datapoint is that in 2004, we expect to have about 54 million new PCs shipping with the .NET framework installed/preloaded.  We also have over 2.5M developers targeting managed code. 

On the Design of the .NET Framework

  • RG: Almost the first thing I posted on the technical preview newsgroups was a simple console application in Cool, and its equivalent in Java with the rhetoric question to spot the difference.
  • RG: There are classes that are mere wrappers around Win32, but there are other classes that appear to be ported from other frameworks. Before it released .NET, Microsoft had its own Java framework library called WFC, and it also had a managed library as part of the Visual Basic (classic) runtime. It would be nice to know how many classes from WFC and VB were ported to .NET.

My Response: These two points contradict each other. In the first he implies that the .NET Framework is a replica of Java, but in the next statement he claims that the .NET Framework is simply ported Win32 classes, Windows Foundation Classes (WFC), and VB runtime classes. Which one is it? If his point is that you can write a simple application and that it will look the same in C# and Java or C++, I don’t think that really proves much. Below is an example of a for loop. 

for
(int i = 0; i < x; i++) {…}

Guess what language it’s written in? If you said either C, C++, C#, and Java, then you are correct. I don’t see what he’s trying to prove here. If he tries to build a more robust application then “Hello World” you’re going to run into framework or library specific features (ATL is not, MFC is not EJB, etc).

On Interface-based Programming and Remoting

  • RG: Interfaces are elegant but .NET’s preference for class-based solutions has marked the death of interfaces. Look at .NET remoting: This has been provided to allow an object to run in the context where it was created, and be accessed from another context. This means that the object state is kept local, and it is the behavior that is remoted. Thus, remoting is an interface-based facility. You can use .NET remoting with interfaces, but reading through the documentation and all of the “how-tos” on the Web, you wouldn’t realize this.

Point #1 – Interfaces are dead

  • My Response: Interfaces are used everywhere in the .NET Framework and are especially valuable given single inheritance in languages like VB and C#. Even the simple string class has IComparable, ICloneable, IConvertible, and IEnumerable interfaces. Going forward, one of the key new features for the .NET Framework 2.0, generics, uses interfaces for constraining data types.

Point #2 – Lack of documentation on using interfaces with .NET Remoting

  •  My Response: I am by no means saying that our documentation is flawless, but here’s a link to the .NET Framework SDK Samples on Remoting. Notice the fifth sample down is using Interfaces with remoting. I also outline our guidance on using interfaces for remoting below. 
  • RG: .NET can use interfaces but the preferred way is to use classes.
  • RG: Instead, Microsoft prefers people to use a class-based approach, which often results in the bizarre situation of people deploying their server assembly to the client so that the client has the metadata of the service objects available, or a soapsuds assembly, which basically was a hack to get around the problems of having class-based remoting.

My Response: We don’t “prefer” any mechanism, per se. While we may offer guidance, developers can choose to develop their applications as they see fit. Our Patterns and Practices group does provide guidance and best practices on these and other points and even includes guidelines on how to design a remote interface. I don’t see a class-based favoritism over interfaces, in fact, there has been an increasing movement to use messages and service orientation rather than object orientation. I concede his point on deploying server assemblies to the client, but poor design is poor design. People deploying a server assembly to a client just so that the metadata of the service objects is available could have easily used an interface or schema instead. That being said, there are some situations where you do in fact want to have server code in each client, the example being a peer-to-peer chat where each client acts as both a client and a server.

 

On Microsoft using the .NET Framework for their applications

  • RG: Microsoft treats .NET as a useful library to extend its products, and to date, it has not shown any more conviction to the framework. There have been a few .NET products written entirely in .NET; one such product is Microsoft CRM….They do not want the expense of rewriting their existing code for .NET, and there is no compulsion to provide all new code in .NET; instead, .NET will be hosted as and when it’s needed, particularly to allow extensibility through user-supplied code. 

My Response: We should dissect exactly what Richard says here. He says that Microsoft is using .NET to extend existing products and that Microsoft doesn’t want the expense of rewriting applications from scratch in .NET. This makes perfect sense to me, why would we re-write perfectly good code? .NET code can interoperate with existing code, and you bet we’re going to take advantage of the interoperability layer to add new features that exploit the best managed code has to offer.  As I pointed out previously, Microsoft is using .NET in all sorts of software from operating systems, to developer tools, to Office.

  • RG: Microsoft’s current operating systems, XP and Windows 2003, do not depend on .NET; and with XP, .NET is an optional component.

My Response: This is a half-truth at best. While Windows XP Professional does not use the .NET Framework, that’s because the .NET Framework was released after Windows XP Professional shipped. Let’s look at the operating systems that shipped after the .NET Framework was released:

  • Windows XP Media Center edition requires the .NET Framework for MCE-specific applications.
  • Windows XP Professional Tablet PC Edition requires the .NET Framework for handwriting recognition which is a managed application.
  • Windows Server 2003 requires the .NET Framework to use ASP.NET, UDDI Services, or Sharepoint Team Services.
  • Windows Small Business Server 2003 requires the .NET Framework for ASP.NET as do SBS specific applications like Remote Web Workplace, and the Backup Snap-in.

On Longhorn and the death of browser applications

  • RG: My opinion is that Avalon, or more specifically, XAML, will mark the death of ASP. The reason is that Avalon is a client-side technology, but the browser is an important part of the distribution model. XAML is so rich that a browser-contained XAML application will look no different to a process-based Avalon application, and coupled with Web Services or Indigo (as the mechanism to access remote code), an XAML application will make an ASP.NET application look paltry and antiquated. Why would Microsoft want to kill ASP? Well, with installation of ASP.NET Microsoft sells a single copy of Windows 2003 and perhaps a handful of copies of Visual Studio.NET. The clients don’t have to be Windows, so there is no extra sale to Microsoft (whether as a product or licence). This is hardly a great revenue generator, and worse, ASP.NET actually makes it easy to write the application so that it can be used by browsers other than IE.

My Response: I respectfully disagree. XAML will allow for rich interfaces, but ASP.NET and HTML are not going away. Our value is that we can take the best of both worlds, and provide an optimized experience to XAML browsers while still maintaining compatibility with old computers. It should also be noted that there is a difference between client applications and server applications. The server market itself is *totally different* then the client/consumer market. While people talk about Microsoft’s dominance in client operating systems at around 90%, we are nowhere near that number in the server market. We’re competing against products and companies like IBM WebSphere, hundreds of middleware products, Oracle in the database market, etc. If we want to win the server market, we need to have the fastest, most reliable, most secure, most productive and affordable solution for creating Web applications. To say that browser applications are a threat to Microsoft is so….1996. The threat is not the Web. If it was, wouldn’t Microsoft have “lost” already given that the Web is already incredibly successful and popular. How much more popular does the Web have to be before this is proven untrue? Richard then goes on to say that Microsoft needs to do this because of client revenue. The client operating system market, as stated above ~90% is pretty saturated. The server market is where the opportunity for revenue growth truly lies (PS the server and tool business grew 18% last quarter! – see slide 9). On the question of revenue, a typical server deal is in the thousands of dollars as you’re paying for several parts including:

  • Operating Systems
  • Transaction Engine
  • Middleware
  • Database

Depending on the complexity of the solution, this can range from thousands of dollars to several million dollars. Server products are expensive. If you look at the market for Web content-management solutions, the average price can be around $50,000 for a one-proc enterprise license. My point being that there are plenty of revenue opportunities and competitive threats from the likes of IBM and others in the server market. Do you know how large the market for database software is in terms of revenue? Would you agree that it’s billions of dollars? Do you know that Oracle is the #2 software company and their primary revenue is from databases? That’s just *one* of the market opportunities for server software. Back to my point – We are totally committed to our server products and to making Windows Server and ASP.NET the best platform for creating Web applications. Period.

On Longhorn

  • RG: I take the decision to make Avalon available to other versions of Windows as a lack of confidence in the sales of Longhorn.
  • RG: However, Microsoft’s announcement that Avalon will be available for other versions of Windows indicates to me that they are not so confident on the uptake of Longhorn, and developers will not write applications for Avalon if they are not convinced that there will be the clients that will run it.

My Response: The decision to make Avalon available to other versions of Windows was driven by one thing, customer demand. Any rudimentary Web search turns up results of customers complaining about not being able to have this functionality on down-level operating systems.

On using the .NET Framework for shipping products

  • RG: So, with the announcements they have made last year, Microsoft has indicated that Longhorn will not be the great .NET innovation that we were lead to believe it was from PDC 2003. This indicates to me that Microsoft is losing confidence in .NET. 

My Response: Richard, the key parts of Longhorn you’ve mentioned in your article, Avalon and Indigo, are written in managed code. How does that indicate we are losing confidence in .NET when we’ve decided to bet the success of our next operating system on the .NET Framework? You might then make the follow up argument that because the entire operating system isn’t managed, that we have “lost confidence”. While that’s your opinion, I don’t think managed code is right for every scenario and Microsoft has never claimed that it is. Microsoft still fully supports C/C++ and we have a very large existing C/C++ code base and C++ customer constiuency. We’ll use managed code where it makes sense.

  • RG: The framework has become Visual Basic—it’s intended for users to develop applications, but not for Microsoft to create operating systems or the revenue generating products that they base their profits on.

My Response: I’ll avoid responding to the VB bashing as someone is already working on that. There are two points here, one is using the .NET Framework for creating operating systems, the other on Microsoft revenue. On creating operating systems using the .NET Framework, I don’t think we’ve *ever* said that you should be creating an operating system from scratch based solely on managed code. The truth is, gasp, the vast majority of our customers are not creating operating systems.  For those customers who are or who need that level of control and performance, we have C/C++ and we absolutely have not abandoned that. On revenue generating profits, I’ve already listed several revenue generating applications using the .NET Framework. Microsoft is divided into the seven business groups listed below and let’s see which ones are using managed code. 

  • Client – Check
  • Information Worker – Check
  • Server & Tools – Check
  • Home and Entertainment – Check
  • MSN – Check
  • MBS – Check
  • Mobile and Embedded Devices – Check

I hope this clears up and FUD, half-truths and any misconceptions on managed code. If something is incorrect here, please let me know!

 

 

Comments (157)

  1. JosephCooney says:

    Richard Said "There have been a few .NET products written entirely in .NET" and goes on to mention the Microsoft CRM. I’d like to call out two others that (AFAIK) are almost entirely written in managed code. SQL Server Reporting Services and Biztalk Server 2004 (please correct me if I’m wrong here). Given the long development cycle and the fact that re-writing working code is a fairly crazy proposition no matter what it is written in it is not that surprising to me that we are only seeing a few "new" products from Microsoft starting to be released in .NET.

  2. Andy says:

    Looks like Richard is moving his interest away from .Net

    http://www.richardgrimes.com says

    "Richard has used .NET for five years, he was on the technical preview for COM+2 which was the technology that eventually became .NET. Richard has decided to break his link with .NET, this site will continue to contain the free .NET resources that Richard has produced over the last 5 years, but Richard will no longer be available to do any more work on .NET. He will not write any more .NET articles, no more .NET books and will no longer speak at .NET conferences. Watch this page for more details about why Richard made his decision."

  3. Sean Chase says:

    The whole article by Grimes was a rant that I found comical quite frankly. Don’t get me wrong, I enjoyed the read, but it was clearly a rant. About the only point that made sense was the remoting documentation, but just barely. While early .NET MSDN documentation did sort of lack clarity with respect to remoting, guys in the community like Mike Woodring and Keith Brown have a ton of remoting examples available using interfaces. Don’t even get me started on Ingo Rammer who has written the best remoting book ever. Plus, even Don Box has made it clear what he thinks of soapsuds (http://weblogs.asp.net/cnagel/archive/2004/04/26/120362.aspx). The whole point about Avalon/XAML being the attempt to replace web applications was a huge reach. Can anyone seriously argue that you can create rich WinForms right now compared to what XAML can and will do? No friggin way. Why else would anyone write a binary DHTML behavior? Markup is a wonderful thing. OK, I giggled at the VB jokes – but nobody is going to take that seriously because everyone has their own idea on what a great programming language is and/or should be. Great post Dan.

  4. I don’t disagree with you overall.

    But regarding:

    "These two points contradict each other. In the first he implies that the .NET Framework is a replica of Java, but in the next statement he claims that the .NET Framework is simply ported Win32 classes, Windows Foundation Classes (WFC), and VB runtime classes. Which one is it?"

    It seems that the C# language and the CLR model looks similar to Java. But the framework (libraries) look more like pre-existing win32 or mfc APIs, maybe?

    The two statements may co-exist.

  5. Chris Nahr says:

    Richard Grimes is a C++ veteran… as I recall he’s one of the few people who actually *liked* MFC, and preferred it over Windows Forms programming. He also seems to be one of the even fewer people who understand COM (that makes two of them, together with Don Box). I’m not surprised that he tries to find fault with .NET, I’m more surprised that it took him so long to jump ship. 🙂

  6. "RG: Microsoft treats .NET as a useful library to extend its products, and to date, it has not shown any more conviction to the framework. There have been a few .NET products written entirely in .NET; one such product is Microsoft CRM….They do not want the expense of rewriting their existing code for .NET, and there is no compulsion to provide all new code in .NET; instead, .NET will be hosted as and when it’s needed, particularly to allow extensibility through user-supplied code"

    While I agree with Joseph that it’s expensive and time consuming to re-write working code Richard has a point. Until you’ve built a product from the ground up using only .NET, you’ll have no clue how your end users who are doing the exact same thing are fairing. Using managed code within an unmanaged application is completely different than using unmanaged code in a managed application, which I’m sure you understand a lot better than me.

    It’s good to know MS is dogfooding it’s own framework. You’re also more inclined to move heaven and earth for a team that makes your company revenue than a customer (no matter how important that customer is). What this means is the Avalon, Indigo, and other teams will hit problems in the .NET framework and get them resolved quicker and better than any customer you have since you are your greatest customer.

    I do agree though that having a completely managed solution is not perfect for every case. Microsoft does need to build robust real world applications using the .NET framework, though. You’ll then have the ability to point to something and say "Wanna do that? .NET lets you, here’s how." That says more than singing the praises of .NET with some samples and a lot of documentation. A lot of people aren’t going to make the jump to .NET until they see Microsoft building fully managed applications as they would be doing.

  7. Joku says:

    I suppose that when Frontpage is obsolete, MS will be offering "Xamlpage", most likely written entirely in managed code. No doubt we will be seeing some very exciting new home user oriented managed apps too. But currently it seems MS is mostly applying .NET on the business/enterprise front (not counting enabling stuff like Avalon).

  8. Ryan Heath says:

    My Response: I’ll avoid responding to the VB bashing as someone is already working on that.

    Dan, who is that someone?

    // Ryan

  9. Ryan, Jay Roxe, the Visual Basic Product Manager is working on a response. It should be posted on his blog soon, http://blogs.msdn.com/jroxe/

    Thanks,

    -Dan

  10. Bill says:

    While I do agree the article was a bit more rant than it needed to be. The response is so painfully typical. Microsoft never does anything wrong, god forbid you actually address the technical points instead or talking around them.

    Please, just this once, concede that when someone does point out potential mis-steps in a Microsoft product, they might be RIGHT! OMG! Several of the classes were so poorly designed it’s laughable. AGREE TO THIS! It’s true. Don’t talk around it.

    Also, Microsoft has had new products in the office line that were started AFTER .NET was well under way, and yet these are not written in .NET. Besides BizTalk(which I’m not even sure is completely written in .NET anyway), there isn’t one major Microsoft product that is 90%+ .NET. I really, really wish there were, cause if there was then Microsoft would have made .NET an XP SP2 must-have, which according to GPM was too invasive to users!!! So shift the burden to us. We’re tired of doing your distro work. You shipped Java for us for years…what sense does that make.

    The developers for Microsoft sooo often plead ignorance and deny whenever someone points out that Microsoft does want to lock you into their platform with their products. It’s the typical technical response claiming to not be aware of what the Mgmt/Marketing folks had as an ultimate plan.

    Bottom line is you will never look good in a argument like this as long as you own the platform and the products are built for ONLY that platform, especially when you talk about web depolyment. Just face it.

  11. anonymous coward says:

    This guy thinks .net is too easy and that’s it’s bad we don’t spend hours working on something that can be done in minutes. How obtuse is he? Check out his web site, http://www.richardgrimes.com, and click on About, then click full bio.

    At the bottom you’ll find that he listed his email, but rather then use a contact me form, or listing it directly, he ENCODED HIS EMAIL address in Rot 13 encryption!! Do you really want to take advice on "usability" from someone who thinks it’s a good idea to encrypt their email address?

  12. [df] I wanted to respond to "Bill’s" comments.

    [Bill] While I do agree the article was a bit more rant than it needed to be. The response is so painfully typical. Microsoft never does anything wrong, god forbid you actually address the technical points instead or talking around them.

    [df] To be clear here, I never said Microsoft was perfect or that Richard’s post was a rant. On the contrary, I think there are lots of things Microsoft can improve. You should read my blog post about how I’m fighting for representation of C# TechEd sessions or what features I want for a SQL tool.

    [Bill] Please, just this once, concede that when someone does point out potential mis-steps in a Microsoft product, they might be RIGHT! OMG! Several of the classes were so poorly designed it’s laughable. AGREE TO THIS! It’s true. Don’t talk around it.

    [df] You asked me to concede Microsoft missteps, here’s my opinion on three: Microsoft Bob, .NET My Services, or, as Richard somewhat alluded to, the marketing for the term ".NET". To your point about Richard pointing out flaws, Richard only pointed out one class in the entire article, the EventLog class. He didn’t even say what was wrong with the class or how we should fix it or even how to mitigate against the design flaw. He just said it was broken, but that it would be fixed in the next version. We are NOT closed to criticism at all. Our goal is to build the best framework and platform for developing applications. If you think there are classes in the .NET Framework that are, in your words, "poorly designed", tell us. You can use the MSDN Product Feedback center, http://msdn.microsoft.com/feedback/, and give us suggestions, file bugs and even get the community to vote on your suggestions. We *want* to make the .NET Framework a great framework for developing applications. If you think there are some parts that aren’t well designed, take action, file a suggestion and tell us how you think we should redesign it. With Visual Studio 2005, we’ve made some big leaps to add customer requests like adding Edit and Continue in C#. Help us help you.

    [Bill] Also, Microsoft has had new products in the office line that were started AFTER .NET was well under way, and yet these are not written in .NET. Besides BizTalk(which I’m not even sure is completely written in .NET anyway), there isn’t one major Microsoft product that is 90%+ .NET. I really, really wish there were, cause if there was then Microsoft would have made .NET an XP SP2 must-have, which according to GPM was too invasive to users!!! So shift the burden to us. We’re tired of doing your distro work. You shipped Java for us for years…what sense does that make.

    [df] I agree with you, as far as teams developing software at Microsoft, Office *client* software is one of the slowest to adopt .NET. As Richard pointed out in the article, MS-CRM is largely written in managed code. Sharepoint Portal Server is fully written in managed code, and at least 90% of SQL Server Reporting Services is.

    On your point on including the .NET Framework with XP SP2, while we may have liked to include the .NET Framework in XP SP2, we got a lot of customer requests to *NOT* add any non-security features to service packs. From a purely selfish perspective of getting as many clients to have the .NET Framework installed, including this would have been great, but our customers would have complained. The headline on Slashdot would be about how bad Microsoft is because we used security fixes to distribute an application runtime. We’re damned if we do, and damned by you if we don’t.

    [Bill] The developers for Microsoft sooo often plead ignorance and deny whenever someone points out that Microsoft does want to lock you into their platform with their products. It’s the typical technical response claiming to not be aware of what the Mgmt/Marketing folks had as an ultimate plan.

    [df] LOL, there is no "ultimate plan" or at least not one that I’ve seen. If I had to some up the Developer Division’s goals it would be incredibly easy to increase developer adoption and ensure developer satisfaction. You now know the ultimate plan 🙂

    [Bill] Bottom line is you will never look good in a argument like this as long as you own the platform and the products are built for ONLY that platform, especially when you talk about web depolyment. Just face it.

    [df] I think this is true to some extent as I am a Microsoft employee. I also felt like I needed to respond to factually incorrect information from a respected author and magazine. If it’s wrong and I didn’t respond, then one might assume that everything Richard wrote would be true.

    Thanks,

    -Dan

  13. My email address is well known, I just wondered why you did not think it important to find out what I really thought (but could not publish) about .NET?

  14. Perhaps I should make some comments about your rebuttal.

    I take your point about the size of the Java redistributable, but my comments were not as a Java advocate. I was not suggesting that people switch to Java – far from it – I was merely pointing out that it was smaller than the .NET framework redistributable and therefore a smaller redistributable is possible. I made those comments because I have had conversations with many developers, particularly people targetting shareware, who have told me that the sheer size of the runtime has disuaded them from writing .NET apps (clearly you are not talking to the same developers as me!). They want to make sure that people will be able to run their apps immediately after downloading them. My point was that the framework could have been much smaller by supplying only a core framework and then providing additional optional assemblies. I addressed this issue in one of my DDJ newsletters, which you can find in the archive on the DDJ site. This issue will be irrelevant when all Windows machines come with the framework, XP, of course, doesn’t. I should also point out that in many parts of the world (including my country, the United Kingdom) people have to pay for dial up by the minute, so a 23Mb download is not a trival option.

    I did not want to make derogative statements about C#, and if you have read any of the articles, or the books I have written on this language, you would know that I have a high regard of C#. My point about the cool application being similar to the Java application was to point out the response of the COM+2 product manager’s response: the similarity between the two was all too obvious and I had struck a sore nerve.

    I still hold by my comments about a large number of classes in the framework being a thin wrapper over Win32 – this comes from the experience of decompiling large proportions of the framework with ildasm!

    Yes, I know that interfaces are used throughout the framework, again, I addressed this in another of my articles for DDJ. However, there are many other solutions in the framework (delegates and attributes are two examples). In fact, if you trawl through the frameweok and count the number of methods that take interface parameters and how many that take delegate parameters (discounting methods that are for asynchronous calls) the former is far higher. However, there are inconsistencies. For example, serialization. In v1.1 we have IDeserializationCallback, to solve the issue of initializing objects after deserialization, but v2.0 uses attributes to do the same thing – why?

    Microsoft definately does prefer classes to interfaces in .NET remoting, and activation is the most important case. If you want to use new and/or a configuration file, you have to use classes. If you use interfaces you have to use the Activator object. The most important part of any remoting infrastructure is location transparency, that is, if you type new MyObject() it does not matter where the MyObject object will run because the infrastructure will provide all the plumbing. If you use interfaces with .NET remoting you do not have location transparency with activation. Incidentally, COM interop has a solution for the issue of ‘interfaces in a class-based world’.

    I still stand by my point about Microsoft not using .NET to write new major revenue generating products. I think my comments will be vindicated later this year when it becomes clear how much of Longhorn is written in .NET.

    As to your comments on Avalon and Indigo. I concede your point about Indigo, but I refute your point about Avalon. In Dec 2004 a tech preview of Avalon was made publicly available on MSDN downloads, and by examining this with ildasm it is clear to me that Avalon is yet another wrapper over Win32. Avalon is based on Windows messages, and uses GetMessage, DispatchMessage et al, that Windows developers have been comfortable with since 16 bit Windows!

    My points about VB.NET seem to have generated the most ire, and I thought I was just making a minor point! I have always regarded VB.NET as uneccessary (again, see my DDJ articles for more comments on this subject). VB.NET is not VB! VB is single threaded, does not use exceptions and lacks many of the OO features of .NET. It is not trivial to move code from VB to VB.NET. However, it is easy to convert a VB.NET app into C# and vice versa, and there are tools available to do this. Why create a new language when one perfectly adequate language (C#) already exists?

    This is why I brought up the argument about marketing, it’s the only reason I could come up with why Microsoft had to produce VB.NET. However, VB.NET is not VB (given my background I am tempted to write VB.NET != VB, but in this context I guess I ought to write VB.NET <> VB). I was trying to point out that VB.NET is VB only in name. Some people have interpretted my comments as being from a disaffected VB6 programmer. But they are very wrong! I have written two books on .NET, one on Managed C++ and the other on C# and Managed C++. All of my COM books are C++ books. I wanted to point out that there was a huge chorus from VB developers that they didn’t want their language to be replaced with something totally different, and yet Microsoft did not listen to them.

    Let’s come to the issue of the EventLog. In the past I have written a lot of C++ code to use and manipulate the NT event log. The API was inherited from OS/2 and it is a little arcane and was in need of a replacement. I wrote several articles about programming the event log using the Win32 API and one of these was in the MSDN library. Essentially, the application provides a resource only DLL with format strings that have placeholders. These format strings are localised. The DLL is registered on the machine that reads the messages. The application merely has to provide the ID of the format string and the strings for the placeholders. The advantage of this mechanism is that the event log files are kept small and that *localisation is performed by the reader*.

    The usual configuration is that when an event log file fills up it overwrites old messages, so it is important to make sure that the relevant messages in the log are read before they are overwritten. If the messages in the event log are large then you have less chance of doing this.

    However, the localisation aspect is the most important. I worked on the error reporting in a distributed application used at 500 sites (something like 5000 machines) in several countries across Europe. Using the event log a machine in France, for example, could log a message and the user could read it in French, when the event log files were sent to the support centre in England the event messages could be read in English. How elegant is that?

    Now let’s look at how System.Diagnostics.EventLog does this. Well it provides a single resource DLL *for all applications*. This DLL has 65,000 format strings that look like this: %s, that is there is just one placeholder so that the application has to provide the entire string. This means that the messages are long (which brings up the issue of event log files filling up) and it means that localisation has to be performed *by the application*. Note that no crystal ball is provided. The application has to guess the culture of the reader, and by default the current locale of the application is used. So in my distributed application that would mean that the messages would be reported in French, and I would not be able to read them in English. The application could chose ‘culture neutral’ strings (ie US English) but that would mean that the French users would not see the message in their language.

    The .NET EventLog class does not use the event log the way that it is designed to work. FYI it works in *exactly* the same way as the equivalent class in VB6, which makes me suspicious as to whether the C++ code used in the VB6 runtime was converted to C# and recompiled. I filed a bug about this in the beta and got a dismissive response from the developer stating that people have large hard discs and so could use large event log files. This showed a lack of understanding about the event log. In Whidbey, the EventLog class has been extended to allow you to use a message format DLL, but the damage has already been done.

    To be frank, I was very experienced in writing code using the event log and I eagerly anticipated what .NET would do, but I was highly disappointed that it just did the same as VB. I have had similar disappointments throughout the framework library, but I have also had some pleasant surprises. For example, anyone who has written any performance counter code knows that that API needs replacing too, and the .NET classes have done this extremely well. I have studied these classes using ildasm and I have marvelled at the way these classes work – the developer clearly knew what s/he was doing! It’s sad that the same could not be said about the developer who wrote the EventLog class.

    Of course, if you had emailed me before writing your blog I could have explained all of this to you 🙂

  15. Daniel Moth says:

    Blog link of the week 08

  16. You know, at the very least, Richard has a point, several good ones. I think the concern Microsoft should take is that Richard was pro-.Net and seems to have gotten fed up with the shortcomings of .Net. I really like Dan’s responses to Richard but it seemed a little defensive.

  17. Sorry for the off-topic post, but I had a question and found this blog and am hoping I can get a quick answer. As a home PC user, can I delete the .Net framework program from my computer without impairing its operation? I need the 40 mb of space. Thank you for indulging me.

  18. Richard,

    I appreciate your candid feedback and thank you for responding in the comments. The reason I responded to this in my blog was because someone sent me the DDJ link and they interpreted your remarks as saying Microsoft isn’t using the .NET Framework. I tried to clearly indicate that the blog post was my opinion (I said it was “my response” 10x) and not Microsoft’s and more importantly I wanted to keep the content both factual and objective. If I offended you or if my response came off as rude or defensive, I apologize.

    Thanks,

    -Dan

  19. FYI: Seems like the eventlog will be fixed for Longhorn :). See [1] for some info about it.

    Btw. Microsoft Speech Server hasn’t been mentioned here, but that is a recent new product based on .NET. From [1] "For the last two years, I’ve been the dev manager of the Microsoft Speech Server, a brand new server product for voice applications, written nearly entirely in C#."

    [1] http://blogs.msdn.com/karstenj/archive/2004/04/12/111907.aspx

    [2] http://blogs.msdn.com/scottwil/archive/2005/01/13/352574.aspx

  20. windoze says:

    Microsoft needs to stop pretending they are the best and brightest at EVERYTHING they do. Microsoft needs to be more humble and admit your product’s faults and work on them. Make products that are easy to use and build, and try not to hijack every application you find that is useful.

  21. Jon Dowland says:

    Picky, I know, but

    for(int i = 0; i < 10; ++i)

    .. is C99, not ANSI C.

  22. Dave says:

    ————-

    for (int i = 0; i < x; i++) {…}

    Guess what language it’s written in? If you said either C, C++, C#, and Java, then you are correct.

    ————-

    How is that C? C++, C#, and Java maybe but C?

  23. Please learn the difference between then and than. Nothing drives me crazier _than_ when I read an otherwise well written article that insists on misusing the word "then" throughout.

    Unlike then, than is not related to time. Than is used in comparative statements.

  24. Ah, blogs, at least they are good for a laugh.

    How about MS ports the clr to a platform other then Windoz? Then maybe all of this chatter would be worth it. As it stands now, how an MS only dev tool developed on an MS only platform…. get with the times.

  25. Chris says:

    for (int i = 0; i < x; i++) {…}

    Guess what language it’s written in? If you said either C, C++, C#, and Java, then you are correct.

    — actually, this loop doesn’t work in C…

  26. retroman says:

    Oh come, just let Mr. Grimes say farewell.

    Who cares? People are doing .NET and people are doing Java.

    People are doing whatever makes sense at the time or what the customer requires.

    Sometimes that’s .NET. Other times it’s Java.

  27. Mark Munz says:

    Sadly, the responses indicate how out of touch Microsoft is with the needs of their developers.

    First, you are being picky by claiming 23.7MB vs. 25MB. Although I don’t think 25MB is a huge download these days, the problem lies in MS not pushing the framework onto machines years after it’s release.

    The fact that Microsoft has NOT pushed .NET frameworks onto Windows machines lends to the lack of credibility in Microsoft’s claim that .NET is the future.

    You talk about the server-side installation and what not, but client side deployment of the .NET framework is crucial. Not every app is going to be server-based. Desktop applications are going to be the norm for a very long time and ignoring that fact will not make it go away.

    Putting the burden of redistributing the .NET framework on the application developers is unprofessional for an OS company. And fear of taking some flack for including the .NET framework in a SP has got to be the lamest excuse I have <b>ever</b> heard.

    You claim "damned if you do, damned if you don’t" — well, if you’re going to be damned and you believe that .NET is the future, you should have "done it" (include .NET framework in an SP).

    So smaller developers are left telling their customers — yes, our application is 1MB, but you have to download a 25MB framework first. That’s right, you have to download and install a component that is 25 times the size of our application in order to use our application. The result, we — the smaller developers — are the ones who look unprofessional. Thanks Microsoft.

    I believe it is the same criticism that MS got for not pushing the VB runtime and apparently the lesson was not learned. It is a major reason why many developers are avoiding .NET. Yes, there are .NET apps, but the fact is if MS would have pushed the .NET framework on users a year ago, you’d have an order of magnitude more applications using .NET.

    The truth is that it is mainly Microsoft’s own fault that .NET is not more widely used today.

  28. After having read both Richard Grimes’ and this Dan’s texts, I think the main problem is marketing vs. engineering.

    Of course you need a certain amount of marketing, no debate about that, however I think it’s plain wrong to let marketing do engineering decisions (like creating VB.NET for example).

    This all reminds me of the old days’ IBM, engineering brought the company to the top, but then the marketing took over and nearly ran it into the ground.

  29. DS Blank says:

    If you are going to be too picky, you should also be correct. 23,698K != 23.7MB. A megabyte is 1024 kilobytes. Therefore 23,698K = 24,266,752 bytes. So, you could say 24.3 million bytes. Or, you could take 23,698K and divide by 1024 and get 23.1MB, which is the proper method and more to your point. But if I were going to round that off, I’d still say it’s about 25MB.

  30. Eric says:

    Anders needs to go back to Borland so can write some good cross-platform stuff.

    He is wasting his talent at Microsoft.

  31. J. R. Hodel says:

    You say that Richard "implies that the .NET Framework is a replica of Java" but what you must really mean is that you infer that this is what he is saying. You are allowed to infer what you wish from his words, but attempting to redefine his statement by telling us what he implies is out-of-bounds!

  32. Alex says:

    Regardless of whatever technical credentials you may have, you’ve committed so many rookie spelling and grammar mistakes that simply from a communication standpoint you’ve lost all credibility with me. Perhaps you relied on Word’s spelling/grammar checker alone. I suggest you start by learning the differences between then/than and your/you’re.

  33. AndyB says:

    I think Richard has 2 great points: firstly that the .NET framework isn’t perfect, secondly that the MS people jump up and defend it regardless of the argument.

    When .NET was first announced, I remember the discussion about deterministic finalisation and how the finalise mechanism in the GC was flawed (being heavily based on the finalisation hack that Java was forced to implement). At the time I recall lots of people simply arguing that reference counting was so poor, and that GC was so great that finalisation was a small price to pay. Now C++ (at least) has a proper system for DF, I suppose those people who were loud in the lack of DFs defence are now saying how great this is too.

    Other big design flaws I remember: reflection and how metadata was exposed to all. I consider reflection to be useless feature compared to others that could have been implemented instead, but still in it went, despite all the people complaining (rightly) about reverse-engineering issues. MS’s answer? Simply to implement another Java solution that still isn’t as good as not exposing the full metadata in the first place.

    And of course, the VB.NET not being VB; I used to think the development languages were well suited to different tasks – VB wrote GUIs that cnnected to C++ back-ends. Now in .NET its C# (otherwise known as Java to many) that matters and the other languages seem little more than a side issue.

    Oh yes, and Avalon v Windows Forms – I think we’re still unsure which one we should develop for, whether WF will be obsoleted by Avalon or not. All this drive for new technology isn’t helping us at the coal face who have to use it and support it 5 years into the future.

    So, I think Mr Grimes is right in his criticism, and I’d like to see the .NET ‘fanboys’ stand up and say what they think is wrong from the whole design and implementation of .NET. Only if we all do this, will MS take notice.

  34. Z says:

    > Sharepoint Portal Server is fully written in managed code

    Might be why it’s so dog slow…

  35. Bob says:

    I have been a java developer since JDK 0.9 through an early adopter program. I am not a .NET guru, but follow the progression. I say this because, I could replace .NET and C# with JDK and Java in Mr. Grimes’ article. I cannot speak to the strengths and weaknesses of .NET. But Java or any platform has strengths and weaknesses. The ability to repair broken classes and the time involved is a problem in java as well. I’ve been blown off by JDK platform developers numerous times.

    The knock against Microsoft for making a product platform decision is outright ludicrous.

    My advice to Mr. Grimes would be to work on a product program for a few years where his career is dependent upon annual releases with new features. Personally, I don’t care if the Office Suite is built on .NET or not. I just care that it works. If it were all written in VB, or assembly I wouldn’t care, provided it works. Is he not familiar with JNI for legacy wrapping in Java?

    I applaud any effort that works towards making development easier. .NET may not be perfect, but neither is Java.

  36. Anonymous Coward says:

    Don Box said Indigo, part of Longhorn, is fully written in C#:

    http://pluralsight.com/blogs/dbox/archive/2005/02/06/5596.aspx

    QUOTE:

    In looking at the Indigo code base (which was 1123 C# files as of early last week), only 19 of them use the unsafe keyword. Every single use was to do buffer manipulation, either for low-level XML cracking, SSPI munging, or async I/O buffer management.

  37. Dear Mr. Grimes,

    Thank you for sharing your opinions on the overall state of .nET in your view. I am now left wondering what you plan on writing about in your future columns pertaining to Windows programming? COM/COM+ is not an option as well as any other antiquated technologies which were absorbed by .nET. Are you resigning as a writer for DDJ? Will all your future articles become focused on Java? You do realize that any attempt to write about future Microsoft technologies will only result in either directly or indirectly referencing .nET technology and implementation. I am truly interested in your thoughts on this…

    Thank you for your thoughts on all of this!

    Sincerely,

    A Concerned Developer who values your opinion…

    p.s. Will you be offering a refund for anyone who purchased your book "Developing Applications with Visual Studio .NET"? Do you sincerely believe you "earned" your money for the work you put in this publication? Based on what you feel about the overall Microsoft framework it seems you also were merely feeding on the hype of the development masses at the time this was released. This is my opinion, in the least, which is collectively shared by hundreds of thousands of readers who purchased something you put your name upon! Furthermore, I will think twice before buying anything which has been authored or co-authored by Richard Grimes, unless you can give me a reasonable doubt to explain your wishy-washy attitude on your development teachings. Please explain yourself Mr. Grimes…

  38. Python Guy says:

    You .NET guys sure are fun to observe. While you waste time debating how lame your tools are, we Python developers get actual work done!

  39. Francisco says:

    [ds]A megabyte is 1024 kilobytes.

    No it is not. Mega is a SI prefix indicating a thousand.

    A megabyte is 1000 kilobytes, a kilobyte is 1000 bytes.

    You are confused with Kibibytes, which is the binary prefix for 2^10 bytes

  40. rnd() says:

    Richard: Nobody is forcing you to use .NET.

    I think the underlying issue here is that Microsoft believes that the best way to leverage its platform dominance is to make it _as easy as possible_ to create great apps for the platform, and that’s where managed code fits in.

    Most people cannot write rock solid c++, and most apps don’t need to be written in it. Thus, Microsoft may decide to use c++ and unmanaged code for OS creation for performance reasons, and will need to spend lots of money on additional QA, code review, etc., but that is a tradeoff that a huge company can handle, not hypocricy.

    The great thing about VB was that anyone could quickly and easily write an app that was easy to use and leveraged a lot of the win32 functionality. For 90% of apps, that’s all you need. .NET is a revolutionary step for Microsoft based on the success of VB as a way of helping developers write great and useful code, period.

  41. I think .NET thinly wraps the underlying Windows API so that .NET developers can do anything Windows can do. Whenever there is something missing from the .NET framework (anything from making a simple beep to more complex things), you see people either complaining about it, or posting DllImport wrappers to show how to access it.

    I think Grimes is right, C# is a copy of Java, except that the class library is more like a wrapper to the Windows API instead of a portable class library. But that seems consistent with a strategy of keeping existing Windows developers and recruiting more developers from Java land. This may give Sun plenty of reasons to be pissed off, but not .NET developers.

    In my opinion, the biggest limitation of .NET is the estranged relationship between Sun/Netscape and Microsoft. Microsoft should settle with Sun and work on a better way of running .NET apps with any browser, not just IE. Microsoft should donate to the Mono project too, because without Mono, I wouldn’t even be using .NET. Otherwise what would be the point of developing an application that could never work on any other platform?

  42. Sahil Malik says:

    The question is – if not .NET, what is Mr. Grimes gonna do?

  43. Curmudgeon says:

    <curmudgeon>

    With all due respect, this whole debate points up the reason I prefer Unix and Linux to Windows *or* Macintosh (pre-OSX) — frameworks (.Net, MFC, Java, or app/management frameworks like Tivoli) all start out elegant when they’re just off the drawing board, and then they grow and mutate like cancer cells in a petri dish full of benzene. It’s better to put your IT dollars into hiring really good people and keeping them happy than it is to shovel them into a product that promises ease of use and upkeep and then requires another truckload of money to hire roving drones to clean mouse balls or muck with registry settings. The clearest proof of this is only as far away as the nearest Borders or Barnes and Noble – how many books for Windows users are there on a shelf versus how many for Mac or Linux users? And of those, how many are "introductory" or "teach yourself in 14 days" or "for idiots"-level books, versus how many are really substantive books that aren’t overinflated with wizard screen shot sequences and instructions for those who can’t follow the pictures?

    </curmudgeon>

  44. I wanted to respond to some of the points brought up.

    .NET Fx size – Correct, my mistake. I goofed and didn’t calculate this correctly. The point was that .NET isn’t "many times" larger then the JRE.

    Grammer mistakes – My bad again, I wrote this quickly in-between meetings and didn’t use any spell checking tools.

    for loop in C – As someone pointed out, it’s C99, but not ANSI or ISO-compliant C, but I never actually specified in the text…

    -Dan

  45. Matt Sipes says:

    This is a complete joke. .NET IS NOT JAVA. Nor is it even close to Java. If I had time I could easily refute any accusations or examples of someone trying to compare the two! I have been developing in .NET for 2 years now, and by far exceeds c++ or java in everyway. It keeps costs down, coding is faster, dll hell is gone, more extensible, no more memory leaks and type safety is preserved. Every coding framework will have its problems, but what doesn’t??? Stop looking so deep into you Microsoft Bashers and realize that this will revolutionize the way we code.

  46. A.) How long will people keep complaining that 25MB takes too long to download over dialup? Don’t use the latest software if your networking solution is a decade old.

    B.)Is whining really considered good engineering? Go work for Microsoft and redesign the framework if it’s that bad.

    C.)This all sounds like an attempt to get people to actually read DDJ.

    – just a hack writing commercial software in C#.NET

  47. TLMatters says:

    As a former Java developer, I must tell you that I have fallen in love with .NET over the last year and no longer develop in anything else.

    It has some warts, that’s true. But given the alternatives I’ll take C# and .NET development over any of them.

    To date we have completed many small and large projects with .NET and are very pleased with the results. These projects could have been coded in Java, but because they are heavily graphical the end user experience would have been like a circus clown on Demerol… perhaps interesting to view but the performance would have been a non-starter.

    If you wish to develop for and sell to the largest installed base, you are talking MS Windows. If you wish to shake free of the 1960’s hell that is c/c++ syntax and nomenclature, you have two real choices: .NET and Java. If you wish to have native to near-native performance, you have .NET.

    I never thought I’d say this, but ‘thank you’ to Microsoft for delivering on this. It has opened up the Windows platform to me without making me step in MFC.

    titanlogic@yahoo.com

  48. Dan,

    Having delivered BOTH .NET and Java applications in the past, let’s start by RE-CLARIFYing some things. When Mr. Grimes says in one statement…XYZ, and then in the other he says ABC. What classes in logic did you take that led you to infer that his statements pointed at an either/or scenario ? His statements were PERFECTLY valid. Hell, I happen to agree with them. When I first encountered .NET in 2001, it looked like Java, it SMELLED like Java ( and this coming from a Windows person….I still have my Windows 1.03 SDK diskettes, where are yours ? ). I remember WFC, and I’ll be darned if some of System.Windows.Forms didn’t bare a striking resemblence to some of WFC. Looking at System.String is almost like looking at java.lang.string. Which oddly enough, implements "Serializable, Comparable, CharSequence". Hmm…..smells almost the same.

    Too bad you can’t copyright API’s ( Oh wait some of you did ! ), because otherwise "String(" ").trim()" might be in trouble. ( Don’t trounce on me for that code, it’s called an example. Silly one, yes, but still valid. )

    [df] I agree with you, as far as teams developing software at Microsoft, Office *client* software is one of the slowest to adopt .NET.

    And why do you think that is, Dan ? JHC ! Could it possibly be because they aren’t totally sold on it’s "necessity"? Of course they aren’t ! Bill ( and Richard’s ) point are 110% on the money. Why does MS always have to respond to calls of questioning it’s decisions with either blatant denial ( or even plausible deniability ), and counter accusations ? Get real, Dan. I like C#, hell, I love it. Anders is finally letting me do some things he didn’t get quite right in Borland C++ Builder ( What ? You didn’t think all of us forgot where he came to MS from, did you ? ).

    Which brings me to another point. The fact that MS has made C++ languish far behind C# and VB.NET is another valid point of Richard’s.

    When I first picked up VisualStudio.NET, immediately I realized, "Managed what ?", "C++ is now what ?". Yes, I can see how some lamebrains might need the hand holding. And so I plodded along (single file implementation, disgusting. At least with partial class support coming in 2005, someone wised up). Still, other than perhaps some more low-level stuff Managed ( more often referred to as "Mangled" ) C++, is pretty useless. There was ZERO support in the IDE for creating Window Forms or ASP.NET pages with C++ based back code. I mean, c’mon, you went from MFC, to ATL ( VB <-> ATL ? Yeah, right. ), to WFC to " " ? And you expected the more hardcore developers to take this seriously ? Still you can’t ignore change, and bills still have to get paid. Nevertheless, it was a jilted like feeling that MS "copped out".

    Changing the subject to a matter of packaging and delivery ( a subject a certain person by the surname of Lucovsky <God I hope I spelled his name right> has had a fair bit to say about lately ). Stop requiring the developer to ship the framework. If you think it need to get out there that badly then ship it as part of the OS. If you think that it’s as inscrutably unremoveable as IE from a Windows product distribution, then SHIP the thing with it. Do you ship the new XP SP 2 Upgrade/Full Retail CD’s with .NET as a requirement of the install ? Let me answer that for you…NO. You CAN install it, but it doesn’t install it of it’s own accord, in those cases where it’s in a retail box, the same excuse that customers ASKED you not to ship it, don’t really apply. Most folks buying a retail package have the mentality, "Oh, it’ll install what I need."

    Most people don’t really go through the process of picking and choosing things. C’mon, this isn’t the late 80’s and early 90’s where people were actually concerned about how much disk space something took up. GMAB. As long as you leave enough space for their pictures,music and movies, with a good dollop left for email and possibly games, the average user wouldn’t bother THINKING about what gets installed. Haven’t you ever heard of Kim Komando ? Take a listen to THAT radio show. Those are the types of users that are en-masse the bulk of your client desktop installations.

    Sure, more and more of them are getting broadband, so they "could" download the framework if necessary. But why should I either have to ship dotnetfx on MY CD, host it on my dload site, or bother to make my install project suck it down and install it ? Have I had to do that, yes ? Did I LIKE having to do that ? No. Should I have to do that ? No. Are you being defensive ? Yes. But, most importantly, are you LISTENING to developers in these respects ? The jury is still out.

  49. swain says:

    I would like to ask again about a point:

    How many applications for the massive public are now written in .NET? I count a small size… some RSS readers… (but Pluck not)

    Regards,

    swain

  50. Kris Bravo says:

    Amazing that you refer to a url like this:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpqstart/html/cpsmpnetsamples-howtoremoting.asp

    with 9, count’em, 9 lines of text as documentation for the use of interfaces. Even the link in the text point to a mere 20 lines of code.

    And your response regarding "On the Design of the .NET Framework" misses the point that grimes was making about vb.net being win32 wrappers and C# being Java.

    Your blog post simply rewords Grimes states to dumb them down, then you refute your rephrasing. Hardly a response to the original article.

  51. Master Chef says:

    Where is all of this headed? Sure the .NET framework certainly has issues – just like any of the other programming approaches we have all tried. Couldn’t we level similar criticism at J2EE? C++?

    This article is a diatribe. I’m not sure why Mr. Grimes has an axe to grind – but clearly he does. He suggests more emotion than serious reflection. He covers a laundry list of topics, in random order, with few suggestions for alternatives or improvements.

    So – he can go back to writing ATL books. Or calm down from whatever set him on this path and write a better critique. Cheers either way.

  52. greggypoo says:

    Dear Dan Fernandez,

    You work for Microsoft. Surely you cannot afford to get worked up every time someone points out that the way you earn your living is by producing/managing/promoting/releasing runny poo.

    Cheers,

    – Greg

  53. Richard Grimes, a Microsoft MVP since 1999, wrote in an article in Dr. Dobbs that he was quitting on .NET, the MS latest iteration of their programming Visual Studio. From his website, From the start of 2005 Richard has decided…

  54. Jeff Grabell says:

    > for (int i = 0; i < x; i++) {…}

    I don’t think Richard was referring to control structures or say, the presence of the semi-colon. Rather, I suspect he was, as I, floored by the consistent duplication of core APIs. When I wrote my first C# application (as a Java developer), about the only thing I had to look up were the new import statements to find classes that had very familiar method signatures.

    I think these two remarks of Richard’s can best be summed up as saying that the framework is a thin layer on top of the "same old" underlying API calls, modelled on the Java development platform and its APIs. I trust Richard’s opinion as to the "thin layering", and my own experience as to the "this is Java" aspect.

    Richard probably has an axe to grind because he seems to have been more devoted to the .NET platform than MSFT. As an ex-Tcl/Tk developer, Tandy computer owner, and ex-IRIX platform developer, I don’t take these fashion swings too personally anymore. Frankly I was happy to see the platform resemble Java, my thinking was "I won’t have to learn too much to be useful in C#" and that was true.

    Cheers,

    Jeff

  55. size queen says:

    While we’ere being picky, doesn’t 23,698 * 1024 = 24,266,752? So like 24.3 MB, not 23.7 MB (or 25 MB for that matter).

  56. Maybe I’m being too picky, but j2re-1_4_2 is 14,872kb and jre-1_5_0 is 15,444kb…

    When you say "why would we re-write perfectly good code?"… I wonder how much of VS6 got reused in creating VS.Net. Can you tell us?

  57. Jaded Cynic says:

    One thing becomes clear when reading "Responding to Richard Grimes article on .NET." DF has to get really technical about his responses to refute many a thing in the Grimes article and if you read the Grimes article really seems to respond out of context in places. It’s too bad Grimes is out of the .NET arena, maybe we could have a re-response that spawns a re-re-response and argue about how awful .NET is or isn’t until the end of time.

    Frankly, I am pretty much apathetic to .NET this point and have decided that if I do learn anything MS, it will be unmanaged Visual C++, MFC and ATL. Why? Because doing some things in .NET and C++ seem to be equally agrravating to me — if I am going to learn something convoluted, it may as well be C++, which is not going anywhere and can work on more than just Windows. C++ is based on standards outside of MS’s control. Microsoft can’t up and change it without outcry. If Microsoft drops support for MFC and ATL, I can always use the standard library and turn my attention to other platforms.

    One language that has piqued my interest for client development is Python. I’ve only dabbled (I wish I had more time for it), but what I’ve seen I’ve liked and it is free. It may be interpreted, but you can include the interpreter as part of an executable package so it looks and runs like an executable. With Tkinter, you can target both Windows and UNIX with pretty much the same code. And really, so what if it’s interpreted — it’s not like your P4 these days doesn’t cost a tenth of what a home computer or workstation cost just ten years ago.

  58. — for loop in C – As someone pointed out, it’s C99, but not ANSI or ISO-compliant C, but I never actually specified in the text…

    Way to look like an ass. With all of the comments asking why an MS employee can’t just admit fault, instead of a simple "You’re right, I made a mistake" you claim righteousness on a technicality.

    If you can’t admit such a simple mistake without becoming evasive, how can you be trusted to objectively look at larger issues?

  59. Please use correct grammar. You used "then" in many places where you should have used "than."

  60. Kune says:

    for(int i = 0; i < 10; ++i)

    is neither K&R C, C89 or C99. C99 allows the definition of variables inside a block, but not inside a for-loop expression.

  61. Brandito says:

    As for the future of windows development, I am not sure… but I do know it is not .NET. I am currently attending an engineering university. They put .NET on all of the lab machines by default. Most of the students that I have talked to actually use VS6 on their home machines. Many corporate projects that a few of the students (and myself) are working on are all done with VS6. Since the student body will eventually graduate and eventually dictate what their company uses for software development… I can almost assure you it is will not be .NET. If other popular comp. sci. universities are like ours, I’d say that the future lies in open source development, open standards, and cross platform compatibility.

  62. mmeister says:

    With the productivity gains that .NET is supposed to give, I don’t understand why MS is not using it more internally. It seems that part of the reason .NET isn’t better is because MS is not forcing itself to use the framework in many real-world applications (not just add-ons, but from scratch apps).

    In the 90’s Apple used to provide developers with a set of APIs and then all their internal applications used completely different mechanisms to provide great features. With OS X, Apple decided to eat its own dogfood and the result is an API that is much richer for the developer and tools that work extremely well.

    I think MS should take a page out of the Apple manual and require plans to tightly integrate .NET into every application. You can start off with add-ons, but you have to take it further than that.

    Using .NET to implement Outlook would definitely show you the weaknesses in .NET. You can then fix them and show Outlook as an example of implementing a full-blown application in .NET.

    But I don’t think MS will do that. I think that’s the reason they don’t install the .NET framework by default. They don’t seem to have any confidence in the .NET platform, at least for serious applications.

  63. Joel says:

    C# has one major advantage for me: it looks like Java. This makes it easier to train C# developers on Java, which is great for getting apps to work on many more platforms: Linux, BSD, Solaris, Mac OS, pretty much any major Unix.

    Question 1: if customers have to download more than 20MB for .NET, what’s a smaller app supposed to do– require Windows Update? Or download it during install? Or…?

    Question 2: the C# and .NET developers claim that native speed is the reason to use these. But now Java is faster– on the server, and on the desktop. Have you tried Java 1.5 and the IBM Eclipse GUI SWT components? Very fast. Java Hotspot can optimize on the fly, faster than native code. So how does .NET respond?

    Question 3: Richard raised many points about Microsoft marketing, and you state many times that this blog is just your opinion, not official. Can you get us any kind of more official answer about this, in particular the download sizes, Avalon XAML plans, and the Win32 wrappers that Richard seems to know quite a bit about?

    Chers, Joel

  64. I too have bailed on Bloatware.NET. Nobody is waiting to have to learn new stuff, when clearly there’s Java, it’s been there, it is there, it will stay there and there are alot more jobs with better pay for them. I’m tired of M$ pushing half-finished technologies every year, so we’ll upgrade and companies spend millions on retraining their people, only to find out it sux.

    I tried both, I’m going with Java for managed cross platform code, and will stick to C++ for professional code. .NET is more cattlefeed for .VB people, who are capable of gluing things together and be a VB programmer for years without ever really understanding the very OS or platform they’re dealing with. Seems like for any decent functionality, you have to import half the win api from dlls, so that you might as well just code C++.

    I loooove C++. Been around a long time, best invention ever. .NET will soon be replaced with .NET+ and .NET+2 and before Intel has finally come to the end of moore’s law. Seems all these layers of abstraction are only necessary to hide the clunky code below it.. like security patches, making PC’s once incredibly fast and now extremely slow.

    The sloppy use of code may not matter on fast PC’s, but the only ethical profit in life, is energy efficiency. Not of fat people like us, but of equiment. Layers of abstraction is great, but only if each layer does what it is supposed to do the most efficiently and accurately.

    .NET is not open source. I’ve dug deep through MFC code, to figure out bugs and learn to work around them. Or simply do things better. Net is the best of all worlds.. you can choose good code supported by universal standards, not monopolies only, and write quick and dirty and not give a rip because customers are too stupid to demand better. I for one am not going to be bullied into adopting .NET. The day the framework ships with the OS, is the day I will permanently abandon windoze and redefine my identity as a mac user and developer, and focus on linux. Ignorant customers buy into anything from M$ and are easy to pluck financially, but at least I’ll have some control over my life.

    I’ll probably build a website with ASP.NET, hack some VB.NET and put C# on my resume, next to nose picking (and cursing). But if I ever have a choice, I will decline.

  65. spycker says:

    You guys ever note how reporters have a way of asking questions of politicians that in their heart of hearts they hope will affect public policy. Like they are pontificating or something. Its poor, useless reporting in the end.

    Richard Grimes has a hidden agenda. As does Microsoft. They just think we consumers are too stupid to read between the lines. Thats more annoying than anything else.

  66. anonymous coward says:

    How is c99 not ansi or iso compliant c?

  67. Sima says:

    for (int i = 0; i < x; i++) {…}

    Actually this would not be C code since declaring

    variables in arbitrary locations is a feature of C++.

  68. XP user says:

    "Maybe I’m being too picky, but the size is 23,698K or 23.7MB"

    I just installed the .NET framework because some freeware required it. Then, Windows Update wanted to install a SP1 for it. Which was an extra 10 MB. Why didn’t Windows Update show that SP1 version right away?

  69. …Grimes makes important points; but to me they don’t remove the biggest benefit of .NET which is developer productivity. I also found myself thinking "but what about Mono?" …

  70. steve-o says:

    which clr are we event talking about … due to SP1 changes, presumably around the SWC functionality (services without components), the CLR is now forked AFAIK … there is CLR SP1 for .Net and there is CLR SP1 for 2003 Server … this certainly underscores Richard’s point on wrapping native libraries … on that subject, when will COM+ die and be replaced with a .Net-based component transaction manager? This is an area where the J2EE stack is stomping the MS technology stack … look at what JBoss & hibernate are doing…

    server 2003

    http://www.microsoft.com/downloads/details.aspx?FamilyId=AE7EDEF7-2CB7-4864-8623-A1038563DF23&displaylang=en

    7982 KB

    other os’s

    http://www.microsoft.com/downloads/details.aspx?FamilyID=a8f5654f-088e-40b2-bbdb-a83353618b38&DisplayLang=en

    10453 KB

  71. .Net Wannabe says:

    "Grammer mistakes – My bad again, I wrote this quickly in-between meetings and didn’t use any spell checking tools."

    Oh, the irony! "Grammer"? How about "grammar"?

  72. moo says:

    http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS%2FISO%2FIEC+9899%2D1999

    please educate yourselves before you make comments on a perfectly fine line of code.

    for (int i = 0; i < x; i++);

    is c99 and c99 is ansi c

    gcc -std=c99 this code to even test. (-ansi flag is not default to c99 yet, people need _some_ time to catch up!)

    heck

    for(int i=0, x=10; i < x; ++i); is also perfectly legal ansi c as of c99 instead if you didnt declare x to say 10 before the for.

    So please avoid making comments you know nothing about, because they cascade and then next thing everyone starts saying the same damn thing.

  73. Curtis says:

    Cross platform interfaces are what I love. And .Net is not cross-platform. Not like ANSI or POSIX or GTK or QT. Or the SDL even. The huge system classes would be hard to port and likely to not be 100% compatible. Aren’t there patents on .Net, also?

  74. You know, Dan, your statement about the "for" control structure was downright silly and misleading.

    You know very well Grimes wasn’t referring to basic loops structures like "for." It’s the duplicated API and functionality. .NET looks and functions very much like Java, from the object-oriented nature of the language to the idea of intermediate code. I can duplicate Java programs in C#/.NET by simply changing some of the namespaces and such.

    So much is similar in idea and function that for you to single out a "for" statement is ludicrous. Instead, you should be embracing the Java heritage of .NET and saying you build on it and improve on it. Denial is just off-putting.

  75. Siddhartha says:

    for(int i = 0; i < 10; ++i)

    That’s defn not C++ and Java, no idea about C# but defn not C. I don’t see how this logic contradicts Grimes.

  76. lurker says:

    Anyone else notice how the blog entries before 3/7/2005 have some intelligence about them and the ones since that date are 90% pure garbage? (quibbling over the size of a kilobyte, C99 vs ANSI C, grammar police, mindless Microsoft-bashing, and other such nonsense)

    I wonder why that is. Could it be because this 3/7/2005 slashdot article?

    http://developers.slashdot.org/article.pl?sid=05/03/07/078245&tid=109&tid=156

    Naah, that couldn’t be it.

  77. Maybe Richard could write all the ‘for’ loops for us.

  78. Jim Powers says:

    As with many Microsoft initiatives there is a kernel of goodness, but many layers of badness. Take for instance the NT kernel, a pretty decent one, but the layers of Win32/COM badness that has been heaped on it really sours the milk.

    .NET has the same issue: The IL and basic run-time are pretty decent, nothing groundbreaking, but then there is WFC (yet again imposing the VB mindset on people) and ASP.NET bringing all the badness of VB to Web programming.

    Mr. Grimes’ main point is clear: *some* of .NET is well thought out, *much* isn’t, the rest is just Win32 in sheep’s clothing.

  79. Museums, reading, book orders, article, me, web.<br>
    Poll: book delivery? <br>
    Museums Went to see Africa Remix, (pics, lots of pics) the contemporary African art exhibition at the Hayward Gallery. Dunno what everyone’s got against the Hayward: OK its neo-brutalist exterior isn’t exactly to everyone’s taste, but it’s…

  80. Why don’t you all just stop arguing and go buy Borland Delphi 2005. It does it all! It still creates wonderful Win32 apps that we all actually use, instead of .NET (cr)apps that nobody uses!

    Delphi executables are self contained! No "virtual machine" "pseudo-compiled" "interpreted" code. Every VB program I’ve ever seen looks looks like a Win 3.1 app, yuck! Grow up people, get real, get Delphi!

  81. Jim Frost says:

    Dan writes:

    <i>In the first he implies that the .NET Framework is a replica of Java, but in the next statement he claims that the .NET Framework is simply ported Win32 classes, Windows Foundation Classes (WFC), and VB runtime classes. Which one is it?</i>

    These are not contradictory at all. If you take the intersection of the JDK 1.1 libraries, sans AWT, with the same kind of thin layers of code over Win32 that were in J++, with some new stuff for XML management thrown on top, you pretty much come up with .NET’s library package.

    There’s really no arguing that a whole lot of the core of .NET is derivative of Java. It’s not just that the CLR is darn near a clone, it’s that probably 70 or 80% of the JDK 1.1 classes are in there, identically named, with identical interfaces excepting capitalization. Once in awhile (like in the case of Object) there are some minor differences, but overall it’s very, very Javaesque. All I had to do as an experience Java hand to become reasonably effective as a C# programmer was learn where in the library the classes moved to and change my capitalization style.

    I don’t consider this a flaw by any stretch of the imagination; JDK 1.1 offered a lot that was well designed.

    Similarly Mr. Grimes is certainly correct that a lot of the .NET libraries are real thin layers over Win32 libraries, and often not very well thought out. That too seems to be a relic of the move from Java to .NET, as many of these interfaces were first written for J++. The delegate concept came from J++ and was there purely to make the job of exposing Win32 features easier. It is, unfortunately, a very poorly considered idea that weakens the type interface and provides no actual advantages over defining an interface for the signature. It’s rather a shame that it survived into .NET; we’ll never get rid of it now.

    There are a lot of new things in .NET too; I particularly like the improved higher-level protocol support and XML support offered by .NET versus Java (or, really, anything else I’ve used). But it’s not true that .NET didn’t borrow very heavily from things that came before, and not always to its benefit.

    But all of these things are just nit picking. It’s still a nice platform. Now, if you want to complain about the real limitations in .NET, it’d have to be that it is Windows-centric with what that implies in terms of manageability and scalability. That is, I realize, a benefit from Microsoft’s point of view but does mean that there are a lot of applications for which it’s impractical to use .NET.

    jim frost

    jimf@frostbytes.com

  82. Vishal Sah says:

    Still working on the response after so many days ?? How many months more are required ?

    2/24/2005 6:33 AM Dan Fernandez

    Ryan, Jay Roxe, the Visual Basic Product Manager is working on a response. It should be posted on his blog soon, http://blogs.msdn.com/jroxe/

    Thanks,

    -Dan

  83. "A megabyte is 1024 kilobytes."

    Officially (in the U.S.)? No, it’s not.

    Officially, a mebibyte is 1024 kilobytes. A megabyte is 1,000,000 bytes.

    http://physics.nist.gov/cuu/Units/binary.html

  84. GoMaster says:

    > Sharepoint Portal Server is fully written in managed code

    This is simply not true. While the SPS additions are (AFAIK) all managed, they are a very thin layer on top of the WSS platform and would not function without it. WSS contains many components written in unmanaged C++, some for performance reasons, some as ports from older STS versions. So while the APIs and programming model are all .NET, much of the actual runtime engine remains unmanaged, making this product a rather good example of exactly what Richard is describing.

  85. myself says:

    just forget it. ah!

  86. SigmnaDude says:

    I have been working with various programming technologies for about 15 years, and I have to say that C#/.net is, by far, the easiest environment to work in. I wholly agree that there are faults within the .net framework, but what environment doesn’t? (I have the SRX tech support case numbers to back this up) Yes, I have designed software using C++, Java, and (shudder) J++. I also agree that C# looks suspiciously like Java. But, the point that Microsoft hasn’t wholeheartedly embraced .net is ridiculous. First, I would never expect Office to be completely re-written in C#. What software manager would be able to keep his/her job after suggesting a rewrite of a *HUGE* software base. I also would never expect managed code to replace the core of an operating system. As an end user, it would make sense that the faster running code would be preferred. Therefore, low-level C, or even assembler, will likely be the way to go for the foreseeable future. Second, I could be wrong, but wasn’t GreatPlains rewritten in C#? Third, reiterating a point already made, WinXP came out before .net. Microsoft does put the .net framework on its Windows Update site. It happens to be an optional component, but it is there. I am glad that they leave it optional, as to say it is a required update would be a lie. On a personal note, I am very that .net exists. It pays for my house, car and virtually everything else I have. Oh, and who said that ASPX only runs in IE, I replied on this BLOG using Firefox…

  87. gregjor says:

    mmeister wrote:

    > In the 90’s Apple used to provide developers with a set of APIs and

    > then all their internal applications used completely different

    > mechanisms to provide great features.

    Off-topic, but not true. Since the very first version of the Mac OS Apple has fully documented the Macintosh Toolbox/OS API, except for features that Apple knew would break or go away in the future.

    Perhaps you are referring to Apple’s abandoned experiments with a new OS (pink/Taligent) that went on after OS 7 and before Darwin/OS X, but that work was never released as an OS or product.

    > With OS X, Apple decided to eat its own dogfood and the result is

    > an API that is much richer for the developer and tools that work

    > extremely well.

    Apple has always developed its own applications — including the operating system itself — using its own APIs and tools, the same APIs and tools available to all Mac developers. The alternative frameworks for Mac development have been either wrappers around the native Mac OS (Metrowerks’ PowerPlant) or run through a virtual machine (Java).

    > I think MS should take a page out of the Apple manual and require

    > plans to tightly integrate .NET into every application. You can start

    > off with add-ons, but you have to take it further than that.

    The difference is that the Mac OS is written using the published APIs; there is no separate framework like .NET. I’m not sure it would be possible to write Windows or any operating system in managed code. I believe that before .NET was rolled out MS wrote Windows using the published APIs, though some people have accused MS of using undocumented functions.

    Former Apple MacDTS engineer

  88. SmallRuntime says:

    The runtime size is normally 23MB, but there is this tool called InstallAware which reduces it to only 11MB. It first deCABs the setup files then recompresses them using better compression. Well worth a look if the runtime size is an issue for people. http://www.installaware.com

  89. mattsipes says:

    Java != .NET…..

    class slapindaface()

    {

    bool slap;

    }

    if(u think Java = .NET)

    {

    slapindaface slapx = new slapindaface()

    slapx = true;

    }

    (ps, yes its not good syntax, shutup! its a joke)

  90. You could add Exchange Server 2003 to the list of recent Microsoft products that require the .Net FW.

    The Mobile Browse solution OMA (Outlook Mobile Access, and yes… I know the abbreviation means ‘grandmother’ in German) in Ex2003 is an ASP.Net application.

  91. John Wright says:

    One of Delphi’s strengths was that the IDe was written in Delphi.

    The first version of JBuilder sucked bigtime because it was written in Delphi, when It was rewritten in Java, it improved by a huge amount.

    Until you start eating your own dogfood you won’t convince us that you are _really_ commited to it.

  92. A. O'Connor says:

    > > Sharepoint Portal Server is fully written in managed code

    > Might be why it’s so dog slow…

    And why the each element and each screen has zero regard for the application as a whole. Well through out interaction was not an important consideration for the designers, so it would seem.

    E.g. Try quickly locating a case by case number when the list is large. Unforgivable.

  93. Akin says:

    .Net this, Java that, blah blah blah.

    Well, I’ll make a couple of short comments: Bye bye Richard. Some of us will miss your .Net articles. Some us won’t.

    And really, let’s face it, every programming language has a problem. Yes, .Net isn’t the best, compared to the others, but it is pretty good, as in easy application development. Still, it’s coming up.

    For me, I hate Java, and that’s my opinion. Unfortunately, it has a lot of technical advantage compared to .Net, so I MUST use it. I dreadful fate.

    To those who said MS should enforce .Net in every machine using MS Windows, I think that’s utterly stupid. If people want .Net, let them have it. If people don’t, so be it. If MS does force people to have .Net, you’re the same people who would be the first to open your big, overgrown mouths and spray acid.

    Please, let it rest.

    And to those who insist MS should stop defending .Net when it is being criticised, what are you, daft or what? You want Microsoft not to defend their own product? Dudes, what the… Talk about idiocy. Okay, so you’re telling me: You design a software and sell it to the market. Obviously, everyone can’t love it, but then, certain people come out bashing it, and you don’t defend it? Come on, be real. Quit this childish talk. If Richard is so fantastic, let him design a better .Net and sell it to the public.

  94. For the love of god stop with the darned for loop. So what, the guy made a mistake, and it willnot work for C. Big Deal. Last time I checked we are all humans and we all make silly mistakes. Furthermore, I really REALLY doubt he was trying to teach you proper C syntax. The point is a for loop is a for loop is a for loop. For those of you INSISTING on being pricks, how about this

    int i=0;

    for(i=0;i<10;i++) { … }

    You happy now?

  95. Soulhuntre says:

    Just a fast note to let the MS guys knwo that while you will get some of the typical anti-MS drivel it is awesome how open and accessible you all are these days.

    As the "face" of MS becomes more human, possibly some of the /. branded idiocy based hatred will stop.

  96. I personally find the article by Richard Grimes very informative. It is comical to note some of the rants against him in the comments.

    Some of it are plain hilarious like:

    "And really, let’s face it, every programming language has a problem. Yes, .Net isn’t the best, compared to the others, but it is pretty good, as in easy application development. Still, it’s coming up.

    For me, I hate Java, and that’s my opinion. Unfortunately, it has a lot of technical advantage compared to .Net, so I MUST use it. I dreadful fate."

    Some comments on this encrypting the email, and so he not a believable guy!

    I really pity these guys.

    Anyway instead of just responding viciously to anyone who has anything bad to say about .NET/VB (MS group of products), why not take the suggestions positively and try to improve?

    My experiences with MS products have been:

    1. They are easy upfront

    2. When you want to develop solid enterprise products with them they are a royal pain to develop, to maintain

    3. You are continuously on a forced upgrade path

    4. Developing never becomes simpler over time

    5. Horrible support! Their main concern is to ensure they get the money without even being able to answer whether the question is at all answerable by them!

    In contrast my experiences with Java (from late 1995) have been:

    1. Very simple to develop

    2. Very simple to reuse, to develop large scale products and maintain

    3. Easy to debug

    4. Easy to distribute to wide spectrum of users including those on Mac and Linux

    Some of the people in this forum are acting like a frog in the well 🙂

    I have tried both sides (starting from Basic, VB, C#, .NET, and now sticking with Java technologies) and I prefer Java technologies any day.

    At the core as a programmer I look for what makes my life easier, makes better products easily and maintainably. I am not saying it is not possible with MS technologies. It is definitely possible either way to develop. So examples of software in managed code is meaningless. The point is that it is comparatively much much harder. And you can only know it when you have been at both camps.

  97. Sebcio says:

    what about biztalk server 2004? it is written in c#

  98. Joku says:

    Question: If the reason not including .NET with SP2 was purely because some customers (probably the enterprise ones) wanted that, why couldn’t you a) provide 2 "bundles" of SP2, one with other without .NET b) include .NET with SP2 and have a /switch for sysadmins to say that they do not want .NET installed with SP2.

    The extra megs that /switch option would have added would have not been any pain point to anyone considering how small percentage that would have added to the total SP2 size.

    So in fact, I do not believe that was the reason for not including .NET.

    More likely the reason was that MS feared the possibility of hackers taking note of how quickly .NET is getting to computers around the globe and then utilizing this to create bad name for .NET by some small size but very dangerous worms. With few lines of C# and old social engineering tricks you don’t need to be any sort of guru in programming anymore to create a lot more serious threats than what we have seen to date. However they are not bothering until .NET is widely enough adopted..

  99. Joku says:

    Grimes:> In Dec 2004 a tech preview of Avalon was made publicly available on MSDN downloads, and by examining this with ildasm it is clear to me that Avalon is yet another wrapper over Win32.

    It’s understandable that this has to be so, but Avalon is still 90+% C# right? Correct me if I am wrong thanks!

    And some people say .NET programs are slow, well certainly the cold startup and some VB’ish ways of doing things by some developers (lets do X in 2 lines inefficiently) will affect things but lets suppose you somehow page the stuff needed to do Win32 calls, now I bet you’d find it take a while to load a program again if that’d mean loading a ton of dll’s in memory first. The fix here is to update to LH and get some memory! 1 GB can be considered very basic when LH ships, most will have more.

  100. I am a client-side application/UI developer for a growing company, and enthusiastically adopted .Net when it came along. I did so on the assumption that before long the framework would be ubiquitous among Microsoft Windows users. Sadly, this has not been the case, and I have reluctantly had to return to C++ for my application development, as it is simply too much to expect that users, often of limited computer literacy, are going to download and install this enormous package in order to run simple (ostensibly labor-saving) applications. We simply had too many complaints about having to do this, and I am now back to using third-party libraries for XML parsing, regular expressions, etc. What a nuisance. I have also had to port a number of sizable applications from C# to C++, which was no fun at all, and hardly a productivity booster.

    C#, and the .Net IDE and forms designer, were a pleasure to use. I dearly wish I could still use them, but, alas, I can’t. Silly me – when I attended the big .Net pep rally in Manhattan that convinced me to switch over, I formed the impression that Microsoft would get behind their new framework, at least as far as taking the responsibility for its redistribution off my hands. What happened, guys?

  101. Maybe this Grimes article doesn’t warrant a response, then again, maybe it does. I’ve been working in the Java world for over 8 years, having seen it first hand at the start, and on through the bloated years. I’ve also been working in .NET/C#/ASP.NET for about 3 years now.

    Never once has SUN tried to create a bonafide operating system solely on Java. Oh, yeah, there was JavaOS which ran on what? Oh, JAVA SILICON! Smart move on Sun’s part, but we all figured out their crafty ways. Where is that technology now? Was it 100% Java? Doubtful because it had to interoperate with hardware devices that did not understand Java (Displays?).

    Then this notion that Microsoft has no confidence in .NET because it’s not rewriting the entire world of Microsoft in .NET? Uh, well, is SUN rewriting all of its software in Java? I doubt it. By the very same logic, now, SUN has no confidence in its Java platform. Hmmm. These are juvenile arguments born from a childish tantrum with no business merit whatsoever.

    Does anybody remember how terrible the JDK was during its first three years of life? I do, and it stunk. The compiler had bugs, there were no tools for it (I had to create a dependency compiler to get Make to build my Java projects correctly). It was fun, though, because it was new, even if it caused me much embarassment in front of customers.

    Microsoft has created, in its first revision, a technology that has leveraged the incredible history of managed code (more than just little ol’Java, by the way) to give us a platform that is more robust and stable than anything SUN produced in the first 3 years of Java. Do you get any compiler fatal errors in csc or the like? I sure did using javac, and that’s why there were so many Java compiler variants (remember Jikes? gnu java compiler? others…). I *still* get fatal compiler errors using javac, *sigh*.

    You can not compare Java and .NET, they are not compatible technologies. .NET is a platform for many significant, and unmanaged, technologies. Java is simply a platform for managed Java code. You want to complain about COM and DLLs and all of that in .NET, well, try running a real enterprise Java application without having to tune your JVM’s perm space – and get lots of OutOfMemory errors because it’s loading thousands of classes just to start your little application.

    Microsoft is a very large and influential organization. They are clearly responsible in their approach to *introducing* technologies to the mainstream. SUN has always been reckless about their releases (remember SunOS 4.1.4? or the initial releases of Solaris?? Try to create a new user in Solaris 2.2. Even better, remember the VTC terminals that came with CDE? Tooltalk?)

    Write operating systems in C#? Sure, if you compile it to machine linkable code and not managed code.

    Oh, and the ".NET is just a wrapper around Win32" argument – uh, duh. What do you think Java is? Just a wrapper around Win32 as well. Managed code is *MANAGED*, it’s not a replacement for the underlying platform SDK of any hardware. Write a different C# compiler that links directly against the platform SDK if it’s such a concern.

  102. Cameron says:

    Don’t worry about articles like this. We get them in the Java space all the time, and then the guy goes off and joins a research firm. (Another "Richard", no less.)

    The only thing that matters for .NET at the end of the day is if it’s helping Microsoft Windows customers do their work better. Yeah, sure I think .NET is strategically all about locking people into Windows and Office for another 10 years, but Microsoft’s not the first company to try it, and if they’re going to lock you in to something, .NET is a lot better than the cruft that Microsoft made before it 😉

    Peace.

  103. "The server market itself is *totally different* then the client/consumer market."

    Um, this should be "than" not "then" – as in "greater than" for all of you math people.

    …otherwise, very good responses.

  104. UG says:

    Microsoft is a copy-cat.

    For example it has copied:-

    1)java’s platform independence (javac = vbc)

    2)java’s try, catch (in vb.net)

    3)struts forwarding techniques between the pages (in asp.net)

    Others

    1) Windows NT (Equivalent to Novel Netware) Networking technology.

    And the catch is:-

    It has monopoly in making DLLs. Which is excellent.

    Anything wrong?

  105. Michael says:

    >>>My experiences with MS products have been:

    1. They are easy upfront

    2. When you want to develop solid enterprise products with them they are a royal pain to develop, to maintain

    3. You are continuously on a forced upgrade path

    4. Developing never becomes simpler over time

    5. Horrible support! Their main concern is to ensure they get the money without even being able to answer whether the question is at all answerable by them!

    In contrast my experiences with Java (from late 1995) have been:

    1. Very simple to develop

    2. Very simple to reuse, to develop large scale products and maintain

    3. Easy to debug

    4. Easy to distribute to wide spectrum of users including those on Mac and Linux

    <<<<

    I don’t agree at all. I used C# and Java and must say, that there is almost no difference. Yes, there isn’t. if you know your tools., you may create perfect "large scale product" very fast in both worlds. You *may* develop on Java with the same speed as on .NET. Know your environment, know your tools and ready solution s and development speed and application architecture decisions will be almost the same.

  106. Hope says:

    I think we should forget about what Grimes says or what Microsoft says.

    It’s sad that Mr. Grimes chooses to abandon .NET. I ask him humbly to reconsider his decision.

    Microsoft has not rewritten major apps in .NET because there it is suicidal in business to do so! (remember netscape). I think the current office applications are fine and there is no need to do a complete rewrite and introduce more bugs!

    Then again he has a point because Microsoft has enough money in it’s pockets to pay for a complete rewrite of .NET and the write a separate optional support extension for backward compatibility.

    The reason Microsoft released .NET is that they have an operating system to protect! They could care less about cross – platform. I would have done the same if I were in Microsoft’s position. That is why you find that most of .NET is tied to win32. It is up to others implementing .NET to tie it to their native framework. I belive Mono is doing just that. In Java, Sun has basically done the same. The only difference here is that they have no desktop OS to protect so they release diferent versions of the JRE for different OSes.

    http://www.con-imedia.com

  107. M. Richards says:

    I feel that MS has done something very similar with my old friend C++. They claim that they still support C++ development, but look around – every MS publication has dropped C++ like a hot rock (giving it only paltry coverage).

    Guess what? The VAST majority of modern Windows applications are written in C++. It’s not unsafe when used correctly (just use modern libraries), and I find it elegant, expressive, and performant.

    Once MS decided that C# was the new flavor, it became everything to them. It honestly it feels like they don’t care one bit about the hard-working developers that got them where they are today. Without user applications, MS Windows would not be the dominant platform it is today.

    Get back to the basics, MS – and please start listening to your customers. And if you don’t, I sure hope someone else will.

    – MR

  108. Milind says:

    I’m a consumer of the OS and I DON’T WANT .NET runtime in a service pack. I download SPs only for security fixes. I’m already pissed that I have to nurse my machine. I don’t need an additional headache.

  109. Chee Wee says:

    Perhaps Richard will switch to Delphi? Given that Anders was the father of Delphi before he became the father of C# and CLR, Anders took most of what he liked about Delphi and put it into C# and CLR. Unfortunately, Microsoft screwed up the implementation (not surprisingly) or wanted to take on Java at the same time or both. Which single language in the world can target Win32, CLR and Linux at the same time? Borland Delphi. No other language comes close. If Borland added Java bytecode generation to Delphi and completed the skunkworks project on adding Java capability to Delphi years ago (1998-1999?), we’ll have a language that can target Win32, CLR, Linux and Java all at the same time!

  110. ChrisClement says:

    VB.Net is not VB??? Wow. Next thing you’ll be telling me is that Visual Basic is not Basic, Windows XP is not Windows 95, and Mac OS X is not Mac OS. Say it ain’t so.

    BTW, who is Richard Grimes?

  111. Chris, Chris, Chris… You are missing trifles (like, the facts), but, of course, you have an opinion.

    Let me update you on this:

    Richard Grimes is an MS MVP, who put out a couple of .Net books during the last five years. The man knows his dot and he knows his net, for sure.

    Regarding VB.Net not being VB, search for Visual Fred (the name for VB.Net Bill Vaughn –another MS MVP– coined at VSLive2001!) on Google and you’ll be surprised at how many people think VB.Net <> VB. Check out Karl Peterson’s (yet another MS MVP) bio in Microsoft’s VisualBasic community site (under MVP awardees).

    Here ends the update.

    Regarding all this, I’m very troubled by the fact that developer acceptance around .Net is not materializing as Microsoft would have us believe it is.

    Soma’s numbers are at best wishful thinking! Five million downloads in a month, presumably two years ago: was some kind of DOS attack on Windows Update servers requesting the .Net runtime because of its size?

    And, are those two and half million developers all professionals who take home bread earned on .Net development? I guess not.

    My company is already diversifying its developer assets and hiring Java developers and buying Java training for the current developers (we were a Win32/C++/CORBA shop). All things aside, training and certification is much better on the Java side; I could easily attribute it to Java’s stability due to its head start of a couple of solar years (and almost a decade in Internet years).

    I would like to think that Microsoft would not abandon (or stall) .Net just for the sake of its huge investment in it, but, then again, Motorola had poured a lot of money into Iridium, didn’t they?

  112. Olaf says:

    The last 2 years I have been developing for C# and managed/unmanaged C++, and a lot of the discussions I see here are pure political en uttermost rubbish. It doesn’t matter if it is based on Java, or if it still uses Win32, or that there are no pure .NET programs yet. What counts are the results you get when you create a program and .NET especially C# is clearly a direction to take.

    One of the pitfalls developers have is that they compare it with technology they are used to. But .NET programs have a different design philosophy, so it is wrong to compare it with MFC based programming models. If you force a .NET program to behave as a MFC program, then it is very logical that it is slow, or hard to implement since you are raping the design structure. I made that mistake in the beginning, but now that I understand the .NET logic I can create programs fast and even get near-unmanaged execution speeds.

    I think that most developers that complain still have no clue how to program the Object Oriented way. Oh yes, they use object classes, but they have no clue how real object classes should be implemented. They write C++ code like C technology. MFC is a big example of this, it looks like objects because they use classes, but it is nothing more than a one dimensional class wrapper, resisting change. Violating object oriented design. The .NET is clearly the right direction in the object oriented design, even when some classes are sealed and cannot be inherited. But that does not mean that they cannot be extended.

    Also regarding speed, in time more and more code will be ported to .NET. Step by step, also the CLR will be improved step by step, and at some time, you will have more managed code running at the OS level that unmanaged code need more time to Interop and thus becoming slower than managed code.

    Something else not discussed here is that the same .NET programs created now will eventually outperform none-.Net programs in the future when the CLR gets more and more optimized. The reason for this is that unmanaged programs are compiled with the current know processor and lightning fast, now, at this date, but when that program is run on a Pentium 5 or 6, it will run slower than a .Net program since it gets compiled with the latest CLR at that time that might include Pentium 5 and 6 specific instructions. Without need to recompile!!!! And in theory, the CLR might analyze the running .NET application and optimize most used functions even more by moving the execution code in memory so that the execution code ends up into the processor memory cache. Something an unmanaged program cannot do!

    The size of the .NET framework is of no discussion, with current hardware and technology. Especially when programs created now, takes months sometimes years to develop. So instead of fixating now that the .NET framework is too big compared to your application, by the time you release it, and it will look ridiculously small compared to other programs.

    And another important feature of .NET programs is that it promotes to create more secure programs that are a lot harder to get misused by worms or viruses. So this is a wise choice to create managed programs as OS core components.

    Another misconception is that .Net programs are slower because they need more time to load compare to unmanaged programs. This is not because it loads the 25 MB framework!!! It is because the CLR is compiling and optimizing your code, and checks the code for security issues like worm infection. Only the part of the framework that is needed is loaded. You should be happy because it helps in creating a more secure OS.

    The only thing I complain about the .NET framework is the resistance of the users to install it because of stupid myths. But modern Windows XP CD’s, now seems to install it automatically. In my opinion a big step forward.

    I would hate to go back to the MFC garbage.

    But this is my opinion.

  113. Peter Wone says:

    [a] dotnet reeks of Java. They pinched all the good ideas. I should jolly hope so.

    [b] VB.NET is crap. Certainly it’s ugly and I wouldn’t write new code with it, but who cares? I can USE classes written in VB.NET.

    [c] Thin wrapper over blah. It had to be a wrapper over something. It wraps win32 because amazingly they didn’t have a spare decade to completely rewrite the OS before releasing dotnet. What it DOESN’T do it expose the quirks of the underpinning implementation. Or sometimes it does. Perhaps a thicker wrapper over Win32 might have been better. But then performance would have suffered. I vote for mostly abstracted. Wrapping really old code also means wrapping really stable, thoroughly debugged code. I can’t see how this is bad.

    [d] Grimes doesn’t love dotnet. Um, so? That’s his problem, not mine. He might also have had a woman on the side while he wrote the books, and this is equally irrelevant to the utility of the books.

    [e] Thin layer blah take 2. To me this is the single most important aspect of dotnet – finally MS will be in a position to repair the applecart without upsetting it. It is vitally important that the next generation codebase be abstracted away from the OS. This makes me feel guilty every time I use COM interop. Sometimes I bite the bullet and implement in pure C#.

    [f] As far as I’m concerned, dotnet is a free ticket to 64bit-land. The applications on which I’m working are squarely targeted at large companies who will prefer 64bit "native" applications and I will cry not at all about suddenly being the only vendor with platform native product.

    [g] Three cheers for the Mono guys.

    [h] I wonder on the truth of rumours of dotnet for Mac. It’s not vital to my world domination plans (who wants customers who think it’s cool to be clueless?) but it would certainly round out the portfolio.

  114. Olaf says:

    "It is vitally important that the next generation codebase be abstracted away from the OS."

    You are right about this. C made the step from Assembler to an abstract language, now the managed code is the next logical step.

    Somehow, I believe that people that complain about stupid little details are the people that are getting too old to keep up with the modern technology and want to go back to the old days where everything was much better. Sadly enough for those, DOS has almost disappeared.

    A lot of people are also missing the point that managed programs are designed with security in mind. Managed code can be made that only certain code with the correct encryption key can load it and execute it. Unlike unmanaged code dll that just can accept any program to execute its functions regardless if it is a worm or a virus.

    By default, .NET programs have no network rights!!! So if you create a stupid little calculator intended to be run only on a local machine, then it cannot be taken over to start sending SPAM mail through the Internet. By a Trojan. This creates a more secure OS if these components are used as kernel parts. Don’t get me wrong, an infection can still occur, but it simply has no access to the Internet or LAN, thus slowing down any infection.

    Another thing that people seems not to see is that programs gets more and more connected to the Internet. The distinction between a standalone application and one running in a browser is getting close to zero. Even a stupid screen saver might want Internet access to update its picture o the day. It is near impossible to do this with the current unmanaged technology within a reasonable time frame and with enough security.

    I don’t clame that .NET is perfect!!! It is not, but it is a big step towards the future and has speeded up my development cycle dramatically.

    Sometimes I wonder if Java would not have evolved to what the .NET is now if Microsoft were given a chance to extend it.

  115. Fly_In_Air_Not_In_Vacuum says:

    <br>1)I think that the future of market is the biggest problem of .net. Not the Tech.
    <br>
    <br>2)Java had do the unify_platform coding language. C# is the second. But Java had get so much market percent and belive percent. There is no unify_platform chance for .net.
    <br>
    <br>3)In the Start days of .net, There is a bigger chance than java leave for .net. It is the Object_Model On TCP/IP Network. In the early years of internet, 3 level model is enough. But in 1999-2010, The Object_Oriented Model is the popular pattern in new programers. It need A Language support both OO and internet. It is the direct of .net. I hope .net in that way in 1998. But I was very despair of the first version of .net. I know that the MS Lost it’s right way. Java should plunder more programmers from MS’s region.
    <br>
    <br>4) I am in Asia. I can see the stupid way of .net. I think more people in America and Europe will see the stupid way too.

  116. Fly_In_Air_Not_In_Vacuum says:

    <br>1)I think that the future of market is the biggest problem of .net. Not the Tech.
    <br>
    <br>2)Java had do the unify_platform coding language. C# is the second. But Java had get so much market percent and belive percent. There is no unify_platform chance for .net.
    <br>
    <br>3)In the Start days of .net, There is a bigger chance than java leave for .net. It is the Object_Model On TCP/IP Network. In the early years of internet, 3 level model is enough. But in 1999-2010, The Object_Oriented Model is the popular pattern in new programers. It need A Language support both OO and internet. It is the direct of .net. I hope .net in that way in 1998. But I was very despair of the first version of .net. I know that the MS Lost it’s right way. Java should plunder more programmers from MS’s region.
    <br>
    <br>4) I am in Asia. I can see the stupid way of .net. I think more people in America and Europe will see the stupid way too.

  117. China cowboy says:

    MS is a very great corp,but his opinion on open source makes me disappointed!

  118. Richard Grimes’s article says what the most .NET programmers’ worry about.

    I’m a trustily pursuer of .NET Framework,But I still want to support Richard Grimes’s points,The status in quo is that,We are really Confused,Confused,Confused….

  119. Test.

    Time can test all things.

  120. Olaf says:

    You are right, time will tell. 🙂

    But there are a very important signs that the .NET is the direction to go.

    * Longhorn depends on it and pushes to use the .NET or else you will lose functionality.

    * All modern Microsoft Visual studios can create .NET programs, most of them forces you to use .NET (VB and C#).

    * Other programming languages start to follow (Delphi)

    * Far better virus and worm protection built into the applications by default. Imagine a OS kernel built on .NET applications.

    * Project Mono to port the .NET to Linux, Mac,…

    My best bet is on .NET, maybe in these days we still have to work with conventional executables, but you don’t learn .NET in a week, so better at least have some minimal experiance.

  121. I dont know the answer

  122. 朱洪波 says:

    我还是觉得c/c++好一些。

    I like c and c++ more than c#,vb.net and Java.

  123. Reason says:

    Any large framework will have it’s shortcomings, but did Richard really have to get so fed up as to give up on .NET entirely? How is that going to help improve things? When faced with a challenge like this, you stick with it until positive changes are made. Walking away does more harm than good. Quiting on .NET, as Richard has done, doesn’t speak well to his character.

  124. Poor Richard says:

    I have to agree with Olafs’ statements. The benefits far outway any nitpicking that’s been going on.

    Richard Grimes certainly has an axe to grind, just take a look at his website(richardgrimes.com) to see why. Microsoft shuned his assertions, and well, now he is taking his toys home and won’t play anymore. Good riddence I say, no one wants a cry baby who doesn’t get his way in the sandbox Richie.

  125. JackieChen says:

    .net will have a nice future!

  126. sincere says:

    Along with the vs.net2005, I think .NET will be much stronger.Trust .net, and it will change our life patterns.

  127. I’ve been developing .NET for my CS research projects over the last 1.5 years, and as much as I love .NET and C#, the size of the redistributable does spurn adoption. The other problem I have is that COM/unmanaged C++/ATL are still needed for many tasks, such as namespace extensions, device drivers (right — I don’t expect C# to be used for device drivers but still …), explorer bands. Yes, COM interop works, but it’s a kludge. I’d like a .NET/C#-accessible explorer.exe, etc. Maybe longhorn will fix this?

  128. Liu Yang says:

    Well well well, i’d like .NET. It speeded up the software development, thought it’s not so fast currently. But in the future, the new artichiture and the new, fast hardware will solve this problem.

    To the size of the redist package, may be new compression tools can make it smaller…

    i don’t know why few of people don’t want to install .NET FX. They say, "i won’t install such thing". I really don’t know why they call such a good job "such thing".

    At last, I have to say, I believe .NET.

  129. chinsyoui says:

    Hi,guys,why don’t you spent more time on something worth it? Everybody go back office,and do anything we really should do.

  130. GouG says:

    A future thing may be know in future,but I can’t catch so many english.haha.

  131. beggarson says:

    java is more outstanding actually.
    <br>the platform is not the most important element
    <br>in sothware ,by the way.

  132. Blog E says:

    Richard Grimes 是我一個蠻欣賞的專欄作家,他對於 Managed Extensions的相關研究,最近一直是我研讀的範本,不過由CSDN上面的一篇新聞 [.NET陣營在些波瀾~微軟專家.NET失望之極~],Richard Richard Grimes 卻一語道出許多他對於.Net Framework…

  133. Sytelus says:

    Good that someone has time to respond to someelses non-sense.

  134. Darren says:

    Java guys have heaps of reasons to stay with Java whereas .Net gurus have tons of reasons as well. Nothing is perfect…
    <br>
    <br>Anyway, looking forward to the .Net 2.0 🙂

  135. Olaf says:

    Another reason to use the .NET:
    <br>If you create a managed application with the Visual studio 2005, then you are able to create a neutral application that will compile (CLR) to 32 bit when run on a 32 bit windows and 64 on a 64 bit windows.
    <br>
    <br>This means that you only need 1 and only 1 compiled application, that runs just optimized on the processor detected by the CLR. And the buyer does not have to purchase the program 2 times!
    <br>
    <br>For the newbies, .NET programs gets compiled by the CLR during the load process. This is why the loading is slower. Although the CLR cannot optimize perfect otherwise it would slow down the loading even more, it can optimize depending on the processor.
    <br>
    <br>Ok this is .NET 2.0, but if you create managed code now, it can be ported to Visual studio 2005 and be ready for the next wave. 🙂
    <br>
    <br>—–
    <br>Original Reference:
    <br>
    <br>Larry Sullivan (Expert):
    <br>Q: Will 32-bit managed applications run on .NET 64?
    <br>A: 32 bit applications built with v1.0 or v1.1 will always run as 32 bit applications. On 64bit these applications will run in the WOW. If you build an agnostic application in Whidbey, C# has this as AnyCPU, then it will run as a 32bit application on a 32bit platform and a 64bit application on a 64bit platform. You can make your application 32bitrequired if you are using a 32 bit COM object that doesn’t have a counter part for 64bit.
    <br>
    <br>

  136. Big Boy says:

    i think .net is very good.
    <br>if u are worried about its future,u may be a pig!

  137. Will says:

    Under: "On using the .NET Framework for shipping products"; In your Response you have misspelled ‘Constituency’. Just thought I’d help out!

    -Will,

  138. wdd says:

    C# looks like Java. It smells like Java. It is Java!

    I consider copying Java as kindergarten behaviour from Microsoft. Why can’t they invent something more novel?

    C# and the .NET platform are great. So is Java. They are nevessary to develop easily and quickly business solutions.

    But C++ won’t go away. It wil l always be there because of the potential it offers. Especially for innovation.

  139. jj in Hudson says:

    I’m a home user, not a developer. Microsoft wants me to be a business. I’m not. Only one person uses my computer, me. I hav WinXP Pro with a Windows Media Center 2005 version on an HP laptop. Do I need a .NET ASP Software, Framework, whatever? I have been trying to set up my computer as simply, and as uncluttered, as possible. Nowhere in my papers and how to’s does it say I need to be a network, or that I need the NET ASP or NET 1.5. Why they don’t set up a computer to run as effeciently as possible and leave these decisions to the person who only wants to edit photos, get info from the web, write letters–no developer. They are blooming idiots. So, my simple question to you developers–Can I not download NET 2 or uninstall net 1.5ish? We users still need a finished product and not all these different upgrades and changes.

  140. danielfe says:

    Hey JJ,

    We try not to be, in your words "blooming idiots" but you’re certainly open to your opinion. Like all Microsoft software from Windows to Office, if you want to update your system, all you need to do is go to http://update.microsoft.com. This will automatically update your machine for any system requirements you need. That’s it, you’re done 🙂

  141. ... says:

    The information I found here was rather helpful. Thank you for this.

  142. shemetov says:

    Адвокат оказывает юридические услуги, юридическая консультация, юридическая

    помощь, юридическая консультация по вопросам таможенного оформления, экспорт,

    импорт, таможенный адвокат, адвокат по контрабанде,

    адвокат по таможенным вопросам, юридическая консультация,

    таможенный адвокат, таможенная консультация, уголовный адвокат, адвокат по должностным преступлениям

  143. grootix says:

    Если у вас находятся актуальные медицинские справки с печатями различных медучреждений в обеих столицах, мы можем приобрести оные у вас с существенной денежной компенсацией.

    spravkaspb(барбос)nm.ru