The Semester in Review
Reflecting upon this semester, I can confidently say that I’ve learned more in this class than in most others. Five months ago, I had no experience in web development. Today, I can build a decent web application in just a few days.
We’ve come a long way since the first Internet Browser History project. Using HTML5 and CSS3, this project had us create a single, static webpage displaying the logo and a brief history of three common web browsers. The page was simple but the exercise was effective in illustrating just how easily web content could be created using these technologies.
As the semester progressed, this project evolved. The next iteration involved using Twitter Bootstrap, a collection of formatting tools. With Twitter Bootstrap, incorporating visually interesting components like wells, and image carousels required just a few lines of code. Twitter Bootstrap also supports responsive design, an increasingly critical utility in today’s web environment. With responsive design, the layout of a page is automatically adjusted to fit the size of the display it is being viewed on. This feature became an integral part of every subsequent project.
The last major piece of technology we studied was Play, a web application framework. With Play, we were able to call Java methods to serve dynamically generated content to users. We built several applications on this framework including a database of contacts and a database of surfers. Initially, these databases were stored as an in-memory repository which only lasted as long as the application was running. We later learned how to implement a persistent database backend in MySQL. For all of the advantages these technologies offer, there are some disadvantages. For example, the Play framework requires some programming in Scala which can be a challenge if you don’t have that background. Also, it is difficult to find documentation on Play and the text we used, Play for Java by Leroux, was still in draft form which made it difficult to read.
As with anything new, there is a learning curve and these technologies are no exception. The only way to learn it is to practice. Fortunately, there was a lot of practice to be had in this class in the form of WODS – high intensity, short duration exercises. With each new concept, there was surely a WOD to follow.
There were essentially two different kinds of WODs, at home WODs and in class WODs and while identical in format, emphasized two completely different, but equally important, aspects of software engineering. Homework WODs were often quite challenging and while timed, the emphasis was on learning the material and gaining technical fluency. Often times, the homework WODs were preceded with instructions to peruse the supplied resources. Solutions were also provided which helped to either confirm that our method of solving the problem was correct or lead us in the right direction if we were going astray. We were encouraged, and sometimes instructed, to repeat the WOD multiple times. With each attempt, we became more efficient and effective at using the technology.
By completing the homework WODs, we were preparing for the in class WODs. Although the tasks assigned as in class WODs were typically easier than those assigned as homework, the in class WODs were significantly more stressful because of the time constraints. Homework WODs were also timed but we were always able to repeat a WOD for a better time if we chose to do so. This was not the case with in class WODs; we had one shot to do well and that put a lot of pressure on us to perform.
Programming under pressure isn’t something that has ever been addressed in previous classes so at the beginning of this semester, these challenges always triggered feelings of worry and anxiety, regardless of how well I had prepared. And at first, it was difficult to not be flustered by the requirements or distracted by the timer. I also struggled with allocating enough time to test my programs after they were built. But as the semester progressed, I got better at being able to focus on the task at hand in these high stress situations. These in class WODs definitely helped me to become more comfortable and confident when programming under pressure.
Occasionally, WODs required students to work together in groups emphasizing yet another important aspect of software engineering and development – collaboration. Collaboration occurred in several different ways including face to face meetings, communication via email and via Google Hangouts. In my experience, on-line communication was the most convenient and efficient method of collaboration. For example, while working on the final Surferpedia project, my partner and I would email each other updates on our progress or other pertinent information we thought the other might want to know. Also, If we were stuck and wanted help debugging code, we would set up a time to meet on Google Hangouts where we would share a screen and debug/communicate together in real time.
There are some situations, however, where face to face collaboration could be better than online collaboration. During the planning phase of our Surferpedia project, my partner was unable to be physically present in class so we mapped the entire project out via Google Hangouts. While I feel that we did a good job of identifying and assigning tasks, I feel that the discussion was limited due to the fact that our conversation was via chat. I think being together in person, brain storming, and talking through ideas would have been a better approach but maybe I’m just old fashioned.
Once my partner and I decided on a set of issues and laid them out on a timeline, we needed a place to document it to ensure that we remained on task and on time. Github provides an excellent tool for this purpose. Each of our tasks became github issues. Each issue was assigned to either me or my partner and associated with a milestone. Milestones were closed once all of its associated issues had been resolved. Due dates were assigned to each milestone ensuring we kept to our timeline. It was helpful to see exactly what I was assigned to complete and encouraging as I got to check each issue off of my list. Although our issues changed slightly throughout the implementation of this project, githubs issues system easily accommodated these changes. This tool was instrumental in keeping us organized and on time.
Throughout the development of this application, my partner and I were careful to be mindful of Checkstyle warnings and errors; resolving any as soon as we could. This was done largely out of habit (neither of us liked seeing the little red x’s indicating errors) but by adding javadoc comments, avoiding magic numbers and adhering to standard coding conventions, we were ensuring the quality of our application. And while these things may seem minor, they can mean a world of difference to someone modifying our code later or to a future employer who may value thorough documentation and clean code.
Another tool we used to ensure quality in our application was JUnit and Fluentlenium. At first, our team experienced some difficulty when executing the tests but after that bug was fixed, testing became easy. Initially, I felt that writing tests into this application was overkill since it is small enough to test all functions manually. Later I realized that the best time to implement testing is at the beginning of the project or while the application is still small. The reason for this is because if a test were to fail, debugging a small app is easier than debugging a massive one. Also, if tests are implemented from the start, then they can be routinely executed as the program expands, exposing potential flaws and helping us to build a higher quality application.
This has been, without a doubt, a very productive semester. I’ve learned a lot about software engineering and about what it means to be a good software engineer. As a result, I’m now able to identify my weaknesses as a developer. For example, when collaborating I am sometimes uncomfortable with the fact that my success depends partly on the actions of someone else. I think that continuing to participate in group projects will help me to realize that my colleagues are, hopefully, just as committed to the groups success as I am. I’ve also realized that it is extremely important to be an active member of the computer science/technology community, which I am not. However, I’ve already taken the first steps to correct this by creating accounts with Linked In and Tech Hui.
Im confident that what I’ve learned this semester will be helpful for the rest of my academic and professional career.