Before you get riled up, there’s a couple things you should know about me and this article. Each year, I like to do a list post to celebrate my birthday. In years past, I’ve covered topics from tech to anime. This year, I figured I’d talk about programming languages.
Now, to be fair, the title is nothing short of clickbait. In reality, I don’t much care for the usual pissing contests that happen in tech circles around different tools. Otherwise, I wouldn’t have ranted so extensively about our field’s obsession with gatekeeping programming languages:
- What is a Programming Language?
- Who Gets to Decide What Is and Isn’t a Programming Language?
- There Is No Value in Ranking Programming Languages: The Cost of Gatekeeping in Tech
That said, I do occasionally find it fun to lean into the memes, which is the purpose of today’s article. As a result, don’t take it too seriously! And, definitely don’t use this article as a tool to gatekeep other folks from the field.
Now, without further ado, let’s get into it!
Table of Contents
- Credibility Where It’s Due
- Rating Scale
- Best Programming Languages from Worst to Best
- [#28] Objective-C
- [#27] Perl
- [#26] Visual Basic
- [#25] Brainfuck
- [#24] C++
- [#23] C
- [#22] Lisp
- [#21] Pascal
- [#20] Lua
- [#19] Scheme
- [#18] MATLAB
- [#17] Racket
- [#16] PHP
- [#15] JavaScript
- [#14] Bash
- [#13] TypeScript
- [#12] Scala
- [#11] Java
- [#10] Go
- [#9] Ruby
- [#8] Rust
- [#7] Swift
- [#6] Pyret
- [#5] Haskell
- [#4] Julia
- [#3] Kotlin
- [#2] C#
- [#1] Python
- What’s Your List?
Credibility Where It’s Due
Before we get into the official list, I already know there are questions you might have. For example, who the hell has worked with 28 programming languages realistically? The short answer: I haven’t.
If I were to draw up a distribution of the programming languages I’ve been exposed to and how much I’ve used them, there would probably be only a handful of languages with any serious use in my repertoire.
That said, I should mention that I am the maintainer of a rather large collection of code snippets called Sample Programs. At the time of writing, this repo featured 162 programming languages and 621 code snippets. As a result, I’ve clearly been exposed to many, many programming languages.
Does that make me qualified to rank the top 28? Probably not! But, this is a shit post, so who cares? At the very least, I hope this list gives you a laugh, and maybe you’ll even find a new language to learn for yourself.
Rating Scale
When I was first putting this list together, I was sort of working from a gut feeling. However, once I hit the 20 language mark, I found it a lot hard to actually rank the languages. As a result, I thought I’d make a rating scale.
Now, because I’m trying to have some fun with this, the rating scale is going to have to be fun as well. Here are my criteria (each are out of 10):
- Fun: for me, a language needs to be fun to use. Fun is subjective and somewhat hard to quantify, but it usually maps to how hard it is to do simple things (I’m looking at you Java).
- Useful: for me, useful is a measure of practicality for a language. While a language may be fun to use, that doesn’t mean it’s actually practical (I’m looking at you Brainfuck).
- Nice: for me, a language is nice if it is pleasing to the eyes (I’m looking at you C++).
Now, we have a scale that can be used to rank the programming languages according to how FUN they are. Who doesn’t love a rating scale that’s a bit recursive? Anyway, let’s get started.
Best Programming Languages from Worst to Best
Chances are when you look through this list, you’ll see languages you’ve never heard of. To help you put some context around the languages, I’ll first share what a program looks like in that language. To keep things consistent, I’ll be showing what FizzBuzz looks like in each of the languages (for which the program exists in the Sample Programs repo).
As usual, we’ll start with the worst language and work backwards. You can see my official ratings for each language at the bottom of each section.
[#28] Objective-C
#import <Foundation/Foundation.h> int main (int argc, const char *argv[]){ NSAutoreleasePool *pool =[[NSAutoreleasePool alloc] init]; NSMutableString* fizzbuzz = [[NSMutableString alloc] init]; int i; for (i = 1; i <= 100; ++i) { [fizzbuzz setString: @""]; if (i % 3 == 0) { [fizzbuzz appendString: @"Fizz"]; } if (i % 5 == 0) { [fizzbuzz appendString: @"Buzz"]; } if ([fizzbuzz length] != 0) { NSLog(fizzbuzz); } else { NSLog(@"%d", i); } } [fizzbuzz release]; [pool drain]; return 0; }
Alright, the worst programming language to make it on this list is Objective-C. As far as I know, Objective-C is/was the language used to build iOS apps, and I believe it’s also used in OS X development.
I’ve never personally used it, but I find it to be one of the ugliest programming languages ever made. I mean look at it? What the hell is a pool? Why are we draining it? Why are there so many square bracket? What is an NSMutableString?
Languages like C and C++ are also quite ugly, and Objective-C somehow managed to make them worse. At least, the language is somewhat useful.
Category | Score |
---|---|
Fun | 2 |
Useful | 6 |
Nice | 0 |
Average | 2.7 |
[#27] Perl
use strict; use warnings; use diagnostics; use 5.10.0; for my $n (1..100) { !($n % 15) ? say "FizzBuzz" : !($n % 3) ? say "Fizz" : !($n % 5) ? say "Buzz" : say "$n"; }
Let’s face it. If I wanted to code with symbols, I would just use brainfuck. What were the developers thinking when they made Perl? I’m hardly surprised that a language like this ended up forking (see Raku).
With that said, I suppose there is some merit to Perl. As far as I know, it’s fairly useful as a scripting language on Unix/Linux systems, and it’s most famous for text manipulation. Regardless, I had to throw this one in the trash.
Category | Score |
---|---|
Fun | 3 |
Useful | 5 |
Nice | 1 |
Average | 3 |
[#26] Visual Basic
Option Explicit On Module FizzBuzz Public Sub Main() FizzBuzz() End Sub Sub FizzBuzz() Dim first = True Dim i As Integer For i = 1 To 100 If i Mod 15 = 0 Then If first Then System.Console.Write("FizzBuzz") first = False Else System.Console.Write(", FizzBuzz") End If ElseIf i Mod 5 = 0 Then If first Then System.Console.Write("Buzz") first = False Else System.Console.Write(", Buzz") End If ElseIf i Mod 3 = 0 Then If first Then System.Console.Write("Fizz") first = False Else System.Console.Write(", Fizz") End If Else If first Then System.Console.Write(Str(i)) first = False Else System.Console.Write($", {Str(i)}") End If End If Next End Sub End Module
I first picked up programming when I was 18. At that time, I started learning Java. That said, I distinctly remember some of my friends learning Visual Basic in high school.
That becomes somewhat of a funny memory for me now because I am very thankful I never put myself through that. I mean, again, look at this code. The UpperCamelCase style is ugly enough, but also this program is enormous.
If I took my shot at Apple for Objective-C, you bet I’m taking my shot at Microsoft for this one. I’d rather use C in either case.
Category | Score |
---|---|
Fun | 3 |
Useful | 6 |
Nice | 1 |
Average | 3.3 |
[#25] Brainfuck
++++++++++>>++++++++++[<++++++++++>-]<[>>+>>+++>>>>+>+>+<<<<<<<<[>+>->+<[>]>[<+> -]<<[<]>-]>>>[>>>-<<<[-]][-]<[-]+++++<[<+>-]<[>+>->+<[>]>[<+>-]<<[<]>-]>>>[>>>>- <<<<[-]]>>>[>>>-[------->+<]>---.[-->+++<]>.-[--->+<]>++..[-]<<<<[-]<<[-]]>[>>++ ++[++++>---<]>-.++[----->+<]>+.+++++..[-]<<<[-]<[-]]>[<<<<<<<[>>>>>>>>+>>>>>>>>+ <<<<<<<<<<<<<<<<-]>>>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>-]<<<<<<++++ ++++++<<[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<]>>[-]>>>++++++++++<[->-[>+>>]>[+[-<+>]> +>>]<<<<<]>[-]>>[>++++++[-<++++++++>]<.<<+>+>[-]]<[<[->-<]++++++[->++++++++<]>.[ -]]<<++++++[-<++++++++>]<.[-]<<[-<+>]<[-]<[-]]<<<<<[-]<[-]<[<+>-]<<<<.>-]
Look, I told you my rating scale was measured in fun. If this is your first time seeing brainfuck, you’re welcome. This language features just 8 characters and can read and write text.
Obviously, brainfuck is incredibly useless and hard to use. That said, esoteric languages exist for a reason, and this one is a lot of fun.
Category | Score |
---|---|
Fun | 8 |
Useful | 1 |
Nice | 1 |
Average | 3.3 |
[#24] C++
#include <iostream> int main() { for (int i = 1; i <= 100; i++) { if (i % 15 == 0) std::cout << "FizzBuzz\n"; else if (i % 5 == 0) std::cout << "Buzz\n"; else if (i % 3 == 0) std::cout << "Fizz\n"; else std::cout << i << "\n"; } return 0; }
C++ was one of the first programming languages that I really didn’t like. And keep in mind, I got my degree in Computer Engineering, so I’m used to using hardware languages like assembly and Verilog.
Unfortunately, C++ is ubiquitous, so just knowing language can score you a job just about anywhere. That said, has anyone really tried to use it? It is one of the most bloated languages I’ve ever used. As a result, 10 people could write code for the same problem and come up with 10 different solutions. That makes it a very unfun language to use in a team. And I would know, I’ve had the misfortune of writing code for a locomotive camera system in C++.
Category | Score |
---|---|
Fun | 0 |
Useful | 10 |
Nice | 0 |
Average | 3.3 |
[#23] C
#include <stdio.h> int main(void) { for (unsigned int i = 1; i <= 100; i++) { if (i % 15 == 0) { puts("FizzBuzz"); } else if (i % 3 == 0) { puts("Fizz"); } else if (i % 5 == 0) { puts("Buzz"); } else { printf("%u\n", i); } } return 0; }
Looking back on this list, I feel like I did C somewhat dirty. See, C by itself is honestly pretty elegant, lightweight, and compact. It’s its proximity to C++ that I think makes me hate it as well.
That said, if I really had to complain, I’d have to say that C is just too low level to have any real fun. I’m not trying to write everything from scratch. Likewise, I’m not trying to deal with a mess of makefiles and object files.
Of course, I would be lying if writing Arduino code wasn’t a little bit fun, so hats off to you C.
Category | Score |
---|---|
Fun | 2 |
Useful | 10 |
Nice | 1 |
Average | 4.3 |
[#22] Lisp
(defun divides-by (num divisor) (= (mod num divisor) 0)) (dotimes (num 100) (write-line (cond ((and (divides-by (+ num 1) 3) (divides-by (+ num 1) 5)) "FizzBuzz") ((divides-by (+ num 1) 3) "Fizz") ((divides-by (+ num 1) 5) "Buzz") (t (write-to-string (+ num 1))))))
Lisp is one of those relics of the past, like C/C++, that just never quite went away. After all, I even had to write an interpreter for it in grad school at one point. On the plus side, Lisp is far more lightweight and potentially easier to learn than either of those languages, so it’s somewhat hard to complain.
That said, as the forefather of functional programming, it leaves a lot to be desired. Mainly, it’s syntax around parentheses is messy. Even with a well formatted program like the one above, it’s hard to tell exactly what’s going on.
Regardless, I would prefer to use a functional language like this than some of the messes above.
Category | Score |
---|---|
Fun | 5 |
Useful | 5 |
Nice | 4 |
Average | 4.7 |
[#21] Pascal
program FizzBuzz(output); var i : integer; begin for i := 1 to 100 do if i mod 15 = 0 then writeln('FizzBuzz') else if i mod 3 = 0 then writeln('Fizz') else if i mod 5 = 0 then writeln('Buzz') else writeln(i) end.
At this point, we get to the languages I would consider “mid.” In other words, if I were asked to use them, I wouldn’t really complain.
The very first “mid” language is Pascal, and it comes from the era of C. In fact, it looks a lot like C, but it uses begin and end keywords to mark blocks instead of braces. To me, this makes the language a lot easier on the eyes. Though, the fact that Pascal is case insensitive is a little weird.
One thing I’m a big fan of in Pascal is the distinction between functions and procedures. This is one of those ideas I talk about when comparing statements and expressions, and it’s cool to see this relationship in a language.
All that said, I haven’t really used Pascal, but I’ve heard some nice things from folks in the past. So, I’ll stick it in the “mid” bucket.
Category | Score |
---|---|
Fun | 5 |
Useful | 5 |
Nice | 5 |
Average | 5 |
[#20] Lua
for i = 1, 100 do output = "" if i % 3 == 0 then output = output .. "Fizz" end if i % 5 == 0 then output = output .. "Buzz" end if output == "" then output = i end print(output) end
As I understand it, Lua is a scripting language that has made its way into game development. I haven’t personally used it, but it looks fine. As a result, I’ll throw it down as “mid.” At the very least, it has to be more fun to use than C++. Also, I’ve heard it indexes from one, so it earns some points for being a little rebel.
Category | Score |
---|---|
Fun | 5 |
Useful | 5 |
Nice | 5 |
Average | 5 |
[#19] Scheme
Note: the following program computes the reverse of a string, not FizzBuzz.
(define (reverse-string x) (list->string (reverse (string->list x)))) (display (reverse-string (list-ref (command-line) 1)))
Again, I don’t really know how Scheme is different from Lisp, but a cursory glance tells me that it’s a bit nicer to use. I’m noticing these arrow operators which are apparently the convention for writing conversion functions.
That said, it looks like Scheme has many of the same drawbacks as Lisp—namely the obsession with parentheses. However, given that I know languages like Scheme and Clojure are used in production code, I had to put them over Lisp.
Category | Score |
---|---|
Fun | 6 |
Useful | 6 |
Nice | 4 |
Average | 5.3 |
[#18] MATLAB
function [] = fizzBuzz(x) % Loop from 1 to 100 for i = 1:100 fizzbuzz = ''; % Check if i is divisible by 3 if mod(i,3) == 0 fizzbuzz = [fizzbuzz 'Fizz']; end % Check if i is divisible by 5 if mod(i,5) == 0 fizzbuzz = [fizzbuzz 'Buzz']; end % If fizzbuzz variable is empty,print i if isempty(fizzbuzz) disp(i) else % If fizzbuzz variable is not empty, print the variable disp(fizzbuzz) end end end
You might be surprised to see MATLAB above .500 in this list. I know it’s one of those languages that is looked down upon by folks in the tech community.
That said, I think it has some really good utility in the STEM space. For example, I know a lot of folks use it for number crunching and simulation.
However, in my experience, it’s fairly unfun language to use. I could point to things like indexing from one (I should say hi to Lua while I’m at it), or the fact that the language is proprietary. I could also point to the weird cycle of clearing that you have to do to purge the namespace. As a result, I hesitate to give it much more attention than it deserves.
Category | Score |
---|---|
Fun | 4 |
Useful | 9 |
Nice | 3 |
Average | 5.3 |
[#17] Racket
#lang racket (for ([i (in-range 1 101)]) (cond [(and (equal? 0 (modulo i 3)) (equal? 0 (modulo i 5))) (printf "FizzBuzz\n")] [(equal? 0 (modulo i 3)) (printf "Fizz\n")] [(equal? 0 (modulo i 5)) (printf "Buzz\n")] [else (printf "~a\n" i)]))
Since we’re on a kick of functional programming languages, let’s talk about Racket. I’m not a functional language person, but I get the appeal. Given that we’ve already covered Lisp and Scheme, the question becomes: what makes Racket better?
As far as answers go, I don’t really have a good one. However, I do have a soft spot for Racket for a variety of reasons. First, I’m a big fan of its macro system which allows you to literally modify the syntax to your needs, and apparently there are a bunch of modules for that.
Likewise, when I was looking into Pyret (a language much higher on this list), it name dropped Racket as one of its contemporaries and influences.
Of course, Racket has all the same sort of syntax issues as Lisp and Scheme, so it’s hard to really say which on is best.
Category | Score |
---|---|
Fun | 6 |
Useful | 6 |
Nice | 5 |
Average | 5.7 |
[#16] PHP
<?php for ($i = 1; $i < 101; $i++) { $output = ""; if ($i % 3 == 0) { $output .= "Fizz"; } if ($i % 5 == 0) { $output .= "Buzz"; } if (!$output) { $output = $i; } echo $output . "\n"; }
One language that’s almost universally hated is PHP, yet it makes up the backend of a majority of the websites on the web. As a result, it’s really hard to ignore its influence.
That said, it’s quirky and messy, and I even recall that you’re able to mix strings with regular code. That seems like a recipe for disaster.
However, given its influence, it has a massive ecosystem that makes it a practical language for anyone looking to get into web development. And for me, web development is the only fun way to make GUIs.
Category | Score |
---|---|
Fun | 4 |
Useful | 10 |
Nice | 3 |
Average | 5.7 |
[#15] JavaScript
function fizzbuzz(num){ for(let i=1; i <= num; i++){ if(i % 15 == 0){ console.log("FizzBuzz"); } else if(i % 5 == 0){ console.log("Buzz"); } else if(i % 3 == 0){ console.log("Fizz"); } else console.log(i); } } fizzbuzz(100);
At this point, we start getting to the heavy hitters. I’m not saying JavaScript is fun to use by any stretch, but it’s incredibly useful. And like I’ve said, I enjoy a bit of web development myself.
That said, like C++, JavaScript is full of weird syntax that has compounded over many, many years. And it seems like every couple of months, I see someone advocated for a different way to use the language. That’s definitely a downside for me.
But, hey! I gave it a 6, so it must be decent.
Category | Score |
---|---|
Fun | 5 |
Useful | 10 |
Nice | 3 |
Average | 6 |
[#14] Bash
#!/bin/bash for i in {1..100}; do if (( $i % 15 == 0 )); then echo "FizzBuzz" elif (( $i % 5 == 0 )); then echo "Buzz" elif (( $i % 3 == 0 )); then echo "Fizz" else echo $i fi done
Bash is one of those languages that is extremely useful but hard to get used to. Back when I used to toy around in Linux, I wrote many a bash script to solve little problems here and there.
Generally, I find the syntax unpleasing, but there are few languages with the amount of power that bash has. If you already know how to navigate the Linux command line, you have most of the tools needed for building up scripts. As a result, I put Bash in the top of this list.
Category | Score |
---|---|
Fun | 5 |
Useful | 10 |
Nice | 5 |
Average | 6.7 |
[#13] TypeScript
let line: string; for (let i = 0; i <= 100; i++) { if (i % 3 == 0 && i % 5 == 0) { line = "FizzBuzz"; } else if (i % 3 == 0) { line = "Fizz"; } else if (i % 5 == 0) { line = "Buzz"; } else { line = String(i); } console.log(line); }
I’m going to be honest. TypeScript is a language that I’ve never used. That said, if it’s even as remotely as useful as JavaScript, it has to be good.
In my experience, JavaScript is a bit clunky to use. Any language that reduces the complexity of JavaScript while also including a convenient syntax is going to be a win in my book. Hell, I know the selling point is types, but if Typescript is to JavaScript what Kotlin is to Java, then I’m sold.
Category | Score |
---|---|
Fun | 5 |
Useful | 9 |
Nice | 6 |
Average | 6.7 |
[#12] Scala
object FizzBuzz { def main(args: Array[String]): Unit = { for (i <- 1.until(101)) { var output: String = "" if (i % 3 == 0) { output += "Fizz" } if (i % 5 == 0) { output += "Buzz" } if (output.isEmpty) { output += i } println(output) } } }
To be quite honest, I’m not really sure how Scala made it this high in the list. I suppose using averages on a rating scale is going to benefit languages that aren’t quite good at one thing.
Regardless, I am somewhat familiar with Scala as a Java clone/impovement. I wrote about it awhile back when I was building out the Sample Programs repo, so I remember it being very Java-like.
Overall, though, I am somewhat glad to find it this high in the list—if for no other reason than to piss off this guy:
Category | Score |
---|---|
Fun | 6 |
Useful | 8 |
Nice | 6 |
Average | 6.7 |
[#11] Java
public class FizzBuzz { public static void main(String[] args) { for (int i = 1; i < 101; i++) { String output = ""; if (i % 3 == 0) { output += "Fizz"; } if (i % 5 == 0) { output += "Buzz"; } if (output.isEmpty()) { output += i; } System.out.println(output); } } }
Look, I don’t really like Java. It was my first programming language, and I’ve come to hate it the more I use it.
However, it’s fairly undeniable how important Java is as a programming language. I would put it up against languages like C and JavaScript in terms of ubiquity. As far as fun, it’s a mixed bag. I’ve done a lot of fun things with Java, but there are aspects of it that are a huge pain. For instance, it’s one of the most verbose languages in existence, and don’t even get me started on dependency management.
All that said, if I were to recommend a programming language to someone new in the field, I’d probably have Java somewhere near the top of that list. If you’re interested in learning it yourself, I have a fairly old tutorial series that I think could get you started.
Category | Score |
---|---|
Fun | 5 |
Useful | 10 |
Nice | 5 |
Average | 6.7 |
[#10] Go
package main import "fmt" func main() { for i := 1; i <= 100; i++ { if i%15 == 0 { fmt.Println("FizzBuzz") } else if i%3 == 0 { fmt.Println("Fizz") } else if i%5 == 0 { fmt.Println("Buzz") } else { fmt.Println(i) } } }
Go is one of those languages I hear about in like 2014 that I didn’t fully understand the hype around. Since then, I may have used the language only a handful of time, and it honestly looks like some mix of Pascal and C.
So, what is it doing this high on the list? Well, it’s C but better and not in the ways that C++ tried to be better. I mentioned already that C should probably be higher on this list, and the only reason I don’t feel so bad about where it’s at is because of languages like Go and, as you’ll see soon, Rust.
All that said, I’m not sure how useful Go is. I estimated an 8 because it was built at Google. Maybe folks out there are using it daily. I have no clue.
Category | Score |
---|---|
Fun | 7 |
Useful | 8 |
Nice | 6 |
Average | 7 |
[#9] Ruby
def fizzbuzz(number) divisibleBy3 = (number % 3 == 0) divisibleBy5 = (number % 5 == 0) case when divisibleBy3 && divisibleBy5 puts "FizzBuzz" when divisibleBy3 puts "Fizz" when divisibleBy5 puts "Buzz" else puts number end end (1..100).each {|n| fizzbuzz n}
Okay, now we’re getting into the good languages. Up first, I wanted to talk about one of the cooler scripting languages out there, Ruby. Again, I haven’t really used Ruby, but I know it’s incredibly popular for web development.
Given how nice the syntax looks, I can’t help to fall for it. That said, the few times I actually tried using Ruby, I tripped over some of its quirkiness.
Overall, I think the utility of Ruby makes it a great choice, but I’m definitely into its vibe. It looks like a language that would be relatively painless to learn.
Category | Score |
---|---|
Fun | 7 |
Useful | 9 |
Nice | 6 |
Average | 7.3 |
[#8] Rust
fn main() { for number in 1..101 { if number % 3 == 0 && number % 5 == 0 { println!("FizzBuzz"); } else if number % 3 == 0 { println!("Fizz"); } else if number % 5 == 0 { println!("Buzz"); } else { println!("{}", number); } } }
Rust is one of those languages that has exploded in popularity recently. My understanding is that it’s supposed to replace C/C++. I have no clue if it’s doing that, but I literally only hear good things from folks.
I will say there are some weird syntax things that sort of bothered me when I looked into the language. In general, metaprogramming is a weird feature, and it seems to be a native feature of Rust (I realize I mentioned this as a strength of Racket. I never claimed this was a serious post). Just look at that println
macro above.
That said, if Rust really is this hyper performant and easy-to-use language, I’m sold.
Category | Score |
---|---|
Fun | 7 |
Useful | 9 |
Nice | 6 |
Average | 7.3 |
[#7] Swift
func fizzBuzz(start: Int = 1, end: Int = 100) -> Void { let range = start...end for number in range { guard number % 5 == 0 || number % 3 == 0 else { print(number) continue } var fizzAndOrBuzz = "" if number % 3 == 0 { fizzAndOrBuzz = "Fizz" } if number % 5 == 0 { fizzAndOrBuzz += "Buzz" } print(fizzAndOrBuzz) } } fizzBuzz();
Okay, hear me out. I’m not an Apple person. While I have an iPhone, I’ve never owned an OS X device. As a result, I haven’t personally done any Swift development.
However, in 2018, I was poking around the language and sort of fell in love with it. The idea of having guard clauses built in as syntax elements is awesome. Also, I love any language that actively tries to avoid the concept of null, so building in Optional types with associated operators are awesome features.
Given that Swift is more or less restricted to the Apple ecosystem, it’s not exactly the most useful language, but it sure beats the hell out of Objective-C.
Category | Score |
---|---|
Fun | 8 |
Useful | 7 |
Nice | 9 |
Average | 8 |
[#6] Pyret
Note: the following program was borrowed from the Pyret docs and is not FizzBuzz.
fun sum(l): cases (List) l: | empty => 0 | link(first, rest) => first + sum(rest) end where: sum([list: ]) is 0 sum([list: 1, 2, 3]) is 6 end
Okay, Pyret is one of those programming languages you’ve probably never heard of, and unlike most of the languages on this list, it’s FUN score is inverted. See, as far as I know, Pyret isn’t all that useful—at least not in production environments. However, what it lacks in utility, it makes up for with some truly nice syntax.
I first learned about Pyret when I was writing an article about programming language features. Pyret stuck out to me because it had inline testing (see the where
clause above). Basically, this means you can write a function and test it natively. No need to bust out a testing framework.
Now, I suppose inline testing isn’t super practical for real world development. That said, I quite like it as an educational language. If I were to ever teach my own programming course, I might use Pyret—though, I’m aware students don’t really like learning tools that aren’t practical.
Regardless, I hope one day Pyret gets enough backing that it becomes a production tool. To me, it’s just too nice to pass up.
Category | Score |
---|---|
Fun | 10 |
Useful | 5 |
Nice | 9 |
Average | 8 |
[#5] Haskell
Note: the single quotes below should be backticks.
module Main where fizzbuzz :: Int -> String fizzbuzz x | x 'mod' 15 == 0 = "FizzBuzz" | x 'mod' 3 == 0 = "Fizz" | x 'mod' 5 == 0 = "Buzz" | otherwise = show x main = mapM (putStrLn . fizzbuzz) [1..100]
At long last, we finally get to the holy grail of functional programming languages. As someone who has dabbled in Lisp, Scheme, Racket, and Elixir, Haskell seems like the only functional programming language with a nice syntax.
Now to be honest, I haven’t used Haskell myself, but I find the language to be really pretty. Outside of that, the syntax makes a lot of sense to me—even as someone who spends most of their time in imperative languages.
Category | Score |
---|---|
Fun | 9 |
Useful | 7 |
Nice | 8 |
Average | 8 |
[#4] Julia
for i = 1:100 str = i % 3 == 0 ? "Fizz" : "" str *= i % 5 == 0 ? "Buzz" : "" if isempty(str) str = i end println(str) end
Ah, Julia is yet another one of those languages that has a fairly niche utility. That said, in its limited use, it does a lot of things well—namely data analysis.
To me, Julia is a lot like Python with some of the drawbacks of languages like R or Perl. Again, I really don’t care for languages that make a lot of use of operators (like what the hell is this ⊻
), but I suppose it makes sense for a language appealing to math folks.
Overall, Julia is one of those languages that, if I had the time, I’d start learning tomorrow. For now, I’ll keep using Python for all my data analysis.
Category | Score |
---|---|
Fun | 8 |
Useful | 8 |
Nice | 9 |
Average | 8.3 |
[#3] Kotlin
fun main(args: Array<String>){ for (i in 1..100){ when { (i % 3 == 0 && i % 5 == 0) -> println("FizzBuzz") i % 3 == 0 -> println("Fizz") i % 5 == 0 -> println("Buzz") else -> println("$i") } } }
Probably one of the more surprising rankings in this list is Kotlin. However, if you’ve ever used Java, then Kotlin feels like transitioning from a rusted up bicycle to a luxury car. Both are going to get you to where you’re going, but one is going to be significantly more enjoyable.
Personally, I don’t use Kotlin, but I tried using to make a mobile app for my wife. In my short time toying with the language, I found that it was similar to Java but with many of the annoying aspects of the Java removed. For instance, variable declarations are not nearly as verbose.
In short, it seems like whoever wrote Kotlin designed it specific to flip the bird at Java.
Category | Score |
---|---|
Fun | 9 |
Useful | 7 |
Nice | 9 |
Average | 8.3 |
[#2] C#
namespace FizzBuzz { public class Program { public static string FizzBuzz(int number) { string temp = ""; if (number % 3 == 0) { temp += "Fizz"; } if (number % 5 == 0) { temp += "Buzz"; } if (string.IsNullOrEmpty(temp)) { temp += number; } return temp; } private static void Main(string[] args) { for (int i = 1; i <= 100; i++) { string line = FizzBuzz(i); System.Console.WriteLine(line); } } } }
I’m going to sound a bit repetitive here, but C# is essentially Java++ (just not in all the bad ways that C++ was to C). Frankly, the only reason C# makes it ahead of Kotlin is utility. As far as I know, Kotlin is primarily a mobile app development language, whereas C# has a bit more reach (e.g., game development).
I first picked up C# when I was writing code for Unity. At the time, I thought it was basically a Java clone, but quickly I noticed there were tons of features to make my life easier. It’s likely that Kotlin does this even better, but C# is just too ubiquitous at the moment.
Regardless, I would take either of them over Java every day of the week.
Category | Score |
---|---|
Fun | 8 |
Useful | 9 |
Nice | 9 |
Average | 8.7 |
[#1] Python
for n in range(1, 101): if n % 3 == 0: print("FizzBuzz" if n % 5 == 0 else "Fizz") continue print("Buzz" if n % 5 == 0 else n)
You might have noticed that periodically throughout this list there would be a sizable jump in scores between items. For instance, there is a 1.3 point jump between C# and Python. The reason for this is pretty obvious: Python has no competition.
For the doubters, let me put it this way. I’ve been using Java for a significantly longer time than I’ve been using Python, yet when I have an idea, I can prototype in a quarter of the time it would take me to do it in Java. So, we’re not even talking about an issue of skill difference. Python is just built differently.
All jokes aside, I really stand by Python as one of my favorite tools to use by a mile. This year will be my tenth your of developing software, and I’m very fortunate to have stumbled upon Python so quickly.
Category | Score |
---|---|
Fun | 10 |
Useful | 10 |
Nice | 10 |
Average | 10 |
What’s Your List?
With my meme of a list out of the way, let me ask: what would yours look like? Be aware that if you’re older than me, you have to come up with even more obscure languages.
In the meantime, I might as well share some resources to get you learning Python. After all, it’s the one true language:
- Comparing Java to Python: A Syntax Mapping
- Introduction to Python Coding With Discord Bots
- 11 Python Practice Problems for Beginners
Also, special shout out to Brently, my latest Patreon subscriber! Hope you have a good one. And to everyone else, thanks for stopping by!
Recent Code Posts
Unpacking the Jargon Around Compilers, Interpreters, and More
Today, we're going to get a little pedantic and try to define concepts like compiler and interpreter. Of course, I ultimately don't think it matters what the exact definitions are for practical...
Generally, people think of Python as a messy language because it lacks explicit typing and static type checking. But, that's not quite true in modern times. Surely, we can take advantage of type...