62 comments

[ 0.32 ms ] story [ 176 ms ] thread
Vi's site is down from the onslaught.

In the meantime, enjoy the ever-classic Fizz Buzz Enterprise Edition:

https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpris...

I opened the link thinking ”hah, what a gag!” But then I thought it’d be funny to try to find the core fizzbuzz logic. Turns out that it hits way too close to home, I just got really annoyed. Not sure what I expected.
I think it's a work of art, and your feelings corroborate this opinion :)
But then I thought it’d be funny to try to find the core fizzbuzz logic.

The point is that there is no "core" logic anymore. It's been broken down and spread out over a dozen files, each of which does "one and only one (tiny) thing" according to the "best practices" of problem decomposition. Then all the pieces are glued together again using design patterns.

It does hit close to home. I've seen all that code in one form or another. The "adapter" that ignores exceptions made me chuckle though. But like enterprise code I've seen before I have no chance of finding that class again although I am sure it exists.
As the original author, I apologize for your agony.

This is a common complaint from people I discussed the project with, and the obvious reason for the success of the project in terms of people contributing patches and issues.

(comment deleted)
I was kind of hoping these would be lessons learned from looking over 50 solutions to fizzbuzz from 50 different programmers. That might have been amusing. Instead it's just sombody's random programming exercises.
Vi Hart isn't a guy.
(comment deleted)
And Vi Hart isn't just somebody either.
Why does static content need a database connection? #OverEngineering
The entire blog post is about how to over-engineer FizzBuzz for fun and learning.
Using WordPress is "over-engineering"?
Yes
More or less so than running a static site generator that lives on one particular machine, and using Git to push your changes to the server?
More like use a static generator to push to S3, optionally with a Cloudfront distribution in front of it.
WordPress should include a cache switched on by default then you have to turn it OFF as an advanced setting. That'd be good for performance and the environment :-)

But using Wordpress is no more overengineering than buying a car. (Versus building your own 2 stroke engine because it's simpler).

Wordpress is under-engineering. It's what you default to when you don't want to do any engineering and just deploy the standard blog solution that everyone's familiar with.
This is called out in the post, but 32 is actually a really cool rhythmic (and accurate) fizzbuzz.
(comment deleted)
(comment deleted)
I like this idea. I find it fascinating how many developers I've interviewed who still have not come across FizzBuzz, and how many of those cannot solve the problem. Some of the more interesting interviews I've given though have been with people who know the FizzBuzz problem, where I ask them to make the worst possible version of it that they can. It turns out to be more difficult than they think it will be, and a deeper thinking and communicating exercise than solving the simple FizzBuzz problem itself.

  let tokens = [];
  tokens.push("Fizz", "Buzz", "Fizzbuzz");
  for (let i = 0; i <= 100; i++) { tokens.push(i); }

  function generateFizzBuzz(n) {
    if (n > 100) { return [[]]; }
    let result = [];
    for (let token of tokens) {
      for (let tail of generateFizzBuzz(n+1)) {
        tail.splice(0, 0, token);
        result.push(tail);
      }
    }
    return result;
  }

  let candidates = generateFizzBuzz(1);
  while (candidates.length > 1) {
    let candidateIndex = Math.floor(Math.random() * candidates.length);
    let candidate = candidates[candidateIndex];
    let checkIndex = Math.floor(Math.random() * 100);
    let expected = checkIndex % 3 == 0
      ? (checkIndex % 5 == 0 ? "Fizzbuzz" : "Fizz")
      : (checkIndex % 5 == 0 ? "Buzz" : checkIndex);
    if (candidate[checkIndex] !== expected) {
      candidates.splice(candidateIndex, 1);
    }
  }

  return candidates[0];
> the worst possible version of it that they can

Based on a true story, sadly:

  #! /usr/bin/tail -n+2
  1
  2
  Fizz
  4
  Buzz
  [...]
  98
  Fizz
  Buzz
On the other hand, there's also ones like:

  let{a="ssfsbfssfbsfssX"++a;x 's'=show;x 'f'=const"Fizz";x 'b'=const"Buzz";x 'X'=const"FizzBuzz"}in putStrLn$concat$map(\(i,f)->x f i++"\n")(zip[1..100]a)
(because who needs divisibility tests, right?)
Can't solve because they weren't actually programmers or more because of deer in headlights?
octave

  a=[1:100];
  b=strcat({'','fizz'}([1+!mod(a,3)]),{'','buzz'}([1+!mod(a,5)]));
  a=num2cell(int16(cellfun(@isempty,b)).*a);
  b(cellfun(@isempty,b))=0;
  strcat(b,a)
(comment deleted)

  #include <stdlib.h>
  #include <stdio.h>
  
  static const char str[] = "fizzbuzz";
  
  static inline void out(int i, size_t offset, size_t sz)
  {
  	if (sz) {
  		fwrite(str + offset, sz, 1, stdout);
  	} else {
  		fprintf(stdout, "%d", i);
  	}
  	putchar('\n');
  }
  
  int main(void)
  {
  	for (int i = 1; i <= 100; i++) {
  		int a = i % 3 == 0;
  		int b = i % 5 == 0;
  		out(i, 4*((a^b)&b), 4*(a+b));
  	}
  	exit(0);
  }
There's a way to remove that conditional, too. Probably.
I didn't know that fizzbuzz was a children's game.

That explains a LOT. As in most descriptions of it are annoyingly ambiguous.

Whereas if you knew the game, you know it already.

> As in most descriptions of it are annoyingly ambiguous.

My very first interviewer (intentionally) didn't spec fizzbuzz correctly. The real test was whether the candidate listened to the customer's/lead engineer's spec instead of jumping to conclusions.

Fortunately, I was just entering college and hadn't heard of fizzbuzz before. I passed the "test" but for the wrong reason.

Being purposely misleading then penalising those who are misled doesn't seem like a good hiring strategy, but then again, I've never tried to hire someone.
I feel like everyone leaving a fizzbuzz solution in the comments of this post is missing the point of this article...
Fizzbuzz does that to some people. It's a mind-control meme, and a very powerful one.
A small exercise:

write Spectre/timing attacks resilient fizzbuzz.