Designing Reports

Designing educational products with emotions

What is unique about designing for educators?

A new team member asked this question during her recent design on-boarding session at Panorama Education. This isn’t an easy question to answer. Just as there’s no perfect architecture for a building, it is difficult to define one single design that solves every problem for teachers and principals.

Read More
code

Support Engineer: Experiments & Learnings

Each year Panorama Education helps thousands of teachers, principals and school administrators across the country to gather feedback from their stakeholders in a several different ways. Our relatively small engineering team (we just hired our 10th engineer!) strives hard to make sure that it is not only a great experience for millions of students who take our surveys but also a delight for schools and districts to gather and analyze feedback. With ever-increasing engineering needs, teams in a growing startup like ours often have to balance product development with operational and support-related tasks. And one of the ways we address this at Panorama is by a weekly support engineer rotation process.

Read More

Generating PDFs From Webpages With A Large Number Of Graphs

When we generate survey reports for clients, along with online reports with interactive graphs we also generate PDFs that clients can print out and share. Converting our online reports-each of which sometimes has several hundred graphs spread across multiple pages-to PDFs has been an interesting challenge.

Read More

What I’ve learned after half a year of working remote

Early last year my wife and I got the great news that she had been accepted for a research fellowship at the NIH in Bethesda, MD. Although very excited for the opportunity, that unfortunately meant that we had to move down there and leave Boston. At the time I had been working for Panorama for just a few months, but it was definitely enough time for me to get hooked with the company’s mission, its energy and above all my coworkers who I already called friends.

It has been over half a year now since I went remote, and with the new year I feel it’s time for a little retrospective.

Read More

Ruby Gem – ExternalFields

ExternalFields

We recently released a rails gem called ExternalFields (Github). As the name suggests, this gem allows you to create the illusion that an object has specific attributes when those attributes actually belong to an associated object. This is particularly useful for different classes within a single-table inheritance table to have access to separate fields in class-specific associations. In addition, this gem gives us more power than standard Ruby/Rails built-in delegation methods by automatically creating necessary objects and associating them.

Read More

How we added accessibility to our web app

We recently held our Fall Hackathon where all teams at Panorama take a 24-hour period to collaborate across the whole company to hack on great things. Many of our Hackathon projects are outside of our day-to-day work, would move Panorama’s efforts forward, or just solve that nagging problem that you just hadn’t gotten around to yet. For the four of us (1 engineer, 2 account managers, and 1 director) on Team A11y, we focused on the accessibility of our product.

Accessibility here refers to the design of products, devices, services, or environments for people with disabilities. Our products are used by students, families, and educators around the world, and we need to be able to serve every user as equally as we can. Fortunately, there are some initiatives in the tech world that provided us a lot of guidance and helped to shape our thoughts on how to approach this, in particular: the a11y project and W3C’s guidance on accessibility.

Read More

A Homemade Distributed Computing Project

One of the things that gets me really excited is making the world a better place. As an engineer, I’m often in the mindset of automating as much as possible. But can we automate making the world a better place?

Read More

Implementing priority lanes for jobs of the same type in Sidekiq

We use Sidekiq Pro to manage all background jobs in our Rails application. While Sidekiq has built-in support for prioritizing jobs of different types, the framework does not inherently support prioritization for jobs of the same type. So we built out that feature ourselves!

Our Sidekiq setup involves workers split into a few different worker types differentiated by memory availability and the concurrency with which jobs are processed. Initially, workers belonging to each worker type had a single designated queue they pulled jobs from. For example, consider two types of jobs, FancyJobA and FancyJobB that are both processed by the same type of worker type_a_worker.

Read More

Toward a Swankier Rails Console

As Rails developers, we spend a fair amount of time in the Rails console, which is itself just the native Interactive Ruby Shell (IRB). By default, it’s not particularly pretty…

$ rails c
irb(main):001:0> def hello
irb(main):002:1> puts “hello”
irb(main):003:1> end
=> :hello
irb(main):004:0> hello
hello
=> nil
irb(main):005:0>

…but it gets the job done. We were content with it, because we didn’t know things could be better.

Read More

A way to change a foreign key reference with zero downtime

In a project we recently completed, we had to refactor an object so that one of its foreign key associations referred to a new model. We use Ruby/Rails and deploy code to Heroku with Preboot enabled. Implementing this change safely without any downtime was surprisingly tricky to get right (in fact we didn’t at first, and ended up with a brief outage in a part of our product, although fortunately no data was lost). Pedro Belo’s post on hot compatibility lists some patterns to make basic data migrations zero-downtime deployment safe. As Belo mentions at the end of his post, hot compatibility needs to be addressed at the application level, and often takes a lot of planning and work. This article describes a reusable pattern to safely make a change to a foreign key reference with no downtime.

Read More
1 2