I’ve come across this post, that deals about java and .net programmers. I must admit that the situation is the one depicted by the author, probably in the average, java programmers are better accustomed with stuff like DI, IoC, ORM, AOP, and design principle, respect of .net developer; but is it really ok to reduce programming skills only to the knowledge of those concepts?. In the end the main question is “Who states what is really important to know for a developer??”

I remember in the old days when I programmed in C++ or assembly code, (and java was still at the beginning), people saying “java programmers does not know anything about memory management, processors, registers, etc etc”, thus stating that C++ programmers are the “real programmers” respect java ones. There will always be a great debate on “what is important to know for a programmer” and I suspect that we will never reach a point of agreement. I use regularly Castle, AOP, NHibernate I recognize the fact that knowing those concepts is important, I found that I can write better software using these techniques, I love patterns, but I know also that they are not the only way to develop software.

I know good developers that knows nothing about DI, or AOP, but wrote C++ programs  that manage hardware in factories that runs 24/7 without any problem, and they have to manage very complex logic with PLC that have more than a thousand of I/O, where logic changes during time, where hardware change during time, where it is difficult to update software because you need to stop factory for a while, where the customer calls you even at 02:00 in the night, because if the software chrash the factory stops. In a scale from 0 to 10 I score them a 9, because they wrote software that works, and works for year without problem and works in difficult environment.

This is to point out that, IMHO, a programmer can be good even if he does not know nothing about pattern or DI etc and probably the amount of knowledge that makes a programmer “great” depends on the specific situation.

  • If you are developing a driver for a video card probably you should know very well concept as: Interrupts, Kernel of the operating system, Kernel API, assembly of the processor of choice, etc.
  • If you are developing a rendering engine for a video game you should have: good C++ and assembly skill, knowledge of physics, fluent with mathematics concept (matrix, quaternions), very good knowledge of computer graphics concepts (Rendering algorithms, Vertex/pixel Shader, geometric transformation) and  surely Directx or OpenGL. If you are developing on a console like playstation2 you should also have a Deep and intimate knowledge of the inner structure of the vertex shader, EE and SE processor.
  • If you are developing an operating system you should know: assembly, structure of the hardware, you should known low level communication protocol (DMA), memory management algorithm, security and a lot of other stuff.
  • If you are developing software that handles low level hardware such as RFID reader or PIC, you should be familiar with communication via RS232 as well as knowing the hardware that you use, you should know how to structure your application to make it up and running 24/7, you must deal with hardware failure etc.
  • If you are developing complex math library you must be familiar with data structure, with profiler and optimizer (speed is really important), you should know how to use specific compiler (like intel one) to make use of every optimization of the architecture to reduce execution time, as well as deep knowledge of mathematic
  • If you are developing a simulator for VLSI design probably you need to know a lot of different things.
  • If you develop an application on a ORACLE database and you need to manage trillions of records probably you need an intimate knowledge of ORACLE, how to tune up the index, and you must be a SQL-guru.

I can continue for long, but all of these kind of programmers does not need to know anything about ORM, DI, IOC or AOP, but are you sure that you can call them bad programmer only because they does not know those concepts?

I think that there is the right tool for each problem and I always worry about the syndrome of “if all you have is a hammer, everything looks like a nail”. There are such a great amount of different techniques in programming science, that we cannot reduce everything to the classic “DI IOC AOP ORM”.

alk.

22 Responses to “Java versus .Net programmers”

  1. I understand where you are heading, but, really… aside from university, HW vendors, and some hobbyists, how many developers do you know that have to deal with such things?
    95% of the dev I know works on apps for which OO and all the aforementioned concepts is important.
    I guess it just boils down to which is scenario that is addressed the most by developers:
    – Java and .NET are mainly developed for “Enterprise” applications
    – C++ is used when you need extreme control over the memory allocation, execution and that stuff

    These two require skills that are so different that can be seen as two different professions.

  2. I think that a good developer is the one that know how to resolve the problem and which tool/technology/concept to use. Be it Java, C#, C++, OOP, UML, whatever. Doesn’t matter really.

    Everything else could be considered as childish games, like “my little car is better than yours”.

  3. @Simone I develop applications that deal with RFID reader in C#, I used extensively DI, I have a plugin architecture that I made in .NET 1.0 where you can plugin dll for the hardware you use, because my core use IoC extensively. Everything is more manteniable, you have a new RFID reader hardware? ok no panic, just write a dll implementing the IRfidReaderInterface and you are done.
    But I see lot of people working in these areas (Rfid, hardware integration) that does not use these techniques, still they build strong and good applications.

    @Janko. Completely agree with you, the most important thing is to satisfy the customer, building an application that “resolve the problem”.

    I really love DI IOC and pattern, and all of those thing, I think they are important, I use these concepts in my applications extensively; but the concept I want to express with this post is: if I encounter a developer that does not know these concepts I cannot say that I’m better than him, or that he is not a good programmer.

    Alk.

  4. I agree that it is debatable which technologies – in any given context – a “good” programmer should know. Yet the main (at least to me) criticism uttered in the post you are referring to is the allegation that .NET programmers lack even the curiosity and willingness that are required if you are serious about honing your programming skills. And this, if true, would constitute a *real* divide between the Java and the .NET world.

    Olaf

  5. I think think the subject here is very important. However, a good programmer needs to understand the notions of these concepts – DI, patterns and AOP are only examples of important concepts, lots of important concepts were never mentioned in the original article. A good developer must understand when the use of such a technology is really useful and when it is merely a boondoggle into to well-known implementation land.

    As the original author was Java-centric, he may be more use to doing server-only development (DI). I question the utility of DI on desktop apps – but everyone knows that object creation can always be problematic.

    The point I would like to make is that we should understand these concepts. Their adoption for a given project should never be “automatic” (or because we have always done it like that). We should be selecting the best implementation strategy of each project each time.

  6. Really good post, I almost agree with you. You are certainly right when you said that the factors that discriminate a good programmer are not to find in the knowledge of the last technique or tool that he knows. But we have to distinguish between mere techniques (ORM, AOP, etc) and core skills (of course some are context depending) that programmers have to hold. For example in the OO context IMHO could be acceptable that a “good” programmer doesn’t know a specific technique but I cannot admit that he doesn’t have knowledge in concepts like pattern or OOA/OOD. @Simone: I know a lot of people working in areas where OO is not used or is not a must. Maybe in my region (Marche) there are more people in those categories than enterprise software developers.

  7. I think the good programmer is the one who spends time improving himself (or herself). He looks into new technologies and methods and makes sensible judgements about them.

    I can’t help thinking that DZone is starting to fill up with crap written by people who have learned a new buzzword and believe everyone that doesn’t use their method is wrong. These people are naive at best and arrogant at worst. They must believe that no software got written before various principles came along.

  8. For some people programming is just a job, why would they care about what is new in programming world ?

    most of it they cant use at work(from my experiance its not easy to use new framework at work).

    I think Java programmers are more news-orientated, because java job interviews are more news-orientated. Java programmer should not just know one web-framework(that really sucks about java). DI is very important, because you get asked about it.

    .net programmers have everything in the IDE, i think they are not asked about nHibernate(unless they are interviewed by java guy). I bet some .net programmers dont know Linq and i can understand that since they might be using .net 1.0. should they learn it just for job interview?

  9. @bob Yes you are right, maybe a good definition of “good programmer” is “one who spend time improving his skill”. If you constantly try to improve yourself surely you’ll become a good programmer.

    @Stefano: Yes, there is differences between core skill and “mere techniques”, but even for core skill is difficult to really find a common shared set. In an interview I dot not mind if people does not know DI or IoC, sure, these are really important, but sometimes people lacks the fundamentals. I found people that does not know the difference between a list and a set or that does not know even how a dictionary works. Sometimes I see piece of code like this.

    MyObject obj = new MyObject();
    obj = FunctionThatReturnMyObject();

    And when you ask “why are you creating an instance of an object in the first line, since the reference gets lost in the following one?”
    if the answer is “It works, who cares!”, then I’m sure to have found a “bad programmer”.

    Alk.

  10. Those little acronyms are manifestations of principles that allow for good object oriented design in skilled hands and a few are applicable only to statically typed languages with reflection support. If you are not doing OO, or using a language where these concepts are not needed or impossible to use then plainly they are not appropriate.

    And in a complex domain, you are quite correct in saying that domain knowledge is more important than pure programming technique.

    The primary reason there is less adoption in the .NET world of these concepts is because the use of OO in the business programming .net world is partial at best. The majority of .NET code I have seen in both web and desktop code is event driven procedural operations over records, with classes as not much more than modules.

    And yes, I would expect a .NET developer to learn Linq for a new job, it’s a huge improvement in the expressiveness of the language. I expect developers to invest time in learning the tools and concepts they are meant to be using in their work.

  11. If you are C++ Programmer thats the end of story!!! for Microsoft World if you know ATL/MFC, C# is walk in the park!!!!
    If you a non Microsoft Shop then fluent knowledge in C/C++ will take you places. Java is a piece of cake for C++ programmers!!!

    I respect ONLY who knows C/C++

  12. Great post, thanks for sharing your thoughts. I like the point you’re making: learn the right tool for your job; use techniques that are appropriate for your context. Many developers have not come to the realization that you have. You seem to have a good head on your shoulders–please continue sharing your thoughts.

  13. @Mettlus I do not agree with you completely, I must admit than in old days of C/C++ and assembly code I tended to consider C/C++ programmers better than others, but I was young :). Now I realized that being a “good programmer” is not a matter of language. In these days I’m programming only in C## and C++ missed me a lot, I lack STL library a lot, and I miss templates, but C# and .NET is targeted to different kind of problem.

    Still I agree with the fact that, if you are a good C/C++ programmer, moving to C# is quite simple, while reverse approach is surely more problematic.

    @Ryan: You got the point, a lot of .net programmer comes from Visual Basic that is not an OO language, and most of them completely missed even the basic of OO programming. If a programmer does not know OO surely it does not comprehend the advantages of DI, IoC, and other such techniques.

    Alk.

  14. This is the first time I’ve heard of DI, IOC and AOP….

    They sound fancy and unnecessary…

    Why do academics insist on making a developers life so damn difficult.

  15. I agree with “someguy”. I’m pretty much self taught in the programming world so terminology is lost on me. I just know if you ask me to do something, I can do it. I came into web development from a graphic design standpoint and things just compounded from there to the point where I am now an application developer, web developer, database administrator, etc.

    I know there is a “great debate” on which is better… java or .Net. Personally I favor .Net because it is where my experience is. That doesn’t mean I hate java or java developers though. I understand why we should learn as much as we can about all the different languages out there but let’s face facts… there are a million different ways to “skin a cat” but why should I learn them all. If I can do it efficiently and effectively using the language that I already know? I mean I’m all for “expanding my mind” but why waste time learning how to do something in Java if I can already do it in .Net?

  16. @someguy: These concepts we are speaking on are not fancy techniques made by academics, but basic conceps of OO programming. Surely you can develop without knowing them, but they can make your life easier.

    Alk.

  17. Meat & potatoes of this post:
    “If you constantly try to improve yourself surely you’ll become a good programmer.”

    So – stop just blogging about patterns, remember to code something too. And vica versa – stop being ignorant and learn something new, just because “It works, who cares!” is NOT enough.

  18. Frankly speaking, I’m getting tired of running into posts full of these acronyms: DI, IoC etc. Smart developers can use them without even knowings their names and without posting a number of blogs posts where they are whining about the people who don’t give a damn about their beloved patterns.

    As for the Java developers, you know, they are very proud of themselves, at least some of them who always tend to look down at C#, especially at its new features, like extension methods that break the concept of OOP according to them. But who cares? All those patterns are just tools for making your code better, but not a silver bullet.

  19. I’m a self taught, started at the age of 12 reading NCR manuals and the most important thing I’ve learned was to use PAPER and DATAFLOW diagrams. I know that sounds really stupid but is so good to plan in paper and not directly in the code-window, then and after I learned assembler and then C and then Pascal, languages that I’ve always thought are the “parents” of the rest.

    Actually I “can’t” count how many languages I “know” but I’m not an expert, except C/C++/C#/Assembler that are my beloveds.

    I have learned something else, new and good, when I don’t know I just read books! because always exist someone who really knows and I can learn by myself and I have a good training to make myself an opinion based in technical information, so… actually I don’t know LOTS! of acronyms, LOTS! of techniques, LOTS! of “etceteras” but I know when the situation comes, if I don’t know what to do, I research and apply the most precious tool Common Sense and Expertise. Doing this I have learned Patterns, OOP, AOP, DI, IoC, Hybernate, OSB (Oracle Service Bus) and lot of new things…. I think you become a good programmer while the time pass and if you center your mind not in the language/s you master but in the way you thing and how you research and use the tools.

    Finally a piece of word.

    “It isn’t important to know everything but, to have the phones of the persons who know then thing/s I need.”

    Regards.
    Gabriel

  20. Couple of mistakes! fast typing fast errors :P

    I think you become a good programmer while the time pass and if you center your mind not in the language/s you master but in the way you >>THINK and how you research and use the tools.

    Finally a piece of word.

    “It isn’t important to know everything but, to have the phones of the persons who know >>THE thing/s I need.”

  21. I think you are making an apples to oranges comparison here.

    Java & .NET are competitors in a sense that one is used over the other. It’s usually either/or and rarely both. But, C++ was in a different age and Java was an evolution. .NET was not an evolution from C++, it was MS’s response to Java.

    I’m sorry but your comparison is quite meaningless.

  22. Hi thanks for the post, It really helped me in my interview.