Week 13 Reflections

Time really flies. It’s week 13 already and CS3216 will be over in a week or 2. During lecture, it was re-iterated that this course trains us more on soft-skills. To be honest, I did not join to be able to talk to people nor be able to lead a startup with great ideas. I have concluded over the past few years that even though my technical skills/breadth of knowledge of the technologies out there may be inferior to many fellow students in this course, my human aspect is even worse to the extent that it is beyond saving. I came in with the aim of improving technical skills(both front and back ends) and being better than everyone else but things had to go totally the other way round. Being constantly reminded by reality that the title of “God” is unattainable makes me feel like I have wasted so much time chasing after technical superiority. After going through this course and the final project, I am not sure which direction I want to head towards anymore.

Bad things aside, I think my biggest harvest from this course is being confident enough to implement basic(not guaranteed nice-looking) UI functionalities and also realising how fast-paced working like a startup can be when trying to churn out prototypes quickly for user testing and feedback. I certainly wished my experience in this course could have been much better and I pray hard A- is still attainable even after a few hard falls…

Week 12 Reflections

Yet another long overdue post.

This week was not very kind for me… First, somehow during presentation of our progress report, the app somehow came across to everyone as just a chat app instead of a tool to help with travel planning. Well, at least better now than later. Following this(which costed us too much of presentation marks), we have decided to focus more on the timeline view of the itinerary items for a trip. The current version of the itinerary viewer is still far from ideal in my opinion(can’t be helped, not much time left). What I had in mind(yet to share with the group) was to be able to drag and drop items on the timeline as some form of “shopping cart” before checking out everything in the timeline under 1 payment. This seemed daunting as none of us have experience in doing something like this and thus will take a long time to perfect it.

This module has put me under too much of a stress as I now struggle to find time to catch up/start on projects for other modules or even to find time to start revision for upcoming tests(week 13). I really look forward to the end of all these. Things have turned out totally against what I wanted in the beginning.


Week 11 Reflections

The week started with talk by Carousell. The biggest takeaway for me was the idea of technical debt. It was a big reminder for me to not blindly hack my way through for the final project and in future projects, but to be aware of the cons of the hackish solutions used, which someone has to fix it up in the future. A small instance of such happened this week when I thought of how the back button logic I implemented some time back could turn out wrong because I took the easy way out by using “window.history.back()”, which causes the back button to bring the user out of the app if the user directly access the app via URL and not the app’s UI flow. Thankfully, it was not too hard to rework the logic from scratch.

Another such problem is binding data fetched asynchronously from server side to HTML where my angular directive has to compute derived attributes, which are to be binded to HTML, from the received data in the directive’s constructor. However, the data takes time to arrive and by the time this happens the execution flow already missed the timing. I could not find a proper way to resolve this as the simplest solution of using semaphore is just stupid for single-threaded Javascript. I found a hackish solution but it restricts whoever passing in asynchronously-fetched data to my directive to have to code in that 1 way in order for it to work properly. I guess this is ok if everyone follows this strictly. I guess this is an intentional technical debt?

Week 10 Reflections

This week’s talk was interesting for me as I am more keen on things related to Linux, server administration, deployment etc. This aspect of app development/production tends to be neglected by most app developers. Another neglected aspect, which I myself also commit, is not paying attention to security as I do not know what is the minimum must-have security features. Also, I feel that setting up even HTTPS is kind of a tedious process.

This week has been hectic, with many UI and decision changes being made. The worst was when we finally had to migrate our deployment from my AWS server(I dreaded the day when AWS begins charging me $$ when the 750 free hours depletes). The process of setting up SSH access keys already took away a few hours, only to realise that there were probably some invalid unprintable characters in the authorized keys file causing public key denied. Through these experiences, I learnt more about administering deployment of web application(at least the front end as I did not deploy the database). Well, at least the thing I enjoy more from all these is being the sysadmin of the team, tinkering with server configurations, automating deployment when Git server receives pushes etc.

On the topic of optimizing for performance, I faced the problem where concatenating minified versions of the many Bower components into a single file leads to a !MB big file. While it drastically decreases the number of HTTP requests, on a slow network, this JS file may fail to be received and will cause the whole app to malfunction. This seems to become an optimization problem involving tradeoff between download speed(due to smaller files) and latency due to number of HTTP requests sent and being waited on. Hopefully I can come up with a solution closer to STePS and production launch.

UI-wise, it was annoying to have to constantly change/improve the workflow of the same feature several times that there were not many new features added. On the other hand, I realised how convenient front end development became when there is a set of well-established CSS classes, each adding distinct CSS features to the UI component. Defining colors as variables in LESS saves so much pain of having to memorise those color codes, and also helps keep a consistent color scheme. With the aim of unified UI design, styling UI components can be as easy as looking up CSS files and choosing the right class to throw at the HTML element.

Week 9 Reflections

The week started off with Cheryl from Cyan Communications giving a talk on how to talk to people(iirc). As a founder/co-founder of a startup, it is indeed important to be prepared to make yourself contactable to others at all time through namecards etc. Attending networking events like conferences lets you know about the many fellow startups in the industry and hopefully some of them may present themselves as opportunities in the future. The most important takeaway is the one that is the hardest to walk the talk: talking to the people out there, asking people who are complete strangers to you to try out your product or for their opinions of your product or the market.

Honestly, it is near impossible for me to engage in a decently-long-live conversations even with acquantainces. The only things I ever talk about are code, server administration and Linux(not that I am that good at all these though). Seriously, no layman, not even many computing students, would even know, let alone care about these things. Anything else, I know next to nothing to even talk about them.

It’s not like I have never thought of doing startup. That was when I was still serving NS. Eventually I realised it is not as simplistic as it seemed to me initially. I was simply not prepared to pitch to investors for funding, approach people to get them onboard the app etc. The killer factor for me was: no creative idea that can distinguish itself from the rest of the market. I dropped my double-degree with business after 1 semester despite high CAP because I could not stand the thought of having to win in debates against people with the gift-of-the-tongue when it comes to class participation.

Back to final project progress, progress has been slow for me in the past week as I overcomplicated the front end requirements for Facebook login in that I try to handle ALL possible cases that cause login check logic to fail, as well as eliminate latency in fetching Facebook SDK(which is impossible) that caused the app to conclude that the user is not logged in when this is not the case. Eventually, I was convinced that the login session via Facebook should not be tied to the user’s Facebook session at all. This helped simplify my case a lot, though there are still a few minor problems with sessions that need to be fixed.

Some of the basic functionalities got wired up with the back end over the weekend, which I felt was good enough a progress, though I wonder how we fare compared to other teams in terms of progress.

Week 8 Reflections

The pace of the final project has started to pick up. The past week was mainly setting up the Ionic project and working on some parts of the HTML mockup.

Being new to Ionic and Gulp, a lot of time was spent figuring out the purpose of the directory structure and setting up automated tasks that run as the code files change. With regards to directory structure, it was created by the CLI tool like this for a reason, and I only realised it after searching online for answers to why none of the bower components are rendered when app is deployed as native mobile app. Turns out it is not just the result of best practices but also where does the CLI tool look into when packaging files into APK. Gulp and automated tasks are a contention for dispute. For a web app, I love to have the final version minified and compressed to reduce latency and bandwidth consumption, but setting up such tasks in the early phase makes me viewed as doing premature optimization and software engineering purists hate that. While I know that this should be left to be done when close to release(maybe before STePs), the harsh truth is that when the time comes, everyone will be so engrossed with adding in final touches to the project or fixing last minute bugs that no one actually bothers with it. Thankfully, someone came up with a non-minified task to help the rest of us debug better during development. This allowed me to run my minifier whenever I want to test the app on my mobile as it would not affect the rest of the team’s code since the changes are not committed.

Project-wise, while some of the pages were ok with the external party, there are many more that have yet to be done as some of the pages were not what they wanted and rework needs to be done when they send us the layout. I hope these would arrive soon as getting a fully working UI up and integrating with the back end takes considerable amount of time and I do not wish to sacrifice my other modules any more.

Week 7 Reflections

This week in short: mostly a breather from CS3216 after 2 gruelling assignments.

App idea was a massive headache for us until we managed to get an external party project. Being a team of only developers, with no creative person or someone with business sense, it is just so difficult to come up with an idea that will not get shot down badly by the teaching staff nor get a low score for any component. I came in with the objective of improving implementation skills, as well as problem-solving(tech and implementation problems) in context of real-world app development. It will be great if I can ignore the human aspects totally(yea I know the real-world is not like that, too cruel).

This week’s talk by GrabTaxi served well as a reminder for some of us who aspire to start a startup in the future. For the tech part of the talk, it has been a few days since the talk so I have forgotten almost all of it XP, but the 2 main takeaways I got from the talk regarding startups were: pick a problem that you really care about, and you need luck.

Well, both points are not applicable to me anyway. First, too apathetic that I don;t have any such problem to care about. Second, fate always play adversary for me. So the conclusion is that I cannot found any successful startup.

Moving on to final project, one of the tasks given by the external party was to do Open Graph meta data scraping. It seemed easy at the start until I realised security policies made it so difficult that I have yet to find a feasible solution(How did Facebook do that?). Implementing on front-end has the CORS problem as not all web servers support CORS. Implementing on server side results in a weird workflow: client sends AJAX to server, server sends asynchronous request to the given URL. So the question is: does the promise object returned to the client get updated when the server side receives data from the source? It’s just so hard to put these into words to enter in Google search so I decided to post it here, hoping it gets answered…