React, Angular, Django, or Ruby on rails. Frameworks for application or web development are everywhere. You can find hundreds if not thousands of guides on how to make web apps or web pages with these frameworks or many other popular ones. An incredible abundance of frameworks also exist for mobile development or building an API. Frameworks provide reliable tools that can let you develop applications in a lot less time. They take out a lot of the complexity. In terms of education, they are not a replacement for learning how to code from scratch. Not in the least bit.
The role of a software engineer or developer, carries many responsibilities. Software itself cannot be manufactured, it must be created. A developer needs to understand application architecture, customer use cases, quality assurance, and performance. Learning a framework only gives you insight into the first one. This doesn’t mean people who study and learn just frameworks can’t or don’t understand the ladder three. This just means that frameworks abstract or hide critical business criteria for software development.
Customer use cases
The way a customer uses and interacts with software can be vastly different from how an engineer uses software. Different customers can have unique requirements or expectations on how software should run or perform. To fulfill those expectations, two skills are required. The first is communication. A developer needs to be able to understand the inner workings of an architecture to properly explain to a customer or other stakeholders how the software either currently does or doesn’t meet those expectations.
For example, say that there is a customer that needs to set a lower maximum length of a login session on a web application due to compliance requirements they must fulfill. In order to satisfy the customer, a developer would need to be able to understand what in the architecture controls and extends or terminates login sessions, such as application based http cookies, or load balancer cookies. Then, a developer would need to understand what effect changing the length of the user session would have on the overall application. This leads into the second skill a developer needs to satisfy customer expectations, analysis.
A vital skill is not being able to create an application from a framework, but to understand and analyze how every component of an application interacts with one another, and what their roles are. The guides and lessons for a framework usually describe common or generalized use cases. They often do not go in depth about changing tiny parts or the design rationale. This makes it easy to replicate what’s taught in a guide, but not change or build on top of it. With customers requesting new features or capabilities for an application, understanding the underlying architecture and being able to analyze it is critical. Example: if your stack uses mongoDB, you should be able to analyze mongo queries and how they might change depending on the indexes used with a collection.
Quality and Assurance
Perhaps one of the most important aspects of commercial software development is quality assurance. It’s so important, that in specific cases such as airplane computer systems, it can be the difference between life and death. Quality assurance (QA) is the confidence a developer has that their code works as intended and does not malfunction, or even worse, crash. Web development frameworks, mostly do not even include QA tools or components in them. QA is usually implemented through third custom-built test libraries, third party libraries, or libraries built in to a programming language itself. Robust applications require a mix of unit, functional and regression tests to insure a high quality product. Additionally, there usually needs to be an automation infrastructure in place to run these tests periodically throughout development. Frameworks are almost entirely development focused, they do cannot give insight into the layout and structure of test automation needed to achieve superb, commercial grade quality.
PAAS (platform as a service) websites, for instance, have a wide range of state and situations that need to be tested. They aren’t just a running copy of a framework. They have complex behaviors and tasks that can be left without coverage in a test plan if the right knowledge of those inner workings isn’t present. Understanding and learning how to achieve quality is critical to being a great programmer, and something that has to be learned outside of a framework.
A fundamental part of programming is how efficiently software performs. Not all software can be considered performance-critical. However, nearly any production grade software in the modern era needs to be able to scale. Software or code that cannot scale will quickly cause problems with decently sized customer bases. A big issue with a lot of web development frameworks is they play down or abstract the concept of scalability away, leaving only API development and object relationship modeling left. This is not bad in and of itself. Having a way to quickly develop a backend server is great. But it’s even more important to understand the bottle necks and optimizations at hand when you are running it in a commercial setting.
Take request handling for an example. There are many factors that can influence how much a web server can scale to handle incoming requests. Part of that stems from how a server accepts a request and runs code to handle that request. Is it one python process or one thread per request ? If it’s a thread per request, how long is each request going to take to complete, and will it be longer than the switch interval of the interpreter? All of these are very relevant questions on how requests will be able to scale as customers are sending more load onto the server. Aside from handling, there’s also the question of the resources a request uses during handling, and how that may block or interfere with other requests. Such as, a database might have a collection or table wide lock for writes, meaning if one request writes to a database table, any other request must wait before reading or writing to that table as well.
Learning a web development framework, does not teach you how to think about performance. It’s not even meant to teach that. Being able to develop a production level web service requires a concrete understanding of scalability and how it will affect your application.
It’s important to remember that, this in no way is meant to discredit frameworks or the work that goes into writing them. They are a great benefit to a community of developers and provide a fun, fast way to write web applications. However, they aren’t, a substitute for learning to code. Writing or working on a production grade service requires a broader and deeper understanding of many moving parts. Supplementing your knowledge and skillset with systems programming as well as learning about quality assurance will make you a well rounded developer.