Most of my career, I've worked on code that I haven't been able to release for public consumption. I've written some cool things, and write about those cool things in my resume... but I haven't had a chance to publicly showcase things that I've done. Logically following, that means that I haven't had cool things to show off to potential employers. That unfortunately means I've probably missed out on some unicorn job opportunities.
Now, I've decided that that is going to change! Like endless software developers before me, I'm taking a play from Richard Stallman's book and putting some cool junk I wrote and putting it on the Internet. Introducing... METAPHOR!
What is Metaphor?
Metaphor is an F# project implementing metaphor-based algorithms. Currently, only the Firefly variant of Particle Swarm Optimization is implemented. More algorithms will be implemented in the near future.
Why?
A data analysis team I supported was having issues with a deterministic solver (specifically, Nelder-Mead) taking an incredibly long time to run to completion for a specific problem. I began looking into non-deterministic solvers as an alternative, and ran across an MSDN article with an implementation of the Firefly algorithm. I noticed an issue with the implementation (updating w/ partially updated state), and decided to fix the issues I saw and release a more correct version.
Where are you going with this project?
I plan on incorporating additional metaphor-based algorithms such as:
- Simulated annealing
- Hill climbing
- Particle swarm optimization
- Ant colony optimization
- Cuckoo search
Additionally, there has been some criticism involved with various metaphor-based algorithms and their supposed "ingenuity." I want to implement the algorithms myself to see how "trivial" the differences in certain algorithms really are. Also, I have a soft spot for algorithms that draw inspiration from something other than rote mathematics.
I also plan to write tests and optimization functions in a variety of languages
so that these algorithms are available on multiple platforms. I plan to target:
- Rust
- Clojure
- Elixir
This is going to be partially to showcase that I know how to write these languages idiomatically, and partially to keep my skills fresh with these languages. I don't use each of these languages every day (I'm primarily an F# developer), and if you don't use it you lose it.
Why are you telling us about it?
That's a great question that you just read to yourself! Well, this post is called "Accountability through Publicity." I'm writing about it because I told myself I would build some OSS this year that I was proud of. Between kids and my day job, it's hard to find time to keep my skills fresh, and I know that I need to do that, and the best way to make sure that I do that is to push myself to write a blog post every week or two. Additionally, the first post that I wrote, two people found that it inspired them to try to break out of old habits. If this inspires even one person to write some OSS that they've been putting off for years. That's potentially great for all of us!
Wrap it up, B
So yeah, I finally put out one little OSS thing. It's not much, but I'm happy with it. I didn't elaborate much on the underlying algorithm, the issue that I found in the implementation, or elaborate about the applicative functors and optimization functions that I used... But those can easily be topics for future posts.
I hope you enjoyed this post, and any feedback on content is definitely appreciated!
Top comments (3)
Thank you for the article, Jason.
I learned of a new concept,
Metaphor-based algorithms
πAnother way to make the resolution public is to announce it on Twitter with #100daysofcode hashtag (and the bot @_100DaysOfCode that tracks it).
Thanks for the reminder about 100 days of code! I'll hopefully be able to commit that sort of time during the summer.
I'd love it if you would share that here during summer :)