My name is Jacob Cafiero and I have recently completed my Bachelor of Science in Computer Science at the University of California, Davis. I am passionate about design and the areas in which the line between software and art are blurred.
Over the course of my studies and before, I worked on and completed many personal projects which I am proud to show. Below is a collection of my favorites and some details about them.
My journey in software began on the arduino uno board when I was 14 years old. My original interest was actually in circuits and building things with various electrical components on breadboards, but I discovered the arduino could accomplish far more intricate tasks than I could by just building random circuits from scratch. My first program was making an LED light on the board blink on and off in one second intervals. From here I learned the basics of programming in C and experimented connecting various parts to the board and using libraries that enabled me to interact with them. I worked my way up to building a fully autonomous robot that could navigate obstacles using two distance sensors for detection and two servos for movement. After the arduino uno board I was hooked and had found my love for software.
I wanted to explore deeper into the world of software and it made sense I should try to understand how the software I used everyday actually worked, so I found iOS app development in Swift. My first ever app was tic-tac-toe and offered my first experience in setting up a user interface. This was around the time of the height of flappy-bird-like games and I had fun building the user interface for tic-tac-toe so I figured why not make a flappy-bird-like game of my own. I followed some tutorials online to learn how to build 2D games on iOS and after I felt confident in what I had learned, I set out to build a game of my own. The game featured an old western theme and a character for which I created pixel animations for running, ducking, and jumping. The objective of the game was to run side to side in the playable space and survive dodging arrows coming from both sides of the screen at randomized heights. For each arrow dodged, the player would increase their score by a point. The player was given an interface of four buttons for four actions: run right, run left, jump, duck.
After building a fully functional game on iOS my confidence began to build and I had had the most fun yet building games, so I thought: why not take game making to 3D? I then went on to learn about 3D asset creation in Blender and actually fooled around long enough in it to create some 3D renders purely for artistic purposes, but my original goal in Blender was to learn how to create 3D assets for 3D video games. I discovered I would need to use a game engine to build complex games so I chose the Unity Game Engine and started learning about building scripts in C#. My first game was 3D pong where you played against an AI opponent in a 3D square pipe. This got me familiar with user input, physics, and collision. My next game was a 3D reimagining of the game Asteroids featuring 3D assets and textures made in blender as well as some sound effects I found online. The user viewed a square playable area with a top down view and all the game objects still only moved only in 2 dimensions. The player operated a ship which could be rotated and thrusted forward as well as shoot a laser beam at incoming asteroids and enemies. The player was given four lifes and would lose a life for each contact with asteroids, enemies, or enemy projectiles.
While I had tons of fun building games, I was still curious about more areas within software and began to find that the web had the highest ability to reach the most users and could be used on virtually all platforms. Naturally, if you want to first understand and build web projects, you start out working with vanilla HTML, CSS, and Javascript. I enjoyed the visual process of laying out static sites with HTML and CSS but where I really had fun in web was making my websites dynamic with Javascript and experimenting with different ideas for interactive experiences. I soon discovered the HTML5 canvas which allows for rendering of arcs, rectangles, and lines, but with this, I was then drawn again to the idea of building games with this limited functionality. The first fully fledged game I built was Tetris and it required me to turn something with limited functionality into something that could be used to render blocks of various colors in different positions on the game board. The game has a simple interface of using left and right arrows to slide incoming shapes left and right on the board and up and down arrows to rotate pieces in either direction. After this game I decided to undertake building something more original so I was looking at old arcade games for inspiration and was intrigued by a game called Lunar Lander where a player must safely land a ship on the moon using rotation and thrust. Extending on this idea I built it up into an endless runner style game with AI enemies, procedurally generated terrain, and physics/collision among many other features. I titled the project Terrestrial Traveler as an alliterative name to pay homage to the game it took inspiration from.
After diverting back into game projects for a bit I still wanted to eventually build complex web apps and the technologies I found were ruby on rails and python with django. I didn’t know much about either so I decided to go with ruby on rails. I followed a tutorial and built a CRUD server side rendered app which used a relational SQLite database and taught me about the MVC design pattern. However, some time after this project I heard about front end frameworks like React and others. Again, not knowing too much about what these technologies did exactly, I just decided to pick one and hope for the best so I chose React. The work flow in React at first felt different from what I had experienced building projects in vanilla Javascript but overtime I got used to it and learned about the various concepts such as props, state, state management, routing, hooks, etc.. I also spent time studying Javascript topics on a deeper level reading about the prototype chain, promises, non blocking functions, and the event loop.
After working in React and being exposed to the RESTful way of building applications, I figured I should try to build a REST API and build a full stack project. This then required me to learn node.js and express as well as connecting a node project to a noSQL database like MongoDB. Once I gained basic abilities building backends in node with express, I decided a good fullstack project would be a simple messaging board as these applications are as old as the hills and use plenty of timeless concepts such as data relations and lots and lots of CRUD operations. I began building out the frontend of the project in React and once it came time to start implementing the REST API into the project I realized a technology like firebase would be better suited for a project of the scale I was building as opposed to a full node backend that would require additional hosting. Another advantage of firebase was easy implementation of real time data updates that don’t require a page refresh and gives the website an interactive feel. The final project features anonymous posting where each post is posted into a specified board and each post has likes and dislikes; comments and replies to comments; and reply threading. I called the project Social Sight and even built some logos for the project in Adobe Illustrator.
After building Social Sight I took some time to focus on my college course work, but was soon inspired to build something again when there was another wave of hype in the blockchain world. I had yet, at this time, to fully delve into this world and understand it, but I decided to take the time over one of my Winter breaks to study it. Mainly focusing on the bitcoin and ethereum blockchains, trying to gain a deeper understanding of fundamental concepts beyond the simplified explanations I had already heard. I ended up learning about Smart Contract development in Solidity for the Ethereum blockchain and after finding out about technologies such as web3.js which allow Javascript clients to interact with Ethereum blockchain Smart Contracts like a backend, I knew I had another project on my hands. The idea I had was for a GoFundMe-like crowdfunding website that uses Ethereum as the value store for funds and Smart Contracts as the logic that handles the creation and distribution of funds. In terms of the blockchain side of things, I wrote a Smart Contract which manages all the funds and also gives funds information such as a title, description, and the target amount to be raised. The frontend part of the project I built in React and I used web3.js to access this smart contract for reading and writing operations.
Fastforwarding to today, as a recent college graduate, I am looking to continue growing as a developer. What that looks like now is gaining professional experience in the industry as a Frontend or Full Stack developer. The journey has been a blast so far and I’m excited to see where else it takes me!
See My Full Story