Yoni Gutenmacher is a rising junior at the University of Pennsylvania, where he studies english and computer science. He was previously an intern at Very Good Ventures in New York City.
This past April, I was sitting in my dorm room, searching online for a summer internship. It would be my first experience in software engineering outside of the classroom so I wanted to choose carefully. In particular, I was looking to work in a small forward-thinking company that focuses on mobile software development. So, when I found the Very Good Ventures website and read about the company’s innovative and early use of Flutter, I was immediately interested. I reached out to David DeRemer, the company’s president, and came in for an interview about a week later.
When I came by for the interview, I met everyone on the team and then I sat down with three of the engineers. The interview was casual — we spoke about VGV’s work and my own experience. They were mostly interested in talking about my process of developing a Java application that I created for a course project. Although I had little experience in mobile development, they seemed to be satisfied with my eagerness to learn and my ability to do so quickly. After meeting with the team, I realized that VGV would be a place where I’d be given the resources to learn and the space to build my own projects in a stimulating environment. So, after receiving an offer, I immediately accepted it.
After the first few days, I began to develop a routine of spending approximately half of my day working on various tasks for the company and the other half learning to build a Flutter app from scratch. Below, I’ll discuss both of these components of my experience, beginning with the former.
Test Plan Conversion
To test the general functionality of mobile apps, developers have two options: manual testing and automated testing. Although automated testing is more efficient, it requires a good deal of software development to set up the tests. Specifically, Flutter provides the driver library, which enables the testing of Flutter applications to run on real devices and emulators. For now, VGV manually tests their apps by creating detailed step-by-step instructions for how to interact with an app for each test case. All of these test case instructions are included in each app’s test plan.
The first major assignment I undertook involved the conversion of an app’s test plan from a spreadsheet into markdown files. Before I arrived, test cases had already been written for one of VGV’s apps: the Hamilton app (available on iOS and Android devices). However, the test cases were saved on Google Sheets, making it difficult to efficiently track changes in the test plan, and also preventing them from being stored alongside their corresponding code in the app’s repository. Additionally, since the instructions in the test plan were often written in shorthand, they were missing some important details. Finally, the test plan was not updated to reflect the most recent updates to the app. As a result, certain features were simply not tested and some test cases corresponded to features that were no longer functioning in the app.
So, I set out to fix the test plan in several steps which occupied most of my first few weeks here.
First, I created a ‘test-plans’ folder in the app’s repository. In the folder, I added a markdown file for every feature that was tested in the app. Then, I used MacDown, an open source markdown editor for macOS, to rewrite all the original test cases on the spreadsheet into the new files. After copying all the test cases, I spent time with others on the team, going through several rounds of re-formatting, grammar corrections and spelling corrections. Finally, I updated the test plan to reflect updates in the app: some test cases were altered, some new test cases were added and some old test cases were removed entirely.
At the start of this internship, I was under the impression that I had developed a relatively strong mastery of programming. After two years of courses in school, I became proficient in the fundamentals. Here at VGV, I quickly realized that, although I was generally competent in software development, I lacked the practical skills required to code in a team environment. Most importantly, I was unfamiliar with Git, which sits at the core of the company’s team-oriented software engineering process.
Martin Rybak, VGV’s Engineering Director, sat down with me and gave me a crash course on Git, teaching me how to make pull requests, commit my changes and push to repos. As is typically the case, though, I mainly learned through experience: I’ve used Git to create the new test plan and to update it with improvements along the way. Using Github to interact with the other engineers here has also been instrumental in improving my skillset as a collaborative programmer.
In building my personal project, I had two main goals in mind. First, I simply wanted to learn Flutter. After all, one of my motivations in choosing to work at VGV was to dip my toes into mobile development with Flutter. Second, I wanted to experience the entire creative process of building an app from start to finish, from the initial design stage to ultimately publishing on the App Store.
With these goals in mind, I began by learning Flutter. After setting up my Flutter environment, I first read through some of the documentation on Dart to get a sense of the language. Coming from a Java background, I found Dart to be extremely accessible and simple to learn. For starters, Dart is object-oriented and has a framework that’s very similar to Java’s. Beyond that, some additional features — including Dart’s type inference and its unique constructors — make it an even easier to learn than Java.
Next, I spent some time going through several of Google’s Flutter codelabs online.
The codelabs were helpful in getting a feel for many of Flutter’s fundamental concepts including stateless widgets, stateful widgets, widget hierarchies and alignment. I especially liked the “Basic Flutter layout” codelab, which provides the fundamental skills for creating a widget hierarchy in flutter. I also found the “Firebase for Flutter” codelab to be an extremely helpful resource in using Firebase in flutter. That being said, I was often frustrated with the degree to which all of the codelabs “spoon-fed” the correct code solutions. At that point, I was ready to move on to creating my own project.
I decided to make a Flutter app that allowed users to play a digital version of Scrabble, a classic board game involving the creation of words on a board. I chose to make a Scrabble Flutter app because I’d already made a digital Scrabble application with Java. I was interested in seeing how programming the same game in two different languages would differ.
In the end, I found coding in Flutter to be a remarkably straightforward experience. Even after just a day, I felt like a had a strong grasp on the process of building, wrapping and layering widgets together to make a functional and beautiful UI. Of course, there were moments of frustration: I struggled for over a day trying to get the animation to function as I had envisioned, before ultimately compromising on my ideal design. Generally speaking, however, Flutter surprised me with its accessibility and ease.
After sitting down with the VGV team for a code review of my app, I learned about two Flutter features that greatly improved my Flutter knowledge and coding experience. First, they introduced me to the concept of navigation and routes. Previously, I was using an overlay to display the Scrabble “board” which appeared on the screen. After speaking with them, I decided to use a new route to transition to a new screen containing the board. Next, they told me about the Hero widget which can interpolate a widget’s size and position as it animates given a starting widget and an ending widget. Using a Hero widget, any change in the inner widget’s size or location is seamlessly and automatically animated. I then integrated the Hero widget into my app, to improve the animation of the “SCRABBLE” title in my app, as displayed below.
Over the remainder of my time here, I will jump right back into updating the testing processes of the Hamilton app. I’ve started researching Flutter Driver, which enables the testing of Flutter applications to run on real devices and emulators. In other words, Driver lets you totally automate testing of Flutter apps. Hopefully, I’ll be able to begin the transition of our integration tests from manual testers into a fully automated system.
For my personal project, I’ve decided to halt the development of the scrabble app for a few reasons. Firstly, I found that most of the software development would be limited to game logic, an area in which I already have experience. I was also interested in creating something entirely new to me and I’ve already implemented the Scrabble game in Java. Finally, I wanted to work towards the goal of eventually publishing a new and helpful app to both the iOS App store and Google Play store.
So, instead I will be working on a social literary app that allows writers and readers to engage with short stories. I’ve already started its development and I’m excited to have it published on app stores by the end of the summer.