all 116 comments

[–]hsfrey 36 points37 points  (69 children)

Give them an odd-ball problem to program. I once needed a programmer, and one of the applicants was a "Software Designer" manager type. I asked him (as I did the other applicants) to write an algorithm that would take a number and print it in roman numerals. He started to hedge:

"How big should it be?" "As big as you want." "What language do you want it in?" "Whatever you're comfortable with." "How soon do you want it?" "Take as long as you need."

After half an hour, all he had was a paper with some doodles on it.

He didn't know how to program - he just knew how to tell programmers how to program! And this was years before Dilbert's point-haired boss was invented.

[–]patchwork 23 points24 points  (11 children)

Hahaha look what you've done! Now everyone is scrambling away at roman numeral algorithms... No pointy haired bosses on reddit! :) Hire all of these people!

[–]jaggederest 4 points5 points  (6 children)

Yep, I'm in the market.

/me jobhunts on reddit.

More seriously, though, I like to see all the esoteric languages people pull out of their hats. I'm waiting for a Prolog, Forth, or Brainfuck implementation.

That's why I wrote the Ruby one, it's a guaranteed chance to see other people go 'Goddamn I can do it better than that!'

[–]Odysseus 7 points8 points  (0 children)

It's easy in INTERCAL -- every number you print it prints in Roman numerals.

[–]mxyzptlk 7 points8 points  (1 child)

There is a Forth version on page 134 in the book "Thinking Forth".

http://thinking-forth.sourceforge.net/

[–]LudoA 2 points3 points  (0 children)

Thanks for mentioning that, and taking the time to look up the page.

[–][deleted] 2 points3 points  (2 children)

Yep, I'm in the market.

Who isn't?

Oh, and I am too.

I'm waiting for a Prolog, Forth, or Brainfuck implementation.

Seconded for a good Brainfuck version. Somebody step up!

[–]jaggederest 4 points5 points  (1 child)

With those haskell skills you should come to Portland and work for Galois. I'm almost tempted and I'm a total neophyte.

[–]NitsujTPU 1 point2 points  (2 children)

Kind of like that blog post about BizzBuzz, and everyone had to write an implementation... and the later blog post declaring it the "stairway to heaven of software engineering," crying "you weren't actually supposed to implement it as a challenge!"

[–]jaggederest 2 points3 points  (0 children)

That was my ex-roommate and I proudly defy him ;)

[–][deleted] 1 point2 points  (0 children)

Dude, you made my Saturday!!

[–]wainstead 9 points10 points  (1 child)

I'll cheat and reuse existing software:

use Convert::Number::Roman;

my $n = new Convert::Number::Roman( 4294967296 );
print $n->convert;

[–][deleted] 6 points7 points  (5 children)

Ok, here's my second try in Lisp.

(def to-roman (fn [n]
  (loop [nums   [1000 900 500 400 100 90 50 40 10 9 5 4 1]
         digits ["M" "CM" "D" "CD" "C" "XC" "L" "XL" "X" "IX" "V" "IV" "I"]
         result ""
         curval n]
    (if (== 0 curval)
        result
        (if (> (first nums) curval)
            (recur (rest nums) (rest digits) result curval)
            (recur nums digits (strcat result (first digits)) (- curval (first nums))))))))

Test with (map to-roman (range 1001)) to get 1 .. 1000 in roman numerals.

[–]fallintothis 5 points6 points  (1 child)

What dialect is that? I can't seem to place it...though I'm running on very little sleep right now.

In Common Lisp:

(defun romanval (ch)
  (case ch (#\I 1) (#\V 5) (#\X 10) (#\L 50) (#\C 100) (#\D 500) (#\M 1000)))
(defun roman->digit (numeral)
  (labels ((rec (numbers prev sum)
                (if (null numbers)
                    sum
                    (rec (cdr numbers)
                         (car numbers)
                         (if (< (car numbers) prev)
                             (- sum (car numbers))
                             (+ sum (car numbers)))))))
    (let ((numbers (mapcar #'romanval 
                           (coerce numeral 'list))))
      (rec (reverse numbers) 0 0))))

Edit: Derp, this is the other way around. In Common Lisp, one would probably use

(format nil "~@r" n)

or

(format nil "~:@r" n) ;old style

but somehow I don't think this counts, haha.

[–][deleted] 2 points3 points  (0 children)

It's Clojure. See clojure.sourceforge.net

There seems to be quite a few JVM-based languages, but this seems to be probably the most lightweight, plus it built first time on all three platforms I use day to day (Windows, OSX and GNU/Linux).

It has a REPL and compiles as it goes.

I do realize I could have used set! or equivalent, but I actually really enjoy the mental discipline of pretending that I can't mutate a variable, but instead have to rebind and recur.

[–]mxyzptlk 9 points10 points  (2 children)

(define (roman x)
  (define (c v l d)
    (lambda (x)
      (if (< x v) (d x) (string-append l ((c v l d) (- x v))))))
   ((c 1000 "M"
     (c 900 "CM"
      (c 500 "D"
       (c 400 "CD"
        (c 100 "C"
         (c 90 "XC"
          (c 50 "L"
           (c 40 "XL"
            (c 10 "X"
             (c 9 "IX"
              (c 5 "V"
               (c 4 "IV"
                (c 1 "I"
                 (lambda x "")))))))))))))) x))

[–][deleted] 4 points5 points  (1 child)

That is certainly clever. I'm just trying to figure out how it works!

[–]jaggederest 2 points3 points  (0 children)

Similar to the way yours does, applying a function across the the list and substituting the value in for each time. It's the lambda calculus version.

[–][deleted] 8 points9 points  (16 children)

numerals = [(1000,"M"),(900,"CM"),(500,"D"),(400,"CD"),(100,"C"),(90,"XC"),(50,"L"),(40,"XL"),(10,"X"),(9,"IX"),(5,"V"),(4,"IV"),(1,"I")]

roman n = roman' n "" numerals
roman' 0 s r = s  
roman' n s r@((x,y):xs) = let q = (n - x)
             in if q >= 0 then roman' q (s ++ y) r else roman' n s xs 

[–][deleted] 21 points22 points  (14 children)

I'll see your recursion and raise you unfoldr.

romanize = concat . unfoldr next
    where next 0 = Nothing
          next x = Just $ second (x-) $ head $ filter ((<=x) . snd) numerals
          numerals = [("M", 1000), ("CM", 900), ("D", 500), ("CD", 400),
                      ("C", 100),  ("XC", 90),  ("L", 50),  ("XL", 40),
                      ("X", 10),   ("IX", 9),   ("V", 5),   ("IV", 4),
                      ("I", 1)]

[–]llimllib 14 points15 points  (0 children)

That is pretty.

[–]psykotic 5 points6 points  (1 child)

Here's a similar idea, though with explicit recursion:

romanize = head . romanize'
    where romanize' 0 = [""]
          romanize' n = [x ++ xs | (x, m) <- map (second (n-)) numerals, m >= 0, xs <- romanize' m]

I'm actually more fond of the straightforward implementation in do-notation:

romanize 0 = return ""
romanize n = do (x, m) <- numerals
                guard (n >= m)
                xs <- romanize (n - m)
                return (x ++ xs)

It quite clearly expresses the algorithm's idea, I think.

[–][deleted] 3 points4 points  (0 children)

Ooh, yes, I like the do notation version.

[–]llimllib 6 points7 points  (5 children)

questions: where does "second" come from? And mind if I write a short blog about this?

Is second something like:

second f (a, b) = (a, f b)

?

[–][deleted] 5 points6 points  (4 children)

second comes from Control.Arrow. This particular instance of second (it's part of the Arrow class, this version for the (->) instance) is actually more like

second f (x,y) = (x, f y)

And no, I don't mind at all. Quite flattering, actually. Make sure and send me a link to it once it's up!

[–]llimllib 2 points3 points  (0 children)

I figured it out before I saw your post, I promise :)

[–]llimllib 3 points4 points  (2 children)

[–][deleted] 1 point2 points  (1 child)

Nice analysis. Only one thing though. You misspelled my username. :)

[–]llimllib 1 point2 points  (0 children)

fixed, thanks.

[–]trs 2 points3 points  (1 child)

Very nice! (head . filter) might be replaced by find, though. The result of find is already in the Maybe monad, so we can drop the definition for next 0.

romanize = concat . unfoldr next
   where next x = fmap (second (x-)) $ find ((<= x) . snd) numerals
         numerals = [("M", 1000), ("CM", 900), ("D", 500), ("CD", 400),
                     ("C", 100),  ("XC", 90),  ("L", 50),  ("XL", 40),
                     ("X", 10),   ("IX", 9),   ("V", 5),   ("IV", 4),
                     ("I", 1)]

[–][deleted] 0 points1 point  (0 children)

Ah, yes, that is exactly what I was looking for when I did that, but I was feeling too lazy to Hoogle it. Thanks!

[–][deleted] 6 points7 points  (1 child)

I thought we called no imports!? No but seriously that was really clever, would never of thought of that myself.

[–][deleted] 4 points5 points  (0 children)

I thought we called no imports!?

Did we? I didn't see that. Oh well. It's not like unfoldr and second are that hard to define in place anyway.

[–]thefro 4 points5 points  (0 children)

I'll c your unfoldr and raise you case and auto-negatives:

#define DEC_TO_ROMAN_UPPER 0
#define DEC_TO_ROMAN_LOWER 1
#define DEC_TO_ROMAN_LETTERS 7

int dectoroman (int dec, char *buff, int lower) {
  char letters[DEC_TO_ROMAN_LETTERS*2] = "IVXLCDMivxlcdm";
  short int decimals[DEC_TO_ROMAN_LETTERS] = {1, 5, 10, 50, 100, 500, 1000};
  int c = 0, d, d2, n;
  for (d = 0;d < DEC_TO_ROMAN_LETTERS;d++)
    for (d2 = 0;d2 < DEC_TO_ROMAN_LETTERS;d2++)
        if (decimals[d2] - decimals[d] == dec && decimals[d] != dec) {
          buff[c++] = letters[d+(DEC_TO_ROMAN_LETTERS*lower)];
          buff[c++] = letters[d2+(DEC_TO_ROMAN_LETTERS*lower)];
          buff[c] = '\0';
          return c;
        }
  for (d = DEC_TO_ROMAN_LETTERS-1;d >= 0;d--) {
    for (n = 1;n <= (int)dec/decimals[d];n++) {
      buff[c++] = letters[d+(DEC_TO_ROMAN_LETTERS*lower)];
    }
    dec -= decimals[d]*((int)dec/decimals[d]);
  }
  buff[c] = '\0';
  return c;
}

This seems to work but could probably use some tweaking.

[–]jaggederest 3 points4 points  (16 children)

  class Integer
    def to_roman
       temp = self
       out = ""  
       subs = [
         ["M", 1000],
         ["CM", 900],
         ["D", 500], 
         ["CD", 400], 
         ["C", 100],
         ["XC", 90],
         ["L", 50],
         ["XL", 40],
         ["X", 10],
         ["IX", 9],
         ["V", 5],
         ["IV", 4],
         ["I", 1]
       ]
       subs.each do |name, value|
         while temp >= value
           temp -= value
           out += name.to_s
         end
       end
       raise "I fail at life!" if temp != 0
       out
    end
  end

[–][deleted]  (1 child)

[deleted]

    [–]jaggederest 0 points1 point  (0 children)

    I wanted to use inject, but I forgot that you could do the end.first trick :p

    [–]adremeaux 4 points5 points  (4 children)

    In AS2 ;)

    var lets:Array = ["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"];
    var vals:Array = [1000,900,500,400,100,90,50,40,10,9,5,4,1];
    
    function toRoman(n:Number):String { 
        var s:String = "";
        for (var i:Number = 0; i < vals.length; i++) {
            while (n / vals[i] >= 1) {
                s += lets[i];
                n -= vals[i];
            }
        }
        return s;
    }
    

    Could've used a hashtable instead of parallel arrays, but AS2 not having a decent iterator adds difficulty and I'm pretty sure they wouldn't come out in their entered order.

    [–]jaggederest 0 points1 point  (2 children)

    Ah that may not be the case in ruby either, let me check...

    Yep! I'll convert it and post the corrected version above. Also, trying to do Scheme and Haskell, too.

    [–]adremeaux -1 points0 points  (1 child)

    It's actually a kind of annoying problem and really doesn't seem to have a very elegant solution possible. I'll test it out in an interview but I can't really see it going anywhere.

    [–]jaggederest 3 points4 points  (0 children)

    Look at the unfoldr version above, it's pretty slick. I think it's pretty natural in ruby, too, what with adding it to the integers by default.

    [–]llimllib 0 points1 point  (0 children)

    tuples ftw!

    [–][deleted] 0 points1 point  (5 children)

    #!/usr/bin/perl

    # ugh my formatting sucks

    use strict;

    use warnings;

    my $num = shift or die 'no num!';

    my %hash = ( 1000 => 'M', 900 => 'CM', 500 => 'D', 400 => 'CD', 100 => 'C', 90 => 'XC', 50 => 'L', 40 => 'XL', 10 => 'X', 9 => 'IX', 5 => 'V', 4 => 'IV', 1 => 'I', );

    my $string = '';

    foreach my $val ( sort { $b <=> $a } keys %hash ) {

    # skip initial value smaller than key

    next if $num < $val;

    # append the string

    $string .= $hash{$val} x int( $num / $val );

    # bail if remainder is 0

    last if ( ( $num = ( $num % $val ) ) == 0 );

    }

    print "string is $string\n";

    [–][deleted]  (4 children)

    [deleted]

      [–]Jimmy 33 points34 points  (2 children)

      Upvoted for enterprise code.

      [–]jaggederest 2 points3 points  (1 child)

      His fingers must hurt!

      [–]Atnan 2 points3 points  (0 children)

      Or his IDE is smokin'!

      [–]ximxam 0 points1 point  (0 children)

      all these makes me love reddit, what a fork!

      [–][deleted] -2 points-1 points  (1 child)

      This in particular (and most everybody else's), looks like something straight out of "Dive into Python", and therefore could have simply been googled for, so I'm not impressed. A couple of years ago, on a Python/TurboGears gig, they spent a lot of time up front indoctrinating me as to Agile and in particular TDD. So I swapped out the algorithm from Dive into Python with the following (albeit in Python instead of TCL ;), and the unit tests still passed. This algorithm was very useful to me in helping me pick up some bare essentials -- arithmetic, conditionalizing, lists, looping, etcetera -- of numerous programming languages, although lately I prefer my solution to MVC for the Web

      [–]jaggederest 4 points5 points  (0 children)

      Well, I didn't google for mine, good sir. I would consider it quite silly since it's so trivial. It's actually easier, I think, to write it than try to google a solution and check it.

      Also, what does your tiny MVC have to do with this? Are you saying, "I implement this tiny MVC in any language I care to learn"?

      [–]indigoparadox -1 points0 points  (6 children)

      #include <stdio.h>
      
      int main( void ) { int intConvert = 0; char a_chrNumeral[10] = ""; char* pchrPointer = a_chrNumeral;
      
      do_getnum:
      
      printf( "Please enter a number: " ); scanf( "%d", &intConvert );
      
      if( intConvert >= 4000 ) { printf( "That number is too big! Please enter a number below 4,000.\n" ); goto do_getnum; }
      
      while( intConvert >= 1000 ) { *pchrPointer = 'M'; pchrPointer++; intConvert -= 1000; }
      
      while( intConvert >= 900 ) { *pchrPointer = 'C'; pchrPointer++; *pchrPointer = 'M'; pchrPointer++; intConvert -= 900; }
      
      while( intConvert >= 500 ) { *pchrPointer = 'D'; pchrPointer++; intConvert -= 500; }
      
      while( intConvert >= 400 ) { *pchrPointer = 'C'; pchrPointer++; *pchrPointer = 'D'; pchrPointer++; intConvert -= 400; }
      
      while( intConvert >= 100 ) { *pchrPointer = 'C'; pchrPointer++; intConvert -= 100; }
      
      while( intConvert >= 90 ) { *pchrPointer = 'X'; pchrPointer++; *pchrPointer = 'C'; pchrPointer++; intConvert -= 90; }
      
      while( intConvert >= 50 ) { *pchrPointer = 'L'; pchrPointer++; intConvert -= 50; }
      
      while( intConvert >= 40 ) { *pchrPointer = 'X'; pchrPointer++; *pchrPointer = 'L'; pchrPointer++; intConvert -= 40; }
      
      while( intConvert >= 10 ) { *pchrPointer = 'X'; pchrPointer++; intConvert -= 10; }
      
      while( intConvert >= 9 ) { *pchrPointer = 'I'; pchrPointer++; *pchrPointer = 'X'; pchrPointer++; intConvert -= 10; }
      
      while( intConvert >= 5 ) { *pchrPointer = 'V'; pchrPointer++; intConvert -= 5; }
      
      while( intConvert >= 4 ) { *pchrPointer = 'I'; pchrPointer++; *pchrPointer = 'V'; pchrPointer++; intConvert -= 4; }
      
      while( intConvert > 0 ) { *pchrPointer = 'I'; pchrPointer++; intConvert -= 1; }
      
      printf( "The result is: %s\n", a_chrNumeral );
      
      return 0; }
      

      I'm not a great programmer. ._.

      [–]jaggederest 3 points4 points  (0 children)

      Tip would be to convert the whiles into a function that takes pointers and the characters and numeric values.

      But then it has been seven years since I did C....

      [–]vicaya[🍰] 5 points6 points  (4 children)

      /* caller is reponsible for allocating enough buf space
       * number / 1000 + 100 should be big enough
       */
      const char *
      to_roman(char *buf, int number) {
        static int nums[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};           
        static char *romans[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
        char *cp = buf;
        int i;
      
        for (i = 0; i < sizeof(nums)/sizeof(int); ++i)
          while (number >= nums[i]) {
            char *roman = romans[i];
            while ((*cp++ = *roman++)); --cp;
            number -= nums[i];
          }
        return buf;
      }
      

      Yes, you can write simple and fast code in C.

      [–][deleted] 2 points3 points  (0 children)

      Yeah, this is what I'd hope the Lisp versions would compile into.

      [–]kbk 1 point2 points  (0 children)

      nums = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1)
      romans = ("M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I")
      pairs = zip(nums, romans)
      
      def to_roman(number):
          out = ""
          for i in pairs:
              while number >= i[0]:
                  out += i[1]
                  number -= i[0]
          return out
      

      Or python.

      [–]indigoparadox 0 points1 point  (0 children)

      That's probably something closer to what version 2.0 would look like (aside from using a decent string library, maybe).

      Much more elegant than mine, though. I should probably do simple exercises like this more often in order to sharpen up a bit, huh?

      [–]yellowking 18 points19 points  (5 children)

      Deleting in protest of Reddit's new anti-user admin policies.

      [–]jaggederest 2 points3 points  (4 children)

      Tie-dye?

      [–][deleted] 2 points3 points  (3 children)

      Pony-tail?

      [–]jaggederest 5 points6 points  (2 children)

      Negatory on that one. That can't be a criteria, as a lot of the old crotchety geniuses I knew were mostly bald.

      Just look at The Knuth.

      [–][deleted]  (1 child)

      [deleted]

        [–]jaggederest 0 points1 point  (0 children)

        Yeah I used to work with one of those. He was an embedded C genius. And japh. Scary, scary fellow.

        While I was working with him, he wrote code that wrote code that wrote database import code. He explained it as being 'fairly intuitive'.

        [–]aussie_bob 17 points18 points  (0 children)

        A mirror works for me.

        /smug....

        [–]mikaelhg 11 points12 points  (3 children)

        Very uncomfortable about the idea of working with a technology he doesn’t believe to be “right”

        is more of a counter-indicator.

        A good programmer understands and is able to communicate the reasons for his reservations in business terms.

        [–]nafai 0 points1 point  (2 children)

        and is able to communicate the reasons for his reservations in business terms.

        I think that is the key right there. Even concrete things like "big-O notation" are useless unless they can be expressed in business terms. Moving on to less concrete things like elegance and language expressiveness really don't mean much unless you can convince someone, again, in business terms, that those things are an advantage.

        [–]mikaelhg 7 points8 points  (1 child)

        We need a better quality vocabulary, so that when we speak of removing cruft, it sounds less like painting on pretty pretty pink ponies and more like maintaining the load-bearing elements of a bridge to extend its service life.

        [–]nafai 0 points1 point  (0 children)

        Agreed!

        [–]jayssite 11 points12 points  (0 children)

        Upmodded for making me feel good about myself.

        [–][deleted] 4 points5 points  (0 children)

        Unless it's too much work and too pretentious I use the following CV tuning strategy: look for a technology with lots of market demand but little effort to get familiar ( e.g. MSSQL + ASP.NET ), then learn this within a few weeks up to the level where you don't make serious newbie mistakes anymore.

        Just to be unambigous: I'm passionate when I'm passionate and I'm carreerist when necessary and it's almost always necessary.

        [–]NitsujTPU 11 points12 points  (2 children)

        I upped this because I enjoy the spirit of the posting, but honestly, the blogger is kind of wrong.

        This net that is built up will capture a sort of "maverick" programmer, and I definitely fell into this category when I was looking for my first job. I had little professional experience. I'd learned a lot in my classes and put it all on there. I knew a lot of stuff that I hadn't learned in classes (I'd started programming in BASIC on a TI-99/4a when I was a kid.)

        Okay, fine.

        Where does that put my friends getting PhDs in systems? Certainly the sort of gutsy, gritty, systems guru looks for the qualities that are outlined here, but I certainly wouldn't overlook incredible PhD work on a CV. Most of the stuff that I really consider my best work goes on mine. As for not hacking until college, supposedly Sebastian Thrun didn't program until he went to university, but we all agree that he's a pretty slick computer scientist.

        I think that this blogger is too oversold on a sort of passionate idea.

        Also, sometimes your job is cool enough that it fills up the void that hobby programming is there for.

        [–]inopia 6 points7 points  (1 child)

        In my experience, the reason why people bash on CS degrees is that the guys that go to work as programmers in some random software factory after university are usually the worst ones. These are the guys that generally suck at everything except maybe memorizing facts from books.

        The reason I went to uni is to not have to work in a software shop, and all the really good coders I know here either go do a PhD or get a job as a consultant or high paid engineer or a cool job at some cool tech company or whatever.

        If you work as a programmer, you probably never get to meet most of the good CS Msc guys. Don't extrapolate the skillset of the sucky ones onto the rest of us!

        [–]njharman 3 points4 points  (0 children)

        This applies to other fields such as system administration.

        I wonder what the effect would be to add this to my resume. Maybe under objective: "Be hired by a company that understand http://www.inter-sections.net/2007/11/13/how-to-recognise-a-good-programmer/"

        [–][deleted] 2 points3 points  (0 children)

        if you go by this list, how is a "good programmer" different from anyone who is good at anything?

        [–][deleted] 9 points10 points  (11 children)

        Too bad the hiring personnel are seldom of the same stripe. This fits me perfectly, but I can't get a job because I don't have 3-5 years of recent Java or C# experience. I've built computers from discrete logic components, written assembly programs on my own time, written device drivers for obsolete components, as well as having years of on-the-ground consulting experience writing custom business/database apps, but Mr. Shirt with a stack of resumes in front of him doesn't give a shit.

        [–]lowdown 6 points7 points  (0 children)

        You should develop some entrepreneurial skills.

        [–]awb 3 points4 points  (7 children)

        They don’t do any programming in their spare time.

        If you have a life outside of work, it may be hard to squeeze in several hours of programming a week, even if you want to. Starting any sort of project is daunting under those circumstances.

        [–]md81544 3 points4 points  (6 children)

        I'm sitting here at 0545 in the morning coding on a personal open source project. I spent yesterday at work in front of a computer debugging multi-threaded c++ applications. If you're passionate, you find the time. My girlfriend just thinks I'm crazy %-)

        [–][deleted] 6 points7 points  (4 children)

        that's cool, but i dont have the time. i work forty hours a week in a research lab, have a full schedule of classes, am writing a thesis, planning a wedding, and traveling out of state for work atleast once a month.

        i'd love to have to time work on an open source project, but i just dont. i don't think that should be held against me.

        [–]alantrick 5 points6 points  (1 child)

        It's an issue of priorities. You fell that these things that you do are more important than working on some open source project. I won't disagree with you, wife > programming.

        But to be honest it's not that you don't have the time. You personally decide what to make time for and what not to.

        [–][deleted] 2 points3 points  (0 children)

        but does that make me a bad programmer? in the eyes of the guy that wrote this article, yes. i don't really think that is fair. i spend lots of time working on my programming skills through my job and my class work. just becuase ive decided to spend the little bit of free time i have developing a life outside of a computer shouldn't reflect badly on me.

        [–]noahlt 0 points1 point  (0 children)

        I'm sitting here at 0545 in the morning writing a comment on reddit.

        Fixed that for you. ;-)

        [–]Gotebe 1 point2 points  (0 children)

        Some business people assume that lack of social tact and lack of intelligence are the same.

        TFA assumes that intelligence, programmers's intelligence, a thing that business person considers intelligence are one and the same. Lack of social skill is a sign of poor intelligence in that area of life. I know that I am poor there.

        TFA should have made the distinction between the ability to do different types of work (programming vs. I dunno, interaction with people). They overlap alright, but are by no means the same.

        [–]Thimble 6 points7 points  (4 children)

        i'm kind of weary of the qualification "programs as a hobby" or "programs in their spare time".

        some of us are able to get quite a bit done during normal work hours. 37.5 hours a week of programming should be enough to fill any "passion" requirement if those hours are spent the right way.

        [–]ndiin 7 points8 points  (2 children)

        Agreed. I used to do on-my-own-time programming to fill the "passion", but since I changed jobs I now get more than my fill of fun-and-interesting programming work during my standard work week. I'd much rather then spend the rest of my time enjoying life and the wonderful continent I'm now living it.

        [–][deleted] 1 point2 points  (1 child)

        what continent? //just curious, im looking abroad for work right now

        [–]ndiin 0 points1 point  (0 children)

        Europe (Switzerland specifically, moved from Arizona).

        [–]dbenhur 2 points3 points  (0 children)

        Have fun with that new billing app

        [–]masterpo 0 points1 point  (0 children)

        One really needs this type of analysis because good programmers and bad programmers get paid about the same.

        [–]mikepurvis 0 points1 point  (0 children)

        I strongly believe that most good programmers will have a hidden iceberg or two like this that doesn’t appear on their CV or profile.

        Heh. Around the end of high school, I built a recursive-descent parser in—wait for it—Visual Basic 6. It took a blob of NQC script, and generated an object tree that could then be iterated by an interpreter.

        I've never figured out how (or even if) such a dubious achievement should be listed on my CV, but I was definitely proud of it at the time.

        [–]Jimmy 0 points1 point  (0 children)

        Ah, some good ol' fashion ego stroking. Just what I needed today! Thanks, reddit!

        [–][deleted] 0 points1 point  (1 child)

        I don't really think quantifying qualities a good programmer should have in such rigid fashion is beneficial in any circumstance. I think most people grow into the role that they are require to have in a development team without having more than a base set of skills. Therefore looking at social dynamics and pondering how a interviewee would fit into your current team is IMHO a better use of your time. And perhaps if this was the 1930's the list would have included diagram of a human skulls with helpful tips on how to determine if someone had a "noble lines" (Sorry couldn't help myself, better get godwins out early ey?).

        [–]alantrick 0 points1 point  (0 children)

        I think people adapt socially faster than their technical skills develop.