When people ask what we do as Front End Engineers, the answer is often difficult to articulate without diluting the role itself. A typical answer could be "I build what you see on the web", or "I build user interfaces for the web".

Both of these answers are of course true, however for a long time, especially in the past few years, the role of a Front End Engineer has changed. No longer are we expected to solely build user interfaces with some minimal scripting, but rather we build actual applications in the browser. As a Software Engineer in this regard, it seems that historically (at least) being a Front End Engineer has not been interpreted to mean that one is a Software Engineer. This is understandable because quite frankly, not all Frond End Engineers are Software Engineers, because using HTML and CSS with JQuery is not Software Engineering, yet it is certainly front-end development.

There is certainly (at least in my opinion) a distinction between these two functions (Front-End Development and Front-End Engineering).

If you are building web applications for the internet and want to understand the science behind the web, then this book is for you. Interestingly most forms of Software Engineering have a formal science behind them which enables individuals employed in these roles to derive scientific knowledge about what they do on a day-to-day basis. However Front End Engineering is greatly lagging behind in this regard, as there are a lack of resources that teach the fundamentals of Computer Science in relation to Front End Engineering.

This book aims to solve this problem, firstly by defining a curriculum that tailors to the role of a Front End Engineer. Secondly by discussing these ideas in-depth with examples of practical, real-life scenarios in which this information can be put into practice. Furthermore, if you are a Front End professional but feel you lack the understanding of the underlying Computer Science of our profession, then I encourage you to continue. Let us begin.

The initial purpose of the web was to share academic journals between researchers in a remote fashion [1]. In other words, the web was built to enable information to be shared between people irrespective of their geographical location. Tim Berners-Lee developed a protocol to handle this use case, HTTP. Due to this, two remote computers could connect with each other via the underlying technologies which power HTTP, namely TCP and IP (through the pioneering work of Vint Cerf and Robert Khan). TCP (Transmission Control Protocol) handled the actual transmission of data between computers and IP (Internet Protocol) provided a distinct address which the data could be sent.

Subsequently the Internet has been used in a variety of contexts which differ starkly from its original use. Web applications are now built for Ecommerce, education, banking and a whole host of other such domains. As a result of this, we are here today, in 2017 in which web applications have become perhaps the most popular form of software, with cloud services, intelligent autonomous systems and even large scale geocomputational systems such as Google Maps being written for use in the browser. Of course, the server is still the force behind the most intensive computational tasks on the web and to note, cloud servers are even outsourced to undertake tasks on a pay-as-you-go basis by several large corporations. However the client-side, otherwise known as the 'Front-End' of web applications has dramatically increased in both complexity and relevance.

Interestingly, much of the worlds most successful businesses possess a large scale client-side application such as Facebook, Twitter, Gmail and YouTube. Notably two of these companies, Google and Facebook have contributed significantly to the developer community with technologies such as Angular and React, both of which are some of the most in demand and popular developer technologies as evidenced in the latest Stack Overflow Developer Survey results [2], indicating significant growth in this area. This is very important, so please continue reading at least until the end of this chapter,because the purpose of this book will now be discussed more in-depth.

Historically, web applications were built in a far less decoupled way than today, as evidenced in the use of Java Server Pages (JSP) and Perl which were used in conjuction with HTML to create interactive interfaces which returned markup from the server in the form of templates, based on user interaction. This lack of true decoupling, resulted in a less clear distinction between Front-End and Back-End developers, however due to the mass popularisation of JavaScript from the efforts Douglas Crockford and many others, JavaScript became the preferred language for true client-side application development (not having to ask the server to provide functionality, but rather, adding it straight the the browser using JavaScript) and the landscape of web applications changed.

This change was significant, because JavaScript was now being used to build sophisticated interactive web applications that communicated asynchronously with servers. Therefore client-side developers were no longer solely expected to build the visual elements of a web application, with some minimal scripting for animation and widget creation; rather we were expected to implement business logic in the browser itself. A small example would be, a shopping cart application which could now be programmed completely for use in the browser, including persistence of the users item data, loading items in the product display page dynamically and then sending these details to be processed on the server at the final stage of the users journey, saving the user and application time from having to constantly communicate with the server to undertake such functionality. This was truly game changing.

In today's client-side application era, there are even more complexities offloaded to the browser as single-page applications (which often resemble native desktop applications) do not need to communicate constantly with a server to load pages and are now commonplace. In short, client-side developers are now expected to be fully-fledged software engineers with a fundamental understanding of networking, Application Programming Interfaces (API's), algorithms, Object Oriented Software Development and much more in order to build such rich interfaces. As previously mentioned, some popular technologies used to achieve this are Angular, React and VueJS. The term 'Front-End Engineer' will perhaps be more descriptive of what client-side developers primary responsibilities will be in the present and future.

This book is therefore aimed at upskillng and informing developers about computer science that relates to the client-side, which although strongly linked to general Computer Science, is more relevant for Front-End Engineers.