Fizz Buzz: Enterprise Edition
github.com
github.com
3
5
No serious enterprise-grade software today would do without leveraging Maven, annotations, IoC, AOP...
And why isn't the UI decoupled from the business logic? What happens if one day another team in the organization needs access to Fizz Buzz? Writing their own Fizz Buzz would be extremely redundant (even dangerous), and if anybody changed the logic of Fizz Buzz it would have to be changed in multiple places at the same time: a simple change like making "Fizz" print every fourth time instead of every third time would make every Fizz Buzz team go through architecture, various change management meetings and at least one weekend deployment. And all of this would have to be coordinated to make sure it all happens within a single change window (assuming this could even be rolled out in a "big bang" situation).
No problem. IT solves this problem easily with the seamless integration of EJBs, or SOA (as mentioned), or a modern plug and play ESB. There are multiple ESB vendors, each with their own advantages and disadvantages, so best practice advises organizations to create a working group comprised of all the stakeholders of the organization with the aim of reaching a consensus on the best product to use and the best way to move forward with this (it's more than likely the whole company will want to move to an ESB platform quickly because everybody likes to leverage and everybody likes things that are seamless). The team does not have to be very technical (the brochures and online PDFs explain things very well). Plus anybody inside the organization who thinks they need to participate should be involved.
On another note, the programmer who decided to take the initiative and write this needs to have a one-on-one with his or her manager immediately. Even organizations that value proactivity will find problems with this: there is a strict violation of at least one of the basic principles of enterprise software. I don't see any constants defined and everybody knows that "the enterprisocity of an application is directly proportionate to the number of constants defined."
http://thedailywtf.com/Articles/Enterprise_SQL.aspx
This would never get promoted through change management. Why hasn't anyone in-house written an Eclipse plug-in for this yet?
Further, what's the license on this? I'm afraid even if it's LGPL I can't go near this.
* provision one ec2 instance per number to check
* assign numeric order based on uptime in msec using zookeeper
* serve result via json
* render it on the client.It is done in node.js with the latest something.js fad that provides event-driven async MVC interfaces in Coffee script or something like that
Also, they will have 100% code coverage (thanks Uncle Bob) but will fail at launch since nobody bothered to test it for more than one user.
I see this primarily in Java or .NET shops - massive layer upon layer, code generation, factories, classes, etc. - when a simple architecture would be best. Why do we get these insane things to begin with? What's going on?
It feels sort of like premature scaling (what if we have millions of programmers - we need more abstractions!) combined with misuse/misapplication of design patterns.
You'll never* see stuff like this in Ruby on Rails, JavaScript, Python projects, etc. I'm curious how one goes from a simple, elegant program to over-engineered monstrosities.
* Hardly ever. I haven't in > 7 years.
So folks abstract everything, because they don't stop to think about whether it makes sense.
You know, just in case the day comes when they need to send requests using carrier pigeons instead of TCP. They never stop to think whether "in a world where we need carrier pigeons, would this app be useful anyway?"
"Object-oriented abstraction is going to change everything."
"Yeah, abstraction is good."
In the former case, it's usually easier to rewrite than write a new, compatible abstraction... in the latter, with simpler more custom interfaces, testing can be smoother than a lot of frameworks for these things.
My best guess would be that you often need to refactor you code to include some of the patterns showcased in the repo (factories, for instance). So developers try to future-proof their project by using those patterns everywhere. This is obviously a terrible idea.
Now for the bitchy part, why does no one ever speaks about the good sides of Java?
'Code to use, Refactor to re-use'
So developers try to future-proof their project by using those patterns everywhere.
Something I've seen a lot (and been guilty of myself) is trying to fix the problems of past projects in new projects before they crop up.A better solution is to not be afraid of refactoring (tests help here) so you can solve the problems when they become a problem, not create complication before.
Cause at some point most of them got tired to preach about Java and continue to do great work vs worrying what other people think.
Look around: NetFlix, Yammer, Twitter, Google are all using Java to power either their infrastructure or apps. Nobody blogs about it because "It Works" ;)
The rest blogs how they keep jumping between wagons :P
nobody makes jokes at the expense of well written Java software because its well written. we all know that the language is perfectly fine, and in alot of ways quite good, when it is used by sensible engineers.
Look at the HTML5 IndexedDB API, for example: obviously designed by someone "calibrated" to coding web browsers, not someone calibrated to doing web scripting.
And partly a correlation between the type of company that chooses a "proper", statically typed, "enterprise ready" language and the type of company that hires "safe pair of hands" programmers who value predictability over getting stuff done.
There are thousands of things one might want to do in the future, and many managers "prepare" for each and every change they can conceive.
So do good, high-level statically typed languages, i.e. the kind with type inference. Like Scala or ML.
In particular, take a look at how it has been extended by real languages, especially OCaml. OCaml has some very cool sub-typing features but manages to maintain global inference, unlike Scala. (Largely by choosing structural rather than nominative sub-typing.)
So some languages have had better type inference for longer than Scala has been around.
I've always found it most useful to think of this sort of garbage as an effort to hedge against terrible communication. Sure, it's likely to be a load of blood sweat and tears spent on useless tangential silliness; but one time in a hundred, the plastering of abstraction over ill-definied abstraction will allow a team to anticipate one step ahead in the chain of ever-shifting requirements, and thus, earn back a few hours and a tiny shred of dignity.
Nobody really likes this crap. But the life of the mean programmer is a grim one, indeed. Ultimately, the problem is that nobody really knows how to write software.
If you have a huge application and a high staff turnover you want to minimise the amount of information in your developers' heads. Strictly architected code can do this to some extent, and can go some way to reducing need for that other 'enterprise bane' - documentation. This is less of a problem in a startup type environment were you can find out about a particular piece of code by walking over to the kid that wrote it and having a chat.
Code generation (mentioned elsewhere on the thread) is another example of something that is less necessary in a small environment. Matching an enum to the contents of a database table or whatever can be done by convention to begin with, but it's less practical if your development team is spread across three timezones. Better to invest the time in letting computers do the work.
You can write "simple" systems in those languages that have the code purity you're looking for, but they won't be very testable.
In the dynamic languages you mentioned, you have duck typing and testing is a walk in the park.
They know some sort of abstraction is called for, but they end up picking abstractions which are actually a net negative for code complexity, rather than a positive. If you have enough of these developers then it devolves into code very much like the OP.
There is also a resistance to large refactorings which "clean house" of these sort of abstraction errors in enterprise teams and a lack of developers with the skill (and balls) to do it. So this cruft tends to accumulate.
If you are new to an organization, do you rock the boat and fight for code-reviews for nice looking code, or do you bite your tongue and and write enterprise code to make everything go smoothly, from an administrative standpoint? You are not going to be scolded and forced to defend yourself for the enterprisey code, even if it ultimately was the wrong choice.
Writing "enterprise" code is "safe".
[disclaimer: I am programming a service in angularJS for the client and SpringMVC for the server. My code looks exactly like this. I cry myself to sleep every night.]
Lately, for smaller one-offs, utility scripts etc.. NodeJS is my tool of choice. Even where it isn't the fastest choice, it tends to be one of the easier choices without going to a language the rest of the systems don't use (JS is used on the web, so web devs need to know it anyway)...
/fizzbuzz.js/ for(var i=1;i<=100;i++)console.log(!(i%3)&&!(i%5)?'FizzBuzz':!(i%5)?'Fizz':!(i%3)?'Buzz':i);
Or, in other words, the place that makes that kind of architecture won't allow the developers to touch anything that's not Java or .Net.
https://github.com/Mikkeren/FizzBuzzEnterpriseEdition/pulls?...
The potential for more funny is great here.
Change <= to < and ==
"One-liners lead to unclear code that has too much responsibility crammed into too little space. It's better to do less per line and keep the code readable. This changes the very complex and ambiguous operation <= into two separate, easily understood operations < and ==."
One of our routines returns a SQL string.
Sometimes SQL strings contain less-than symbols.
After much handwringing and an official bugfix that fixed nothing whatsoever, we decided on the next-best solution: all instances of `where foo < bar` must be generated as `where foo != bar and foo !> bar`. I shit you not, that is a not-greater-than operator.
http://pic.dhe.ibm.com/infocenter/dzichelp/v2r2/index.jsp?to...
I may sound frustrated, but I'm not. We all had a good laugh at the workaround and got back to work. This sort of thing is sometimes known as "job security".
Long story short: bureaucracy.
How ironic. This covers so many enterprise programmers with locked down Windows PCs.
[0] https://plus.google.com/u/0/111011776153281260419/posts/GWdk...
Tens of thousands of lines of dependency xml (that often doesn't even work because of incompatible common dependencies), three different built systems (ivy, ant and maven), abstraction for classes that have just a single concrete version, dependencies that are old and no longer supported (I'm looking at you Apache Gora). Hell, find the download link on most Apache java project sites. Now find the one for the source repository.
What madness has infected Java developers?
(Sadly, I've recently had to start doing a bunch of big data work with hadoop, possibly the most fractured and poorly documented open source project ever created)
Enterprise programmer -> Java Developer
Java Developer -/-> Enterprise programmer
The correct question is: What madness has infected Enterprise developers (and why do they all use Java)?
Oh yeah, and what about when I want to run scheduled FizzBuzz? Obviously I need Quartz, which requires...more XML!
Let's not get into the necessity of making a FizzBuzz OSGi bundle - we'll tackle that in the next iteration.
I give another example where goals and rewards are misplaced. India has a serious Cow problem. Every city in india has thousands of cows roaming freely on the streets. New Delhi, india's capital decided to solve this problem by hiring workers who would take this cows from the streets , put them in trucks and move out of the city. They get paid for the number of cows they collect every day. Guess what happens ? They release the cows next day into the city so that they can collect again and make money.
Anywhere there are goals and rewards misplaced, inefficiencies will creep up.
If you are a teacher in this position, provide fleshed out source/examples of enterprise software/requirements and have the students extend the functionality. Using minimized examples to prove the concept leads to rebellion/disgust.
There's also src/main/resources, src/main/webapps, and possibly other dirs that can go in there that aren't other languages.
What if you did a Poe's Law version of this? That is, try to create the most contrived parody of a solution to FizzBuzz possible, but one which still fools at least 50% of interviewers into thinking it's a legitimate response.
I'd love to see a branch of this with your suggestion, though... and maybe a script that would automatically generate a file structure that reflect the namespace of serious business with which one is interviewing. You know, for fun ;)
Abstraction makes code harder to read, so use it wisely!
[(n, (lambda x: ("fizz" if x % 3 == 0 else "") + ("buzz" if x % 5 == 0 else ""))(n)) for n in range(1,51)]
print(type("",(),{"__call__": lambda self, start, end: [(n, (lambda x: ("fizz" if x % 3 == 0 else "") + ("buzz" if x % 5 == 0 else ""))(n)) for n in range(start,end+1)] })()(1,50))
*Ticket 23145gwy54fvdr*
Variable names do not follow standard.
Revise and submit to Q&A. ' sum = sum + i
Array.SetValue( Text.Append( "GetSum", GetSum_Locals), "sum", Array.GetValue( Text.Append( "GetSum", GetSum_Locals), "sum" ) + Array.GetValue( Text.Append( "GetSum", GetSum_Locals), "i" ) )
- http://wiki.smallbasic.com/Simulating%20Local%20Variables.as...unironically exist in a language "aimed at bringing "fun" back to programming. By providing a small and easy to learn programming language in a friendly and inviting development environment, Small Basic makes programming a breeze"
?
http://github.com/tomjakubowski/fbaas https://github.com/tomjakubowski/fbaas/tree/sinatra
Accepting pull requests! I've had a couple mind-blowing contributions in obscure languages, my favorite being a provably correct Fizzbuzz service written in Coq:
class F{public static void main(String[]a){for(int i=0;i++<100;)System.out.println((i%3>0?"":"Fizz")+(i%5>0?i%3>0?""+i:"":"Buzz"));}}
I bet it would still be better in Javascript or Ruby because those are the only two languages that I know and everything is better as a web app anyway.
;)
Tempted to send this to my Java colleagues.
I met some c# guy who did the whole enterprise thing in his version, but it wasn't tongue in cheek at all.
in my head I went, this is why the whole ms enterprise stack sucks balls. the sad part is that they actually think it's good to abstract away something really simple.
EDIT: removed the link, sorry for offending you dude
Brilliant. So, if some random programmer built some way-over-complicated Javascript solution, would you think that the entire web platform "sucks balls"?
"the sad part is that they actually think it's good to abstract away something really simple."
Who is they? Microsoft, this random c# guy or all c# programmers? If you answer anything but "random c# guy", I'd like your evidence please.
Also, let's see some of your code please. Not fizzbuzz. I wanna see some of your real life code.
If some guy decides to write his website in his own dialect of Visual Basic, that isn't really being inflicted on anyone but his employees. The deeply-nested StrategyFactory stuff is an infection which worst affects languages like Java and C# (recruiters call it "OOP") because those communities do not strongly reject it.
Can you please name some tools and tell us how they say this is the right way to do things?
You didn't mention XCode. Why not? It has all of those features. So, it must be the non-core feature of IDEs that makes one seem complex and the other not. Which features are you talking about?
Eclipse, Netbeans, Maven, JUnit, JLog
J2SE libraries - pretty much all of them
Apache libraries
Hibernate
J2EE libraries
The list is endless
Even Google App Engine manages to be way more convoluted in Java than in Python or Go, it's not even funny
Furthermore - does this really help the argument that "the whole ms stack sucks balls" or even "the whole java stack..."?
[1] edited from Netflix. I use Netflix all the time, too!
I don't write java code like that as well (and I don't use swing) but sometimes is unavoidable due to the ways the libraries are structured.
i just started working on microsoft enterprise garbage. ever had to deal with sharepoint, dynamics?
even microsoft developers say you're doomed when you're being put on a sharepoint project.
I just codereviewed code for 2 different dynamics contractors. Both highly recommended by microsoft. both of them had high levels of abstractions, but the end result was tightly coupled anyway.
Their javascript was written the same way. The real joke of it was that I had never done anything of the likes.
Want some of my real code from many years ago? go through mplayer/ffmpeg
edit: as pekk said the problem is cultural
There are plenty of terrific systems built atop that stock. StackOverflow is implemented in ASP.NET, for instance.
linq is made by the haskell guy. well the haskell guy was a microsoft guy. but you get the idea. it did not grow inside of the .net enterprise culture. it grew outside of it. I never had any qualms about c# as a language. but that's also not what we're discussing.
just like f# is wonderful. but it too did not grow inside, but outside. they're being really smart about tying it into the enterprise as much as possible therefore guaranteeing it's future though.
I'll take C# over Java any day. Hands down.
It has its warts, sure, but it's night and day. I can't pin it down, but the C# libraries seem much more natural to me.
Of course, if the team culture is not good, it's going to be messy, either in Java, C#, Python, etc
Also, I'll be waiting to see some code that you think is great.
It's just hilarious to me when people think their shit doesn't stink and so I rub their faces in it.
Have you seen the code for Node.js? It's fucking disgusting. Yet everybody around here can't get enough of it. Seriously...I'd love to see how some of these developers would deal with enterprise requirements. I think the problem is that they just don't understand that business is chaos, it's not like building some pie-in-the-sky single-purpose social media application.
Many of the folks here haven't seen what kind of systems banks and other big companies work with, so they have this little start-uppy world view with tests and orm's and the like, where vulnerabilities in their software are touted as 'the price to pay for being agile', so it is very hard for them to understand some of the practises in big companies. Now sure, I've seen some bad code in there as well, but I also seen a lot of bad code in Rails projects (heck, before the idea of fat model skinny controller, most of rails programmers had controllers the size of the moon, then cam fm-sc and now models are enormous, but in rails 4 we will have concerns which I'm sure will result in same clusterfuck, and the interesting thing is, before fm-sc, rails folks said 'yeah, controllers are supposed to be like that', then with fm-sc 'no no, it's like this now', and now we get to concerns and will be the hot topic, and they keep rewriting and rewriting and touting how .net/java devs don't know what they are doing, while these devs have code in production and still in development for decades (well, java at least) in systems they can't even imagine the complexity.
tl,dr: stop assuming .net/java devs are shit and you are the best for using rails or python, chances are, you suck as much as them.
See, easy to over generalise.
Edit: And amazingly just 12 minutes ago: https://news.ycombinator.com/item?id=5395645
Great parody.
Are you offering support contracts? MegaCorp Management requires that we have paid support, the more expensive the better.
https://groups.google.com/forum/?fromgroups=#!msg/alt.humor.... [1997]
And contribute your fix.