Modern Web Development
Having recently completed my front-end web development internship, I’ve learned a bit about how client-side node.js (npm) web applications are made. And if I had to summarize what I learned in one sentence it would be: Web Development is one big clusterfuck.
I didn’t know much coming in (I had taken some intro classes in high school and made some basic web pages using HTML, CSS, and JS). During the internship, I learned how to work with a few different front-end frameworks, primarily Backbone and React. Particularly with React, I liked how the code was organized in a component-tree structure, and you could define how each component would render as a function of state (which is simplified even more with redux keeping track of all app state in one place- but that’s for another post). I was initially very excited about working with this framework, but after finishing my first few tickets, it felt a bit redundant.
I soon got the feeling that web development (and maybe all development in general) was about mixing and matching external libraries that someone had already created. There was very little innovation in what I was doing. Need a modal? Use Bootbox. Need app state to persist through sessions? redux-persist has you covered. And with styling websites being the mess that it has been for a while now (although the rise of SASS and LESS has improved this a bit) and debates over whether or not CSS is dead due to inline-styling for each component, it feels much easier to use Bootstrap a la http://adventurega.me/bootstrap/ or something a little more advanced like Google’s Material UI for React. In the end, using all these technologies was cool at first, but it felt like I was absorbing a bunch of information that would soon be replaced by new libraries/frameworks, and I was more reading documentation and applying it rather than solving some kind of challenging problem.
Another nightmare for me was how difficult it is to setup a basic project. You have to have a module bundler like webpack so you can load in minimal static assets. You have to set up compilers to turn newer ES6 code into JS that all browsers are compatible with. From a development standpoint, you have to set up linting, which requires you to learn various rules to configure in your .eslintrc file (assuming you are using ESLint although I imagine similar configuration exists for other linters). Then, to test, you have to learn how to unit test, using a framework like Mocha, and then various asserting and mocking libraries, not to forget the daunting task of browser automation testing. To further automate the development process, setting up watchers for code changes and hot-reloading is popular as well. All of this is very important to building a robust project, but can take days if not weeks of reading documentation to fully configure and understand.
To be fair, I still do not know much web development outside of this node.js bubble that I learned this summer. I have heard that frameworks like Ruby on Rails make it easy to build a full-stack web application from scratch which is why it is so favored by startups. This would certainly make development easier and give me more time to focus on the actual idea that I am trying to implement.
Maybe this just means that I am looking at it all wrong. Perhaps, I should be just looking at web development as a medium to showcase my ideas rather than trying to find some kind of intellectual stimulation in the development itself. Or maybe web development just isn’t the field for me. Perhaps I just need to try a back-end internship or get more involved with the algorithms team to apply what I learn in university rather than just coding. Either way, I look forward to another enlightening year at Berkeley, and hopefully, I can find some answers.