WestJet Internship Report

Preamble

During the initial planning stage of this report while considering the report format, it struck me that although I am a science student, specializing in computer science, currently working primarily on web maintenance, all of the media format report options were of the sort I would expect from students of the Arts - a poem, a song, a documentary video. One of the main benefits of web formatted documents is the interactive experience it provides to the reader. I was initially planning on writing a very bland boring report, until I realized that my report could be embedded in a simple yet dynamic and engaging web-page that would also demonstrate a few of the things I learned during my term. This then becomes a way of enriching the adventure you, dear reader, are about to embark on, while fulfilling the report requirements and all with the added benefit of simultaneously entertaining myself.

Background (Id Est: What Did I Do At WestJet During My Work Term?)

I feel like I spent most of my time learning I guess, but I was placed on the Marketing and Sales Ecommerce Team, primarily doing web maintenance on westjet.com. This entails understanding the html/css of the site, as well as tracking down bugs in the javascript using tools like the spring tool suite, while navigating my way through a content management system like cascade, and coordinating my efforts in a team environment.

A few of the things I've done are:

  • Modularizing the hotel widget so that it can be used anywhere on the site without breaking,
  • Fixing various UI discrepancies between browser versions,
  • Making page templates for both internal and external use,
  • Finding and implementing a cross-browser compatible, cross-domain frame communication mechanism,
  • Ensuring bi-lingual accessibility in all components,
  • Familiarizing myself with mobile best practices and making improvements to the mobile WestJet site

Things I Learned At University That Were Useful (Perhaps Some Things I Didn't Expect To Be Useful)

Documentation

Its drilled into you from the very first assignment, repeatedly. Probably because it seems like the least interesting part of coding resulting in it being the most oft-forgotten(ignored) aspect of the assignment. Its frequently worth marks - and I understand why. It makes reading code so much easier when you know what its intended function is. Admittedly in some of my earlier projects I was a bit less diligent in my documentation which makes coming back to it after a while pretty difficult sometimes, despite that fact that it is my own code. I've encountered a few situations during my work term where the documentation was fairly sparse - making some sections nearly impossible to decipher, being so unfamiliar with the territory as I was(am?).

Programming Languages: C,C++, Java,

I haven't used C, or C++, and only Java in a minimal sense during my work term, but knowledge of common coding practices and conventions, as well as an understanding of general coding principles like flow control are invaluable foundations that I had to draw upon while learning new languages like javascript.

Things I Learned At University That I Understand Better As A Result Of My Work Term

Agile Development

I took a software development course at Mount Royal University, where I got my first (and only) introduction to agile development. I did a single assignment, spread out over the semester. It seems like we spent most of the time on UML and only about a week or so on methodologies, but that's the aspect it seems I've ended up needing more.

Although I never realized its importance at the time, or what a difference it actually makes in the development of a project over time, I've had the chance during this work term to really get a feel for agile practices. We do a daily scrum meeting where we briefly mentioned what we accomplished the day before, what we plan to accomplish today, and any obstacles preventing us from meeting our objectives which the scrum master can help us with. Initially I found it difficult to find meaningful things to share, however that got easier over time. I needed to learn to set small daily goals, and work towards little (changing) milestones every month, rather than 1 massive goal with a deadline date so far out as to be meaningless.

Reflecting on previous projects I had done, I realized just recently that all the assignments I felt the most pleased with at the end had been developed with a more agile approach, than my traditional waterfall method. I'm not really certain how I changed my methods between year 2 and 3, because it doesn't seem to me like a direct result of the course I took, but I've been pleased with the results all the same.

Things I Learned During My Work Term That Couldn't Be Taught At University

Lingo

I've never come across so many acronyms and jargon in my life! This was particularly surprising to me, since I'm not new to reading technical books or articles, but to have so many new words/phrases/abbreviations/names - "holy cow!"

I wish I had kept a list because I couldn't do it justice here now. I've internalized a lot of it already, but at a high level it covers the range of airline specific codes, coding tools, coding practices, etc.

I had no basis for expecting this aspect to be so different from school. Sure, in school you learn lots of new words all the time, but not like this. I don't even think I can describe it in a way that makes sense so you might just need to trust me on this one if your experience hasn't been the same. Perhaps I've been sheltered and I just had professors who were really good at explaining things.

Being Punctual And Keeping A Consistent Schedule

I don't really know what can be said about this. It's pretty self-explanatory. Its obviously important, but not enforced at all at school. Could it be taught at university? Maybe, but would you want to? Since I'm the paying customer I actually prefer the flexibility to come and go as I please, unless I was taking a course called Punctuality 101". Then again, I feel I've managed to be successful without that class, so evidently it was something I managed to pick up here with no problem.

Unexpected Problems I Had

Setting Up My Development Environment

Boy did I not see this one coming. It took my entire first week just to get everything installed properly and projects checked out. I had never worked with Maven, Subversion, Spring Tools Suite, WebLogic, or Mac OSX before, and the learning curve was steep! There was an 8ish page installation document, but to me that makes the week long setup even that much more surprising. For a whole bunch of little reasons things just didn't ever quite line up. It often seemed like trying to lay down carpet but always having just a half inch too much, or too little. Despite what should have been easy and seamless integration was always thwarted by a slightly different version number, or one local directory that wasn't renamed properly. Sam and I tried to update the installation document with helpful notes as we went, but I'm not sure how much of a difference it'll make.

Things I Could Have Been Taught At University That Would Have Been Helpful

HTML/CSS/XML/Javascript/MySQL

All of these (with the exception of MySQL) I use on a daily basis, and yet are not a part of the Computer Science degree. It could easily be included as a part of the curriculum, and I'm not sure why it isn't. I've been lucky to have had exposure to some of these as a part of courses I took in Computer Information Systems, but do not receive credit for in Computer Science at the University of Calgary.

Things I Learned During My Work Term

Mac OSX

I had essentially never used a Mac before. The first few days were more jarring and unsettling than the shock of moving to the U.S. on my own when I was 19. Computers were my life and all of a sudden I couldn't do anything I was used to. The Mouse was an extension of my hand, and it was abruptly ripped away from me and returned with a crude imitation. No Buttons, no cracks to align my fingers with, touch-sensitive - what was this!? The file structure GUI was different, I couldn't find anything I was looking for. When I did find a file and wanted to move it - I couldn't, because there was no right-click drag move option. Moving things copies them - that doesn't seem intuitive. Highlighting something and hitting delete does.... nothing. Highlighting something and hitting enter does.... rename!?

I started searching for websites to teach me keyboard commands. (The Keyboard I have different issues with, but I'll leave that one alone). Little did I realize, that in replacing my previously comfortable Ctrl-C with Cmd-C, and such, I was unwittingly disrupting my home experience now. A windows machine at home - solace after the day's work started to be invaded with Alt-C and nothing was working like it used to - what had I done!

It's now been nearly 4 months and I still find myself mixing up commands occasionally, trying to do stuff at home on my windows machine that it just can't recognize. Normalcy is returning, but much slower than I thought it would.

"Measure Twice, Cut Once"

Doesn't apply only to construction!

Working in a team allows you to impact other people and projects in more ways than I realized before. Because the environments are so highly coupled, changes you make can have unintended consequences quite easily. Before I do anything, I need to remember to consider the impact of what I'm about to try, and then reconsider it.

The biggest mistake I've made so far was a result of exactly this. I accidentally introduced some buggy code into 3 different development servers, by placing that code into a file that was being used by the majority of the site. The rest was taken care of by other teams as they pushed their new files, which pulled in my new code without them (or me) even knowing. I didn't have the understanding I needed about everything that was depending on that file. Luckily I managed to track it down (with the help of many of my co-workers) and get all of the servers updated with the correction before it had any significant impact, but it sure was stressful.

XML

A very useful and handy tool to have stashed in your back pocket. I haven't used it extensively, but the syntax was simple to grasp, and I'm encountering it more all the time. I started this report in an XML format before deciding it would be better and I could practice more skills if I made it as a web page.

Javascript

I've had the chance to complete the W3 schools lessons on Javascript, and passed the initial test with 18/20. The javascript I come across on westjet.com is significantly more advanced than the W3 schools examples, but I'm slowly working through more and more of it, and feeling better about it all the time. I'm not sure at what point I'll actually feel 'comfortable' with it, but I knew exactly 0% javascript before this term. Previous coding experience has been both a help and a hindrance when it comes to learning Javascript, for example, it helps to understand how functions are called, but it hindered to not recognize things like function chaining, and binding events multiple times doesn't override, but adds instances.

Community Involvement and Quality of Life

WestJet Innovation Workshop

Once a month I've had the opportunity to participate in a WestJet supported workshop of Westjetters who get to showcase a skill or interest, and enrich the lives of their colleagues. In my brief time here so far, I've been introduced to the hobby of home beer and wine making, including guides on how to get started with expectations for procedures and start-up costs, I've seen 3D printers in action while getting to meet and listen to local experts (Kyle Hermenean and Stu Davies) discuss the present and future of 3D Printing.

WestJet Culture

There seems like there is always something going on to provide a bit of a break and get together with others. One of the most memorable for me is the recent Silver Dart Competition, BBQ, and Antique Aircraft Display. Not only was there free food provided by M&M Meats, but I got to form a team (Lusitania), and design, manufacture, and fly a balsa wood plane model in the competition. Alas, Lusitania won no awards - but there is always next year!

What External Opportunities Have Arisen For Me As A Result of My Internship At WestJet?

A number of people who have broadened my horizons as far as the calgary maker community, and my own hobby projects, by introducing me to Protospace, activities and maker culture around Calgary such as hardware meet-ups at Endeavour Arts, or Maker-Faire taking place in September of this year, and even just holding mini-lectures on new topics in networking or micro-controller program design. These are a few of the many things I've taken away that are augmenting my personal life that I didn't really have the opportunity for before.

New Cities Visited:

  • Montréal!
  • Ottawa!

Background (Id Est: What Did I Do At WestJet During This Semester?)

This semester felt like the focus was less on learning than the previous term in favour of putting into practice a lot of the skills I've picked up. I had the opportunity to work on a few larger projects that are still on-going, so they'll recieve a larger mention in my next installment.

A few of the things I've done are:

  • Fixing various UI discrepancies between browser versions (new ones),
  • Enhancing useability for screen-reader users in new components,
  • Implementing procedure-flow streamlining decisions to improve guest experience,
  • Presenting knowledge gained to help facilitate the understanding of others on aspects of project architecture new to them,
  • Coordinating with an internal/external team to maintain page-tracking success with new features

Things I Learned At University That I Understand Better As A Result Of My Work Term

Test Driven Development

This was briefly touched on during my first or second semester of Comp Sci, but otherwise ignored. It was introduced in a 'this is how you write a test' sort of fashion, rather than how to integrate the tests into the development. The Spring MVC Architecture pattern that we use includes testing as a basic part of the framework, really focusing on Test Driven Development (TDD). Build the tests first to meet your criteria - they should all fail. As you begin to implement functionality the tests will begin to succeed. When all the tests succeed you know you've built what was required.

Things I Learned During My Work Term That Couldn't Be Taught At University

Versioning on large projects with multiple developers

There was a slight learning curve to Subversion - having never used anything like it before - but it wasn't too bad. Its more handy than it was difficult to get the hang of. Different stages of the project are worked on independantly on different branches so as not to interfere with each other. Everything is versioned - every change on every branch is recorded for the history. If a change didn't work or a mistake was made, its simple to check the history and to roll back. Best of all, a single file of a large committed work can be rolled back without altering all of the other aspects of that commit surrounding it. Its an integral part of my development at this point and I can't imagine trying to work with this many other people, on a project this large, without something equivalent in place.

Unexpected Problems I Had

Unfamiliarity with SQL, Databases, Architecture Layers (Service, Dao, etc)

Again, thanks to the generous team-oriented values I've experienced in abundance here, there has been no shortage of advice and help from my co-workers.

I've now learned how to set up a database test environment, create a tablespace, a user, a permissions role, and a basic table. Shortly, I will have the opportunity to expand this into building a service, which will interface with this database through a dao layer. Exciting times!

Things I Learned During My Work Term

Adobe Omniture SiteCatalyst Page Tracking

Neat stuff. Not as easy to implement, or statistics as thorough as googlestats from what I understand, I had a good experience overall working with this. I find it very interesting to see the information that is gleaned from even basic tracking, like what browser someone is using, on what operating system, and what pages do they visit in what order. It allows us to more accurately influence the future design of the site to reflect the needs of the guests.

I found it challenging at times to work with an external team, because communication became even more critical to ensure everyone had the same expectations for functionality. Also, Since the Acceleration team would implement the functionality and it was up to us to integrate it with WestJet.com, it wasn't always immediately apparent if we had done our portion correctly, without knowing how it was supposed to be behaving. So far, I have no ideas on how to improve this aspect of the development however.

Spring MVC

Spring is the framework we use integrated with web-MVC to separate the representation of information from a users interaction with it, not unlike how we separate structure from content from style with HTML/CSS.

I had no concept of Spring MVC prior to my work term here at WestJet, but thanks to the help of my fellow developers, my understanding has been jump-started enough to not only to successfully get involved in the Guest Portal project site maintainence, but to give a presentation on the subject to others interested in learning more about MVC. Maybe I'll include the .ppt of this presentation if you'd like to see it, to give you an idea.

JSTL - JavaServer Pages Standard Tag Library

Stored in .tld files (in the case of your own custom tags), and decently documented on the tutorialspoint site, these tags are implemented just like HTML tags but allow you a lot of dynamic customisability to your site. WestJet uses these in conjunction with the Spring MVC framework to reduce code-duplication, and in the case of Guest Portal even for multiple languages - cutting the number of pages required to maintain in half!

These dynamic tags are evaluated server side prior to the page being returned to the client, providing a lot of flexibility for the developers, and resulting in very clean experience for the user.

Website Design and Javascript/CSS

As you can see, the site design has improved quite a bit since last time. I spent a bit of time focusing on principles of design, following along a bit on David Kadavy's fall 2013 design course, and improving my skill with javascript and css.

Improvements include: better navigation, softer contrasting elements, elegant transitions, and code refactoring for modularity.

Community Involvement and Quality of Life

WestJet Culture

On Oct 31st Westjet held its annual Fall Fair event, which invited friends and family of WestJetters to come and share their small business, hobby, or talent with everyone. It was great to be able to have the opportunity to learn more about the interests of my co-workers and meet new people. Both my mum and sister came to particpate and it gave me a chance to show them a bit more about what I do, and what its like to work here.

New Cities Visited:

  • Vancouver!

What Did I Do At WestJet During My Work Term?

A few of the things I've done are:

  • Various new functionality discrepancies and bug fixes,
  • Compiling a wiki for use as a mentoring/F.A.Q tool in preparation for a new set of interns,
  • Implementing new features conceived by the business/Creative Services,
  • Creating totally new pages ("Contact Us" page), including new MVC components (new controller, as well as repurposing it for soon to be released additional functionality), new services, interfacing with old services,
  • Replicating DAO's from one webapp to another, complete with minimum 90% code coverage testing.
  • Understanding lower level Spring Framework implementations, including properties files, and autowiring up new services,
  • Implementing Google ReCaptcha,
  • Adding client/server side form validation for improved performance and user experience,
  • Migrating Active Directory Service from Windows Server 2008 to a Windows Server 2012 environment,
  • Installing RemoteFx and provisioning VM's with resources in a Windows Server environment,
  • Investigating Google Analytics
  • /*Providing my 'Stack' effect as an open source library*/
  • Transitioning my website and report to an operating system agnostic platform, with the potential to expand its scope - providing the opportunity to run the Digital Horizon Experimental Development Lab

Things I Learned At University That Were Useful (Perhaps Some Things I Didn't Expect To Be Useful)

Geography x2

I should have realized this one before, as an airline employee, but I think geography has been very beneficial for obvious reasons. Although my primary skills are related to IT, as a member of the Ecommerce Team of a company that specializes in travel it has been useful to have a basic understanding of Cartography, and the People, Culture, and Places that we strive to enrich by bringing closer together.

Things I Learned At University That I Understand Better As A Result Of My Work Term

Reading code written by other people.

This was always something I felt I struggled with and this Quarter I had the opportunity to continue a dev effort of another developer, building off of what was already partially implemented. I surprised myself when I managed to parse what was happening and run with it, easier and quicker than I had done before. Its still something I think I find difficult with all the different variation from individuals, but I feel that its markedly less difficult that it used to be.

Unexpected Problems I Had

Scrum Prioritization Of Deadlines Over Requirements

Modifying requirements and keeping deadlines constant, instead of keeping requirements constant and modifying deadlines to fit was a new thing for me. While school deadlines were pretty constant, requirements never really changed, or were never scaled back at least.

As an agile development team, we're putting a lot of focus into ensuring our compliance to Scrum principles, and sacred deadlines is where it gets weird for me. My natural inclination is to ensure perfection as specified by the story requirements, rather than scale requirements to meet regular deadlines. It seems to me that I may be a bit more productive in my own projects if I took a similar approach, and made sure I had regular 'releases' of progress, as opposed to releasing absolutely complete features as they become finished.

I suppose it just struck me as counter-intuitive in a methodology thats all about being flexible.

Things I Learned During My Work Term

REST (Representational State Transfer)

A nice alternative to SOAP, although admittedly I don't have much experience with SOAP. I had the chance to add a RESTful DAO 'service' while working on the new Contact page so that we could interface with another web service. In a lot of ways, REST has been demystified this term. I realize now that it isn't a 'thing' so much as it is a style, or a set of architectural guidelines to abide by while designing components that communicate together.

I still take issue with the argument that requesting a resource using POST instead of GET is enough to debrand your "RESTful" service. If it complies with all the other principles, then this one thing really seems like quibbling over semantics. What should it be called instead of RESTful?

AJAX ( Asynchronous Javascript And XML)

AJAX is another one of those things I had heard of and thought was this massively complicated thing. At least from an implementation perspective it hasn't been very complicated at all for any of the things I've used it for. It should be obvious that asynchronicity can be a useful tool to improve performance and user experience, because it allows you to communicate with the server without interfering with a users interaction with a page. I have not found it necessary to use AJAX for anything on this page, but am certainly open to suggestions if you have any ideas to improve these pages.

JSON (Javascript Object Notation)

JSON has been thoroughly worthwhile to encounter as a nice way to represent objects for serialization. Not only is it easy to work with, but its more space efficient than other formats (such as XML, or YML), while being easier to write/parse, without (as far as I've encountered it) being less human-readable.

I'm looking forward to using JSON again to query ElasticSearch indices, in a future expansion of this site. (Stay Tuned!)

Starting new Spring Web MVC Projects and Web-hosting on Apache Tomcat

I had the opportunity this semester to start new projects from scratch and was surprised again by Spring that the abstraction sometimes makes it difficult to diagnose problems. Not only that, but I came to the realization that there is probably 6 different ways to do everything. This is built-in intentionally, so that developers can have the freedom to use the method that they find suits them best - however, it makes searching for solutions to your problems harder because if one method doesn't work you're still not sure if you've found the solution but are implementing it wrong or using the wrong method for you.

To give you a glimpse of one of the difficulties I encountered: When you start a new project, you're given an example controller and index.jsp. I kept these, but re-used the controller and moved the index (didn't delete it, just changed its absolute location) and made my own. Apparently, although this will compile and deploy just fine (because everything is configured properly, you just can't have 2 indices, even if one has no controller referencing it), Tomcat will throw back a 403 status code. There are lots of people with this same symptom, but since this can be caused by a few different things you have to weed through pages and pages of snippets of pom.xml's and web.xml's and others to ensure its configured correctly, but even then no two are the same. Just because your web.xml looks different doesn't mean its wrong, you may just be using one of six valid methods, and nobody is looking for a second index.jsp

As a result, I feel a lot more comfortable in my understanding of Spring and Tomcat, despite the learning curve being steeper than most things I've encountered.

Things I Intend To Become Familiar With In The Next Few Months

  • Transitioning this site into an extensible site based on the Spring Framework. ~UPDATE: Complete, with no service interruption~
  • Setting up an SVN repository, Build Machine, and Writing deployment scripts
  • Ruby
  • ElasticSearch
  • D3.js
  • VMware ESXI based clouds

Community Involvement And Quality Of Life

New Cities Visited

  • Marigot, Saint Martin!
  • Philipsburg, Sint Maarten!
  • Montreal (Revisited!)

What Did I Do At WestJet During My Work Term?

This work term has been very different from the others; Not only because I had the chance to visit Europe for the first time (an opportunity WestJet made possible for me), but because much of what I worked on can only be talked about in the general sense until it is released, and also because the tasks I completed were all pretty much ones I had done before - so most of what I feel I've really learnt this semester has come from outside of my position at WestJet.

I am, however, pleased that I was entrusted with projects important enough that I have been asked not to disclose the particulars until such time as they have been publicly announced.

A few of the things I've done are:

  • Undertook a mentoring capacity to help train a new intern on our team,
  • Completed prototyping and proof of concept tasks dreamed up by the business,
  • Started a new Spring MVC project, centered around Spring Security, and once configured, integrated it with an existing Spring MVC web-app,
  • Investigated the benefits of using Sass, determined what it would take to integrate with our existing Spring MVC web-app and wrote installing documentation,
  • Studied about ElasticSearch and wrote a set of tools to facilitate communication with the database (thats how I'm storing user accounts, as you'll read about during the security demo),
  • Configured a Jenkins Build Server to poll an SVN repository and do automatic builds,

Things I Learned During My Work Term

ElasticSearch

ElasticSearch is used for indexing data for fast searching. I find the case studies to be particularly interesting as examples of use usability and scalability. I remember reading once (can't find the reference at the moment) that StackExchange is one of the largest sites on the internet, and they use ElasticSearch to quickly search through millions of questions for more than 4 million users asking 400 million questions a month. If it works for them, then it should suit me just fine for a database of user accounts - haha.

I have plans to continue building on these tools for added functionality to future projects

Jenkins Build Boxes

Not nearly as complicated as I thought it would be. Its pretty ready to go right out of the box. All you really need to do is configure a new project to point to the repository location you want it to build, how often to check for changes, and any scripts you want it to run before/after the build. I should have done it ages ago!

My ultimate goal is to have one seamless process from development to deployment. Upon committing to version control, Jenkins picks it up for building, upon successful build (and unit testing) running the automated deployment script for pushing the new changes to my production environment.

Sass

These files are compiled into .css, so there is no interpretation at run-time. They are compiled during the build into the static files I already use so there will be no performance loss there, and its fully backwards compatible so I can gradually implement it without worrying over a sudden major overhaul. I found a good guide, wrote a script, and have adapted it into my environment.

Great, the down-side to implementation is minimal, but why would you want to do it?

Sass will help to keep your large files modular, manageable, and maintainable.

  • It has language extensions that allow the use of variables, nesting, and mixins (kind of like functions
  • Modular css blocks that can be 'called'
  • Completely CSS3 compatible
  • Requires no changes to existing code to begin implementation
  • Changes the way I do "@MediaQuery" for responsive css, making it easier to reference, code, and update

Examples:
~ Partials ("@import")
Sass allows you to make modular includeable scss files, so with some reorganization you could have a single css request for each page containing all the css components it requires. All pages need common.css, so you tell Sass to include that in every compiled file. It exists in only one place for maintainability, but it will appear on every page. If a page requires forms.css then you can include forms.css for that page, etc. All pages then have css requests down to a constant 1. The only thing better is to put it all in style tags in the page <head> tags, which becomes duplicated AND less manageable; not an acceptable alternative, or I'd already be doing it.

~ Extend/Inheritance
This allows you to write base css classes with common elements, and other specific css classes with the unique elements - the difference is that your pages no longer need long lists of classes attached to them on the HTML elements. The trade-off used to be either you duplicate code, or you have long lists of classes. Now you can have both.

~ Variables For brand consistency, this is huge!
Think about the hundreds of references you will have all over for some things like colors before too long. Colours of fonts, links, borders. You wouldn't have to worry about consistency anymore because you can set it in one place and reuse it all over. If the business wants to update the link colour because its 'too blue' or something it becomes a matter of simply updating the variable instantiation. It makes it easier to code the glyphs because you won't need to be constantly referencing strings like "\e20b" when you want an airplane or a palm-tree. Set a variable, use it everywhere. If the business decides they want a palm-tree that leans to the right instead of the left, updating is again just an update to the one variable.

~ Mix-ins These are similar to functions (at least, that's how I think of them).
They allow you to pre-code something you use regularly, and then just call them and drop in appropriate parameters. Take for example border-radius that you use on your buttons and other places with rounded corners. Rather than type out the same thing 4 different times with the same 8px for all the different vendor prefixes, you can write it once, then call your border-radius "function" with 8px as the parameter and have it fill in with the vendor prefixes for you. If a vendor prefix ever changes, you then again only need to make a change in one place, the 'function', and it will update all your references for us.

Disadvantages:
~ Still requires you to consider the effects of css on other elements, and which selectors you should be using(it's not magic...). Particularly with the ability to nest selectors, there is a danger of making your selectors "too specific" and undermining the cascading nature of css. I think this can be easily avoided, however.

~ Increased strain on Testers initially.
I think the initial integration can be done with a simple diff comparison between the output files and the ones you are currently using. Therefore, full integration can be done gradually as resources permit.

~ Increased Abstraction
Finding css that is applying to an element will not be *quite* as simple as dev tools telling you the line of the file anymore, but it will still be easier to find than anonymous javascript functions using your existing tools for searching so long as the structure of the .scss files is understood.

Spring Security

Page Elements exist in the DOM based on Security Roles

Please observe the ads below appear while in the unauthenticated state.

Please feel free to create any user account you wish. You can use this account to login and test out the different examples.

The main features I'd like to demonstrate are account creation, login and logout, anonymously accessible pages with secure content, secure pages, and secure actions (methods)

Account Creation

There are 2 account types you can create, USERs, and ADMINs. Both types get the added bonus of not seeing ads, but only ADMINs can see secure pages or delete the index of users, as you will get to try out below.

To Register a new account (be logged out), click "Login/Register" found in the navigation menu, then click the link in the bottom right of the login box to switch to the registration box. Any username and password is fine for demonstration purposes, but neither field can be blank.

Passwords get hashed and salted before storage in the database but its worth noting that I'm not currently using https anyways so they're still vulnerable to eavesdropping.

Login/Logout

I chose to pair this with Ajax so that I could have anonymously accessible content, that allows a user to login in place (ala Imgur; Reddit)

There is not currently any conditions on usernames or passwords, except that they cannot be blank. The mechanism for informing guests about errors is in place, however,s which you can see if you accidentally leave a field blank, or if you try a username that doesn't exist.

Anonymously Accessible Pages With Secure Content

Take this page for example. While anonymous, there are google ads displayed at the top of this section, but when logged in as any authorization level there are no ads displayed on this page. Its not just that the ads are hidden - you will notice that they do not exist in the DOM at all - because when the server built this page upon request it never added that section as that section is inversely restricted to only anonymous users.

You may also notice in the navigation bar that the login button became a logout button. I'm using this same mechanism to modify what content is displayed in that area in order to provide a better guest experience when logged in.

Secure Pages

Go To Secure Page

Some entire pages are restricted to certain account types.

I particularly like how if you are not logged in but try to access it, it will first redirect you to the login page. Upon successful login as an ADMIN, it automatically redirects you to where you were trying to go.

if you successfully login as a regular USER then you will be redirected to a page informing you that access has been denied to the resource you are requesting, while still logging you in for all other pages if your credentials were in fact valid ones.

Secure Actions (Methods)

Delete Index and Start Over

This method (while visible to all for demonstration purpose) is secured by annotations at the service layer. Give it a try with both a standard USER account, and again with an ADMIN account. I don't currently have it returning any sort of success or failure message, but if you try to login with accounts that used to exist for you, you can observe it has in fact deleted the index of users.

Site Improvements For The Future

  • HTTPS (I chose not to use HTTPS yet because I couldn't afford the certificate, so until then this whole integration remains a demo)
  • Custom Logout Mechanism
  • More Responsive Design
  • More Projects Added for Display (Games, Prime Library Search utilizing ElasticSearch, etc)
  • Minified css/javascript, and optimized images
  • Proper Resume and Contact Info
  • Email Support for registration confirmation

Things I Intend To Become Familiar With In The Next Few Months

  • More ElasticSearch
  • Ruby
  • D3.js
  • VMware ESXI based clouds
  • Multi-agent communication (university course)
  • Spam and Spyware (university course)
  • Network Security (university course)

Community Involvement And Quality Of Life

New Cities Visited

  • Paris, France!
  • Mantes-La-Jolie, France!
  • Ouistreham, France!
  • Caen, France!
  • Les Andalys, France!
  • Copenhagen, Denmark!
  • Elsinore (Helsingor), Denmark!
  • London, England!
  • Dublin, Ireland!
  • Ottawa (Revisited)!
  • Victoria!
  • Vancouver (Revisited)!

"And in case I don't see ya - Good Afternoon, Good Evening and Good Night!"

Coworker Comments:

“Andrew has been an extremely valuable member of our project team and has been pleasure to work with the past couple of months. He is approachable, enthusiastic and very detail oriented. Andrew is always the first to admit any mistakes made and has already come up with a solution or next steps before anyone has to ask. I hope to see Andrew working with WestJet for a very long time. He would be an asset to any company he joins.”
- Alex Downie | Content QA Specialist - Creative Services | WestJet

“As a Product Owner, it's often easy to lose sight of where the story goes once it's been loaded into a development sprint. When working with Andrew, I know exactly what the status is on my stories at all times. Through constant - but not excessive - communication, Andrew guides me through solutions to issues facing the enhancement while electing creative options which ultimately lead to a better product. Stories managed by Andrew go beyond meeting deadlines while solving the business needs. Often, because of Andrew's method, the business walks away with a better fundamental understanding of the product they own.”
- Sean R. McMullen | Digital Advisor, Westjet.com | WestJet

“This guy is ready for the apocalypse!”
- Jagdesh Sadho | Sr. Software Developer, WestJet.com − IT Marketing and Sales | WestJet

“Andrew is very approachable and enthusiastic about taking on new work. I can trust him to follow through on a task and he is willing to check in often if he has questions. This is very reassuring for me because I know that he won't let me down. I will always recommend him on new projects and hope that we can broaden his skillset during his work term with WestJet.”
- Amelia Wolff | Digital Advisor/Product Owner, Westjet.com | WestJet

“Andrew started his co-op term in May, 2013. He integrated with the team very smoothly and since the beginning he was very eager to learn about our systems. Andrew had to use a Mac for his daily work. If at the beginning this was a bit challenging, he managed to adapt fast and become a proficient Mac user.
I would like to mention Andrew's enthusiasm for troubleshooting and solving issues. He is very determined and persistent, and he delivers great solutions.
Andrew helped me investigate and fix .css and html issues. I was impressed with his willingness to share his knowledge with me. Andrew also has a great work ethic. He is respectful, always in time for work, and very reliable. His communication skills are very good. He is a good listener, and very clear when delivering a message.

It is a pleasure working with Andrew Radford! ”
- Laura Joerissen | Sr. Software Developer, WestJet.com − IT Marketing and Sales | WestJet

“Andrew is a very dedicated and hard working individual. When a task is assigned to him he will make sure to do all the analysis before starting his coding. He has great problem solving skills which really help the team to complete the task on time.”
- Eda Usuk | Sr. Quality Assurance Analyst, WestJet.com − WestJet

“Andrew is evolving to be a very productive member of our development team. He has been proving to us that he is driven to be successful in his chosen career by demonstrating initiatives and strong motivation to accomplish the tasks assigned to him. To be successful, I believe you have to be teachable (even though you already know a lot). Andrew is definitely one of those that you won’t get tired of sharing your knowledge with because you see him learn and grow. I hope he goes back to WestJet after graduation and will continue to be a valuable addition to our team.”
- Lea Lorenzo | Sr. Software Developer, Profile.WestJet.com − WestJet