Managing professional communities during a pandemic

I recently represented the Philadelphia Google Developers’ Group, a group I have been helping manage for close to 9 years, at Technical.ly’s Super Meetup event, an event that brought together local technology and entrepreneur communities for an evening of social festivities. And while Zoom events don’t have the same vibe as the in-person events that the event has traditionally been, the Technical.ly crew did a good job bringing people together for an evening of community talks and nerd-trivia 🙂

As part of the event, they had the group leads talk about how the groups have fared during the pandemic. You can read all the responses here and I am pasting mine here as well

Image

The question gave me a little time to reflect on our setup, and generally we are doing the best we can of a really weird situation. I am really looking forward to a time when we’ll be able to meet face to face again but that doesn’t seem like its going to be anytime soon. But the virtual nature of all meetups has given us more opportunities to collaborate beyond our local neighborhood.

Probably the biggest change has been the activity on our Slack account which we had only recently moved to, as we moved away from the larger PhillyDev Slack community. That decision seems to have been the right one and I hope more folks from our Meetup.com page join us there.

The virtual events have allowed us some non-traditional events as well like Mike Zorn’s book club meeting every Monday evening where we are going through books on Kotlin and Android programming and some co-viewing events we are running in collaboration with the Google Cloud team that have been personally very educational as well.

I recently attended a virtual event hosted by Promptworks which was really interesting as well. I hadn’t realized till that event that Zoom offered breakout rooms which is great. I might try that for our next event. Anything to lower to speaker/attendance ratio which makes the conversations feel more intimate

Catering seems to be becoming a part of some events as well. The Google events we helped with had catered lunches through Grubhub which was great (who knew Grubhub had a corporate events group 🤷‍♂️) though the Promptworks team won that round with some amazing food and wine delivered to the attendees. It might be too expensive for monthly events but might be an option for special occasions

Video collaboration tools still feel poorly designed for a professional communities though. Most are designed around a talking-head + shared screen experience and aren’t nearly as collaborative or inclusive as in-person events. There is an opportunity for a product here, though it would have to be with a very different business model, since most communities don’t charge their users to attend their events and so can’t afford to pay for individual seats.

Maybe its something a company like LinkedIn could be interested in offering to professional communities?

Thoughts on Web Conferences

Yesterday I attended the L3 AI online conference on digital assistants organized by RASA. I am still working on the notes from that conference that I’ll share here at some point but I was really pleasantly surprised by the format of the conference. While the current pandemic has forced a lot of conferences to go online, most have just become Zoom calls and honestly are exhausting for more than an hour. I actually attended the conference for the whole day yesterday and it was the best online conference format I have seen so far.

The conference was powered by Accelevents, so good job folks, though I am sure they have competition in that space. I have also heard of good things for Run the World (actually, I haven’t. The only thing I have heard of them is on their investment with a16z 😁. But the features listed on their site look interesting).

So here are some thoughts on my experience with L3

Pre-Conference

Both Accelevents and Run the World allow users to create a profile ahead of time. This lets users reach out to others who may share the same interests during the event or when they are algorithmically paired (see below). RTW lets you create video profiles as well, which is cool

Socializing

Connecting to others is probably the most important part of a conference (most session videos end up online anyway). The Zoom experience is to just have as many videos of people as possible. That doesn’t really work since only one person can talk at the same time and a number of people are either multi-tasking or feel otherwise hesitant to share their video

The L3 conference page had a link to socialize which would randomly pair you with another attendee. I didn’t use it but mostly because there wasn’t much between sessions during the day. Instead of one-on-ones, I would have liked small groups that I could be joined with which would have felt a little less intense.

Prerecorded Scheduled Sessions

Most of the talks were just prerecorded sessions with the speaker and other attendees discussing the talks in a chat window next to the video player. The sessions unlocked at different times, so it did feel a bit like a conference track.

The advantage of the prerecordings was that

  1. You could pause and rewind the sessions right there if you missed something
  2. The video-audio quality of the sessions was good (none of the “can you hear me now” moments).
  3. Some presenters had even done some post-production work on their videos which was nice

The event page included a video page and a side panel that included tabs for chat, polls, attendees and questions. As with a lot of tabbed interfaces, the out-of-sight / out-of-mind thing happened and I never looked at the non-default (chat) tabs.

Unlike video, chat allows for many people to talk to each other at the same time which is better I think. So I was able to see some interesting discussions between the attendees on various topics.

Expo

An interesting aspect of the conference was a virtual expo tab where every company that was sharing their products could have people available for a Zoom video chat (yeah, they were using Zoom which I didn’t know could be embedded in a webpage). That was neat.

Final thoughts

I really got a lot out of this conference and enjoyed the format. With a lot of conversations going on right now on how virtual conferences could be more like real ones, I think we should also think about how they could be better than the real thing. For one thing, your audience can be a lot bigger, more diverse and inclusive.

There is also a lot of innovation going on right now in the chat experience in general (emojis, virtual gifts, etc) that could make text chat more lively as well.

There needs to be a new middle ground between video and text chats (maybe digital avatars?). I like looking at people’s faces but I also understand the multi-tasking thing when in front of a laptop. VR chat rooms get across a lot of feeling of presence by just using eyes for example.

I enjoyed the timed sessions, though I struggled to attend any of them totally in sync with their start times as there was a lot of stuff happening at home (work emails, etc).

I am really curious where the virtual conference ideas go from here. At the Philly GDG which I help run, we have transitioned our events to Zoom events and were planning to do the same thing for future “conferences” (like DevFest etc), but this has given me a lot to think about.

If you have other ideas about the opportunities here, drop in a comment below 🙂

Deploying Multiple Sites on Firebase Hosting

Today I deployed a second site to a Firebase project. I have deployed sites individually on different Firebase projects but hadn’t realized that a single project could support multiple sites. This is specially useful if the various sites use the same assets (think internationalized versions of sites etc)

The documentation on multi-site support is actually pretty good. In my case, my “launchpage” project was completely different from the other site on the project but it does give me the opportunity to bring the two together later. It basically came down to modifying the firebase.json file to look like this:

{
  "hosting": {
    "target":"launchpage",
    "public": "",
    "ignore": ["firebase.json",/.", "/node_modules/*"]
  }
}

This file tells the Firebase tools to ignore certain files and deploy others to hosting.

You can test your app locally by calling firebase serve and deploy to production by calling firebase deploy while in the project root.

The only hiccup I ran into is setting up DNS correctly. While Firebase tries to make it easy by giving you an IP address to point your domain to, Namecheap doesn’t work if you specify your domain name in the hosting panel and requires you to use @ to refer to the domain you are configuring. Subdomains similarly cannot be FQDNs and need to just be the name of the subdomain you are configuring (www instead of http://www.mysite.com for example)

Note that Firebase will occasionally request you to re-verify your domain. See the conditions why on this link or the screenshot below

Same rule applies for re-verification: Use the `@` key to add your custom TXT record needed to verify your domain

Considering how easy this was, this might be the way I host all my sites in the future 🙂

Flutter: Efficiently loading images between animations

I was recently playing with Flutter’s PaletteGenerator library. The library does what Android’s Palette API does: gives you a palette of colors based on a bitmap given.

The experience I was going for was to use the dominant color from an image to color the detail screen when the user tapped on it.

It’s fairly easy to use the library if you have a handle on the ImageProvider or the Image object.

getDominantColor(ui.Image img, Function(PaletteColor) onColor){
  if(img == null) return;
  PaletteGenerator.fromImage(img).then((PaletteGenerator g){
    onColor(g.dominantColor);
  });
}

Most of the examples I have seen for PaletteGenerator use an in-app image that the system can immediately load but using remote images is more complicated since the library has to wait for enough of the image to load to read the color data. This gets further complicated if you need to run an animation while loading the image.

After trying a number of iterations, the best approach seems to be using Flutter’s precacheImage method before kicking off the animation

await precacheImage(NetworkImage(b.image), context);

Also, consider using the CacheImage library to improve later performance if that screen is loaded multiple times

2019 Retrospective Post

🙃 Can’t believe 2019 is over. Fun was had, life was lived. So let’s talk about it

Tech

Most of my work in 2019 was split between conversational technologies (bots and such), Flutter, some Machine Learning and finally some Blockchain stuff. So here is a quick recap of the year:

🤖 Chatbots

I spent a lot of time this year evaluating various technologies in the context of virtual conversational assistants. I still remain very passionately a believer in the chatbots space and even with the fervor around that space dying out with the whole “Bots are the new apps” idea not really happening.

As with a lot of domains of technology right now (VR, Blockchains, etc), the dying out of the initial mania is allowing some really interesting work proceed and evolve the space without a harsh spotlight and investors expecting 10x returns in 2 years.

The problems in that space (IMHO) right now really come down to the facts that:

  • Writing bot dialogue is hard and manually authored conversation trees can’t scale
  • Tools for authoring and previewing bot dialogues are poor
  • AI-based systems that can hold a true dynamic conversation aren’t really there yet and
  • There is very little exploration of the user-experience beyond text and animated gifs.

I still really believe that we will need virtual agents as proxies for ourselves and services we interact with as the digital world becomes more complex. It’ll be interesting to see if this space evolves or becomes the next IVR system that no-one loves

Flutter

Speaking of user-experience, I played a lot with Flutter this year and have already written about it in a previous post. There are 3 reasons I like Flutter:

  • It’s a cross-platform tool that gives me a lot of control over the graphics (unlike, say, React-Native)
  • Dart is enjoyable to code in, having co-opted the best parts of JavaScript/TypeScript and then gone beyond it
  • It’s pushing a culture of advanced UI’s that are simple to build which I felt kinda suffered when Flash died

The fact that Google commissioned GSkinner.com to create some amazing UIs that they gave away the code for others to use in their apps just underscores the kind of experiences they wish people would create with it. Here’s hoping Flutter gets more adopted in 2020

Machine Learning

I finally got to work on some Machine Learning based projects this year which was interesting. While I wouldn’t call myself competent in that domain yet, I feel I could get there in 2020 (hopefully). I am also very interested in the emergence of higher-level tools that make working with ML even easier, like Uber’s Ludwig and tools like RunwayML.

One particular area of ML that I got into this year was Affective Computing. I am fascinated by the idea of empathetic systems (whether they use AI or not) and exploring the area of Affective Computing gave me a lot to think about. Some of that I even shared at a couple of conferences this year, including the PHLAI conference.

Blockchains

I wish I had done more with Blockchains this year, but my efforts in that space this year were mostly limited to managing the Comcast Blockchain Guild, attending the local Ethereum meetup and the Philly BlockchainTech meetup and trying to keep up with the torrent of news coming out of the dev community. My personal goal is to do a little more hands-on coding in that space again in 2020 🤞

Conferences

I attended a few conferences this year which were very different from one another

  • Google IO was really inspirational with a lot of ideas to come back with. It is amazing to see how much Google has embraced AI and the kinds of experiences AI has enabled. I actually kept the Android sessions I attended this year to a minimum as I was getting a lot more interested in other spaces like AI, Flutter and Firebase. I was also very pleasantly surprised by the Chrome experiences on display at IO. Its amazing to see how far the web platform has come.
  • My favorite tech conference of the year had to be EyeO Festival. The conference explores the space at the intersection of art and technology and had some truly inspiring sessions with amazing speakers. You can check out my Twitter thread of some of the sessions I attended but I’d strongly encourage you to check out as many of the sessions as you can from Eyeo 2019 on Vimeo
  • I spoke at PHLAI on Affective AI. Had a lot of imposter-syndrome going on given that I was speaking at an AI/ML conference with some very high profile speakers
  • I was at a panel on Smart Contracts at Coinvention 2019 moderated by the amazing Thomas Jay Rush (of Quickblocks.io)
  • Attended the Blockchain and Other Networks conference by TTI Vanguard which was really interesting, especially with a format where every attendee could interrupt the speaker at any time if they had a question. Someone later recognized me there as “oh yeah, you are the one with all the questions” 😜

Books

Read a bunch of books, half-read even more. Life is too short for bad books 😉 Here is the list of the books that I did complete:

Personal

On a more personal front, 2019 was definitely a great year. I finally got engaged and bought a place in the city (Fishtown, Philadelphia). So far, doing this whole adult thing has been pretty good 😁

Beyond Firebase Magic: Backups, Testing and Extensions

Firebase is pretty magic and for the most part delivers on the idea of an instant-on backend for your mobile or web-app. The problem with magic though is its hard to plan for if or when something does break. Take database backups for example. While traditional database backups are a known science, backing up Firebase’s storage (FireStore) setup is still a poorly documented / infrequently attempted effort.

I tried implementing that today and the official documentation only stressed me out. Thankfully, I found this article which got me most of the way there, though of course a few things had changed (api endpoints are now versioned v1 and the GoogleAuth library has a minor change on how it is initialized). Anyway, I am glad its finally done, but I wanted to share it here in case anyone else is looking for it.

While in Firebase, I also got a chance to play around with Firebase’s testing setup (my one cloud function in my project didn’t have a test so I implemented one). The local testing setup seems interesting but unfortunately I couldn’t get too far since FirebaseAuth isn’t supported yet, so for now my tests actually connect to a real Firebase account and run the test. Hopefully FirebaseAuth Triggers will be supported soon.

Finally I did try using Firebase Extensions for the first time and tied my Firebase Auth system to MailChimp. That worked flawlessly. I am really excited about the future of Firebase Extensions. Hopefully we’ll start seeing more functionality available as just a one-click addition to your project.

Suddenly, Flutter

I had no plans to learn Flutter in 2019

When I first heard of Flutter last year, I couldn’t help but draw parallels to Java Swing, the UI technology I started with in grad school (and thankfully dropped a year or so later). If you don’t know much about Java’s UI technologies, suffice to say that for all of Java’s strengths, no version of their UI framework was ever one of them.

It started okay-ish enough with Java’s AWT toolkit that let Java call native code to create system windows, buttons etc, but devs soon realized that building cross-platform applications (which was always Java’s pitch) was really hard when you could only target the least common denominator widgets that were available across all platforms. “No more” said the Java community, and proceeded to build Swing, a cross-platform UI framework that emulated the system controls by drawing them itself on a canvas.

Image result for write once debug everywhere java

Sound familiar? That was what Flutter promises with the core graphics engine that would emulate the native Android and iOS widgets

The problem is that Swing turned out to be crap. The widgets never felt native and performed poorly. You could always tell if you were using a Swing app. And it was always interesting when some app wasn’t coded right and you’d end up with apps emulating the Windows look-and-feel on a Mac (who checked on a Mac back in those days)

So Flutter was on my “no-thanks” list. Besides my lack of faith in faking native system widgets, the language they chose was Dart! Who knew Dart? More importantly, where were the interesting libraries in Dart? Having done a few React Native apps before, I liked my options with JavaScript and the dream of making cross-platform (mobile AND web) apps.

But then a couple of things happened. One: I saw some pretty compelling Flutter based apps. The interesting thing was, the best apps try to create their own design language anyway, so deviating from the system look-and-feel felt okay; and then second: I tried Flutter for a labweek project and was won over by the one click deploy to multiple platforms and the hot reload (it might also have been just fortuitous timing as I was losing my mind with React Native’s minimal support for custom views and animations, something that Flutter promises a lot more control over)

So for the last 4 months or so I have been working with Flutter and I have to say I really enjoy it. Some parts are definitely rough (I still don’t love the indentation hell when describing layouts) but Dart is enjoyable and is very inspired by the best parts of JavaScript and Swift (among others). Recent additions to Dart have been very interesting, because they address issues in real-world UI development. This feels different from the more generic “Lets create a general purpose language and allow it for UI dev” approach of other languages.

But the core reason I am excited about Flutter is the culture. The reason Swing was a dud (IMHO) was that it was built by people who didn’t care to push UI experiences. The native mobile toolkits are better but still make it hard to build complex user interfaces (SwiftUI and Jetpack Compose are trying to change that). Example “Hello World” apps you see using native toolkits are pretty generic form-based apps.

But look at the kinds of apps Flutter shows off:

Image result for flutter timeline app

🤩

While this may not be everyone’s cup of tea, this “think-outside-boxy-layouts” approach has my vote.

4 months in, I am still new-ish to Flutter but I guess I am on board. Stay tuned for more random Flutter stuff on this blog 🙂

Learning Curves

For the last few years I have been thinking quite a bit about how we enable more people to learn programming. As an industry, we need more programmers universally and there seems to be a huge number of people who would want to come in. Unfortunately though we can’t seem to connect the 2 sides of this equation effectively.

Specifically I have been thinking about learning curves. Until recently I believed learning curves to follow a close-to-linear relationship with time. You learn a little bit at the beginning and are work on simple ideas and learn more and more as time goes by.

This seems to be codified in most programming books too, which introduce simple ideas at the beginning and then move towards more complex ideas

However, lately I feel a more honest representation of this learning curve we expect a newcomer to master would look something like this.

The initial hump in that graph represents a mountain of complexity that junior programmers are immediately handed before they can do anything with code. A lot of times this hump represents meta-work: things that are not core to the technology but elements like build systems or frameworks for testability, coding standards, etc

Take JavaScript for example. A “Hello world” JavaScript experience requires you to either start coding the way the industry strongly dislikes, the old fashioned way with script tags and vanilla JS, or learn the complexity of modules, package managers, build systems etc.

Same goes for mobile app development. For example if you are looking to make your first Android app, a brand new Android project using the Android Studio wizard drops you into a mess of Gradle, Java, Kotlin and XML files.

Tools like XCode and Android Studio also are extremely complicated for any beginner to use, with a ton of panels and tools to tap on without knowing what they do. Ironically, most of the teams building these tools have User Experience professionals on them and yet the ideas of progressive disclosure and first run experience, that as an industry we keep touting for our end user apps, are never considered.

Technology Complexity Cycle

Reflecting on my own learning-programming experience and talking about this with a few other people, I realize that another thing that got me into programming was also working on a technology (Flash) that wasn’t as mature.

When I started playing with Flash, it was back in the Flash-4 days with a very simple programming model where most of the code was written in small scripts attached to the timeline that just controlled the position of the animation playhead. My learning-to-code experience happened almost in-sync with the addition of complexity to Flash. Towards the last part of my experience with Flash, it had gotten complex enough with ActionScript3 and the need to become a “real” programming platform that it started to lose people.

I feel this happens a lot. Early versions of a programming platform are simple and functional and then, if it gathers attention of the “serious” programmers, way too much complexity gets added. This complexity makes the technology a daunting beast to new entrants.

The point is …

I had a couple of thoughts for new programmers that became the primary motivation for this post:

  1. Survive the initial hump: Getting started with learning programming is a lot harder in the beginning so stick with it. It does get easier as you cross the initial hump of tools and meta-work that goes into starting a project and very rarely revisited once the project is in active development
  2. Play with emerging technologies: Emerging technologies don’t often have a lot of initial hump as tooling and other meta-work hasn’t been invented yet. Technologies like WebVR, Blockchains, Flutter etc are great candidates to play with now and grow your skills as the technology matures.

And for those of us who have been in this industry for a while and may have the power to influence tooling and/or methodologies of how code is written, lets endeavor to make these more welcoming to folks with different levels of experience with tech.

PhlAI talk: Building AI with Emotional Intelligence

Last week I gave a talk at the PhlAI conference on building systems with emotional intelligence, a subfield of Artificial Intelligence called Affective Computing. The presentation is embedded below and can be found on my SpeakerDeck page

I have been looking into this space for the last 4 months or so and it is a really fascinating space. I am a big believer in the need for assistive systems to mediate an increasingly complex world for us and that these assistants would need to be not only competent but also empathetic. However as with most new technologies, Affective Computing has a lot of potential for abuse as well if these technologies are used to emotionally manipulate or deceive people. It is definitely a path we must tread very carefully.

In general I really did enjoy the PHLAI conference and met some really interesting people and saw some very impressive technical talks and demos by IBM, Tableau , H2O, SaS and Ascend. Thank you to the organizers for putting on a great event. Definitely looking forward to the next one!

I made one of FullStack Academy’s “Developers to Follow” list

It’s always nice to be recognized. And since part of the purpose of this blog is to serve as a historical record of my professional life, figured I should post about it here before I lost the link to the sands of time 😉

https://www.fullstackacademy.com/blog/developers-that-work-in-media