Red flags. Red flags everywhere.



  • Part of the appeal of Ruby is that it DOESN'T have the bloat associated with that. Hell most die-hard Ruby developers use Vim or whatever, because it's all CLI based and you use the CLI an awful lot in Ruby. I wouldn't develop a thick GUI with Ruby, but that's also not what it's specialty is even though it could do it.

    .NET is a great platform though, don't get me wrong (although I would prefer Java only because Java devs seem to at least know WTF design patterns and architecture is, and the Java ecosystem is heavily invested in using open source; .NET guys are more likely to rely on drag and drop and event-driven programming and have zero clue about any third party open source tools that could be useful, at least all the .NET shops I've seen in the Tampa Bay area were like that).


  • Garbage Person

    We have an in-house language. It's... Gnarly. 

    1) Does your language have automatic memory management?

    Yes! More accurately, it doesn't do memory management, because it doesn't compile to machine code, it compiles to an intermediate language that is interpreted into a series of service calls against web services.

    2) Can it be used to write portable applications?

    No, because it is tied inextricably to the interpreter and the aforementioned SOA

    3) Do quality tools exist to make a GUI using native widgets and behavior, with in a WYSIWYG editor?

    Negative. It is not designed to produce anything interactive.

    4) Does a quality IDE exist for the environment?

    It's mostly XML, so Visual Studio with some XSD's loaded does a good enough job.

    5) Does a quality "auto-format" utility or feature exist for the environment?

    Anything that auto-formats XML

    6) Does a quality debugger exist for the environment?

    What debugger? We're to the point that we can inspect values and insert breakpoints now (but only in dev and test, it isn't ready for prod yet), but we can't modify values.

    7) Does a mechanism for automatically downloading/updating dependencies exist for the environment?

    Yes, and his name is.... (That means no)


    I should also add that it doesn't have a complete set of control structures (for ages, we only had For Each loops. If and Else are brand new). And you can't nest control structures.  And exception handling didn't exist until just recently (and isn't in prod yet)



  • @ObiWayneKenobi said:

    .NET is a great platform though, don't get me wrong (although I would prefer Java only because Java devs seem to at least know WTF design patterns and architecture is, and the Java ecosystem is heavily invested in using open source; .NET guys are more likely to rely on drag and drop and event-driven programming and have zero clue about any third party open source tools that could be useful, at least all the .NET shops I've seen in the Tampa Bay area were like that).

    Wait, you prefer Java because developers are almost guaranteed to produce a huge WTFFactoryFactory, but .NET developers will not? What, exactly, is wrong with event driven programming?


  • BINNED

    @Cassidy said:

    There's still a school of thought that the skill is not in the tools but in those that wield them. I'm wondering if this has created a culture in which using better tools for improved development is perceived as a sign of weakness, ergo nobody wants to build better IDEs for those languages because there doesn't appear to be a demand for them.

    It is sad that developers with their rich skills in those languages don't think about turning their skills into improving the environment in which they - and others - work, but simply suck it up and get on with it. Cobbler's kids syndrome, I guess.

     

    If you work in C# or Java, you need an IDE. That doesn't mean that you necessarily need an IDE to work effectively in other languages that have little in common with C# or Java. For example, there is a Haskell plugin for Visual Studio. No one uses it. Similarly, there are IDEs and Eclipse plugins for Common Lisp, but most Lisp programmers use Emacs and find the IDE-like functions available there to be sufficient.

    I'll ask you the same question I asked blakeyrat: There are people who manage to get things done in other languages without a VS-like IDE. Sure, you can say that they have some kind of psychological syndrome, but would you be willing to consider the possibility that they know something you don't?



  • @pkmnfrk said:

    @ObiWayneKenobi said:
    .NET is a great platform though, don't get me wrong (although I would prefer Java only because Java devs seem to at least know WTF design patterns and architecture is, and the Java ecosystem is heavily invested in using open source; .NET guys are more likely to rely on drag and drop and event-driven programming and have zero clue about any third party open source tools that could be useful, at least all the .NET shops I've seen in the Tampa Bay area were like that).

    Wait, you prefer Java because developers are almost guaranteed to produce a huge WTFFactoryFactory, but .NET developers will not? What, exactly, is wrong with event driven programming?

    How about the fact that it turns into unmaintainable crap after a short period of time?  I'm not talking about Java WTF HammerFactoryFactoryFactory, but most .NET guys I've met and worked with have barely understood OOP, let alone the notion that you should have some type of repository/DAO classes for data retrieval, or if you really need to construct a complex object a Factory or a Builder class; hell I've met a lot of developers that had no idea what an Interface was, or where it's useful..There's nothing wrong with event-driven programming but (IMHO) the event should do nothing beyond call out to some service/presenter/viewmodel/controller/etc.

    I would take the HammerFactoryFactoryFactory over seeing 500 lines of procedural garbage inside the btnSave_Click method of Default.aspx any day of the week.



  • @ObiWayneKenobi said:

    Part of the appeal of Ruby is that it DOESN'T have the bloat associated with that.

    Ok, first of all, Ruby is bloated as shit. You type in "ruby myscript.rb" and wait 7 seconds while Ruby searches heaven and hell to ... whatever the fuck it's doing. Just-in-time compile? Some kind of weird interpreted linking process? Who knows. I'm not one to praise PHP, but if you fucking type "php myscript.php" it RUNS THE SCRIPT without the huge delay. So whatever you think "bloat" means is not what I think "bloat" means.

    Secondly, just because the tools exist doesn't mean you have to use them. Why do I keep seeing this argument? Idiot co-worker said the same thing when I suggested we move to C# for the data processing part of the solution. He uses a Mac (natch) and he said, "well there's no good C# dev tools for Mac." To which I replied: 1) MonoDevelop runs on Mac and it quite good, much better than anything in Rubyland, 2) you've been perfectly satisfied with a shitty text editor and running the program manually on the CLI for the last year, why not just use the same process with C# if you're ok with that process for Ruby? Nothing about C# requires an IDE. To which he replied, "derp". (Actually he got into that whole, "well I consider IDEs a crutch" attitude which is the most ridiculous thing I've ever heard.)

    @ObiWayneKenobi said:

    Hell most die-hard Ruby developers use Vim or whatever, because it's all CLI based and you use the CLI an awful lot in Ruby.

    Yeah but there's no law saying it has to be CLI-based. It's only CLI-based because nobody's fucking bothered to write any decent GUI tools for it. Not because there's something inherent in the design of the language that forces it to be CLI-based.

    @ObiWayneKenobi said:

    .NET is a great platform though, don't get me wrong (although I would prefer Java only because Java devs seem to at least know WTF design patterns and architecture is, and the Java ecosystem is heavily invested in using open source;

    Haha, I'd love to see some evidence to back this up. Snoofle's place uses Java, remember... I guess to you that means they all know what design patterns and architecture is?

    @ObiWayneKenobi said:

    .NET guys are more likely to rely on drag and drop and event-driven programming

    And that is undesirable because...?

    @ObiWayneKenobi said:

    and have zero clue about any third party open source tools that could be useful, at least all the .NET shops I've seen in the Tampa Bay area were like that).

    What tools are you referring to here? What third party open source tool is better than the ones that ship from Microsoft for the .net ecosystem?

    But hell, even the third party open source .net tools (i.e. MonoDevelop and related) are a shit-ton better than anything that comes with Ruby. At least it doesn't fucking use Java. Yeah it uses GTK, which is shit, but it's not fucking Java. It has an integrated debugger, decent code highlighting/folding, a *gasp* actual fucking project file. I'd go as far as to say that MonoDevelop is the best open source IDE in existence right now. And it deals exclusively with .net.



  • @PedanticCurmudgeon said:

    If you work in C# or Java, you need an IDE.

    Explain.

    @PedanticCurmudgeon said:

    I'll ask you the same question I asked blakeyrat: There are people who manage to get things done in other languages without a VS-like IDE. Sure, you can say that they have some kind of psychological syndrome, but would you be willing to consider the possibility that they know something you don't?

    Believe me, these guys don't know anything I don't... you should see their shitty-ass code. I don't know Ruby or PHP well, but I know awful fucking code when I see it. ("It" being a 4,600 line PHP script that we recently replaced by a 120 line SQL query. Well two queries and a temp table. Speaking of procedural garbage!) Their lead dev (the Ruby guy) had a Facebook import process that took 20 hours because 1) he didn't know how to write threaded code, 2) he didn't know you could send batched requests to the Facebook API, 3) he didn't know how to properly handle errors, so if one API call failed it re-ran the entire process. That's why they brought me in, they were reaching the "point of no return" where collecting data was almost taking longer than a full day. I'm not saying giving them an IDE and debugger would suddenly make them better programmers, but believe me it couldn't possibly make them worse.

    The thing that's different between us has nothing to do with what I know, but it has to do with the capabilities I have. My short-term memory isn't strong enough to use a CLI-type environment-- in that environment I end up spending like 2/3rds of my time looking things up or taking notes and I'm not at all efficient. I can't remember arguments for functions, or what order they go in. Stuff I could get from an IDE just by hovering my mouse in the right spot. I can't keep folder paths in my head, because I navigate my computer spatially (blame my upbringing on Mac Classic, perhaps). I just don't have the kind of brain that's suited for it.

    They do. But they don't have the kind of brain that's suited for designing a back-end data collection and processing process. Demonstrably.

    If Ruby had decent tools, they could work their way and I could work mine and everybody would be happy. As-is, it's a giant cluster-fuck debate where I'm telling them we need to switch the data processing platform to a language that makes sense and has real threads, and them telling me how stupid I am because obviously languages with strong-typing are traps set up Hitler long ago to confuse us all until his Argentinian clone army can invade. Or something.

    I don't know how it'll come out-- but I don't think their lead Ruby guy and me can be on the same team, and I've never been more tempted to just quit the job and take a little sabbatical until after the holidays. Goddamned that idea sounds good to me.



  • @Cassidy said:

    @El_Heffe said:

    @blakeyrat said:

    BTW, we should write a Joel Test for programming environments, since I didn't imagine in a million years how awful the Ruby ecosystem actually is. It should be something like this:

    Excellent list.

    It IS, actually. Blakey - you should consider whacking that up on your blog (or submitting it to some programming site) to invite feedback and further discussion about what features exist and how they're used in IDEs.

    It's just forum barf. Anyway the only programming site I read is this one, and by this point I doubt anyone will ever put any of my shit on the front page.



  • I didn't say Ruby was GOOD (although I like it for general scripting.

    What third party tools are better?  Let's see... SVN, Git, Mercurial are better version control systems than TFS and 100% free.  NHibernate beats the pants off of Entity Framework, and thre are also other ORMs like Subsonic and micro-ORMs like Dapper and PetaPoco.  Until ASP.NET MVC was out, MonoRail was better than WebForms.  Ninject, StructureMap and other IoC containers are worlds better than Unity.  NUnit and MbUnit are better than MSTest or whatever the built-in unit testing framework is called, and doesn't require the more expensive version of Visual Studio to get.  Shall I go on?

    As I said, in my experience .NET guys in my locale are useless hacks that don't understand anything about good design, or software quality, or craftsmanship; they only know how to hack out code like monkeys.  That's not to say that Java is better - there are good and bad Java devs BUT I believe that Javaland has a much more ingrained ecosystem in software quality and third party offerings than .NET does, partially because for the longest time Microsoft kept a tight leash on anything it had and it was only the cutting edge and "elite" that knew alternatives.  If you mention Hibernate, JUnit or Spring/Struts/Seam/framework-du-jour in Java, you're much less likely to get a response like "Oh, I've never heard of that before" like you would if you mention NHibernate or NUnit or MVC to the typical Microsoft dev.



  • @ObiWayneKenobi said:

    What third party tools are better? Let's see... SVN, Git, Mercurial are better version control systems than TFS and 100% free.

    They're significantly worse for me, since none integrate with VS. SVN at least has TortoiseSVN, which is a decent interface, but it doesn't do what TFS does (there's no linkage between your bug database and TortoiseSVN), and it still doesn't integrate with VS. (Yes, yes, I know there are VS extensions, yadda yadda.) Why should I have to leave my IDE to get a quick diff? Why should I have to open up my web browser to see what bug entry was associated with a code check-in? (Assuming my co-worker actually bothered to annotate that. TFS can be set to force-- er "strongly encourage"-- it.)

    Git is what we're using now. It's certainly not superior to TFS. The only GUI that actually fucking installs (TortoiseGit doesn't, I should write up a post about it because it's a fucking retarded error) is awful. It still doesn't integrate with my IDE. It does integrate with a bug tracker, but there's no linkage (as far as I am aware) that lets you look at a particular commit and click a link to find out what bug/issue it resolved. There's no insistence that developers actually upload their commits to the server, nor is there any way to set it to do that... so every fucking dev status meeting starts with "hey guys upload your code so we can review it".) (TFS and SVN require commits to be uploaded right away, a much better design.)

    @ObiWayneKenobi said:

    NHibernate beats the pants off of Entity Framework, and thre are also other ORMs like Subsonic and micro-ORMs like Dapper and PetaPoco.

    I don't generally use ORMs. Where does LINQ rank, in your opinion?

    @ObiWayneKenobi said:

    Until ASP.NET MVC was out, MonoRail was better than WebForms.

    Oh the open source time machine! Let's assume this argument takes place in the present, and not go with the retarded, "well if you go back in time 12 years Linux is better because it had blah first." Because nobody fucking cares.

    @ObiWayneKenobi said:

    Ninject, StructureMap and other IoC containers are worlds better than Unity.

    Unity is a game development framework. So... I have no fucking clue what you're talking about, and frankly I'm fuzzy on the concept of a "IoC container". It sounds like your open source tools are sure buzzword-compliant though.

    @ObiWayneKenobi said:

    NUnit and MbUnit are better than MSTest or whatever the built-in unit testing framework is called, and doesn't require the more expensive version of Visual Studio to get.

    I'm pretty-sure NUnit is the built-in unit testing framework. Another time machine? Or am I the WTF?

    @ObiWayneKenobi said:

    Shall I go on?

    Knock yourself out.

    @ObiWayneKenobi said:

    As I said, in my experience .NET guys in my locale are useless hacks that don't understand anything about good design, or software quality, or craftsmanship; they only know how to hack out code like monkeys.

    Ok.@ObiWayneKenobi said:

    That's not to say that Java is better

    B-but you did say that...

    @ObiWayneKenobi said:

    - there are good and bad Java devs BUT I believe that Javaland has a much more ingrained ecosystem in software quality and third party offerings than .NET does,

    I'm sorry, I've been exposed to the Java ecosystem and you're flat-out wrong. There are entire classes of tools that Java has literally nothing even half-decent-- take GUI designers. The Maven build system is arcane, complex, and seems to run in a non-deterministic fashion. The Tomcat web server is too fucking stupid to automatically serve up new versions of files without being rebooted 27 times. The IDEs are godawful, although! they are better than Ruby IDEs.

    Oh and that's not to mention the JVM bugs that make it literally impossible to write a correct Windows application in the language. (Well, you can fudge by going outside the JVM and making native calls, but why the fuck should you have to?)

    Maybe for a specific type of app, Java is better than .net. I can't think of what app that would be unless you cheat and include Java-only platforms like Android... but hey benefit of the doubt.

    @ObiWayneKenobi said:

    partially because for the longest time Microsoft kept a tight leash on anything it had and it was only the cutting edge and "elite" that knew alternatives.

    The ENTIRE FUCKING LANGUAGE AND FRAMEWORK IS OPEN SOURCE. What "tight leash"? What the holy fuck are you talking about?

    @ObiWayneKenobi said:

    If you mention Hibernate, JUnit or Spring/Struts/Seam/framework-du-jour in Java, you're much less likely to get a response like "Oh, I've never heard of that before" like you would if you mention NHibernate or NUnit or MVC to the typical Microsoft dev.

    Possibly, but that doesn't mean the .net dev is worse at writing software. That means they don't subscribe to the same philosophies you do, or that they consider the Microsoft-provided tools good enough to not bother looking for potentially inferior replacements.



  • Maybe Unity is the wrong name, I forget but it's an Inversion of Control container Microsoft came out with; the general concensus was that, like most things Microsoft reinvents it was okay but not as great as the open-source alternatives that people had already been using for years while there was no MS version.  Also, unless they changed something in 2012 NUnit wasn't the built-in test framework, they wrote their own since it's slightly different than NUnit's syntax.  LINQ to SQL is nice but still fairly primitive (but in it's defense it was meant to be a placeholder since EF wasn't ready; the other rumor I heard is that LINQ to SQL was made by the C# team, EF was made by the DB team, and the DB team won); LINQ itself is amazingly great and I love it, but the kinda-sorta-but-not-really ORM version isn't that great (however it's better than using DataSets and DataReaders).

    I'm a big proponent of the "Alt.NET" movement where you DON'T rely only on Microsoft technologies, so yes I am biased.  After one too many jobs with clueless devs that didn't bother to keep even abreast of new and better things in their own space (not saying they had to be bandwagon jumpers, but at least be fucking aware of what the "pros" in your field swear by), I've gotten very jaded.  Being fired from a job for being the only guy on the dev team to actually give a shit about quality and writing maintainable code (you know, so we don't have it crashing 5+ times a day) will do that to you, especially when you've had common sense ideas like "Let's have standard naming conventions" and "Let's avoid 5000 line methods" be shot down.

    I have a vested interest in .NET since it is/was my primary platform, so it pains me to go for interviews and whatnot and discover that I'm the only one who reads blogs and watches screencasts and plays around with new(er) things so I can write better code.  Feeling like the smartest person on the team, if not in the entire company, every single time you find something that might possibly be interesting wears thin after a while. Some of it aren't big deals (e.g. which ORM or IoC container; I have my preference but it's not a big deal) while others are (e.g. if you rely 100% on code-behind, don't do testing, use DataSets and DataReaders everywhere, etc.)



  • @ObiWayneKenobi said:

    After one too many jobs with clueless devs that didn't bother to keep even abreast of new and better things in their own space (not saying they had to be bandwagon jumpers, but at least be fucking aware of what the "pros" in your field swear by), I've gotten very jaded.  Being fired from a job for being the only guy on the dev team to actually give a shit about quality and writing maintainable code (you know, so we don't have it crashing 5+ times a day) will do that to you, especially when you've had common sense ideas like "Let's have standard naming conventions" and "Let's avoid 5000 line methods" be shot down.

    This is certainly a .NET issue. I hear they're going to fix it in .NET 5.



  • @pkmnfrk said:

    @ObiWayneKenobi said:

    After one too many jobs with clueless devs that didn't bother to keep even abreast of new and better things in their own space (not saying they had to be bandwagon jumpers, but at least be fucking aware of what the "pros" in your field swear by), I've gotten very jaded.  Being fired from a job for being the only guy on the dev team to actually give a shit about quality and writing maintainable code (you know, so we don't have it crashing 5+ times a day) will do that to you, especially when you've had common sense ideas like "Let's have standard naming conventions" and "Let's avoid 5000 line methods" be shot down.

    This is certainly a .NET issue. I hear they're going to fix it in .NET 5.

     

    LOL.  Seriously though I'm fully aware it's not an issue with .NET, but I do find the mentality a LOT more frequent in .NET devs; the few Java guys I've talked to (and Ruby and Python devs) seem a lot more interested in craftsmanship and quality than their .NET counterparts.  Same like how you're more likely to find WTFs in VB or PHP, but despite the running joke here that doesn't mean VB or PHP are bad languages (well okay, PHP is a bad language, but it can be used in a good way).

     



  • @ObiWayneKenobi said:

    Seriously though I'm fully aware it's not an issue with .NET

    Then shut the fuck up. Why is this hard?



  • @ObiWayneKenobi said:

    Inversion of Control container

    Oh yeah I think I saw that episode, the Daleks found it in a time warp and were going to use it to swap places with the Cybermen in the alternate zeppelin reality and the Doctor had to stop them with the power of love.

    What the fuck are you talking about? I've been writing code for a good number of years, and I've never perceived a need for a "Inversion of Control container", but then again I don't even know what the holy shit that is.

    @ObiWayneKenobi said:

    I'm a big proponent of the "Alt.NET" movement where you DON'T rely only on Microsoft technologies,

    Why? What is the point of that?

    @ObiWayneKenobi said:

    After one too many jobs with clueless devs that didn't bother to keep even abreast of new and better things in their own space (not saying they had to be bandwagon jumpers, but at least be fucking aware of what the "pros" in your field swear by),

    The pros in my field swear by "Inversion of Control containers?" News to me.

    @ObiWayneKenobi said:

    I have a vested interest in .NET since it is/was my primary platform, so it pains me to go for interviews and whatnot and discover that I'm the only one who reads blogs and watches screencasts and plays around with new(er) things so I can write better code.

    My code must be so awful, I don't have a single "Inversion of Control container" in it.

    @ObiWayneKenobi said:

    Feeling like the smartest person on the team, if not in the entire company, every single time you find something that might possibly be interesting wears thin after a while.

    Well fortunately it's just a feeling and there's no truth to it. In fact, since it'll help you feel better, from reading your posts here I think you're a complete moron who has no idea how to build software. (Hint: using technologies you fully understand the other people on your team aren't familiar with is a pretty big WTF.)

    And I still don't get what your obsession with DataReaders and DataSets is. What the hell man?



  • No offense, but you seem to be the same (although +1 for a Doctor Who reference).  Go read some blogs by people like Ayende Rahien, Jeremy Miller, Jimmy Bogard, Rob Conery, and the like, or even Robert C. "Uncle Bob" Martin (he's a Java guy but started most of the "software craftsmanship" movement).  Go to codebetter.com and devlicio.us and lostechies.com.  Those people are who I consider to be the "pros" in the field; the guys who write books and create open-source tools and give presentations on code quality.  Those are the developers I try to emulate.

    I think you and I just need to agree to disagree.



  • @ObiWayneKenobi said:

    What third party tools are better?  Let's see... SVN, Git, Mercurial are better version control systems than TFS and 100% free. 
    What?  You think those are better than TFS?  Especially GIT?!

    @ObiWayneKenobi said:

    NHibernate beats the pants off of Entity Framework, and thre are also other ORMs like Subsonic and micro-ORMs like Dapper and PetaPoco.

    I've used Hibernate, not NHibernate, but didn't have a problem with it or EF, but you think that Dapper is better than EF??!

    @ObiWayneKenobi said:

    Ninject, StructureMap and other IoC containers are worlds better than Unity. 

    Ninject seems good.... but STRUCTUREMAP? REALLY? 

    Is it: "If it's Microsoft everything else is automatically better"?

    @ObiWayneKenobi said:

    I'm a big proponent of the "Alt.NET" movement where you DON'T rely only on Microsoft technologies, so yes I am biased. 
    Oh, well ok then.



  • Blakey, I'm honestly surprised you don't even know what an IOC container is.  I'd be interested in seeing how you manage dependencies (if the code you're working on has proper DI).



  • @PedanticCurmudgeon said:

    I'll ask you the same question I asked blakeyrat: There are people who manage to get things done in other languages without a VS-like IDE. Sure, you can say that they have some kind of psychological syndrome

    Firstly... I wouldn't say that. They have reasons for not using an IDE, some of which could be internal (don't like them, not used them, never been shown how to use them) or external (choice of IDE forbidden by corporate policy, integration issues, support issues, peer pressure). I write code without an IDE but in my case I'm not involved in large-scale development - more small hackery scripts - and I favour a simple editor plus other windows showing logfiles.

    @PedanticCurmudgeon said:

    but would you be willing to consider the possibility that they know something you don't?
     

    I'd say it's an absolute certainty. They know the reasons why they do/don't use an IDE (or one specific IDE over another).

    I'm simply questioning if the situation is the other way around: are they not using an IDE - or their choice of IDE - because they don't know something other people do?



  • @ObiWayneKenobi said:

    No offense, but you seem to be the same

    Same as...?

    Ok, if I have to read years worth of blogs, then you have to answer some of the questions we've been queuing up during this thread:

    1) Do you have any evidence that Java developers (in general) are more aware of design patterns and architecture than .net developers?

    2) Why is using drag & drop and event-driven programming undesirable?

    3) What "tight leash" is Microsoft keeping on the .net environment, considering .net, C#, and associated libraries are all open source?

    4) What's the point of the "alt.NET" movement, which is apparently against relying only on Microsoft technologies?

    5) What's wrong with DataReaders and DataSets?



  • @Sutherlands said:

    Blakey, I'm honestly surprised you don't even know what an IOC container is. I'd be interested in seeing how you manage dependencies (if the code you're working on has proper DI).

    I think people are using the word "dependencies" in a way I've never been exposed to. When I hear "dependencies" I think things like, "well this app is WebForms so a dependency is IIS and IIS has a dependency on Windows Server and Windows Server has a dependency on an Intel-based hardware platform".

    However I skimmed one of ObiWayne's blogs when I was on the bus (the devlicio.us one, which he didn't bother to link because he's a jerk) and it had an article on, supposedly, IoC containers. Which started by quoting a programmer saying that implementing a IoC container was a huge disaster for his product. Then it spent roughly 3 Moby Dicks talking about pretty much everything except what the holy shit an IoC container actually does. I gave up before he got to the actual explanation of what the shit it was, naively assuming he ever got there. I firmly believe that, as a general rule, if you can't explain something in 500 words or less, you don't understand it yourself.

    I get the distinct sense it's something that (another Joel reference here:) architecture astronauts use to make their code somewhat manageable when they have abstractions stacked on abstractions stacked on abstractions stacked on abstractions. Fuck that.

    My philosophy is and has always been KISS-- Keep It Simple, Stupid.

    If you need things like dependency injection (which I assume is what you mean by DI) and inversion of control containers (which apparently can't even be explained in less than 50,000 words) then your code is Too. Fucking. Complicated. Back away, take a deep breath, and spend some time actually breaking down the problem into smaller, simpler, manageable chunks.

    And for the record, all of ObiWayne's discussion of code quality is bullshit for two reasons:

    1) Filling up your code with all this complex bullshit doesn't increase its quality; in fact it's pretty much guaranteed to decrease its quality as soon as it's maintained by someone who doesn't understand the complex bullshit. Because he'll fuck it up.

    2) The whole fucking point of the exercise is program quality, but code quality. Git could have the cleanest, most dependency injected, most inversion of control contained, code in the fucking universe, and the product still soundly sucks shit compared to TFS which is probably a mess of spaghetti C++.


  • BINNED

    @blakeyrat said:

    @PedanticCurmudgeon said:
    If you work in C# or Java, you need an IDE.

    Explain.

    To the person who's convinced that he can't use Ruby because it doesn't have a GUI debugger that works the same way as Visual Studio? If anything, you should be explaining that to me.

    @PedanticCurmudgeon said:
    I'll ask you the same question I asked blakeyrat: There are people who manage to get things done in other languages without a VS-like IDE. Sure, you can say that they have some kind of psychological syndrome, but would you be willing to consider the possibility that they know something you don't?

    Believe me, these guys don't know anything I don't... you should see their shitty-ass code.

    We've gone over this before. Ask people who actually know what they're doing instead of the fuckwits you work with.



  • @PedanticCurmudgeon said:

    To the person who's convinced that he can't use Ruby because it doesn't have a GUI debugger that works the same way as Visual Studio?

    Who's that? It doesn't resemble anything I've ever said.

    @PedanticCurmudgeon said:

    If anything, you should be explaining that to me.

    Sorry that's not how it works. You broached the topic, so you're responsible for explaining it. I can't explain it because (strangely) I'm not able to read your mind.

    @PedanticCurmudgeon said:

    We've gone over this before. Ask people who actually know what they're doing instead of the fuckwits you work with.

    If ObiWayne gets to judge .net based on fuckwits, then I get to judge Ruby based on fuckwits.

    But since you're obviously so much better than the fuckwits I work with, why don't you point me to the well-hidden, super-secret, quality Ruby IDE & debugger?


  • ♿ (Parody)

    @blakeyrat said:

    However I skimmed one of ObiWayne's blogs when I was on the bus (the devlicio.us one, which he didn't bother to link because he's a jerk) and it had an article on, supposedly, IoC containers. Which started by quoting a programmer saying that implementing a IoC container was a huge disaster for his product. Then it spent roughly 3 Moby Dicks talking about pretty much everything except what the holy shit an IoC container actually does. I gave up before he got to the actual explanation of what the shit it was, naively assuming he ever got there. I firmly believe that, as a general rule, if you can't explain something in 500 words or less, you don't understand it yourself.

    I noticed he used "UI" and didn't explain what that was, either. The nerve.

    @blakeyrat said:

    If you need things like dependency injection (which I assume is what you mean by DI) and inversion of control containers (which apparently can't even be explained in less than 50,000 words) then your code is Too. Fucking. Complicated. Back away, take a deep breath, and spend some time actually breaking down the problem into smaller, simpler, manageable chunks.

    And obviously you can't appreciate the irony of your statement saying to break things into little chunks while ranting about a concept designed to help you do exactly that.

    Ignorance is OK. Except when you work so hard to cultivate it.


  • Discourse touched me in a no-no place

    @blakeyrat said:

    @PedanticCurmudgeon said:
    To the person who's convinced that he can't use Ruby because it doesn't have a GUI debugger that works the same way as Visual Studio?

    Who's that? It doesn't resemble anything I've ever said.

    This must have been your twin brother then:<br/ >


    @blakeyrat said:
    I just don't like them (and where does this "not bothering to learn anything" shit come from anyway?) Did it ever occur to you that the reason I don't like those technologies is because they're all stuff that was obsolete 25 years ago? I'm not a Tech Luddite, I'm a "Tech Modernist". Which is pretty much the exact opposite.



    Look. Microsoft Basic 1.0 on my Mac in 1986 had a GUI debugger with breakpoints, conditional breakpoints, setting breakpoints while executing, an inspector, etc. In 1986. Ruby, in 2012, does not have a [GUI] debugger that good. This is fucking ridiculous. Fucking. Ridiculous.



  • @PJH said:

    This must have been your twin brother then:


    @blakeyrat said:
    I just don't like them (and where does this "not bothering to learn anything" shit come from anyway?) Did it ever occur to you that the reason I don't like those technologies is because they're all stuff that was obsolete 25 years ago? I'm not a Tech Luddite, I'm a "Tech Modernist". Which is pretty much the exact opposite.



    Look. Microsoft Basic 1.0 on my Mac in 1986 had a GUI debugger with breakpoints, conditional breakpoints, setting breakpoints while executing, an inspector, etc. In 1986. Ruby, in 2012, does not have a [GUI] debugger that good. This is fucking ridiculous. Fucking. Ridiculous.

    Did you read your own post? Did you read the text you quoted?

    I specifically say I don't like it not that I can't use it. Do you understand that those are two different things? Do you understand that I've posted here multiple times that not only can I used Ruby, but I did use Ruby to de-WTF their code?

    Fuck man.


  • BINNED

    @Cassidy said:

    I'm simply questioning if the situation is the other way around: are they not using an IDE - or their choice of IDE - because they don't know something other people do?

    Most people who use Haskell and Lisp (this may also be true of Ruby and Python) also have experience with either C# or Java, so probably not.



  • @blakeyrat said:

    Stuff about DI and IOC
    Quite the opposite.  DI is supposed to make your code simpler because you don't have to worry about how everything interacts.  You can create modules that implement interfaces, and you don't have to worry about how everything else works.  It also makes it easily testable.  You don't need an IOC container to manage dependencies, either... it's just one way to put all the pieces together so that you can completely decouple objects.  It's essentially your InstanceFactory (probably what similar classes would be named in Java).

    Example:
    class MyClass{

    DatabaseLogger logger = new DatabaseLogger();

    }

    =====================

    The DatabaseLogger is a dependency, and makes it hard to test that.  Let's pull that functionality out into an interface, then the dependency can be injected into the constructor.

    =====================

    class MyClass{

    ILogger _logger;

    public MyClass(ILogger logger) {_logger = logger;}

    }

    =====================

    Now, when we are testing it, we can pass in a Mock Logger, that ignores what is logged, or verifies it... but now our tests aren't dependant on a network connection, or (really) any other class. If there's a bug in that class, it won't affect this class working.

    =====================

    Now, to manage your dependencies, you can do something like creating a basic constructor that retrieves them:

    =====================

    class MyClass {

    ILogger _logger;

    public MyClass() : this(new DatabaseLogger()); //or

    public MyClass() : this(LoggerFactory.GetLogger());

    public MyClass(ILogger logger) {_logger = logger;}

    }

    =====================

    This allows you to easily test things, or to pass in specific instances if you want them, but it still couples your code (either with the DatabaseLogger or the LoggerFactory).  With an IOC Container, it manages injecting all the dependencies for you.  You set them up at the beginning, and then do:

    =====================

    MyClass instance = Unity.Resolve<MyClass>();

    =====================

    and it will create the class for you, and pass in whatever ILogger you have set up.

    =====================

    There you go, less than 300 words. 


  • Considered Harmful

    @blakeyrat said:

    Fuck man.



  • @Sutherlands said:

    DI is supposed to make your code simpler because you don't have to worry about how everything interacts.

    I already don't worry about how everything interacts.

    @Sutherlands said:

    You don't need an IOC container to manage dependencies, either...

    For the record you still haven't defined "dependency" in this context, because you're using it in a way I've never come across before.


  • Considered Harmful

    Dependency: an instance of a class required by another class. It was shown in the example, MyClass needed a logger. It depended upon having a logger instance. In the old bad world, it would grab a singleton or instantiate it itself. This made the two components tightly coupled and difficult to test in isolation. In the new world, the class constructor takes the instance it depends upon as a parameter, allowing you to inject the dependency. This allows you to inject the database logger in your production code and the dummy logger in your unit test code. The classes are no longer tightly coupled.

    Removed this paragraph because I'm not sure I understand Inversion of Control fully yet.



  • If you read between the lines, I was just calling him a shitty teacher because he didn't define the term "dependency" after his student specifically said he didn't understand how the term was being used. But I was trying to be polite.

    Yes, from the examples I got a sense of what he meant by "dependency", but I had to guess and assume and I hate that.

    Anyway as far as passing around a Logger instead of having every class create it's own, duh? Of course I do that. I just don't use your fancy-nancy terms for it.


  • Considered Harmful

    I think at least some of these frameworks are trying to make life easier by keeping you from needing to juggle around a dozen different instances of your various dependencies, instead giving you a neatly categorized catalog of shared dependencies relevant for the current environment configuration. I'm still researching them, but that's why I lurk here. I pick up stuff.

    IoC remains a bit nebulously defined (that's your cue, guys).



  • @blakeyrat said:

    For the record you still haven't defined "dependency" in this context, because you're using it in a way I've never come across before.

    A dependency as in "A depends on B", where class/interface A requires knowledge of class/interface B to facilitate either its (interface) specification or implementation. E.g.

    public interface ISupplier {
    }
    
    public class Client {
      private readonly ISupplier _Supplier;
    
      public Client( ISupplier supplier )
      {
        _Supplier = supplier;
      }
    }
    

    Here creating an instance of Client will require an instance of type ISupplier. In other words: ISupplier is a dependency of Client.

    Your typical IoC Container will allow you to configure a set of mapping rules that can satisfy these dependencies automatically for you. It would allow you to specify a rule of the form: "When I ask for an instance of type Client, I expect you to supply the constructor with an instance of whatever type I have configured that implements ISupplier."

    For instance with Unity:

    // Create a container to hold mapping rules.
    IUnityContainer container = new UnityContainer();
    

    // Configure FooSupplier as the type to inject for ISupplier.
    container.RegisterType<ISupplier,FooSupplier>();

    // Resolve an instance of Client through the container; Unity analyzes the constructor and
    // finds that the first argument is of type ISupplier. It builds and injects an instance of
    // the configured FooSupplier class when constructing the instance of Client you asked for.
    Client client = container.Resolve<Client>():

    Ofcourse this is a trivial example. When you upscale and get more complex relations / dependencies to handle, then the IoC pattern becomes an easy way to manage dependencies and swap them out, e.g. for unit testing.



  • @blakeyrat said:

    @Sutherlands said:
    You don't need an IOC container to manage dependencies, either...

    For the record you still haven't defined "dependency" in this context, because you're using it in a way I've never come across before.

    You're right, I didn't say what a dependency was, but I did say what was a dependency.  Most people can use logical thinking.  Apparently, so can you, you just choose to be difficult.



  • What's the point of an interface if you have a 1:1 relationship between interfaces and classes?



  • @joe.edwards said:

    IoC remains a bit nebulously defined (that's your cue, guys).
    Inversion of control is basically where you don't know what you're calling until runtime.  This is because you're using event callbacks or calling into an interface.  This can be achieved by using constructor or setter injection (DI), factories, or some other way to get the instance at runtime.  From Wikipedia: "Inversion of control is sometimes facetiously referred to as the "Hollywood Principle: Don't call us, we'll call you", because program logic runs against abstractions such as callbacks."



  • @blakeyrat said:

    What's the point of an interface if you have a 1:1 relationship between interfaces and classes?
    Well, just off the top of my head, testing.



  • @Sutherlands said:

    You're right, I didn't say what a dependency was, but I did say what was a dependency. Most people can use logical thinking.  Apparently, so can you, you just choose to be difficult.

    Pretty sure I never asked for the lecture in the first place, buddy. But if you're going to write a lecture, write it well.



  • @Sutherlands said:

    @blakeyrat said:
    What's the point of an interface if you have a 1:1 relationship between interfaces and classes?
    Well, just off the top of my head, testing.

    How?



  • @blakeyrat said:

    @Sutherlands said:
    @blakeyrat said:
    What's the point of an interface if you have a 1:1 relationship between interfaces and classes?
    Well, just off the top of my head, testing.

    How?

    @Sutherlands said:
    Now, when we are testing it, we can pass in a Mock Logger, that ignores what is logged, or verifies it... but now our tests aren't dependant on a network connection, or (really) any other class. If there's a bug in that class, it won't affect this class working.



  • @blakeyrat said:

    @Sutherlands said:
    You're right, I didn't say what a dependency was, but I did say what was a dependency. Most people can use logical thinking.  Apparently, so can you, you just choose to be difficult.

    Pretty sure I never asked for the lecture in the first place, buddy. But if you're going to write a lecture, write it well.

    You're right, what you said was akin to: "That's not what I think a dependency is.  I don't understand what IOC containers are.  ObiWayne doesn't explain what IOC containers are.  IOC containers aren't useful."

    Silly me for explaining the concepts to someone who was complaining about not understanding them.



  • @Sutherlands said:

    Silly me for explaining the concepts to someone who was complaining about not understanding them.

    I don't understand a lot of things. I don't give a shit about the vast majority of them. If I put in a quick reference to not understanding the rules of Cricket, do you take that to mean I care? Because I don't care.

    Oh and when I asked what the point of having a 1:1 interfaces-to-class relationship your replied with an example that requires having a 1:many interface-to-class relationship. So... good reading there.

    All of this shit sounds way too complex. Maybe there's some goddamned benefit, but how the fuck do you keep all this bullshit straight in your heads? Christ. I just write classes, methods, and sometimes inherit stuff from other stuff.



  • @blakeyrat said:

    I don't understand a lot of things. I don't give a shit about the vast majority of them. If I put in a quick reference to not understanding the rules of Cricket, do you take that to mean I care? Because I don't care.
    If you started talking about how the rules don't make sense and how Cricket was a pointless sport, probably.  If you just said "I don't understand cricket" then probably not.@blakeyrat said:
    Oh and when I asked what the point of having a 1:1 interfaces-to-class relationship your replied with an example that requires having a 1:many interface-to-class relationship. So... good reading there.
    I mean... I GUESS you could consider "new Mock<ILogger>()" to be an implementation of an interface... but most people wouldn't.  So... good comprehension there.

    @blakeyrat said:

    All of this shit sounds way too complex. Maybe there's some goddamned benefit, but how the fuck do you keep all this bullshit straight in your heads? Christ. I just write classes, methods, and sometimes inherit stuff from other stuff.

    Do your functions span 1000 lines and your classes 5k?


  • @Sutherlands said:

    Do your functions span 1000 lines and your classes 5k?

    No.



  • I dunno about blakey but I used DI and IoC before I knew what the names for them were - just like I use a lot of patterns without knowing what they're called. IMO, if you're a good dev you'll unconsciously end up using the appropriate pattern(s) because your thinking will eventually take you there.

    On the topic of DI/IoC - they're great for code modularity, but terrible for code readability. I hate reviewing projects that make heavy use of these patterns because it's fucking impossible to figure out what the code is doing (i.e. which concrete implementation is being used). I also have an issue with devs who see DI/IoC as a hammer for every project, even when said project doesn't and will never need them.



  • And my whole argument wasn't "DI/IoC is a golden hammer" it was that .NET guys IN MY EXPERIENCE are more likely to have no fucking idea what DI/IoC even is, or when it would be useful, or have any desire at all to broaden their horizons by learning them so they can apply them IF they have the need. Most .NET guys in my experience are happy just relying on pure WebForms (i.e. no MVVM/MVP, just code-behind), DataSets and DataReaders (the key point made here is using them directly on the page, not that they're the root of all evil. You can use a DataSet or Reader for data retrieval, just put it into a DTO or business object for the consuming code), and really have no idea about craftsmanship or quality. That's been my personal experience over around 4 years or so; I got sick and tired of getting a "deer in headlights" look whenever I'd be talking to a fellow .NET dev (either at the job or on an interview) and just casually mention what their thoughts were on such-and-such (just for conversation) and got a look like "I've never heard of that before. We won't ever use that here." because it really made me think like none of them cared enough about their career to actually stay up to date.



  • @blakeyrat said:

    (Actually he got into that whole, "well I consider IDEs a crutch" attitude which is the most ridiculous thing I've ever heard.)
    Next time, say “Yes, yes it’s a crutch, and unless you can remember every parameter for every method for every class in the entire API, then you’re handicapped, so use the crutch instead of dragging yourself around by your fingernails.”

     @blakeyrat said:

    They're significantly worse for me, since none integrate with VS. SVN at least has TortoiseSVN, which is a decent interface, but it doesn't do what TFS does (there's no linkage between your bug database and TortoiseSVN), and it still doesn't integrate with VS. (Yes, yes, I know there are VS extensions, yadda yadda.) Why should I have to leave my IDE to get a quick diff? Why should I have to open up my web browser to see what bug entry was associated with a code check-in?
    There are [url=http://ankhsvn.open.collab.net/]AnkhSVN[/url] (free, and a full SCC provider) and [url=http://www.visualsvn.com/visualsvn/]VisualSVN[/url] ($$, and is just a VS-integrated interface to TSVN).

    Look in the TSVN help file under the “bug tracking” index entry. You can set some properties and have the log window automatically turn things like “addresses issue #1234” into a link to the bug tracker. It’s still your web browser, but you don't have to manually look the issue up.

    @ObiWayneKenobi said:

    And my whole argument wasn't "DI/IoC is a golden hammer" it was that .NET guys IN MY EXPERIENCE are more likely to have no fucking idea what DI/IoC even is, or when it would be useful, or have any desire at all to broaden their horizons by learning them so they can apply them IF they have the need.
    It sounds like you only ever run into VB6 guys who have learned only enough .NET to make their crufty old shit build again.

     

     



  • @Sir Twist said:

    It sounds like you only ever run into VB6 guys who have learned only enough .NET to make their crufty old shit build again.
     

    It sure feels that way sometimes.  A lot of the .NET shops around here just don't seem to have a clue; either they've built a lot of legacy systems back in the 1.1 and 2.0 days and have no desire to ever refactor or address them, but keep adding to them nonstop and forcing the same old standards, or they're just seemingly staffed with old VB6ers that are lazy.  I don't rightly know.  What I do know is constantly dealing with "senior" developers, tech leads, and managers/directors/CIOs that had zero clue about any new trends in .NET started to get to me - I mean I didn't expect them to be jumping on the bandwagon, but I DO expect good developers to at least do what I do and keep a little up to date on trends and tools and best practices.The last straw for me was being fired because I was the only person on the team wanting us to refactor our code, make it not unmaintainable garbage, and actually try to make it scalable so it didn't crash every day.

     



  • @Sir Twist said:

    @blakeyrat said:
    (Actually he got into that whole, "well I consider IDEs a crutch" attitude which is the most ridiculous thing I've ever heard.)
    Next time, say “Yes, yes it’s a crutch, and unless you can remember every parameter for every method for every class in the entire API, then you’re handicapped, so use the crutch instead of dragging yourself around by your fingernails.”

    IIRC, I said, "there's nothing wrong with using a crutch if you need one."


Log in to reply