Before I dive in, I should note that this post was written as LexBlog hits its fifteenth birthday. It’s been my pleasure to work in the Seattle offices at LexBlog for over 6 years. So much of that pleasure stems from truly enjoying the people that work here and overcoming the challenges we face on a regular basis. Here’s to another fifteen for a great company of great people. 

There’s a line in Fight Club that I love that comes to mind when thinking about my favorite memories at LexBlog:

You met me at a very strange time in my life.

Narrator 

In many ways, I met LexBlog at a very strange time in its life. In many other ways, we met each other at the perfect moment.

Long before moving to Seattle, LexBlog was a fascinating part of my day-to-day. Alongside Colin O’Keefe, I had a view of the entire network of LexBlog publishers through LexMonitor and then LXBN; our two initial attempts at a network site that showcased the work of all legal publishers online. My view of the company was shaped by the authors that used its software, not by the people that worked there or the challenges they faced. 

When I moved to Seattle and joined the Account Management team that changed entirely. During my first two full-time years at the company, it became readily apparent that the technical infrastructure needed to change to continue our goals to change digital publishing for the legal industry. Fortunately, we worked with a group of people that were willing to make that a reality.  What I didn’t realize at the time were all the ups and downs that would accompany that decision. 

Starting in 2015, we embarked on a project to change the way we delivered our platform. Instead of a one-sized fits all approach based around unique themes and plugins, we established three tiers, each of which represented different site configurations and service levels and in doing so, created a technical stack that our team could manage. In the summer of 2015 we dove in, beginning with our core theme code-named Apple Fritter (our CTO Joshua Lynch has an odd fascination with donuts; what can you do). 

Apple Fritter would become the foundation on which we delivered much of our initial product offering. This offering has since grown to include a bevy of plugins and options that extend far beyond “just” a theme, but at that time, a theme was work enough to manage. That summer, without a doubt, represents the most fun I’ve had at LexBlog. 

I should add a caveat here that my definition of fun may be different than other people. We were charging into the unknown all while moving around people, processes, and technology. I spent more than one evening at my desk at some ungodly time of night struggling to figure out ticket comments or stretching my understanding of how to manage new parts of our software. We had moved from the initial heady rush you get from new ideas and opportunities firmly into the “trough of sorrow.” This period of time is when you realize that it’s not all fun and games – the market, technology, and your own systems are fighting you as you try to introduce a new product; a new way of looking at things. 

We didn’t overcome the trough of sorrow in a single day. It was an uphill battle that in many ways continues today. The dynamic nature of the internet means that the ground beneath your feet is constantly shifting and you either fall or find a way to stay standing. The first moment when I felt like we were on an upward trajectory, however, was on a late night bus ride home just before going on vacation in November of 2015. That night, Colin (yes, the same Colin) texted me to let me know that we had our first buyer of our new product offering. It was the first person willing to take a chance on LexBlog’s new way of doing business. While this may not have seemed like a radical idea to this client, to us it represented the first brick in a new foundation. 

Now, over three years later, that foundation has grown to include more than I thought possible. So much has changed that the company is barely recognizable on some levels, yet on others it hasn’t changed at all. I still see many of the same customer names that I saw as an editorial assistant working remotely in Montana, and it’s hard for me to express the right amount of gratitude to those firms for staying with us as we plotted a new path. I still see many of the same names in our internal tickets as well, although many new faces are here at LexBlog helping us move the ball forward. The chief challenge of the company is still the same: To bring the dream of publishing online to lawyers around the world. 

Overcoming the trough of sorrow is not an easy task and success is never guaranteed even when you climb out. However, if you can maintain focus and get lucky, I think you’ll find those moments represent the best times of your career; they certainly represent the best of mine.  

I rarely look at C while at the office. In many ways, it’s a language of a bygone era, especially when you’re talking about web application development. Sure, we take advantage of C every day, but write in it? Never. 

However, I’ve become fairly proficient in it these past two years and have grown to appreciate the language for what it is: Blazing fast and fine-tuned for several specific use-cases. Unlike JavaScript (my language of choice while at work), C does not come with dozens of associated frameworks that come and go on a moment’s notice. It also doesn’t split its time between the hard logic of an application and managing the user interface. In many ways, C runs the world of computers around us without us even knowing.

The story behind C is the most interesting part of the language. Written in the late 60’s and launched into production around 1972/1973, C was born from necessity. In the late 60’s, Dennis Ritchie and Ken Thompson decided to write an operating system for the PDP-11, Unix (pictured above – it’s the size of a huge refrigerator and it’s processing power isn’t even close to the power of my phone).

Most of the logic of the operating system was written in Assembly at first, but this proved to be fairly clunky. Assembly’s limited support for logical constructs made this a painstaking process that grew so difficult that Ritchie decided to write his own language, specifically for handling Unix, and so C came into existence. 

The language is so basic that its primitives don’t include strings, garbage collection is left up to the programmer, and objects are nowhere to be found. However, the language’s relationship to the Unix operating system means that it is nearly ubiquitous as Unix (or some variant) is found on nearly every web server, the majority of smartphones, and the computer that I’m using (a Macbook Pro) to write this post. Wherever Unix is found, C is right behind, managing all of the commands you type into a terminal, the boot process of your computer, and, well, most anything you do. 

Like the core functionality of Unix, which has a philosophy of limited design, C has not grown much beyond it’s humble beginnings. Features have been added incrementally, but much of my own work with the language is done in C99, a standard written nearly 20 years ago. One of my favorite bits of back and forth that I have with Scott Fennell, our lead developer at LexBlog, is his love of languages that are well-defined and static. The more a language changes, the harder it is for teams and individuals to manage. Imagine if English were changing at the same breakneck pace of JavaScript; we would barely be able to communicate from day to day.

As I’ve grown less enamored of just getting a project up and running and seen the value of maintainable systems and software, I must admit that I’ve come to Mr. Fennell’s side of the argument. Give me a language that doesn’t change but does the job just as well, if not better, than any of it’s counterparts. That’s not to say that I want to spend my days writing C, but it wouldn’t be the worst thing.

I have a great fondness for journalism. The industry, the people, the organizations — it’s all fascinating and vitally important. My political and philosophical leanings lead me to believe that the tradition of having an independent and empowered Fourth Estate is key to a functioning democracy.  Even in the absence of my politics and philosophies, reading the news is fun. I enjoy reading about the experiences of people I’ve never met going to places I’ve never been. How odd.

So to hear that the profession is dying, shrinking, or changing for the worse, and to listen to the narrative get increasingly louder is cause for some concern.

Continue Reading The Changing Winds of Journalism

I’m over halfway through Oregon State University’s post-bacc computer science program. It’s a (mildly) grueling gauntlet of 15 courses, made more grueling by the fact that I’ve been working full-time and taking two-courses a quarter (with an exception made for this past summer when only one course was on the docket to give me some time to get married 🙂 ). To-date, I’ve taken, or am currently taking, the following courses (in no particular order):

  • Introduction to Computer Science I
  • Introduction to Computer Science II
  • Discrete Structures in Computer Science
  • Data Structures 
  • Web Development 
  • Introduction to Databases
  • Computer Architecture & Assembly Language
  • Analysis of Algorithms
  • Operating Systems (currently in progress)
  • Software Engineering I (currently in progress)
Continue Reading Over Halfway Through Oregon State’s Post-Bacc Computer Science Program

Another week of reading, lectures, and confused Googling and skimming through videos is in the bag. This week was all about NP-complete. It has been fun to experience an “aha!” moment in each course I’ve taken so far, and this was an especially fun one. In large part, because seeking answers to these questions is seemingly beyond the reach of computers (in a reasonable time).

We’re accustomed to computers being incredibly fast. So accustomed that we forget just how fast they are. They’re really fast. I’m writing this on a 4-year old computer. It has a 2.5 GHz Intel Core i7 processor. That number equates to how many cycles the system clock of this computer runs in a second. So 2,500,000,000 cycles in one second. The version of the CPU  running on this machine is quite powerful. It should execute around 9 instructions per cycle for a single core in the processor and there are 4 total cores running.

This all adds up to a lot of numbers and those numbers represent commands that we expect the computer to execute for us so that we can….. I dunno….. watch videos of cute cats.

Continue Reading Understanding NP-complete.

I should note that I continue to remain positive about the direction of the Gutenberg project (the new WordPress editor, coming to you as of WordPress 5.0). My feelings on this are numerous and expansive, but the long and short of it is that I believe WordPress core needs a major shakeup to help the community (re)develop focus and draw in engaged and effective technical participants. Gutenberg represents a wonderful opportunity to do that as it brings a new paradigm to the core editor (and likely elsewhere as the foundational technology expands into other areas of site management) and has the potential to draw in a new wave of web developers.

That said, the introduction of Gutenberg into core has been an interesting thing to watch. From afar, the concerns of the Accessibility Team seem to clearly show the divisions between WordPress as an open source project (WordPress.org) and as a commercial one (WordPress.com):

Continue Reading Trials and Tribulations with Gutenberg

Having just finished my midterm in Analysis of Algorithms (yes, the class is as dry as it sounds), my brain is still sharp on a few topics; one of them being dynamic programming, which I mentioned in my last post. In that post, wherein I tried to find motivation for forcing myself to relearn calculus, I used the classic example of trying to calculate the nth term of the Fibonacci sequence.

I thought it would be helpful to see this example running with some real code. Below, we have a JavaScript function – fibRecursive – that takes an integer as a parameter. This integer represents the term that we want from the Fibonacci sequence. For example, a call to the function like so fibRecursive(6) would return 8. 

Continue Reading A Short Story About Dynamic Programming

This is a question that is plaguing me at the moment as I force myself to relearn calculus for Analysis of Algorithms at Oregon State University. In moments like this, where the concepts are abstract and I need to learn even more abstract concepts so I can understand the first class of abstract ideas, motivation is key.

Why does this matter? I’ve been working in the industry for over five years and never needed this knowledge before, why now?

Well, the short answer is that you don’t need this body of knowledge to develop a wide range of applications and features to applications. In my world, many of the concerns that common sorting, searching, and general optimization algorithms address are not real concerns because they’ve been abstracted to parts of the language or framework. I’m able to do my job because someone else has figured out how to do other parts of my job that normally would need to be created from scratch. So while learning merge sort and analyzing its complexity is a fun exercise, I’ll not be writing it from scratch anytime soon.

Continue Reading Why Study Algorithms?

Updating LexBlog.com’s aggregation engine was no small feat. Scott Fennell and I spent months testing all of the various components of our new aggregation engine that powers the vast majority of the site, but something that was hard to prepare for was the shear scale of the site. Now that it’s up an running, we’re learning a lot about how to manage a site like this, and what sorts of features are necessary for it to be a successful publication from the perspective of an editor or reader.

One thing that I’ve recently keyed in on is search. Normally, I would tell a client that on-site search is not important. Most visitors are coming to a site from a much better search engine (Google), and are more apt to click around the site once there. LexBlog has layered in some nice features to the standard WordPress search, but most of those are around making sure that readers can search by an author’s name when they’re on a blog or website. This seems like a thing WordPress should do by default, but the generic WordPress search is “dumb” in the sense that it only looks to the post content and post title when running a search. Authors are not in either, so some work had to be done to support searching an author’s name and getting their posts.

Continue Reading Investigating New Options for Search on LexBlog.com

This was one of the most eventful summers in my life both personally and professionally. In July, Garry (LexBlog’s COO) and I had a chance to go to Chicago and spend some time talking about LexBlog’s future product line and general opportunities for integrating with our platform. It’s not often that I get an opportunity to do face-to-face meetings of these sort, and it was nice to get back in the saddle. It was also my first time visiting Chicago, and Garry seemed more than happy to drag me around.

The Chicago Riverwalk where I forced Garry to walk – he was incredibly pleased to be outdoors, walking for hours.
The Chicago Gate – aka “The Bean” – which actually looks pretty cool close up.

Continue Reading A LexBlogger’s Summer in Review