My First Sinatra Application

I built my first web application! That other people can log into and use! Our project’s requirement was to build a web application using Sinatra as our Framework. I felt like a baby taking their first steps on their own. I was slow and wobbly, but with my earnest attitude I persisted.

My application is named My Book Collection. With My Book Collection you can view all of your books in one application. If you’re anything like me, you have books in different places. I have books in my living room, in my bedroom, and even at my friends’ houses. It can be tough to keep track of where all my books are, especially if I loaned them to a friend. You can view all of your books on a single page with My Book Collection and click on a book to review the book’s status (if it’s on loan, read, unread etc), as well as the book’s author and genre.

My Process:

Before I started coding, I wrote out user stories in my journal. How I expected the app to function, what I wanted the app to accomplish etc. This gave me a clear vision and limited the decision making I had to make while coding. Specifically, I only wanted users to interact with the app if they were logged in. Similarly, I knew I wanted users to have the capability to edit their own book collection.

Main Takeaways:

How to deploy an app on Heroku.

Heroku is a platform where users can deploy their web applications on the web so other people can use it. It took some time to successfully connect my GithHub account with Heroku. When I use a new platform I tend to take the process very slowly to ensure I’m not just mimicking steps but rather understand the process. I envision myself using Heroku for many projects in the future, so understanding how to upload a web application this time around is helped out my future self.

Taste of Ux/UI.

Although my main focus with this project was to understand the backend and how my objects interacted with each other, I had some moments of considering the user experience of my application which was new for me. When I am working on my labs, I’m not as focused on the Ux because my name isn’t tied to the project. However, My Book Collection is completely my own! For example, initially, I had a delete button too close to the edit button. I imagine users will want to edit their books often, it would be frustrating to delete a book when all you wanted to do was update its status! Therefore, I increased the white space between the edit and delete button.

ActiveRecord CRUD.

ActiveRecord comes with many helpful methods to call on objects in order to create, read, update, and destroy objects. This documentation here https://guides.rubyonrails.org/active_record_basics.html was a great reference. I ran the rubygem Tux so I could create and play around with objects in my terminal to test my application’s onjects to make sure they were interacting with one another correctly. Alternatively, I could have created seed data to have for my app, but I wanted to play around with ActiveRecord’s CRUD methods to get more comfortable with them since I was planning to include them in my code. The method that was the most fun to use was the .where method. Calling .where on an object is the SQL equivalent to saying:

Select * from table where column_name = 'condition'

This was helpful because I only wanted users only see their own books. I then added the .each method in order to iterate over each book so it could be listed separately on the user’s page.

<h1>Here are all of your books:</h1>
<%Book.where(user_id: current_user.id).each do |book|%> 
<ul>
  <li>Title: <a href="books/<%=book.id%>"><%=book.title%></a>
    <p>Author: <%=book.author%><br>
    Genre: <%=book.genre%></p>
  </li>
</ul>
<%end%>

Don’t be intimidated by errors.

The instructors at Flatiron try to reinforce the fact that most of the time code is going to be broken. For the most part, I’ve embraced this and this mentality helps when other things besides code aren’t working projects. For example, I ran into an error with Shotgun, which is a RubyGem that let’s you run your application on your local server and updates changes you make in your code in real time, so you don’t have to stop, code, save, and run the application.

The error caused my browser to look like this:

This was in my terminal:

Set SINATRA_ACTIVESUPPORT_WARNING=false in the environment to hide this warning.
objc[1464]: +[__NSPlaceholderDictionary initialize] may have been in progress in another thread when fork() was called.
objc[1464]: +[__NSPlaceholderDictionary initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.

Luckily, I googled my error and found that other people had the same issue and there was a Issue thread on Shotgun’s GitHub repository, link here: https://github.com/rtomayko/shotgun/issues/69. I ran through all of the suggested resolutions, and ultimately I had to update my Mac’s software to Mojave and then install macOs’ Xcode which added components to get Shotgun up and running. It probably took me 3 hours to resolve this issue, between the software updates, trying out different resolutions, and talking to my fellow cohorts to see if they had any ideas. However, this experience taught me that I’m not alone with the issues I experience. There are very generous people out there who have run into the same error and decided to write about it! Also, I was proud of myself for remaining level headed and persisting in order to solve my problem.

As always, I learned a TON about ActiveRecord and Sinatra by building my app. It reinforced my foundation which is important for our next section… Rails!

P.S. here’s a walkthrough of the app!

Why I Want to Be a Software Engineer

One of my roommates in college was a Comp Sci major. Since she spent all hours of the night working on labs, I assumed she had chosen the wrong major. I had no idea what she was doing.

Fast forward a few years later and I’m an analyst on the tech team of a cleantech company. I got to learn SQL on the job, and while it’s not exactly coding, I got my first taste into what it’s like to make a computer do what you say. I’ve always been curious about what is going on behind the scenes or underneath the hood, so when our tech team built new landing pages for marketing, sales agent management for sales, or our new products, I was interested in how they were doing this. At the same time, I was managing bugs that our member support team came across. I grew increasingly frustrated that I could help to define both the bugs and its scope, but I had to stop there and pass it off for the developers to fix.

I got my start by taking a HTML/ CSS class with a local non-profit. I knew I was on the right path. I followed up by taking classes on web accessibility, the command line, and intermediate HTML/ CSS. I was equal parts confused and excited. To me, not completely understanding something is exciting because it means I’m challenging myself to learn something outside my comfort zone.

My desire to learn how to code is fueled by my desire to break into a field which fosters an ever learning, flexible, and meaningful career.

Always Learning

In yoga it is said to always be a student, no matter how much experience you have. I like to take this concept in my every day life. I challenge myself to read books across vast topics, attend yoga workshops, learn new skills (stitching being the most recent!) so I can continue to make connections and recognize patterns about the world around me. Like I mentioned earlier, I take not knowing something as an opportunity for growth, and it seems as though there is no ceiling with programming.

Flexibility

As I’m getting older I realize I won’t always want to live in a city, where most startups and innovative companies tend to incubate. Becoming a developer will help to find remote work. I love the flexibility of not being bound to an office in order to get work done. I think employees should be trusted to get their work done, no matter where they are. Another aspect of flexility is the vast amount of roles a developer can fill. There are SO many different types of roles and industries I can break into. I can teach, be a part of a solid engineering team at an emerging startup, or freelance— it’s tough for me to see where I’ll land after completing my bootcamp because there are so many possibilities!

Meaningful Career

What was astounding to me when I first started to research my career transition was that every developer seemed beamingly proud of their job. As I began to learn how to code, I started to realize why. Software developers of all kinds are building our future. Developers can bring an idea to life. Personally, it’s powerful that I will be able to bring my idea of a yoga class plan generator or an app to teach Tarot to beginners to the world!

What also adds to a meaningful career is the community. I’ve received so much support from both strangers and new friends, whether it was through twitter and using the #100DaysofCode hashtag, or meeting people in real life at local tech MeetUps. I know I’m not in this alone.

I find my reasons to learn to code are evolving. I didn’t pursue this career shift because I thought “Hmm, I could certainly use a larger professional network,” or “Let me pick a field where I’ll continuously feel like a novice”, — these are byproducts. The reason why you start on a trek is never the reason why you finish it. I’m looking forward to watch my motivation to keep learning unravel as I go deeper and deeper into a programming career.

Growing Into a Dream

Chase your dreams. Dream big. If you can dream it you can do it. It’s all so exciting and inspiring, but like everything, this concept has both light and shadow.

In college my dream job was to work for a renewable energy company that had a fun company culture— preferably based in sunny southern California. At 21 years old I believed my career was limited to a 9-5 office job, and so if I had to go to work everyday, it might as well be in a welcoming and positive environment working towards a cause I was passionate about. After a series of trial and error, I finally landed my dream job as an analyst at an emerging clean tech company in Philadelphia, PA. My coworkers quickly became good friends, I had semiannual trips to our LA office (!), and I was even teaching yoga to my coworkers after working hours. I was living the dream I had curated and more.

After a year and a half in the role, I wasn’t feeling as aligned as I once had. My internal landscape became quite prickly. I began feeling ungrateful- “…but you had worked so hard and others have helped you so much to get to this point!”

I began reflecting and contemplating – is this what I want for my current self, at 25 years old? It was difficult to admit to myself that my desires have changed.

My desires now demand more flexibility. I dream of living near the beach, working my own hours, and having a schedule that has space to teach yoga. 

I began to gain interest in a career that would compliment the lifestyle I was seeking, programming. I got my start by taking classes with a local non-profit, Girl Develop It. Their beginner friendly classes not only taught me the basics, but left me feeling empowered to learn more on my own. I got into the routine of waking up early before work to teach myself how to code. I was determined. After 5 months, I realized that a coding bootcamp would catalyze my shift in careers, but that would come eventually, I thought — it doesn’t have to happen right now.

I’m not ready. I don’t know enough. Why leave my job now? There’s still space for growth and opportunity in my current role. I fed myself excuses. 

Ultimately, clinging onto an outdated dream was no match in comparison to my zeal to make the leap.

In a few weeks I’ll be starting my 5 month bootcamp to become a Software Engineer. I don’t know what will follow, but I do know I want to build a lifestyle that my soul desires. I don’t feel ready, but that’s the point.

I’m on the other side of all the confusion, resistance, and fear. Through it, I learned that I outgrew a previous self’s dream in order to grow into a dream that fits all the pieces of my current self. And if I’m lucky enough, this will not be the last time I go through this dream cycle.