Project0 Retrospective - 220103JavaFS/standup-amplifire-mamba GitHub Wiki

Bobby -

There's a lot that I learned on this project in hindsight. For starters, there were a lot of new programs that I had to learn to even get some basic functionality (things like DBeaver and Postman), not new languages, just programs that all have their own ins and outs. On new projects, I'd make sure that I'm a little more comfortable using new programs before diving in and trying to use them for my project immediately.

Onto the actual coding of the project. The biggest hurdle that I had during this project was in trying to debug things. After I'd included functionality that required logging in before doing anything for my project debugging become a pretty big hassle. By this I mean that I found it very tedious to have to shut down the Javalin app, make a tweak to my code, restart the app, log back in to postman and then send a request just in order to see if the change I made actually worked or not. I'm used to normally just rerunning code from the IDE and seeing immediate results, so all of these extra steps seemed to really slow me down. This is a great learning opportunity though, in the future I'm going to work on different debugging techniques that will help speed up the whole process.

On the topic of debugging, another thing the really slowed me down was the fact that Javalin and Jackson both print out lots of messages to the debug log by what seems like standard. I initially tried to print my own issues to the debug log and found that the info I needed was just getting swamped by other unrelated error messages. To combat this I turned of the debug level of Logback and printed out all of my own messages to the INFO level. This made clean up at the end of the project quite a hassle though, because this is also the level where I was tracking my user interactions with the app. Once my project was done and I was doing a final cleanup, I need to go into every one of my files and comment out the log.info() comments which I had used for debugging, which wouldn't happened if they were in the log.debug() layer. Again, there's a good learning opportunity in here.

The last thing I'll bring up that slowed me down a good deal was storing encrypted passwords in my database. It wasn't the actual act of encrypting that was the issue, the issue that I ran into (but didn't at first realize) was that my database isn't currently configured to store UTF-8 characters. My encrypting algorithm caused some passwords to have characters like ÿ or Æ which weren't actually able to be stored in the database. It took me a long time to realize what the issue was but the fix was easy enough (just restrict what characters can be used for a password). For the next project it'll help to know a little bit more about the character restrictions for the database.

Ivo - Before I saw the final demo on Friday, I was absolutely clueless on how to implement the project. Then I spent the Saturday reviewing the study materials and making sense of everything. Thus I had Sunday and Monday for actual work on the project, plus Tuesday and Wednesday after lectures. I spent the larger part of Sunday and Monday figuring out stupid problems (for instance importing Handler from the wrong library took me 3 hours to resolve). I did the bulk of my work on the night before project deadline. As a result I had no time to implement password encryption and storing in the database, account application and confirmation functionality as well as logging with logback dependency.

As this is my first project in object oriented programming I decided to create the simplest possible database so as to minimize complications and facilitate my learning of fundamentals. And of course doing all this within the specified deadline. As a result when i finished implementing all the basic functionalities in the early hours of Thursday, when I already had an idea how to implement the said missing functionalities, I decided to stop. On one hand there was little time remaining. On the other storing of passwords would require redisigning the database and rewriting some of the code. So I decided to have an incomplete working and tested application rather than a non-functioning one.

I am a bit sorry that I didn't have another weekend to work on the project. I would like to have had completed all the functionalities and thus to have experimented and learned more. I am afraid that going forward this ommission will hinder my performance.

Zach - I learned a lot of new technologies just to make this project work. I had previous experience with Java and SQL, but I never used DBeaver or Postman, or knew anything about three-layered architecture. I already feel much more comfortable with these new concepts, but I need to work a little more with them so I can confidently use them in future projects.

When it comes to the coding for the project, I really learned about the importance of Logging, especially when debugging the application. Using logger statements inside conditionals really simplified the debugging process. It was much easier to find logger messages than simple System.out.println() messages, and the logs persisted so I could refer to them.

The part of the project that I almost completely neglected was the Kanban board. I consider this to be my greatest mistake/regret. Even though the project was completed, in hindsight I realize that I was kind of all over the place, just jumping from one function to another without really thinking. Going forward in future projects, I’m going to utilize the Kanban board because I feel like it will help keep me organized and focused. This in turn will help simplify testing and debugging because I will be focused on just one function at a time.

Mahad - I would say that I had spent the entire first week of Project0 just trying to learn all the different pieces from Javalin, to Java, to PostgreSQL and many other pieces. After understanding these pieces, I then had to understand how they work together and how to create an entire back-end of an application with these pieces.

I had really struggled with this because I had always just learned different languages such as C# and SQL, but had never really put them together. In the past, I usually had a database already set up for me that was already connected to the application, or I already had an application set up for me and I had to just set up the Database the application was connected to. Hence, after Tim had gone through the demo of how these different pieces work together, I was able to get a better idea of the back-end process.

There were also different applications that I had never used before, such as the database constructor DBeaver, the Java application builder IDE IntelliJ, and also all of the different terminologies I had learned about things that run in the background that I had never known about, such as JDBC and Sub-Languages of SQL. Learning these different terminologies helped me better understand how different components work with one another, such as the DAO design pattern and how each layer plays a different part.

All in all, Project0 was definitely a learning experience and it allowed me to gain exposure to something I had never done before and that was constructing an entire back-end from scratch. Also, utilizing the GitHub repository was somewhat new to me and definitely took me some time to get used to, with the pulling, pushing and merging, but it definitely made updating my code much easier and I could see how it could be extremely beneficial when actually working with a team. Also, the Kanban board really helped me visualize and organize my process in building my project. I realize that I may need to actually work with a team to get used to the Kanban board since I had caught myself forgetting about it at times and just making diagrams and to-do lists on a separate sheet of paper everyday. I realized that I need to draw things by hand to be able to visualize the process, but I hope to work with Kanban boards some more when working with a team while being able to work in an Agile environment.

Ian - In project 0 I was trying to balance having a project that displayed all the fundamental learning goal while also being a stage where I could test skills and implement functionality that I've never had experience with before. I believe that I was able to grasp the fundamentals. I was able to build a database that met all of the expectations. I was able to use prepared statements in SQL to query, insert, and update into the database at will. I successfully implemented 3 layer architecture, that loosely coupled the layers of my program. The service layer acted to perform operations on input coming from the user and sent that information up to the DAO. The controller lay performed PUT, POST and GET functions that achieved all of the functionality required from the code.

I believe that my problems in my code came when I tried to implement a feature that assigned roles to users. I tried to store the user role in a cookie and retrieve it, but unfortunately the code was unable to retrieve the information from the cookie. I wasn't able to solve this problem before the due date of the assignment. But I do believe that it was a valuable learning experience to experiment with something I've never done before, even if it broke my code.

If I had more time fixing that bug and assigning roles would be the main thing that I would improve. I need to understand that a sessions, a cookie and an attribute are properly first, and particularly where the information is being stored in each, so I can understand what I am trying to get my code to do.

I also tried to set up a registration feature that added a new customer to the bank. I had a lot of difficulty with this because it would mean adding three packets of information from the same customer and adding them to three different tables all in one function, while making sure that these additions where maintaining the reference ID between each table. I decided to do the bulk of the work in the service layer, calling functions to add each piece of information one at a time, with corresponding functions to remove the entry if the further insertions were unsuccessful. It was really messy. I wish that I had instead used a BEGIN and END block in SQL to carry out this function. But it would mean creating a single large object with three objects within it that carried all of this information. An elegant solution that I didn't think of but was told by Tim was the solution he would have used.

I also learned the importance of logs. When testing my roles and cookies functions and I broke my code I hadn't done tests on the code before that to make that that it worked and that I was building from solid foundations. Knowing what your code is doing and where it's breaking brings a lot of comfort in knowing how solid the foundations of your code are before you start adding new features.