• s73v3r (unregistered) in reply to MiniMax
    MiniMax:
    This must be an old story.

    In times like this, the WTF is walking away from a job that screams JOB SECURITY for the next decade.

    And then in 10 years, you get laid off, and can't find a job because your skills have atrophied so bad.

  • Guest_boy (unregistered)

    If Stan is that good and Monty is an idiot (that thinks hes a genius) then Stan needs some idiot (that think hes a genius) bullsh*t.

    "Monty, this is a great design, I really see this being a deal-breaker, its awesome, Im right behind you on this one and if anyone else cant see it then screw 'em. Now, I wanna get this one just right so Im gonna take a few days to throw together a model of how it`s going to hang together - you know, iron out those wrinkles before we start."

    Aaaand, two weeks later....

    "Monty, the model's all done and its really gonna help, theres all the logging laid out and the debugging is real simple and, you know what, even the model runs super-quick. Are you sure you want me to put another 8 weeks doing this again or do you wan to go right ahead and say you`ve brought the project in 6 weeks early?".

  • C-Derb (unregistered) in reply to Xarthaneon the Unclear
    Xarthaneon the Unclear:
    C-Derb:
    I currently work with one of these "been here for 16 years coding Delphi and trying to pick up .Net" guys. I wrote some simple C# Lambda statements only to come in the following day to see a note explaining, "I rewrote your code into LINQ to make it easier for me to understand."

    My first thought was, "If you don't understand the lambda notation, then how do you know if you rewrote it correctly?" (answer: they weren't complex) Let's just say it was the first of many red flags.

    I see a red flag in this. Fluent syntax LINQ uses lambda expressions to express filtering conditions.

    Before I declare WTF one way or the other, could you give an example of the lambda expression and how it was rewritten? As a C# developer, and LINQ/lambda enthusiast, I'm idly curious.

    As I think about it, I probably screwed up the terminology (I used extension methods that he didn't understand). I tried looking through the source history to find the exact change, but I couldn't find it. Something like this...

    My Code:

    public IEnumerable<WidgetModel> GetWidgets(Int32 id)
    {
      return _context.Widgets
           .Where(w => w.WidgetID == id && w.Version == version_global)
           .AsEnumerable()
           .Select(w => rm.ToWidgetModel());
    }

    His Code:

    public IEnumerable<WidgetModel> GetWidgets(Int32 id)
    {
      var x = from w in _context.Widgets
              where (w.WidgetdID == id) && (w.Version == version_global)
              select new WidgetModel() {ID==w.ID, Category == w.Category};
      return x.ToArray();
    }
  • Barf 4Eva (unregistered) in reply to Tractor

    I especially love the people who spend all day trying to explain and understand, but then are so swept up in being right that they are missing the deadlines. Now, bow before your corporate rulers!

  • (cs)

    To be fair though that's a pretty pedantic example, and arguably his version is more readable than the one with lambdas.

    I personally only use lambdas for very simple cases where it amounts to Where(x => x.Id == id), anything more and I use the sql-like syntax for readability. The example given would be simple enough that I'd use either or depending on my mood at the time.

  • (cs) in reply to Anon
    Anon:
    Sure, WCF would have been a quick win, but doesn't solve the general problem.

    TRWTF is that Stan didn't recognize that Monty had designed the back-end to the next greatest ETL tool. All Monty needed was for Stan to build a nice GUI on top, and they both could have convinced David to turn it into a product.

    Exactly, you get paid for creating commercially viable products!

  • C-Derb (unregistered) in reply to ObiWayneKenobi
    ObiWayneKenobi:
    To be fair though that's a pretty pedantic example, and arguably his version is more readable than the one with lambdas.

    I personally only use lambdas for very simple cases where it amounts to Where(x => x.Id == id), anything more and I use the sql-like syntax for readability. The example given would be simple enough that I'd use either or depending on my mood at the time.

    I'm fine with that being your preference, but would you go out of your way to change someone else's code just so it becomes more readable to you? (Using one or the other isn't specified in our coding standards.) I wish I could find his exact words about making it more readable for him. It really was a sign of things to come.

  • (cs) in reply to C-Derb
    C-Derb:
    ObiWayneKenobi:
    To be fair though that's a pretty pedantic example, and arguably his version is more readable than the one with lambdas.

    I personally only use lambdas for very simple cases where it amounts to Where(x => x.Id == id), anything more and I use the sql-like syntax for readability. The example given would be simple enough that I'd use either or depending on my mood at the time.

    I'm fine with that being your preference, but would you go out of your way to change someone else's code just so it becomes more readable to you? (Using one or the other isn't specified in our coding standards.) I wish I could find his exact words about making it more readable for him. It really was a sign of things to come.

    Fair point. No, I wouldn't go and change code just because "I like it better this way", especially over something minor like that. What's next, changing every code file in the repository to use a different brace style?

  • (cs) in reply to ObiWayneKenobi
    ObiWayneKenobi:
    To be fair though that's a pretty pedantic example, and arguably his version is more readable than the one with lambdas.

    I personally only use lambdas for very simple cases where it amounts to Where(x => x.Id == id), anything more and I use the sql-like syntax for readability. The example given would be simple enough that I'd use either or depending on my mood at the time.

    I find the fluent version much more readable.

    And unless there are unit tests that very tightly constrain the behavior of the code, why would you monkey around with someone else's well-crafted linq? You're just risking the possibility of introducing a bug for what? Supposed readbility?

    The non-lambda version of the code just gets compiled into a lambda version anyway. Resharper has a refactoring that converts one form into the other for you anyway.

  • Vatar (unregistered) in reply to Jim the Tool

    They let you use XML? How contemporary. We use SGML for pretty much everything.

  • (cs) in reply to Vatar
    Vatar:
    They let you use XML? How contemporary. We use SGML for pretty much everything.

    I'm waiting for a Markdown-centric DBMS.

  • Omego2K (unregistered) in reply to C-Derb
    C-Derb:
    Xarthaneon the Unclear:
    C-Derb:
    I currently work with one of these "been here for 16 years coding Delphi and trying to pick up .Net" guys. I wrote some simple C# Lambda statements only to come in the following day to see a note explaining, "I rewrote your code into LINQ to make it easier for me to understand."

    My first thought was, "If you don't understand the lambda notation, then how do you know if you rewrote it correctly?" (answer: they weren't complex) Let's just say it was the first of many red flags.

    I see a red flag in this. Fluent syntax LINQ uses lambda expressions to express filtering conditions.

    Before I declare WTF one way or the other, could you give an example of the lambda expression and how it was rewritten? As a C# developer, and LINQ/lambda enthusiast, I'm idly curious.

    As I think about it, I probably screwed up the terminology (I used extension methods that he didn't understand). I tried looking through the source history to find the exact change, but I couldn't find it. Something like this...

    My Code:

    public IEnumerable<WidgetModel> GetWidgets(Int32 id)
    {
      return _context.Widgets
           .Where(w => w.WidgetID == id && w.Version == version_global)
           .AsEnumerable()
           .Select(w => rm.ToWidgetModel());
    }

    His Code:

    public IEnumerable<WidgetModel> GetWidgets(Int32 id)
    {
      var x = from w in _context.Widgets
              where (w.WidgetdID == id) && (w.Version == version_global)
              select new WidgetModel() {ID==w.ID, Category == w.Category};
      return x.ToArray();
    }

    Why is it returning x.ToArray() ? why not just return x? Does the query need to be enumerated then? Why was a call to AsEnumerable() made wouldn't the .Where return an IEnumerable<T> without it?

  • C-Derb (unregistered) in reply to Omego2K
    Omego2K:
    Why is it returning x.ToArray() ? why not just return x? Does the query need to be enumerated then? Why was a call to AsEnumerable() made wouldn't the .Where return an IEnumerable<T> without it?
    Valid questions. You'd have to ask my co-worker "Monty" why he re-wrote it that way.
  • C-Derb (unregistered) in reply to C-Derb
    C-Derb:
    Omego2K:
    Why is it returning x.ToArray() ? why not just return x? Does the query need to be enumerated then? Why was a call to AsEnumerable() made wouldn't the .Where return an IEnumerable<T> without it?
    Valid questions. You'd have to ask my co-worker "Monty" why he re-wrote it that way.
    Actually, you'd have to ask him about the x.ToArray() part.

    I wrote the version that uses AsEnumerable(), and I believe it was necessary to get the .Select() method to work correctly, but I don't remember the specifics of why.

  • (cs)
    The AsEnumerable<TSource>(IEnumerable<TSource>) method has no effect other than to change the compile-time type of source from a type that implements IEnumerable<T> to IEnumerable<T> itself.

    AsEnumerable<TSource>(IEnumerable<TSource>) can be used to choose between query implementations when a sequence implements IEnumerable<T> but also has a different set of public query methods available. For example, given a generic class Table that implements IEnumerable<T> and has its own methods such as Where, Select, and SelectMany, a call to Where would invoke the public Where method of Table. A Table type that represents a database table could have a Where method that takes the predicate argument as an expression tree and converts the tree to SQL for remote execution. If remote execution is not desired, for example because the predicate invokes a local method, the AsEnumerable<TSource> method can be used to hide the custom methods and instead make the standard query operators available.

    http://msdn.microsoft.com/en-us/library/bb335435.aspx

  • Zap (unregistered) in reply to ObiWayneKenobi
    No surprise. The typical "Bob knows what he's talking about because he's been with the company forever" syndrome, even when Bob is a complete moron that only knows one way of doing things.
    My favorite one of those was a foreman at a power company. He was always banging on about the old ways of doing things being the right ones. Drove everyone nuts and they hated working with him, but the company kept him on because he'd 'been with the company forever'.

    Until the "new way" involved safety procedures that he refused to implement and within a week every lineman in the company flat out refused to work under him, and complaints and legal threats were starting to flow uphill.

    The guy got kicked sideways into a job surveying transformers for the two years until he hit retirement. Ten years later he STILL had a massive hate for the guy who'd drawn the short straw and been the one to reassign him.

  • (cs) in reply to Nobody
    Nobody:
    neminem:
    Julia:
    ObiWayneKenobi:
    "Bob knows what he's talking about because he knows the cure for what ails the President's daughter"

    FTFY

    FTFY
    FTFY

    Actually, Monty is the president's daughter.

    Addendum (2013-06-19 17:56): Gah. That's what I get for coming late to the party. Someone else has already made this joke.

  • will guatos (unregistered)

    Haha what an idiot, a good thing that he left that company

    Greetings, will quatos - [email protected]

  • (cs)

    I'd say they are both idiots in this story, but that stan is the bigger one.

    Monty was building a service bus, with fault tollerance and transactional support. This is far better for inter application communication.

    What happens if one app is down while the other needs to update data in it? What happens if need to upgrade an app? What happens if they need to share a transaction?

    The only WTF was that monty didn't want to use an existing service bus, and that stan didn't know such a thing existed.

  • (cs) in reply to ObiWayneKenobi
    ObiWayneKenobi:
    C-Derb:
    ObiWayneKenobi:
    To be fair though that's a pretty pedantic example, and arguably his version is more readable than the one with lambdas.

    I personally only use lambdas for very simple cases where it amounts to Where(x => x.Id == id), anything more and I use the sql-like syntax for readability. The example given would be simple enough that I'd use either or depending on my mood at the time.

    I'm fine with that being your preference, but would you go out of your way to change someone else's code just so it becomes more readable to you? (Using one or the other isn't specified in our coding standards.) I wish I could find his exact words about making it more readable for him. It really was a sign of things to come.

    Fair point. No, I wouldn't go and change code just because "I like it better this way", especially over something minor like that. What's next, changing every code file in the repository to use a different brace style?

    That's been known to happen.

  • ENOTTY (unregistered)

    TRWTF is the proposed solution to chose web service/WCF for what sounds like to be a IPC problem asking for a message queue/service bus.

  • (cs) in reply to ENOTTY

    Although I took Stan "weeks", at least he did the right thing...personally a response of:

    "No, You need to find a different developer who will blindly implement rather than using his best professional judgment"

    at the very beginning could have saved a lot (for both him and the company).

    If people stood up for what they believed in, then pretty soon the "David"'s of the world would begin to see the light, and the "Monty"'s of the world would be no more...

  • Mike Dimmick (unregistered) in reply to ENOTTY
    ENOTTY:
    TRWTF is the proposed solution to chose web service/WCF for what sounds like to be a IPC problem asking for a message queue/service bus.

    WCF comes with a binding to Microsoft Message Queue that can be used to provide persistent or non-persistent queuing of messages.

    Queuing in WCF

    That's got to be better than inventing it yourself using a custom database. MSMQ has transactional behaviour (if required). Behind the scenes, it uses the ESE engine also used for Active Directory and Exchange.

  • (cs)

    Before I leave I would first secure another job.

    Besides that, you also need some balls. If you really think your idea is better, he should have said that more clearly to Monty's boss and made a nice graph on how much time (money) can be saved by his approach.

    And if that did not work I would just go ahead an implement my superior solution anyway. Worst case scenario is you get fired (same outcome as walking out the door) but there is also potential for a big win if it works very well and the customers are very happy.

  • Foo (unregistered) in reply to ObiWayneKenobi
    ObiWayneKenobi:
    MiniMax:
    This must be an old story.

    In times like this, the WTF is walking away from a job that screams JOB SECURITY for the next decade.

    Job Security isn't worth not having any advancement opportunities or skill evolution. I have a fairly easy (read: boring) job that probably has security for as long as I want (apart from me and one other person, everyone else has been there at least 4+ years, with some over 8 years), and I loathe it every day because it's stagnating my skills and I won't ever be able to move up in the ranks.

    Hey, I think I work with you :)

  • instigator (unregistered) in reply to Jim the Tool
    Jim the Tool:
    The real WTF is the complete lack of XML in the story. Obviously they should have used the databases to store XML for real extensibility.

    CAPTCH: esse I had to write an esse about XML once. It explained in great detail about how it should be used in databases.

    Obviously that's why they had to keep adding tables.

  • (cs) in reply to TimG
    TimG:
    TRWTF is that he should have implemented his (correct) solution. He had nothing to lose. It sounds like the WCF approach would have been easy. He could have implemented the WCF before he did anything else and demo his solution. The boss would have had trouble arguing with something that was "done". He might have been canned for disobedience and being a loose cannon or he could have learned what he had overlooked. Either way, he would have left with a win (even if he was the only one who recognized it).

    Actually, no. It's easy to argue with something that is done.

    Boss: For complex reasons we have chosen to be a Windows/.Net/SQLServer shop. We may have some pre-existing apps that are in other technologies. While we will continue to support them, we will not be pursuing any new development in other tech without approval from managment.

    [some time later] Stan: Look Boss, I just spent 6 weeks coding this app in Java/Oracle, 'cuase it's easier for me and faster.

    Boss: Stan, I told you 8 weeks ago that we had a technology direction to follow. You've broken it in at least two significant ways. We don't even have anyoen besides you who knows Java and Oracle. You're going to have to re-code it, and this time with much closer supervision because you can't follow direction.

    Stan: You're a retard. I quit.

    Boss: You just saved me a bunch of paperwork. Don't let the door hit you on the way out.


    On top of that, Stan never should have gone above Monty's head to David, and David should never have entertained Stan's complaints.

    Monty's actions were neither Illegal, Immoral nor Dangerous.

  • (cs) in reply to flukus
    flukus:
    I'd say they are both idiots in this story, but that stan is the bigger one.

    Monty was building a service bus, with fault tollerance and transactional support. This is far better for inter application communication.

    What happens if one app is down while the other needs to update data in it? What happens if need to upgrade an app? What happens if they need to share a transaction?

    The only WTF was that monty didn't want to use an existing service bus, and that stan didn't know such a thing existed.

    Hurrah! +10 internets for saving me the typing

  • Dominic (unregistered)

    This is one of those WTFs where the real WTF is taking the story at face value.

  • WCFaintBad (unregistered)

    TRWTF is David. He allowed Monty, a (lousy) manager, to act as an even worse architect. The two roles really don't share any skills, and it is very unlikely that an individual will be effective at both. Because he supports Monty's failure to delegate, David likely is a poor manager who hires other poor managers.

    The problem is systemic, Stan was right to leave.

  • (cs) in reply to WCFaintBad
    WCFaintBad:
    TRWTF is David. He allowed Monty, a (lousy) manager, to act as an even worse architect. The two roles really don't share any skills, and it is very unlikely that an individual will be effective at both. Because he supports Monty's failure to delegate, David likely is a poor manager who hires other poor managers.

    The problem is systemic, Stan was right to leave.

    Wouldn't that make TRWTF the fact that David's manager would allow a person like manager to allow a horrible architect like Monty to stick around?

    TRWTF-CEPTION!!

  • Kasper (unregistered) in reply to faoileag
    faoileag:
    they would have to have better software development skills than the developers they manage to be able to gauge the "quality" of an individual developer.
    I have had a manager like that once. Unfortunately for me not for long. A restructuring moved him upwards in management, which meant I got a different manager.
  • Spewin Coffee (unregistered) in reply to ObiWayneKenobi
    ObiWayneKenobi:
    MiniMax:
    This must be an old story.

    In times like this, the WTF is walking away from a job that screams JOB SECURITY for the next decade.

    Job Security isn't worth not having any advancement opportunities or skill evolution. I have a fairly easy (read: boring) job that probably has security for as long as I want (apart from me and one other person, everyone else has been there at least 4+ years, with some over 8 years), and I loathe it every day because it's stagnating my skills and I won't ever be able to move up in the ranks.

    About the same here. Only difference is I am employed at a place with rather loose hours, a relatively relaxed atmosphere, good/nice people, average benefits package, AND the freedom to develop software on my own time. So I go ahead and do that last part. If I'm ever let go, I know all the latest stuff and therefore will still be relevant in the industry.

  • (cs) in reply to Kasper
    Kasper:
    faoileag:
    they would have to have better software development skills than the developers they manage to be able to gauge the "quality" of an individual developer.
    I have had a manager like that once. Unfortunately for me not for long. A restructuring moved him upwards in management, which meant I got a different manager.

    reminds me of that line about how debugging is harder than developing, so I'm not smart enough to debug my own code.

  • old (unregistered) in reply to Tractor

    You're wrong. Just out of college are you?

    There are some cases in which this would become a 2 hour explanation, and in the wrong forum (project meeting rather than one-to-one).

    Communication is two-way, it also requires the receiver to listen and be of a baseline intellgence.

  • ENOTTY (unregistered) in reply to Mike Dimmick

    Right, but that's not what Stan had in mind (going by his description).

    On ESENT: And other 3rd party code like RavenDB.

  • instigator (unregistered) in reply to ENOTTY

    TRWTF is not having an in depth discussion to come up with the best approach. This discussion should have been interlaced with research. This is not a code WTF, this is a communications problem. They failed to use their collective skills and experience to come up with the best solution. Though, its hard to determine who is at fault by the text.

  • (cs)

    Now that I think about it, TRWTF is sitting on your hands while someone writes a spec. How do you not demand input?

  • anonymous (unregistered)

    Thank God I have a softer boss. Her background is VB, yet she mostly stays away from the code, at most writing (reasonable) SQL.

    When she pokes too much on "how" to do the code, we dismiss her suggestions, offering reasonable solution and/or tools, which are accepted most of the time, as she says "you guys should know how's best to do it". And all the coders on the project are indeed quite skilled.

    The legacy code is gruesome... but we can ditch it and do it properly! First large scale system integration is in progress. The tool? Webservices, of course. And I designed the XSD, node by node. These things make the not-so-great paycheck not much of an issue.

    Captcha: nulla ... yes, we're little by little replacing '-1' with null fields on the database. Each crap code removed makes us better citizens.

  • StephokopokianZahrsifartbast (unregistered) in reply to MiniMax

    So my intuition to build the app I want with an API to please my boss's amygdala would be, say, a passive aggressive wastebomb compared to quitting (and filing DUNS on the company's present management?)

  • katastrofa (unregistered)

    Stan has zero knowledge of politics. You don't handle your boss by going over his head to the superboss. In 99 cases out 100, they will instinctively back your direct boss and mark you as a troublemaker.

    What Stan should have done is to accumulate evidence that A) it was all Monty's idea B) Stan did it exactly as Monty wanted C) the system failed to perform because of Monty's design and then have them handy as "documentation" when the failure of the system becomes a problem.

    Oh well, and if the system doesn't fail, then I don't really see the need to get so upset.

  • Orgon (unregistered) in reply to ANON

    Yes, no. 2 is by all means probable reason for that outcome.

    In my 30 years of IT experience, i see many examples of one way thinking in code making primadonnas (including myself). The main problem is lack of big picture to comunnicate with customer, and really predict his future needs. In short, art of "stay in business" on long term. This kind of thinking is very often out of the sight on typical programmer. Even if Stan is tehnically right (partially). After all, Stan can open his own company, and then he can dictate (and test in practice) his own rules...

    Sorry about my poor english (I'm not a native speaker)

  • You must be kidding (unregistered) in reply to MiniMax

    Only a looser with no spine would stay in a dead end position like that for Job security.

  • IN-HOUSE-CHAMP (unregistered)

    This story has a flaw. It should end with the protagonist reaching for his word processing software and typing up a resume.

  • Herwig (unregistered)

    This exactly describes my job situation. ...except for the last paragraph...

  • (cs)

    I've been in similar environments.

    As I run the one I'm currently in I have a different policy. When a project comes up I'll broad stroke outline how I think the approach ought to be. However, I make it exceedingly clear that if the dev responsible for implementation thinks there is a better way then I want to hear it.

    Sometimes it's implemented as I designed, sometimes it's tweaked and sometimes it is wholesale thrown out and replaced with a much better idea. More "architects" or "managers" should do things this way. Not only does it make for a friendlier environment, it encourages personal growth and nearly always results in tighter systems.

  • (cs) in reply to katastrofa
    katastrofa:
    Stan has zero knowledge of politics. You don't handle your boss by going over his head to the superboss. In 99 cases out 100, they will instinctively back your direct boss and mark you as a troublemaker.

    What Stan should have done is to accumulate evidence that A) it was all Monty's idea B) Stan did it exactly as Monty wanted C) the system failed to perform because of Monty's design and then have them handy as "documentation" when the failure of the system becomes a problem.

    Oh well, and if the system doesn't fail, then I don't really see the need to get so upset.

    Unfortunately, the person who implemented a failed system is usually the one who gets axed. After all, if they had political skills needed to avoid blow back they wouldn't be the one responsible for making it work.

  • budgie (unregistered)

    I work in a company where I get to play with any new tech I like, however I too feel like I'm stagnating. I have no other developers to bounce ideas off or review my code; how I'd love someone to call my code $hit and tell me how they'd do it better so I could learn.

    However, given I have a mortgage and a wife to support, I couldn't just walk out like that if something didn't suit me - nor would I be allowed to; I live in the UK and in my job I have to give 4 weeks notice.

    Also, some companies are wary of those who jump from job to job. I get the feeling the OP is young.

  • eric bloedow (unregistered) in reply to PiisAWheeL

    stories like this always make me wonder how long the company will last with ONLY ONE EMPLOYEE, Monty.

Leave a comment on “In Fool We Trust”

Log In or post as a guest

Replying to comment #:

« Return to Article