Being a full stack developer means being proficient on the frontend as well as backend. Unfortunately none of those tutorials prepare you to work at the backend of a production service.
To say you can do backend code because you can write in JavaScript is like saying you can write a paper on cardiology because you know English. Knowing the language is a small part of the job. There is a lot of domain knowledge that is required in addition to the language.
Learn networking, learn operating systems, learn distributed systems, learn performance and scalability, learn about databases. Then learn node.
- Your bank would never represent a balance in that way. They store transactions individually and they fold them to compute your balance.
- The input validation is extremely weak. Pass in: undefined, NaN, Infinity or some funny value and you will end up with a corrupted balance, or force "decreaseBalance" to increase, and "increaseBalance" to decrease.. The isValidAmount method should use "isFinite" rather than strong comparison with null.
To be honest, I don't think that NodeSchool intends to give a primer on how to build a production-ready balance manager. They want to teach the basics of JS, that's all.
I agree, though, that those learning services give the impression that it's just about learning how to code and maybe use some design patterns. You won't find a security/authentication course on FreeCodeCamp or one about codebase maintainability, which is a shame.
This is great to show how smart you are, but what will a beginner who wants to use this resource think when they read your comment? People have to start somewhere.
Before really going deep into networking, OSes, distributed systems, perf and scalability, I'd say "learn monitoring, alerting, and dashboards, and then learn whatever your data indicates as issues."
Do that right and you'll have a much directed path towards what to learn next.
Logging, monitoring, etc... is of no value if you do not have an intuition of what to monitor.
Monitoring is mostly reactive, to stay afloat you should focus on prevention: know your code, keep it clean, test it, do load testing... and monitor it.
I agree. I'm mostly experienced in front-end and I like to work on back-end as well, but I can say that I feel a lack of practice on back-end side since I don't know everything you have mentioned.
What do you think is the best way to learn production best practices for back-end?
First is to learn the difference between functional requirements and non-functional requirements. Usually functional requirements are explicit, and non-functional requirements are implicit. e.g: nobody asks for a service that doesn't crash, degrade or gets hacked. Those are implicit requirements.
Each one of those requirements comes with their own set of good practices. e.g: security good practices, maintainability good practices, configuration good practices, documentation good practices, etc...
Then, you don't protect a $10 bike with a $100 lock. There are tradeoffs that need to be taken into account.
Is this supposed to be a reference to churn in Javascript-land? I think "JS fatigue" is a meme of yesteryear (and frankly, something I hear only from those without any experience with it at all, or with an investment in alternate platforms). Node.js with its rich tooling and integrations is the platform to beat for Web apps (but not necessarily content-driven sites) still in 2017.
You don't have to use babel, webpack, and co.; there are (and always have been) simple make-based workflows eg. https://github.com/tj/mmake for asset management.
This barely touched on what you need to become a competent front end developer and the aesthetic competency you need to have to make something look nice. This is the thing I most often see as completely stopping backend engineers from becoming "full stack".
So true. Full stack is understanding the layers of a modern web stack like basic webserver/port binding knowledge, basic unix skills, http, DNS, rest, serving apis, consuming apis, using queues for background jobs, database schema, avoiding n+1 queries, authentication mechanisms for browsers and clients, email (dkim+spf), serving assets, handling browser caching issues, the list goes on... an SPA with react is really just touching the surface.
I don't think aesthetics play very much if any role in being a effective front end developer. Look at Craigslist the thing is terribly ugly and dated but still widely used and functional. The aesthetics look like someone with no taste in design or modern UX wrote it. If someone writes the next CraigsList by your definition are they not a successful front end developer? Sure having a taste for design is nice but hardly necessary to be successful at the craft.
You have a valid point. Do you have pointers to learning Design for a programmer? I know about book 'Deisgn for hackers' and there are many resources on Photoshop/Sketch etc. but I haven't found nifty little projects like you have in programming where you design, say a toy compiler. Also Photoshop/Sketch are paid and/or platform specific. Any useful pointers would help.
Shameless request for advice - what's the simplest way of deploying stuff to a VPS?
I want to somehow set up an identical environment on my dev machine, and on a VPS in another continent (too much latency to edit files on directly). Ideally I'd then be able to deploy from a dev environment identical to my production environment. I tried docker but debugging the containers did my head in. I was thinking of trying VM images with vagrant, but I'd love to know if there is a simpler solution to this.
I use nodemon to watch /home/deploy/web/site/ for changes, which restarts the server. There are tools like nodemon for whatever stack you're using (rails, etc).
Maybe I am biased, but I agree with the other user on here that Ansible is a good solution for keeping the environments the same.
However, if you're feeling brave, you should definitely check out OpenShift (community version at http://openshift.org). OpenShift is basically Kubernetes with a bunch of cool stuff added, one especially useful feature is source-to-image.
It pulls your code from a scm repo and finds a builder image (or you can choose one) and it will build the docker image for you. You can have it pull whenever there is new code and rebuild the image and deploy if you want.
On top of that you get lots of cool docker orchestration features.
I really like Ansible. It provides a declarative framework for defining "roles" a server might have, and requires a minimal toolkit to get started- no images to deploy; just define the state the server should be in at the end of the playbook.
To say you can do backend code because you can write in JavaScript is like saying you can write a paper on cardiology because you know English. Knowing the language is a small part of the job. There is a lot of domain knowledge that is required in addition to the language.
Learn networking, learn operating systems, learn distributed systems, learn performance and scalability, learn about databases. Then learn node.
Let's take a look at the "best practices" tutorial from nodeschool.io, one of the recommended tutorials.
https://github.com/excellalabs/js-best-practices-workshopper...
Can you list all the mistakes in this code?
- Using IEEE 754 floating point numbers (built-in Number type in JavaScript) for storing a balance is unsafe. Read more here: http://stackoverflow.com/questions/3730019/why-not-use-doubl...
- Your bank would never represent a balance in that way. They store transactions individually and they fold them to compute your balance.
- The input validation is extremely weak. Pass in: undefined, NaN, Infinity or some funny value and you will end up with a corrupted balance, or force "decreaseBalance" to increase, and "increaseBalance" to decrease.. The isValidAmount method should use "isFinite" rather than strong comparison with null.
And let's better stop here...
I agree, though, that those learning services give the impression that it's just about learning how to code and maybe use some design patterns. You won't find a security/authentication course on FreeCodeCamp or one about codebase maintainability, which is a shame.
Do that right and you'll have a much directed path towards what to learn next.
Monitoring is mostly reactive, to stay afloat you should focus on prevention: know your code, keep it clean, test it, do load testing... and monitor it.
What do you think is the best way to learn production best practices for back-end?
Each one of those requirements comes with their own set of good practices. e.g: security good practices, maintainability good practices, configuration good practices, documentation good practices, etc...
Then, you don't protect a $10 bike with a $100 lock. There are tradeoffs that need to be taken into account.
or don't bother, because its javascript.
You don't have to use babel, webpack, and co.; there are (and always have been) simple make-based workflows eg. https://github.com/tj/mmake for asset management.
Dead Comment
Full stack != learning react.
It is possible to have a successful website without having good front development.
It's possible to create a lot of useful things that don't have good design.
CS 20SI: Tensorflow for Deep Learning Research http://web.stanford.edu/class/cs20si/syllabus.html https://news.ycombinator.com/item?id=13781067
A visual introduction to probability and statistics http://students.brown.edu/seeing-theory/ https://news.ycombinator.com/item?id=13735714
Mathematicians becoming data scientists: Should you? How to? https://quomodocumque.wordpress.com/2017/02/26/mathematician...https://news.ycombinator.com/item?id=13739687
good beginner tutorials for Stan or probabilistic programming in general http://camdavidsonpilon.github.io/Probabilistic-Programming-...https://news.ycombinator.com/item?id=13742102
Supporting the AI Talent Pipeline https://medium.com/@mark_riedl/supporting-the-ai-talent-pipe...
Georgia Tech Offers Online Master of Science in Analytics Degree for Under $10K https://news.ycombinator.com/item?id=13382263
Practical Deep Learning For Coders http://course.fast.ai/ https://news.ycombinator.com/item?id=13224588
https://news.ycombinator.com/item?id=13599074 (learn or be a dinosaur)
https://news.ycombinator.com/item?id=13605222 ($1k machine)
https://news.ycombinator.com/item?id=13588070 (oxford deep nlp)
Coding The Matrix: Linear Algebra Through Computer Science Applications http://codingthematrix.com/
[1] https://redd.it/5z8110
I want to somehow set up an identical environment on my dev machine, and on a VPS in another continent (too much latency to edit files on directly). Ideally I'd then be able to deploy from a dev environment identical to my production environment. I tried docker but debugging the containers did my head in. I was thinking of trying VM images with vagrant, but I'd love to know if there is a simpler solution to this.
I'm just one person doing it in their spare time.
rsync -Pa ./site/ deploy@your-domain.com:/home/deploy/web/site/
Note: The trailing slashes are important.
I use nodemon to watch /home/deploy/web/site/ for changes, which restarts the server. There are tools like nodemon for whatever stack you're using (rails, etc).
However, if you're feeling brave, you should definitely check out OpenShift (community version at http://openshift.org). OpenShift is basically Kubernetes with a bunch of cool stuff added, one especially useful feature is source-to-image.
It pulls your code from a scm repo and finds a builder image (or you can choose one) and it will build the docker image for you. You can have it pull whenever there is new code and rebuild the image and deploy if you want.
On top of that you get lots of cool docker orchestration features.
if you are looking for a product who's primary goal is to create identical machine images check out Packer https://www.packer.io/intro
Deleted Comment
Deleted Comment