CodeSmithery — my time at an advanced residency for software engineers focused on building compelling open source projects

Week -2 through week 0: The Precourses

Admission to CodeSmith isn’t easy. There’s a high bar for acceptance to the course and for good reason. You’ll want to be ready.

I wasn’t sure how ready I was, but it was time. The precourse work had finally begun.

Fortunately, being a bit of a gaming nerd, I’ve had some practical experience with html and css putting together gaming aid sites. That helped a lot with the pre-course work, which is designed to exercise those skills by building responsive sites using grid and flex techniques. I had a blast putting these sites together.

And as you might expect, they don’t leave out the JavaScript. There’s some ambitious JS mountains to scale. Some were a real struggle, but I learned so many cool tricks as I explored different approaches.

I met up with some of the guys from my new cohort on a Thursday afternoon. We sat with coffee and laptops, sharing approaches and tales of our victories and our trevails. These are good people, and I’ve got a good feeling about this…

Week 1: CodeSmithing begins — feeling: energized!

CodeSmith is not a boot camp. We learned that this week. And for the most part, I’d say that’s true. Both the goal and the approach here reach well beyond simply cramming our heads full of syntax and best practices. It reaches to the heart of what makes us not only better programmers, but better people to be around.

We listen a bit more patiently. We consider a bit more carefully. We communicate much more clearly. We commit to finding solutions with growing confidence. We don’t give up. We push through. That’s powerful stuff. This growth is hard won, but these skills are always in demand.

There are, however, ways in which this is like bootcamp. It’s been more than twenty-five years since I was a recruit running through those paces, but I remember well the brotherhood, the esprit de corps, the sense of striving together against incredible odds in order to benefit the whole. Cohort XII is just getting started, but those bonds are already taking root.

Week 2: Snake! — feeling: a bit dizzy, but loving it!

Okay, so we’re off to the races. The first week was focused largely on algorithms in JavaScript and CS fundamentals. This week we dove straight into putting these concepts into practice, while also learning some valuable new tools.

We’ve expanded into data structures and explored JavaScript’s adaptation of object oriented programming. We’ve started working with the asynchronous nature of the language and understanding the power of that (and the pitfalls to watch out for). We also got our introduction to React, a component-based framework used by Facebook to create dynamic web pages with JavaScript.

Pair programming is an adventure, and this week was exceptionally so for me. One of our projects this week included coding a ‘snake’ game, where a snake would grow larger each time it was navigated to munch on an apple that would randomly appear on the screen. Every apple it ate made it go faster, and if it ran into a wall or any part of its tail, the poor thing died.

I partnered with an excellent, sharp, and tenacious young developer who had a vision. This vision was based on setting a series of timeouts for each segment of the snake and counting on those timeouts firing in such a way that each segment would know where it needed to go next. Twenty years of development has taught me the dangers of relying on multiple timers. But, I had to admit that barring those dangers, his logic was sound.

In the interest of seeing what we could accomplished, I jumped on board with his plan. We painstakingly white-boarded and tested and white-boarded again. All the while, the clock ticked down. It was chaos. Timers fired and snake bits went every which way. But we kept at it. We persevered. We did not give up on the dream.

And it worked. It worked! It wasn’t pretty. It flashed and flickered as timers fired out of sync… but the snake bits all went the right way and snake grew as it ate the apple and the poor thing died when it face-planted into the wall. It was a victory for pair programming… and a vital lesson… to never rely on multiple timers.

Week 3: An unwelcome surprise — feeling: a lot of pain :(

I live a two hour drive (in rush hour) north of CodeSmith. So, every Sunday evening, I drive down and crash for the week at my friend’s place. This Sunday, as I was getting my kit together to drive south, I was arrested by the most excruciating pain I’ve ever experienced. Two words I had prayed I’d never have to hear: kidney stone. It apparently happens to 1 in 10 people in their forties. I’ll spare you the details, but it put me flat on my back, which was very, very uncomfortable. I missed two days at CodeSmith. Honestly, I couldn’t see how I could possibly focus through the pain I was experiencing.

My mates at CodeSmith reached out and offered support and sympathy. On the second day, I had a call with Will Sentance. He and the fellows and Dan, our fearless instructor, weren’t going to give up on me. They were willing to put in extra time to get me caught back up. I just needed to get back in the game. I’ve got a new baby girl on the way on March 20th. And so I did it. One foot before the other. It’s painful. It hurts. But it simply had to be done.

The two days I missed were focused on Angular. This is the framework provided by Google. A very different approach than Facebook’s React. My plan is to catch up on Angular during our week off at the end of February. For the moment, I needed to focus on the real meat of this week: Nodejs.

I was very excited to work with Nodejs, which brings the asynchronous power of JavaScript to the back end. This is where we build servers and APIs. This is where we interact with databases like Postgres and Mongo, two other technologies we focus on next week. We’re starting to realize what it means to be full stack developers. And that is worth fighting through the pain.

Also, nerf war.

Week 4: Sweet relief — feeling: OMG SO MUCH BETTER!

I’m lucky. Sometimes kidney stones take weeks and even months to pass. I got lucky. The pain, mercifully, has stopped. I’ve slept five nights now with no agony. Things like this really make you take stock and appreciate your health.

This was a good week to be back to my old self. We focused on database technologies that I’ve had a lot of experience with and new db tech with NoSQL that I’ve been curious about. From databases we moved on to more work with Nodejs, handling authentication on the back end. I’m starting to feel more comfortable working with server code, and Nodejs handles complex tasks gracefully and elegantly. Definitely my favorite unit thus far.

And then there was the testing unit. Testing is hard. It’s tedious. It has been my least favorite unit. But I see it’s value. I know how vital testing is. When you have a codebase with hundreds of thousands of lines of code in your system, you have to know that adding a few more won’t break something else. So yes, testing was hard and tedious, but I’m so glad we dove in. Now I won’t feel intimidated by it in the future.

We were treated to a panel of speakers this week. Among them were three young, super-sharp developers that took us through their impressive open-source project that works with JavaScript Observables. I only learned after their presentation that they were recent CodeSmith graduates. I remarked to one of my classmates, “There seems such a huge chasm between where we are now and where these people are coming from. But then, just think back to where we were four weeks ago, and how impressed we would have been to hear someone talking about doing the kinds of things we can do now.”

Week 5: Things are getting real — feeling: Exhaustexcited

Exhaustexcited. That’s one part exhausted, two parts excited. (Okay, so it’s not terribly clever, but it fits perfectly!) We rolled out of the first four curriculum-focused weeks and straight into projects. Things definitely got real this week. They’d given us the tools, now it was time to bring it all together and make something out of it all.

First up was our solo project. We were given free rein to come up with any project we felt we felt inclined to pursue. For my part, I resurrected a Voice over IP sales presentation project I had constructed in Excel for my old friend and former employer. I had always wanted to turn that into a functioning web app and this was my opportunity. I was excited to work with React, Nodejs, and Postgres.

Given time constraints, I didn’t quite get to server and database aspects of the project. But I did get very familiar with React’s design pattern. I am much closer to finishing this project and I’ve developed a deeper understanding and appreciation for React.

Then it got even better. Our first group project was up next. I was very pleased with my group. Good-natured and sharp, every one of them. There were four of us, so we went with quadStar (which we had to change to quadStarrr because quadStar was already taken on Github).

The ideation process foreshadowed the challenges of ideation cycles to come. This may be the most challenging part: defining what to do. Given the what and tools to do it, the how comes much easier. We opted for a help forum with an embedded, shared code editor. We had a stretch goal of including webRTC for video chat.

Our backend was Node with express serving a Postgres database. Jon took up the reins as our DBA. I worked on the server. Matthias and Brandon took on the challenge of integrating React router in with the front end. The first day went really well… and really late. I think I managed three hours of sleep before it was time to get back at it on day two.

Day two did not go so smoothly. Just when I was sure that the server was solid, stress testing revealed chinks in the armor. We were getting hung intermittently. Intermittent problems are the best… But we kept at it, Jon and I, while Brandon and Matthias worked through the intricacies of React router. In the end, we got it working. We were getting new registrations and logins and authentication was nearly in place and all we needed was just a little more sleep than we got the night before. Four hours this time. So that was accomplished.

Presentation was at 3:30. We had to get the rest of the routes working and try to make some headway with the shared workspace and webRTC. Since the server was up and running solid, I focused on the latter. The front end was coming together nicely, as was authentication. By 1:30, we had a barely working test implementation of voice only webRTC with one way audio. While it was cool to walk across campus and hear my teammates, it was clear that we weren’t going to get this integrated in time to present. We were running out of time and our project still needed styling. I don’t know that I’ve ever css’d so quickly… but, when 3:30 came, we had something to show. It wasn’t everything we had hoped to accomplish, but it was decent and we certainly did learn a lot. Our code is clean and the team that takes it over next week will be thankful for that.

So this week was a win on many fronts. We sharpened our technical acumen. We made great memories with our teammates. We struggled through and overcame challenges. We did everything but get a good night’s sleep. I’m looking forward to very late morning on Sunday.

Week 6: Almost halfway there! — feeling: Ready for a week off!

Iteration, they call it. This is where you inherit a codebase that isn’t your own and try to hammer it into something magical (or at the very least — useful). The groups were scrambled again and I fared well, Deep and Trung are both sharp and dedicated. Since the groups were formed from other groups and we had to work on a project from a group none of us had been part of, our options were limited in terms of what project we could take on. Fortunately for us, we inherited a fun one.

Omebe was a whiteboard sharing app using websockets and HTML5’s canvas designed by Shahrod, Bita, and Fred. Multiple users could log in and all scribble bits on the whiteboard. Our value add to this was to stand up a server and provide user accounts, board sharing, and persistent boards. It was a challenging pursuit, but we managed to pull it off.

Having spent many years inheriting code from others, I know the value of this exercise. Those experiences over the years taught me how vital it is to write discernable code. It taught me to comment profusely. This, I believe, is one of the most important things to do as a developer: make your code maintainable by the next guy. This week was a lot of fun, but I’m pleased to get a week off… even if most of it will be spent ideating. At least I’m going down the road with a good crew: Jon and Kyle are going to be great resources on our senior project.

Week 7: Seniorship! — feeling: Like I want another week off!

Ideation was… exhausting. I’m sure I’ll be thankful for the extra days of development time we earned by doing the ideation cycle on our week off, but man… that was a lot of work. But, the important thing is that we were greenlighted! Our nameless project will focus on enabling developers using the Vue front end to work with asynchronous state using RxJS observables. And what are RxJS observables? Think of them as arrays… in the fourth dimension! (That dimension being time.) It sounds like a cool thing to dive into and I’m looking forward to it.

First, we’ve got to get a lot more familiar with Vue — an up and coming framework, Vuex — the state store for that framework, and RxJS Observables — the aforementioned arrays in the fourth dimension. Good thing we’ve got some extra time. We’ve got a lot of material to wrap our heads around.

Week 8: MaxJoy — feeling: Like there’s not much room left in my head

So much Max. Which is great, because Max is great. We should know, we watched hours upon hours of his videos on Vue and Vuex. We love Max so much we’ve incorporated him into our group name: MaxJoy. The Joy bit was in honor of Joy from Kenya, a stellar technical blogger who helped us work out Webpack.

Vue is a great framework. But there was a lot to get our heads around for this. We’ve been digging into the RxJS Observables as well. It seems that well runs just as deep…

Week 9: MaxJoyBenJayRudi — feeling: Some days high… some days low…

We kept adding to our name as we found more gurus to show us the deep mysteries of Vue, state management, and Observables. We were getting research fatigue, so we finally sat down and started to code up our demo app. It was a very welcome change.

We resurrected my Instagram clone from the pre-course work and hammered that out using Vue and Vuex. There were a few pitfalls as we discovered the intricacies of working with the Vuex state store, but we managed to get it all working!

Then all we had to do was drop out that Vuex library and replace it with our own state management library. Simple, right? Well, not so simple. It did, however, finally have a name: OverVue. Clever, no?

It took a lot of trial and error, and then a bit more, but finally, finally, we had a working state store that incorporated an RxJS Observables loop to manage state updates. It took even more trial and error to get that store incorporated into Vue’s store interface. But we did it. We did it! Huzzah!

But… now what?

Week 10: OverVue — feeling: Like we’re nearly there, but why does it feel so far away?

We did it. Our own working state store. Just like Vuex, the state store that works with Vue. Minus some bells and whistles. But other than that… just like it. And that just wasn’t enough for us. Our store needed something that Vuex didn’t do. But Vuex seemed to do everything!

Until we tried refreshing a rendered page and we saw that the Vuex state store did not, in fact, persist on page refreshes or across Vue instances. That was it! Our state store, OverVue, would have persistence built right in. So down the rabbit hole we went, exploring solutions for persistence.

At the same time, the cogs started spinning to gear up for hiring day. We received new additional group assignments for ‘hiring groups’. We went over whiteboarding and interview prep. These sessions were invaluable in getting past the hurdles of the imminent job hunt.

Meanwhile, over the last nine months, my wife has been doing the hard and laudable work of making a new little person. And this week, on March 25th at 9:53 AM, Sophia Cosette Mozingo joined our little planet and began her very first turn around the Sun.

Week 11: Baby Brain — feeling: On top of the world!

This week was crunch time. We had to get things wrapped up, working, and ready to present to babies. I mean hiring partners. So, we got the baby — I mean persistence working and started fleshing out our presentation.

Oh, and resumes! This was one area where I thought twenty years of experience was going to make that a cakewalk. Fortunately, that’s another place where CodeSmith just doesn’t let you rest on your laurels. With expert advice, I tuned my resume into something far more effective than I’d come in with.

Also, baby.

And also, fellowship? I’d applied along with the rest of my cohort. I thought I may have a chance, but felt it unlikely. Every one of our cohort was qualified. Then on Thursday, Victoria called me in to let me know that they would like to have me join the team for the next three months. I was floored and very happy to accept. I’m super excited about working with the staff at CodeSmith and learning even more as I help mentor the next few cohorts!

Week 12: Crescendo — feeling: A lot of happy, a little sad

Hiring Day! We’d been preparing for this since week one. We all chiseled and polished and reconstructed and re-polished our presentations. Three minutes to relay the wondrousness of our projects to the hiring partners before the interview rounds. As we assembled for our final presentation rehearsal, I was feeling pretty confident with my bit.

Oh what a difference a moment makes. Somewhere just at the beginning of my lines I just lost the thread. I soldiered on, painfully, but managed to work my way through the tumble of words. With just over an hour remaining, in all my panic, I decided that I really needed to relax. We were waiting in the alumni room as the hiring partners arrived. (The alumni room is now known as the Reactide room, named after one of our cohorts’ projects that set the record among all Codesmith projects for total number of Github stars!) Amongst all the pacing and practicing seniors, there was a junior that was feeling under the weather and had passed out on a couch. I decided to channel a bit of that peace.

And then, it was time. Our group went second. As the first group finished up their presentation, I could feel the drumroll… rising…

As I walked out with Kyle and Jon, I scanned the assemblage… and I found Weylin, our fearless Lead Technical Mentor, nodding encouragement. That’s what I needed. Weylin was my spirit animal. We went through our whole presentation without a hitch. We managed to relay the breadth, benefits, and technical challenges of OverVue clearly and concisely. And with that, we joyfully exited, stage left.

The interview rounds that followed the presentation went very well. As a fellow, I didn’t take part in this session. My hiring day will come after my fellowship. But I was there to facilitate, network, and support my mates. By all accounts, everyone really enjoyed sitting down with the hiring partners. If two offers and several on-sites within the next day mean anything, the hiring partners enjoyed it as well.

The next couple of days were busy, but so much more relaxed. We cleaned up our Github and started the next cycle… getting resumes out into the world. We were also given the run-down of all the support that would be made available to us as CodeSmith alumni. This place, man, it’s truly amazing.

As I spent the last days with these marvelous, innovative, and adventurous souls, I felt a twinge of the bittersweet that comes from parting with close company. These last three months have been a crucible. And we have come through the fire more aware, more capable, and even more committed to leaving our mark on the world as we do our part to make it a better place to live. I will always be grateful to CodeSmith and to Cohort XII. I will treasure these bonds we’ve made for many years to come.