Posted By: Ray6 | May 6th, 2008 @ 2:54 AM
page 3 of 3
Comments: 64 | Views: 3685
Sven Groot
Sven Groot
My name has 9 letters. Coincidence? I think not...

Let me get one thing straight. I, and I'm sure the others as well, am not contending .Net is without flaws. It isn't perfect.

I am however saying that, despite those flaws, it is still one of the best frameworks I've ever worked with (and I've used quite a few, including Java which you compare favourably in your article; I personally think the .Net Framework is miles ahead of Java). I am also saying that in your article you fail to provide a compelling argument as to why .Net is so bad. The things you mention are, in my opinion, minor flaws. They are not nearly serious enough to condemn it.

More to the point, your articles were apparently meant to convince me that Cocoa is a much better API. I have never worked with Cocoa so I'd be interested to know what is so good about it. But you don't say anything about Cocoa at all. You just attack Win32 and .Net. And as history has shown many times, telling somebody what they're currently using sucks is not a good way to get them to switch.

If your article had focussed on the good points of Apple instead of just criticizing Microsoft (unfairly criticizing in some again, again in my opinion, you don't need to agree), then we wouldn't be having this discussion.

My point of view has been made clear, so I don't think I have anything further to add to this thread.

Dr Pizza wrote:
Incredibly prohibitive? In this country, Apple offers the best laptops for their price, by far. Lenovo, Dell, HP, Toshiba, Fujitsu... none of them even come close.


Maybe Dell can't compete in terms of quality and style, but they sure can compete on price. As a student,  Microsoft provide me with:

      Every version of Windows including Server for free...
      Every version of Visual Studio including Team System for free...
      Free ASP.NET Hosting...
      Pretty much anything else you need to develop

This means I can build or buy a very cheap machine and immediately start developing with professional tools. There is no way for me to do this on the Apple platform without at least £700 which is around $1400 dollars at the minute.

Dr Pizza wrote:
]I don't really have the time to watch a whole hour of video; is there any bit in particular I should look at?


Not really as it was littered throughout the video. My point in linking you to it is mainly that here is a professional developer, who has produced and published one of the biggest piece of software on the Mac at the minute and he presents a very fractured platform where you have to learn many parts of the system to achieve different things.

I also agree with Sven that .NET is better organised and much more devleoper-friendly than Java.

There are a lot of things I don't like about Microsoft but their developer 'story' isn't one of them ranging from Win32 to do really high performance code right the way up to .NET and WPF where you want fast development time and GPU accelarated UI's.

Kevin



figuerres
figuerres
???
NOTHING IS PERFECT.


to Peter:


while I am not writing Mac apps I have developed code for a few different OS's over the years.

the "Real Problem" with .net and windows is that MSFT gets blamed for anything they do...

Take Vista for example, several things were "done right" in Vista (IMHO at least)  but folks who got used to the way they were in 95/98/xp complain and say vista sucks when the reality is that some of the changes are good ones that will reduce some common problems for a lot of users.

what if MSFT put a "Virtual XP" box in Vista / WIndows V Next?
as a way to allow MSFT to cleanup the platform...

I bet some vocal part of the windows users would whine and moan and cry foul....

as for .net and cross platform:  why is it MSFT's job?
does anyone offer the same?

is there an Apple framework that allows me to write a "Mac/Windows" app that works right on both platforms?
does anyone *really* make it that clear what runs on that OS and not another OS ??
I know that within a UNIX app that runs on different UNIX systems there are multiple folders of stuff and scripts and makefiles just to handle say UNIX SYSV Vs. Sun OS Vs. Berkley UNIX Vs. LInux version x

sure it would be great if some all knowing group handed down an API that told us how to do it right.... but that just aint gona happen.

it's human nature to want to "tweak" stuff.... and the best stuff is never done by a comittie.
and unless a whole lot of folks are willing to give up the app's they use the legacy of windows is here to stay for a long time.

no it's not perfect.  but it works and it pays the bills.

now if the WOZ ran things.... it might be different Big Smile

you do recall the WOZ right ?? that other guy who was the reason Mr. Jobs had a JOB ??
littleguru
littleguru
<3 Seattle
Some things said in this article are right; but I wonder what would happen if Microsoft would just do the same as Apple did with the Mac OS 9 to OS X transition... people would cry and blame Microsoft to no end!

Or am I wrong?
I agree with Sven.  When I read that claim that Java, of all things, was supposed to be better than .NET I actually laughed out loud.  I've had a great deal of experience with both, and Java is a mess in so, so many ways.
littleguru
littleguru
<3 Seattle
BHpaddock wrote:
I agree with Sven.  When I read that claim that Java, of all things, was supposed to be better than .NET I actually laughed out loud.  I've had a great deal of experience with both, and Java is a mess in so, so many ways.


I also agree with Sven... nothing is perfect; that's how life is. Still there is always place for improvement and that is also what should always be done.

Standing still means moving backwards.
littleguru
littleguru
<3 Seattle
Article wrote:
Because everything now has to live "within" the .NET world, .NET has to be all things to all people. Well actually, that's not true. It's trying to be good enough for the first and second kind of programmer. The third type—well, just ignore them. They're too demanding anyway. They're the ones who care about their tools and get upset when an API is badly designed. They're the ones who notice the inconsistencies and omissions and gripe about them.


Hmmm, it's very hard to agree with this here... Especially since .NET moves stuff away from you to allow you to create and spend more time on a clean design.
littleguru
littleguru
<3 Seattle
Article wrote:
But Java's much more high-minded. It's much stronger on concepts, making it easier to learn.


Especially the generics that are converted into cast by the compiler Wink I don't know how much the people who like clean design like that...

Having tons of different notations and a mess in the class library is also something that you like when you care about great design... just have a look around at the different libraries in Java...

Or how cool is it for an array to expose its length via a public field Wink

Another point is that the dev needs to care about boxing and unboxing... int vs Integer etc... lovely!
evildictaitor
evildictaitor
if( !succeed( try() ) ) { while(true) try(); }
Shining Arcanine wrote:

I did not read the guy's argument, but I have never been able to understand why the .NET libraries must be used from within .NET. Why is it not possible to simply use them in C++ much like you would use the standard template libraries or any other libraries written in native code?


Because .NET languages have the following important points:
1. .NET languages compile to MSIL which must be translated to processor code before it can be run. This is a serious obstacle to .NET running inside a C++ native app
2. .NET languages typically (although not uniquely) rely on a concept of pointer-less references which nessesitate some form of garbage collection (e.g. reference counting or the full-blown asyncronous GC). This means that .NET objects need to have a central manager, and that any .NET method must be running within the context of such a manager.

Basically this means that if .NET is to be run inside C++ we can do the following:

1. Translate it to C++ code at compile-time and find clever ways to avoid the problems of the GC.
2. Run the .NET code inside a big C++ black-box of a runtime.

Note that while 1 is feasible, it loses a lot of the point of .NET - that is processor independence and the ability to migrate modules without binary recompilation.

2 suffers from simmilar problems, since there's little reason to run a managed program unless it can either
 a) Return a result from a computation
 b) Interact with the outside world via native invocations
which is why we have pinvoke and interop.

Given all of this we can then start putting everything together and say that we can run .NET languages natively, but methods that are managed must be run within a managed black-box (which manages the JIT, Garbage collection, managed Exceptions etc) and this can call out to native methods. These native methods can be written in C++ and we put in a clever layer to translate .NET managed objects into C++ unmanaged objects and vice-versa for argument passing between the two.

This is called managed C++ and it exists.

Shining Arcanine wrote:

Then again, I never could really understand proprietary languages. Java is another fine example of a proprietary language that I do not understand. Why Java must be compiled for the JVM and not a real processor, or more accurately, why is it so strongly discouraged that Java programs run on anything other than the JVM? Also, why is the JVM so biased towards Java and that better languages, like C++, need not apply? I suppose the same could be said for .NET's intermediate language.


You mean you do not understand why we have different binary languages that are not processor languages? This is a consequence of the migration towards the program managing your pointers rather than the programmer managing your pointers (which is the basis of "managed" languages such as Java and C#).

Direct consequences of this include easier optimisation paths, easier data flow analysis and the potential for much more aggressive optimisations at runtime via the JIT that would be impossible at compile time.

Furthermore, by using a common binary language we can allow programs to run on arbitrary machines by only rebuilding the virtual machine, rather than recompiling the the program-on-top. This is what we mean by processor independence, which means that a C# program I build on this machine could be run on a playstation3, a fridge, my car or on an apple mac, so long as someone has written the virtual machine.

Shining Arcanine wrote:

I really do not understand this trend of proprietary languages bundling together a few different concepts that deviate dramatically from well established practices and try to force them collectively on people. The idea of a virtual processor that makes any program compile for it run on any system is great, but why ensure that only one language works on it? The idea of having many useful libraries bundled with each other is great, by why force managed code on people? The idea of managed code is great, but why force a dependency on one huge conglomeration on people? These things are very good when taken alone, but when taken together, some of the benefits that they have individually become disadvantages.

The underlying binary specification is published and a number of languages can run on both the JVM and the CLI-VM. For Microsoft the range of languages is bigger, including C#, managed C++, VB.NET, F# and a number of sub-languages from MSR.

Also it's important to note that while practises may have become established, that doesn't mean that they are good practices, particularly given that the type of programs being written now are different to the types of programs we used to write - until very recently the vast majority of programmers could completely ignore concurrency and thus the C++ Resource-Allocation-Is-Initialization (RAII) system removed the potential for memory leaks in programs. With multiple threads this is no longer the case, and is one of the many things that managed languages help to solve.
evildictaitor
evildictaitor
if( !succeed( try() ) ) { while(true) try(); }
littleguru wrote:

Article wrote:But Java's much more high-minded. It's much stronger on concepts, making it easier to learn.


Especially the generics that are converted into cast by the compiler I don't know how much the people who like clean design like that...


Just thought I'd point out that actually that doesn't happen - when you first create a qualified type the JIT physically builds that type in memory and this means that there are no casts involved when using generics (this increases the speed dramatically given the high-level-of-use of generics in the managed assemblies)
evildictaitor wrote:

littleguru wrote:
Article wrote:But Java's much more high-minded. It's much stronger on concepts, making it easier to learn.


Especially the generics that are converted into cast by the compiler I don't know how much the people who like clean design like that...


Just thought I'd point out that actually that doesn't happen - when you first create a qualified type the JIT physically builds that type in memory and this means that there are no casts involved when using generics (this increases the speed dramatically given the high-level-of-use of generics in the managed assemblies)
he was talking about Java generics Smiley
littleguru
littleguru
<3 Seattle
Ion Todirel wrote:

evildictaitor wrote: 
littleguru wrote: 
Article wrote: But Java's much more high-minded. It's much stronger on concepts, making it easier to learn.


Especially the generics that are converted into cast by the compiler I don't know how much the people who like clean design like that...


Just thought I'd point out that actually that doesn't happen - when you first create a qualified type the JIT physically builds that type in memory and this means that there are no casts involved when using generics (this increases the speed dramatically given the high-level-of-use of generics in the managed assemblies)
he was talking about Java generics


Yes! http://en.wikipedia.org/wiki/Generics_in_Java#Type_erasure

The Java-guys had choosen the "type erasure"-system to keep backward-capabilty. It garanties that a generic-libary can be use from old code and new code can use old non-generic Library.

It's the same thing again. There where million and millions of Java-apps out there and if you break compabilty, millions of developer had cried or ignored the new release.

The .NET world had integrated "real"-Generics, because the .NET world was much younger.


Imo this discussion about "legacy"-concepts blend into "new" plattforms is everwhere.

- .NET lots of concepts from the Win32-world
- Java brings pain from badly designs in the early days. (Uglyboxing/unboxing, no "real" generics, etc)
- Mac has Cocoa but also Carbon but also some UNIX-like stuff etc...



evildictaitor
evildictaitor
if( !succeed( try() ) ) { while(true) try(); }
GamlerHart wrote:


The Java-guys had choosen the "type erasure"-system to keep backward-capabilty. It garanties that a generic-libary can be use from old code and new code can use old non-generic Library.

It's the same thing again. There where million and millions of Java-apps out there and if you break compabilty, millions of developer had cried or ignored the new release.

The .NET world had integrated "real"-Generics, because the .NET world was much younger.


Imo this discussion about "legacy"-concepts blend into "new" plattforms is everwhere.

- .NET lots of concepts from the Win32-world
- Java brings pain from badly designs in the early days. (Uglyboxing/unboxing, no "real" generics, etc)
- Mac has Cocoa but also Carbon but also some UNIX-like stuff etc...



That's a pretty poor excuse. Even if you don't define runtime generics construction, the compiler enforces closures for all types (all instanced generic types must be closed under types) and this means that you can create anonymous types at compile time that effectively are the closures of the generic form:

class Generic<T> {
  T myvar;
  static Generic<Int> someInstance;
  static Generic<String> someOtherInstance;
}

gets translated to:
class Generic_Int {
  Int myvar;
  static Generic_Int someInstance;
  static Generic_String someOtherInstance;
}
class Generic_String {
  String myvar;
  static Generic_Int someInstance;
  static Generic_String someOtherInstance;
}

which preserves all of the attributes and type safety of generics and is backwards compatable to older versions.


Also, .NET brought in generics in .NET 2.0 and there was a huge backlash against Microsoft making .NET 1.1 incompatable with .NET 2.0 and vice-versa.
littleguru
littleguru
<3 Seattle
Wow! That's really no excuse... especially when done properly the old apps run without any problems after the upgrade. I mean the old .NET 1.1 apps run also when upgrading to .NET 2.0 - and if they didn't it wasn't because of the generics.

Generics just added new features and didn't affect the existing classes.

Still Java has also benefits! That's for sure; every platform has its benefits!

I just don't like it when something gets pushed into heaven for the sake of doing it and the other thing is dumped into hell just for the sake of doing it. WTF?!

Nothing is perfect and never will be. That's life; that's how everything works; we should finally get used to it.

Bashing doesn't bring anything. Useful and meaningful critigue is needed.
page 3 of 3
Comments: 64 | Views: 3685
Microsoft Communities