D. Ben Knoble

Leveling up as a developer - the journey is important too!

Learn a variety of programming paradigms:

Write an application in a prototype-based language

I co-wrote limchess with a friend of mine for UNC Chapel Hill’s Comp 580 (Enabling Technology). The project is mostly JavaScript and leans heavily on jQuery to bring chess to the accessible world of limited-input devices. (I haven’t done anything with node, but I think this still counts.)

Write an application in an object-oriented language

For AP Computer Science (high school), I implemented a game called “Baffles” in Java. One shoots lasers into a grid and guesses where in the grid are located “mirrors” that deflect the laser.

I also wrote a compiler for a subset of Java in Java. So much Java…

There’s more: check out prolog-java.

Write an application in a logic programming language

Write an application in a functional language

During my time in a pilot for Principles of Programming, I built a git terminal and web client in Clojure. The previous year, I wrote a simulator for a type of computer called “Intcode” in Standard ML (in addition to a bunch of other small programs).

I also built loner, an LL(1) checker and context-free-grammar library, in Scala.

I’m working on a formal-languages library and application in Clojure, and I have a few more ideas for which SML or Haskell might be well-suited.

I recently wrote smlnj-parser-style, a small static-analysis library for UNC’s Comp 524 (Programming Language Concepts).

Write an application in Forth

Write a program in assembly language

I wrote many MIPS programs for Comp 411 at UNC Chapel Hill (Computer Organization).

I recently wrote a MIPS interpreter in MIPS for Comp 541 (Digital Logic). More information on mips2 on GitHub.

Write an application using the Actor model

Experience the ins and outs of programming for different platforms:

Write a nontrivial web app

Write a realtime system

Write a nontrivial mobile app

Write an embedded app

Write a nontrivial desktop app

Enhance your understanding of the building blocks that we use as developers:

Wrap an existing library to provide a better (more pleasant) user experience

Write a testing framework

Write an application or framework that provides a plugin model

Write a networking client (e.g., HTTP, FTP)

Write a programming language

I wrote a Lisp interpreter in Java for UNC Chapel Hill’s Comp 524 (Programming Language Concepts). Previously, I wrote a compiler for a subset of Java (also in Java) for Comp 520 (Compilers).

I have grander plans, though.

Write a device driver

Write a B-tree database

Enlighten yourself with koans, katas, and the wisdom of ages:

Read SICP and complete all the exercises

Attend a code retreat

Complete the programming koans for a language that you want to learn

Complete five code katas

Program in the open:

Perform a Refactotum of an open source project

Publish an open source project

Where do I start? I’ll leave my projects for reference, and call loner one of my earliest “good” ones. Loner deals with the LL(1) computation on contex-free grammars.

Have a patch accepted

While my contributions to Roslyn probably count here too (they were a patch), I figured I would highlight another small contribution that resulted in a new feature: I added a new prompt placeholder to gitsh.

Contribute to an open source project

There it is, my first “real” open-source contribution. I had been lurking in the Roslyn team’s commits and issues for a while—at the time, I was very interested in the new C# compiler—and I discovered and fixed an issue with the use of shell variables. Veterans will likely recognize the quoting issue being resolved.

Earn commit rights on a significant open-source project

I became a maintainer of dracula/vim, which I consider to be a significant open-source project. That doesn’t mean there won’t be others though :).

Learn by teaching others:

Present at a local user group

I presented becoming a git wizard to the Pearl Hacks 2020 Hackathon. It was my attempt to bring git to a beginner-friendly environment and explore the core concepts (immutable trees of information, collaboration, etc.) in a practical way.

Publish a tutorial

Publish a constructive code review of an open source project

Present a lightning talk

Deliver a training course

Present at a conference

Write a programming book